Skip to content

Commit

Permalink
[Navigation] Track in-progress navigations
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=272459

Reviewed by Alex Christensen.

This makes use of the NavigationAPITracker to correctly complete
the Navigation::Result when events happen.

* LayoutTests/TestExpectations:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/commit-behavior/after-transition-uncancelable-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigate-from-initial-about-blank-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-history-back-noop-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-navigation-back-same-document-in-iframe-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/same-url-replace-cross-document-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigate-event/same-url-replace-same-document-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-base-url-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-from-initial-about-blank-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-from-initial-about-blank-gc-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-from-initial-about-blank-src-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-replace-same-document-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-already-detached-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-detach-in-serialization-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/traverseTo-already-detached-expected.txt:

* Source/WebCore/bindings/js/JSDOMPromiseDeferred.h:
(WebCore::callPromisePairFunction):

The JSPromise needs to not be cleared because we
create a DOMPromise with it later.

* Source/WebCore/page/Navigation.cpp:
(WebCore::Navigation::createDOMPromise):
(WebCore::Navigation::createErrorResult):
(WebCore::Navigation::maybeSetUpcomingNonTraversalTracker):
(WebCore::Navigation::addUpcomingTrarveseAPIMethodTracker):
(WebCore::Navigation::apiMethodTrackerDerivedResult):
(WebCore::Navigation::reload):
(WebCore::Navigation::navigate):
(WebCore::Navigation::performTraversal):
(WebCore::Navigation::traverseTo):
(WebCore::Navigation::back):
(WebCore::Navigation::forward):
(WebCore::Navigation::updateCurrentEntry):
(WebCore::Navigation::hasEntriesAndEventsDisabled const):
(WebCore::Navigation::resolveFinishedPromise):
(WebCore::notifyCommittedToEntry):
(WebCore::Navigation::updateForNavigation):
(WebCore::Navigation::promoteUpcomingAPIMethodTracker):
(WebCore::Navigation::cleanupAPIMethodTracker):
(WebCore::Navigation::innerDispatchNavigateEvent):
(WebCore::createErrorResult): Deleted.
* Source/WebCore/page/Navigation.h:
(WebCore::NavigationAPIMethodTracker::NavigationAPIMethodTracker):

Canonical link: https://commits.webkit.org/277688@main
  • Loading branch information
TingPing committed Apr 18, 2024
1 parent 09b92fa commit a09b94a
Show file tree
Hide file tree
Showing 18 changed files with 222 additions and 139 deletions.
61 changes: 34 additions & 27 deletions LayoutTests/TestExpectations
Expand Up @@ -6854,64 +6854,71 @@ imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-e

