WebKit Bugzilla
Attachment 346720 Details for
Bug 188265
: Worker should support unhandled promise rejections
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-188265-20180808033938.patch (text/plain), 7.51 KB, created by
Yusuke Suzuki
on 2018-08-07 11:39:39 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2018-08-07 11:39:39 PDT
Size:
7.51 KB
patch
obsolete
>Subversion Revision: 234658 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 7d0d3b87a99ba34bb0dd409205a5482abdf7617b..f5216182976101b2ed5df37cc02f59a2265db434 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,22 @@ >+2018-08-07 Yusuke Suzuki <yusukesuzuki@slowstart.org> >+ >+ Worker should support unhandled promise rejections >+ https://bugs.webkit.org/show_bug.cgi?id=188265 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * bindings/js/JSExecState.cpp: >+ (WebCore::JSExecState::didLeaveScriptContext): >+ * bindings/js/JSWorkerGlobalScopeBase.cpp: >+ (WebCore::JSWorkerGlobalScopeBase::promiseRejectionTracker): >+ * bindings/js/JSWorkerGlobalScopeBase.h: >+ * dom/ScriptExecutionContext.cpp: >+ (WebCore::ScriptExecutionContext::removeRejectedPromiseTracker): >+ * dom/ScriptExecutionContext.h: >+ * workers/WorkerGlobalScope.h: >+ * workers/WorkerThread.cpp: >+ (WebCore::WorkerThread::stop): >+ > 2018-08-07 Alex Christensen <achristensen@webkit.org> > > Removed unused *AllInOne.cpp >diff --git a/Source/WebCore/bindings/js/JSExecState.cpp b/Source/WebCore/bindings/js/JSExecState.cpp >index d784c84bab22bb9f681f723f340ad795eab7f08e..9b922d12d083d06a3af1b9ac0f92717be5e2dbf1 100644 >--- a/Source/WebCore/bindings/js/JSExecState.cpp >+++ b/Source/WebCore/bindings/js/JSExecState.cpp >@@ -48,7 +48,7 @@ void JSExecState::didLeaveScriptContext(JSC::ExecState* exec) > context->ensureRejectedPromiseTracker().processQueueSoon(); > } else { > ASSERT(context->isWorkerGlobalScope()); >- static_cast<WorkerGlobalScope*>(context)->microtaskQueue().performMicrotaskCheckpoint(); >+ downcast<WorkerGlobalScope>(*context).microtaskQueue().performMicrotaskCheckpoint(); > } > } > >diff --git a/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp b/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp >index f4c43531858dae4de82b39ac83c0773f190d9fa5..17a0637689ea0dc894a0e3257b610abed13841b6 100644 >--- a/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp >+++ b/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp >@@ -62,7 +62,7 @@ const GlobalObjectMethodTable JSWorkerGlobalScopeBase::s_globalObjectMethodTable > nullptr, // moduleLoaderFetch > nullptr, // moduleLoaderCreateImportMetaProperties > nullptr, // moduleLoaderEvaluate >- nullptr, // promiseRejectionTracker >+ &promiseRejectionTracker, > &defaultLanguage, > nullptr, // compileStreaming > nullptr, // instantiateStreaming >@@ -141,6 +141,33 @@ void JSWorkerGlobalScopeBase::queueTaskToEventLoop(JSGlobalObject& object, Ref<J > context.microtaskQueue().append(WTFMove(microtask)); > } > >+void JSWorkerGlobalScopeBase::promiseRejectionTracker(JSGlobalObject* jsGlobalObject, ExecState* exec, JSPromise* promise, JSPromiseRejectionOperation operation) >+{ >+ // https://html.spec.whatwg.org/multipage/webappapis.html#the-hostpromiserejectiontracker-implementation >+ >+ VM& vm = exec->vm(); >+ auto& globalObject = *JSC::jsCast<JSWorkerGlobalScopeBase*>(jsGlobalObject); >+ auto* context = globalObject.scriptExecutionContext(); >+ if (!context) >+ return; >+ >+ // InternalPromises should not be exposed to user scripts. >+ if (JSC::jsDynamicCast<JSC::JSInternalPromise*>(vm, promise)) >+ return; >+ >+ // FIXME: If script has muted errors (cross origin), terminate these steps. >+ // <https://webkit.org/b/171415> Implement the `muted-errors` property of Scripts to avoid onerror/onunhandledrejection for cross-origin scripts >+ >+ switch (operation) { >+ case JSPromiseRejectionOperation::Reject: >+ context->ensureRejectedPromiseTracker().promiseRejected(*exec, globalObject, *promise); >+ break; >+ case JSPromiseRejectionOperation::Handle: >+ context->ensureRejectedPromiseTracker().promiseHandled(*exec, globalObject, *promise); >+ break; >+ } >+} >+ > JSValue toJS(ExecState* exec, JSDOMGlobalObject*, WorkerGlobalScope& workerGlobalScope) > { > return toJS(exec, workerGlobalScope); >diff --git a/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h b/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h >index 328a19c2cbe59332648dbb6a4cab728423774299..36b616f3fd33472e786ac8deb00ba06432273101 100644 >--- a/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h >+++ b/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.h >@@ -76,6 +76,8 @@ class JSWorkerGlobalScopeBase : public JSDOMGlobalObject { > static void visitChildren(JSC::JSCell*, JSC::SlotVisitor&); > > private: >+ static void promiseRejectionTracker(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromise*, JSC::JSPromiseRejectionOperation); >+ > RefPtr<WorkerGlobalScope> m_wrapped; > JSC::WriteBarrier<JSC::JSProxy> m_proxy; > }; >diff --git a/Source/WebCore/dom/ScriptExecutionContext.cpp b/Source/WebCore/dom/ScriptExecutionContext.cpp >index d8c44d870eec25f12e68c3448aada6666db11536..ca795c991ddec0a62725019187c221284c327f49 100644 >--- a/Source/WebCore/dom/ScriptExecutionContext.cpp >+++ b/Source/WebCore/dom/ScriptExecutionContext.cpp >@@ -497,6 +497,11 @@ RejectedPromiseTracker& ScriptExecutionContext::ensureRejectedPromiseTrackerSlow > return *m_rejectedPromiseTracker.get(); > } > >+void ScriptExecutionContext::removeRejectedPromiseTracker() >+{ >+ m_rejectedPromiseTracker = nullptr; >+} >+ > void ScriptExecutionContext::setDatabaseContext(DatabaseContext* databaseContext) > { > m_databaseContext = databaseContext; >diff --git a/Source/WebCore/dom/ScriptExecutionContext.h b/Source/WebCore/dom/ScriptExecutionContext.h >index 16b6c53cb13d8ea4765d7deb26847bc6ff0d192d..3bdfcc80dbe6e6adad5877d1fee301127376d563 100644 >--- a/Source/WebCore/dom/ScriptExecutionContext.h >+++ b/Source/WebCore/dom/ScriptExecutionContext.h >@@ -283,6 +283,7 @@ class ScriptExecutionContext : public SecurityContext { > > bool hasPendingActivity() const; > void removeFromContextsMap(); >+ void removeRejectedPromiseTracker(); > > private: > // The following addMessage function is deprecated. >diff --git a/Source/WebCore/workers/WorkerGlobalScope.h b/Source/WebCore/workers/WorkerGlobalScope.h >index 68c34447702b1c32b64aaf218a2017a7c32a9114..c5db809cc507d9c01dc8906e0d6f551477f49879 100644 >--- a/Source/WebCore/workers/WorkerGlobalScope.h >+++ b/Source/WebCore/workers/WorkerGlobalScope.h >@@ -121,6 +121,8 @@ class WorkerGlobalScope : public RefCounted<WorkerGlobalScope>, public Supplemen > > void removeMicrotaskQueue(); > >+ using ScriptExecutionContext::removeRejectedPromiseTracker; >+ > void createImageBitmap(ImageBitmap::Source&&, ImageBitmapOptions&&, ImageBitmap::Promise&&); > void createImageBitmap(ImageBitmap::Source&&, int sx, int sy, int sw, int sh, ImageBitmapOptions&&, ImageBitmap::Promise&&); > >diff --git a/Source/WebCore/workers/WorkerThread.cpp b/Source/WebCore/workers/WorkerThread.cpp >index 533d11af64aa977103dc95e8aab0f27c4129f1dd..e3971911f7f694a8cfcbc343f5479f7b8a0d1ce3 100644 >--- a/Source/WebCore/workers/WorkerThread.cpp >+++ b/Source/WebCore/workers/WorkerThread.cpp >@@ -299,8 +299,9 @@ void WorkerThread::stop(WTF::Function<void()>&& stoppedCallback) > // which become dangling once Heap is destroyed. > workerGlobalScope.removeAllEventListeners(); > >- // MicrotaskQueue references Heap. >+ // MicrotaskQueue and RejectedPromiseTracker reference Heap. > workerGlobalScope.removeMicrotaskQueue(); >+ workerGlobalScope.removeRejectedPromiseTracker(); > > // Stick a shutdown command at the end of the queue, so that we deal > // with all the cleanup tasks the databases post first.
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188265
:
346718
|
346719
|
346720
|
346721
|
346970
|
346971
|
346972
|
346973
|
346975
|
346976
|
346977
|
346980
|
346982
|
346983
|
346985
|
346986
|
346992