Merge pull request #4858 from yurydelendik/cloneInto

Bug 1015115 - switch to cloneInto in pdf.js
This commit is contained in:
Yury Delendik 2014-05-28 10:37:22 -05:00
commit a256ffffd4
2 changed files with 36 additions and 17 deletions

View File

@ -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);

View File

@ -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);
}
};