move-selection-range-into-different-root.tentative.html (2592B)
1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Updating selection range to outside of scope of the selection should cause the range removed from the selection</title> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 <script> 9 "use strict"; 10 11 const ArgTypeNodeAndOffset = 0; 12 const ArgTypeNode = 1; 13 14 const rangeMethods = [ 15 { name: "selectNode", type: ArgTypeNode }, 16 { name: "selectNodeContents", type: ArgTypeNode }, 17 { name: "setEnd", type: ArgTypeNodeAndOffset }, 18 { name: "setEndAfter", type: ArgTypeNode }, 19 { name: "setEndBefore", type: ArgTypeNode }, 20 { name: "setStart", type: ArgTypeNodeAndOffset }, 21 { name: "setStartAfter", type: ArgTypeNode }, 22 { name: "setStartBefore", type: ArgTypeNode }, 23 ]; 24 25 function execute(range, rangeMethod, node, offset) { 26 switch (rangeMethod.type) { 27 case ArgTypeNodeAndOffset: 28 range[rangeMethod.name](node, offset); 29 break; 30 case ArgTypeNode: 31 range[rangeMethod.name](node); 32 break; 33 default: 34 throw new Error("Unexpected arg type is set"); 35 } 36 } 37 38 addEventListener("load", () => { 39 function selectDiv() { 40 getSelection().removeAllRanges(); 41 const range = document.createRange(); 42 range.selectNodeContents(document.getElementById("rangeContainer")); 43 getSelection().addRange(range); 44 } 45 function createDocumentFragment() { 46 const fragment = document.createDocumentFragment(); 47 const div = document.createElement("div"); 48 div.id = "rangeContainer"; 49 div.innerHTML = "<br>"; 50 fragment.appendChild(div); 51 return fragment; 52 } 53 for (const rangeMethod of rangeMethods) { 54 test(() => { 55 selectDiv(); 56 const fragment = createDocumentFragment(); 57 execute( 58 getSelection().getRangeAt(0), 59 rangeMethod, 60 fragment.getElementById("rangeContainer"), 61 0 62 ); 63 assert_equals( 64 getSelection().rangeCount, 65 0 66 ); 67 }, `Set selection range into a document fragment with ${rangeMethod.name}`); 68 test(() => { 69 selectDiv(); 70 const div = document.querySelector("iframe").contentDocument.getElementById("rangeContainer"); 71 execute( 72 getSelection().getRangeAt(0), 73 rangeMethod, 74 div, 75 0 76 ); 77 assert_equals( 78 getSelection().rangeCount, 79 0 80 ); 81 }, `Set selection range into a sub-document with ${rangeMethod.name}`); 82 } 83 }, {once: true}); 84 </script> 85 </head> 86 <body> 87 <div id="rangeContainer"><br></div> 88 <iframe srcdoc="<div id='rangeContainer'><br></div>"></iframe> 89 </body> 90 </html>