123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- import { DefaultExternalServices, PDFViewerApplication } from "./app.js";
- import { AppOptions } from "./app_options.js";
- import { BasePreferences } from "./preferences.js";
- import { DownloadManager } from "./download_manager.js";
- import { GenericL10n } from "./genericl10n.js";
- import { GenericScripting } from "./generic_scripting.js";
- if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("CHROME")) {
- throw new Error(
- 'Module "pdfjs-web/chromecom" shall not be used outside CHROME build.'
- );
- }
- const ChromeCom = {
-
- request(action, data, callback) {
- const message = {
- action,
- data,
- };
- if (!chrome.runtime) {
- console.error("chrome.runtime is undefined.");
- callback?.();
- } else if (callback) {
- chrome.runtime.sendMessage(message, callback);
- } else {
- chrome.runtime.sendMessage(message);
- }
- },
-
- resolvePDFFile(file, overlayManager, callback) {
-
- file = file.replace(
- /^drive:/i,
- "filesystem:" + location.origin + "/external/"
- );
- if (/^https?:/.test(file)) {
-
-
-
- setReferer(file, function () {
- callback(file);
- });
- return;
- }
- if (/^file?:/.test(file)) {
- getEmbedderOrigin(function (origin) {
-
-
-
-
-
- if (origin && !/^file:|^chrome-extension:/.test(origin)) {
- PDFViewerApplication._documentError(
- "Blocked " +
- origin +
- " from loading " +
- file +
- ". Refused to load a local file in a non-local page " +
- "for security reasons."
- );
- return;
- }
- isAllowedFileSchemeAccess(function (isAllowedAccess) {
- if (isAllowedAccess) {
- callback(file);
- } else {
- requestAccessToLocalFile(file, overlayManager, callback);
- }
- });
- });
- return;
- }
- callback(file);
- },
- };
- function getEmbedderOrigin(callback) {
- const origin = window === top ? location.origin : location.ancestorOrigins[0];
- if (origin === "null") {
-
- getParentOrigin(callback);
- } else {
- callback(origin);
- }
- }
- function getParentOrigin(callback) {
- ChromeCom.request("getParentOrigin", null, callback);
- }
- function isAllowedFileSchemeAccess(callback) {
- ChromeCom.request("isAllowedFileSchemeAccess", null, callback);
- }
- function isRuntimeAvailable() {
- try {
-
-
- if (chrome.runtime?.getManifest()) {
- return true;
- }
- } catch (e) {}
- return false;
- }
- function reloadIfRuntimeIsUnavailable() {
- if (!isRuntimeAvailable()) {
- location.reload();
- }
- }
- let chromeFileAccessOverlayPromise;
- function requestAccessToLocalFile(fileUrl, overlayManager, callback) {
- const dialog = document.getElementById("chromeFileAccessDialog");
- if (top !== window) {
-
-
-
-
-
-
-
- window.addEventListener("focus", reloadIfRuntimeIsUnavailable);
- dialog.addEventListener("close", function () {
- window.removeEventListener("focus", reloadIfRuntimeIsUnavailable);
- reloadIfRuntimeIsUnavailable();
- });
- }
- chromeFileAccessOverlayPromise ||= overlayManager.register(
- dialog,
- true
- );
- chromeFileAccessOverlayPromise.then(function () {
- const iconPath = chrome.runtime.getManifest().icons[48];
- document.getElementById("chrome-pdfjs-logo-bg").style.backgroundImage =
- "url(" + chrome.runtime.getURL(iconPath) + ")";
-
-
-
- const i18nFileAccessLabel = PDFJSDev.json(
- "$ROOT/web/chrome-i18n-allow-access-to-file-urls.json"
- )[chrome.i18n.getUILanguage?.()];
- if (i18nFileAccessLabel) {
- document.getElementById("chrome-file-access-label").textContent =
- i18nFileAccessLabel;
- }
- const link = document.getElementById("chrome-link-to-extensions-page");
- link.href = "chrome://extensions/?id=" + chrome.runtime.id;
- link.onclick = function (e) {
-
-
- e.preventDefault();
-
-
-
- ChromeCom.request("openExtensionsPageForFileAccess", {
- newTab: e.ctrlKey || e.metaKey || e.button === 1 || window !== top,
- });
- };
-
-
- document.getElementById("chrome-url-of-local-file").textContent = fileUrl;
- document.getElementById("chrome-file-fallback").onchange = function () {
- const file = this.files[0];
- if (file) {
- const originalFilename = decodeURIComponent(fileUrl.split("/").pop());
- let originalUrl = fileUrl;
- if (originalFilename !== file.name) {
- const msg =
- "The selected file does not match the original file." +
- "\nOriginal: " +
- originalFilename +
- "\nSelected: " +
- file.name +
- "\nDo you want to open the selected file?";
-
- if (!confirm(msg)) {
- this.value = "";
- return;
- }
-
-
- originalUrl = "file:///fakepath/to/" + encodeURIComponent(file.name);
- }
- callback(URL.createObjectURL(file), file.size, originalUrl);
- overlayManager.close(dialog);
- }
- };
- overlayManager.open(dialog);
- });
- }
- if (window === top) {
-
-
-
-
-
- addEventListener("unload", function () {
-
-
- if (!isRuntimeAvailable()) {
- localStorage.setItem(
- "unload-" + Date.now() + "-" + document.hidden + "-" + location.href,
- JSON.stringify(history.state)
- );
- }
- });
- }
- let port;
- function setReferer(url, callback) {
- if (!port) {
-
-
- port = chrome.runtime.connect({ name: "chromecom-referrer" });
- }
- port.onDisconnect.addListener(onDisconnect);
- port.onMessage.addListener(onMessage);
-
- port.postMessage({
- referer: window.history.state?.chromecomState,
- requestUrl: url,
- });
- function onMessage(referer) {
- if (referer) {
-
-
-
-
-
- const state = window.history.state || {};
- state.chromecomState = referer;
- window.history.replaceState(state, "");
- }
- onCompleted();
- }
- function onDisconnect() {
-
- port = null;
- callback();
- }
- function onCompleted() {
- port.onDisconnect.removeListener(onDisconnect);
- port.onMessage.removeListener(onMessage);
- callback();
- }
- }
- const storageArea = chrome.storage.sync || chrome.storage.local;
- class ChromePreferences extends BasePreferences {
- async _writeToStorage(prefObj) {
- return new Promise(resolve => {
- if (prefObj === this.defaults) {
- const keysToRemove = Object.keys(this.defaults);
-
-
- storageArea.remove(keysToRemove, function () {
- resolve();
- });
- } else {
- storageArea.set(prefObj, function () {
- resolve();
- });
- }
- });
- }
- async _readFromStorage(prefObj) {
- return new Promise(resolve => {
- const getPreferences = defaultPrefs => {
- if (chrome.runtime.lastError) {
-
- defaultPrefs = this.defaults;
- }
- storageArea.get(defaultPrefs, function (readPrefs) {
- resolve(readPrefs);
- });
- };
- if (chrome.storage.managed) {
-
-
-
-
-
-
- const defaultManagedPrefs = Object.assign(
- {
- enableHandToolOnLoad: false,
- disableTextLayer: false,
- enhanceTextSelection: false,
- showPreviousViewOnLoad: true,
- disablePageMode: false,
- },
- this.defaults
- );
- chrome.storage.managed.get(defaultManagedPrefs, function (items) {
- items = items || defaultManagedPrefs;
-
-
-
-
-
-
-
-
- if (items.enableHandToolOnLoad && !items.cursorToolOnLoad) {
- items.cursorToolOnLoad = 1;
- }
- delete items.enableHandToolOnLoad;
-
- if (items.textLayerMode !== 1 && items.disableTextLayer) {
- items.textLayerMode = 0;
- }
- delete items.disableTextLayer;
- delete items.enhanceTextSelection;
-
- if (!items.showPreviousViewOnLoad && !items.viewOnLoad) {
- items.viewOnLoad = 1;
- }
- delete items.showPreviousViewOnLoad;
- delete items.disablePageMode;
- getPreferences(items);
- });
- } else {
-
- getPreferences(this.defaults);
- }
- });
- }
- }
- class ChromeExternalServices extends DefaultExternalServices {
- static initPassiveLoading(callbacks) {
-
- ChromeCom.resolvePDFFile(
- AppOptions.get("defaultUrl"),
- PDFViewerApplication.overlayManager,
- function (url, length, originalUrl) {
- callbacks.onOpenWithURL(url, length, originalUrl);
- }
- );
- }
- static createDownloadManager() {
- return new DownloadManager();
- }
- static createPreferences() {
- return new ChromePreferences();
- }
- static createL10n(options) {
- return new GenericL10n(navigator.language);
- }
- static createScripting({ sandboxBundleSrc }) {
- return new GenericScripting(sandboxBundleSrc);
- }
- }
- PDFViewerApplication.externalServices = ChromeExternalServices;
- export { ChromeCom };
|