diff options
| author | Stephen Blott | 2015-04-28 09:34:54 +0100 |
|---|---|---|
| committer | Stephen Blott | 2015-04-28 09:34:54 +0100 |
| commit | 36df218436e0a873272367f11727207a7530c371 (patch) | |
| tree | 044eba20d072878625e633c4f16b27206855ee50 /lib | |
| parent | ed7533b48f2f0c7cdd0272f9c6c61c44cfc5c463 (diff) | |
| parent | 99ffe60fe28e015f379b697ef2499ecb2faeb958 (diff) | |
| download | vimium-36df218436e0a873272367f11727207a7530c371.tar.bz2 | |
Merge pull request #1607 from mrmr1993/make-getVisibleClientRect-safe
Make getVisibleClientRect behave as expected by default
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dom_utils.coffee | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index efb125f6..30b9f68c 100644 --- a/lib/dom_utils.coffee +++ b/lib/dom_utils.coffee @@ -55,21 +55,25 @@ DomUtils = # # Returns the first visible clientRect of an element if it exists. Otherwise it returns null. # - getVisibleClientRect: (element) -> + # WARNING: If testChildren = true then the rects of visible (eg. floated) children may be returned instead. + # This is used for LinkHints and focusInput, **BUT IS UNSUITABLE FOR MOST OTHER PURPOSES**. + # + getVisibleClientRect: (element, testChildren = false) -> # Note: this call will be expensive if we modify the DOM in between calls. clientRects = (Rect.copy clientRect for clientRect in element.getClientRects()) for clientRect in clientRects - # If the link has zero dimensions, it may be wrapping visible - # but floated elements. Check for this. - if (clientRect.width == 0 || clientRect.height == 0) + # If the link has zero dimensions, it may be wrapping visible but floated elements. Check for this. + if (clientRect.width == 0 or clientRect.height == 0) and testChildren for child in element.children computedStyle = window.getComputedStyle(child, null) # Ignore child elements which are not floated and not absolutely positioned for parent elements with # zero width/height + # NOTE(mrmr1993): This ignores floated/absolutely positioned descendants nested within inline + # children. continue if (computedStyle.getPropertyValue('float') == 'none' && computedStyle.getPropertyValue('position') != 'absolute') - childClientRect = @getVisibleClientRect(child) + childClientRect = @getVisibleClientRect child, true continue if childClientRect == null or childClientRect.width < 3 or childClientRect.height < 3 return childClientRect @@ -80,9 +84,7 @@ DomUtils = # eliminate invisible elements (see test_harnesses/visibility_test.html) computedStyle = window.getComputedStyle(element, null) - if (computedStyle.getPropertyValue('visibility') != 'visible' || - computedStyle.getPropertyValue('display') == 'none') - continue + continue if computedStyle.getPropertyValue('visibility') != 'visible' return clientRect |
