michael@0: // -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: // This Source Code Form is subject to the terms of the Mozilla Public michael@0: // License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: // file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: this.EXPORTED_SYMBOLS = ["RemoteFinder", "RemoteFinderListener"]; michael@0: michael@0: const Ci = Components.interfaces; michael@0: const Cc = Components.classes; michael@0: const Cu = Components.utils; michael@0: michael@0: Cu.import("resource://gre/modules/XPCOMUtils.jsm"); michael@0: michael@0: function RemoteFinder(browser) { michael@0: this._browser = browser; michael@0: this._listeners = []; michael@0: this._searchString = null; michael@0: michael@0: this._browser.messageManager.addMessageListener("Finder:Result", this); michael@0: this._browser.messageManager.sendAsyncMessage("Finder:Initialize"); michael@0: } michael@0: michael@0: RemoteFinder.prototype = { michael@0: addResultListener: function (aListener) { michael@0: if (this._listeners.indexOf(aListener) === -1) michael@0: this._listeners.push(aListener); michael@0: }, michael@0: michael@0: removeResultListener: function (aListener) { michael@0: this._listeners = this._listeners.filter(l => l != aListener); michael@0: }, michael@0: michael@0: receiveMessage: function (aMessage) { michael@0: this._searchString = aMessage.data.searchString; michael@0: michael@0: for (let l of this._listeners) { michael@0: l.onFindResult(aMessage.data); michael@0: } michael@0: }, michael@0: michael@0: get searchString() { michael@0: return this._searchString; michael@0: }, michael@0: michael@0: set caseSensitive(aSensitive) { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:CaseSensitive", michael@0: { caseSensitive: aSensitive }); michael@0: }, michael@0: michael@0: fastFind: function (aSearchString, aLinksOnly) { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:FastFind", michael@0: { searchString: aSearchString, michael@0: linksOnly: aLinksOnly }); michael@0: }, michael@0: michael@0: findAgain: function (aFindBackwards, aLinksOnly) { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:FindAgain", michael@0: { findBackwards: aFindBackwards, michael@0: linksOnly: aLinksOnly }); michael@0: }, michael@0: michael@0: highlight: function (aHighlight, aWord) { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:Highlight", michael@0: { highlight: aHighlight, michael@0: word: aWord }); michael@0: }, michael@0: michael@0: enableSelection: function () { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:EnableSelection"); michael@0: }, michael@0: michael@0: removeSelection: function () { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:RemoveSelection"); michael@0: }, michael@0: michael@0: focusContent: function () { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:FocusContent"); michael@0: }, michael@0: michael@0: keyPress: function (aEvent) { michael@0: this._browser.messageManager.sendAsyncMessage("Finder:KeyPress", michael@0: { keyCode: aEvent.keyCode, michael@0: shiftKey: aEvent.shiftKey }); michael@0: } michael@0: } michael@0: michael@0: function RemoteFinderListener(global) { michael@0: let {Finder} = Cu.import("resource://gre/modules/Finder.jsm", {}); michael@0: this._finder = new Finder(global.docShell); michael@0: this._finder.addResultListener(this); michael@0: this._global = global; michael@0: michael@0: for (let msg of this.MESSAGES) { michael@0: global.addMessageListener(msg, this); michael@0: } michael@0: } michael@0: michael@0: RemoteFinderListener.prototype = { michael@0: MESSAGES: [ michael@0: "Finder:CaseSensitive", michael@0: "Finder:FastFind", michael@0: "Finder:FindAgain", michael@0: "Finder:Highlight", michael@0: "Finder:EnableSelection", michael@0: "Finder:RemoveSelection", michael@0: "Finder:FocusContent", michael@0: "Finder:KeyPress" michael@0: ], michael@0: michael@0: onFindResult: function (aData) { michael@0: this._global.sendAsyncMessage("Finder:Result", aData); michael@0: }, michael@0: michael@0: //XXXmikedeboer-20131016: implement |shouldFocusContent| here to mitigate michael@0: // issues like bug 921338 and bug 921308. michael@0: shouldFocusContent: function () { michael@0: return true; michael@0: }, michael@0: michael@0: receiveMessage: function (aMessage) { michael@0: let data = aMessage.data; michael@0: michael@0: switch (aMessage.name) { michael@0: case "Finder:CaseSensitive": michael@0: this._finder.caseSensitive = data.caseSensitive; michael@0: break; michael@0: michael@0: case "Finder:FastFind": michael@0: this._finder.fastFind(data.searchString, data.linksOnly); michael@0: break; michael@0: michael@0: case "Finder:FindAgain": michael@0: this._finder.findAgain(data.findBackwards, data.linksOnly); michael@0: break; michael@0: michael@0: case "Finder:Highlight": michael@0: this._finder.highlight(data.highlight, data.word); michael@0: break; michael@0: michael@0: case "Finder:RemoveSelection": michael@0: this._finder.removeSelection(); michael@0: break; michael@0: michael@0: case "Finder:FocusContent": michael@0: this._finder.focusContent(); michael@0: break; michael@0: michael@0: case "Finder:KeyPress": michael@0: this._finder.keyPress(data); michael@0: break; michael@0: } michael@0: } michael@0: };