☠☠ backed out by e9d37cd95335 ☠ ☠ | |
author | Nikhil Marathe <nsm.nikhil@gmail.com> |
Wed, 05 Nov 2014 14:43:51 -0800 | |
changeset 225491 | 5555ee7490fb910f26877ede648f231dc37e7eca |
parent 225490 | 3ff80c8772122e9992861be9ba0e338545c0b3c2 |
child 225492 | d87c50c303298b0b40419988b793504dc715cf73 |
push id | 28163 |
push user | philringnalda@gmail.com |
push date | Sat, 24 Jan 2015 16:27:39 +0000 |
treeherder | mozilla-central@1cf171c1a177 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | baku |
bugs | 1113631 |
milestone | 38.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/workers/ServiceWorkerManager.cpp | file | annotate | diff | comparison | revisions | |
dom/workers/test/serviceworkers/test_installation_simple.html | file | annotate | diff | comparison | revisions |
--- a/dom/workers/ServiceWorkerManager.cpp +++ b/dom/workers/ServiceWorkerManager.cpp @@ -527,18 +527,17 @@ public: } // Public so our error handling code can use it. void Fail(const ErrorEventInit& aError) { MOZ_ASSERT(mCallback); mCallback->UpdateFailed(aError); - mCallback = nullptr; - Done(NS_ERROR_DOM_JS_EXCEPTION); + FailCommon(NS_ERROR_DOM_JS_EXCEPTION); } // Public so our error handling code can continue with a successful worker. void ContinueInstall() { nsRefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); nsRefPtr<ServiceWorkerManager::ServiceWorkerDomainInfo> domainInfo = @@ -656,26 +655,49 @@ private: void Succeed() { MOZ_ASSERT(mCallback); mCallback->UpdateSucceeded(mRegistration); mCallback = nullptr; } + void + FailCommon(nsresult aRv) + { + mCallback = nullptr; + MaybeRemoveRegistration(); + // Ensures that the job can't do anything useful from this point on. + mRegistration = nullptr; + Done(aRv); + } + // This MUST only be called when the job is still performing actions related // to registration or update. After the spec resolves the update promise, use // Done() with the failure code instead. void - Fail(nsresult rv) + Fail(nsresult aRv) { MOZ_ASSERT(mCallback); - mCallback->UpdateFailed(rv); - mCallback = nullptr; - Done(rv); + mCallback->UpdateFailed(aRv); + FailCommon(aRv); + } + + void + MaybeRemoveRegistration() + { + MOZ_ASSERT(mRegistration); + nsRefPtr<ServiceWorkerInfo> newest = mRegistration->Newest(); + if (!newest) { + nsRefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); + nsRefPtr<ServiceWorkerManager::ServiceWorkerDomainInfo> domainInfo = + swm->GetDomainInfo(mRegistration->mScope); + MOZ_ASSERT(domainInfo); + domainInfo->RemoveRegistration(mRegistration); + } } void ContinueAfterInstallEvent(bool aSuccess, bool aActivateImmediately) { // By this point the callback should've been notified about success or fail // and nulled. MOZ_ASSERT(!mCallback); @@ -688,16 +710,17 @@ private: nsRefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); // "If installFailed is true" if (!aSuccess) { mRegistration->mInstallingWorker->UpdateState(ServiceWorkerState::Redundant); mRegistration->mInstallingWorker = nullptr; swm->InvalidateServiceWorkerRegistrationWorker(mRegistration, WhichServiceWorker::INSTALLING_WORKER); + MaybeRemoveRegistration(); return Done(NS_ERROR_DOM_ABORT_ERR); } // "If registration's waiting worker is not null" if (mRegistration->mWaitingWorker) { // FIXME(nsm): Terminate mRegistration->mWaitingWorker->UpdateState(ServiceWorkerState::Redundant); }
--- a/dom/workers/test/serviceworkers/test_installation_simple.html +++ b/dom/workers/test/serviceworkers/test_installation_simple.html @@ -101,16 +101,20 @@ ok(e.name === "NetworkError", "Should fail with NetworkError"); }); } function parseError() { var p = navigator.serviceWorker.register("parse_error_worker.js", { scope: "parse_error/" }); return p.then(function(wr) { ok(false, "Registration should fail with parse error"); + return navigator.serviceWorker.getRegistration("parse_error/").then(function(swr) { + // See https://github.com/slightlyoff/ServiceWorker/issues/547 + is(swr, undefined, "A failed registration for a scope with no prior controllers should clear itself"); + }); }, function(e) { info("NSM " + e.name); ok(e instanceof Error, "Registration should fail with parse error"); }); } // FIXME(nsm): test for parse error when Update step doesn't happen (directly from register).