2013-09-14 03:27:19 +04:00
|
|
|
// -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
// 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/.
|
|
|
|
|
|
|
|
this.EXPORTED_SYMBOLS = ["RemoteFinder", "RemoteFinderListener"];
|
|
|
|
|
|
|
|
const Ci = Components.interfaces;
|
|
|
|
const Cc = Components.classes;
|
|
|
|
const Cu = Components.utils;
|
|
|
|
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
|
|
|
|
function RemoteFinder(browser) {
|
|
|
|
this._browser = browser;
|
|
|
|
this._listeners = [];
|
|
|
|
this._searchString = null;
|
|
|
|
|
|
|
|
this._browser.messageManager.addMessageListener("Finder:Result", this);
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:Initialize");
|
|
|
|
}
|
|
|
|
|
|
|
|
RemoteFinder.prototype = {
|
|
|
|
addResultListener: function (aListener) {
|
|
|
|
if (this._listeners.indexOf(aListener) === -1)
|
|
|
|
this._listeners.push(aListener);
|
|
|
|
},
|
|
|
|
|
|
|
|
removeResultListener: function (aListener) {
|
|
|
|
this._listeners = this._listeners.filter(l => l != aListener);
|
|
|
|
},
|
|
|
|
|
|
|
|
receiveMessage: function (aMessage) {
|
|
|
|
this._searchString = aMessage.data.searchString;
|
|
|
|
|
|
|
|
for (let l of this._listeners) {
|
2014-01-14 05:58:33 +04:00
|
|
|
l.onFindResult(aMessage.data);
|
2013-09-14 03:27:19 +04:00
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
get searchString() {
|
|
|
|
return this._searchString;
|
|
|
|
},
|
|
|
|
|
|
|
|
set caseSensitive(aSensitive) {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:CaseSensitive",
|
|
|
|
{ caseSensitive: aSensitive });
|
|
|
|
},
|
|
|
|
|
|
|
|
fastFind: function (aSearchString, aLinksOnly) {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:FastFind",
|
|
|
|
{ searchString: aSearchString,
|
|
|
|
linksOnly: aLinksOnly });
|
|
|
|
},
|
|
|
|
|
|
|
|
findAgain: function (aFindBackwards, aLinksOnly) {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:FindAgain",
|
|
|
|
{ findBackwards: aFindBackwards,
|
|
|
|
linksOnly: aLinksOnly });
|
|
|
|
},
|
|
|
|
|
|
|
|
highlight: function (aHighlight, aWord) {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:Highlight",
|
|
|
|
{ highlight: aHighlight,
|
|
|
|
word: aWord });
|
|
|
|
},
|
|
|
|
|
2013-10-16 04:02:23 +04:00
|
|
|
enableSelection: function () {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:EnableSelection");
|
|
|
|
},
|
|
|
|
|
2013-09-14 03:27:19 +04:00
|
|
|
removeSelection: function () {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:RemoveSelection");
|
|
|
|
},
|
|
|
|
|
|
|
|
focusContent: function () {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:FocusContent");
|
|
|
|
},
|
|
|
|
|
|
|
|
keyPress: function (aEvent) {
|
|
|
|
this._browser.messageManager.sendAsyncMessage("Finder:KeyPress",
|
|
|
|
{ keyCode: aEvent.keyCode,
|
|
|
|
shiftKey: aEvent.shiftKey });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function RemoteFinderListener(global) {
|
|
|
|
let {Finder} = Cu.import("resource://gre/modules/Finder.jsm", {});
|
|
|
|
this._finder = new Finder(global.docShell);
|
|
|
|
this._finder.addResultListener(this);
|
|
|
|
this._global = global;
|
|
|
|
|
|
|
|
for (let msg of this.MESSAGES) {
|
|
|
|
global.addMessageListener(msg, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RemoteFinderListener.prototype = {
|
|
|
|
MESSAGES: [
|
|
|
|
"Finder:CaseSensitive",
|
|
|
|
"Finder:FastFind",
|
|
|
|
"Finder:FindAgain",
|
|
|
|
"Finder:Highlight",
|
2013-10-16 04:02:23 +04:00
|
|
|
"Finder:EnableSelection",
|
2013-09-14 03:27:19 +04:00
|
|
|
"Finder:RemoveSelection",
|
|
|
|
"Finder:FocusContent",
|
|
|
|
"Finder:KeyPress"
|
|
|
|
],
|
|
|
|
|
2014-01-14 05:58:33 +04:00
|
|
|
onFindResult: function (aData) {
|
|
|
|
this._global.sendAsyncMessage("Finder:Result", aData);
|
2013-09-14 03:27:19 +04:00
|
|
|
},
|
|
|
|
|
2013-10-16 19:04:49 +04:00
|
|
|
//XXXmikedeboer-20131016: implement |shouldFocusContent| here to mitigate
|
|
|
|
// issues like bug 921338 and bug 921308.
|
|
|
|
shouldFocusContent: function () {
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
2013-09-14 03:27:19 +04:00
|
|
|
receiveMessage: function (aMessage) {
|
|
|
|
let data = aMessage.data;
|
|
|
|
|
|
|
|
switch (aMessage.name) {
|
|
|
|
case "Finder:CaseSensitive":
|
|
|
|
this._finder.caseSensitive = data.caseSensitive;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Finder:FastFind":
|
|
|
|
this._finder.fastFind(data.searchString, data.linksOnly);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Finder:FindAgain":
|
|
|
|
this._finder.findAgain(data.findBackwards, data.linksOnly);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Finder:Highlight":
|
|
|
|
this._finder.highlight(data.highlight, data.word);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Finder:RemoveSelection":
|
|
|
|
this._finder.removeSelection();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Finder:FocusContent":
|
|
|
|
this._finder.focusContent();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case "Finder:KeyPress":
|
|
|
|
this._finder.keyPress(data);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|