aboutsummaryrefslogtreecommitdiffstats
path: root/linkHints.js
diff options
context:
space:
mode:
authorint32010-05-04 04:54:28 +0800
committerPhil Crosby2010-05-17 00:28:08 -0700
commita35345455bb83999837bb8109d780458d8c6aa2f (patch)
tree86b2a8559b26e00da0948334903955dcad3adaf2 /linkHints.js
parent8001f3e553269739d8fd42671b58677455302eb0 (diff)
downloadvimium-a35345455bb83999837bb8109d780458d8c6aa2f.tar.bz2
Some optimizations for link hints. Approx 4-12% faster.
Diffstat (limited to 'linkHints.js')
-rw-r--r--linkHints.js39
1 files changed, 16 insertions, 23 deletions
diff --git a/linkHints.js b/linkHints.js
index fb47053d..b0a8413d 100644
--- a/linkHints.js
+++ b/linkHints.js
@@ -87,24 +87,26 @@ function getVisibleClickableElements() {
// Find all visible clickable elements.
for (var i = 0; i < resultSet.snapshotLength; i++) {
var element = resultSet.snapshotItem(i);
- var boundingRect = element.getBoundingClientRect();
+ var clientRect = element.getClientRects()[0];
- if (isVisible(element, boundingRect))
- visibleElements.push(element);
+ if (isVisible(element, clientRect))
+ visibleElements.push({element: element, rect: clientRect});
// If the link has zero dimensions, it may be wrapping visible
// but floated elements. Check for this.
- if (boundingRect.width == 0 || boundingRect.height == 0) {
+ if (clientRect && (clientRect.width == 0 || clientRect.height == 0)) {
for (var j = 0; j < element.childNodes.length; j++) {
// check that the node is an element node
if (element.childNodes[j].nodeType != 1) // nodeType 1: ELEMENT_NODE
continue;
- if (window.getComputedStyle(element.childNodes[j], null).getPropertyValue('float') != 'none'
- && isVisible(element.childNodes[j])) {
- visibleElements.push(element.childNodes[j]);
- break;
+ if (window.getComputedStyle(element.childNodes[j], null).getPropertyValue('float') != 'none') {
+ var childClientRect = element.childNodes[j].getClientRects()[0];
+ if (isVisible(element.childNodes[j], childClientRect)) {
+ visibleElements.push({element: element.childNodes[j], rect: childClientRect});
+ break;
+ }
}
}
@@ -115,20 +117,15 @@ function getVisibleClickableElements() {
/*
* Returns true if element is visible.
- * boundingRect is an optional argument.
*/
-function isVisible(element, boundingRect) {
- // Note that getBoundingClientRect() is relative to the viewport
- if (boundingRect === undefined)
- boundingRect = element.getBoundingClientRect();
-
+function isVisible(element, clientRect) {
// Exclude links which have just a few pixels on screen, because the link hints won't show for them anyway.
var zoomFactor = currentZoomLevel / 100.0;
- if (boundingRect.top < 0 || boundingRect.top * zoomFactor >= window.innerHeight - 4 ||
- boundingRect.left < 0 || boundingRect.left * zoomFactor >= window.innerWidth - 4)
+ if (!clientRect || clientRect.top < 0 || clientRect.top * zoomFactor >= window.innerHeight - 4 ||
+ clientRect.left < 0 || clientRect.left * zoomFactor >= window.innerWidth - 4)
return false;
- if (boundingRect.width < 3 || boundingRect.height < 3)
+ if (clientRect.width < 3 || clientRect.height < 3)
return false;
// eliminate invisible elements (see test_harnesses/visibility_test.html)
@@ -137,10 +134,6 @@ function isVisible(element, boundingRect) {
computedStyle.getPropertyValue('display') == 'none')
return false;
- var clientRect = element.getClientRects()[0];
- if (!clientRect)
- return false;
-
return true;
}
@@ -288,13 +281,13 @@ function createMarkerFor(link, linkHintNumber, linkHintDigits) {
marker.setAttribute("hintString", hintString);
// Note: this call will be expensive if we modify the DOM in between calls.
- var clientRect = link.getClientRects()[0];
+ var clientRect = link.rect;
// The coordinates given by the window do not have the zoom factor included since the zoom is set only on
// the document node.
var zoomFactor = currentZoomLevel / 100.0;
marker.style.left = clientRect.left + window.scrollX / zoomFactor + "px";
marker.style.top = clientRect.top + window.scrollY / zoomFactor + "px";
- marker.clickableItem = link;
+ marker.clickableItem = link.element;
return marker;
}