diff --git a/qutebrowser/javascript/position_caret.js b/qutebrowser/javascript/position_caret.js index 9213df49d..b75f8edf4 100644 --- a/qutebrowser/javascript/position_caret.js +++ b/qutebrowser/javascript/position_caret.js @@ -1,6 +1,6 @@ /** * Copyright 2015 Artur Shaik -* Copyright 2015 Florian Bruhin (The Compiler) +* Copyright 2015-2016 Florian Bruhin (The Compiler) * * This file is part of qutebrowser. * @@ -32,79 +32,83 @@ "use strict"; -function isElementInViewport(node) { // eslint-disable-line complexity - var i; - var boundingRect = (node.getClientRects()[0] || - node.getBoundingClientRect()); +(function() { + function isElementInViewport(node) { // eslint-disable-line complexity + var i; + var boundingRect = (node.getClientRects()[0] || + node.getBoundingClientRect()); - if (boundingRect.width <= 1 && boundingRect.height <= 1) { - var rects = node.getClientRects(); - for (i = 0; i < rects.length; i++) { - if (rects[i].width > rects[0].height && - rects[i].height > rects[0].height) { - boundingRect = rects[i]; + if (boundingRect.width <= 1 && boundingRect.height <= 1) { + var rects = node.getClientRects(); + for (i = 0; i < rects.length; i++) { + if (rects[i].width > rects[0].height && + rects[i].height > rects[0].height) { + boundingRect = rects[i]; + } } } + if (boundingRect === undefined) { + return null; + } + if (boundingRect.top > innerHeight || boundingRect.left > innerWidth) { + return null; + } + if (boundingRect.width <= 1 || boundingRect.height <= 1) { + var children = node.children; + var visibleChildNode = false; + for (i = 0; i < children.length; ++i) { + boundingRect = (children[i].getClientRects()[0] || + children[i].getBoundingClientRect()); + if (boundingRect.width > 1 && boundingRect.height > 1) { + visibleChildNode = true; + break; + } + } + if (visibleChildNode === false) { + return null; + } + } + if (boundingRect.top + boundingRect.height < 10 || + boundingRect.left + boundingRect.width < -10) { + return null; + } + var computedStyle = window.getComputedStyle(node, null); + if (computedStyle.visibility !== "visible" || + computedStyle.display === "none" || + node.hasAttribute("disabled") || + parseInt(computedStyle.width, 10) === 0 || + parseInt(computedStyle.height, 10) === 0) { + return null; + } + return boundingRect.top >= -20; } - if (boundingRect === undefined) { - return null; - } - if (boundingRect.top > innerHeight || boundingRect.left > innerWidth) { - return null; - } - if (boundingRect.width <= 1 || boundingRect.height <= 1) { - var children = node.children; - var visibleChildNode = false; - for (i = 0; i < children.length; ++i) { - boundingRect = (children[i].getClientRects()[0] || - children[i].getBoundingClientRect()); - if (boundingRect.width > 1 && boundingRect.height > 1) { - visibleChildNode = true; + + function positionCaret() { + var walker = document.createTreeWalker(document.body, 4, null); + var node; + var textNodes = []; + var el; + while ((node = walker.nextNode())) { + if (node.nodeType === 3 && node.data.trim() !== "") { + textNodes.push(node); + } + } + for (var i = 0; i < textNodes.length; i++) { + var element = textNodes[i].parentElement; + if (isElementInViewport(element.parentElement)) { + el = element; break; } } - if (visibleChildNode === false) { - return null; + if (el !== undefined) { + var range = document.createRange(); + range.setStart(el, 0); + range.setEnd(el, 0); + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); } } - if (boundingRect.top + boundingRect.height < 10 || - boundingRect.left + boundingRect.width < -10) { - return null; - } - var computedStyle = window.getComputedStyle(node, null); - if (computedStyle.visibility !== "visible" || - computedStyle.display === "none" || - node.hasAttribute("disabled") || - parseInt(computedStyle.width, 10) === 0 || - parseInt(computedStyle.height, 10) === 0) { - return null; - } - return boundingRect.top >= -20; -} -(function() { - var walker = document.createTreeWalker(document.body, 4, null); - var node; - var textNodes = []; - var el; - while ((node = walker.nextNode())) { - if (node.nodeType === 3 && node.data.trim() !== "") { - textNodes.push(node); - } - } - for (var i = 0; i < textNodes.length; i++) { - var element = textNodes[i].parentElement; - if (isElementInViewport(element.parentElement)) { - el = element; - break; - } - } - if (el !== undefined) { - var range = document.createRange(); - range.setStart(el, 0); - range.setEnd(el, 0); - var sel = window.getSelection(); - sel.removeAllRanges(); - sel.addRange(range); - } + positionCaret(); })();