mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-19 08:15:31 +00:00
Backed out changeset 3ff80c877212 (bug 1113627) for asan mochitest-4 bustage on a CLOSED TREE
This commit is contained in:
parent
b32717bf29
commit
d002e5fc4b
@ -16,6 +16,6 @@ interface InstallEvent : ExtendableEvent {
|
||||
|
||||
// Should be in the spec soon to satisfy conventions about events.
|
||||
// https://github.com/slightlyoff/ServiceWorker/issues/216.
|
||||
dictionary InstallEventInit : ExtendableEventInit {
|
||||
dictionary InstallEventInit : EventInit {
|
||||
ServiceWorker? activeWorker = null;
|
||||
};
|
||||
|
@ -106,6 +106,26 @@ ServiceWorkerRegistrationInfo::~ServiceWorkerRegistrationInfo()
|
||||
}
|
||||
}
|
||||
|
||||
class QueueFireUpdateFoundRunnable MOZ_FINAL : public nsRunnable
|
||||
{
|
||||
nsRefPtr<ServiceWorkerRegistrationInfo> mRegistration;
|
||||
public:
|
||||
explicit QueueFireUpdateFoundRunnable(ServiceWorkerRegistrationInfo* aReg)
|
||||
: mRegistration(aReg)
|
||||
{
|
||||
MOZ_ASSERT(aReg);
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
Run()
|
||||
{
|
||||
nsRefPtr<ServiceWorkerManager> swm = ServiceWorkerManager::GetInstance();
|
||||
swm->FireEventOnServiceWorkerRegistrations(mRegistration,
|
||||
NS_LITERAL_STRING("updatefound"));
|
||||
return NS_OK;
|
||||
}
|
||||
};
|
||||
|
||||
//////////////////////////
|
||||
// ServiceWorkerManager //
|
||||
//////////////////////////
|
||||
@ -143,60 +163,17 @@ ServiceWorkerManager::CleanupServiceWorkerInformation(const nsACString& aDomain,
|
||||
|
||||
class ServiceWorkerRegisterJob;
|
||||
|
||||
class ContinueLifecycleTask : public nsISupports
|
||||
class FinishInstallRunnable MOZ_FINAL : public nsRunnable
|
||||
{
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
protected:
|
||||
virtual ~ContinueLifecycleTask()
|
||||
{ }
|
||||
|
||||
public:
|
||||
virtual void ContinueAfterWorkerEvent(bool aSuccess,
|
||||
bool aActivateImmediately) = 0;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS0(ContinueLifecycleTask);
|
||||
|
||||
class ContinueInstallTask MOZ_FINAL : public ContinueLifecycleTask
|
||||
{
|
||||
nsRefPtr<ServiceWorkerRegisterJob> mJob;
|
||||
|
||||
public:
|
||||
explicit ContinueInstallTask(ServiceWorkerRegisterJob* aJob)
|
||||
: mJob(aJob)
|
||||
{ }
|
||||
|
||||
void ContinueAfterWorkerEvent(bool aSuccess, bool aActivateImmediately) MOZ_OVERRIDE;
|
||||
};
|
||||
|
||||
class ContinueActivateTask MOZ_FINAL : public ContinueLifecycleTask
|
||||
{
|
||||
nsRefPtr<ServiceWorkerRegistrationInfo> mRegistration;
|
||||
|
||||
public:
|
||||
explicit ContinueActivateTask(ServiceWorkerRegistrationInfo* aReg)
|
||||
: mRegistration(aReg)
|
||||
{ }
|
||||
|
||||
void
|
||||
ContinueAfterWorkerEvent(bool aSuccess, bool aActivateImmediately /* unused */) MOZ_OVERRIDE
|
||||
{
|
||||
mRegistration->FinishActivate(aSuccess);
|
||||
}
|
||||
};
|
||||
|
||||
class ContinueLifecycleRunnable MOZ_FINAL : public nsRunnable
|
||||
{
|
||||
nsMainThreadPtrHandle<ContinueLifecycleTask> mTask;
|
||||
nsMainThreadPtrHandle<nsISupports> mJob;
|
||||
bool mSuccess;
|
||||
bool mActivateImmediately;
|
||||
|
||||
public:
|
||||
ContinueLifecycleRunnable(const nsMainThreadPtrHandle<ContinueLifecycleTask>& aTask,
|
||||
bool aSuccess,
|
||||
bool aActivateImmediately)
|
||||
: mTask(aTask)
|
||||
explicit FinishInstallRunnable(const nsMainThreadPtrHandle<nsISupports>& aJob,
|
||||
bool aSuccess,
|
||||
bool aActivateImmediately)
|
||||
: mJob(aJob)
|
||||
, mSuccess(aSuccess)
|
||||
, mActivateImmediately(aActivateImmediately)
|
||||
{
|
||||
@ -204,12 +181,7 @@ public:
|
||||
}
|
||||
|
||||
NS_IMETHOD
|
||||
Run() MOZ_OVERRIDE
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
mTask->ContinueAfterWorkerEvent(mSuccess, mActivateImmediately);
|
||||
return NS_OK;
|
||||
}
|
||||
Run() MOZ_OVERRIDE;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -218,33 +190,33 @@ public:
|
||||
* ServiceWorkers, so the parent thread -> worker thread requirement for
|
||||
* runnables is satisfied.
|
||||
*/
|
||||
class LifecycleEventWorkerRunnable MOZ_FINAL : public WorkerRunnable
|
||||
class InstallEventRunnable MOZ_FINAL : public WorkerRunnable
|
||||
{
|
||||
nsString mEventName;
|
||||
nsMainThreadPtrHandle<ContinueLifecycleTask> mTask;
|
||||
nsMainThreadPtrHandle<nsISupports> mJob;
|
||||
nsCString mScope;
|
||||
|
||||
public:
|
||||
LifecycleEventWorkerRunnable(WorkerPrivate* aWorkerPrivate,
|
||||
const nsString& aEventName,
|
||||
const nsMainThreadPtrHandle<ContinueLifecycleTask>& aTask)
|
||||
: WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount)
|
||||
, mEventName(aEventName)
|
||||
, mTask(aTask)
|
||||
InstallEventRunnable(WorkerPrivate* aWorkerPrivate,
|
||||
const nsMainThreadPtrHandle<nsISupports>& aJob,
|
||||
const nsCString& aScope)
|
||||
: WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount),
|
||||
mJob(aJob),
|
||||
mScope(aScope)
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
}
|
||||
|
||||
bool
|
||||
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) MOZ_OVERRIDE
|
||||
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
{
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
return DispatchLifecycleEvent(aCx, aWorkerPrivate);
|
||||
return DispatchInstallEvent(aCx, aWorkerPrivate);
|
||||
}
|
||||
|
||||
private:
|
||||
bool
|
||||
DispatchLifecycleEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate);
|
||||
DispatchInstallEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate);
|
||||
|
||||
};
|
||||
|
||||
@ -384,7 +356,7 @@ public:
|
||||
class ServiceWorkerRegisterJob MOZ_FINAL : public ServiceWorkerJob,
|
||||
public nsIStreamLoaderObserver
|
||||
{
|
||||
friend class ContinueInstallTask;
|
||||
friend class FinishInstallRunnable;
|
||||
|
||||
nsCString mScope;
|
||||
nsCString mScriptSpec;
|
||||
@ -558,14 +530,15 @@ public:
|
||||
|
||||
Succeed();
|
||||
|
||||
nsCOMPtr<nsIRunnable> upr =
|
||||
NS_NewRunnableMethodWithArg<ServiceWorkerRegistrationInfo*>(swm,
|
||||
&ServiceWorkerManager::FireUpdateFound,
|
||||
mRegistration);
|
||||
nsRefPtr<QueueFireUpdateFoundRunnable> upr =
|
||||
new QueueFireUpdateFoundRunnable(mRegistration);
|
||||
NS_DispatchToMainThread(upr);
|
||||
|
||||
nsMainThreadPtrHandle<ContinueLifecycleTask> handle(
|
||||
new nsMainThreadPtrHolder<ContinueLifecycleTask>(new ContinueInstallTask(this)));
|
||||
// XXXnsm this leads to double fetches right now, ideally we'll be able to
|
||||
// use the persistent cache later.
|
||||
nsRefPtr<ServiceWorkerJob> upcasted = this;
|
||||
nsMainThreadPtrHandle<nsISupports> handle(
|
||||
new nsMainThreadPtrHolder<nsISupports>(upcasted));
|
||||
|
||||
nsRefPtr<ServiceWorker> serviceWorker;
|
||||
nsresult rv =
|
||||
@ -578,8 +551,8 @@ public:
|
||||
return;
|
||||
}
|
||||
|
||||
nsRefPtr<LifecycleEventWorkerRunnable> r =
|
||||
new LifecycleEventWorkerRunnable(serviceWorker->GetWorkerPrivate(), NS_LITERAL_STRING("install"), handle);
|
||||
nsRefPtr<InstallEventRunnable> r =
|
||||
new InstallEventRunnable(serviceWorker->GetWorkerPrivate(), handle, mRegistration->mScope);
|
||||
|
||||
AutoJSAPI jsapi;
|
||||
jsapi.Init();
|
||||
@ -755,12 +728,6 @@ ContinueUpdateRunnable::Run()
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
ContinueInstallTask::ContinueAfterWorkerEvent(bool aSuccess, bool aActivateImmediately)
|
||||
{
|
||||
mJob->ContinueAfterInstallEvent(aSuccess, aActivateImmediately);
|
||||
}
|
||||
|
||||
// If we return an error code here, the ServiceWorkerContainer will
|
||||
// automatically reject the Promise.
|
||||
NS_IMETHODIMP
|
||||
@ -909,23 +876,33 @@ ServiceWorkerManager::Register(nsIDOMWindow* aWindow,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used to handle ExtendableEvent::waitUntil() and proceed with
|
||||
* installation/activation.
|
||||
*/
|
||||
class LifecycleEventPromiseHandler MOZ_FINAL : public PromiseNativeHandler
|
||||
NS_IMETHODIMP
|
||||
FinishInstallRunnable::Run()
|
||||
{
|
||||
nsMainThreadPtrHandle<ContinueLifecycleTask> mTask;
|
||||
AssertIsOnMainThread();
|
||||
nsRefPtr<ServiceWorkerJob> job = static_cast<ServiceWorkerJob*>(mJob.get());
|
||||
nsRefPtr<ServiceWorkerRegisterJob> upjob = static_cast<ServiceWorkerRegisterJob*>(job.get());
|
||||
MOZ_ASSERT(upjob);
|
||||
upjob->ContinueAfterInstallEvent(mSuccess, mActivateImmediately);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Used to handle InstallEvent::waitUntil() and proceed with installation.
|
||||
*/
|
||||
class FinishInstallHandler MOZ_FINAL : public PromiseNativeHandler
|
||||
{
|
||||
nsMainThreadPtrHandle<nsISupports> mJob;
|
||||
bool mActivateImmediately;
|
||||
|
||||
virtual
|
||||
~LifecycleEventPromiseHandler()
|
||||
~FinishInstallHandler()
|
||||
{ }
|
||||
|
||||
public:
|
||||
LifecycleEventPromiseHandler(const nsMainThreadPtrHandle<ContinueLifecycleTask>& aTask,
|
||||
bool aActivateImmediately)
|
||||
: mTask(aTask)
|
||||
FinishInstallHandler(const nsMainThreadPtrHandle<nsISupports>& aJob,
|
||||
bool aActivateImmediately)
|
||||
: mJob(aJob)
|
||||
, mActivateImmediately(aActivateImmediately)
|
||||
{
|
||||
MOZ_ASSERT(!NS_IsMainThread());
|
||||
@ -938,47 +915,33 @@ public:
|
||||
MOZ_ASSERT(workerPrivate);
|
||||
workerPrivate->AssertIsOnWorkerThread();
|
||||
|
||||
nsRefPtr<ContinueLifecycleRunnable> r =
|
||||
new ContinueLifecycleRunnable(mTask, true /* success */, mActivateImmediately);
|
||||
nsRefPtr<FinishInstallRunnable> r = new FinishInstallRunnable(mJob, true, mActivateImmediately);
|
||||
NS_DispatchToMainThread(r);
|
||||
}
|
||||
|
||||
void
|
||||
RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) MOZ_OVERRIDE
|
||||
{
|
||||
WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
|
||||
MOZ_ASSERT(workerPrivate);
|
||||
workerPrivate->AssertIsOnWorkerThread();
|
||||
|
||||
nsRefPtr<ContinueLifecycleRunnable> r =
|
||||
new ContinueLifecycleRunnable(mTask, false /* success */, mActivateImmediately);
|
||||
nsRefPtr<FinishInstallRunnable> r = new FinishInstallRunnable(mJob, false, mActivateImmediately);
|
||||
NS_DispatchToMainThread(r);
|
||||
}
|
||||
};
|
||||
|
||||
bool
|
||||
LifecycleEventWorkerRunnable::DispatchLifecycleEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
InstallEventRunnable::DispatchInstallEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
{
|
||||
aWorkerPrivate->AssertIsOnWorkerThread();
|
||||
MOZ_ASSERT(aWorkerPrivate->IsServiceWorker());
|
||||
InstallEventInit init;
|
||||
init.mBubbles = false;
|
||||
init.mCancelable = true;
|
||||
|
||||
nsRefPtr<ExtendableEvent> event;
|
||||
// FIXME(nsm): Bug 982787 pass previous active worker.
|
||||
|
||||
// FIXME(nsm): Set error handler so we can grab handler errors.
|
||||
nsRefPtr<EventTarget> target = aWorkerPrivate->GlobalScope();
|
||||
|
||||
if (mEventName.EqualsASCII("install")) {
|
||||
// FIXME(nsm): Bug 982787 pass previous active worker.
|
||||
InstallEventInit init;
|
||||
init.mBubbles = false;
|
||||
init.mCancelable = true;
|
||||
event = InstallEvent::Constructor(target, mEventName, init);
|
||||
} else if (mEventName.EqualsASCII("activate")) {
|
||||
ExtendableEventInit init;
|
||||
init.mBubbles = false;
|
||||
init.mCancelable = true;
|
||||
event = ExtendableEvent::Constructor(target, mEventName, init);
|
||||
} else {
|
||||
MOZ_CRASH("Unexpected lifecycle event");
|
||||
}
|
||||
nsRefPtr<InstallEvent> event =
|
||||
InstallEvent::Constructor(target, NS_LITERAL_STRING("install"), init);
|
||||
|
||||
event->SetTrusted(true);
|
||||
|
||||
@ -1012,21 +975,135 @@ LifecycleEventWorkerRunnable::DispatchLifecycleEvent(JSContext* aCx, WorkerPriva
|
||||
return false;
|
||||
}
|
||||
|
||||
// activateimmediately is only relevant to "install" event.
|
||||
bool activateImmediately = false;
|
||||
InstallEvent* downCast = static_cast<InstallEvent*>(event.get());
|
||||
if (downCast) {
|
||||
activateImmediately = downCast->ActivateImmediately();
|
||||
// FIXME(nsm): Set activeWorker to the correct thing.
|
||||
// FIXME(nsm): Install error handler for any listener errors.
|
||||
}
|
||||
|
||||
nsRefPtr<LifecycleEventPromiseHandler> handler =
|
||||
new LifecycleEventPromiseHandler(mTask, activateImmediately);
|
||||
nsRefPtr<FinishInstallHandler> handler =
|
||||
new FinishInstallHandler(mJob, event->ActivateImmediately());
|
||||
waitUntilPromise->AppendNativeHandler(handler);
|
||||
return true;
|
||||
}
|
||||
|
||||
class FinishActivationRunnable MOZ_FINAL : public nsRunnable
|
||||
{
|
||||
bool mSuccess;
|
||||
nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> mRegistration;
|
||||
|
||||
public:
|
||||
FinishActivationRunnable(bool aSuccess,
|
||||
const nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo>& aRegistration)
|
||||
: mSuccess(aSuccess)
|
||||
, mRegistration(aRegistration)
|
||||
{
|
||||
MOZ_ASSERT(!NS_IsMainThread());
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
Run()
|
||||
{
|
||||
AssertIsOnMainThread();
|
||||
|
||||
mRegistration->FinishActivate(mSuccess);
|
||||
return NS_OK;
|
||||
}
|
||||
};
|
||||
|
||||
class FinishActivateHandler MOZ_FINAL : public PromiseNativeHandler
|
||||
{
|
||||
nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> mRegistration;
|
||||
|
||||
public:
|
||||
explicit FinishActivateHandler(const nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo>& aRegistration)
|
||||
: mRegistration(aRegistration)
|
||||
{
|
||||
MOZ_ASSERT(!NS_IsMainThread());
|
||||
}
|
||||
|
||||
virtual
|
||||
~FinishActivateHandler()
|
||||
{ }
|
||||
|
||||
void
|
||||
ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) MOZ_OVERRIDE
|
||||
{
|
||||
nsRefPtr<FinishActivationRunnable> r = new FinishActivationRunnable(true /* success */, mRegistration);
|
||||
NS_DispatchToMainThread(r);
|
||||
}
|
||||
|
||||
void
|
||||
RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) MOZ_OVERRIDE
|
||||
{
|
||||
nsRefPtr<FinishActivationRunnable> r = new FinishActivationRunnable(false /* success */, mRegistration);
|
||||
NS_DispatchToMainThread(r);
|
||||
}
|
||||
};
|
||||
|
||||
class ActivateEventRunnable : public WorkerRunnable
|
||||
{
|
||||
nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> mRegistration;
|
||||
|
||||
public:
|
||||
ActivateEventRunnable(WorkerPrivate* aWorkerPrivate,
|
||||
const nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo>& aRegistration)
|
||||
: WorkerRunnable(aWorkerPrivate, WorkerThreadModifyBusyCount),
|
||||
mRegistration(aRegistration)
|
||||
{
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
}
|
||||
|
||||
bool
|
||||
WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
{
|
||||
MOZ_ASSERT(aWorkerPrivate);
|
||||
return DispatchActivateEvent(aCx, aWorkerPrivate);
|
||||
}
|
||||
|
||||
private:
|
||||
bool
|
||||
DispatchActivateEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
|
||||
{
|
||||
MOZ_ASSERT(aWorkerPrivate->IsServiceWorker());
|
||||
nsRefPtr<EventTarget> target = do_QueryObject(aWorkerPrivate->GlobalScope());
|
||||
|
||||
// FIXME(nsm): Set activeWorker to the correct thing.
|
||||
EventInit init;
|
||||
init.mBubbles = false;
|
||||
init.mCancelable = true;
|
||||
nsRefPtr<ExtendableEvent> event =
|
||||
ExtendableEvent::Constructor(target, NS_LITERAL_STRING("activate"), init);
|
||||
|
||||
event->SetTrusted(true);
|
||||
|
||||
nsRefPtr<Promise> waitUntilPromise;
|
||||
|
||||
// FIXME(nsm): Install error handler for any listener errors.
|
||||
ErrorResult result;
|
||||
result = target->DispatchDOMEvent(nullptr, event, nullptr, nullptr);
|
||||
WidgetEvent* internalEvent = event->GetInternalNSEvent();
|
||||
if (!result.Failed() && !internalEvent->mFlags.mExceptionHasBeenRisen) {
|
||||
waitUntilPromise = event->GetPromise();
|
||||
if (!waitUntilPromise) {
|
||||
nsCOMPtr<nsIGlobalObject> global =
|
||||
do_QueryObject(aWorkerPrivate->GlobalScope());
|
||||
waitUntilPromise =
|
||||
Promise::Resolve(global,
|
||||
aCx, JS::UndefinedHandleValue, result);
|
||||
}
|
||||
} else {
|
||||
nsCOMPtr<nsIGlobalObject> global =
|
||||
do_QueryObject(aWorkerPrivate->GlobalScope());
|
||||
// Continue with a canceled install.
|
||||
waitUntilPromise = Promise::Reject(global, aCx,
|
||||
JS::UndefinedHandleValue, result);
|
||||
}
|
||||
|
||||
if (result.Failed()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsRefPtr<FinishActivateHandler> handler = new FinishActivateHandler(mRegistration);
|
||||
waitUntilPromise->AppendNativeHandler(handler);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
ServiceWorkerRegistrationInfo::TryToActivate()
|
||||
{
|
||||
@ -1084,11 +1161,11 @@ ServiceWorkerRegistrationInfo::Activate()
|
||||
return;
|
||||
}
|
||||
|
||||
nsMainThreadPtrHandle<ContinueLifecycleTask> handle(
|
||||
new nsMainThreadPtrHolder<ContinueLifecycleTask>(new ContinueActivateTask(this)));
|
||||
nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> handle(
|
||||
new nsMainThreadPtrHolder<ServiceWorkerRegistrationInfo>(this));
|
||||
|
||||
nsRefPtr<LifecycleEventWorkerRunnable> r =
|
||||
new LifecycleEventWorkerRunnable(serviceWorker->GetWorkerPrivate(), NS_LITERAL_STRING("activate"), handle);
|
||||
nsRefPtr<ActivateEventRunnable> r =
|
||||
new ActivateEventRunnable(serviceWorker->GetWorkerPrivate(), handle);
|
||||
|
||||
AutoJSAPI jsapi;
|
||||
jsapi.Init();
|
||||
|
@ -462,13 +462,6 @@ private:
|
||||
FireEventOnServiceWorkerRegistrations(ServiceWorkerRegistrationInfo* aRegistration,
|
||||
const nsAString& aName);
|
||||
|
||||
void
|
||||
FireUpdateFound(ServiceWorkerRegistrationInfo* aRegistration)
|
||||
{
|
||||
FireEventOnServiceWorkerRegistrations(aRegistration,
|
||||
NS_LITERAL_STRING("updatefound"));
|
||||
}
|
||||
|
||||
void
|
||||
FireControllerChange(ServiceWorkerRegistrationInfo* aRegistration);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user