Bug 783825 - Fix b2g breakage after bug 553102 [r=cjones]

This commit is contained in:
Fabrice Desré
2012-08-18 19:50:44 -07:00
parent fe359ab696
commit 47317c504a
7 changed files with 58 additions and 32 deletions

View File

@@ -16,7 +16,8 @@ Cu.import('resource://gre/modules/SettingsChangeNotifier.jsm');
Cu.import('resource://gre/modules/Webapps.jsm'); Cu.import('resource://gre/modules/Webapps.jsm');
Cu.import('resource://gre/modules/AlarmService.jsm'); Cu.import('resource://gre/modules/AlarmService.jsm');
Cu.import('resource://gre/modules/ActivitiesService.jsm'); Cu.import('resource://gre/modules/ActivitiesService.jsm');
Cu.import("resource://gre/modules/PermissionPromptHelper.jsm"); Cu.import('resource://gre/modules/PermissionPromptHelper.jsm');
Cu.import('resource://gre/modules/ObjectWrapper.jsm');
XPCOMUtils.defineLazyServiceGetter(Services, 'env', XPCOMUtils.defineLazyServiceGetter(Services, 'env',
'@mozilla.org/process/environment;1', '@mozilla.org/process/environment;1',
@@ -315,7 +316,8 @@ var shell = {
}, },
sendChromeEvent: function shell_sendChromeEvent(details) { sendChromeEvent: function shell_sendChromeEvent(details) {
this.sendEvent(getContentWindow(), "mozChromeEvent", details); this.sendEvent(getContentWindow(), "mozChromeEvent",
ObjectWrapper.wrap(details, getContentWindow()));
}, },
receiveMessage: function shell_receiveMessage(message) { receiveMessage: function shell_receiveMessage(message) {
@@ -379,9 +381,8 @@ Services.obs.addObserver(function onSystemMessage(subject, topic, data) {
}, 'system-messages-open-app', false); }, 'system-messages-open-app', false);
Services.obs.addObserver(function(aSubject, aTopic, aData) { Services.obs.addObserver(function(aSubject, aTopic, aData) {
shell.sendEvent(shell.contentBrowser.contentWindow, shell.sendChromeEvent({ type: "fullscreenoriginchange",
"mozChromeEvent", { type: "fullscreenoriginchange", fullscreenorigin: aData });
fullscreenorigin: aData } );
}, "fullscreen-origin-change", false); }, "fullscreen-origin-change", false);
(function Repl() { (function Repl() {

View File

@@ -33,13 +33,12 @@ ActivitiesDialog.prototype = {
// activity. The front-end should display a UI to pick one. // activity. The front-end should display a UI to pick one.
let browser = Services.wm.getMostRecentWindow("navigator:browser"); let browser = Services.wm.getMostRecentWindow("navigator:browser");
let content = browser.getContentWindow(); let content = browser.getContentWindow();
let event = content.document.createEvent("CustomEvent"); let detail = {
event.initCustomEvent("mozChromeEvent", true, true, {
type: "activity-choice", type: "activity-choice",
id: id, id: id,
name: activity.name, name: activity.name,
choices: choices choices: choices
}); };
// Listen the resulting choice from the front-end. If there is no choice, // Listen the resulting choice from the front-end. If there is no choice,
// let's return -1, which means the user has cancelled the dialog. // let's return -1, which means the user has cancelled the dialog.
@@ -51,7 +50,7 @@ ActivitiesDialog.prototype = {
activity.callback.handleEvent(evt.detail.value ? evt.detail.value : -1); activity.callback.handleEvent(evt.detail.value ? evt.detail.value : -1);
}); });
content.dispatchEvent(event); browser.shell.sendChromeEvent(detail);
}, },
chooseActivity: function ap_chooseActivity(aName, aActivities, aCallback) { chooseActivity: function ap_chooseActivity(aName, aActivities, aCallback) {

View File

@@ -58,9 +58,7 @@ ContentPermissionPrompt.prototype = {
"id": requestId, "id": requestId,
"url": request.principal.URI.spec "url": request.principal.URI.spec
}; };
let event = content.document.createEvent("CustomEvent"); browser.shell.sendChromeEvent(details);
event.initCustomEvent("mozChromeEvent", true, true, details);
content.dispatchEvent(event);
}, },
classID: Components.ID("{8c719f03-afe0-4aac-91ff-6c215895d467}"), classID: Components.ID("{8c719f03-afe0-4aac-91ff-6c215895d467}"),

View File

