Closed
Bug 1218148
Opened 9 years ago
Closed 8 years ago
Implement WindowClient.navigate()
Categories
(Core :: DOM: Service Workers, defect)
Core
DOM: Service Workers
Tracking
()
RESOLVED
FIXED
mozilla50
Tracking | Status | |
---|---|---|
firefox50 | --- | fixed |
People
(Reporter: ehsan.akhgari, Assigned: farre)
References
Details
(Keywords: dev-doc-complete)
Attachments
(2 files)
No description provided.
Updated•9 years ago
|
Keywords: dev-doc-needed
Comment 1•9 years ago
|
||
Looks like we may already have docs (if not an implementation), Jean-Yves: https://developer.mozilla.org/en-US/docs/Web/API/WindowClient/navigate
Flags: needinfo?(jypenator)
Assignee | ||
Updated•8 years ago
|
Assignee: nobody → afarre
Assignee | ||
Updated•8 years ago
|
Status: NEW → ASSIGNED
Assignee | ||
Comment 2•8 years ago
|
||
Review commit: https://reviewboard.mozilla.org/r/58520/diff/#index_header See other reviews: https://reviewboard.mozilla.org/r/58520/
Attachment #8761222 -
Flags: review?(amarchesini)
Attachment #8761223 -
Flags: review?(amarchesini)
Assignee | ||
Comment 3•8 years ago
|
||
Review commit: https://reviewboard.mozilla.org/r/58522/diff/#index_header See other reviews: https://reviewboard.mozilla.org/r/58522/
Comment 4•8 years ago
|
||
Comment on attachment 8761222 [details] Bug 1218148 - Implement WindowClient.navigate() https://reviewboard.mozilla.org/r/58520/#review55636 It looks good! The only thing I would like to see improved is this ResolveOrRejectPromiseRunnable. Currently it doing too many things and it's hard to follow them via CTORs. What about if: if mRV is error => reject with error. otherwise if client == null -> resolve with null otherwise -> resolve with the client And we make 2 CTORs: with aRV: and MOZ_ASSERT(NS_FAILED(aRv)); with Client: and it can be null. Add a comment about it. no mNullResolve (because we can use !mClient). ::: dom/workers/ServiceWorkerWindowClient.cpp:75 (Diff revision 1) > + ResolveOrRejectPromiseRunnable(WorkerPrivate* aWorkerPrivate, > + PromiseWorkerProxy* aPromiseProxy) > + : WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount) > + , mPromiseProxy(aPromiseProxy) > + , mClientInfo(nullptr) > + , mNullResolve(true) What's the default value for mRV here? ::: dom/workers/ServiceWorkerWindowClient.cpp:87 (Diff revision 1) > + nsresult aRv) > + : WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount) > + , mPromiseProxy(aPromiseProxy) > + , mClientInfo(nullptr) > + , mRv(aRv) > + , mNullResolve(false) This is quite confusing. What about if you do: ResolveOrRejectPromiseRunnable(..., nsresult aRv, bool aNullResolve) ? ::: dom/workers/ServiceWorkerWindowClient.cpp:240 (Diff revision 1) > + return NS_OK; > + } > + > + aWebProgress->RemoveProgressListener(this); > + > + MutexAutoLock lock(mPromiseProxy->Lock()); Also here {} ::: dom/workers/ServiceWorkerWindowClient.cpp:262 (Diff revision 1) > + clientInfo.reset(new ServiceWorkerClientInfo(doc)); > + resolveRunnable = new ResolveOrRejectPromiseRunnable( > + mPromiseProxy->GetWorkerPrivate(), mPromiseProxy, Move(clientInfo)); > + } else { > + resolveRunnable = new ResolveOrRejectPromiseRunnable( > + mPromiseProxy->GetWorkerPrivate(), mPromiseProxy); It's very confusing the fact if you don't pass arguments, then we resolve it as null. ::: dom/workers/ServiceWorkerWindowClient.cpp:349 (Diff revision 1) > + NS_IMETHOD > + Run() override > + { > + AssertIsOnMainThread(); > + > + MutexAutoLock lock(mPromiseProxy->Lock()); put this into {} so that you don't lock mProxyProxy for the all Run(). ::: dom/workers/ServiceWorkerWindowClient.cpp:354 (Diff revision 1) > + MutexAutoLock lock(mPromiseProxy->Lock()); > + if (mPromiseProxy->CleanedUp()) { > + return NS_OK; > + } > + > + nsresult rv = Navigate(); Do a quick return here: if (NS_FAILED(rv)) { RejectPromise(rv); return; } where RejectPromise is: RefPtr<ResolveOrRejectPromiseRunnable> runnable = new ResolveOrRejectPromiseRunnable(...., rv); runnable->Dispatch(); ::: dom/workers/ServiceWorkerWindowClient.cpp:366 (Diff revision 1) > + nsresult rv = NS_NewURI(getter_AddRefs(baseURI), info.mHref); > + if (NS_WARN_IF(NS_FAILED(rv))) { > + return NS_ERROR_FAILURE; > + } > + > + nsGlobalWindow* window = nsGlobalWindow::GetInnerWindowWithId(mWindowId); Don't do this step twice. Store mWindow as argument. Or return it from Navigate(). ::: dom/workers/ServiceWorkerWindowClient.cpp:387 (Diff revision 1) > + > + RefPtr<ResolveOrRejectPromiseRunnable> resolveRunnable; > + if (rv != NS_ERROR_DOM_BAD_URI) { > + resolveRunnable = new ResolveOrRejectPromiseRunnable( > + mPromiseProxy->GetWorkerPrivate(), mPromiseProxy, rv); > + } else { This would be: new ResolveOrRjectPromiseRunnable(..., rv, rv == NS_ERROR_DOM_BAD_URI) ::: dom/workers/ServiceWorkerWindowClient.cpp:407 (Diff revision 1) > + WorkerPrivate::LocationInfo& info = workerPrivate->GetLocationInfo(); > + > + nsCOMPtr<nsIURI> baseUrl; > + nsresult rv = NS_NewURI(getter_AddRefs(baseUrl), info.mHref); > + if (NS_FAILED(rv)) { > + return NS_ERROR_FAILURE; if (NS_WARN_IF(NS_FAILED(rv))) { return NS_ERROR_TYPE_ERR; } ::: dom/workers/ServiceWorkerWindowClient.cpp:456 (Diff revision 1) > + loadInfo->SetReferrerPolicy(doc->GetReferrerPolicy()); > + loadInfo->SetLoadType(nsIDocShellLoadInfo::loadStopContentAndReplace); > + loadInfo->SetSourceDocShell(docShell); > + rv = docShell->LoadURI(url, loadInfo, nsIWebNavigation::LOAD_FLAGS_NONE, true); > + > + if (NS_FAILED(rv)) { NS_WARN_IF
Attachment #8761222 -
Flags: review?(amarchesini) → review-
Comment 5•8 years ago
|
||
Comment on attachment 8761223 [details] Bug 1218148 - Web Platform tests for WindowClient.navigate() https://reviewboard.mozilla.org/r/58522/#review55638 ::: testing/web-platform/meta/MANIFEST.json (Diff revision 1) > "path": "dom/nodes/Node-isSameNode.html", > "url": "/dom/nodes/Node-isSameNode.html" > }, > { > - "path": "dom/nodes/Node-isConnected.html", > - "url": "/dom/nodes/Node-isConnected.html" Why this change? ::: testing/web-platform/tests/service-workers/service-worker/resources/client-navigate-worker.js:54 (Diff revision 1) > + > + promise_test(function(t) { > + this.add_cleanup(function() { port.postMessage(pass(test, "")); }); > + return self.clients.get(clientId) > + .then(client => promise_rejects(t, new TypeError(), client.navigate("about:blank"))) > + .catch(unreached_rejection(t)); add a test where we reject because the URL is not valid.
Attachment #8761223 -
Flags: review?(amarchesini) → review+
Assignee | ||
Comment 6•8 years ago
|
||
https://reviewboard.mozilla.org/r/58522/#review55638 > Why this change? I ran the script for adding a test, which made this change. I guess it's a manual change, which the script has now fixed (it's only a move right?).
Assignee | ||
Comment 7•8 years ago
|
||
Comment on attachment 8761222 [details] Bug 1218148 - Implement WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58520/diff/1-2/
Attachment #8761222 -
Flags: review- → review?(amarchesini)
Assignee | ||
Comment 8•8 years ago
|
||
Comment on attachment 8761223 [details] Bug 1218148 - Web Platform tests for WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58522/diff/1-2/
Comment 9•8 years ago
|
||
Comment on attachment 8761222 [details] Bug 1218148 - Implement WindowClient.navigate() https://reviewboard.mozilla.org/r/58520/#review56040 ::: dom/workers/ServiceWorkerWindowClient.cpp:278 (Diff revision 2) > + OnProgressChange(nsIWebProgress* aWebProgress, nsIRequest* aRequest, > + int32_t aCurSelfProgress, int32_t aMaxSelfProgress, > + int32_t aCurTotalProgress, > + int32_t aMaxTotalProgress) override > + { > + MOZ_ASSERT(false, "Unexpected notification."); MOZ_CRASH ::: dom/workers/ServiceWorkerWindowClient.cpp:366 (Diff revision 2) > + } > + > + nsCOMPtr<nsIURI> baseUrl; > + nsCOMPtr<nsIURI> url; > + nsresult rv = ParseUrl(getter_AddRefs(baseUrl), getter_AddRefs(url)); > + NS_ENSURE_SUCCESS(rv, rv); remove this ::: dom/workers/ServiceWorkerWindowClient.cpp:384 (Diff revision 2) > + return RejectPromise(rv); > + } > + > + nsCOMPtr<nsIDocShell> docShell = window->GetDocShell(); > + nsCOMPtr<nsIWebProgress> webProgress = do_GetInterface(docShell); > + if (!webProgress) { NS_WARN_IF ::: dom/workers/ServiceWorkerWindowClient.cpp:393 (Diff revision 2) > + nsCOMPtr<nsIWebProgressListener> listener = > + new WebProgressListener(mPromiseProxy, window->GetOuterWindow(), baseUrl); > + > + rv = webProgress->AddProgressListener( > + listener, nsIWebProgress::NOTIFY_STATE_DOCUMENT); > + MOZ_ASSERT(NS_SUCCEEDED(rv)); This can fail. Probably it's better to a simple: NS_WARN_IF + FAILED + RejectPromise(rv); ::: dom/workers/ServiceWorkerWindowClient.cpp:398 (Diff revision 2) > + MOZ_ASSERT(NS_SUCCEEDED(rv)); > + return NS_OK; > + } > + > +private: > + nsresult RejectPromise(nsresult aRv) nsresult RejectPromise(nsresult aRv) ::: dom/workers/ServiceWorkerWindowClient.cpp:408 (Diff revision 2) > + > + resolveRunnable->Dispatch(); > + return NS_OK; > + } > + > + nsresult ResolvePromise(UniquePtr<ServiceWorkerClientInfo>&& aClientInfo) same indentation here. ::: dom/workers/ServiceWorkerWindowClient.cpp:421 (Diff revision 2) > + return NS_OK; > + } > + > + nsresult > + ParseUrl(nsIURI** aBaseUrl, nsIURI** aUrl) > + { MOZ_ASSERT(NS_IsOnMainThread()); MOZ_ASSERT(aBaseUrl) MOZ_ASSERT(aUrl) ::: dom/workers/ServiceWorkerWindowClient.cpp:438 (Diff revision 2) > + return NS_OK; > + } > + > + nsresult > + Navigate(nsIURI* aUrl, nsIPrincipal* aPrincipal, nsGlobalWindow** aWindow) > + { MOZ_ASSERT(aWindow); ::: dom/workers/ServiceWorkerWindowClient.cpp:460 (Diff revision 2) > + return NS_ERROR_TYPE_ERR; > + } > + > + nsCOMPtr<nsIDocShellLoadInfo> loadInfo; > + nsresult rv = docShell->CreateLoadInfo(getter_AddRefs(loadInfo)); > + extra line?
Attachment #8761222 -
Flags: review?(amarchesini) → review+
Assignee | ||
Comment 10•8 years ago
|
||
Comment on attachment 8761222 [details] Bug 1218148 - Implement WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58520/diff/2-3/
Assignee | ||
Comment 11•8 years ago
|
||
Comment on attachment 8761223 [details] Bug 1218148 - Web Platform tests for WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58522/diff/2-3/
Comment 12•8 years ago
|
||
Note, there is some additional spec discussion here: https://github.com/slightlyoff/ServiceWorker/issues/918
Assignee | ||
Comment 13•8 years ago
|
||
I'll fix that.
Comment 14•8 years ago
|
||
Actually, it seems like maybe you already do that? It seems like the patch is using nsIWebNavigation::LOAD_FLAGS_NONE and not nsIWebNavigation::LOAD_FLAGS_REPLACE_HISTORY.
Assignee | ||
Comment 15•8 years ago
|
||
Ah, I had it replacing in an intermediary version. Still, I'll make sure to await and see how the discussion the issue turns out.
Assignee | ||
Comment 17•8 years ago
|
||
Comment on attachment 8761222 [details] Bug 1218148 - Implement WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58520/diff/3-4/
Assignee | ||
Comment 18•8 years ago
|
||
Comment on attachment 8761223 [details] Bug 1218148 - Web Platform tests for WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58522/diff/3-4/
Assignee | ||
Comment 19•8 years ago
|
||
https://treeherder.mozilla.org/#/jobs?repo=try&revision=df446e476717
Assignee | ||
Updated•8 years ago
|
Keywords: checkin-needed
Comment 20•8 years ago
|
||
has problems to apply: patching file dom/workers/ServiceWorkerWindowClient.cpp Hunk #2 FAILED at 40 1 out of 4 hunks FAILED -- saving rejects to file dom/workers/ServiceWorkerWindowClient.cpp.rej patch failed to apply abort: fix up the working directory and run hg transplant --continue
Flags: needinfo?(afarre)
Keywords: checkin-needed
Assignee | ||
Comment 21•8 years ago
|
||
Comment on attachment 8761222 [details] Bug 1218148 - Implement WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58520/diff/4-5/
Assignee | ||
Comment 22•8 years ago
|
||
Comment on attachment 8761223 [details] Bug 1218148 - Web Platform tests for WindowClient.navigate() Review request updated; see interdiff: https://reviewboard.mozilla.org/r/58522/diff/4-5/
Assignee | ||
Comment 23•8 years ago
|
||
Rebased and pushed to mozreview. Now the patch should apply cleanly.
Flags: needinfo?(afarre)
Keywords: checkin-needed
Comment 24•8 years ago
|
||
Pushed by kwierso@gmail.com: https://hg.mozilla.org/integration/mozilla-inbound/rev/aa2088d0085a Implement WindowClient.navigate() r=baku https://hg.mozilla.org/integration/mozilla-inbound/rev/7d290ccf62a7 Web Platform tests for WindowClient.navigate() r=baku
Keywords: checkin-needed
Comment 25•8 years ago
|
||
bugherder |
https://hg.mozilla.org/mozilla-central/rev/aa2088d0085a https://hg.mozilla.org/mozilla-central/rev/7d290ccf62a7
Status: ASSIGNED → RESOLVED
Closed: 8 years ago
status-firefox50:
--- → fixed
Resolution: --- → FIXED
Target Milestone: --- → mozilla50
Comment 26•8 years ago
|
||
(In reply to Andrew Overholt [:overholt] from comment #1) > Looks like we may already have docs (if not an implementation), Jean-Yves: > https://developer.mozilla.org/en-US/docs/Web/API/WindowClient/navigate Yes, but we need to be sure it's on Firefox X for developers. Which it now is: https://developer.mozilla.org/en-US/Firefox/Releases/50#Service_Workers
Keywords: dev-doc-needed → dev-doc-complete
Updated•8 years ago
|
Flags: needinfo?(jypenator)
You need to log in
before you can comment on or make changes to this bug.
Description
•