Bug 1890689 accumulate input in LargerReceiverBlockSizeThanDesiredBuffering GTest...
[gecko.git] / devtools / client / shared / test / browser_inplace-editor_focus_closest_editor.js
blob5d721410ac4be4aee17cc8e07019b5403a6244c1
1 /* Any copyright is dedicated to the Public Domain.
2    http://creativecommons.org/publicdomain/zero/1.0/ */
3 /* import-globals-from helper_inplace_editor.js */
5 "use strict";
7 loadHelperScript("helper_inplace_editor.js");
9 // Test the inplace-editor behavior with focusEditableFieldAfterApply
10 // and focusEditableFieldContainerSelector options
12 add_task(async function () {
13   await addTab(
14     "data:text/html;charset=utf-8,inline editor focusEditableFieldAfterApply"
15   );
16   const { host, doc } = await createHost();
18   testFocusNavigationWithMultipleEditor(doc);
19   testFocusNavigationWithNonMatchingFocusEditableFieldContainerSelector(doc);
20   testMissingFocusEditableFieldContainerSelector(doc);
22   host.destroy();
23   gBrowser.removeCurrentTab();
24 });
26 function testFocusNavigationWithMultipleEditor(doc) {
27   // For some reason <button> or <input> are not rendered, so let's use divs with
28   // tabindex attribute to make them focusable.
29   doc.body.innerHTML = `
30       <main>
31         <header>
32           <div role=button tabindex=0 id="header-button">HEADER</div>
33         </header>
34         <section>
35           <span id="span-1" tabindex=0>SPAN 1</span>
36           <div role=button tabindex=0 id="section-button-1">BUTTON 1</div>
37           <p>
38             <span id="span-2" tabindex=0>SPAN 2</span>
39             <div role=button tabindex=0 id="section-button-2">BUTTON 2</div>
40           </p>
41           <span id="span-3" tabindex=0>SPAN 3</span>
42           <div role=button tabindex=0 id="section-button-3">BUTTON 3</div>
43         </section>
44         <sidebar>
45           <div role=button tabindex=0 id="sidebar-button">SIDEBAR</div>
46         </sidebar>
47       <main>`;
49   const span1 = doc.getElementById("span-1");
50   const span2 = doc.getElementById("span-2");
51   const span3 = doc.getElementById("span-3");
53   info("Create 3 editable fields for the 3 spans inside the main element");
54   const options = {
55     focusEditableFieldAfterApply: true,
56     focusEditableFieldContainerSelector: "main",
57   };
58   editableField({
59     element: span1,
60     ...options,
61   });
62   editableField({
63     element: span2,
64     ...options,
65   });
66   editableField({
67     element: span3,
68     ...options,
69   });
71   span1.click();
73   is(
74     doc.activeElement.inplaceEditor.elt.id,
75     "span-1",
76     "Visible editable field is the one associated with span-1"
77   );
78   assertFocusedElementInplaceEditorInput(doc);
80   EventUtils.sendKey("Tab");
82   is(
83     doc.activeElement.inplaceEditor.elt.id,
84     "span-2",
85     "Using Tab moved focus to span-2 editable field"
86   );
87   assertFocusedElementInplaceEditorInput(doc);
89   EventUtils.sendKey("Tab");
91   is(
92     doc.activeElement.inplaceEditor.elt.id,
93     "span-3",
94     "Using Tab moved focus to span-3 editable field"
95   );
96   assertFocusedElementInplaceEditorInput(doc);
98   EventUtils.sendKey("Tab");
100   is(
101     doc.activeElement.id,
102     "sidebar-button",
103     "Using Tab moved focus outside of <main>"
104   );
107 function testFocusNavigationWithNonMatchingFocusEditableFieldContainerSelector(
108   doc
109 ) {
110   // For some reason <button> or <input> are not rendered, so let's use divs with
111   // tabindex attribute to make them focusable.
112   doc.body.innerHTML = `
113       <main>
114         <span id="span-1" tabindex=0>SPAN 1</span>
115         <div role=button tabindex=0 id="section-button-1">BUTTON 1</div>
116         <span id="span-2" tabindex=0>SPAN 2</span>
117         <div role=button tabindex=0 id="section-button-2">BUTTON 2</div>
118       <main>`;
120   const span1 = doc.getElementById("span-1");
121   const span2 = doc.getElementById("span-2");
123   info(
124     "Create editable fields for the 2 spans, but pass a focusEditableFieldContainerSelector that does not match any element"
125   );
126   const options = {
127     focusEditableFieldAfterApply: true,
128     focusEditableFieldContainerSelector: ".does-not-exist",
129   };
130   editableField({
131     element: span1,
132     ...options,
133   });
134   editableField({
135     element: span2,
136     ...options,
137   });
139   span1.click();
141   is(
142     doc.activeElement.inplaceEditor.elt.id,
143     "span-1",
144     "Visible editable field is the one associated with span-1"
145   );
146   assertFocusedElementInplaceEditorInput(doc);
148   EventUtils.sendKey("Tab");
150   is(
151     doc.activeElement.id,
152     "section-button-1",
153     "Using Tab moved focus to section-button-1, non-editable field"
154   );
155   ok(!doc.querySelector("input"), "There's no editable input displayed");
158 function testMissingFocusEditableFieldContainerSelector(doc) {
159   doc.body.innerHTML = "";
160   const element = createSpan(doc);
161   editableField({
162     element,
163     focusEditableFieldAfterApply: true,
164   });
166   element.click();
167   is(
168     element.style.display,
169     "inline-block",
170     "The original <span> was not hidden"
171   );
172   ok(!doc.querySelector("input"), "No input was created");
175 function assertFocusedElementInplaceEditorInput(doc) {
176   ok(
177     doc.activeElement.matches("input.styleinspector-propertyeditor"),
178     "inplace editor input is focused"
179   );