Skip to content

Commit 4aed55b

Browse files
author
Maxim Baz
committed
show link hints for elements that have delegated onclick listener philc#1404
1 parent 8bd8e13 commit 4aed55b

File tree

5 files changed

+53
-2
lines changed

5 files changed

+53
-2
lines changed

content_scripts/inject_script.coffee

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ fetchFileContents = (extensionFileName) ->
88

99
eventName = "reset"
1010
listenerName = "on#{eventName}"
11-
injectScripts = ["pages/addEventListener_hook.js"]
11+
injectScripts = ["pages/jQuery_delegatedEvents_hook.js", "pages/addEventListener_hook.js"]
1212

1313
# Store the original value of the event listener if one exists, or null otherwise.
1414
oldValue =

content_scripts/link_hints.coffee

+24-1
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,22 @@ LinkHints =
124124

125125
marker
126126

127+
#
128+
# Find children elements that have delegated onclick event listener assigned,
129+
# and mark them with `vimium-has-delegated-onclick-listener` attribute.
130+
# This will make sure those elements are discovered during `getVisibleClickableElements` call.
131+
#
132+
markChildrenThatHaveDelegatedOnClickListener: (element) ->
133+
return unless element.hasAttribute "vimium-jquery-delegated-events-selectors"
134+
135+
selectorsStr = element.getAttribute "vimium-jquery-delegated-events-selectors"
136+
selectors = selectorsStr.split("|").filter (x) -> !!x
137+
138+
for selector in selectors
139+
for child in element.querySelectorAll(selector)
140+
unless child.hasAttribute "vimium-has-delegated-onclick-listener"
141+
child.setAttribute "vimium-has-delegated-onclick-listener", ""
142+
127143
#
128144
# Determine whether the element is visible and clickable. If it is, find the rect bounding the element in
129145
# the viewport. There may be more than one part of element which is clickable (for example, if it's an
@@ -156,9 +172,13 @@ LinkHints =
156172
if (element.hasAttribute("onclick") or
157173
element.getAttribute("role")?.toLowerCase() in ["button", "link"] or
158174
element.getAttribute("contentEditable")?.toLowerCase() in ["", "contentEditable", "true"] or
159-
element.hasAttribute("vimium-has-onclick-listener"))
175+
element.hasAttribute("vimium-has-onclick-listener") or
176+
element.hasAttribute("vimium-has-delegated-onclick-listener"))
160177
isClickable = true
161178

179+
# Dispose the attribute so next time it is not included, in case listener has been removed
180+
element.removeAttribute "vimium-has-delegated-onclick-listener"
181+
162182
# Check for jsaction event listeners on the element.
163183
if element.hasAttribute "jsaction"
164184
jsactionRules = element.getAttribute("jsaction").split(";")
@@ -198,6 +218,8 @@ LinkHints =
198218
if clientRect != null
199219
visibleElements.push {element: element, rect: clientRect, secondClassCitizen: onlyHasTabIndex}
200220

221+
@markChildrenThatHaveDelegatedOnClickListener element
222+
201223
visibleElements
202224

203225
#
@@ -208,6 +230,7 @@ LinkHints =
208230
# element.
209231
#
210232
getVisibleClickableElements: ->
233+
@markChildrenThatHaveDelegatedOnClickListener document.documentElement
211234
elements = document.documentElement.getElementsByTagName "*"
212235
visibleElements = []
213236

manifest.json

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
},
6969
"web_accessible_resources": [
7070
"pages/vomnibar.html",
71+
"pages/jQuery_delegatedEvents_hook.js",
7172
"pages/addEventListener_hook.js"
7273
]
7374
}
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
markHookSet = "vimium-hooked-delegated-onclick-listeners"
2+
return if document.documentElement.hasAttribute(markHookSet)
3+
4+
5+
Object.defineProperty window, "jQuery",
6+
enumerable: yes
7+
configurable: yes
8+
set: (jQuery) ->
9+
_on = jQuery.fn.on
10+
11+
jQuery.fn.on = (evnt, selector, handlerFn) ->
12+
if evnt is "click" and typeof selector is "string"
13+
attrKey = "vimium-jquery-delegated-events-selectors"
14+
sep = "|"
15+
16+
element = if @[0] is document then document.documentElement else @[0]
17+
selectors = element.getAttribute(attrKey) || sep
18+
if selectors.indexOf("#{sep}#{selector}#{sep}") < 0
19+
element.setAttribute attrKey, selectors + selector + sep
20+
21+
return _on.apply @, arguments
22+
23+
return jQuery
24+
25+
26+
document.documentElement.setAttribute markHookSet, ""

tests/dom_tests/dom_tests.html

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<link rel="stylesheet" type="text/css" href="../../content_scripts/vimium.css" />
3030

3131
<!-- Simulate the load of injected hooks -->
32+
<script type="text/javascript" src="../../pages/jQuery_delegatedEvents_hook.js"></script>
3233
<script type="text/javascript" src="../../pages/addEventListener_hook.js"></script>
3334

3435
<script type="text/javascript" src="bind.js"></script>

0 commit comments

Comments
 (0)