Closed Bug 1194078 Opened 10 years ago Closed 8 years ago

client.focus() should focus the app in firefox OS

Categories

(Core :: DOM: Push Subscriptions, defect)

ARM
Gonk (Firefox OS)
defect
Not set
normal

Tracking

()

RESOLVED WONTFIX
Tracking Status
firefox43 --- affected

People

(Reporter: robertbindar, Assigned: robertbindar)

References

Details

Attachments

(2 files, 1 obsolete file)

Calling client.focus() from within a serviceworker should foreground the caller app.
Depends on: 1189091
Blocks: 1151180
Assignee: nobody → robertbindar
Attached file client_focus_b2g (obsolete) —
This patch sends a message to the parent process saying that it wants to foreground the app with a particular appID, the parent process then uses the service created in bug 1189091 to send an event to the system app foregrounds the app eventually. I tested it on both b2g and b2g-desktop and it works as expected.
Attachment #8647343 - Flags: review?(nsm.nikhil)
Attached patch client_focus_b2gSplinter Review
Sorry, I forgot to check "patch".
Attachment #8647343 - Attachment is obsolete: true
Attachment #8647343 - Flags: review?(nsm.nikhil)
Attachment #8647345 - Flags: review?(nsm.nikhil)
Status: NEW → ASSIGNED
Comment on attachment 8647345 [details] [diff] [review] client_focus_b2g Review of attachment 8647345 [details] [diff] [review]: ----------------------------------------------------------------- ::: browser/base/content/content.js @@ +1237,5 @@ > text = text.replace(middleRE, " "); > return text.replace(endRE, ""); > } > }; > +pageInfoListener.init(this); Some newline change? ::: dom/interfaces/base/nsIPushProxyHelper.idl @@ +40,5 @@ > > void forwardMessageToParentSWM(in DOMString aMessageName, > in jsval aMessage); > + > + void forwardSWFocusClientEvent(in unsigned long aAppID); In light of this function, the interface definitely needs rename to something not push specific. It seems to be turning into an aggregation of Service Worker related process finding utilities. ::: dom/workers/PServiceWorkerManager.ipdl @@ +20,5 @@ > Register(ServiceWorkerRegistrationData data); > > Unregister(PrincipalInfo principalInfo, nsString scope); > > + ServiceWorkerFocusClient(PrincipalInfo principalInfo, uint32_t appId); You should be able to get the appId from the principal info when it is deserialized to the principal in the implementation. No need for this second param. ::: dom/workers/PushProxyHelper.js @@ +110,5 @@ > debug("sending push message to child"); > aChildMM.sendAsyncMessage(aMessageName, aMessage); > }, > > + wakeUpApp: function(aAppID, aShowApp) { At the minimum add a object literal param like: wakeUpApp(id, { show: true }) and document it at the function declaration [0]. Also, if wakeUpApp is meant to be used internally only, prefix with a '_'. [0]: http://wiki.qt.io/API_Design_Principles#The_Boolean_Parameter_Trap ::: dom/workers/ServiceWorkerManager.cpp @@ +5182,5 @@ > { > return ++gServiceWorkerInfoCurrentID; > } > > + Nit: extra newline ::: dom/workers/ServiceWorkerManagerParent.cpp @@ +104,5 @@ > > +class DispatchFocusClientCallback final : public nsRunnable > +{ > +public: > + DispatchFocusClientCallback(const PrincipalInfo& aPrincipalInfo, Please make the parameter ordering consistent with CheckPrincipalWithCallbackRunnable. @@ +115,5 @@ > + AssertIsInMainProcess(); > + AssertIsOnBackgroundThread(); > + } > + > + NS_IMETHODIMP NS_IMETHOD when it is in the declaration, also annotate with `override`. Could you make the same changes to CheckPrincipalWithCallbackRunnable while you are here? Thanks! ::: dom/workers/ServiceWorkerWindowClient.cpp @@ +90,5 @@ > nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(mWindowId); > UniquePtr<ServiceWorkerClientInfo> clientInfo; > > if (window) { > nsContentUtils::DispatchChromeEvent(window->GetExtantDoc(), window->GetOuterWindow(), NS_LITERAL_STRING("DOMServiceWorkerFocusClient"), true, true); This should not be called on b2g so please macro it out. @@ +91,5 @@ > UniquePtr<ServiceWorkerClientInfo> clientInfo; > > if (window) { > nsContentUtils::DispatchChromeEvent(window->GetExtantDoc(), window->GetOuterWindow(), NS_LITERAL_STRING("DOMServiceWorkerFocusClient"), true, true); > clientInfo.reset(new ServiceWorkerClientInfo(window->GetDocument(), Can't do this before success. @@ +100,5 @@ > + nsRefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); > + > + PrincipalInfo principalInfo; > + if (NS_WARN_IF(NS_FAILED(PrincipalToPrincipalInfo(principal, &principalInfo)))) { > + return NS_ERROR_FAILURE; if (NS_SUCCEEDED(PrincipalToPrincipalInfo...)) { send IPDL message initialize clientInfo. } Otherwise keep clientInfo uninitialized and the call to DispatchResult() will ensure the Promise is rejected. @@ +102,5 @@ > + PrincipalInfo principalInfo; > + if (NS_WARN_IF(NS_FAILED(PrincipalToPrincipalInfo(principal, &principalInfo)))) { > + return NS_ERROR_FAILURE; > + } > + nsRefPtr<ServiceWorkerManagerChild> actor = swm->GetBackgroundActor(); I'd rather have swm->FocusClient(...) that internally uses the actor than exposing the actor to other consumers. @@ +162,5 @@ > } > > nsRefPtr<ClientFocusRunnable> r = new ClientFocusRunnable(mWindowId, > promiseProxy); > + Nit: newline.
Attachment #8647345 - Flags: review?(nsm.nikhil)
Thanks Nikhil for the quick review! I'm glad you're ok with this solution. I'll fix the nits and upload a new patch soon :)
Bug 1194078: make client.focus() work on b2g
Attachment #8647830 - Flags: review?(nsm.nikhil)
Comment on attachment 8647830 [details] MozReview Request: Bug 1194078: make client.focus() work on b2g r=nsm https://reviewboard.mozilla.org/r/16063/#review14441 Ship It! ::: dom/interfaces/base/nsIPushIPCHelper.idl:13 (Diff revision 1) > interface nsIPushIPCHelper : nsISupports I think you mean ServiceWorkerIPCHelper. ::: dom/workers/PushIPCHelper.js:109 (Diff revision 1) > if (!aChildMM && aMessageName === "pushsubscriptionchange") { Why shouldn't the app be woken up for pushsubscriptionchange? It seems like an important message for the app to receive. ::: dom/workers/PushIPCHelper.js:123 (Diff revision 1) > - _wakeUpApp: function(aAppID) { > + // aShowOptions is {showApp: bool_value, onlyShowApp: bool_value} Nit: s/bool_value/boolean ::: dom/workers/PushIPCHelper.js:124 (Diff revision 1) > + // showApp: This flag indicates the app must be brought to the > + // foreground. > + // onlyShowApp: This flag indicates the app must be *only* brought to > + // the foreground without loading to handle messages. Seems better to ask them to look at the canonical documentation in https://dxr.mozilla.org/mozilla-central/source/dom/messages/interfaces/nsISystemMessageGlue.idl#18 ::: dom/workers/ServiceWorkerManagerParent.cpp:136 (Diff revision 1) > + helper->SendClientFocusEvent(principal->GetAppId()); You have to check the app id for NO_APP_ID or UNKNOWN_APP_ID, unless the SystemApp will do that for you.
Attachment #8647830 - Flags: review?(nsm.nikhil) → review+
Comment on attachment 8647830 [details] MozReview Request: Bug 1194078: make client.focus() work on b2g r=nsm Bug 1194078: make client.focus() work on b2g r=nsm
Attachment #8647830 - Attachment description: MozReview Request: Bug 1194078: make client.focus() work on b2g → MozReview Request: Bug 1194078: make client.focus() work on b2g r=nsm
Attachment #8647830 - Flags: review+
I fixed, all the issues. Checking appID == UNKNOWN | NO_APP_ID is done in ServiceWorkerIPCHelper. Waiting for bug 1189091 to land.
Status: ASSIGNED → RESOLVED
Closed: 8 years ago
Resolution: --- → WONTFIX
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: