contenteditable-insert-line-at-top.tentative.html (3481B)
1 <!DOCTYPE html> 2 <link rel="help" href="https://drafts.csswg.org/css-scroll-anchoring/"> 3 <meta name="viewport" content="width=device-width,initial-scale=1"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/resources/testdriver.js"></script> 7 <script src="/resources/testdriver-actions.js"></script> 8 <script src="/resources/testdriver-vendor.js"></script> 9 <style> 10 11 #container { 12 height: 300px; 13 width: 300px; 14 overflow-y: scroll; 15 scroll-behavior: auto; 16 } 17 18 p { 19 margin: 0px; 20 line-height: 20px; 21 font-size: 20px; 22 } 23 24 </style> 25 26 <div id="container"> 27 <div contenteditable> 28 <p> 29 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ante 30 nulla, dictum rhoncus libero vel, dictum iaculis sem. Morbi sit amet 31 euismod ligula. Proin et est ex. Pellentesque sollicitudin lobortis diam 32 eu posuere. Donec a diam risus. Fusce quis semper sapien, sed tincidunt 33 mi. Nullam tortor diam, sagittis sed scelerisque ut, scelerisque a 34 turpis. Integer a dignissim turpis. Etiam eu pharetra nisl, ac ultricies 35 sem. Ut at tristique turpis. Aliquam vitae arcu quis turpis gravida 36 luctus at at turpis. Nullam aliquet turpis sed lectus interdum 37 ultricies. 38 </p> 39 </div> 40 </div> 41 <script> 42 43 setup(() => { 44 const editable = document.querySelector("div[contenteditable]"); 45 const child = editable.children[0]; 46 47 for (let i = 0; i < 10; i++) { 48 const clone = child.cloneNode(true); 49 editable.appendChild(clone); 50 } 51 document.documentElement.getBoundingClientRect(); 52 }); 53 54 promise_test(async t => { 55 const editable = document.querySelector("div[contenteditable]"); 56 editable.focus(); 57 58 // Scroll down to the bottom. 59 let scrollPromise = new Promise(resolve => { 60 container.addEventListener("scroll", () => resolve(), { once: true }); 61 }); 62 // Hopefully 10000 is greater than the maximum possible scroll position. 63 container.scrollTo(0, 10000); 64 await scrollPromise; 65 66 assert_greater_than(container.scrollTop, 0); 67 68 const selection = window.getSelection(); 69 selection.collapse(editable.lastElementChild, 1); 70 71 // Pres Ctrl+Home or Meta+ArrorUp to move back to the top. 72 scrollPromise = new Promise(resolve => { 73 container.addEventListener("scroll", () => resolve(), { once: true }); 74 }); 75 const kHomeOrArrowUp = 76 navigator.platform.includes("Mac") ? "\uE013" : "\uE011"; 77 const kControlOrMeta = 78 navigator.platform.includes("Mac") ? "\uE03d" : "\uE009"; 79 await new test_driver.Actions() 80 .keyDown(kControlOrMeta) 81 .keyDown(kHomeOrArrowUp) 82 .keyUp(kHomeOrArrowUp) 83 .keyUp(kControlOrMeta) 84 .send(); 85 await scrollPromise; 86 87 assert_equals(container.scrollTop, 0, 88 "The scroll position should be restored to the top"); 89 90 container.addEventListener("scroll", () => { 91 assert_false("Any scroll event should not happen"); 92 }); 93 // Press "Enter" to insert a new line at the top. 94 const kEnter = "\uE007"; 95 await new test_driver.Actions() 96 .keyDown(kEnter) 97 .keyUp(kEnter) 98 .send(); 99 100 // Wait 3 frames to give a chance to scroll. 101 await new Promise(resolve => requestAnimationFrame(resolve)); 102 await new Promise(resolve => requestAnimationFrame(resolve)); 103 await new Promise(resolve => requestAnimationFrame(resolve)); 104 105 assert_equals(container.scrollTop, 0, 106 "The scroll position should be unchanged"); 107 }, "The scroll position is unchanged when inserting a new line at the top of contenteditable"); 108 109 </script>