diff --git a/b2g/chrome/content/shell.js b/b2g/chrome/content/shell.js index def242bd7a3e..d52e9849c9d5 100644 --- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -555,6 +555,8 @@ var shell = { url: msg.uri, manifestURL: msg.manifest, isActivity: (msg.type == 'activity'), + onlyShowApp: msg.onlyShowApp, + showApp: msg.showApp, target: msg.target, expectingSystemMessage: true, extra: msg.extra diff --git a/dom/activities/src/ActivityMessageConfigurator.js b/dom/activities/src/ActivityMessageConfigurator.js index c28553fc2a54..c0c358c13e51 100644 --- a/dom/activities/src/ActivityMessageConfigurator.js +++ b/dom/activities/src/ActivityMessageConfigurator.js @@ -21,9 +21,9 @@ function ActivityMessageConfigurator() { } ActivityMessageConfigurator.prototype = { - get safeToSendBeforeRunningApp() { - debug("safeToSendBeforeRunningApp returning false"); - return false; + get mustShowRunningApp() { + debug("mustShowRunningApp returning true"); + return true; }, classID: Components.ID("{d2296daa-c406-4c5e-b698-e5f2c1715798}"), diff --git a/dom/messages/SystemMessageInternal.js b/dom/messages/SystemMessageInternal.js index a8bb0df840d3..c9c339b175da 100644 --- a/dom/messages/SystemMessageInternal.js +++ b/dom/messages/SystemMessageInternal.js @@ -49,8 +49,8 @@ function debug(aMsg) { let defaultMessageConfigurator = { - get safeToSendBeforeRunningApp() { - return true; + get mustShowRunningApp() { + return false; } }; @@ -208,10 +208,7 @@ SystemMessageInternal.prototype = { // Queue this message in the corresponding pages. this._queueMessage(page, aMessage, messageID); - if (result === MSG_SENT_FAILURE_APP_NOT_RUNNING) { - // Don't open the page again if we already sent the message to it. - this._openAppPage(page, aMessage, aExtra); - } + this._openAppPage(page, aMessage, aExtra, result); } }, @@ -253,10 +250,7 @@ SystemMessageInternal.prototype = { // Queue this message in the corresponding pages. this._queueMessage(aPage, aMessage, messageID); - if (result === MSG_SENT_FAILURE_APP_NOT_RUNNING) { - // Open app pages to handle their pending messages. - this._openAppPage(aPage, aMessage, aExtra); - } + this._openAppPage(aPage, aMessage, aExtra, result); } }, this); }, @@ -530,13 +524,28 @@ SystemMessageInternal.prototype = { } }, - _openAppPage: function _openAppPage(aPage, aMessage, aExtra) { + _openAppPage: function _openAppPage(aPage, aMessage, aExtra, aMsgSentStatus) { + // This means the app must be brought to the foreground. + let showApp = this._getMessageConfigurator(aPage.type).mustShowRunningApp; + + // We should send the open-app message if the system message was + // not sent, or if it was sent but we should show the app anyway. + if ((aMsgSentStatus === MSG_SENT_SUCCESS) && !showApp) { + return; + } + + // This flag means the app must *only* be brought to the foreground + // and we don't need to load the app to handle messages. + let onlyShowApp = (aMsgSentStatus === MSG_SENT_SUCCESS) && showApp; + // We don't need to send the full object to observers. let page = { uri: aPage.uri, manifest: aPage.manifest, type: aPage.type, extra: aExtra, - target: aMessage.target }; + target: aMessage.target, + onlyShowApp: onlyShowApp, + showApp: showApp }; debug("Asking to open " + JSON.stringify(page)); Services.obs.notifyObservers(this, "system-messages-open-app", JSON.stringify(page)); }, @@ -580,40 +589,34 @@ SystemMessageInternal.prototype = { manifest: aManifestURI, uri: aPageURI }); - // Tries to send the message to a previously opened app only if it's safe - // to do so. Generically, it's safe to send the message if the app isn't - // going to be reloaded. And it's not safe otherwise - if (this._getMessageConfigurator(aType).safeToSendBeforeRunningApp) { - - let targets = this._listeners[aManifestURI]; - if (targets) { - for (let index = 0; index < targets.length; ++index) { - let target = targets[index]; - // We only need to send the system message to the targets (processes) - // which contain the window page that matches the manifest/page URL of - // the destination of system message. - if (target.winCounts[aPageURI] === undefined) { - continue; - } - - appPageIsRunning = true; - // We need to acquire a CPU wake lock for that page and expect that - // we'll receive a "SystemMessageManager:HandleMessagesDone" message - // when the page finishes handling the system message. At that point, - // we'll release the lock we acquired. - this._acquireCpuWakeLock(pageKey); - - // Multiple windows can share the same target (process), the content - // window needs to check if the manifest/page URL is matched. Only - // *one* window should handle the system message. - let manager = target.target; - manager.sendAsyncMessage("SystemMessageManager:Message", - { type: aType, - msg: aMessage, - manifest: aManifestURI, - uri: aPageURI, - msgID: aMessageID }); + let targets = this._listeners[aManifestURI]; + if (targets) { + for (let index = 0; index < targets.length; ++index) { + let target = targets[index]; + // We only need to send the system message to the targets (processes) + // which contain the window page that matches the manifest/page URL of + // the destination of system message. + if (target.winCounts[aPageURI] === undefined) { + continue; } + + appPageIsRunning = true; + // We need to acquire a CPU wake lock for that page and expect that + // we'll receive a "SystemMessageManager:HandleMessagesDone" message + // when the page finishes handling the system message. At that point, + // we'll release the lock we acquired. + this._acquireCpuWakeLock(pageKey); + + // Multiple windows can share the same target (process), the content + // window needs to check if the manifest/page URL is matched. Only + // *one* window should handle the system message. + let manager = target.target; + manager.sendAsyncMessage("SystemMessageManager:Message", + { type: aType, + msg: aMessage, + manifest: aManifestURI, + uri: aPageURI, + msgID: aMessageID }); } } diff --git a/dom/messages/interfaces/nsISystemMessagesInternal.idl b/dom/messages/interfaces/nsISystemMessagesInternal.idl index f529d7c71d13..8df78278f076 100644 --- a/dom/messages/interfaces/nsISystemMessagesInternal.idl +++ b/dom/messages/interfaces/nsISystemMessagesInternal.idl @@ -56,13 +56,12 @@ interface nsISystemMessagesWrapper: nsISupports * Implements an interface to allow specific message types to * configure some behaviors */ -[scriptable, uuid(8a71981b-a462-4697-b63c-925997f9d47b)] +[scriptable, uuid(a0e970f6-faa9-4605-89d6-fafae8b10a80)] interface nsISystemMessagesConfigurator: nsISupports { /* - * Will be true if this type of system messages is safe to send - * before the frontend has activated the app to process it. - * The default value (if there's no overriding class) is true + * Will be true if this type of system messages assumes/requires + * that the app will be brought to the front always. */ - readonly attribute boolean safeToSendBeforeRunningApp; + readonly attribute boolean mustShowRunningApp; };