diff options
| author | mrmr1993 | 2017-09-21 21:47:46 +0100 | 
|---|---|---|
| committer | mrmr1993 | 2017-09-21 22:05:53 +0100 | 
| commit | 92d2b4058a378c276d52ecc53409603679c3865c (patch) | |
| tree | 89b359d6dfb28c0f6484bfbb76cbe5109338d39b | |
| parent | 7fa22da6954d28dbd578b0cd490ada638d98b373 (diff) | |
| download | vimium-92d2b4058a378c276d52ecc53409603679c3865c.tar.bz2 | |
Move simulating click default action to DomUtils, add shift handling
| -rw-r--r-- | content_scripts/link_hints.coffee | 12 | ||||
| -rw-r--r-- | lib/dom_utils.coffee | 28 | 
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" | 
