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" --- vimiumFrontend.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'vimiumFrontend.js') 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 ca062014c56ef9f650754ea17780a461521814f6 Mon Sep 17 00:00:00 2001 From: Bill Casarin Date: Thu, 23 Sep 2010 02:17:24 -0400 Subject: Added narrow link hints option to advanced settings --- vimiumFrontend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index b108d141..30c87153 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -5,7 +5,7 @@ * commands by connectiong to a port named "domReady". */ var settings = {}; -var settingsToLoad = ["scrollStepSize", "linkHintCharacters"]; +var settingsToLoad = ["scrollStepSize", "linkHintCharacters", "narrowLinkHints"]; var getCurrentUrlHandlers = []; // function(url) -- cgit v1.2.3 From b782ecae479bac9fe3d587bf1bdcaf51aca143af Mon Sep 17 00:00:00 2001 From: jez Date: Wed, 29 Dec 2010 18:08:43 +0800 Subject: Object-ify linkHints.js --- vimiumFrontend.js | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 30c87153..35781b51 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -79,14 +79,25 @@ function initializePreDomReady() { sendResponse({}); // Free up the resources used by this open connection. }); + // takes a dot-notation object string and returns the member it points to + function resolveCommandString(str) { + var components = str.split('.'); + var component; + var func = this[components.shift()]; + while ((component = components.shift()) && func) + func = func[component]; + return func; + } + chrome.extension.onConnect.addListener(function(port, name) { if (port.name == "executePageCommand") { port.onMessage.addListener(function(args) { - if (this[args.command] && frameId == args.frameId) { + func = resolveCommandString(args.command); + if (func && frameId == args.frameId) { if (args.passCountToFunction) { - this[args.command].call(null, args.count); + func.call(null, args.count); } else { - for (var i = 0; i < args.count; i++) { this[args.command].call(); } + for (var i = 0; i < args.count; i++) { func(); } } } @@ -306,7 +317,7 @@ function toggleViewSourceCallback(url) { function onKeypress(event) { var keyChar = ""; - if (linkHintsModeActivated) + if (linkHints.linkHintsModeActivated) return; // Ignore modifier keys by themselves. @@ -341,7 +352,7 @@ function onKeypress(event) { function onKeydown(event) { var keyChar = ""; - if (linkHintsModeActivated) + if (linkHints.linkHintsModeActivated) return; // handle modifiers being pressed.don't handle shiftKey alone (to avoid / being interpreted as ? -- cgit v1.2.3 From 18d716bfe963e4c552392d9d41c986bbee556a80 Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 05:52:19 +0800 Subject: Refactoring linkHints.js --- vimiumFrontend.js | 2 ++ 1 file changed, 2 insertions(+) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 35781b51..95b6a023 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -174,6 +174,8 @@ function focusThisFrame(shouldHighlight) { function initializeOnDomReady() { registerFrameIfSizeAvailable(window.top == window.self); + initializeLinkHints(); + if (isEnabledForUrl) enterInsertModeIfElementIsFocused(); -- cgit v1.2.3 From 489ff3f8f0f7b44817a09472b5b1e2fad46d7632 Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 05:58:26 +0800 Subject: Use 'this' instead of 'linkHints' where possible. --- vimiumFrontend.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 95b6a023..dac778cb 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -79,25 +79,25 @@ function initializePreDomReady() { sendResponse({}); // Free up the resources used by this open connection. }); - // takes a dot-notation object string and returns the member it points to - function resolveCommandString(str) { + // takes a dot-notation object string and call the function + // that it points to with the correct value for 'this'. + function invokeCommandString(str, argArray) { var components = str.split('.'); - var component; - var func = this[components.shift()]; - while ((component = components.shift()) && func) - func = func[component]; - return func; + var obj = this; + for (var i = 0; i < components.length - 1; i++) + obj = obj[components[i]]; + var func = obj[components.pop()]; + return func.apply(obj, argArray); } chrome.extension.onConnect.addListener(function(port, name) { if (port.name == "executePageCommand") { port.onMessage.addListener(function(args) { - func = resolveCommandString(args.command); - if (func && frameId == args.frameId) { + if (frameId == args.frameId) { if (args.passCountToFunction) { - func.call(null, args.count); + invokeCommandString(args.command, [args.count]); } else { - for (var i = 0; i < args.count; i++) { func(); } + for (var i = 0; i < args.count; i++) { invokeCommandString(args.command); } } } -- cgit v1.2.3 From 1c3120c3f651c84d47eb672f73d1a915a351d068 Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 11:52:29 +0800 Subject: Object-ify settings. --- vimiumFrontend.js | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 7289c135..f0d56ff5 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -4,8 +4,6 @@ * the page's zoom level. We tell the background page that we're in domReady and ready to accept normal * commands by connectiong to a port named "domReady". */ -var settings = {}; -var settingsToLoad = ["scrollStepSize", "linkHintCharacters", "narrowLinkHints"]; var getCurrentUrlHandlers = []; // function(url) @@ -37,6 +35,34 @@ var textInputXPath = '//input[' + textInputTypes.map(function (type) { return '@type="' + type + '"'; }).join(" or ") + ' or not(@type)]'; +var settings = { + values: {}, + loadedValues: 0, + valuesToLoad: ["scrollStepSize", "linkHintCharacters", "narrowLinkHints"], + + get: function (key) { return this.values[key]; }, + + load: function() { + for (var i in this.valuesToLoad) { this.sendMessage(this.valuesToLoad[i]); } + }, + + sendMessage: function (key) { + if (!settingPort) + settingPort = chrome.extension.connect({ name: "getSetting" }); + settingPort.postMessage({ key: key }); + }, + + receiveMessage: function (args) { + // not using 'this' due to issues with binding on callback + settings.values[args.key] = args.value; + if (++settings.loadedValues == settings.valuesToLoad.length) + settings.initializeOnReady(); + }, + + initializeOnReady: function () { + } +}; + /* * Give this frame a unique id. */ @@ -44,19 +70,11 @@ frameId = Math.floor(Math.random()*999999999) var hasModifiersRegex = /^<([amc]-)+.>/; -function getSetting(key) { - if (!settingPort) - settingPort = chrome.extension.connect({ name: "getSetting" }); - settingPort.postMessage({ key: key }); -} - -function setSetting(args) { settings[args.key] = args.value; } - /* * Complete initialization work that sould be done prior to DOMReady, like setting the page's zoom level. */ function initializePreDomReady() { - for (var i in settingsToLoad) { getSetting(settingsToLoad[i]); } + settings.load(); checkIfEnabledForUrl(); @@ -139,7 +157,7 @@ function initializePreDomReady() { setPageZoomLevel(currentZoomLevel); }); } else if (port.name == "returnSetting") { - port.onMessage.addListener(setSetting); + port.onMessage.addListener(settings.receiveMessage); } else if (port.name == "refreshCompletionKeys") { port.onMessage.addListener(function (args) { refreshCompletionKeys(args.completionKeys); @@ -246,14 +264,14 @@ function scrollToBottom() { window.scrollTo(window.pageXOffset, document.body.sc function scrollToTop() { window.scrollTo(window.pageXOffset, 0); } function scrollToLeft() { window.scrollTo(0, window.pageYOffset); } function scrollToRight() { window.scrollTo(document.body.scrollWidth, window.pageYOffset); } -function scrollUp() { window.scrollBy(0, -1 * settings["scrollStepSize"]); } -function scrollDown() { window.scrollBy(0, settings["scrollStepSize"]); } +function scrollUp() { window.scrollBy(0, -1 * settings.get("scrollStepSize")); } +function scrollDown() { window.scrollBy(0, settings.get("scrollStepSize")); } function scrollPageUp() { window.scrollBy(0, -1 * window.innerHeight / 2); } function scrollPageDown() { window.scrollBy(0, window.innerHeight / 2); } function scrollFullPageUp() { window.scrollBy(0, -window.innerHeight); } function scrollFullPageDown() { window.scrollBy(0, window.innerHeight); } -function scrollLeft() { window.scrollBy(-1 * settings["scrollStepSize"], 0); } -function scrollRight() { window.scrollBy(settings["scrollStepSize"], 0); } +function scrollLeft() { window.scrollBy(-1 * settings.get("scrollStepSize"), 0); } +function scrollRight() { window.scrollBy(settings.get("scrollStepSize"), 0); } function focusInput(count) { var results = document.evaluate(textInputXPath, -- cgit v1.2.3 From d8322daee142eed06998ab6d68ec12aacc161a79 Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 11:56:39 +0800 Subject: Initialize linkHints immediately after settings are loaded. --- vimiumFrontend.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index f0d56ff5..3b7d9c43 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -60,6 +60,7 @@ var settings = { }, initializeOnReady: function () { + initializeLinkHints(); } }; @@ -203,8 +204,6 @@ function focusThisFrame(shouldHighlight) { function initializeOnDomReady() { registerFrameIfSizeAvailable(window.top == window.self); - initializeLinkHints(); - if (isEnabledForUrl) enterInsertModeIfElementIsFocused(); -- cgit v1.2.3 From 70833b4c132d444e128a8c497d0e30fc03d325d7 Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 12:33:43 +0800 Subject: Shorten linkHint variables where possible. --- vimiumFrontend.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 3b7d9c43..0a194d2e 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -347,7 +347,7 @@ function toggleViewSourceCallback(url) { function onKeypress(event) { var keyChar = ""; - if (linkHints.linkHintsModeActivated) + if (linkHints.modeActivated) return; // Ignore modifier keys by themselves. @@ -382,7 +382,7 @@ function onKeypress(event) { function onKeydown(event) { var keyChar = ""; - if (linkHints.linkHintsModeActivated) + if (linkHints.modeActivated) return; // handle modifiers being pressed.don't handle shiftKey alone (to avoid / being interpreted as ? -- cgit v1.2.3 From 0194d39495177a4ef792df0cc86ffc3c9196750a Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 13:04:56 +0800 Subject: Comments and formatting. --- vimiumFrontend.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 0a194d2e..4ff2684a 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -109,8 +109,10 @@ function initializePreDomReady() { sendResponse({}); // Free up the resources used by this open connection. }); - // takes a dot-notation object string and call the function - // that it points to with the correct value for 'this'. + /* + * Takes a dot-notation object string and call the function + * that it points to with the correct value for 'this'. + */ function invokeCommandString(str, argArray) { var components = str.split('.'); var obj = this; -- cgit v1.2.3 From 3ffadaa2f3312e25b13274e70ecafa1883aafa93 Mon Sep 17 00:00:00 2001 From: jez Date: Fri, 31 Dec 2010 15:29:14 +0800 Subject: Change 'narrow' to 'filter' in variable names. --- vimiumFrontend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 4ff2684a..c808406c 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -38,7 +38,7 @@ var textInputXPath = '//input[' + var settings = { values: {}, loadedValues: 0, - valuesToLoad: ["scrollStepSize", "linkHintCharacters", "narrowLinkHints"], + valuesToLoad: ["scrollStepSize", "linkHintCharacters", "filterLinkHints"], get: function (key) { return this.values[key]; }, -- cgit v1.2.3 From 2bc99a6caa157a818647c4411c307ebc630b1dc3 Mon Sep 17 00:00:00 2001 From: jez Date: Mon, 3 Jan 2011 20:30:15 +0800 Subject: Switch from tagName to nodeName and lowercase it when doing checks. tagName returns 'undefined' for text nodes, so it is less desirable. Non-html documents return nodeName/tagNames in lowercase. --- vimiumFrontend.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index e5e214f7..f552fc5a 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -508,7 +508,7 @@ function isFocusable(element) { return isEditable(element) || isEmbed(element); * Embedded elements like Flash and quicktime players can obtain focus but cannot be programmatically * unfocused. */ -function isEmbed(element) { return ["EMBED", "OBJECT"].indexOf(element.tagName) > 0; } +function isEmbed(element) { return ["embed", "object"].indexOf(element.nodeName.toLowerCase()) > 0; } /* * Input or text elements are considered focusable and able to receieve their own keyboard events, @@ -521,7 +521,7 @@ function isEditable(target) { if (target.getAttribute("contentEditable") == "true") return true; var focusableInputs = ["input", "textarea", "select", "button"]; - return focusableInputs.indexOf(target.tagName.toLowerCase()) >= 0; + return focusableInputs.indexOf(target.nodeName.toLowerCase()) >= 0; } function enterInsertMode() { -- cgit v1.2.3 From 92a0c80a4820689b14aaf1b7f0dda59de9417ac7 Mon Sep 17 00:00:00 2001 From: jez Date: Tue, 4 Jan 2011 16:59:50 +0800 Subject: Factor out invokeCommandString. Had to make 'this' point explicitly to 'window'. --- vimiumFrontend.js | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index f552fc5a..3ca5f6a2 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -109,27 +109,14 @@ function initializePreDomReady() { sendResponse({}); // Free up the resources used by this open connection. }); - /* - * Takes a dot-notation object string and call the function - * that it points to with the correct value for 'this'. - */ - function invokeCommandString(str, argArray) { - var components = str.split('.'); - var obj = this; - for (var i = 0; i < components.length - 1; i++) - obj = obj[components[i]]; - var func = obj[components.pop()]; - return func.apply(obj, argArray); - } - chrome.extension.onConnect.addListener(function(port, name) { if (port.name == "executePageCommand") { port.onMessage.addListener(function(args) { if (frameId == args.frameId) { if (args.passCountToFunction) { - invokeCommandString(args.command, [args.count]); + utils.invokeCommandString(args.command, [args.count]); } else { - for (var i = 0; i < args.count; i++) { invokeCommandString(args.command); } + for (var i = 0; i < args.count; i++) { utils.invokeCommandString(args.command); } } } -- cgit v1.2.3 From ad57590c1d3c4f0ceb7ddc962054a21afddfa224 Mon Sep 17 00:00:00 2001 From: jez Date: Mon, 31 Jan 2011 11:18:11 +0800 Subject: Begin switch from inheritance to composition --- vimiumFrontend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index c5b7bdf8..e0b6eb6a 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -60,7 +60,7 @@ var settings = { }, initializeOnReady: function () { - initializeLinkHints(); + linkHints.init(); } }; -- cgit v1.2.3 From d31aa9fefc26f562f45043ad184846c469a580a9 Mon Sep 17 00:00:00 2001 From: jez Date: Tue, 1 Feb 2011 02:03:12 +0800 Subject: Tidy up merge --- vimiumFrontend.js | 1 - 1 file changed, 1 deletion(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 6877be5f..e0b6eb6a 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -266,7 +266,6 @@ function scrollFullPageDown() { window.scrollBy(0, window.innerHeight); } function scrollLeft() { window.scrollBy(-1 * settings.get("scrollStepSize"), 0); } function scrollRight() { window.scrollBy(settings.get("scrollStepSize"), 0); } - function focusInput(count) { var results = document.evaluate(textInputXPath, document.documentElement, null, -- cgit v1.2.3 From 1133f348558e8e70aa5e76ca67a739a5303467bd Mon Sep 17 00:00:00 2001 From: jez Date: Tue, 1 Feb 2011 05:01:39 +0800 Subject: Use only one key[event] handler for all modes. --- vimiumFrontend.js | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'vimiumFrontend.js') diff --git a/vimiumFrontend.js b/vimiumFrontend.js index e0b6eb6a..7b43f4c2 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -12,6 +12,7 @@ var findMode = false; var findModeQuery = ""; var findModeQueryHasResults = false; var isShowingHelpDialog = false; +var handlerStack = []; var keyPort; var settingPort; var saveZoomLevelPort; @@ -339,11 +340,11 @@ function toggleViewSourceCallback(url) { * Note that some keys will only register keydown events and not keystroke events, e.g. ESC. */ function onKeypress(event) { - var keyChar = ""; - - if (linkHints.modeActivated) + if (!bubbleEvent('keypress', event)) return; + var keyChar = ""; + // Ignore modifier keys by themselves. if (event.keyCode > 31) { keyChar = String.fromCharCode(event.charCode); @@ -373,12 +374,22 @@ function onKeypress(event) { } } -function onKeydown(event) { - var keyChar = ""; +function bubbleEvent(type, event) { + for (var i = handlerStack.length-1; i >= 0; i--) { + // We need to check for existence of handler because the last function call may have caused the release of + // more than one handler. + if (handlerStack[i] && handlerStack[i][type] && !handlerStack[i][type](event)) + return false; + } + return true; +} - if (linkHints.modeActivated) +function onKeydown(event) { + if (!bubbleEvent('keydown', event)) return; + var keyChar = ""; + // handle modifiers being pressed.don't handle shiftKey alone (to avoid / being interpreted as ? if (event.metaKey && event.keyCode > 31 || event.ctrlKey && event.keyCode > 31 || event.altKey && event.keyCode > 31) { keyChar = getKeyChar(event); @@ -459,6 +470,11 @@ function onKeydown(event) { event.stopPropagation(); } +function onKeyup() { + if (!bubbleEvent('keyup', event)) + return; +} + function checkIfEnabledForUrl() { var url = window.location.toString(); -- cgit v1.2.3