@openui5/sap.m
Version:
OpenUI5 UI Library sap.m
163 lines (140 loc) • 5.18 kB
JavaScript
/*!
* OpenUI5
* (c) Copyright 2009-2023 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
sap.ui.define(['sap/ui/Device', "sap/base/Log", "sap/base/security/URLListValidator"],
function (Device, Log, URLListValidator) {
"use strict";
function shouldShowToolbar(oControl) {
return (!!oControl.getTitle() || oControl._isDisplayDownloadButton()) && !oControl._bIsPopupOpen;
}
var aAllowedMimeTypes = Object.freeze([
"application/pdf",
"application/x-google-chrome-pdf"
]);
/**
* Pdf viewer renderer.
* @namespace
*/
var PDFViewerRenderer = {
apiVersion: 2
};
/**
* Check whether Mime type is supported
* @private
*/
PDFViewerRenderer._isSupportedMimeType = function (sMimeType) {
var iFoundIndex = aAllowedMimeTypes.indexOf(sMimeType);
return iFoundIndex > -1;
};
/**
* @returns {boolean}
* @private
*/
PDFViewerRenderer._isPdfPluginEnabled = function () {
var bIsEnabled = true;
if (Device.browser.firefox) {
// https://bugzilla.mozilla.org/show_bug.cgi?id=1293406
// mimeType is missing for firefox even though it is enabled
return bIsEnabled;
}
if (typeof navigator.pdfViewerEnabled !== "undefined") {
if (navigator.pdfViewerEnabled || /HeadlessChrome/.test(window.navigator.userAgent)) {
return bIsEnabled;
} else {
bIsEnabled = false;
}
} else {
var aMimeTypes = navigator.mimeTypes;
bIsEnabled = aAllowedMimeTypes.some(function (sAllowedMimeType) {
var oMimeTypeItem = aMimeTypes.namedItem(sAllowedMimeType);
return oMimeTypeItem !== null;
});
}
return bIsEnabled;
};
/**
* Renders the HTML for the given control, using the provided
* {@link sap.ui.core.RenderManager}.
*
* @param {sap.ui.core.RenderManager} oRm
* the RenderManager that can be used for writing to
* the Render-Output-Buffer
* @param {sap.m.PDFViewer} oControl
* the PdfViewer component to be rendered
*/
PDFViewerRenderer.render = function (oRm, oControl) {
oRm.openStart("div", oControl);
oRm.style("width", oControl._getRenderWidth());
oRm.style("height", oControl._getRenderHeight());
this._writeAccessibilityTags(oRm, oControl);
oRm.openEnd();
if (shouldShowToolbar(oControl)) {
oRm.renderControl(oControl._objectsRegister.getOverflowToolbarControl());
}
/**
* if displayType is not link and pdfPlugin is not enabled .. render error content.
* case: if "Always download pdf's" option is enabled in browser setting.. in that
* case display error content (to retain control behaviour)
*/
if (!oControl._isDisplayTypeLink() && !this._isPdfPluginEnabled() && Device.system.desktop) {
this.renderErrorContent(oRm, oControl);
} else if (oControl._isEmbeddedModeAllowed() && this._isPdfPluginEnabled()) {
this.renderPdfContent(oRm, oControl);
}
oRm.close("div");
};
PDFViewerRenderer._writeAccessibilityTags = function (oRm, oControl) {
oRm.attr("role", "document");
oRm.attr("aria-label", oControl._getLibraryResourceBundle().getText("PDF_VIEWER_ACCESSIBILITY_LABEL"));
};
PDFViewerRenderer.renderPdfContent = function (oRm, oControl) {
if (oControl._shouldRenderPdfContent() && !(/HeadlessChrome/.test(window.navigator.userAgent))) {
oRm.openStart("iframe", oControl.getId() + "-iframe");
var sParametrizedSource = oControl.getSource();
var iCrossPosition = oControl.getSource().indexOf("#");
if (iCrossPosition > -1) {
sParametrizedSource = sParametrizedSource.substr(0, iCrossPosition);
}
if (!(Device.browser.safari && sParametrizedSource.startsWith("blob:"))) {
sParametrizedSource += "#view=FitH";
}
if (!URLListValidator.validate(sParametrizedSource)) {
sParametrizedSource = encodeURI(sParametrizedSource);
}
if (URLListValidator.validate(sParametrizedSource)) {
oRm.attr("src", sParametrizedSource);
} else {
oControl._fireErrorEvent();
}
oRm.class("sapMPDFViewerContent");
oRm.class("sapMPDFViewerLoading");
oRm.attr("aria-label", oControl._getLibraryResourceBundle().getText("PDF_VIEWER_CONTENT_ACCESSIBILITY_LABEL"));
if (shouldShowToolbar(oControl)) {
oRm.class("sapMPDFViewerReducedContent");
}
oRm.openEnd();
oRm.close("iframe");
} else {
this.renderErrorContent(oRm, oControl);
}
};
PDFViewerRenderer.renderErrorContent = function (oRm, oControl) {
var oErrorContent = oControl.getErrorPlaceholder() ? oControl.getErrorPlaceholder() :
oControl._objectsRegister.getPlaceholderMessagePageControl();
oRm.openStart("div");
oRm.class("sapMPDFViewerError");
if (!oControl._bIsPopupOpen) {
oRm.class("sapMPDFViewerEmbeddedContent");
}
oRm.openEnd();
oRm.renderControl(oErrorContent);
oRm.close("div");
if (!PDFViewerRenderer._isPdfPluginEnabled()) {
Log.warning("Either Inline viewing of pdf is disabled or pdf plug-in is unavailable on this device.");
oControl.fireEvent("error", {}, true);
}
};
return PDFViewerRenderer;
}, /* bExport= */ true);