aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content_scripts/injected.coffee27
1 files changed, 23 insertions, 4 deletions
diff --git a/content_scripts/injected.coffee b/content_scripts/injected.coffee
index 4148ffa5..00b083b0 100644
--- a/content_scripts/injected.coffee
+++ b/content_scripts/injected.coffee
@@ -5,13 +5,32 @@
injectedCode = () ->
# Note the presence of "click" listeners installed with `addEventListener()` (for link hints).
- _addEventListener = Element::addEventListener
+ _addEventListener = EventTarget::addEventListener
+ _toString = Function::toString
+ # Note some pages may override Element (see https://github.com/gdh1995/vimium-plus/issues/11)
+ EL = if typeof Element == "function" then Element else HTMLElement
+ Anchor = HTMLAnchorElement
- Element::addEventListener = (type, listener, useCapture) ->
- if type == "click"
- try @setAttribute "_vimium-has-onclick-listener", ""
+ addEventListener = (type, listener, useCapture) ->
+ if type == "click" and this instanceof EL
+ try
+ unless this instanceof Anchor # just skip <a>
+ @setAttribute "_vimium-has-onclick-listener", ""
_addEventListener?.apply this, arguments
+ newToString = () ->
+ real = if this == newToString then _toString else
+ if this == addEventListener then _addEventListener else
+ this
+ _toString.apply real, arguments
+
+ EventTarget::addEventListener = addEventListener
+ # Libraries like Angular/Zone and CKEditor check if element.addEventListener is native,
+ # so here we hook it to tell outsides it is exactly native.
+ # This idea is from https://github.com/angular/zone.js/pull/686,
+ # and see more discussions in https://github.com/ckeditor/ckeditor5-build-classic/issues/34
+ Function::toString = newToString
+
script = document.createElement "script"
script.textContent = "(#{injectedCode.toString()})()"
(document.head || document.documentElement).appendChild script