diff options
Diffstat (limited to 'dom/workers/ServiceWorkerRegisterJob.cpp')
-rw-r--r-- | dom/workers/ServiceWorkerRegisterJob.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/dom/workers/ServiceWorkerRegisterJob.cpp b/dom/workers/ServiceWorkerRegisterJob.cpp new file mode 100644 index 000000000..8f771e762 --- /dev/null +++ b/dom/workers/ServiceWorkerRegisterJob.cpp @@ -0,0 +1,67 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "ServiceWorkerRegisterJob.h" + +#include "Workers.h" + +namespace mozilla { +namespace dom { +namespace workers { + +ServiceWorkerRegisterJob::ServiceWorkerRegisterJob(nsIPrincipal* aPrincipal, + const nsACString& aScope, + const nsACString& aScriptSpec, + nsILoadGroup* aLoadGroup) + : ServiceWorkerUpdateJob(Type::Register, aPrincipal, aScope, aScriptSpec, + aLoadGroup) +{ +} + +void +ServiceWorkerRegisterJob::AsyncExecute() +{ + AssertIsOnMainThread(); + + RefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance(); + if (Canceled() || !swm) { + FailUpdateJob(NS_ERROR_DOM_ABORT_ERR); + return; + } + + RefPtr<ServiceWorkerRegistrationInfo> registration = + swm->GetRegistration(mPrincipal, mScope); + + if (registration) { + // If we are resurrecting an uninstalling registration, then persist + // it to disk again. We preemptively removed it earlier during + // unregister so that closing the window by shutting down the browser + // results in the registration being gone on restart. + if (registration->mPendingUninstall) { + swm->StoreRegistration(mPrincipal, registration); + } + registration->mPendingUninstall = false; + RefPtr<ServiceWorkerInfo> newest = registration->Newest(); + if (newest && mScriptSpec.Equals(newest->ScriptSpec())) { + SetRegistration(registration); + Finish(NS_OK); + return; + } + } else { + registration = swm->CreateNewRegistration(mScope, mPrincipal); + } + + SetRegistration(registration); + Update(); +} + +ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() +{ +} + +} // namespace workers +} // namespace dom +} // namespace mozilla |