Bug 1852740: add tests for the `fetchpriority` attribute in Link headers. r=necko...
[gecko.git] / toolkit / actors / FindBarChild.sys.mjs
blob645456ad1f698e5c855e8198926b5de87bde753d
1 /* vim: set ts=2 sw=2 sts=2 et tw=80: */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
8 const lazy = {};
10 ChromeUtils.defineESModuleGetters(lazy, {
11   BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
12 });
14 export class FindBarChild extends JSWindowActorChild {
15   constructor() {
16     super();
18     this._findKey = null;
20     this.inQuickFind = false;
21     this.inPassThrough = false;
23     ChromeUtils.defineLazyGetter(this, "FindBarContent", () => {
24       const { FindBarContent } = ChromeUtils.importESModule(
25         "resource://gre/modules/FindBarContent.sys.mjs"
26       );
28       let findBarContent = new FindBarContent(this);
30       Object.defineProperties(this, {
31         inQuickFind: {
32           get() {
33             return findBarContent.inQuickFind;
34           },
35         },
36         inPassThrough: {
37           get() {
38             return findBarContent.inPassThrough;
39           },
40         },
41       });
43       return findBarContent;
44     });
45   }
47   receiveMessage(msg) {
48     if (msg.name == "Findbar:UpdateState") {
49       this.FindBarContent.updateState(msg.data);
50     }
51   }
53   /**
54    * Check whether this key event will start the findbar in the parent,
55    * in which case we should pass any further key events to the parent to avoid
56    * them being lost.
57    * @param aEvent the key event to check.
58    */
59   eventMatchesFindShortcut(aEvent) {
60     if (!this._findKey) {
61       this._findKey = Services.cpmm.sharedData.get("Findbar:Shortcut");
62       if (!this._findKey) {
63         return false;
64       }
65     }
66     for (let k in this._findKey) {
67       if (this._findKey[k] != aEvent[k]) {
68         return false;
69       }
70     }
71     return true;
72   }
74   handleEvent(event) {
75     if (event.type == "keypress") {
76       this.onKeypress(event);
77     }
78   }
80   onKeypress(event) {
81     if (!this.inPassThrough && this.eventMatchesFindShortcut(event)) {
82       return this.FindBarContent.start(event);
83     }
85     // disable FAYT in about:blank to prevent FAYT opening unexpectedly.
86     let location = this.document.location.href;
87     if (location == "about:blank") {
88       return null;
89     }
91     if (
92       event.ctrlKey ||
93       event.altKey ||
94       event.metaKey ||
95       event.defaultPrevented ||
96       !lazy.BrowserUtils.mimeTypeIsTextBased(this.document.contentType) ||
97       !lazy.BrowserUtils.canFindInPage(location)
98     ) {
99       return null;
100     }
102     if (this.inPassThrough || this.inQuickFind) {
103       return this.FindBarContent.onKeypress(event);
104     }
106     if (event.charCode && this.shouldFastFind(event.target)) {
107       let key = String.fromCharCode(event.charCode);
108       if ((key == "/" || key == "'") && FindBarChild.manualFAYT) {
109         return this.FindBarContent.startQuickFind(event);
110       }
111       if (key != " " && FindBarChild.findAsYouType) {
112         return this.FindBarContent.startQuickFind(event, true);
113       }
114     }
115     return null;
116   }
118   /**
119    * Return true if we should FAYT for this node:
120    *
121    * @param elt
122    *        The element that is focused
123    */
124   shouldFastFind(elt) {
125     if (elt) {
126       let win = elt.ownerGlobal;
127       if (win.HTMLInputElement.isInstance(elt) && elt.mozIsTextField(false)) {
128         return false;
129       }
131       if (elt.isContentEditable || win.document.designMode == "on") {
132         return false;
133       }
135       if (
136         win.HTMLTextAreaElement.isInstance(elt) ||
137         win.HTMLSelectElement.isInstance(elt) ||
138         win.HTMLObjectElement.isInstance(elt) ||
139         win.HTMLEmbedElement.isInstance(elt)
140       ) {
141         return false;
142       }
144       if (
145         (win.HTMLIFrameElement.isInstance(elt) && elt.mozbrowser) ||
146         win.XULFrameElement.isInstance(elt)
147       ) {
148         // If we're targeting a mozbrowser iframe or an embedded XULFrameElement
149         // (e.g. about:addons extensions inline options page), do not activate
150         // fast find.
151         return false;
152       }
153     }
155     return true;
156   }
159 XPCOMUtils.defineLazyPreferenceGetter(
160   FindBarChild,
161   "findAsYouType",
162   "accessibility.typeaheadfind"
164 XPCOMUtils.defineLazyPreferenceGetter(
165   FindBarChild,
166   "manualFAYT",
167   "accessibility.typeaheadfind.manual"