diff options
Diffstat (limited to 'content_scripts/vimium_frontend.coffee')
| -rw-r--r-- | content_scripts/vimium_frontend.coffee | 41 | 
1 files changed, 28 insertions, 13 deletions
| diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee index 118f985e..469afe71 100644 --- a/content_scripts/vimium_frontend.coffee +++ b/content_scripts/vimium_frontend.coffee @@ -49,7 +49,7 @@ settings =    loadedValues: 0    valuesToLoad: ["scrollStepSize", "linkHintCharacters", "linkHintNumbers", "filterLinkHints", "hideHud",      "previousPatterns", "nextPatterns", "findModeRawQuery", "regexFindMode", "userDefinedLinkHintCss", -    "helpDialog_showAdvancedCommands"] +    "helpDialog_showAdvancedCommands", "smoothScroll"]    isLoaded: false    eventListeners: {} @@ -101,7 +101,7 @@ initializePreDomReady = ->    settings.addEventListener("load", LinkHints.init.bind(LinkHints))    settings.load() -  Scroller.init() +  Scroller.init settings    checkIfEnabledForUrl() @@ -179,19 +179,24 @@ window.addEventListener "focus", ->  # Initialization tasks that must wait for the document to be ready.  #  initializeOnDomReady = -> -  registerFrame(window.top == window.self) -    enterInsertModeIfElementIsFocused() if isEnabledForUrl    # Tell the background page we're in the dom ready state.    chrome.runtime.connect({ name: "domReady" }) -registerFrame = (is_top) -> -  chrome.runtime.sendMessage( -    handler: "registerFrame" +registerFrame = -> +  # Don't register frameset containers; focusing them is no use. +  if document.body.tagName != "FRAMESET" +    chrome.runtime.sendMessage +      handler: "registerFrame" +      frameId: frameId + +# Unregister the frame if we're going to exit. +unregisterFrame = -> +  chrome.runtime.sendMessage +    handler: "unregisterFrame"      frameId: frameId -    is_top: is_top -    total: frames.length + 1) +    tab_is_closing: window.top == window.self  #  # Enters insert mode if the currently focused element in the DOM is focusable. @@ -367,7 +372,7 @@ onKeypress = (event) ->        else if (!isInsertMode() && !findMode)          if (isPassKey keyChar)            return undefined -        if (currentCompletionKeys.indexOf(keyChar) != -1) +        if (currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey(keyChar))            DomUtils.suppressEvent(event)          keyPort.postMessage({ keyChar:keyChar, frameId:frameId }) @@ -440,7 +445,7 @@ onKeydown = (event) ->    else if (!isInsertMode() && !findMode)      if (keyChar) -      if (currentCompletionKeys.indexOf(keyChar) != -1) +      if (currentCompletionKeys.indexOf(keyChar) != -1 or isValidFirstKey(keyChar))          DomUtils.suppressEvent event          handledKeydownEvents.push event @@ -502,7 +507,7 @@ refreshCompletionKeys = (response) ->      chrome.runtime.sendMessage({ handler: "getCompletionKeys" }, refreshCompletionKeys)  isValidFirstKey = (keyChar) -> -  validFirstKeys[keyChar] || /[1-9]/.test(keyChar) +  validFirstKeys[keyChar] || /^[1-9]/.test(keyChar)  onFocusCapturePhase = (event) ->    if (isFocusable(event.target) && !findMode) @@ -529,6 +534,7 @@ isEmbed = (element) -> ["embed", "object"].indexOf(element.nodeName.toLowerCase(  # any element which makes it a rich text editor, like the notes on jjot.com.  #  isEditable = (target) -> +  # Note: document.activeElement.isContentEditable is also rechecked in isInsertMode() dynamically.    return true if target.isContentEditable    nodeName = target.nodeName.toLowerCase()    # use a blacklist instead of a whitelist because new form controls are still being implemented for html5 @@ -552,6 +558,7 @@ window.enterInsertMode = (target) ->  # when the last editable element that came into focus -- which insertModeLock points to -- has been blurred.  # If insert mode is entered manually (via pressing 'i'), then we set insertModeLock to 'undefined', and only  # leave insert mode when the user presses <ESC>. +# Note. This returns the truthiness of target, which is required by isInsertMode.  #  enterInsertModeWithoutShowingIndicator = (target) -> insertModeLock = target @@ -560,7 +567,13 @@ exitInsertMode = (target) ->      insertModeLock = null      HUD.hide() -isInsertMode = -> insertModeLock != null +isInsertMode = -> +  return true if insertModeLock != null +  # Some sites (e.g. inbox.google.com) change the contentEditable attribute on the fly (see #1245); and +  # unfortunately, isEditable() is called *before* the change is made.  Therefore, we need to re-check whether +  # the active element is contentEditable. +  document.activeElement and document.activeElement.isContentEditable and +    enterInsertModeWithoutShowingIndicator document.activeElement  # should be called whenever rawQuery is modified.  updateFindModeQuery = -> @@ -1055,6 +1068,8 @@ Tween =        state.onUpdate(value)  initializePreDomReady() +window.addEventListener("DOMContentLoaded", registerFrame) +window.addEventListener("unload", unregisterFrame)  window.addEventListener("DOMContentLoaded", initializeOnDomReady)  window.onbeforeunload = -> | 
