1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | "use strict";
|
23 |
|
24 | Object.defineProperty(exports, "__esModule", {
|
25 | value: true
|
26 | });
|
27 | exports.ChromeCom = void 0;
|
28 |
|
29 | var _app = require("./app.js");
|
30 |
|
31 | var _app_options = require("./app_options.js");
|
32 |
|
33 | var _preferences = require("./preferences.js");
|
34 |
|
35 | var _download_manager = require("./download_manager.js");
|
36 |
|
37 | var _genericl10n = require("./genericl10n.js");
|
38 |
|
39 | var _generic_scripting = require("./generic_scripting.js");
|
40 |
|
41 | {
|
42 | throw new Error('Module "pdfjs-web/chromecom" shall not be used outside CHROME build.');
|
43 | }
|
44 | const ChromeCom = {
|
45 | request(action, data, callback) {
|
46 | const message = {
|
47 | action,
|
48 | data
|
49 | };
|
50 |
|
51 | if (!chrome.runtime) {
|
52 | console.error("chrome.runtime is undefined.");
|
53 |
|
54 | if (callback) {
|
55 | callback();
|
56 | }
|
57 | } else if (callback) {
|
58 | chrome.runtime.sendMessage(message, callback);
|
59 | } else {
|
60 | chrome.runtime.sendMessage(message);
|
61 | }
|
62 | },
|
63 |
|
64 | resolvePDFFile(file, overlayManager, callback) {
|
65 | file = file.replace(/^drive:/i, "filesystem:" + location.origin + "/external/");
|
66 |
|
67 | if (/^https?:/.test(file)) {
|
68 | setReferer(file, function () {
|
69 | callback(file);
|
70 | });
|
71 | return;
|
72 | }
|
73 |
|
74 | if (/^file?:/.test(file)) {
|
75 | getEmbedderOrigin(function (origin) {
|
76 | if (origin && !/^file:|^chrome-extension:/.test(origin)) {
|
77 | _app.PDFViewerApplication._documentError("Blocked " + origin + " from loading " + file + ". Refused to load a local file in a non-local page " + "for security reasons.");
|
78 |
|
79 | return;
|
80 | }
|
81 |
|
82 | isAllowedFileSchemeAccess(function (isAllowedAccess) {
|
83 | if (isAllowedAccess) {
|
84 | callback(file);
|
85 | } else {
|
86 | requestAccessToLocalFile(file, overlayManager, callback);
|
87 | }
|
88 | });
|
89 | });
|
90 | return;
|
91 | }
|
92 |
|
93 | callback(file);
|
94 | }
|
95 |
|
96 | };
|
97 | exports.ChromeCom = ChromeCom;
|
98 |
|
99 | function getEmbedderOrigin(callback) {
|
100 | const origin = window === top ? location.origin : location.ancestorOrigins[0];
|
101 |
|
102 | if (origin === "null") {
|
103 | getParentOrigin(callback);
|
104 | } else {
|
105 | callback(origin);
|
106 | }
|
107 | }
|
108 |
|
109 | function getParentOrigin(callback) {
|
110 | ChromeCom.request("getParentOrigin", null, callback);
|
111 | }
|
112 |
|
113 | function isAllowedFileSchemeAccess(callback) {
|
114 | ChromeCom.request("isAllowedFileSchemeAccess", null, callback);
|
115 | }
|
116 |
|
117 | function isRuntimeAvailable() {
|
118 | try {
|
119 | if (chrome.runtime?.getManifest()) {
|
120 | return true;
|
121 | }
|
122 | } catch (e) {}
|
123 |
|
124 | return false;
|
125 | }
|
126 |
|
127 | function reloadIfRuntimeIsUnavailable() {
|
128 | if (!isRuntimeAvailable()) {
|
129 | location.reload();
|
130 | }
|
131 | }
|
132 |
|
133 | let chromeFileAccessOverlayPromise;
|
134 |
|
135 | function requestAccessToLocalFile(fileUrl, overlayManager, callback) {
|
136 | const dialog = document.getElementById("chromeFileAccessDialog");
|
137 |
|
138 | if (top !== window) {
|
139 | window.addEventListener("focus", reloadIfRuntimeIsUnavailable);
|
140 | dialog.addEventListener("close", function () {
|
141 | window.removeEventListener("focus", reloadIfRuntimeIsUnavailable);
|
142 | reloadIfRuntimeIsUnavailable();
|
143 | });
|
144 | }
|
145 |
|
146 | chromeFileAccessOverlayPromise ||= overlayManager.register(dialog, true);
|
147 | chromeFileAccessOverlayPromise.then(function () {
|
148 | const iconPath = chrome.runtime.getManifest().icons[48];
|
149 | document.getElementById("chrome-pdfjs-logo-bg").style.backgroundImage = "url(" + chrome.runtime.getURL(iconPath) + ")";
|
150 | const i18nFileAccessLabel = {
|
151 | "am": "\u1208\u134b\u12ed\u120d \u12e9\u12a0\u122d\u12a4\u120d\u12ce\u127d \u1218\u12f3\u1228\u123b \u134d\u1240\u12f5",
|
152 | "ar": "\u200f\u0627\u0644\u0633\u0645\u0627\u062d \u0628\u0627\u0644\u062f\u062e\u0648\u0644 \u0625\u0644\u0649 \u0639\u0646\u0627\u0648\u064a\u0646 URL \u0644\u0644\u0645\u0644\u0641\u0627\u062a",
|
153 | "bg": "\u0414\u0430 \u0441\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438 \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e URL \u0430\u0434\u0440\u0435\u0441\u0438\u0442\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u0435\u0442\u0435",
|
154 | "bn": "\u09ab\u09be\u0987\u09b2 URL\u0997\u09c1\u09b2\u09bf\u09a4\u09c7 \u0985\u09cd\u09af\u09be\u0995\u09cd\u09b8\u09c7\u09b8 \u09ae\u099e\u09cd\u099c\u09c1\u09b0 \u0995\u09b0\u09c1\u09a8",
|
155 | "ca": "Permet l'acc\u00e9s als URL de fitxer",
|
156 | "cs": "Umo\u017enit p\u0159\u00edstup k adres\u00e1m URL soubor\u016f",
|
157 | "da": "Tillad adgang til webadresser p\u00e5 filer",
|
158 | "de": "Zugriff auf Datei-URLs zulassen",
|
159 | "el": "\u039d\u03b1 \u03b5\u03c0\u03b9\u03c4\u03c1\u03ad\u03c0\u03b5\u03c4\u03b1\u03b9 \u03b7 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03b4\u03b9\u03b5\u03c5\u03b8\u03cd\u03bd\u03c3\u03b5\u03b9\u03c2 URL \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd",
|
160 | "en-GB": "Allow access to file URLs",
|
161 | "es": "Permitir acceso a URL de archivo",
|
162 | "es-419": "Permitir el acceso a las URL del archivo",
|
163 | "et": "Luba juurdep\u00e4\u00e4s failide URL-idele",
|
164 | "fa": "\u200f\u0627\u062c\u0627\u0632\u0647\u0654 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 URL \u0647\u0627\u06cc \u0641\u0627\u06cc\u0644",
|
165 | "fi": "Salli tiedostojen URL-osoitteiden k\u00e4ytt\u00f6",
|
166 | "fil": "Payagan ang access na mag-file ng mga URL",
|
167 | "fr": "Autoriser l'acc\u00e8s aux URL de fichier",
|
168 | "gu": "URL \u0aab\u0abe\u0a87\u0ab2 \u0a95\u0ab0\u0ab5\u0abe \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8\u0aa8\u0ac0 \u0aae\u0a82\u0a9c\u0ac2\u0ab0\u0ac0 \u0a86\u0aaa\u0acb",
|
169 | "hi": "\u092b\u093c\u093e\u0907\u0932 URL \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0940 \u0905\u0928\u0941\u092e\u0924\u093f \u0926\u0947\u0902",
|
170 | "hr": "Dozvoli pristup URL-ovima datoteke",
|
171 | "hu": "F\u00e1jl URL-ekhez val\u00f3 hozz\u00e1f\u00e9r\u00e9s enged\u00e9lyez\u00e9se",
|
172 | "id": "Izinkan akses ke URL file",
|
173 | "it": "Consenti l'accesso agli URL dei file",
|
174 | "iw": "\u05d0\u05e4\u05e9\u05e8 \u05d2\u05d9\u05e9\u05d4 \u05dc\u05db\u05ea\u05d5\u05d1\u05d5\u05ea \u05d0\u05ea\u05e8\u05d9\u05dd \u05e9\u05dc \u05e7\u05d1\u05e6\u05d9\u05dd",
|
175 | "ja": "\u30d5\u30a1\u30a4\u30eb\u306e URL \u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3059\u308b",
|
176 | "kn": "URL \u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0cbf\u0c97\u0cc6 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0c85\u0ca8\u0cc1\u0cae\u0ca4\u0cbf\u0cb8\u0cbf",
|
177 | "ko": "\ud30c\uc77c URL\uc5d0 \ub300\ud55c \uc561\uc138\uc2a4 \ud5c8\uc6a9",
|
178 | "lt": "Leisti pasiekti failo URL",
|
179 | "lv": "At\u013caut piek\u013cuvi faila vietr\u0101\u017eiem URL",
|
180 | "ml": "URL \u0d15\u0d33\u0d4d\u200d\u200c \u0d2b\u0d2f\u0d32\u0d4d\u200d\u200c \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d3f\u0d28\u0d4d \u0d06\u0d15\u0d4d\u200d\u0d38\u0d38\u0d4d\u0d38\u0d4d \u0d05\u0d28\u0d41\u0d35\u0d26\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
|
181 | "mr": "\u092b\u093e\u0907\u0932 URL \u092e\u0927\u094d\u092f\u0947 \u092a\u094d\u0930\u0935\u0947\u0936\u093e\u0938 \u0905\u0928\u0941\u092e\u0924\u0940 \u0926\u094d\u092f\u093e",
|
182 | "ms": "Membenarkan akses ke URL fail",
|
183 | "nl": "Toegang tot bestand-URL's toestaan",
|
184 | "no": "Tillat tilgang til filnettadresser",
|
185 | "pl": "Zezwalaj na dost\u0119p do adres\u00f3w URL plik\u00f3w",
|
186 | "pt-BR": "Permitir acesso aos URLs do arquivo",
|
187 | "pt-PT": "Permitir acesso a URLs de ficheiro",
|
188 | "ro": "Permite accesul la adresele URL de fi\u0219iere",
|
189 | "ru": "\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c",
|
190 | "sk": "Povoli\u0165 pr\u00edstup k webov\u00fdm adres\u00e1m s\u00faboru",
|
191 | "sl": "Dovoli dostop do URL-jev datoteke",
|
192 | "sr": "\u0414\u043e\u0437\u0432\u043e\u043b\u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f URL \u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0430 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430",
|
193 | "sv": "Till\u00e5t \u00e5tkomst till webbadresser i filen",
|
194 | "sw": "Ruhusu kufikia URL za faili",
|
195 | "ta": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1 URL\u0b95\u0bb3\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0b85\u0ba3\u0bc1\u0b95\u0bb2\u0bc8 \u0b85\u0ba9\u0bc1\u0bae\u0ba4\u0bbf",
|
196 | "te": "\u0c2b\u0c48\u0c32\u0c4d URL\u0c32\u0c15\u0c41 \u0c2a\u0c4d\u0c30\u0c3e\u0c2a\u0c4d\u0c24\u0c3f\u0c28\u0c3f \u0c05\u0c28\u0c41\u0c2e\u0c24\u0c3f\u0c02\u0c1a\u0c41",
|
197 | "th": "\u0e2d\u0e19\u0e38\u0e0d\u0e32\u0e15\u0e43\u0e2b\u0e49\u0e40\u0e02\u0e49\u0e32\u0e16\u0e36\u0e07\u0e44\u0e1f\u0e25\u0e4c URL",
|
198 | "tr": "Dosya URL'lerine eri\u015fime izin ver",
|
199 | "uk": "\u041d\u0430\u0434\u0430\u0432\u0430\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0434\u043e URL-\u0430\u0434\u0440\u0435\u0441 \u0444\u0430\u0439\u043b\u0443",
|
200 | "vi": "Cho ph\u00e9p truy c\u1eadp v\u00e0o c\u00e1c URL c\u1ee7a t\u1ec7p",
|
201 | "zh-CN": "\u5141\u8bb8\u8bbf\u95ee\u6587\u4ef6\u7f51\u5740",
|
202 | "zh-TW": "\u5141\u8a31\u5b58\u53d6\u6a94\u6848\u7db2\u5740"
|
203 | }[chrome.i18n.getUILanguage?.()];
|
204 |
|
205 | if (i18nFileAccessLabel) {
|
206 | document.getElementById("chrome-file-access-label").textContent = i18nFileAccessLabel;
|
207 | }
|
208 |
|
209 | const link = document.getElementById("chrome-link-to-extensions-page");
|
210 | link.href = "chrome://extensions/?id=" + chrome.runtime.id;
|
211 |
|
212 | link.onclick = function (e) {
|
213 | e.preventDefault();
|
214 | ChromeCom.request("openExtensionsPageForFileAccess", {
|
215 | newTab: e.ctrlKey || e.metaKey || e.button === 1 || window !== top
|
216 | });
|
217 | };
|
218 |
|
219 | document.getElementById("chrome-url-of-local-file").textContent = fileUrl;
|
220 |
|
221 | document.getElementById("chrome-file-fallback").onchange = function () {
|
222 | const file = this.files[0];
|
223 |
|
224 | if (file) {
|
225 | const originalFilename = decodeURIComponent(fileUrl.split("/").pop());
|
226 | let originalUrl = fileUrl;
|
227 |
|
228 | if (originalFilename !== file.name) {
|
229 | const msg = "The selected file does not match the original file." + "\nOriginal: " + originalFilename + "\nSelected: " + file.name + "\nDo you want to open the selected file?";
|
230 |
|
231 | if (!confirm(msg)) {
|
232 | this.value = "";
|
233 | return;
|
234 | }
|
235 |
|
236 | originalUrl = "file:///fakepath/to/" + encodeURIComponent(file.name);
|
237 | }
|
238 |
|
239 | callback(URL.createObjectURL(file), file.size, originalUrl);
|
240 | overlayManager.close(dialog);
|
241 | }
|
242 | };
|
243 |
|
244 | overlayManager.open(dialog);
|
245 | });
|
246 | }
|
247 |
|
248 | if (window === top) {
|
249 | addEventListener("unload", function () {
|
250 | if (!isRuntimeAvailable()) {
|
251 | localStorage.setItem("unload-" + Date.now() + "-" + document.hidden + "-" + location.href, JSON.stringify(history.state));
|
252 | }
|
253 | });
|
254 | }
|
255 |
|
256 | let port;
|
257 |
|
258 | function setReferer(url, callback) {
|
259 | if (!port) {
|
260 | port = chrome.runtime.connect({
|
261 | name: "chromecom-referrer"
|
262 | });
|
263 | }
|
264 |
|
265 | port.onDisconnect.addListener(onDisconnect);
|
266 | port.onMessage.addListener(onMessage);
|
267 | port.postMessage({
|
268 | referer: window.history.state?.chromecomState,
|
269 | requestUrl: url
|
270 | });
|
271 |
|
272 | function onMessage(referer) {
|
273 | if (referer) {
|
274 | const state = window.history.state || {};
|
275 | state.chromecomState = referer;
|
276 | window.history.replaceState(state, "");
|
277 | }
|
278 |
|
279 | onCompleted();
|
280 | }
|
281 |
|
282 | function onDisconnect() {
|
283 | port = null;
|
284 | callback();
|
285 | }
|
286 |
|
287 | function onCompleted() {
|
288 | port.onDisconnect.removeListener(onDisconnect);
|
289 | port.onMessage.removeListener(onMessage);
|
290 | callback();
|
291 | }
|
292 | }
|
293 |
|
294 | const storageArea = chrome.storage.sync || chrome.storage.local;
|
295 |
|
296 | class ChromePreferences extends _preferences.BasePreferences {
|
297 | async _writeToStorage(prefObj) {
|
298 | return new Promise(resolve => {
|
299 | if (prefObj === this.defaults) {
|
300 | const keysToRemove = Object.keys(this.defaults);
|
301 | storageArea.remove(keysToRemove, function () {
|
302 | resolve();
|
303 | });
|
304 | } else {
|
305 | storageArea.set(prefObj, function () {
|
306 | resolve();
|
307 | });
|
308 | }
|
309 | });
|
310 | }
|
311 |
|
312 | async _readFromStorage(prefObj) {
|
313 | return new Promise(resolve => {
|
314 | const getPreferences = defaultPrefs => {
|
315 | if (chrome.runtime.lastError) {
|
316 | defaultPrefs = this.defaults;
|
317 | }
|
318 |
|
319 | storageArea.get(defaultPrefs, function (readPrefs) {
|
320 | resolve(readPrefs);
|
321 | });
|
322 | };
|
323 |
|
324 | if (chrome.storage.managed) {
|
325 | const defaultManagedPrefs = Object.assign({
|
326 | enableHandToolOnLoad: false,
|
327 | disableTextLayer: false,
|
328 | enhanceTextSelection: false,
|
329 | showPreviousViewOnLoad: true,
|
330 | disablePageMode: false
|
331 | }, this.defaults);
|
332 | chrome.storage.managed.get(defaultManagedPrefs, function (items) {
|
333 | items = items || defaultManagedPrefs;
|
334 |
|
335 | if (items.enableHandToolOnLoad && !items.cursorToolOnLoad) {
|
336 | items.cursorToolOnLoad = 1;
|
337 | }
|
338 |
|
339 | delete items.enableHandToolOnLoad;
|
340 |
|
341 | if (items.textLayerMode !== 1) {
|
342 | if (items.disableTextLayer) {
|
343 | items.textLayerMode = 0;
|
344 | } else if (items.enhanceTextSelection) {
|
345 | items.textLayerMode = 2;
|
346 | }
|
347 | }
|
348 |
|
349 | delete items.disableTextLayer;
|
350 | delete items.enhanceTextSelection;
|
351 |
|
352 | if (!items.showPreviousViewOnLoad && !items.viewOnLoad) {
|
353 | items.viewOnLoad = 1;
|
354 | }
|
355 |
|
356 | delete items.showPreviousViewOnLoad;
|
357 | delete items.disablePageMode;
|
358 | getPreferences(items);
|
359 | });
|
360 | } else {
|
361 | getPreferences(this.defaults);
|
362 | }
|
363 | });
|
364 | }
|
365 |
|
366 | }
|
367 |
|
368 | class ChromeExternalServices extends _app.DefaultExternalServices {
|
369 | static initPassiveLoading(callbacks) {
|
370 | ChromeCom.resolvePDFFile(_app_options.AppOptions.get("defaultUrl"), _app.PDFViewerApplication.overlayManager, function (url, length, originalUrl) {
|
371 | callbacks.onOpenWithURL(url, length, originalUrl);
|
372 | });
|
373 | }
|
374 |
|
375 | static createDownloadManager(options) {
|
376 | return new _download_manager.DownloadManager();
|
377 | }
|
378 |
|
379 | static createPreferences() {
|
380 | return new ChromePreferences();
|
381 | }
|
382 |
|
383 | static createL10n(options) {
|
384 | return new _genericl10n.GenericL10n(navigator.language);
|
385 | }
|
386 |
|
387 | static createScripting({
|
388 | sandboxBundleSrc
|
389 | }) {
|
390 | return new _generic_scripting.GenericScripting(sandboxBundleSrc);
|
391 | }
|
392 |
|
393 | }
|
394 |
|
395 | _app.PDFViewerApplication.externalServices = ChromeExternalServices; |
\ | No newline at end of file |