aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormrmr19932017-09-21 21:47:46 +0100
committermrmr19932017-09-21 22:05:53 +0100
commit92d2b4058a378c276d52ecc53409603679c3865c (patch)
tree89b359d6dfb28c0f6484bfbb76cbe5109338d39b
parent7fa22da6954d28dbd578b0cd490ada638d98b373 (diff)
downloadvimium-92d2b4058a378c276d52ecc53409603679c3865c.tar.bz2
Move simulating click default action to DomUtils, add shift handling
-rw-r--r--content_scripts/link_hints.coffee12
-rw-r--r--lib/dom_utils.coffee28
2 files changed, 28 insertions, 12 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 0fbb66bf..eeadfc0c 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -384,17 +384,7 @@ class LinkHintsMode
window.focus()
DomUtils.simulateSelect clickEl
else
- clickActivator = (modifiers) -> (link) ->
- defaultActionsTriggered = DomUtils.simulateClick link, modifiers
- simulateClickDefaultAction = Utils.isFirefox()
- if simulateClickDefaultAction and
- defaultActionsTriggered[3] and link.tagName?.toLowerCase() == "a" and
- modifiers? and modifiers.metaKey == isMac and modifiers.ctrlKey == not isMac
- # We've clicked a link that *should* open in a new tab. If simulateClickDefaultAction is true,
- # we assume the popup-blocker is active, and simulate opening the new tab ourselves.
- chrome.runtime.sendMessage {handler: "openUrlInNewTab", url: link.href, active:
- modifiers.shiftKey == true}
-
+ clickActivator = (modifiers) -> (link) -> DomUtils.simulateClick link, modifiers
linkActivator = @mode.linkActivator ? clickActivator @mode.clickModifiers
# TODO: Are there any other input elements which should not receive focus?
if clickEl.nodeName.toLowerCase() in ["input", "select"] and clickEl.type not in ["button", "submit"]
diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee
index b3fc981b..65a14c34 100644
--- a/lib/dom_utils.coffee
+++ b/lib/dom_utils.coffee
@@ -249,7 +249,11 @@ DomUtils =
simulateClick: (element, modifiers) ->
eventSequence = ["mouseover", "mousedown", "mouseup", "click"]
for event in eventSequence
- @simulateMouseEvent event, element, modifiers
+ defaultActionShouldTrigger = @simulateMouseEvent event, element, modifiers
+ if event == "click" and defaultActionShouldTrigger and Utils.isFirefox()
+ # Firefox doesn't (currently) trigger the default action for modified keys.
+ DomUtils.simulateClickDefaultAction element, modifiers
+ defaultActionShouldTrigger # return the values returned by each @simulateMouseEvent call.
simulateMouseEvent: do ->
lastHoveredElement = undefined
@@ -272,6 +276,28 @@ DomUtils =
# but Webkit will. Dispatching a click on an input box does not seem to focus it; we do that separately
element.dispatchEvent(mouseEvent)
+ simulateClickDefaultAction: (element, modifiers) ->
+ return unless modifiers?
+ return unless element.tagName?.toLowerCase() == "a" and element.href?
+
+ {ctrlKey, shiftKey, metaKey, altKey} = modifiers
+
+ # Mac uses a different new tab modifier (meta vs. ctrl).
+ if KeyboardUtils.platform == "Mac"
+ newTabModifier = metaKey == true and ctrlKey == false
+ else
+ newTabModifier = metaKey == false and ctrlKey == true
+
+ if newTabModifier
+ # Open in new tab. Shift determines whether the tab is focused when created. Alt is ignored.
+ chrome.runtime.sendMessage {handler: "openUrlInNewTab", url: element.href, active:
+ shiftKey == true}
+ else if shiftKey == true and metaKey == false and ctrlKey == false and altKey == false
+ # Open in new window.
+ chrome.runtime.sendMessage {handler: "openUrlInNewWindow", url: element.href}
+
+ return
+
addFlashRect: (rect) ->
flashEl = @createElement "div"
flashEl.classList.add "vimiumReset"