diff options
| author | gdh1995 | 2018-02-04 17:49:05 +0800 | 
|---|---|---|
| committer | gdh1995 | 2018-02-04 17:49:10 +0800 | 
| commit | 3a4db76703e852670ca1078b2205edffcaa3efcf (patch) | |
| tree | dc7c6f35c9f8a733ef706ee868d88915c3c30018 | |
| parent | 335be2acf9fd6c9f1a2c706e2d0eebd496c43d04 (diff) | |
| download | vimium-3a4db76703e852670ca1078b2205edffcaa3efcf.tar.bz2 | |
make the hooked addEventListener looks native
| -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 | 
