UNPKG

9.23 kBJavaScriptView Raw
1/**
2 * @licstart The following is the entire license notice for the
3 * Javascript code in this page
4 *
5 * Copyright 2020 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * Javascript code in this page
21 */
22"use strict";
23
24Object.defineProperty(exports, "__esModule", {
25 value: true
26});
27exports.FirefoxCom = exports.DownloadManager = void 0;
28
29require("../extensions/firefox/tools/l10n.js");
30
31var _pdf = require("../pdf");
32
33var _app = require("./app.js");
34
35var _preferences = require("./preferences.js");
36
37var _ui_utils = require("./ui_utils.js");
38
39{
40 throw new Error('Module "./firefoxcom.js" shall not be used outside MOZCENTRAL builds.');
41}
42
43const FirefoxCom = function FirefoxComClosure() {
44 return {
45 requestSync(action, data) {
46 const request = document.createTextNode("");
47 document.documentElement.appendChild(request);
48 const sender = document.createEvent("CustomEvent");
49 sender.initCustomEvent("pdf.js.message", true, false, {
50 action,
51 data,
52 sync: true
53 });
54 request.dispatchEvent(sender);
55 const response = sender.detail.response;
56 document.documentElement.removeChild(request);
57 return response;
58 },
59
60 request(action, data, callback) {
61 const request = document.createTextNode("");
62
63 if (callback) {
64 document.addEventListener("pdf.js.response", function listener(event) {
65 const node = event.target;
66 const response = event.detail.response;
67 document.documentElement.removeChild(node);
68 document.removeEventListener("pdf.js.response", listener);
69 return callback(response);
70 });
71 }
72
73 document.documentElement.appendChild(request);
74 const sender = document.createEvent("CustomEvent");
75 sender.initCustomEvent("pdf.js.message", true, false, {
76 action,
77 data,
78 sync: false,
79 responseExpected: !!callback
80 });
81 return request.dispatchEvent(sender);
82 }
83
84 };
85}();
86
87exports.FirefoxCom = FirefoxCom;
88
89class DownloadManager {
90 constructor(options) {
91 this.disableCreateObjectURL = false;
92 }
93
94 downloadUrl(url, filename) {
95 FirefoxCom.request("download", {
96 originalUrl: url,
97 filename
98 });
99 }
100
101 downloadData(data, filename, contentType) {
102 const blobUrl = (0, _pdf.createObjectURL)(data, contentType);
103 FirefoxCom.request("download", {
104 blobUrl,
105 originalUrl: blobUrl,
106 filename,
107 isAttachment: true
108 });
109 }
110
111 download(blob, url, filename) {
112 const blobUrl = URL.createObjectURL(blob);
113
114 const onResponse = err => {
115 if (err && this.onerror) {
116 this.onerror(err);
117 }
118
119 URL.revokeObjectURL(blobUrl);
120 };
121
122 FirefoxCom.request("download", {
123 blobUrl,
124 originalUrl: url,
125 filename
126 }, onResponse);
127 }
128
129}
130
131exports.DownloadManager = DownloadManager;
132
133class FirefoxPreferences extends _preferences.BasePreferences {
134 async _writeToStorage(prefObj) {
135 return new Promise(function (resolve) {
136 FirefoxCom.request("setPreferences", prefObj, resolve);
137 });
138 }
139
140 async _readFromStorage(prefObj) {
141 return new Promise(function (resolve) {
142 FirefoxCom.request("getPreferences", prefObj, function (prefStr) {
143 const readPrefs = JSON.parse(prefStr);
144 resolve(readPrefs);
145 });
146 });
147 }
148
149}
150
151class MozL10n {
152 constructor(mozL10n) {
153 this.mozL10n = mozL10n;
154 }
155
156 async getLanguage() {
157 return this.mozL10n.getLanguage();
158 }
159
160 async getDirection() {
161 return this.mozL10n.getDirection();
162 }
163
164 async get(property, args, fallback) {
165 return this.mozL10n.get(property, args, fallback);
166 }
167
168 async translate(element) {
169 this.mozL10n.translate(element);
170 }
171
172}
173
174(function listenFindEvents() {
175 const events = ["find", "findagain", "findhighlightallchange", "findcasesensitivitychange", "findentirewordchange", "findbarclose"];
176
177 const handleEvent = function ({
178 type,
179 detail
180 }) {
181 if (!_app.PDFViewerApplication.initialized) {
182 return;
183 }
184
185 if (type === "findbarclose") {
186 _app.PDFViewerApplication.eventBus.dispatch(type, {
187 source: window
188 });
189
190 return;
191 }
192
193 _app.PDFViewerApplication.eventBus.dispatch("find", {
194 source: window,
195 type: type.substring("find".length),
196 query: detail.query,
197 phraseSearch: true,
198 caseSensitive: !!detail.caseSensitive,
199 entireWord: !!detail.entireWord,
200 highlightAll: !!detail.highlightAll,
201 findPrevious: !!detail.findPrevious
202 });
203 };
204
205 for (const event of events) {
206 window.addEventListener(event, handleEvent);
207 }
208})();
209
210(function listenZoomEvents() {
211 const events = ["zoomin", "zoomout", "zoomreset"];
212
213 const handleEvent = function ({
214 type,
215 detail
216 }) {
217 if (!_app.PDFViewerApplication.initialized) {
218 return;
219 }
220
221 if (type === "zoomreset" && _app.PDFViewerApplication.pdfViewer.currentScaleValue === _ui_utils.DEFAULT_SCALE_VALUE) {
222 return;
223 }
224
225 _app.PDFViewerApplication.eventBus.dispatch(type, {
226 source: window
227 });
228 };
229
230 for (const event of events) {
231 window.addEventListener(event, handleEvent);
232 }
233})();
234
235class FirefoxComDataRangeTransport extends _pdf.PDFDataRangeTransport {
236 requestDataRange(begin, end) {
237 FirefoxCom.request("requestDataRange", {
238 begin,
239 end
240 });
241 }
242
243 abort() {
244 FirefoxCom.requestSync("abortLoading", null);
245 }
246
247}
248
249class FirefoxExternalServices extends _app.DefaultExternalServices {
250 static updateFindControlState(data) {
251 FirefoxCom.request("updateFindControlState", data);
252 }
253
254 static updateFindMatchesCount(data) {
255 FirefoxCom.request("updateFindMatchesCount", data);
256 }
257
258 static initPassiveLoading(callbacks) {
259 let pdfDataRangeTransport;
260 window.addEventListener("message", function windowMessage(e) {
261 if (e.source !== null) {
262 console.warn("Rejected untrusted message from " + e.origin);
263 return;
264 }
265
266 const args = e.data;
267
268 if (typeof args !== "object" || !("pdfjsLoadAction" in args)) {
269 return;
270 }
271
272 switch (args.pdfjsLoadAction) {
273 case "supportsRangedLoading":
274 pdfDataRangeTransport = new FirefoxComDataRangeTransport(args.length, args.data, args.done);
275 callbacks.onOpenWithTransport(args.pdfUrl, args.length, pdfDataRangeTransport);
276 break;
277
278 case "range":
279 pdfDataRangeTransport.onDataRange(args.begin, args.chunk);
280 break;
281
282 case "rangeProgress":
283 pdfDataRangeTransport.onDataProgress(args.loaded);
284 break;
285
286 case "progressiveRead":
287 pdfDataRangeTransport.onDataProgressiveRead(args.chunk);
288 pdfDataRangeTransport.onDataProgress(args.loaded, args.total);
289 break;
290
291 case "progressiveDone":
292 if (pdfDataRangeTransport) {
293 pdfDataRangeTransport.onDataProgressiveDone();
294 }
295
296 break;
297
298 case "progress":
299 callbacks.onProgress(args.loaded, args.total);
300 break;
301
302 case "complete":
303 if (!args.data) {
304 callbacks.onError(args.errorCode);
305 break;
306 }
307
308 callbacks.onOpenWithData(args.data);
309 break;
310 }
311 });
312 FirefoxCom.requestSync("initPassiveLoading", null);
313 }
314
315 static fallback(data, callback) {
316 FirefoxCom.request("fallback", data, callback);
317 }
318
319 static reportTelemetry(data) {
320 FirefoxCom.request("reportTelemetry", JSON.stringify(data));
321 }
322
323 static createDownloadManager(options) {
324 return new DownloadManager(options);
325 }
326
327 static createPreferences() {
328 return new FirefoxPreferences();
329 }
330
331 static createL10n(options) {
332 const mozL10n = document.mozL10n;
333 return new MozL10n(mozL10n);
334 }
335
336 static get supportsIntegratedFind() {
337 const support = FirefoxCom.requestSync("supportsIntegratedFind");
338 return (0, _pdf.shadow)(this, "supportsIntegratedFind", support);
339 }
340
341 static get supportsDocumentFonts() {
342 const support = FirefoxCom.requestSync("supportsDocumentFonts");
343 return (0, _pdf.shadow)(this, "supportsDocumentFonts", support);
344 }
345
346 static get supportedMouseWheelZoomModifierKeys() {
347 const support = FirefoxCom.requestSync("supportedMouseWheelZoomModifierKeys");
348 return (0, _pdf.shadow)(this, "supportedMouseWheelZoomModifierKeys", support);
349 }
350
351}
352
353_app.PDFViewerApplication.externalServices = FirefoxExternalServices;
354document.mozL10n.setExternalLocalizerServices({
355 getLocale() {
356 return FirefoxCom.requestSync("getLocale", null);
357 },
358
359 getStrings(key) {
360 return FirefoxCom.requestSync("getStrings", key);
361 }
362
363});
\No newline at end of file