From 88cbe89247a4ebdf9498d77eb0f7e675b7a4c785 Mon Sep 17 00:00:00 2001 From: Stanley Shyiko Date: Mon, 28 Oct 2013 22:13:37 +0200 Subject: Fixed detection of links which are only partially inside the viewport --- lib/dom_utils.coffee | 16 +++++++++++++--- tests/dom_tests/dom_utils_test.coffee | 8 ++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/dom_utils.coffee b/lib/dom_utils.coffee index 38b23202..70e52a6c 100644 --- a/lib/dom_utils.coffee +++ b/lib/dom_utils.coffee @@ -46,11 +46,21 @@ DomUtils = # getVisibleClientRect: (element) -> # Note: this call will be expensive if we modify the DOM in between calls. - clientRects = element.getClientRects() + clientRects = ({ + top: clientRect.top, right: clientRect.right, bottom: clientRect.bottom, left: clientRect.left, + width: clientRect.width, height: clientRect.height + } for clientRect in element.getClientRects()) for clientRect in clientRects - if (clientRect.top < -2 || clientRect.top >= window.innerHeight - 4 || - clientRect.left < -2 || clientRect.left >= window.innerWidth - 4) + if (clientRect.top < 0) + clientRect.height += clientRect.top + clientRect.top = 0 + + if (clientRect.left < 0) + clientRect.width += clientRect.left + clientRect.left = 0 + + if (clientRect.top >= window.innerHeight - 4 || clientRect.left >= window.innerWidth - 4) continue if (clientRect.width < 3 || clientRect.height < 3) diff --git a/tests/dom_tests/dom_utils_test.coffee b/tests/dom_tests/dom_utils_test.coffee index d0f881ba..130a3014 100644 --- a/tests/dom_tests/dom_utils_test.coffee +++ b/tests/dom_tests/dom_utils_test.coffee @@ -42,6 +42,14 @@ context "Check visibility", assert.equal null, DomUtils.getVisibleClientRect document.getElementById 'foo' assert.equal null, DomUtils.getVisibleClientRect document.getElementById 'bar' + should "detect links only partially outside viewport as visible", -> + document.getElementById("test-div").innerHTML = """ + test + test + """ + assert.isTrue (DomUtils.getVisibleClientRect document.getElementById 'foo') != null + assert.isTrue (DomUtils.getVisibleClientRect document.getElementById 'bar') != null + should "detect opacity:0 links as hidden", -> document.getElementById("test-div").innerHTML = """ test -- cgit v1.2.3