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

Reply via email to