From 41d7be473851a0caf43cddb228df225069d051bc Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Sun, 26 Sep 2010 22:15:54 -0500 Subject: added initial code for "bookmark find mode" --- background_page.html | 9 ++- bookmarks.js | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++ commands.js | 7 ++- manifest.json | 5 +- vimiumFrontend.js | 3 +- 5 files changed, 178 insertions(+), 5 deletions(-) create mode 100644 bookmarks.js diff --git a/background_page.html b/background_page.html index 94595b2b..991992b8 100644 --- a/background_page.html +++ b/background_page.html @@ -60,7 +60,8 @@ getCurrentTabUrl: getCurrentTabUrl, getZoomLevel: getZoomLevel, saveZoomLevel: saveZoomLevel, - getSetting: getSetting + getSetting: getSetting, + getBookmarks: getBookmarks }; var sendRequestHandlers = { @@ -245,6 +246,12 @@ returnPort.postMessage({ key: args.key, value: value }); } + function getBookmarks(args, port) { + chrome.bookmarks.search(args.query, function(bookmarks) { + port.postMessage({bookmarks:bookmarks}) + }) + } + /* * Persists the current zoom level for a given domain */ diff --git a/bookmarks.js b/bookmarks.js new file mode 100644 index 00000000..fef4ed53 --- /dev/null +++ b/bookmarks.js @@ -0,0 +1,159 @@ + +function activateBookmarkFindModeToOpenInNewTab() { + BookmarkMode.openInNewTab(true) + BookmarkMode.enable() +} + +function activateBookmarkFindMode() { + BookmarkMode.openInNewTab(false) + BookmarkMode.enable() +} + +(function() { + // so when they let go of shift after hitting capital "B" it won't + // untoggle it + var shiftWasPressedWhileToggled = false; + + var BookmarkMode = { + isEnabled: function() { + return this.enabled + }, + openInNewTab: function(newTab) { + this.newTab = newTab + }, + invertNewTabSetting: function() { + this.newTab = !this.newTab; + if(this.isEnabled()) { + this.renderHUD() + } + }, + enable: function() { + this.enabled = true; + this.query = []; + + if(!this.initialized) { + initialize.call(this) + } + + this.renderHUD(); + + this.keyPressListener.enable(); + }, + disable: function() { + this.enabled = false; + this.keyPressListener.disable(); + HUD.hide(); + }, + getQueryString: function() { + return this.query.join("") + }, + find: function(query) { + this.finder.find(query) + }, + renderHUD: function() { + if (this.newTab) + HUD.show("Open bookmark in new tab"); + else + HUD.show("Open bookmark in current tab"); + } + + } + + // private method + var initialize = function() { + this.initialized = true; + this.finder = new BookmarkFinder({ + onResultsFound: function(bookmarks) { + BookmarkMode.bookmarksFound = bookmarks; + for(var i=0;i0) { + var url = bookmarksFound[0].url + if(BookmarkMode.newTab) + window.open(url) + else window.location=url + } + } + + var keyChar = getKeyChar(event); + if (!keyChar) + return; + + // TODO(philc): Ignore keys that have modifiers. + if (isEscape(event)) { + BookmarkMode.disable(); + } + else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) { + if (BookmarkMode.query.length == 0) { + BookmarkMode.disable(); + } else { + BookmarkMode.query.pop(); + } + } + else { + BookmarkMode.query.push(keyChar); + } + + BookmarkMode.finder.find(BookmarkMode.getQueryString()) + }, + keyUp: function(event) { + // shift key will toggle between new tab/same tab + if (event.keyCode == keyCodes.shiftKey && shiftWasPressedWhileToggled) { + BookmarkMode.invertNewTabSetting(); + shiftWasPressedWhileToggled = false + } + event.stopPropagation(); + event.preventDefault(); + } + }) + } + + var BookmarkFinder = function(config) { + this.port = chrome.extension.connect({ name: "getBookmarks" }) + this.port.onMessage.addListener(function(msg) { + (config.onResultsFound && config.onResultsFound(msg.bookmarks)) + }) + } + BookmarkFinder.prototype = { + find: function(query) { + console.log("You typed: " + query) + this.port.postMessage({query:query}) + } + } + + var KeyPressListener = function(handlers) { + this.handlers = handlers; + } + + KeyPressListener.prototype = { + enable: function() { + var handlers = this.handlers; + (handlers.keyDown && document.addEventListener("keydown", handlers.keyDown, true)); + (handlers.keyUp && document.addEventListener("keyup", handlers.keyUp, true)); + }, + disable: function() { + var handlers = this.handlers; + (handlers.keyDown && document.removeEventListener("keydown", handlers.keyDown, true)); + (handlers.keyUp && document.removeEventListener("keyup", handlers.keyUp, true)); + } + } + + //export global + window.BookmarkMode = BookmarkMode; + +}()) diff --git a/commands.js b/commands.js index a9fa0aba..e9a0bd41 100644 --- a/commands.js +++ b/commands.js @@ -127,6 +127,8 @@ function clearKeyMappingsAndSetDefaults() { mapKeyToCommand('t', 'createTab'); mapKeyToCommand('d', 'removeTab'); mapKeyToCommand('u', 'restoreTab'); + mapKeyToCommand('b', 'activateBookmarkFindMode'); + mapKeyToCommand('B', 'activateBookmarkFindModeToOpenInNewTab') } // Navigating the current page: @@ -157,6 +159,9 @@ addCommand('focusInput', 'Focus the first (or n-th) text box on the pag addCommand('activateLinkHintsMode', 'Enter link hints mode to open links in current tab'); addCommand('activateLinkHintsModeToOpenInNewTab', 'Enter link hints mode to open links in new tab'); +addCommand('activateBookmarkFindMode', 'Find bookmarks to open in current tab'); +addCommand('activateBookmarkFindModeToOpenInNewTab', 'Find bookmarks to open in new tab'); + addCommand('enterFindMode', 'Enter find mode'); addCommand('performFind', 'Cycle forward to the next find match'); addCommand('performBackwardsFind', 'Cycle backward to the previous find match'); @@ -192,5 +197,5 @@ var commandGroups = { tabManipulation: ["nextTab", "previousTab", "createTab", "removeTab", "restoreTab"], misc: - ["showHelp"] + ["showHelp", "activateBookmarkFindMode", "activateBookmarkFindModeToOpenInNewTab"] }; diff --git a/manifest.json b/manifest.json index 97966dd5..baba4e09 100644 --- a/manifest.json +++ b/manifest.json @@ -8,7 +8,7 @@ "background_page": "background_page.html", "options_page": "options.html", "permissions": [ - "tabs" + "tabs", "bookmarks" ], "content_scripts": [ { @@ -16,7 +16,8 @@ "js": ["lib/keyboardUtils.js", "lib/clipboard.js", "linkHints.js", - "vimiumFrontend.js" + "vimiumFrontend.js", + "bookmarks.js" ], "run_at": "document_start" } diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 334e3a77..da850909 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -202,6 +202,7 @@ function scrollFullPageDown() { window.scrollBy(0, window.innerHeight); } function scrollLeft() { window.scrollBy(-1 * settings["scrollStepSize"], 0); } function scrollRight() { window.scrollBy(settings["scrollStepSize"], 0); } + function focusInput(count) { var xpath = '//input[@type="text" or @type="search"]'; var results = document.evaluate(xpath, document.documentElement, null, @@ -272,7 +273,7 @@ function toggleViewSourceCallback(url) { function onKeydown(event) { var keyChar = ""; - if (linkHintsModeActivated) + if (linkHintsModeActivated || BookmarkMode.isEnabled()) return; // Ignore modifier keys by themselves. -- cgit v1.2.3 From 4d5039abc7e9ded987a48583415f2cbf29931ada Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Mon, 27 Sep 2010 10:20:52 -0500 Subject: disable bookmark find mode after successful hit --- bookmarks.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bookmarks.js b/bookmarks.js index fef4ed53..476e28ac 100644 --- a/bookmarks.js +++ b/bookmarks.js @@ -84,9 +84,14 @@ function activateBookmarkFindMode() { var bookmarksFound = BookmarkMode.bookmarksFound; if(bookmarksFound && bookmarksFound.length>0) { var url = bookmarksFound[0].url - if(BookmarkMode.newTab) + if(BookmarkMode.newTab) { + BookmarkMode.disable(); window.open(url) - else window.location=url + } + else { + BookmarkMode.disable(); + window.location=url + } } } -- cgit v1.2.3 From b2f3db6fe2a3ff8887c5961b868bebf530c4cfaf Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Mon, 27 Sep 2010 10:49:07 -0500 Subject: added bookmarklet support to bookmark mode --- bookmarks.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/bookmarks.js b/bookmarks.js index 476e28ac..ad57e1bf 100644 --- a/bookmarks.js +++ b/bookmarks.js @@ -84,14 +84,19 @@ function activateBookmarkFindMode() { var bookmarksFound = BookmarkMode.bookmarksFound; if(bookmarksFound && bookmarksFound.length>0) { var url = bookmarksFound[0].url - if(BookmarkMode.newTab) { - BookmarkMode.disable(); - window.open(url) + if(url.indexOf("javascript:")===0) { + eval(url.substr(11, url.length)) } else { - BookmarkMode.disable(); - window.location=url + if(BookmarkMode.newTab) { + window.open(url) + } + else { + window.location=url + } } + + BookmarkMode.disable(); } } @@ -115,6 +120,8 @@ function activateBookmarkFindMode() { } BookmarkMode.finder.find(BookmarkMode.getQueryString()) + event.stopPropagation(); + event.preventDefault(); }, keyUp: function(event) { // shift key will toggle between new tab/same tab -- cgit v1.2.3 From 1ac943ca7aa3f4bcb51f08f4475de1e0c8eaa458 Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Mon, 27 Sep 2010 18:12:32 -0500 Subject: simplified bookmarklet handling --- bookmarks.js | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/bookmarks.js b/bookmarks.js index ad57e1bf..faa82148 100644 --- a/bookmarks.js +++ b/bookmarks.js @@ -84,16 +84,15 @@ function activateBookmarkFindMode() { var bookmarksFound = BookmarkMode.bookmarksFound; if(bookmarksFound && bookmarksFound.length>0) { var url = bookmarksFound[0].url - if(url.indexOf("javascript:")===0) { - eval(url.substr(11, url.length)) + var isABookmarklet = function(url) { + return url.indexOf("javascript:")===0 + } + + if(!BookmarkMode.newTab || isABookmarklet(url)) { + window.location=url } else { - if(BookmarkMode.newTab) { - window.open(url) - } - else { - window.location=url - } + window.open(url) } BookmarkMode.disable(); -- cgit v1.2.3 From 1681cf216f355bf3492946fc3b57c012b7143134 Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Mon, 27 Sep 2010 18:34:17 -0500 Subject: moved commands to navigation group --- commands.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/commands.js b/commands.js index fb264510..0992900d 100644 --- a/commands.js +++ b/commands.js @@ -199,11 +199,13 @@ var commandGroups = { "reload", "toggleViewSource", "zoomIn", "zoomOut", "copyCurrentUrl", "goUp", "enterInsertMode", "focusInput", "activateLinkHintsMode", "activateLinkHintsModeToOpenInNewTab", "activateLinkHintsModeWithQueue", - "enterFindMode", "performFind", "performBackwardsFind", "nextFrame"], + "enterFindMode", "performFind", "performBackwardsFind", "nextFrame", + "activateBookmarkFindMode", "activateBookmarkFindModeToOpenInNewTab" + ], historyNavigation: ["goBack", "goForward"], tabManipulation: ["nextTab", "previousTab", "createTab", "removeTab", "restoreTab"], misc: - ["showHelp", "activateBookmarkFindMode", "activateBookmarkFindModeToOpenInNewTab"] + ["showHelp"] }; -- cgit v1.2.3 From 58e494b82b5fee3662fca48543f86caabb16fc48 Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Mon, 27 Sep 2010 18:36:39 -0500 Subject: added bookmark commands to readme --- README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.markdown b/README.markdown index 36e267bf..449acd6a 100644 --- a/README.markdown +++ b/README.markdown @@ -37,6 +37,8 @@ Navigating the current page: f activate link hints mode to open in current tab F activate link hints mode to open in new tab activate link hints mode to open multiple links in a new tab + b activate bookmark find mode to open in current tab + B activate bookmark find mode to open in new tab r reload gs view source zi zoom in -- cgit v1.2.3 From 8feb7df5e4185e2f28262a3524f7fb3d9b1e470d Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Wed, 20 Oct 2010 18:03:23 -0500 Subject: initial code for bookmark mode completion dialog --- bookmarks.js | 97 ++++++++++++++++---------------- completionDialog.js | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++ lib/keyboardUtils.js | 22 ++++++++ manifest.json | 1 + 4 files changed, 225 insertions(+), 50 deletions(-) create mode 100644 completionDialog.js diff --git a/bookmarks.js b/bookmarks.js index faa82148..6708067e 100644 --- a/bookmarks.js +++ b/bookmarks.js @@ -36,12 +36,14 @@ function activateBookmarkFindMode() { } this.renderHUD(); + this.completionDialog.show(); this.keyPressListener.enable(); }, disable: function() { this.enabled = false; this.keyPressListener.disable(); + this.completionDialog.hide() HUD.hide(); }, getQueryString: function() { @@ -61,71 +63,84 @@ function activateBookmarkFindMode() { // private method var initialize = function() { + var self = this; this.initialized = true; this.finder = new BookmarkFinder({ onResultsFound: function(bookmarks) { - BookmarkMode.bookmarksFound = bookmarks; - for(var i=0;i10) { + bookmarks=bookmarks.slice(0, 10) } + self.completionDialog.showCompletions(self.getQueryString(), bookmarks) } }); + this.completionDialog = new CompletionDialog({ + onSelect: function(selection) { + var url = selection.url + var isABookmarklet = function(url) { + return url.indexOf("javascript:")===0 + } + + if(!self.newTab || isABookmarklet(url)) { + window.location=url + } + else { + window.open(url) + } + + self.disable(); + }, + renderOption: function(searchString, selection) { + + var displaytext = selection.title + " (" + selection.url + ")" + + if(displaytext.length>70) { + displaytext = displaytext.substr(0, 70)+"..." + } + + return displaytext.split(new RegExp(searchString, "i")).join(""+searchString+"") + }, + initialSearchText: "Type a bookmark name or URL" + }) + this.keyPressListener = new KeyPressListener({ - keyDown: function(key) { + keyDown: function(event) { // shift key will toggle between new tab/same tab if (event.keyCode == keyCodes.shiftKey) { - BookmarkMode.invertNewTabSetting(); + self.invertNewTabSetting(); shiftWasPressedWhileToggled = true return } - if(event.keyCode == keyCodes.enter) { - var bookmarksFound = BookmarkMode.bookmarksFound; - if(bookmarksFound && bookmarksFound.length>0) { - var url = bookmarksFound[0].url - var isABookmarklet = function(url) { - return url.indexOf("javascript:")===0 - } - - if(!BookmarkMode.newTab || isABookmarklet(url)) { - window.location=url - } - else { - window.open(url) - } - - BookmarkMode.disable(); - } - } - var keyChar = getKeyChar(event); if (!keyChar) return; // TODO(philc): Ignore keys that have modifiers. if (isEscape(event)) { - BookmarkMode.disable(); + self.disable(); } else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) { - if (BookmarkMode.query.length == 0) { - BookmarkMode.disable(); + if (self.query.length == 0) { + self.disable(); } else { - BookmarkMode.query.pop(); + self.query.pop(); + self.finder.find(self.getQueryString()) } } - else { - BookmarkMode.query.push(keyChar); + else if(keyChar!=="up" && keyChar!=="down" && keyChar!=="left" && keyChar!="right") { + self.query.push(keyChar); + self.finder.find(self.getQueryString()) } - BookmarkMode.finder.find(BookmarkMode.getQueryString()) event.stopPropagation(); event.preventDefault(); }, keyUp: function(event) { // shift key will toggle between new tab/same tab if (event.keyCode == keyCodes.shiftKey && shiftWasPressedWhileToggled) { - BookmarkMode.invertNewTabSetting(); + self.invertNewTabSetting(); shiftWasPressedWhileToggled = false } event.stopPropagation(); @@ -142,28 +157,10 @@ function activateBookmarkFindMode() { } BookmarkFinder.prototype = { find: function(query) { - console.log("You typed: " + query) this.port.postMessage({query:query}) } } - var KeyPressListener = function(handlers) { - this.handlers = handlers; - } - - KeyPressListener.prototype = { - enable: function() { - var handlers = this.handlers; - (handlers.keyDown && document.addEventListener("keydown", handlers.keyDown, true)); - (handlers.keyUp && document.addEventListener("keyup", handlers.keyUp, true)); - }, - disable: function() { - var handlers = this.handlers; - (handlers.keyDown && document.removeEventListener("keydown", handlers.keyDown, true)); - (handlers.keyUp && document.removeEventListener("keyup", handlers.keyUp, true)); - } - } - //export global window.BookmarkMode = BookmarkMode; diff --git a/completionDialog.js b/completionDialog.js new file mode 100644 index 00000000..f7ebefa5 --- /dev/null +++ b/completionDialog.js @@ -0,0 +1,155 @@ +(function(window, document) { + + var CompletionDialog = function(options) { + this.options = options + } + + CompletionDialog.prototype = { + show: function() { + this.showCompletions() + }, + showCompletions: function(searchString, completions) { + this.searchString = searchString; + this.completions = completions; + if(!this.initialized) { + initialize.call(this); + this.initialized=true; + } + var container = this.getDisplayElement() + clearChildren(container); + + if(searchString===undefined) { + this.container.className = "dialog"; + createDivInside(container).innerHTML=this.options.initialSearchText || "Begin typing" + } + else { + this.container.className = "dialog completions"; + var searchBar = createDivInside(container) + searchBar.innerHTML=searchString + searchBar.className="searchBar" + + searchResults = createDivInside(container) + searchResults.className="searchResults" + if(completions.length<=0) { + var resultDiv = createDivInside(searchResults) + resultDiv.className="noResults" + resultDiv.innerHTML="No results found" + } + else { + for(var i=0;i0) { + self.currentSelection-=1; + } + self.showCompletions(self.searchString, self.completions) + } + else if(keyChar==="down") { + if(self.currentSelection= 1) { + elem.removeChild(elem.firstChild); + } + } + } + + var completionCSS = ".dialog {"+ + "position:fixed;"+ + "background-color: #ebebeb;" + + "z-index: 99999998;" + + "border: 1px solid #b3b3b3;" + + "font-size: 12px;" + + "text-align:left;"+ + "color: black;" + + "padding:10px;"+ + "border-radius: 4px;" + + "font-family: Lucida Grande, Arial, Sans;" + + "}"+ + ".completions {"+ + "width:400px;"+ + "}"+ + ".completions .searchBar {"+ + "border-bottom: 1px solid #b3b3b3;"+ + "}"+ + ".completions .searchResults {"+ + "}"+ + ".completions .searchResults .selected{"+ + "background-color:#aaa;"+ + "border-radius: 4px;" + + "}"+ + ".completions div{"+ + "padding:4px;"+ + "}"+ + ".completions div strong{"+ + "font-weight:bold;"+ + "}"+ + ".completions .noResults{"+ + "color:#555;"+ + "}"; + + window.CompletionDialog = CompletionDialog; + +}(window, document)) diff --git a/lib/keyboardUtils.js b/lib/keyboardUtils.js index 98725d95..60eb487f 100644 --- a/lib/keyboardUtils.js +++ b/lib/keyboardUtils.js @@ -61,3 +61,25 @@ function isEscape(event) { return event.keyCode == keyCodes.ESC || (event.ctrlKey && getKeyChar(event) == '['); // c-[ is mapped to ESC in Vim by default. } + +var KeyPressListener = function(handlers) { + this.handlers = handlers; +} + +KeyPressListener.prototype = { + enable: function() { + var handlers = this.handlers; + var wrapper = function(callback){ + return function(event) { + callback(event) + } + } + (handlers.keyDown && document.addEventListener("keydown", handlers.keyDown, true)); + (handlers.keyUp && document.addEventListener("keyup", handlers.keyUp, true)); + }, + disable: function() { + var handlers = this.handlers; + (handlers.keyDown && document.removeEventListener("keydown", handlers.keyDown, true)); + (handlers.keyUp && document.removeEventListener("keyup", handlers.keyUp, true)); + } +} diff --git a/manifest.json b/manifest.json index 878d8b5c..b8203717 100644 --- a/manifest.json +++ b/manifest.json @@ -20,6 +20,7 @@ "lib/clipboard.js", "linkHints.js", "vimiumFrontend.js", + "completionDialog.js", "bookmarks.js" ], "run_at": "document_start", -- cgit v1.2.3 From acb7172b27b05fcefbeee53d819410ed7d694b29 Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Sat, 30 Oct 2010 17:39:31 -0500 Subject: fixed height for search bar --- completionDialog.js | 1 + 1 file changed, 1 insertion(+) diff --git a/completionDialog.js b/completionDialog.js index f7ebefa5..927242f5 100644 --- a/completionDialog.js +++ b/completionDialog.js @@ -132,6 +132,7 @@ "width:400px;"+ "}"+ ".completions .searchBar {"+ + "height: 15px;"+ "border-bottom: 1px solid #b3b3b3;"+ "}"+ ".completions .searchResults {"+ -- cgit v1.2.3 From 9b7b313930beb1ddf0f132993caa8f59ff319e06 Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Sat, 30 Oct 2010 17:41:15 -0500 Subject: strong color --- completionDialog.js | 1 + 1 file changed, 1 insertion(+) diff --git a/completionDialog.js b/completionDialog.js index 927242f5..377f9b90 100644 --- a/completionDialog.js +++ b/completionDialog.js @@ -145,6 +145,7 @@ "padding:4px;"+ "}"+ ".completions div strong{"+ + "color: black;" + "font-weight:bold;"+ "}"+ ".completions .noResults{"+ -- cgit v1.2.3 From 94da6e9fd2adbc4887b04d8d5b3b0dd9eeffdbbc Mon Sep 17 00:00:00 2001 From: Alex Kovar Date: Sun, 31 Oct 2010 12:55:36 -0500 Subject: refacted completion dialog to handle key inputs on its own --- bookmarks.js | 50 +++++----------------- completionDialog.js | 119 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 80 insertions(+), 89 deletions(-) diff --git a/bookmarks.js b/bookmarks.js index 6708067e..1ec0c3d1 100644 --- a/bookmarks.js +++ b/bookmarks.js @@ -29,7 +29,6 @@ function activateBookmarkFindMode() { }, enable: function() { this.enabled = true; - this.query = []; if(!this.initialized) { initialize.call(this) @@ -46,12 +45,6 @@ function activateBookmarkFindMode() { this.completionDialog.hide() HUD.hide(); }, - getQueryString: function() { - return this.query.join("") - }, - find: function(query) { - this.finder.find(query) - }, renderHUD: function() { if (this.newTab) HUD.show("Open bookmark in new tab"); @@ -64,18 +57,10 @@ function activateBookmarkFindMode() { // private method var initialize = function() { var self = this; - this.initialized = true; - this.finder = new BookmarkFinder({ - onResultsFound: function(bookmarks) { - self.bookmarksFound = bookmarks; - if(bookmarks.length>10) { - bookmarks=bookmarks.slice(0, 10) - } - self.completionDialog.showCompletions(self.getQueryString(), bookmarks) - } - }); + self.initialized = true; - this.completionDialog = new CompletionDialog({ + self.completionDialog = new CompletionDialog({ + source: findBookmarks, onSelect: function(selection) { var url = selection.url var isABookmarklet = function(url) { @@ -121,18 +106,6 @@ function activateBookmarkFindMode() { if (isEscape(event)) { self.disable(); } - else if (event.keyCode == keyCodes.backspace || event.keyCode == keyCodes.deleteKey) { - if (self.query.length == 0) { - self.disable(); - } else { - self.query.pop(); - self.finder.find(self.getQueryString()) - } - } - else if(keyChar!=="up" && keyChar!=="down" && keyChar!=="left" && keyChar!="right") { - self.query.push(keyChar); - self.finder.find(self.getQueryString()) - } event.stopPropagation(); event.preventDefault(); @@ -149,17 +122,14 @@ function activateBookmarkFindMode() { }) } - var BookmarkFinder = function(config) { - this.port = chrome.extension.connect({ name: "getBookmarks" }) - this.port.onMessage.addListener(function(msg) { - (config.onResultsFound && config.onResultsFound(msg.bookmarks)) + var findBookmarks = function(searchString, callback) { + var port = chrome.extension.connect({ name: "getBookmarks" }) + port.onMessage.addListener(function(msg) { + callback(msg.bookmarks) + port = null }) - } - BookmarkFinder.prototype = { - find: function(query) { - this.port.postMessage({query:query}) - } - } + port.postMessage({query:searchString}) + }; //export global window.BookmarkMode = BookmarkMode; diff --git a/completionDialog.js b/completionDialog.js index 377f9b90..c5c6722b 100644 --- a/completionDialog.js +++ b/completionDialog.js @@ -6,53 +6,17 @@ CompletionDialog.prototype = { show: function() { - this.showCompletions() - }, - showCompletions: function(searchString, completions) { - this.searchString = searchString; - this.completions = completions; - if(!this.initialized) { - initialize.call(this); - this.initialized=true; - } - var container = this.getDisplayElement() - clearChildren(container); - - if(searchString===undefined) { - this.container.className = "dialog"; - createDivInside(container).innerHTML=this.options.initialSearchText || "Begin typing" - } - else { - this.container.className = "dialog completions"; - var searchBar = createDivInside(container) - searchBar.innerHTML=searchString - searchBar.className="searchBar" - - searchResults = createDivInside(container) - searchResults.className="searchResults" - if(completions.length<=0) { - var resultDiv = createDivInside(searchResults) - resultDiv.className="noResults" - resultDiv.innerHTML="No results found" - } - else { - for(var i=0;i0) { self.currentSelection-=1; } - self.showCompletions(self.searchString, self.completions) + render.call(self,self.getQueryString(), self.completions) } else if(keyChar==="down") { if(self.currentSelection 0) { + self.query.pop(); + self.options.source(self.getQueryString(), function(completions) { + render.call(self, self.getQueryString(), completions) + }) + } + } + else if(keyChar!=="left" && keyChar!="right") { + self.query.push(keyChar); + self.options.source(self.getQueryString(), function(completions) { + render.call(self, self.getQueryString(), completions) + }) + } event.stopPropagation(); event.preventDefault(); @@ -102,6 +84,45 @@ }) } + var render = function(searchString, completions) { + if(this.isShown) { + this.searchString = searchString; + this.completions = completions; + var container = this.getDisplayElement() + clearChildren(container); + + if(searchString===undefined) { + this.container.className = "dialog"; + createDivInside(container).innerHTML=this.options.initialSearchText || "Begin typing" + } + else { + this.container.className = "dialog completions"; + var searchBar = createDivInside(container) + searchBar.innerHTML=searchString + searchBar.className="searchBar" + + searchResults = createDivInside(container) + searchResults.className="searchResults" + if(completions.length<=0) { + var resultDiv = createDivInside(searchResults) + resultDiv.className="noResults" + resultDiv.innerHTML="No results found" + } + else { + for(var i=0;i