From a50cc3ce7ec5f94b4c98c5b4383a76e2e3fb9ddd Mon Sep 17 00:00:00 2001 From: Noam Rosenthal Date: Thu, 14 Mar 2024 09:32:04 +0000 Subject: [PATCH 1/2] [css-view-transitions-2] Update the algorithm to check opt-in on outbound transition Instead of relying on the source snapshot params in HTML, we update a flag every time something relevant changes, and HTML can read that flag. --- css-view-transitions-2/Overview.bs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/css-view-transitions-2/Overview.bs b/css-view-transitions-2/Overview.bs index 24c8997a0b9..ad810cba57f 100644 --- a/css-view-transitions-2/Overview.bs +++ b/css-view-transitions-2/Overview.bs @@ -450,6 +450,11 @@ Note: as per default behavior, the ''@view-transition'' rule can be nested insid Note: the [=@view-transition/type=] descriptor only applies to the {{Document}} in which it is defined. The author is responsible for using their chosen set of types in both documents. +## Responding to changes in the ''@view-transition'' rule ## {#respond-to-rule-changes} + +When the ''@view-transition'' rule changes for {{Document}} |document|, [=update the opt-in state for outbound transitions=] given |document|. + + # API # {#api} ## Additions to {{Document}} ## {#additions-to-document-api} @@ -527,6 +532,12 @@ The {{CSSViewTransitionRule}} represents a ''@view-transition'' rule. : inbound view transition params :: a [=view transition params=], or null. Initially null. + + : can initiate outbound view transition + :: a boolean. + Initially false. + + Note: this value can be read [=in parallel=] while navigating. ### The View transition params struct ### {#view-transition-params-struct} @@ -736,6 +747,10 @@ Prepend this to the [=Perform pending transition operations=] algorithm given a 1. [=Assert=]: |document| is [=fully active=]. + 1. [=Assert=]: |document| [=has been revealed=] is true. + + 1. [=Update the opt-in state for outbound transitions=] for |document|. + 1. Let |inboundViewTransitionParams| be |document|'s [=inbound view transition params=]. 1. If |inboundViewTransitionParams| is null, then return null. @@ -769,6 +784,14 @@ Prepend this to the [=Perform pending transition operations=] algorithm given a 1. Return |transition|. +### Updating the opt-in state for outbound view transitions ### {#update-opt-in-state-for-outbound} + +
+To update the opt-in state for outbound transitions for a {{Document}} |document|: + 1. If |document| [=has been revealed=], and the result of [=resolve @view-transition rule|resolving the @view-transition rule=] is not "skip transition", + then set |document|'s [=can initiate outbound view transition=] to true. + 1. Otherwise, set |document|'s [=can initiate outbound view transition=] to false. +

Privacy Considerations

From 714c0492241921e5a05f3b3e4f09fd45325bfed5 Mon Sep 17 00:00:00 2001 From: Noam Rosenthal Date: Fri, 15 Mar 2024 08:33:40 +0000 Subject: [PATCH 2/2] Refactor outbound algo into vt --- css-view-transitions-2/Overview.bs | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/css-view-transitions-2/Overview.bs b/css-view-transitions-2/Overview.bs index ad810cba57f..e6ffe241f71 100644 --- a/css-view-transitions-2/Overview.bs +++ b/css-view-transitions-2/Overview.bs @@ -533,7 +533,7 @@ The {{CSSViewTransitionRule}} represents a ''@view-transition'' rule. :: a [=view transition params=], or null. Initially null. - : can initiate outbound view transition + : can initiate outbound view transition :: a boolean. Initially false. @@ -671,20 +671,24 @@ Prepend this to the [=Perform pending transition operations=] algorithm given a
To check if a navigation can trigger a cross-document view-transition? given - an [=/origin=] |oldOrigin|, an [=/origin=] |newOrigin|, a boolean |navigationHasCrossOriginRedirects|, a {{NavigationType}} |navigationType|, and a boolean |isBrowserUINavigation|: + a {{Document}} |oldDocument|, a {{Document}} |newDocument|, a {{NavigationType}} |navigationType|, and a boolean |isBrowserUINavigation|: - Note: this is called during navigation, potentially [=in parallel=], for documents that have opted-in to view-transitions using the ''@view-transition'' rule. + Note: this is called during navigation, potentially [=in parallel=]. 1. If the user agent decides to display an [=implementation-defined=] navigation experience, e.g. a gesture-based transition for a back navigation, the user agent may ignore the author-defined view transition. If that is the case, return false. + 1. If |oldDocument|'s [=can initiate outbound view transition=] is false, then return false. + 1. If |navigationType| is {{NavigationType/reload}}, then return false. - 1. If |isBrowserUINavigation| is true, and |navigationType| is {{NavigationType/push}} or {{NavigationType/replace}}, then return false. + 1. If |oldDocument|'s [=Document/origin=] is not [=same origin=] as |newDocument|'s [=Document/origin=], then return false. + + 1. If |navigationType| is {{NavigationType/traverse}}, then return true. - 1. If |oldOrigin| is not [=same origin=] as |newOrigin| then return false. + 1. If |isBrowserUINavigation| is true, then return false. - 1. If |navigationHasCrossOriginRedirects| is true, then return false. + 1. If |newDocument| [=was created via cross-origin redirects=], then return false. 1. Return true.
@@ -694,11 +698,11 @@ Prepend this to the [=Perform pending transition operations=] algorithm given a 1. [=Assert=]: These steps are running as part of a [=task=] queued on |oldDocument|. - 1. If |oldDocument|'s [=has been revealed=] is false, then return null. + 1. If |oldDocument|'s [=can initiate outbound view transition=] is false, then return null. - 1. Let |resolvedRule| be the result of [=Resolve @view-transition rule|resolving the @view-transition rule=] for |oldDocument|. + 1. Let |transitionTypesFromRule| be the result of [=Resolve @view-transition rule|resolving the @view-transition rule=] for |oldDocument|. - 1. If |resolvedRule| is "skip transition", then return null. + 1. [=Assert=]: |transitionTypesFromRule| is not "skip transition". Note: We don't know yet if |newDocument| has opted in, as it might not be parsed yet. We check the opt-in for |newDocument| when we fire the {{Window/pagereveal}} event. @@ -712,7 +716,7 @@ Prepend this to the [=Perform pending transition operations=] algorithm given a 1. Let |outboundTransition| be a new {{ViewTransition}} object in |oldDocument|'s [=relevant Realm=]. - 1. Set |outboundTransition|'s [=ViewTransition/active types=]'s [=DOMTokenList/token set=] to |resolvedRule|. + 1. Set |outboundTransition|'s [=ViewTransition/active types=]'s [=DOMTokenList/token set=] to |transitionTypesFromRule|. Note: the [=ViewTransition/active types=] are not shared between documents. Manipulating the {{ViewTransition/typeList}} in the new document does not affect the types in the new document, @@ -743,7 +747,7 @@ Prepend this to the [=Perform pending transition operations=] algorithm given a ### Accessing the view-transition in the new {{Document}} ### {#access-view-transition-in-new-doc}
- To resolve cross-document view-transition for {{Document}} |document|: + To resolve inbound cross-document view-transition for {{Document}} |document|: 1. [=Assert=]: |document| is [=fully active=].