diff --git a/extensions/firefox/content/PdfStreamConverter.jsm b/extensions/firefox/content/PdfStreamConverter.jsm index 691d22efd..f4a45a26f 100644 --- a/extensions/firefox/content/PdfStreamConverter.jsm +++ b/extensions/firefox/content/PdfStreamConverter.jsm @@ -160,6 +160,25 @@ function getLocalizedString(strings, id, property) { return id; } +function makeContentReadable(obj, window) { +//#if MOZCENTRAL + return Cu.cloneInto(obj, window); +//#else + if (Cu.cloneInto) { + return Cu.cloneInto(obj, window); + } + if (typeof obj !== 'object' || obj === null) { + return obj; + } + var expose = {}; + for (let k in obj) { + expose[k] = "r"; + } + obj.__exposedProps__ = expose; + return obj; +//#endif +} + // PDF data storage function PdfDataListener(length) { this.length = length; // less than 0, if length is unknown @@ -686,7 +705,7 @@ var StandardChromeActions = (function StandardChromeActionsClosure() { return StandardChromeActions; })(); -// Event listener to trigger chrome privedged code. +// Event listener to trigger chrome privileged code. function RequestListener(actions) { this.actions = actions; } @@ -704,21 +723,18 @@ RequestListener.prototype.receive = function(event) { } if (sync) { var response = actions[action].call(this.actions, data); - var detail = event.detail; - detail.__exposedProps__ = {response: 'r'}; - detail.response = response; + event.detail.response = response; } else { var response; - if (!event.detail.callback) { + if (!event.detail.responseExpected) { doc.documentElement.removeChild(message); response = null; } else { response = function sendResponse(response) { try { var listener = doc.createEvent('CustomEvent'); - listener.initCustomEvent('pdf.js.response', true, false, - {response: response, - __exposedProps__: {response: 'r'}}); + let detail = makeContentReadable({response: response}, doc.defaultView); + listener.initCustomEvent('pdf.js.response', true, false, detail); return message.dispatchEvent(listener); } catch (e) { // doc is no longer accessible because the requestor is already @@ -761,13 +777,13 @@ FindEventManager.prototype.handleEvent = function(e) { var contentWindow = this.contentWindow; // Only forward the events if they are for our dom window. if (chromeWindow.gBrowser.selectedBrowser.contentWindow === contentWindow) { - var detail = e.detail; - detail.__exposedProps__ = { - query: 'r', - caseSensitive: 'r', - highlightAll: 'r', - findPrevious: 'r' + var detail = { + query: e.detail.query, + caseSensitive: e.detail.caseSensitive, + highlightAll: e.detail.highlightAll, + findPrevious: e.detail.findPrevious }; + detail = makeContentReadable(detail, contentWindow); var forward = contentWindow.document.createEvent('CustomEvent'); forward.initCustomEvent(e.type, true, true, detail); contentWindow.dispatchEvent(forward); diff --git a/web/firefoxcom.js b/web/firefoxcom.js index 4a5489354..8a775ac75 100644 --- a/web/firefoxcom.js +++ b/web/firefoxcom.js @@ -64,9 +64,12 @@ var FirefoxCom = (function FirefoxComClosure() { document.documentElement.appendChild(request); var sender = document.createEvent('CustomEvent'); - sender.initCustomEvent('pdf.js.message', true, false, - {action: action, data: data, sync: false, - callback: callback}); + sender.initCustomEvent('pdf.js.message', true, false, { + action: action, + data: data, + sync: false, + responseExpected: !!callback + }); return request.dispatchEvent(sender); } };