From da93e65d8cbb9405c605d13bb51a9163fa09ad37 Mon Sep 17 00:00:00 2001 From: Gijs Kruitbosch Date: Fri, 23 May 2014 13:35:33 +0100 Subject: [PATCH 1/2] Bug 1015115 - switch to cloneInto in pdf.js, r?yury --- .../firefox/content/PdfStreamConverter.jsm | 33 ++++++++++++------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/extensions/firefox/content/PdfStreamConverter.jsm b/extensions/firefox/content/PdfStreamConverter.jsm index 691d22efd..f36ed5244 100644 --- a/extensions/firefox/content/PdfStreamConverter.jsm +++ b/extensions/firefox/content/PdfStreamConverter.jsm @@ -160,6 +160,18 @@ function getLocalizedString(strings, id, property) { return id; } +function makeContentReadable(obj, window) { + if (Cu.cloneInto) { + return Cu.cloneInto(obj, window); + } + var expose = {}; + for (let k in obj) { + expose[k] = "r"; + } + obj.__exposedProps__ = expose; + return obj; +} + // PDF data storage function PdfDataListener(length) { this.length = length; // less than 0, if length is unknown @@ -704,9 +716,7 @@ 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) { @@ -716,9 +726,8 @@ RequestListener.prototype.receive = function(event) { 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 +770,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); From 68b037ffb0177231f2f82238b5274fac97d9f3ec Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Wed, 28 May 2014 10:21:58 -0500 Subject: [PATCH 2/2] Add preprocessor directives for the extension; and refactor FirefoxCom callback --- extensions/firefox/content/PdfStreamConverter.jsm | 11 +++++++++-- web/firefoxcom.js | 9 ++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/extensions/firefox/content/PdfStreamConverter.jsm b/extensions/firefox/content/PdfStreamConverter.jsm index f36ed5244..f4a45a26f 100644 --- a/extensions/firefox/content/PdfStreamConverter.jsm +++ b/extensions/firefox/content/PdfStreamConverter.jsm @@ -161,15 +161,22 @@ function getLocalizedString(strings, id, property) { } 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 @@ -698,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; } @@ -719,7 +726,7 @@ RequestListener.prototype.receive = function(event) { event.detail.response = response; } else { var response; - if (!event.detail.callback) { + if (!event.detail.responseExpected) { doc.documentElement.removeChild(message); response = null; } else { 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); } };