|
1 // -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
|
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/. |
|
5 |
|
6 this.EXPORTED_SYMBOLS = ["RemoteFinder", "RemoteFinderListener"]; |
|
7 |
|
8 const Ci = Components.interfaces; |
|
9 const Cc = Components.classes; |
|
10 const Cu = Components.utils; |
|
11 |
|
12 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
13 |
|
14 function RemoteFinder(browser) { |
|
15 this._browser = browser; |
|
16 this._listeners = []; |
|
17 this._searchString = null; |
|
18 |
|
19 this._browser.messageManager.addMessageListener("Finder:Result", this); |
|
20 this._browser.messageManager.sendAsyncMessage("Finder:Initialize"); |
|
21 } |
|
22 |
|
23 RemoteFinder.prototype = { |
|
24 addResultListener: function (aListener) { |
|
25 if (this._listeners.indexOf(aListener) === -1) |
|
26 this._listeners.push(aListener); |
|
27 }, |
|
28 |
|
29 removeResultListener: function (aListener) { |
|
30 this._listeners = this._listeners.filter(l => l != aListener); |
|
31 }, |
|
32 |
|
33 receiveMessage: function (aMessage) { |
|
34 this._searchString = aMessage.data.searchString; |
|
35 |
|
36 for (let l of this._listeners) { |
|
37 l.onFindResult(aMessage.data); |
|
38 } |
|
39 }, |
|
40 |
|
41 get searchString() { |
|
42 return this._searchString; |
|
43 }, |
|
44 |
|
45 set caseSensitive(aSensitive) { |
|
46 this._browser.messageManager.sendAsyncMessage("Finder:CaseSensitive", |
|
47 { caseSensitive: aSensitive }); |
|
48 }, |
|
49 |
|
50 fastFind: function (aSearchString, aLinksOnly) { |
|
51 this._browser.messageManager.sendAsyncMessage("Finder:FastFind", |
|
52 { searchString: aSearchString, |
|
53 linksOnly: aLinksOnly }); |
|
54 }, |
|
55 |
|
56 findAgain: function (aFindBackwards, aLinksOnly) { |
|
57 this._browser.messageManager.sendAsyncMessage("Finder:FindAgain", |
|
58 { findBackwards: aFindBackwards, |
|
59 linksOnly: aLinksOnly }); |
|
60 }, |
|
61 |
|
62 highlight: function (aHighlight, aWord) { |
|
63 this._browser.messageManager.sendAsyncMessage("Finder:Highlight", |
|
64 { highlight: aHighlight, |
|
65 word: aWord }); |
|
66 }, |
|
67 |
|
68 enableSelection: function () { |
|
69 this._browser.messageManager.sendAsyncMessage("Finder:EnableSelection"); |
|
70 }, |
|
71 |
|
72 removeSelection: function () { |
|
73 this._browser.messageManager.sendAsyncMessage("Finder:RemoveSelection"); |
|
74 }, |
|
75 |
|
76 focusContent: function () { |
|
77 this._browser.messageManager.sendAsyncMessage("Finder:FocusContent"); |
|
78 }, |
|
79 |
|
80 keyPress: function (aEvent) { |
|
81 this._browser.messageManager.sendAsyncMessage("Finder:KeyPress", |
|
82 { keyCode: aEvent.keyCode, |
|
83 shiftKey: aEvent.shiftKey }); |
|
84 } |
|
85 } |
|
86 |
|
87 function RemoteFinderListener(global) { |
|
88 let {Finder} = Cu.import("resource://gre/modules/Finder.jsm", {}); |
|
89 this._finder = new Finder(global.docShell); |
|
90 this._finder.addResultListener(this); |
|
91 this._global = global; |
|
92 |
|
93 for (let msg of this.MESSAGES) { |
|
94 global.addMessageListener(msg, this); |
|
95 } |
|
96 } |
|
97 |
|
98 RemoteFinderListener.prototype = { |
|
99 MESSAGES: [ |
|
100 "Finder:CaseSensitive", |
|
101 "Finder:FastFind", |
|
102 "Finder:FindAgain", |
|
103 "Finder:Highlight", |
|
104 "Finder:EnableSelection", |
|
105 "Finder:RemoveSelection", |
|
106 "Finder:FocusContent", |
|
107 "Finder:KeyPress" |
|
108 ], |
|
109 |
|
110 onFindResult: function (aData) { |
|
111 this._global.sendAsyncMessage("Finder:Result", aData); |
|
112 }, |
|
113 |
|
114 //XXXmikedeboer-20131016: implement |shouldFocusContent| here to mitigate |
|
115 // issues like bug 921338 and bug 921308. |
|
116 shouldFocusContent: function () { |
|
117 return true; |
|
118 }, |
|
119 |
|
120 receiveMessage: function (aMessage) { |
|
121 let data = aMessage.data; |
|
122 |
|
123 switch (aMessage.name) { |
|
124 case "Finder:CaseSensitive": |
|
125 this._finder.caseSensitive = data.caseSensitive; |
|
126 break; |
|
127 |
|
128 case "Finder:FastFind": |
|
129 this._finder.fastFind(data.searchString, data.linksOnly); |
|
130 break; |
|
131 |
|
132 case "Finder:FindAgain": |
|
133 this._finder.findAgain(data.findBackwards, data.linksOnly); |
|
134 break; |
|
135 |
|
136 case "Finder:Highlight": |
|
137 this._finder.highlight(data.highlight, data.word); |
|
138 break; |
|
139 |
|
140 case "Finder:RemoveSelection": |
|
141 this._finder.removeSelection(); |
|
142 break; |
|
143 |
|
144 case "Finder:FocusContent": |
|
145 this._finder.focusContent(); |
|
146 break; |
|
147 |
|
148 case "Finder:KeyPress": |
|
149 this._finder.keyPress(data); |
|
150 break; |
|
151 } |
|
152 } |
|
153 }; |