Bug 1252055 P1 Make equivalent ServiceWorker DOM objects strictly equal in js. r=ehsan

This commit is contained in:
Ben Kelly
2016-03-03 19:37:57 -05:00
parent 6a9c477807
commit feefec5290
3 changed files with 30 additions and 4 deletions

View File

@@ -27,7 +27,7 @@ ServiceWorkerVisible(JSContext* aCx, JSObject* aObj);
class ServiceWorker final : public DOMEventTargetHelper class ServiceWorker final : public DOMEventTargetHelper
{ {
friend class ServiceWorkerManager; friend class ServiceWorkerInfo;
public: public:
NS_DECL_ISUPPORTS_INHERITED NS_DECL_ISUPPORTS_INHERITED
@@ -68,7 +68,7 @@ public:
ErrorResult& aRv); ErrorResult& aRv);
private: private:
// This class can only be created from the ServiceWorkerManager. // This class can only be created from ServiceWorkerInfo::GetOrCreateInstance().
ServiceWorker(nsPIDOMWindowInner* aWindow, ServiceWorkerInfo* aInfo); ServiceWorker(nsPIDOMWindowInner* aWindow, ServiceWorkerInfo* aInfo);
// This class is reference-counted and will be destroyed from Release(). // This class is reference-counted and will be destroyed from Release().

View File

@@ -3566,7 +3566,7 @@ ServiceWorkerManager::GetServiceWorkerForScope(nsPIDOMWindowInner* aWindow,
return NS_ERROR_DOM_NOT_FOUND_ERR; return NS_ERROR_DOM_NOT_FOUND_ERR;
} }
RefPtr<ServiceWorker> serviceWorker = new ServiceWorker(aWindow, info); RefPtr<ServiceWorker> serviceWorker = info->GetOrCreateInstance(aWindow);
serviceWorker->SetState(info->State()); serviceWorker->SetState(info->State());
serviceWorker.forget(aServiceWorker); serviceWorker.forget(aServiceWorker);
@@ -3793,7 +3793,7 @@ ServiceWorkerManager::GetDocumentController(nsPIDOMWindowInner* aWindow,
MOZ_ASSERT(registration->mActiveWorker); MOZ_ASSERT(registration->mActiveWorker);
RefPtr<ServiceWorker> serviceWorker = RefPtr<ServiceWorker> serviceWorker =
new ServiceWorker(aWindow, registration->mActiveWorker); registration->mActiveWorker->GetOrCreateInstance(aWindow);
serviceWorker.forget(aServiceWorker); serviceWorker.forget(aServiceWorker);
return NS_OK; return NS_OK;
@@ -5250,4 +5250,27 @@ ServiceWorkerInfo::GetNextID() const
return ++gServiceWorkerInfoCurrentID; return ++gServiceWorkerInfoCurrentID;
} }
already_AddRefed<ServiceWorker>
ServiceWorkerInfo::GetOrCreateInstance(nsPIDOMWindowInner* aWindow)
{
AssertIsOnMainThread();
MOZ_ASSERT(aWindow);
RefPtr<ServiceWorker> ref;
for (uint32_t i = 0; i < mInstances.Length(); ++i) {
MOZ_ASSERT(mInstances[i]);
if (mInstances[i]->GetOwner() == aWindow) {
ref = mInstances[i];
break;
}
}
if (!ref) {
ref = new ServiceWorker(aWindow, this);
}
return ref.forget();
}
END_WORKERS_NAMESPACE END_WORKERS_NAMESPACE

View File

@@ -305,6 +305,9 @@ public:
void void
RemoveWorker(ServiceWorker* aWorker); RemoveWorker(ServiceWorker* aWorker);
already_AddRefed<ServiceWorker>
GetOrCreateInstance(nsPIDOMWindowInner* aWindow);
}; };
#define NS_SERVICEWORKERMANAGER_IMPL_IID \ #define NS_SERVICEWORKERMANAGER_IMPL_IID \