From 89a0b3f88f4d0167ba456672c67ecb30a357ad21 Mon Sep 17 00:00:00 2001 From: Alive Kuo Date: Mon, 21 Oct 2013 19:16:00 +0100 Subject: [PATCH] Bug 927310 - dispatch activitydone event from mozbrowser iframe --- b2g/chrome/content/shell.js | 10 ------ dom/activities/src/ActivitiesService.jsm | 2 -- dom/activities/src/ActivityRequestHandler.js | 3 ++ dom/activities/src/ActivityWrapper.js | 35 +++++++++++++------ .../BrowserElementChildPreload.js | 11 +++++- dom/browser-element/BrowserElementParent.jsm | 1 + 6 files changed, 39 insertions(+), 23 deletions(-) diff --git a/b2g/chrome/content/shell.js b/b2g/chrome/content/shell.js index f44cff8ad20c..610e2fea5bfa 100644 --- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -1327,16 +1327,6 @@ window.addEventListener('ContentStart', function update_onContentStart() { }, 'volume-state-changed', false); })(); -Services.obs.addObserver(function(aSubject, aTopic, aData) { - let data = JSON.parse(aData); - shell.sendChromeEvent({ - type: "activity-done", - success: data.success, - manifestURL: data.manifestURL, - pageURL: data.pageURL - }); -}, "activity-done", false); - #ifdef MOZ_WIDGET_GONK // Devices don't have all the same partition size for /cache where we // store the http cache. diff --git a/dom/activities/src/ActivitiesService.jsm b/dom/activities/src/ActivitiesService.jsm index 246eb7c86d0b..dabaa972d2e4 100644 --- a/dom/activities/src/ActivitiesService.jsm +++ b/dom/activities/src/ActivitiesService.jsm @@ -301,12 +301,10 @@ let Activities = { case "Activity:PostResult": caller.mm.sendAsyncMessage("Activity:FireSuccess", msg); - Services.obs.notifyObservers(null, "activity-done", obsData); delete this.callers[msg.id]; break; case "Activity:PostError": caller.mm.sendAsyncMessage("Activity:FireError", msg); - Services.obs.notifyObservers(null, "activity-done", obsData); delete this.callers[msg.id]; break; diff --git a/dom/activities/src/ActivityRequestHandler.js b/dom/activities/src/ActivityRequestHandler.js index 3bc1436249da..08d081d314af 100644 --- a/dom/activities/src/ActivityRequestHandler.js +++ b/dom/activities/src/ActivityRequestHandler.js @@ -9,6 +9,7 @@ const Ci = Components.interfaces; const Cu = Components.utils; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); XPCOMUtils.defineLazyServiceGetter(this, "cpmm", "@mozilla.org/childprocessmessagemanager;1", @@ -53,6 +54,7 @@ ActivityRequestHandler.prototype = { "id": this._id, "result": aResult }); + Services.obs.notifyObservers(null, "activity-success", this._id); }, postError: function arh_postError(aError) { @@ -60,6 +62,7 @@ ActivityRequestHandler.prototype = { "id": this._id, "error": aError }); + Services.obs.notifyObservers(null, "activity-error", this._id); }, classID: Components.ID("{9326952a-dbe3-4d81-a51f-d9c160d96d6b}"), diff --git a/dom/activities/src/ActivityWrapper.js b/dom/activities/src/ActivityWrapper.js index c724baf190ff..74b5304feec5 100644 --- a/dom/activities/src/ActivityWrapper.js +++ b/dom/activities/src/ActivityWrapper.js @@ -50,21 +50,36 @@ ActivityWrapper.prototype = { let observer = { observe: function(aSubject, aTopic, aData) { - if (aTopic !== "inner-window-destroyed") { - return; - } - let wId = aSubject.QueryInterface(Ci.nsISupportsPRUint64).data; - if (wId == innerWindowID) { - debug("Closing activity window " + innerWindowID); - Services.obs.removeObserver(observer, "inner-window-destroyed"); - cpmm.sendAsyncMessage("Activity:PostError", - { id: aMessage.id, - error: "ActivityCanceled" }); + switch (aTopic) { + case 'inner-window-destroyed': + let wId = aSubject.QueryInterface(Ci.nsISupportsPRUint64).data; + if (wId == innerWindowID) { + debug("Closing activity window " + innerWindowID); + Services.obs.removeObserver(observer, "inner-window-destroyed"); + cpmm.sendAsyncMessage("Activity:PostError", + { id: aMessage.id, + error: "ActivityCanceled" + }); + } + break; + case 'activity-error': + case 'activity-success': + if (aData !== aMessage.id) { + return; + } + Services.obs.removeObserver(observer, "activity-error"); + Services.obs.removeObserver(observer, "activity-success"); + let docshell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation); + Services.obs.notifyObservers(docshell, "activity-done", aTopic); + break; } } } + Services.obs.addObserver(observer, "activity-error", false); + Services.obs.addObserver(observer, "activity-success", false); Services.obs.addObserver(observer, "inner-window-destroyed", false); return handler; }, diff --git a/dom/browser-element/BrowserElementChildPreload.js b/dom/browser-element/BrowserElementChildPreload.js index b7b57c8f3a9a..7da867a90c46 100644 --- a/dom/browser-element/BrowserElementChildPreload.js +++ b/dom/browser-element/BrowserElementChildPreload.js @@ -265,12 +265,18 @@ BrowserElementChild.prototype = { Services.obs.addObserver(this, 'xpcom-shutdown', /* ownsWeak = */ true); + + Services.obs.addObserver(this, + 'activity-done', + /* ownsWeak = */ true); }, observe: function(subject, topic, data) { // Ignore notifications not about our document. (Note that |content| /can/ // be null; see bug 874900.) - if (!content || subject != content.document) + if (topic !== 'activity-done' && (!content || subject != content.document)) + return; + if (topic == 'activity-done' && docShell !== subject) return; switch (topic) { case 'fullscreen-origin-change': @@ -282,6 +288,9 @@ BrowserElementChild.prototype = { case 'ask-parent-to-rollback-fullscreen': sendAsyncMsg('rollback-fullscreen'); break; + case 'activity-done': + sendAsyncMsg('activitydone', { success: (data == 'activity-success') }); + break; case 'xpcom-shutdown': this._shuttingDown = true; break; diff --git a/dom/browser-element/BrowserElementParent.jsm b/dom/browser-element/BrowserElementParent.jsm index 2dd4d25aded0..7a26cec7e197 100644 --- a/dom/browser-element/BrowserElementParent.jsm +++ b/dom/browser-element/BrowserElementParent.jsm @@ -127,6 +127,7 @@ function BrowserElementParent(frameLoader, hasRemoteFrame) { "iconchange": this._fireEventFromMsg, "close": this._fireEventFromMsg, "resize": this._fireEventFromMsg, + "activitydone": this._fireEventFromMsg, "opensearch": this._fireEventFromMsg, "securitychange": this._fireEventFromMsg, "error": this._fireEventFromMsg,