Last active
August 29, 2015 13:57
-
-
Save yajd/9381934 to your computer and use it in GitHub Desktop.
_ff-addon-snippet-FindAndSelectAllNonFindBar - wip i dont understand the state listener stuff
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var doc = gBrowser.contentDocument; | |
| var ctrler = _getSelectionController(doc.defaultView); | |
| var searchRange = doc.createRange(); | |
| searchRange.selectNodeContents(doc.documentElement); | |
| let startPt = searchRange.cloneRange(); | |
| startPt.collapse(true); | |
| let endPt = searchRange.cloneRange(); | |
| endPt.collapse(false); | |
| let retRange = null; | |
| let finder = Cc["@mozilla.org/embedcomp/rangefind;1"].createInstance().QueryInterface(Ci.nsIFind); | |
| finder.caseSensitive = false; | |
| var i = 0; | |
| while (retRange = finder.Find('the', searchRange, startPt, endPt)) { | |
| i++; | |
| var stCont = retRange.startContainer; | |
| var endCont = retRange.endContainer; | |
| console.log('retRange(' + i + ') = ', retRange); | |
| console.log('var txt = retRange.commonAncestorContainer.data',retRange.commonAncestorContainer.data); | |
| //now test if one posiion before startOffset and one position after endOffset are WORD characters | |
| var isOneCharBeforeStCharWordChar; //var that holds if the character before the start character is a word character | |
| if (retRange.startOffset == 0) { | |
| //no characters befor this characte so obviously not a word char | |
| isOneCharBeforeStCharWordChar = false; | |
| } else { | |
| var oneCharBeforeStChar = stCont.data.substr(retRange.startOffset-1,1); | |
| if (/\w/.test(oneCharBeforeStChar)) { | |
| isOneCharBeforeStCharWordChar = true; | |
| } else { | |
| isOneCharBeforeStCharWordChar = false; | |
| } | |
| console.log('oneCharBeforeStChar',oneCharBeforeStChar); | |
| } | |
| var isOneCharAfterEndCharWordChar; //var that holds if the character before the start character is a word character | |
| if (retRange.endOffset == endCont.length - 1) { | |
| //no characters after this characte so obviously not a word char | |
| isOneCharAfterEndCharWordChar = false; | |
| } else { | |
| var oneCharAferEndChar = endCont.data.substr(retRange.endOffset,1); //no need to subtract 1 from endOffset, it takes into account substr 2nd arg is length and is treated like length I THINK | |
| if (/\w/.test(oneCharAferEndChar)) { | |
| isOneCharAfterEndCharWordChar = true; | |
| } else { | |
| isOneCharAfterEndCharWordChar = false; | |
| } | |
| console.log('oneCharAferEndChar',oneCharAferEndChar); | |
| } | |
| if (isOneCharBeforeStCharWordChar == false && isOneCharAfterEndCharWordChar == false) { | |
| //highlight it as surrounding characters are no word characters | |
| _highlightRange(retRange, ctrler); | |
| console.log('highlighted it as it was not surrounded by word charactes'); | |
| } else { | |
| console.log('NOT hilte it as it was not surrounded by word charactes'); | |
| } | |
| //break; | |
| startPt = retRange.cloneRange(); | |
| startPt.collapse(false); | |
| } | |
| //_highlightRange(searchRange,_getSelectionController(gBrowser.contentWindow)) | |
| /********/ | |
| function _getEditableNode(aNode) { | |
| while (aNode) { | |
| if (aNode instanceof Ci.nsIDOMNSEditableElement) | |
| return aNode.editor ? aNode : null; | |
| aNode = aNode.parentNode; | |
| } | |
| return null; | |
| } | |
| var _editors; | |
| var _stateListeners; | |
| function _highlightRange(aRange, aController) { | |
| let node = aRange.startContainer; | |
| let controller = aController; | |
| let editableNode = _getEditableNode(node); | |
| if (editableNode) | |
| controller = editableNode.editor.selectionController; | |
| let findSelection = controller.getSelection(128); //i used random instead of //(Ci.nsISelectionController.SELECTION_FIND); | |
| findSelection.addRange(aRange); | |
| //i dont understand stateListener stuff | |
| /* | |
| if (editableNode) { | |
| // Highlighting added, so cache this editor, and hook up listeners | |
| // to ensure we deal properly with edits within the highlighting | |
| if (!_editors) { | |
| _editors = []; | |
| _stateListeners = []; | |
| } | |
| let existingIndex = _editors.indexOf(editableNode.editor); | |
| if (existingIndex == -1) { | |
| let x = _editors.length; | |
| _editors[x] = editableNode.editor; | |
| _stateListeners[x] = _createStateListener(); | |
| _editors[x].addEditActionListener(this); | |
| _editors[x].addDocumentStateListener(_stateListeners[x]); | |
| } | |
| } | |
| */ | |
| } | |
| function _getSelectionController(aWindow) { | |
| // display: none iframes don't have a selection controller, see bug 493658 | |
| if (!aWindow.innerWidth || !aWindow.innerHeight) | |
| return null; | |
| // Yuck. See bug 138068. | |
| let docShell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor) | |
| .getInterface(Ci.nsIWebNavigation) | |
| .QueryInterface(Ci.nsIDocShell); | |
| let controller = docShell.QueryInterface(Ci.nsIInterfaceRequestor) | |
| .getInterface(Ci.nsISelectionDisplay) | |
| .QueryInterface(Ci.nsISelectionController); | |
| return controller; | |
| } | |
| function _createStateListener() { | |
| return { | |
| findbar: this, | |
| QueryInterface: function(aIID) { | |
| if (aIID.equals(Ci.nsIDocumentStateListener) || | |
| aIID.equals(Ci.nsISupports)) | |
| return this; | |
| throw Components.results.NS_ERROR_NO_INTERFACE; | |
| }, | |
| NotifyDocumentWillBeDestroyed: function() { | |
| this.findbar._onEditorDestruction(this); | |
| }, | |
| // Unimplemented | |
| notifyDocumentCreated: function() {}, | |
| notifyDocumentStateChanged: function(aDirty) {} | |
| }; | |
| } | |
| //http://mxr.mozilla.org/mozilla-release/source/toolkit/modules/Finder.jsm?raw=1 | |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
http://mxr.mozilla.org/mozilla-release/source/content/base/public/nsISelectionController.idl#30
its all about nsISelectionController and nsISelectionDisplay i dont understand that and state listener