aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Kovar2010-09-26 22:15:54 -0500
committerAlex Kovar2010-09-26 22:15:54 -0500
commit41d7be473851a0caf43cddb228df225069d051bc (patch)
treeca047c7703d49da6b689e4303a043f28a2769a76
parent0d15a8fbdf78ab1a12783406bf678339882323a5 (diff)
downloadvimium-41d7be473851a0caf43cddb228df225069d051bc.tar.bz2
added initial code for "bookmark find mode"
-rw-r--r--background_page.html9
-rw-r--r--bookmarks.js159
-rw-r--r--commands.js7
-rw-r--r--manifest.json5
-rw-r--r--vimiumFrontend.js3
5 files changed, 178 insertions, 5 deletions
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;i<bookmarks.length;i++) {
+ console.log(bookmarks[i].title)
+ }
+ }
+ });
+
+ this.keyPressListener = new KeyPressListener({
+ keyDown: function(key) {
+ // shift key will toggle between new tab/same tab
+ if (event.keyCode == keyCodes.shiftKey) {
+ BookmarkMode.invertNewTabSetting();
+ shiftWasPressedWhileToggled = true
+ return
+ }
+
+ if(event.keyCode == keyCodes.enter) {
+ var bookmarksFound = BookmarkMode.bookmarksFound;
+ if(bookmarksFound && bookmarksFound.length>0) {
+ 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.