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; |