@@ -10,29 +10,12 @@ const Cr = Components.results;
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
Cu.import("resource://gre/modules/ObjectWrapper.jsm");
XPCOMUtils.defineLazyGetter(this, "cpmm", function() { XPCOMUtils.defineLazyGetter(this, "cpmm", function() {
return Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsIFrameMessageManager); return Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsIFrameMessageManager);
}); });
// Makes sure that we expose correctly chrome JS objects to content.
function wrapObjectIn(aObject, aCtxt) {
let res = Cu.createObjectIn(aCtxt);
let propList = { };
for (let prop in aObject) {
propList[prop] = {
enumerable: true,
configurable: true,
writable: true,
value: (typeof(aObject[prop]) == "object") ? wrapObjectIn(aObject[prop], aCtxt)
: aObject[prop]
}
}
Object.defineProperties(res, propList);
Cu.makeObjectPropsNormal(res);
return res;
};
function convertAppsArray(aApps, aWindow) { function convertAppsArray(aApps, aWindow) {
let apps = Cu.createArrayIn(aWindow); let apps = Cu.createArrayIn(aWindow);
for (let i = 0; i < aApps.length; i++) { for (let i = 0; i < aApps.length; i++) {
@@ -268,7 +251,7 @@ WebappsApplication.prototype = {
init: function(aWindow, aOrigin, aManifest, aManifestURL, aReceipts, aInstallOrigin, aInstallTime) { init: function(aWindow, aOrigin, aManifest, aManifestURL, aReceipts, aInstallOrigin, aInstallTime) {
this.origin = aOrigin; this.origin = aOrigin;
this.manifest = wrapObjectIn(aManifest, aWindow); this.manifest = ObjectWrapper.wrap(aManifest, aWindow);
this.manifestURL = aManifestURL; this.manifestURL = aManifestURL;
this.receipts = aReceipts; this.receipts = aReceipts;
this.installOrigin = aInstallOrigin; this.installOrigin = aInstallOrigin;

View File

@@ -31,6 +31,7 @@ EXTRA_JS_MODULES = ConsoleAPIStorage.jsm \
EXTRA_JS_MODULES += \ EXTRA_JS_MODULES += \
DOMRequestHelper.jsm \ DOMRequestHelper.jsm \
IndexedDBHelper.jsm \ IndexedDBHelper.jsm \
ObjectWrapper.jsm \
$(NULL) $(NULL)
XPIDLSRCS = \ XPIDLSRCS = \

View File

@@ -0,0 +1,42 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict"
const Cu = Components.utils;
const Cc = Components.classes;
const Ci = Components.interfaces;
const EXPORTED_SYMBOLS = ["ObjectWrapper"];
// Makes sure that we expose correctly chrome JS objects to content.
let ObjectWrapper = {
wrap: function objWrapper_wrap(aObject, aCtxt) {
let res = Cu.createObjectIn(aCtxt);
let propList = { };
for (let prop in aObject) {
let value;
if (Array.isArray(aObject[prop])) {
value = Cu.createArrayIn(aCtxt);
aObject[prop].forEach(function(aObj) {
value.push(objWrapper_wrap(aObj, aCtxt));
});
} else if (typeof(aObject[prop]) == "object") {
value = objWrapper_wrap(aObject[prop], aCtxt);
} else {
value = aObject[prop];
}
propList[prop] = {
enumerable: true,
configurable: true,
writable: true,
value: value
}
}
Object.defineProperties(res, propList);
Cu.makeObjectPropsNormal(res);
return res;
}
}

View File

@@ -11,6 +11,7 @@ const Cu = Components.utils;
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/ObjectWrapper.jsm");
XPCOMUtils.defineLazyGetter(this, "cpmm", function() { XPCOMUtils.defineLazyGetter(this, "cpmm", function() {
return Cc["@mozilla.org/childprocessmessagemanager;1"] return Cc["@mozilla.org/childprocessmessagemanager;1"]
@@ -63,7 +64,7 @@ SystemMessageManager.prototype = {
} }
} }
aHandler.handleMessage(aMessage); aHandler.handleMessage(ObjectWrapper.wrap(aMessage, this._window));
}, },
mozSetMessageHandler: function sysMessMgr_setMessageHandler(aType, aHandler) { mozSetMessageHandler: function sysMessMgr_setMessageHandler(aType, aHandler) {
@@ -175,6 +176,7 @@ SystemMessageManager.prototype = {
let appsService = Cc["@mozilla.org/AppsService;1"] let appsService = Cc["@mozilla.org/AppsService;1"]
.getService(Ci.nsIAppsService); .getService(Ci.nsIAppsService);
this._manifest = appsService.getManifestURLByLocalId(principal.appId); this._manifest = appsService.getManifestURLByLocalId(principal.appId);
this._window = aWindow;
}, },
classID: Components.ID("{bc076ea0-609b-4d8f-83d7-5af7cbdc3bb2}"), classID: Components.ID("{bc076ea0-609b-4d8f-83d7-5af7cbdc3bb2}"),