From c61af3c8055a744a48dfc4bd96e6c471a1b655ff Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Mon, 12 May 2014 09:17:05 +0200 Subject: [PATCH] Don't place hints in invisible frames --- qutebrowser/utils/webelem.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/qutebrowser/utils/webelem.py b/qutebrowser/utils/webelem.py index 01bcd9f40..978dfbc8a 100644 --- a/qutebrowser/utils/webelem.py +++ b/qutebrowser/utils/webelem.py @@ -67,21 +67,31 @@ def is_visible(elem): Return: True if the element is visible, False otherwise. """ - # FIXME we should also check if the frame is visible if elem.isNull(): raise ValueError("Element is a null-element!") - frame = elem.webFrame() + ## We're starting in the innermost (element) frame and check if every frame + ## is visible in its parent. + base = elem.webFrame() + parent = base.parentFrame() + while parent is not None: + parentgeom = parent.geometry() + parentgeom.translate(parent.scrollPosition()) + if not parentgeom.intersects(base.geometry()): + return False + base = parent + parent = parent.parentFrame() rect = elem.geometry() + ## Now check if the element is visible in the frame. if (not rect.isValid()) and rect.x() == 0: # Most likely an invisible link return False + frame = elem.webFrame() framegeom = frame.geometry() framegeom.moveTo(0, 0) framegeom.translate(frame.scrollPosition()) - if not framegeom.intersects(rect): - # out of screen - return False - return True + if framegeom.intersects(rect): + return True + return False def pos_on_screen(elem):