diff options
| -rw-r--r-- | content_scripts/injected.coffee | 27 |
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 |
