browser_markup_pseudo_view-transition.js (3684B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const TEST_URL = `data:text/html,<!DOCTYPE html><meta charset=utf8>${encodeURIComponent(` 7 <style> 8 ::view-transition-group(root) { 9 /* large number so the view-transition pseudo elements are available during the whole test */ 10 animation-duration: 3600s; 11 } 12 header { 13 view-transition-name: main-header; 14 } 15 16 header h1 { 17 view-transition-name: main-header-text; 18 } 19 </style> 20 <header> 21 <h1>::view-transition</h1> 22 </header> 23 `)}`; 24 25 add_task(async function () { 26 const { inspector } = await openInspectorForURL(TEST_URL); 27 28 await selectNode("html", inspector); 29 30 const onMarkupMutation = inspector.once("markupmutation"); 31 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => { 32 const document = content.document; 33 content.testTransition = document.startViewTransition(() => { 34 document.querySelector("h1").replaceChildren("updated"); 35 }); 36 await content.testTransition.ready; 37 await content.testTransition.updateCallbackDone; 38 }); 39 await onMarkupMutation; 40 41 const htmlNodeFront = await getNodeFront("html", inspector); 42 const htmlContainer = await getContainerForNodeFront( 43 htmlNodeFront, 44 inspector 45 ); 46 47 const viewTransitionMarkupNodeEl = htmlContainer.children.childNodes[2]; 48 is( 49 viewTransitionMarkupNodeEl.textContent, 50 "::view-transition", 51 "::view-transition node is displayed" 52 ); 53 54 const viewTransitionContainer = viewTransitionMarkupNodeEl.container; 55 is( 56 viewTransitionContainer.type, 57 "readonlycontainer", 58 "The ::view-transition container is read-only" 59 ); 60 61 info("Expand the whole ::view-transition subtree"); 62 await toggleContainerByClick(inspector, viewTransitionContainer, { 63 altKey: true, 64 }); 65 66 let tree = ` 67 html 68 head!ignore-children 69 body!ignore-children 70 ::view-transition 71 ::view-transition-group(root) 72 ::view-transition-image-pair(root) 73 ::view-transition-old(root) 74 ::view-transition-new(root) 75 ::view-transition-group(main-header) 76 ::view-transition-image-pair(main-header) 77 ::view-transition-old(main-header) 78 ::view-transition-new(main-header) 79 ::view-transition-group(main-header-text) 80 ::view-transition-image-pair(main-header-text) 81 ::view-transition-old(main-header-text) 82 ::view-transition-new(main-header-text) 83 `.trim(); 84 await assertMarkupViewAsTree(tree, "html", inspector); 85 86 info( 87 "Check that html element is selected back when view transition is over and pseudo elements removed" 88 ); 89 90 const htmlChildren = await inspector.markup.walker.children(htmlNodeFront); 91 const viewTransitionNodeFront = htmlChildren.nodes[2]; 92 await selectNode(viewTransitionNodeFront, inspector); 93 is( 94 inspector.selection.nodeFront.displayName, 95 "::view-transition", 96 "::view-transition element is properly selected" 97 ); 98 99 info("Stop the view transition"); 100 const onSelection = inspector.selection.once("new-node-front"); 101 await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => { 102 content.testTransition.skipTransition(); 103 delete content.testTransition; 104 }); 105 await onSelection; 106 107 is( 108 inspector.selection.nodeFront.displayName, 109 "html", 110 "html element was selected after the view transition was skipped" 111 ); 112 113 // Check that the ::view-transition elements are removed 114 tree = ` 115 html 116 head!ignore-children 117 body!ignore-children 118 `.trim(); 119 await assertMarkupViewAsTree(tree, "html", inspector); 120 });