diff options
Diffstat (limited to 'lib/dom_utils.coffee')
| -rw-r--r-- | lib/dom_utils.coffee | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index b3fc981b..ff5991dc 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,29 @@ 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 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} + else if element.target == "_blank" + chrome.runtime.sendMessage {handler: "openUrlInNewTab", url: element.href, active: true} + + return + addFlashRect: (rect) -> flashEl = @createElement "div" flashEl.classList.add "vimiumReset" @@ -381,5 +408,13 @@ DomUtils = windowIsTooSmall: -> return window.innerWidth < 3 or window.innerHeight < 3 + # Inject user styles manually. This is only necessary for our chrome-extension:// pages and frames. + injectUserCss: -> + Settings.onLoaded -> + style = document.createElement "style" + style.type = "text/css" + style.textContent = Settings.get "userDefinedLinkHintCss" + document.head.appendChild style + root = exports ? window root.DomUtils = DomUtils |
