如何覆盖 Polymer 内容脚本函数

问题描述 投票:0回答:1

我一直试图了解当您点击描述中的链接时,youtube.com 上的哪部分代码会将您重定向到另一个网站。为此,我尝试阻止所有与单击的元素相关的事件运行,但这没有帮助:

Object.keys(window).filter(
  k => /(?=^on)(?!.*move)(?!.*pointerup)(?!.*auxclick)/.test(k)
).forEach(key => {
  et.addEventListener(key.slice(2), ex => {
    console.log(`stop: ${key}`)
    ex.stopPropagation()
    ex.preventDefault()
  })
})

所以我进入浏览器控制台并检查按下按钮时会调用哪个函数。但是,当我尝试从调试器调用此函数时,我得到“x 未定义”。

有人可以解释为什么这些函数无法访问,并且无法覆盖它们,即使是使用内容脚本的扩展代码也是如此?

javascript polymer browser-console
1个回答
0
投票

所以,你可以劫持

addEventListener
函数本身,你可以从
window.__proto__.__proto__.__proto__
找到它的源码,其中包含
addEventListener
removeEventListener
dispatchEvent

将以下代码粘贴到 YouTube 选项卡中;不会添加任何事件侦听器,您引用的任何全局变量也不会有用,并且此代码将打开的选项卡,而从技术上讲,youtube 将是非常破碎

function execute(){
  const eventClass=window.__proto__.__proto__.__proto__
  const realListener=eventClass.addEventListener
  eventClass.addEventListener=function(){
  //return realListener.bind(this)(...arguments) //uncomment line if you want other listeners to be added
}

//now for modification of your code
  Object.keys(window).filter(
    k => /(?=^on)(?!.*move)(?!.*pointerup)(?!.*auxclick)/.test(k)
).forEach(function(key){
    const event=key.substr(2)
    realListener.bind(window)(key.slice(2), ex => {
      console.log(`stop: ${key}`)
      ex.stopPropagation()
      ex.preventDefault()
    })
    let dummy=null
    Object.defineProperty(window,key,{get:_=>dummy,set:thing=>dummy=thing})
  })
}
let myWindow=window.open(location.href)
myWindow.eval(`(${execute.toString()})()`)
© www.soinside.com 2019 - 2024. All rights reserved.