aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Blott2017-12-15 10:20:59 +0000
committerGitHub2017-12-15 10:20:59 +0000
commit8db85ce1c8c5f959981730a58ba351b3e49b0db2 (patch)
tree8652318eaa61bcb52c817445cdc8762db4db59f3
parentcbea71f4a41774ef91c384dc679f49d423f6c03b (diff)
parentf2d7e185c704e3cf8f6ca0c9d3d4da2498610475 (diff)
downloadvimium-8db85ce1c8c5f959981730a58ba351b3e49b0db2.tar.bz2
Merge pull request #2871 from smblott-github/detect-click-listeners
Detect click listeners for link hints.
-rw-r--r--content_scripts/injected.coffee20
-rw-r--r--content_scripts/link_hints.coffee3
-rw-r--r--manifest.json6
-rw-r--r--tests/dom_tests/dom_tests.coffee1
4 files changed, 30 insertions, 0 deletions
diff --git a/content_scripts/injected.coffee b/content_scripts/injected.coffee
new file mode 100644
index 00000000..d833d09c
--- /dev/null
+++ b/content_scripts/injected.coffee
@@ -0,0 +1,20 @@
+# The code in `injectedCode()`, below, is injected into the page's own execution context.
+#
+# This is based on method 2b here: http://stackoverflow.com/a/9517879, and
+# @mrmr1993's #1167.
+
+window.vimiumOnClickAttributeName = "_vimium-has-onclick-listener"
+
+injectedCode = (vimiumOnClickAttributeName) ->
+ # Note the presence of "click" listeners installed with `addEventListener()` (for link hints).
+ _addEventListener = Element::addEventListener
+
+ Element::addEventListener = (type, listener, useCapture) ->
+ @setAttribute vimiumOnClickAttributeName, "" if type == "click"
+ _addEventListener.apply this, arguments
+
+script = document.createElement "script"
+script.textContent = "(#{injectedCode.toString()})('#{vimiumOnClickAttributeName}')"
+(document.head || document.documentElement).appendChild script
+script.remove()
+
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 0592c96d..e5c6b3ea 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -706,6 +706,9 @@ LocalHints =
isClickable = true
reason = "Open."
+ # Detect elements with "click" listeners installed with `addEventListener()`.
+ isClickable ||= element.hasAttribute vimiumOnClickAttributeName
+
# An element with a class name containing the text "button" might be clickable. However, real clickables
# are often wrapped in elements with such class names. So, when we find clickables based only on their
# class name, we mark them as unreliable.
diff --git a/manifest.json b/manifest.json
index ce760d2e..fc94482b 100644
--- a/manifest.json
+++ b/manifest.json
@@ -70,6 +70,12 @@
"match_about_blank": true
},
{
+ "matches": ["<all_urls>"],
+ "js": ["content_scripts/injected.js"],
+ "run_at": "document_start",
+ "all_frames": true
+ },
+ {
"matches": ["file:///", "file:///*/"],
"css": ["content_scripts/file_urls.css"],
"run_at": "document_start",
diff --git a/tests/dom_tests/dom_tests.coffee b/tests/dom_tests/dom_tests.coffee
index 6e422d46..d9de743e 100644
--- a/tests/dom_tests/dom_tests.coffee
+++ b/tests/dom_tests/dom_tests.coffee
@@ -51,6 +51,7 @@ activateLinkHintsMode = ->
# link hinting modes.
#
createGeneralHintTests = (isFilteredMode) ->
+ window.vimiumOnClickAttributeName = "does-not-matter"
context "Link hints",