File: bug360437_window.xhtml

package info (click to toggle)
firefox 147.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,484 kB
  • sloc: cpp: 7,607,246; javascript: 6,533,185; ansic: 3,775,227; python: 1,415,393; xml: 634,561; asm: 438,951; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (152 lines) | stat: -rw-r--r-- 5,368 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?xml version="1.0"?>

<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->

<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet
  href="chrome://mochikit/content/tests/SimpleTest/test.css"
  type="text/css"?>

<window id="360437Test"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        xmlns:html="http://www.w3.org/1999/xhtml"
        width="600"
        height="600"
        onload="startTest();"
        title="360437 test">

  <script type="application/javascript"><![CDATA[
    const {BrowserTestUtils} = ChromeUtils.importESModule(
      "resource://testing-common/BrowserTestUtils.sys.mjs"
    );
    const {ContentTask} = ChromeUtils.importESModule(
      "resource://testing-common/ContentTask.sys.mjs"
    );
    ContentTask.setTestScope(window.arguments[0]);

    var gFindBar = null;
    var gBrowser;

    var SimpleTest = window.arguments[0].SimpleTest;
    var ok = window.arguments[0].ok;
    var is = window.arguments[0].is;
    var info = window.arguments[0].info;

    async function startTest() {
      await SimpleTest.promiseFocus(window);

      (async function() {
        gFindBar = document.getElementById("FindToolbar");
        for (let browserId of ["content", "content-remote"]) {
          await startTestWithBrowser(browserId);
        }
      })().then(() => {
        window.close();
        SimpleTest.finish();
      });
    }

    async function startTestWithBrowser(browserId) {
      info("Starting test with browser '" + browserId + "'");
      gBrowser = document.getElementById(browserId);
      gFindBar.browser = gBrowser;

      let loadedPromise = BrowserTestUtils.browserLoaded(gBrowser);
      let contentLoadedPromise = ContentTask.spawn(gBrowser, null, async function() {
        return new Promise(resolve => {
          addEventListener("DOMContentLoaded", () => resolve(), { once: true });
        });
      });
      BrowserTestUtils.startLoadingURIString(gBrowser, "data:text/html,<form><input id='input' type='text' value='text inside an input element'></form>");
      await loadedPromise;
      await contentLoadedPromise;

      gFindBar.onFindCommand();

      // Make sure the findfield is correctly focused on open
      var searchStr = "text inside an input element";
      await promiseEnterStringIntoFindField(searchStr);
      is(document.commandDispatcher.focusedElement,
         gFindBar._findField, "Find field isn't focused");

      // Make sure "find again" correctly transfers focus to the content element
      // when the find bar is closed.

      let focusPromise;
      if (browserId == "content-remote") {
        focusPromise = ContentTask.spawn(gBrowser, null, async function() {
          await new Promise(resolve => {
            content.document.addEventListener("focus", resolve, { once: true });
          });
        });
      }

      info("Wait for findbarclose");
      await new Promise(resolve => {
        window.addEventListener("findbarclose", resolve, { once: true });
        gFindBar.close();
      });

      info("Wait for document focus");
      await focusPromise;

      await SpecialPowers.spawn(gBrowser, [], async function() {
        Assert.equal(content.document.activeElement,
         content.document.getElementById("input"), "Input Element isn't focused");
      });

      gFindBar.onFindAgainCommand(false);

      await SpecialPowers.spawn(gBrowser, [], async function() {
        Assert.equal(content.document.activeElement,
         content.document.getElementById("input"), "Input Element isn't focused after find again");
      });

      // Make sure "find again" doesn't focus the content element if focus
      // isn't in the content document.
      var textbox = document.getElementById("textbox");
      textbox.focus();

      ok(gFindBar.hidden, "Findbar is hidden");
      gFindBar.onFindAgainCommand(false);
      is(document.activeElement, textbox,
         "Focus was stolen from a chrome element");
    }

    function promiseFindResult(str = null) {
      return new Promise(resolve => {
        let listener = {
          onFindResult({ searchString }) {
            if (str !== null && str != searchString) {
              return;
            }
            gFindBar.browser.finder.removeResultListener(listener);
            resolve();
          }
        };
        gFindBar.browser.finder.addResultListener(listener);
      });
    }

    function promiseEnterStringIntoFindField(str) {
      let promise = promiseFindResult(str);
      for (let i = 0; i < str.length; i++) {
        let event = new KeyboardEvent("keypress", {
          bubbles: true,
          cancelable: true,
          view: null,
          keyCode: 0,
          charCode: str.charCodeAt(i),
        });
        gFindBar._findField.dispatchEvent(event);
      }
      return promise;
    }
  ]]></script>
  <html:input id="textbox"/>
  <browser type="content" primary="true" flex="1" id="content" messagemanagergroup="test" src="about:blank"/>
  <browser type="content" primary="true" flex="1" id="content-remote" remote="true" messagemanagergroup="test" src="about:blank"/>
  <findbar id="FindToolbar" browserid="content"/>
</window>