# Navigation API is not yet fully implemented
webkit.org/b/258384 imported/w3c/web-platform-tests/navigation-api [ Skip ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/ [ Pass ]
imported/w3c/web-platform-tests/navigation-api/commit-behavior/after-transition-uncancelable.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/ [ Pass ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/history-back-same-doc.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigate-from-initial-about-blank.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-back-forward-same-doc.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-navigate-preventDefault.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-navigate-replace-same-doc.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/commit-behavior/after-transition-uncancelable.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-sameorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/intercept-after-dispatch.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/intercept-canceled-event.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-destination-getState-back-forward.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-history-back-noop.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-navigation-back-same-document-in-iframe.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-navigate-same-doc.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-svg-anchor-fragment.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-to-javascript.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigatesuccess-cross-document.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/replaceState-in-unload-then-remove-iframe.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/same-url-replace-cross-document.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/same-url-replace-same-document.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/location-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/open-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/submit-crossdocument-crossorigin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/entries-across-origins.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/entries-after-blank-navigation-from-cross-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/intercept-canceled-event.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/intercept-after-dispatch.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/entries-array-equality.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/entries-in-new-srcdoc-iframe.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/key-id-location-reload-intercept.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/opaque-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/key-id-location-replace-cross-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/opaque-origin-data-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/opaque-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/sameDocument-after-navigate.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-history-entry/key-id-location-replace-cross-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-base-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-from-initial-about-blank-gc.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-from-initial-about-blank-src.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-from-initial-about-blank.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-relative-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/navigate-replace-same-document.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/reload-base-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/back-forward-initial-about-blank.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/back-forward-opaque-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/back-forward-out-of-bounds.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-already-detached.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-detach-in-serialization.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-invalid-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-push-initial-about-blank.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/traverseTo-invalid-key.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-rejection-order-invalidurl-unserializablestate.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-push-javascript-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/back-forward-opaque-origin.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/back-forward-initial-about-blank.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-invalid-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/reload-base-url.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-rejection-order-invalidurl-unserializablestate.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-already-detached.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-detach-in-serialization.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-rejection-order-detached-unserializablestate.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/traverseTo-already-detached.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/traverseTo-invalid-key.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/sandboxing-navigate-sibling.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/ordering-and-transition/transition-cross-document.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/scroll-behavior/scroll-on-synthetic-event.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/ [ Pass ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/cross-document-away-and-back.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/cross-document-location-api.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/location-reload.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-anchor-fragment.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-anchor-with-target.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-svg-anchor-fragment.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/navigate-anchor-userInitiated.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-already-detached.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/navigate-detach-in-serialization.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-already-detached.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/reload-detach-in-serialization.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigation-methods/return-value/traverseTo-already-detached.html [ Pass ]

# -- View Transitions -- #
# Reftest failures:
Expand Down
@@ -1,5 +1,3 @@
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL


PASS currententrychange does not fire when navigating away from the initial about:blank
Expand Down
@@ -1,4 +1,4 @@


FAIL clicking on an <a> element that navigates same-document targeting a cross-origin window assert_true: destination.sameDocument expected true got false
PASS clicking on an <a> element that navigates same-document targeting a cross-origin window

@@ -1,4 +1,4 @@


FAIL clicking on an <a> element that navigates same-document targeting a same-origin-domain (but cross-origin) window assert_true: destination.sameDocument expected true got false
PASS clicking on an <a> element that navigates same-document targeting a same-origin-domain (but cross-origin) window

@@ -1,4 +1,4 @@
Click me

FAIL clicking on an <a> element that navigates same-document targeting a same-origin window assert_true: destination.sameDocument expected true got false
PASS clicking on an <a> element that navigates same-document targeting a same-origin window

@@ -1,6 +1,4 @@


Harness Error (TIMEOUT), message = null

TIMEOUT navigate() must resolve URLs relative to navigation object's base URL Test timed out
PASS navigate() must resolve URLs relative to navigation object's base URL

@@ -1,8 +1,4 @@
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL


Harness Error (TIMEOUT), message = null

TIMEOUT navigate() from <iframe> still on initial about:blank works Test timed out
PASS navigate() from <iframe> still on initial about:blank works

@@ -1,5 +1,3 @@
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL


PASS navigate() from <iframe> with src="" but still on initial about:blank doesn't cause a crash on GC
Expand Down
@@ -1,6 +1,4 @@
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL
CONSOLE MESSAGE: Unhandled Promise Rejection: SyntaxError: Invalid URL


FAIL navigate() from <iframe> with src="" but still on initial about:blank works assert_equals: expected "/common/blank.html" but got "/navigation-api/navigation-methods/navigate-from-initial-about-blank-src.html"
PASS navigate() from <iframe> with src="" but still on initial about:blank works

@@ -1,4 +1,3 @@
CONSOLE MESSAGE: Unhandled Promise Rejection: TypeError: null is not an object (evaluating 'navigation.currentEntry.key')

PASS navigate() with history: 'replace' option

@@ -1,3 +1,3 @@

FAIL reload() with unserializable state in a detached iframe throws "DataCloneError", not "InvalidStateError" assert_array_equals: lengths differ, expected array ["committed", "finished"] length 2, got ["todo"] length 1
PASS reload() with unserializable state in a detached iframe throws "DataCloneError", not "InvalidStateError"

@@ -1,4 +1,4 @@

FAIL reload() with an unserializable state (WritableStream) assert_array_equals: lengths differ, expected array ["committed", "finished"] length 2, got ["todo"] length 1
FAIL reload() with an unserializable state (SharedArrayBuffer) assert_array_equals: lengths differ, expected array ["committed", "finished"] length 2, got ["todo"] length 1
PASS reload() with an unserializable state (WritableStream)
FAIL reload() with an unserializable state (SharedArrayBuffer) assert_unreached: finished must not fulfill Reached unreachable code

@@ -1,10 +1,3 @@
CONSOLE MESSAGE: Unhandled Promise Rejection: Error: assert_equals: expected 3 but got 2

Harness Error (FAIL), message = Unhandled rejection: assert_equals: expected 3 but got 2

TIMEOUT entry.getState() behavior after navigating away using the location API, then back Test timed out

Harness Error (FAIL), message = Unhandled rejection: assert_equals: expected 3 but got 2

TIMEOUT entry.getState() behavior after navigating away using the location API, then back Test timed out
FAIL entry.getState() behavior after navigating away using the location API, then back assert_equals: expected 3 but got 4

2 changes: 2 additions & 0 deletions LayoutTests/platform/glib/TestExpectations
Expand Up @@ -2371,6 +2371,8 @@ imported/w3c/web-platform-tests/fetch/metadata/fetch.https.sub.any.html [ Pass ]
imported/w3c/web-platform-tests/fetch/metadata/fetch.https.sub.any.worker.html [ Pass ]
imported/w3c/web-platform-tests/fetch/metadata/report.https.sub.html [ Pass ]
imported/w3c/web-platform-tests/fetch/metadata/style.https.sub.html [ Pass ]
imported/w3c/web-platform-tests/navigation-api/navigate-event/cross-window/click-samedocument-crossorigin-sameorigindomain.sub.html [ Pass ]

# These tests work totally fine but have unreliable ordering for test output making them flakey.
imported/w3c/web-platform-tests/fetch/metadata/preload.https.sub.html [ Skip ]
imported/w3c/web-platform-tests/fetch/metadata/window-open.https.sub.html [ Skip ]
Expand Down
4 changes: 3 additions & 1 deletion LayoutTests/platform/mac-wk1/TestExpectations
Expand Up @@ -1208,7 +1208,9 @@ imported/w3c/web-platform-tests/xhr/xhr-timeout-longtask.any.html

webkit.org/b/187230 editing/mac/pasteboard/can-copy-url-without-title.html [ Skip ]

webkit.org/b/270055 imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-back-forward-cross-doc.html [ Skip ]
# webkit.org/b/270055
imported/w3c/web-platform-tests/navigation-api/currententrychange-event/navigation-back-forward-cross-doc.html [ Skip ]
imported/w3c/web-platform-tests/navigation-api/updateCurrentEntry-method/same-document-away-and-back-location-api.html [ Skip ]

### END OF (1) Failures with bug reports
########################################
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/bindings/js/JSDOMPromiseDeferred.h
Expand Up @@ -395,7 +395,7 @@ inline JSC::EncodedJSValue callPromisePairFunction(JSC::JSGlobalObject& lexicalG
auto* promise2 = JSC::JSPromise::create(vm, globalObject.promiseStructure());
ASSERT(promise2);

auto result = functor(lexicalGlobalObject, callFrame, DeferredPromise::create(globalObject, *promise), DeferredPromise::create(globalObject, *promise2));
auto result = functor(lexicalGlobalObject, callFrame, DeferredPromise::create(globalObject, *promise, DeferredPromise::Mode::RetainPromiseOnResolve), DeferredPromise::create(globalObject, *promise2, DeferredPromise::Mode::RetainPromiseOnResolve));

rejectPromiseWithExceptionIfAny(lexicalGlobalObject, globalObject, *promise, catchScope);
rejectPromiseWithExceptionIfAny(lexicalGlobalObject, globalObject, *promise2, catchScope);
Expand Down

0 comments on commit a09b94a

Please sign in to comment.