Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: dde2f8447714d9b0d6a627f759b5bc201b390126
https://github.com/WebKit/WebKit/commit/dde2f8447714d9b0d6a627f759b5bc201b390126
Author: Timothy Hatcher <[email protected]>
Date: 2026-04-13 (Mon, 13 Apr 2026)
Changed paths:
M Source/JavaScriptCore/runtime/StackFrame.cpp
M Source/JavaScriptCore/runtime/StackFrame.h
M Source/WebCore/bindings/js/JSDOMExceptionHandling.cpp
M Source/WebCore/bindings/js/JSDOMGlobalObject.cpp
M Source/WebCore/bindings/js/JSDOMGlobalObject.h
M Source/WebCore/bindings/js/WebCoreJSClientData.cpp
M Source/WebCore/bindings/js/WebCoreJSClientData.h
M Source/WebCore/dom/RejectedPromiseTracker.cpp
M Source/WebCore/dom/ScriptExecutionContext.cpp
M Source/WebCore/dom/ScriptExecutionContext.h
M Source/WebCore/en.lproj/Localizable.strings
M Source/WebCore/page/FrameConsoleClient.cpp
M Source/WebCore/workers/WorkerConsoleClient.cpp
M Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js
M Source/WebKit/UIProcess/API/Cocoa/WKWebExtensionContextPrivate.h
M Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm
M Source/WebKit/UIProcess/Extensions/WebExtensionContext.cpp
M Source/WebKit/UIProcess/Extensions/WebExtensionContext.h
M Source/WebKit/UIProcess/Extensions/WebExtensionContext.messages.in
M Source/WebKit/WebProcess/Extensions/Bindings/JSWebExtensionWrapper.cpp
M Source/WebKit/WebProcess/Extensions/Cocoa/WebExtensionContextProxyCocoa.mm
M
Source/WebKit/WebProcess/Extensions/Cocoa/WebExtensionControllerProxyCocoa.mm
M Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.cpp
M Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h
M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WKWebExtensionContext.mm
Log Message:
-----------
Add uncaught script error and unhandled promise rejection reporting for Web
Extensions.
https://webkit.org/b/311758
rdar://problem/174354070
Reviewed by Yusuke Suzuki and Brian Weinstein.
Errors occurring in any extension script — background pages, service workers,
popups, full tab pages,
and content scripts in both extension and main worlds — are now forwarded to
the extension context
so the browser and test harness can observe and display them. Service worker
background scripts had
a particularly acute gap: unlike other extension contexts whose errors appear
in Web Inspector,
exceptions thrown during a service worker's startup were completely invisible.
A subtlety arises with content scripts injected into the main world, whose URLs
are masked as
webkit-masked-url://hidden/ in call stacks to prevent the page from
fingerprinting extensions. An
option was added to the existing source URL lookup to bypass this masking when
reporting errors
internally. For promise rejections, the unmasked URL must be captured eagerly
at rejection time,
since the underlying exception is not retained by the time unhandled rejections
are processed.
Exceptions thrown inside extension event listener callbacks are also now
propagated, where they were
previously silently captured by the JSC C API (JSObjectCallAsFunction) and
discarded. In addition
to being captured for the errors array, they will now also appear in Web
Inspector.
Test: Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebExtensionContext.mm
* Source/JavaScriptCore/runtime/StackFrame.cpp:
(JSC::processSourceURL):
(JSC::StackFrame::sourceURL const):
* Source/JavaScriptCore/runtime/StackFrame.h:
* Source/WebCore/bindings/js/JSDOMExceptionHandling.cpp:
(WebCore::reportException):
* Source/WebCore/bindings/js/JSDOMGlobalObject.cpp:
(WebCore::JSDOMGlobalObject::addScriptErrorCallback):
(WebCore::JSDOMGlobalObject::hasScriptErrorCallbacks const):
(WebCore::JSDOMGlobalObject::invokeScriptErrorCallbacks const):
* Source/WebCore/bindings/js/JSDOMGlobalObject.h:
* Source/WebCore/bindings/js/WebCoreJSClientData.cpp:
(WebCore::unmaskedSourceURLFromException):
* Source/WebCore/bindings/js/WebCoreJSClientData.h:
* Source/WebCore/dom/RejectedPromiseTracker.cpp:
(WebCore::UnhandledPromise::UnhandledPromise):
(WebCore::UnhandledPromise::unmaskedSourceURL const):
(WebCore::RejectedPromiseTracker::promiseRejected):
(WebCore::RejectedPromiseTracker::reportUnhandledRejections):
* Source/WebCore/dom/ScriptExecutionContext.cpp:
(WebCore::ScriptExecutionContext::reportUnhandledPromiseRejection):
* Source/WebCore/dom/ScriptExecutionContext.h:
(WebCore::ScriptExecutionContext::reportUnhandledPromiseRejection):
* Source/WebCore/en.lproj/Localizable.strings:
* Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js:
* Source/WebKit/UIProcess/API/Cocoa/WKWebExtensionContextPrivate.h:
* Source/WebKit/UIProcess/Extensions/Cocoa/WebExtensionContextCocoa.mm:
(WebKit::WebExtensionContext::didEncounterScriptError):
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.cpp:
(WebKit::WebExtensionContext::toAPIError):
(WebKit::WebExtensionContext::createError):
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.h:
* Source/WebKit/UIProcess/Extensions/WebExtensionContext.messages.in:
* Source/WebKit/WebProcess/Extensions/Bindings/JSWebExtensionWrapper.cpp:
(WebKit::callWithArguments):
* Source/WebKit/WebProcess/Extensions/Cocoa/WebExtensionContextProxyCocoa.mm:
(WebKit::WebExtensionContextProxy::didEncounterScriptError):
* Source/WebKit/WebProcess/Extensions/Cocoa/WebExtensionControllerProxyCocoa.mm:
(WebKit::WebExtensionControllerProxy::globalObjectIsAvailableForFrame):
(WebKit::WebExtensionControllerProxy::serviceWorkerGlobalObjectIsAvailableForFrame):
(WebKit::WebExtensionControllerProxy::addBindingsToWebPageFrameIfNecessary):
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.cpp:
(WebKit::WebExtensionContextProxy::isURLForThisExtension const):
* Source/WebKit/WebProcess/Extensions/WebExtensionContextProxy.h:
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WKWebExtensionContext.mm:
(TestWebKitAPI::TEST(WKWebExtensionContext, TopLevelThrowInModuleBackground)):
Added.
(TestWebKitAPI::TEST(WKWebExtensionContext, ReferenceErrorInBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
CallingMissingBrowserAPIInBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext, UncaughtScriptErrorInBackground)):
Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
UnhandledPromiseRejectionInBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
UncaughtScriptErrorInServiceWorkerBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
UnhandledPromiseRejectionInServiceWorkerBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext, SyntaxErrorInBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
NoErrorForCaughtExceptionsInBackground)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
UncaughtScriptErrorInContentScript)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
UncaughtScriptErrorInMainWorldContentScript)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
PageScriptErrorNotReportedToExtension)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext,
UncaughtScriptErrorInEventListener)): Added.
(TestWebKitAPI::TEST(WKWebExtensionContext, TopLevelThrowInPopup)): Added.
Canonical link: https://commits.webkit.org/311150@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications