diff options
| author | Jez Ng | 2012-01-14 04:38:50 +0800 | 
|---|---|---|
| committer | Jez Ng | 2012-01-15 14:48:11 +0800 | 
| commit | 4ca60a80f0e3d5c4818d05417c869bde6340d792 (patch) | |
| tree | 00907902cdcade26e5dc7f422f3b21f9cd1f6fc7 /vimiumFrontend.js | |
| parent | e84617a1512dbfdba685c3dccf5f82ae0ddc60e8 (diff) | |
| download | vimium-4ca60a80f0e3d5c4818d05417c869bde6340d792.tar.bz2 | |
Scroll the body element if last activated node is not visible.
Diffstat (limited to 'vimiumFrontend.js')
| -rw-r--r-- | vimiumFrontend.js | 20 | 
1 files changed, 11 insertions, 9 deletions
diff --git a/vimiumFrontend.js b/vimiumFrontend.js index 3ae6e6cc..4ab01d2a 100644 --- a/vimiumFrontend.js +++ b/vimiumFrontend.js @@ -223,14 +223,15 @@ function onDOMActivate(event) {   * input elements. This mechanism allows us to decide whether to scroll a div or to scroll the whole document.   */  function scrollActivatedElementBy(x, y) { -  if (!activatedElement) { -    // if this is called before domReady, just use the window scroll function -    if (document.body) -      activatedElement = document.body; -    else -      window.scrollBy(x, y); +  // if this is called before domReady, just use the window scroll function +  if (!document.body) { +    window.scrollBy(x, y); +    return;    } +  if (!activatedElement || utils.getVisibleClientRect(activatedElement) === null) +    activatedElement = document.body; +    // Chrome does not report scrollHeight accurately for nodes with pseudo-elements of height 0 (bug 110149).    // Therefore we just try to increase scrollTop blindly -- if it fails we know we have reached the end of the    // content. @@ -240,7 +241,8 @@ function scrollActivatedElementBy(x, y) {        var oldScrollTop = element.scrollTop;        element.scrollTop += y;        var lastElement = element; -      element = element.parentElement; +      // we may have an orphaned element. if so, just scroll the body element. +      element = element.parentElement || document.body;      } while(lastElement.scrollTop == oldScrollTop && lastElement.nodeName.toLowerCase() != 'body');    } @@ -250,7 +252,7 @@ function scrollActivatedElementBy(x, y) {        var oldScrollLeft = element.scrollLeft;        element.scrollLeft += x;        var lastElement = element; -      element = element.parentElement; +      element = element.parentElement || document.body;      } while(lastElement.scrollLeft == oldScrollLeft && lastElement.nodeName.toLowerCase() != 'body');    } @@ -286,7 +288,7 @@ function focusInput(count) {      var currentInputBox = results.iterateNext();      if (!currentInputBox) { break; } -    if (linkHints.getVisibleClientRect(currentInputBox) === null) +    if (utils.getVisibleClientRect(currentInputBox) === null)          continue;      lastInputBox = currentInputBox;  | 
