From 54b77bee1cfab13d34d078d05a20678412dfba6a Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 31 Aug 2017 16:21:59 +0100 Subject: Add ignoreKeyboardLayout option (under advanced). --- lib/settings.coffee | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/settings.coffee b/lib/settings.coffee index 62dc09e7..f5fc16b0 100644 --- a/lib/settings.coffee +++ b/lib/settings.coffee @@ -193,6 +193,7 @@ Settings = helpDialog_showAdvancedCommands: false optionsPage_showAdvancedOptions: false passNextKeyKeys: [] + ignoreKeyboardLayout: false Settings.init() -- cgit v1.2.3 From 28f6702b4e8fd5a21f2f1484a99732e703c5f37c Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Fri, 1 Sep 2017 11:27:39 +0100 Subject: Implement ignoreKeyboardLayout option in getKeyChar. Fixes #2618. --- lib/keyboard_utils.coffee | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index 5f37ddd0..dc6b6269 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -16,17 +16,24 @@ KeyboardUtils = @platform = "Windows" getKeyChar: (event) -> - if event.key of @keyNames - @keyNames[event.key] - # It appears that event.key is not always defined (see #2453). - else if not event.key? + unless Settings.get "ignoreKeyboardLayout" + key = event.key + else + key = event.code + key = key[3..] if key[...3] == "Key" + key = key.toLowerCase() unless event.shiftKey + + if key of @keyNames + @keyNames[key] + # It appears that key is not always defined (see #2453). + else if not key? "" - else if event.key.length == 1 - event.key - else if event.key.length == 2 and "F1" <= event.key <= "F9" - event.key.toLowerCase() # F1 to F9. - else if event.key.length == 3 and "F10" <= event.key <= "F12" - event.key.toLowerCase() # F10 to F12. + else if key.length == 1 + key + else if key.length == 2 and "F1" <= key <= "F9" + key.toLowerCase() # F1 to F9. + else if key.length == 3 and "F10" <= key <= "F12" + key.toLowerCase() # F10 to F12. else "" -- cgit v1.2.3 From 37b26d736b901eaf08a260d7d97af4d8749a2536 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Fri, 1 Sep 2017 13:51:20 +0100 Subject: Translate event.code key representations to the corresponding event.key format. --- lib/keyboard_utils.coffee | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'lib') diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index dc6b6269..471e18c9 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -19,8 +19,15 @@ KeyboardUtils = unless Settings.get "ignoreKeyboardLayout" key = event.key else + # The logic here is from the vim-like-key-notation project (https://github.com/lydell/vim-like-key-notation). key = event.code + # Strip some standard prefixes. key = key[3..] if key[...3] == "Key" + key = key[5..] if key[...5] == "Digit" + key = key[6..] if key[...6] == "Numpad" + # Translate some special keys to event.key-like strings. + if @enUsTranslations[key] + key = if event.shift then @enUsTranslations[key][1] else @enUsTranslations[key][0] key = key.toLowerCase() unless event.shiftKey if key of @keyNames @@ -62,6 +69,21 @@ KeyboardUtils = isPrintable: (event) -> @getKeyCharString(event)?.length == 1 + enUsTranslations: + "Backquote": ["`", "~"] + "Minus": ["-", "_"] + "Equal": ["=", "+"] + "Backslash": ["\\","|"] + "IntlBackslash": ["\\","|"] + "BracketLeft": ["[", "{"] + "BracketRight": ["]", "}"] + "Semicolon": [";", ":"] + "Quote": ["'", '"'] + "Comma": [",", "<"] + "Period": [".", ">"] + "Slash": ["/", "?"] + "Space": [" ", " "] + KeyboardUtils.init() root = exports ? window -- cgit v1.2.3 From 1358fff3981cab5d8e0aa273cca2378aca2d766c Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Fri, 1 Sep 2017 16:48:35 +0100 Subject: Handle shifted numeric keys. --- lib/keyboard_utils.coffee | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index 471e18c9..4b03aeed 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -23,7 +23,6 @@ KeyboardUtils = key = event.code # Strip some standard prefixes. key = key[3..] if key[...3] == "Key" - key = key[5..] if key[...5] == "Digit" key = key[6..] if key[...6] == "Numpad" # Translate some special keys to event.key-like strings. if @enUsTranslations[key] @@ -83,6 +82,16 @@ KeyboardUtils = "Period": [".", ">"] "Slash": ["/", "?"] "Space": [" ", " "] + "Digit1": ["1", "!"] + "Digit2": ["2", "@"] + "Digit3": ["3", "#"] + "Digit4": ["4", "$"] + "Digit5": ["5", "%"] + "Digit6": ["6", "^"] + "Digit7": ["7", "&"] + "Digit8": ["8", "*"] + "Digit9": ["9", "("] + "Digit0": ["0", ")"] KeyboardUtils.init() -- cgit v1.2.3 From 2c1c86ee35f8437473de11f47e6a3a754cb8c1e5 Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Fri, 1 Sep 2017 16:54:20 +0100 Subject: Use event.key for numpad. See this comment: https://github.com/philc/vimium/pull/2626#issuecomment-326553282. --- lib/keyboard_utils.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index 4b03aeed..7f05ef01 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -18,12 +18,13 @@ KeyboardUtils = getKeyChar: (event) -> unless Settings.get "ignoreKeyboardLayout" key = event.key + else if event.code[...6] == "Numpad" + # We cannot correctly emulate the numpad, so fall back to event.key; see #2626. + key = event.key else # The logic here is from the vim-like-key-notation project (https://github.com/lydell/vim-like-key-notation). key = event.code - # Strip some standard prefixes. key = key[3..] if key[...3] == "Key" - key = key[6..] if key[...6] == "Numpad" # Translate some special keys to event.key-like strings. if @enUsTranslations[key] key = if event.shift then @enUsTranslations[key][1] else @enUsTranslations[key][0] -- cgit v1.2.3 From 1e3a618b89d053f16715790f539350680b993b0f Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Sat, 2 Sep 2017 13:38:56 +0100 Subject: Fix special keys (e.g. ). --- lib/keyboard_utils.coffee | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/keyboard_utils.coffee b/lib/keyboard_utils.coffee index 7f05ef01..e14e8b3e 100644 --- a/lib/keyboard_utils.coffee +++ b/lib/keyboard_utils.coffee @@ -25,10 +25,11 @@ KeyboardUtils = # The logic here is from the vim-like-key-notation project (https://github.com/lydell/vim-like-key-notation). key = event.code key = key[3..] if key[...3] == "Key" - # Translate some special keys to event.key-like strings. + # Translate some special keys to event.key-like strings and handle . if @enUsTranslations[key] - key = if event.shift then @enUsTranslations[key][1] else @enUsTranslations[key][0] - key = key.toLowerCase() unless event.shiftKey + key = if event.shiftKey then @enUsTranslations[key][1] else @enUsTranslations[key][0] + else if key.length == 1 and not event.shiftKey + key = key.toLowerCase() if key of @keyNames @keyNames[key] -- cgit v1.2.3 From 4df6b532d0925980e9542821d8bda400c981a5ac Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Mon, 4 Sep 2017 08:22:40 +0100 Subject: Fix tests for #2626. This fixes the tests for #2626. Note: This may not be th best approach. The problem is that, for the first time, we're using `Settings` (and hence `chrome.storage`) within the Vomnibar and HUD iframes, and our `chrome` stubs are not injected into those frames. Mention @mrmr1993. Matt: Do you know of a better approach? Can we inject the stubs programmatically in the tests? An alternative approach would be appreciated. --- lib/settings.coffee | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'lib') diff --git a/lib/settings.coffee b/lib/settings.coffee index f5fc16b0..eda02611 100644 --- a/lib/settings.coffee +++ b/lib/settings.coffee @@ -10,6 +10,25 @@ # # In all cases except Settings.defaults, values are stored as jsonified strings. +# This is a minimal stub of chrome services for the tests. This needs to be here (and not in +# ../tests/dom_tests/chrome.coffee) because the regular test stubs are not loaded in the Vomnibar or HUD +# iframes. +# NOTE(smblott): Possibly these should go in a separate file. +window.chrome ?= + runtime: + lastError: false + storage: + local: + get: -> + set: -> + sync: + get: (_, callback) -> callback? {} + set: -> + onChanged: + addListener: -> + extension: + inIncognitoContext: false + storageArea = if chrome.storage.sync? then "sync" else "local" Settings = -- cgit v1.2.3 From a78246316b7062f9cd64226a885e1fb2b0cac6ee Mon Sep 17 00:00:00 2001 From: Stephen Blott Date: Thu, 7 Sep 2017 14:15:46 +0100 Subject: Use stubs from window.top for tests. (Similar to idea suggested by @mrmr1993.) This way: - we do not have to replicate the stub code, and - we have minimal impact on the live implementation. --- lib/settings.coffee | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) (limited to 'lib') diff --git a/lib/settings.coffee b/lib/settings.coffee index eda02611..38718990 100644 --- a/lib/settings.coffee +++ b/lib/settings.coffee @@ -10,24 +10,8 @@ # # In all cases except Settings.defaults, values are stored as jsonified strings. -# This is a minimal stub of chrome services for the tests. This needs to be here (and not in -# ../tests/dom_tests/chrome.coffee) because the regular test stubs are not loaded in the Vomnibar or HUD -# iframes. -# NOTE(smblott): Possibly these should go in a separate file. -window.chrome ?= - runtime: - lastError: false - storage: - local: - get: -> - set: -> - sync: - get: (_, callback) -> callback? {} - set: -> - onChanged: - addListener: -> - extension: - inIncognitoContext: false +# If the current frame is the Vomnibar or the HUD, then we'll need our Chrome stubs for the tests. +window.chrome ?= window.top?.chrome storageArea = if chrome.storage.sync? then "sync" else "local" -- cgit v1.2.3