WebKit Bugzilla
Attachment 346970 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-20180812075515.patch (text/plain), 11.51 KB, created by
Yusuke Suzuki
on 2018-08-11 15:55:16 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Yusuke Suzuki
Created:
2018-08-11 15:55:16 PDT
Size:
11.51 KB
patch
obsolete
>Subversion Revision: 234784 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index c84face86d46095db49c31caab506b23caf014fa..aa83d1cdd490bdbb8d32c3d4c880bcdcfdefe6ea 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,26 @@ >+2018-08-11 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/JSDOMGlobalObject.cpp: >+ (WebCore::JSDOMGlobalObject::promiseRejectionTracker): >+ * bindings/js/JSDOMGlobalObject.h: >+ * bindings/js/JSDOMWindowBase.cpp: >+ (WebCore::JSDOMWindowBase::promiseRejectionTracker): Deleted. >+ * bindings/js/JSDOMWindowBase.h: >+ * bindings/js/JSExecState.cpp: >+ (WebCore::JSExecState::didLeaveScriptContext): >+ * bindings/js/JSWorkerGlobalScopeBase.cpp: >+ * dom/ScriptExecutionContext.cpp: >+ (WebCore::ScriptExecutionContext::removeRejectedPromiseTracker): >+ * dom/ScriptExecutionContext.h: >+ * workers/WorkerGlobalScope.h: >+ * workers/WorkerThread.cpp: >+ (WebCore::WorkerThread::stop): >+ > 2018-08-10 Antti Koivisto <antti@apple.com> > > Use OptionSet for various RenderLayer flags >diff --git a/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp b/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp >index 720361ea62b9d7c4cc7bc919590e87b9fbaac2f0..c157dbb71dffbb8c57465a39522ee6508e44ae77 100644 >--- a/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp >+++ b/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp >@@ -40,12 +40,15 @@ > #include "JSReadableStreamPrivateConstructors.h" > #include "JSRemoteDOMWindow.h" > #include "JSWorkerGlobalScope.h" >+#include "RejectedPromiseTracker.h" > #include "RuntimeEnabledFeatures.h" > #include "StructuredClone.h" > #include "WebCoreJSClientData.h" > #include "WorkerGlobalScope.h" > #include <JavaScriptCore/BuiltinNames.h> > #include <JavaScriptCore/CodeBlock.h> >+#include <JavaScriptCore/JSInternalPromise.h> >+#include <JavaScriptCore/JSInternalPromiseDeferred.h> > > namespace WebCore { > using namespace JSC; >@@ -239,6 +242,33 @@ Event* JSDOMGlobalObject::currentEvent() const > return m_currentEvent; > } > >+void JSDOMGlobalObject::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<JSDOMGlobalObject*>(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; >+ } >+} >+ > JSDOMGlobalObject& callerGlobalObject(ExecState& state) > { > class GetCallerGlobalObjectFunctor { >diff --git a/Source/WebCore/bindings/js/JSDOMGlobalObject.h b/Source/WebCore/bindings/js/JSDOMGlobalObject.h >index 93dc5a0fa4c98f4a785807106ee98818245c6509..9b4164436d5623095c8a495a7f09fafdcac2722e 100644 >--- a/Source/WebCore/bindings/js/JSDOMGlobalObject.h >+++ b/Source/WebCore/bindings/js/JSDOMGlobalObject.h >@@ -91,6 +91,8 @@ class WEBCORE_EXPORT JSDOMGlobalObject : public JSC::JSGlobalObject { > } > > protected: >+ static void promiseRejectionTracker(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromise*, JSC::JSPromiseRejectionOperation); >+ > JSDOMStructureMap m_structures; > JSDOMConstructorMap m_constructors; > DOMGuardedObjectSet m_guardedObjects; >diff --git a/Source/WebCore/bindings/js/JSDOMWindowBase.cpp b/Source/WebCore/bindings/js/JSDOMWindowBase.cpp >index 22228224e5818c7cc78f39ad6a94e143488b886f..6764fc2bb57e22718467020538da8bbce2b1d04a 100644 >--- a/Source/WebCore/bindings/js/JSDOMWindowBase.cpp >+++ b/Source/WebCore/bindings/js/JSDOMWindowBase.cpp >@@ -465,31 +465,4 @@ void JSDOMWindowBase::instantiateStreaming(JSC::JSGlobalObject* globalObject, JS > } > #endif > >-void JSDOMWindowBase::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<JSDOMWindowBase*>(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; >- } >-} >- > } // namespace WebCore >diff --git a/Source/WebCore/bindings/js/JSDOMWindowBase.h b/Source/WebCore/bindings/js/JSDOMWindowBase.h >index a88aa62ef1155bab9a3c7720a8fe224e52318c61..84f2852208ef1ba97fc091b7085a469242acec7a 100644 >--- a/Source/WebCore/bindings/js/JSDOMWindowBase.h >+++ b/Source/WebCore/bindings/js/JSDOMWindowBase.h >@@ -102,8 +102,6 @@ class WEBCORE_EXPORT JSDOMWindowBase : public JSDOMGlobalObject { > static void instantiateStreaming(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromiseDeferred*, JSC::JSValue, JSC::JSObject*); > #endif > >- static void promiseRejectionTracker(JSC::JSGlobalObject*, JSC::ExecState*, JSC::JSPromise*, JSC::JSPromiseRejectionOperation); >- > RefPtr<DOMWindow> m_wrapped; > JSWindowProxy* m_proxy; > }; >diff --git a/Source/WebCore/bindings/js/JSExecState.cpp b/Source/WebCore/bindings/js/JSExecState.cpp >index d784c84bab22bb9f681f723f340ad795eab7f08e..aa1ebe7df159bcc659227f8db6cc69d83199a984 100644 >--- a/Source/WebCore/bindings/js/JSExecState.cpp >+++ b/Source/WebCore/bindings/js/JSExecState.cpp >@@ -41,15 +41,13 @@ void JSExecState::didLeaveScriptContext(JSC::ExecState* exec) > // While main thread MicrotaskQueue is persistently held, worker's MicrotaskQueue is held by > // WorkerGlobalScope. > ScriptExecutionContext* context = scriptExecutionContextFromExecState(exec); >- if (isMainThread()) { >+ if (isMainThread()) > MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint(); >- // FIXME: Promise rejection tracker is available only in non-worker environment. >- // https://bugs.webkit.org/show_bug.cgi?id=188265 >- context->ensureRejectedPromiseTracker().processQueueSoon(); >- } else { >+ else { > ASSERT(context->isWorkerGlobalScope()); >- static_cast<WorkerGlobalScope*>(context)->microtaskQueue().performMicrotaskCheckpoint(); >+ downcast<WorkerGlobalScope>(*context).microtaskQueue().performMicrotaskCheckpoint(); > } >+ context->ensureRejectedPromiseTracker().processQueueSoon(); > } > > JSC::JSValue functionCallHandlerFromAnyThread(JSC::ExecState* exec, JSC::JSValue functionObject, JSC::CallType callType, const JSC::CallData& callData, JSC::JSValue thisValue, const JSC::ArgList& args, NakedPtr<JSC::Exception>& returnedException) >diff --git a/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp b/Source/WebCore/bindings/js/JSWorkerGlobalScopeBase.cpp >index f4c43531858dae4de82b39ac83c0773f190d9fa5..50ff12a9d22a976ba8a2fb9485d2f10548c9780c 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 >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