aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/link_hints.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts/link_hints.coffee')
-rw-r--r--content_scripts/link_hints.coffee25
1 files changed, 17 insertions, 8 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 3088812b..994d99b5 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -190,6 +190,7 @@ LocalHints =
isClickable = false
onlyHasTabIndex = false
visibleElements = []
+ reason = null
# Insert area elements that provide click functionality to an img.
if tagName == "img"
@@ -254,8 +255,15 @@ LocalHints =
when "label"
isClickable ||= element.control? and (@getVisibleClickable element.control).length == 0
when "body"
- isClickable ||= element == document.body and not document.hasFocus() and
- window.innerWidth > 3 and window.innerHeight > 3
+ isClickable ||=
+ if element == document.body and not document.hasFocus() and
+ window.innerWidth > 3 and window.innerHeight > 3 and
+ document.body?.tagName.toLowerCase() != "frameset"
+ reason = "Frame."
+ when "div", "ol", "ul"
+ isClickable ||=
+ if Scroller.isScrollableElement element
+ reason = "Scroll."
# Elements with tabindex are sometimes useful, but usually not. We can treat them as second class
# citizens when it improves UX, so take special note of them.
@@ -267,7 +275,7 @@ LocalHints =
if isClickable
clientRect = DomUtils.getVisibleClientRect element, true
if clientRect != null
- visibleElements.push {element: element, rect: clientRect, secondClassCitizen: onlyHasTabIndex}
+ visibleElements.push {element: element, rect: clientRect, secondClassCitizen: onlyHasTabIndex, reason}
visibleElements
@@ -313,7 +321,7 @@ LocalHints =
# Subtract negativeRect from every rect in rects, and concatenate the arrays of rects that result.
rects = [].concat (rects.map (rect) -> Rect.subtract rect, negativeRect)...
if rects.length > 0
- nonOverlappingElements.push {element: visibleElement.element, rect: rects[0]}
+ nonOverlappingElements.push extend visibleElement, rect: rects[0]
else
# Every part of the element is covered by some other element, so just insert the whole element's
# rect. Except for elements with tabIndex set (second class citizens); these are often more trouble
@@ -325,7 +333,7 @@ LocalHints =
hint.hasHref = hint.element.href? for hint in localHints
if Settings.get "filterLinkHints"
@withLabelMap (labelMap) =>
- extend hint, @generateLinkText labelMap, hint.element for hint in localHints
+ extend hint, @generateLinkText labelMap, hint for hint in localHints
localHints
# Generate a map of input element => label text, call a callback with it.
@@ -342,7 +350,8 @@ LocalHints =
labelMap[forElement] = labelText
callback labelMap
- generateLinkText: (labelMap, element) ->
+ generateLinkText: (labelMap, hint) ->
+ element = hint.element
linkText = ""
showLinkText = false
# toLowerCase is necessary as html documents return "IMG" and xhtml documents return "img"
@@ -362,8 +371,8 @@ LocalHints =
element.firstElementChild.nodeName.toLowerCase() == "img"
linkText = element.firstElementChild.alt || element.firstElementChild.title
showLinkText = true if linkText
- else if element == document.body
- linkText = "Frame."
+ else if hint.reason?
+ linkText = hint.reason
showLinkText = true
else
linkText = (element.textContent.trim() || element.innerHTML.trim())[...512]