Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Navigation and session history rewrite
This monster completely rewrites everything to do with navigation and traversal. It introduces the "navigable" and "traversable navigable" concepts, which take on many of the roles that browsing contexts previously did, but better. A navigable can present a sequence of browsing contexts, which to the user seem to all be the same, but due to browsing context group switches, have different WindowProxys and are allocated in different agent clusters. A traversable navigable manages the session history for itself and all its descendant navigables, providing a synchronization point and source of truth. The general flow of navigation and traversal is now geared toward creating a session history entry, populated with the appropriate document, before finally applying the history "step". The step concept for session history, managed by the traversable, replaces the previous idea of joint session history, which was a sort of deduplicated union of individual session histories for each browsing context within a top-level browsing context. Notable things we won't tackle this round, but are much easier to tackle in the future: - Iframe restoration on (non-bfcache) history traversal is not yet specified. - Overlapping navigations and traversals (see whatwg#6927) are not perfect yet, although this makes them better. - Browsing context names (see whatwg#313) are not perfect yet, although this makes them better. - Base URL inheritance and storage in session history (see whatwg#421, whatwg#2883, and whatwg#3989) is not yet specified. - Sandbox flag storage in session history (see whatwg#6809) is not yet specified. - Task queuing when creating agents/realms/windows/documents (see whatwg#8443) remains sketchy. - Window object reuse is not yet rationalized (see whatwg#3267). Closes whatwg#854 by clarifying the javascript: URL origin and origin-checking setup. Closes whatwg#1073 by properly resetting active-ness of documents when they are removed. Closes whatwg#1130 by removing the source browsing context concept, using a sourceDocument argument instead, and taking source snapshot params at the appropriate early time. Closes whatwg#1191 by properly sharing document state across documents, as well as overlapping same-document navigations plus cross-document traversals. Closes whatwg#1336 by properly handling child browsing contexts. Closes whatwg#1382 by only unloading after we are sure we have a new document (i.e., not a 204 or download). Closes whatwg#1454 by rewriting session history closer to what implementations do, with the nested history concept in particular taking care of the issues discussed there. Closes whatwg#1524 by introducing the POST data concept and storing it in the document state. Closes whatwg#2436 by rewriting the spec for history.go() to be clear about the results. Tests: web-platform-tests/wpt#36366. Closes whatwg#2566 by introducing an explicit "history object" definition. Tests: web-platform-tests/wpt#36367. Closes whatwg#2649 through clear creation of srcdoc documents, including during history traversal. Closes whatwg#3215 by preserving POST data and reusing it on reloads. Closes whatwg#3447 by specifying a precise mechanism (the ongoing navigation) for canceling navigations, and the points at which that mechanism is consulted. It also stops queuing a task for hyperlink navigations. Closes whatwg#3497 by posting appropriate tasks for cross-event-loop navigations. Closes whatwg#3615 by rewriting traverse a history by a delta, which eventually calls into apply the history step, to navigate all relevant navigables. Closes whatwg#3625 by storing information in the document state (not just the URL), so that future traversals can reconstruct the request appropriately. Closes whatwg#3730 by doing proper task queuing for navigation, including one for javascript: URLs but not including one for normal same-frame navigations. Tests: web-platform-tests/wpt#36358. Closes whatwg#3734 by rewriting the definition of script-closable to use well-defined concepts. Closes whatwg#3812 by removing all uses of "active document" as a predicate instead of a property. Closes whatwg#4054 by introducing the session history traversal queue and renaming the previous "history traversal task source" to "navigation and traversal task source". Closes whatwg#4121 by doing the "allowed to navigate" check at the top of apply the history step. Closes whatwg#4428 by keeping a strong reference from documents (including bfcached documents) to their containing browsing context. Closes whatwg#4782 by introducing the top-level traversable and navigable concepts. Closes whatwg#4838 by doing sandbox checking in a much more precise manner, in particular snapshotting the relevant flags early in any traversals. Closes whatwg#4852 by using document state (in particular history policy container, request referrer, and request referrer policy) in reloads. Closes whatwg#5103 by properly restoring scroll positions for everything that is traversed, as part of properly traversing more than one navigable. Closes whatwg#5350 by properly restoring window names across browsing context group switches, and going back to the same browsing context as was previously there when traversing back across a BCG switch boundary. (Implementations could create new browsing contexts, as long as they restore the WindowProxy scripting relationships and other browsing context features; the result is observably equivalent.) Closes whatwg#5597 by rewriting "allowed to download" to just take booleans, derived from the appropriate snapshotted or computed sandboxing flags. Closes whatwg#5767, modulo bugs and oversights we made, by rewriting everything :). Closes whatwg#5877 by re-specifying "fully active" in terms of navigables, instead of browsing contexts. Closes whatwg#6446 by properly firing beforeunload to all descendant navigables, although whether or not they actually prompt still allows implementation leeway. Closes whatwg#6483 by introducing the distinction between current session history entry and active session history entry. Closes whatwg#6514 by settling on using a single origin for these checks. Closes whatwg#6628 by storing window.name values in the document state, so even in strange splitting situations like described there, they remain. Closes whatwg#6652 by no longer changing history.state when reactivating a document from bfcache ("restore the history object state" is called only when documentsEntryChanged is true). Tests: web-platform-tests/wpt#36368. Closes whatwg#6773 by having careful handling of synchronous navigations during traversals. Test updates: web-platform-tests/wpt#36364. Closes whatwg#6798 by treating javascript: URL navigations as replacements. Works towards whatwg#6809 by storing srcdoc resources in the document state. Closes whatwg#6813 by storing referrer in the document state. Tests for the repopulation case: web-platform-tests/wpt#36352. (No tests yet for the reload case.) Closes whatwg#6947 by rolling its contents into this change: PDF documents are put in the same category as other inaccessible, no-DOM documents. Closes whatwg#7107 by clearing history state on redirects and when origin changes by other means, such as CSP. Closes whatwg#7441 by making window.blur() a no-op because that was simpler than updating it to operate on navigables. Closes whatwg#7722 by incorporating its contents into the rewritten version. Closes whatwg#8295 by refactoring the iframe/frame load event specs to avoid the bug. Helps with whatwg#8395 by at least ensuring the javascript: case does not fire beforeunload. Tests: web-platform-tests/wpt#36488. (The other cases remain open for investigation and testing.) Closes whatwg#8449 by exporting "create a fresh top-level traversable" which is designed for the use case in question. Co-authored-by: Domenic Denicola <d@domenic.me> Co-authored-by: Dominic Farolino <domfarolino@gmail.com>
- Loading branch information