Title: [292779] trunk/Source/WebCore
- Revision
- 292779
- Author
- [email protected]
- Date
- 2022-04-12 11:08:56 -0700 (Tue, 12 Apr 2022)
Log Message
RejectedPromiseTracker can be recreated if we are in a worker / worklet whose execution is terminating
https://bugs.webkit.org/show_bug.cgi?id=239130
Reviewed by Chris Dumez.
We update ScriptExecutionContext::ensureRejectedPromiseTrackerSlow so that we wont
recreate the promise tracker if we are in a worker / worklet whose execution is terminating.
* bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::promiseRejectionTracker):
* bindings/js/JSExecState.cpp:
(WebCore::JSExecState::didLeaveScriptContext):
* dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::ensureRejectedPromiseTrackerSlow):
* dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::ensureRejectedPromiseTracker):
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (292778 => 292779)
--- trunk/Source/WebCore/ChangeLog 2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/ChangeLog 2022-04-12 18:08:56 UTC (rev 292779)
@@ -1,3 +1,22 @@
+2022-04-12 Gabriel Nava Marino <[email protected]>
+
+ RejectedPromiseTracker can be recreated if we are in a worker / worklet whose execution is terminating
+ https://bugs.webkit.org/show_bug.cgi?id=239130
+
+ Reviewed by Chris Dumez.
+
+ We update ScriptExecutionContext::ensureRejectedPromiseTrackerSlow so that we wont
+ recreate the promise tracker if we are in a worker / worklet whose execution is terminating.
+
+ * bindings/js/JSDOMGlobalObject.cpp:
+ (WebCore::JSDOMGlobalObject::promiseRejectionTracker):
+ * bindings/js/JSExecState.cpp:
+ (WebCore::JSExecState::didLeaveScriptContext):
+ * dom/ScriptExecutionContext.cpp:
+ (WebCore::ScriptExecutionContext::ensureRejectedPromiseTrackerSlow):
+ * dom/ScriptExecutionContext.h:
+ (WebCore::ScriptExecutionContext::ensureRejectedPromiseTracker):
+
2022-04-12 Tyler Wilcock <[email protected]>
AX: Incorrect role on dynamic lists
Modified: trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (292778 => 292779)
--- trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp 2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp 2022-04-12 18:08:56 UTC (rev 292779)
@@ -318,15 +318,19 @@
if (!context)
return;
+ auto rejectedPromiseTracker = context->ensureRejectedPromiseTracker();
+ if (!rejectedPromiseTracker)
+ 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(globalObject, *promise);
+ rejectedPromiseTracker->promiseRejected(globalObject, *promise);
break;
case JSPromiseRejectionOperation::Handle:
- context->ensureRejectedPromiseTracker().promiseHandled(globalObject, *promise);
+ rejectedPromiseTracker->promiseHandled(globalObject, *promise);
break;
}
}
Modified: trunk/Source/WebCore/bindings/js/JSExecState.cpp (292778 => 292779)
--- trunk/Source/WebCore/bindings/js/JSExecState.cpp 2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/bindings/js/JSExecState.cpp 2022-04-12 18:08:56 UTC (rev 292779)
@@ -39,7 +39,8 @@
if (!context)
return;
context->eventLoop().performMicrotaskCheckpoint();
- context->ensureRejectedPromiseTracker().processQueueSoon();
+ if (auto rejectedPromiseTracker = context->ensureRejectedPromiseTracker())
+ rejectedPromiseTracker->processQueueSoon();
}
JSC::JSValue functionCallHandlerFromAnyThread(JSC::JSGlobalObject* lexicalGlobalObject, JSC::JSValue functionObject, const JSC::CallData& callData, JSC::JSValue thisValue, const JSC::ArgList& args, NakedPtr<JSC::Exception>& returnedException)
Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.cpp (292778 => 292779)
--- trunk/Source/WebCore/dom/ScriptExecutionContext.cpp 2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.cpp 2022-04-12 18:08:56 UTC (rev 292779)
@@ -528,14 +528,20 @@
return DOMTimer::defaultAlignmentInterval();
}
-RejectedPromiseTracker& ScriptExecutionContext::ensureRejectedPromiseTrackerSlow()
+RejectedPromiseTracker* ScriptExecutionContext::ensureRejectedPromiseTrackerSlow()
{
// ScriptExecutionContext::vm() in Worker is only available after WorkerGlobalScope initialization is done.
// When initializing ScriptExecutionContext, vm() is not ready.
ASSERT(!m_rejectedPromiseTracker);
+ if (is<WorkerOrWorkletGlobalScope>(*this)) {
+ auto* scriptController = downcast<WorkerOrWorkletGlobalScope>(*this).script();
+ // Do not re-create the promise tracker if we are in a worker / worklet whose execution is terminating.
+ if (!scriptController || scriptController->isTerminatingExecution())
+ return nullptr;
+ }
m_rejectedPromiseTracker = makeUnique<RejectedPromiseTracker>(*this, vm());
- return *m_rejectedPromiseTracker.get();
+ return m_rejectedPromiseTracker.get();
}
void ScriptExecutionContext::removeRejectedPromiseTracker()
Modified: trunk/Source/WebCore/dom/ScriptExecutionContext.h (292778 => 292779)
--- trunk/Source/WebCore/dom/ScriptExecutionContext.h 2022-04-12 17:54:56 UTC (rev 292778)
+++ trunk/Source/WebCore/dom/ScriptExecutionContext.h 2022-04-12 18:08:56 UTC (rev 292779)
@@ -266,10 +266,10 @@
int timerNestingLevel() const { return m_timerNestingLevel; }
void setTimerNestingLevel(int timerNestingLevel) { m_timerNestingLevel = timerNestingLevel; }
- RejectedPromiseTracker& ensureRejectedPromiseTracker()
+ RejectedPromiseTracker* ensureRejectedPromiseTracker()
{
if (m_rejectedPromiseTracker)
- return *m_rejectedPromiseTracker.get();
+ return m_rejectedPromiseTracker.get();
return ensureRejectedPromiseTrackerSlow();
}
@@ -352,7 +352,7 @@
enum class ShouldContinue { No, Yes };
void forEachActiveDOMObject(const Function<ShouldContinue(ActiveDOMObject&)>&) const;
- RejectedPromiseTracker& ensureRejectedPromiseTrackerSlow();
+ RejectedPromiseTracker* ensureRejectedPromiseTrackerSlow();
void checkConsistency() const;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes