commit e5bb7184794a52602e9ec0e5d2667ed8f912c2c5 parent 3c59123ca2574654beb52b3c06eadfae91e125e4 Author: Jan-Niklas Jaeschke <jjaschke@mozilla.com> Date: Thu, 8 Jan 2026 13:12:01 +0000 Bug 2009004 - Navigation API: Implement #dom-navigationprecommitcontroller-addhandler. r=farre,webidl,smaug,saschanaz Differential Revision: https://phabricator.services.mozilla.com/D278165 Diffstat:
5 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/dom/navigation/NavigationPrecommitController.cpp b/dom/navigation/NavigationPrecommitController.cpp @@ -25,7 +25,9 @@ NS_INTERFACE_MAP_END NavigationPrecommitController::NavigationPrecommitController( NavigateEvent* aEvent, nsIGlobalObject* aGlobalObject) - : mGlobalObject(aGlobalObject), mEvent(aEvent) {} + : mGlobalObject(aGlobalObject), mEvent(aEvent) { + MOZ_DIAGNOSTIC_ASSERT(mEvent); +} NavigationPrecommitController::~NavigationPrecommitController() {} @@ -45,7 +47,6 @@ void NavigationPrecommitController::Redirect( // The redirect(url, options) method steps are: // 1. Assert: this's event's interception state is not "none". - MOZ_DIAGNOSTIC_ASSERT(mEvent); MOZ_DIAGNOSTIC_ASSERT(mEvent->InterceptionState() != NavigateEvent::InterceptionState::None); @@ -150,4 +151,30 @@ void NavigationPrecommitController::Redirect( } } +// https://html.spec.whatwg.org/#dom-navigationprecommitcontroller-addhandler +void NavigationPrecommitController::AddHandler( + NavigationInterceptHandler& aHandler, ErrorResult& aRv) { + // 1. Assert: this's event's interception state is not "none". + MOZ_DIAGNOSTIC_ASSERT(mEvent->InterceptionState() != + NavigateEvent::InterceptionState::None); + + // 2. Perform shared checks given this's event. + mEvent->PerformSharedChecks(aRv); + if (aRv.Failed()) { + return; + } + + // 3. If this's event's interception state is not "intercepted", then throw + // an "InvalidStateError" DOMException. + if (mEvent->InterceptionState() != + NavigateEvent::InterceptionState::Intercepted) { + aRv.ThrowInvalidStateError( + "Cannot add handler after navigation has committed"); + return; + } + + // 4. Append handler to this's event's navigation handler list. + mEvent->NavigationHandlerList().AppendElement(&aHandler); +} + } // namespace mozilla::dom diff --git a/dom/navigation/NavigationPrecommitController.h b/dom/navigation/NavigationPrecommitController.h @@ -17,6 +17,7 @@ namespace mozilla::dom { struct NavigationNavigateOptions; class NavigateEvent; +class NavigationInterceptHandler; } // namespace mozilla::dom class nsIGlobalObject; @@ -42,10 +43,11 @@ class NavigationPrecommitController final : public nsISupports, JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override; - // https://html.spec.whatwg.org/#dom-navigationprecommitcontroller-redirect void Redirect(JSContext* aCx, const nsAString& aUrl, const NavigationNavigateOptions& aOptions, ErrorResult& aRv); + void AddHandler(NavigationInterceptHandler& aHandler, ErrorResult& aRv); + private: nsCOMPtr<nsIGlobalObject> mGlobalObject; diff --git a/dom/webidl/NavigationPrecommitController.webidl b/dom/webidl/NavigationPrecommitController.webidl @@ -10,6 +10,8 @@ interface NavigationPrecommitController { [Throws] undefined redirect(USVString url, optional NavigationNavigateOptions options = {}); + [Throws] + undefined addHandler(NavigationInterceptHandler handler); }; callback NavigationPrecommitHandler = Promise<undefined>(NavigationPrecommitController controller); diff --git a/testing/web-platform/meta/navigation-api/precommit-handler/precommitHandler-addHandler-throws.html.ini b/testing/web-platform/meta/navigation-api/precommit-handler/precommitHandler-addHandler-throws.html.ini @@ -1,6 +0,0 @@ -[precommitHandler-addHandler-throws.html] - [addHandler() after finish] - expected: FAIL - - [addHandler() after commit] - expected: FAIL diff --git a/testing/web-platform/meta/navigation-api/precommit-handler/precommitHandler-addHandler.html.ini b/testing/web-platform/meta/navigation-api/precommit-handler/precommitHandler-addHandler.html.ini @@ -1,7 +0,0 @@ -[precommitHandler-addHandler.html] - expected: ERROR - [handler added in addHandler() delays navigation finish] - expected: FAIL - - [handler added in addHandler() is executed in the correct order] - expected: FAIL