Bug 1218621 - Keep the service worker alive while the promise passed to FetchEvent.respondWith() settles; r=catalinb

This commit is contained in:
Ehsan Akhgari 2015-10-26 22:51:30 -04:00
parent 889f2d5617
commit 6dc5dafa7c
3 changed files with 9 additions and 25 deletions

View File

@ -59,9 +59,9 @@ CancelChannelRunnable::Run()
} }
FetchEvent::FetchEvent(EventTarget* aOwner) FetchEvent::FetchEvent(EventTarget* aOwner)
: ExtendableEvent(aOwner) : ExtendableEvent(aOwner)
, mIsReload(false) , mIsReload(false)
, mWaitToRespond(false) , mWaitToRespond(false)
{ {
} }
@ -436,15 +436,6 @@ FetchEvent::RespondWith(Promise& aArg, ErrorResult& aRv)
return; return;
} }
// 4.5.3.2 If the respond-with entered flag is set, then:
// Throw an "InvalidStateError" exception.
// Here we use |mPromise != nullptr| as respond-with enter flag
if (mPromise) {
aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
return;
}
mPromise = &aArg;
RefPtr<InternalRequest> ir = mRequest->GetInternalRequest(); RefPtr<InternalRequest> ir = mRequest->GetInternalRequest();
StopImmediatePropagation(); StopImmediatePropagation();
mWaitToRespond = true; mWaitToRespond = true;
@ -452,6 +443,8 @@ FetchEvent::RespondWith(Promise& aArg, ErrorResult& aRv)
new RespondWithHandler(mChannel, mRequest->Mode(), ir->IsClientRequest(), new RespondWithHandler(mChannel, mRequest->Mode(), ir->IsClientRequest(),
ir->IsNavigationRequest(), mScriptSpec); ir->IsNavigationRequest(), mScriptSpec);
aArg.AppendNativeHandler(handler); aArg.AppendNativeHandler(handler);
WaitUntil(aArg, aRv);
} }
NS_IMPL_ADDREF_INHERITED(FetchEvent, ExtendableEvent) NS_IMPL_ADDREF_INHERITED(FetchEvent, ExtendableEvent)
@ -460,8 +453,7 @@ NS_IMPL_RELEASE_INHERITED(FetchEvent, ExtendableEvent)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FetchEvent) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(FetchEvent)
NS_INTERFACE_MAP_END_INHERITING(ExtendableEvent) NS_INTERFACE_MAP_END_INHERITING(ExtendableEvent)
NS_IMPL_CYCLE_COLLECTION_INHERITED(FetchEvent, ExtendableEvent, NS_IMPL_CYCLE_COLLECTION_INHERITED(FetchEvent, ExtendableEvent, mRequest)
mRequest, mPromise)
ExtendableEvent::ExtendableEvent(EventTarget* aOwner) ExtendableEvent::ExtendableEvent(EventTarget* aOwner)
: Event(aOwner, nullptr, nullptr) : Event(aOwner, nullptr, nullptr)

View File

@ -103,7 +103,6 @@ class FetchEvent final : public ExtendableEvent
nsMainThreadPtrHandle<nsIInterceptedChannel> mChannel; nsMainThreadPtrHandle<nsIInterceptedChannel> mChannel;
RefPtr<Request> mRequest; RefPtr<Request> mRequest;
nsCString mScriptSpec; nsCString mScriptSpec;
RefPtr<Promise> mPromise;
bool mIsReload; bool mIsReload;
bool mWaitToRespond; bool mWaitToRespond;
protected: protected:
@ -150,13 +149,6 @@ public:
void void
RespondWith(Promise& aArg, ErrorResult& aRv); RespondWith(Promise& aArg, ErrorResult& aRv);
already_AddRefed<Promise>
GetPromise() const
{
RefPtr<Promise> p = mPromise;
return p.forget();
}
already_AddRefed<Promise> already_AddRefed<Promise>
ForwardTo(const nsAString& aUrl); ForwardTo(const nsAString& aUrl);

View File

@ -1175,11 +1175,11 @@ private:
MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_DispatchToMainThread(runnable))); MOZ_ALWAYS_TRUE(NS_SUCCEEDED(NS_DispatchToMainThread(runnable)));
} }
RefPtr<Promise> respondWithPromise = event->GetPromise(); RefPtr<Promise> waitUntilPromise = event->GetPromise();
if (respondWithPromise) { if (waitUntilPromise) {
RefPtr<KeepAliveHandler> keepAliveHandler = RefPtr<KeepAliveHandler> keepAliveHandler =
new KeepAliveHandler(mKeepAliveToken); new KeepAliveHandler(mKeepAliveToken);
respondWithPromise->AppendNativeHandler(keepAliveHandler); waitUntilPromise->AppendNativeHandler(keepAliveHandler);
} }
// 9.8.22 If request is a non-subresource request, then: Invoke Soft Update algorithm // 9.8.22 If request is a non-subresource request, then: Invoke Soft Update algorithm