mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
3b1d2cdd8a
- Bug 1171486 - Part 2: Make it OK to call ServiceWorkerManager::GetInstance() during its Init() function; r=baku (c3c7bd78c) - Bug 1115820 - Add telemetry to ServiceWorkers. r=nsm, r=vladan (9a86f7466) - Bug 1172717 - Fail on UNKNOWN_APP_ID instead of crashing. r=bholley a=RyanVM (f950a7c59) - Bug 1154068 - rename relaxed to insecure scheme and add more runtime checks r=hurley (76e8ce41a) - Bug 1154061 - clear cached alt svc mappings on a variety of state changes r=hurley (9855ee544) - Bug 1153437 - rename proxyFlags to controlFlags with nsISocketProvider interfaces r=hurley (043a531c8) - bug 1153212 - 2/2 Necko explicitly track origin vs routed host and give psm only origin r=dkeeler r=hurley IGNORE IDL (d44c3d0e6) - part of Bug 935838 - Add per app network traffic statistics (d1861cb3d) - Bug 1109338: Part 1: Separate UDPSocket logging from network logging r=dragana (c2c887b0f) - Bug 1109338: Part 2: Sharing UDPSocket between PNecko and PBackground r=bent (90b2a09d2) - Bug 1133189 - Extend PrincipalInfo to handle expanded principals. r=bent, r=sicking (d3269d57e) - Bug 1155153 - about:serviceworkers should work in e10s mode, r=nsm, r=bholley (90dd0bb4b) - Bug 1061116 - Make the comparison query/hash insensitive for validity widget. r=fabrice (0969e8404) - Bug 1167603 - use string to replace nsIURI in aApps.widgetPages. r=fabrice (c528e2615) - Bug 1087469 - Add support for a start_url property in app manifests r=fabrice (0053f26d6) - Bug 1168783 - Expose principal in mozIApplication. r=fabrice (2fee4ed8e) - Bug 1169249 - Unregister service worker registration when uninstalling a service-worker-enabled application. r=baku (c881ee50b) - Bug 1174381 - ServiceWorkerManager::TeardownRunnable should be called when xpcom-shutdown notification is received, r=nsm (f47d59f19) - Bug 1167296 - patch 1 - ServiceWorkerManager::RemoveAll should use PBackground, r=nsm (8f8feda13) - Bug 1167296 - patch 2 - ServiceWorkerManager::Remove should use PBackground, r=nsm (fc931fffc)
411 lines
9.0 KiB
C++
411 lines
9.0 KiB
C++
/* -*- 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 "ServiceWorkerManagerService.h"
|
|
#include "ServiceWorkerManagerParent.h"
|
|
#include "ServiceWorkerRegistrar.h"
|
|
#include "mozilla/ipc/BackgroundParent.h"
|
|
#include "mozilla/unused.h"
|
|
|
|
namespace mozilla {
|
|
|
|
using namespace ipc;
|
|
|
|
namespace dom {
|
|
namespace workers {
|
|
|
|
namespace {
|
|
|
|
ServiceWorkerManagerService* sInstance = nullptr;
|
|
|
|
} // anonymous namespace
|
|
|
|
ServiceWorkerManagerService::ServiceWorkerManagerService()
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
// sInstance is a raw ServiceWorkerManagerService*.
|
|
MOZ_ASSERT(!sInstance);
|
|
sInstance = this;
|
|
}
|
|
|
|
ServiceWorkerManagerService::~ServiceWorkerManagerService()
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
MOZ_ASSERT(sInstance == this);
|
|
MOZ_ASSERT(mAgents.Count() == 0);
|
|
|
|
sInstance = nullptr;
|
|
}
|
|
|
|
/* static */ already_AddRefed<ServiceWorkerManagerService>
|
|
ServiceWorkerManagerService::Get()
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
nsRefPtr<ServiceWorkerManagerService> instance = sInstance;
|
|
return instance.forget();
|
|
}
|
|
|
|
/* static */ already_AddRefed<ServiceWorkerManagerService>
|
|
ServiceWorkerManagerService::GetOrCreate()
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
nsRefPtr<ServiceWorkerManagerService> instance = sInstance;
|
|
if (!instance) {
|
|
instance = new ServiceWorkerManagerService();
|
|
}
|
|
return instance.forget();
|
|
}
|
|
|
|
void
|
|
ServiceWorkerManagerService::RegisterActor(ServiceWorkerManagerParent* aParent)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
MOZ_ASSERT(aParent);
|
|
MOZ_ASSERT(!mAgents.Contains(aParent));
|
|
|
|
mAgents.PutEntry(aParent);
|
|
}
|
|
|
|
void
|
|
ServiceWorkerManagerService::UnregisterActor(ServiceWorkerManagerParent* aParent)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
MOZ_ASSERT(aParent);
|
|
MOZ_ASSERT(mAgents.Contains(aParent));
|
|
|
|
mAgents.RemoveEntry(aParent);
|
|
}
|
|
|
|
namespace {
|
|
|
|
struct MOZ_STACK_CLASS RegistrationData final
|
|
{
|
|
RegistrationData(ServiceWorkerRegistrationData& aData,
|
|
uint64_t aParentID)
|
|
: mData(aData)
|
|
, mParentID(aParentID)
|
|
#ifdef DEBUG
|
|
, mParentFound(false)
|
|
#endif
|
|
{
|
|
MOZ_COUNT_CTOR(RegistrationData);
|
|
}
|
|
|
|
~RegistrationData()
|
|
{
|
|
MOZ_COUNT_DTOR(RegistrationData);
|
|
}
|
|
|
|
const ServiceWorkerRegistrationData& mData;
|
|
const uint64_t mParentID;
|
|
#ifdef DEBUG
|
|
bool mParentFound;
|
|
#endif
|
|
};
|
|
|
|
PLDHashOperator
|
|
RegistrationEnumerator(nsPtrHashKey<ServiceWorkerManagerParent>* aKey, void* aPtr)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
auto* data = static_cast<RegistrationData*>(aPtr);
|
|
|
|
ServiceWorkerManagerParent* parent = aKey->GetKey();
|
|
MOZ_ASSERT(parent);
|
|
|
|
if (parent->ID() != data->mParentID) {
|
|
unused << parent->SendNotifyRegister(data->mData);
|
|
#ifdef DEBUG
|
|
} else {
|
|
data->mParentFound = true;
|
|
#endif
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
}
|
|
|
|
struct MOZ_STACK_CLASS SoftUpdateData final
|
|
{
|
|
SoftUpdateData(const OriginAttributes& aOriginAttributes,
|
|
const nsAString& aScope,
|
|
uint64_t aParentID)
|
|
: mOriginAttributes(aOriginAttributes)
|
|
, mScope(aScope)
|
|
, mParentID(aParentID)
|
|
#ifdef DEBUG
|
|
, mParentFound(false)
|
|
#endif
|
|
{
|
|
MOZ_COUNT_CTOR(SoftUpdateData);
|
|
}
|
|
|
|
~SoftUpdateData()
|
|
{
|
|
MOZ_COUNT_DTOR(SoftUpdateData);
|
|
}
|
|
|
|
const OriginAttributes& mOriginAttributes;
|
|
const nsString mScope;
|
|
const uint64_t mParentID;
|
|
#ifdef DEBUG
|
|
bool mParentFound;
|
|
#endif
|
|
};
|
|
|
|
PLDHashOperator
|
|
SoftUpdateEnumerator(nsPtrHashKey<ServiceWorkerManagerParent>* aKey, void* aPtr)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
auto* data = static_cast<SoftUpdateData*>(aPtr);
|
|
ServiceWorkerManagerParent* parent = aKey->GetKey();
|
|
MOZ_ASSERT(parent);
|
|
|
|
if (parent->ID() != data->mParentID) {
|
|
unused <<parent->SendNotifySoftUpdate(data->mOriginAttributes,
|
|
data->mScope);
|
|
#ifdef DEBUG
|
|
} else {
|
|
data->mParentFound = true;
|
|
#endif
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
}
|
|
|
|
struct MOZ_STACK_CLASS UnregisterData final
|
|
{
|
|
UnregisterData(const PrincipalInfo& aPrincipalInfo,
|
|
const nsAString& aScope,
|
|
uint64_t aParentID)
|
|
: mPrincipalInfo(aPrincipalInfo)
|
|
, mScope(aScope)
|
|
, mParentID(aParentID)
|
|
#ifdef DEBUG
|
|
, mParentFound(false)
|
|
#endif
|
|
{
|
|
MOZ_COUNT_CTOR(UnregisterData);
|
|
}
|
|
|
|
~UnregisterData()
|
|
{
|
|
MOZ_COUNT_DTOR(UnregisterData);
|
|
}
|
|
|
|
const PrincipalInfo mPrincipalInfo;
|
|
const nsString mScope;
|
|
const uint64_t mParentID;
|
|
#ifdef DEBUG
|
|
bool mParentFound;
|
|
#endif
|
|
};
|
|
|
|
PLDHashOperator
|
|
UnregisterEnumerator(nsPtrHashKey<ServiceWorkerManagerParent>* aKey, void* aPtr)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
auto* data = static_cast<UnregisterData*>(aPtr);
|
|
ServiceWorkerManagerParent* parent = aKey->GetKey();
|
|
MOZ_ASSERT(parent);
|
|
|
|
if (parent->ID() != data->mParentID) {
|
|
unused << parent->SendNotifyUnregister(data->mPrincipalInfo, data->mScope);
|
|
#ifdef DEBUG
|
|
} else {
|
|
data->mParentFound = true;
|
|
#endif
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
}
|
|
|
|
struct MOZ_STACK_CLASS RemoveAllData final
|
|
{
|
|
explicit RemoveAllData(uint64_t aParentID)
|
|
: mParentID(aParentID)
|
|
#ifdef DEBUG
|
|
, mParentFound(false)
|
|
#endif
|
|
{
|
|
MOZ_COUNT_CTOR(RemoveAllData);
|
|
}
|
|
|
|
~RemoveAllData()
|
|
{
|
|
MOZ_COUNT_DTOR(RemoveAllData);
|
|
}
|
|
|
|
const uint64_t mParentID;
|
|
#ifdef DEBUG
|
|
bool mParentFound;
|
|
#endif
|
|
};
|
|
|
|
PLDHashOperator
|
|
RemoveAllEnumerator(nsPtrHashKey<ServiceWorkerManagerParent>* aKey, void* aPtr)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
auto* data = static_cast<RemoveAllData*>(aPtr);
|
|
ServiceWorkerManagerParent* parent = aKey->GetKey();
|
|
MOZ_ASSERT(parent);
|
|
|
|
if (parent->ID() != data->mParentID) {
|
|
unused << parent->SendNotifyRemoveAll();
|
|
#ifdef DEBUG
|
|
} else {
|
|
data->mParentFound = true;
|
|
#endif
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
}
|
|
|
|
struct MOZ_STACK_CLASS RemoveData final
|
|
{
|
|
RemoveData(const nsACString& aHost,
|
|
uint64_t aParentID)
|
|
: mHost(aHost)
|
|
, mParentID(aParentID)
|
|
#ifdef DEBUG
|
|
, mParentFound(false)
|
|
#endif
|
|
{
|
|
MOZ_COUNT_CTOR(RemoveData);
|
|
}
|
|
|
|
~RemoveData()
|
|
{
|
|
MOZ_COUNT_DTOR(RemoveData);
|
|
}
|
|
|
|
const nsCString mHost;
|
|
const uint64_t mParentID;
|
|
#ifdef DEBUG
|
|
bool mParentFound;
|
|
#endif
|
|
};
|
|
|
|
PLDHashOperator
|
|
RemoveEnumerator(nsPtrHashKey<ServiceWorkerManagerParent>* aKey, void* aPtr)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
auto* data = static_cast<RemoveData*>(aPtr);
|
|
ServiceWorkerManagerParent* parent = aKey->GetKey();
|
|
MOZ_ASSERT(parent);
|
|
|
|
if (parent->ID() != data->mParentID) {
|
|
unused << parent->SendNotifyRemove(data->mHost);
|
|
#ifdef DEBUG
|
|
} else {
|
|
data->mParentFound = true;
|
|
#endif
|
|
}
|
|
|
|
return PL_DHASH_NEXT;
|
|
}
|
|
|
|
} // anonymous namespce
|
|
|
|
void
|
|
ServiceWorkerManagerService::PropagateRegistration(
|
|
uint64_t aParentID,
|
|
ServiceWorkerRegistrationData& aData)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
RegistrationData data(aData, aParentID);
|
|
mAgents.EnumerateEntries(RegistrationEnumerator, &data);
|
|
|
|
#ifdef DEBUG
|
|
MOZ_ASSERT(data.mParentFound);
|
|
#endif
|
|
}
|
|
|
|
void
|
|
ServiceWorkerManagerService::PropagateSoftUpdate(
|
|
uint64_t aParentID,
|
|
const OriginAttributes& aOriginAttributes,
|
|
const nsAString& aScope)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
SoftUpdateData data(aOriginAttributes, aScope, aParentID);
|
|
mAgents.EnumerateEntries(SoftUpdateEnumerator, &data);
|
|
|
|
#ifdef DEBUG
|
|
MOZ_ASSERT(data.mParentFound);
|
|
#endif
|
|
}
|
|
|
|
void
|
|
ServiceWorkerManagerService::PropagateUnregister(
|
|
uint64_t aParentID,
|
|
const PrincipalInfo& aPrincipalInfo,
|
|
const nsAString& aScope)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
nsRefPtr<dom::ServiceWorkerRegistrar> service =
|
|
dom::ServiceWorkerRegistrar::Get();
|
|
MOZ_ASSERT(service);
|
|
|
|
// It's possible that we don't have any ServiceWorkerManager managing this
|
|
// scope but we still need to unregister it from the ServiceWorkerRegistrar.
|
|
service->UnregisterServiceWorker(aPrincipalInfo,
|
|
NS_ConvertUTF16toUTF8(aScope));
|
|
|
|
UnregisterData data(aPrincipalInfo, aScope, aParentID);
|
|
mAgents.EnumerateEntries(UnregisterEnumerator, &data);
|
|
|
|
#ifdef DEBUG
|
|
MOZ_ASSERT(data.mParentFound);
|
|
#endif
|
|
}
|
|
|
|
void
|
|
ServiceWorkerManagerService::PropagateRemove(uint64_t aParentID,
|
|
const nsACString& aHost)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
RemoveData data(aHost, aParentID);
|
|
mAgents.EnumerateEntries(RemoveEnumerator, &data);
|
|
|
|
#ifdef DEBUG
|
|
MOZ_ASSERT(data.mParentFound);
|
|
#endif
|
|
}
|
|
|
|
void
|
|
ServiceWorkerManagerService::PropagateRemoveAll(uint64_t aParentID)
|
|
{
|
|
AssertIsOnBackgroundThread();
|
|
|
|
nsRefPtr<dom::ServiceWorkerRegistrar> service =
|
|
dom::ServiceWorkerRegistrar::Get();
|
|
MOZ_ASSERT(service);
|
|
|
|
service->RemoveAll();
|
|
|
|
RemoveAllData data(aParentID);
|
|
mAgents.EnumerateEntries(RemoveAllEnumerator, &data);
|
|
|
|
#ifdef DEBUG
|
|
MOZ_ASSERT(data.mParentFound);
|
|
#endif
|
|
}
|
|
|
|
} // workers namespace
|
|
} // dom namespace
|
|
} // mozilla namespace
|