Google chrome extension 在框架层次结构中标识真正的activeElement

Google chrome extension 在框架层次结构中标识真正的activeElement,google-chrome-extension,firefox-addon,firefox-addon-webextensions,Google Chrome Extension,Firefox Addon,Firefox Addon Webextensions,我正在寻找一种方法,以更新其价值为目标,获得任何页面的集中输入 我有一个内容脚本,它接收值并检查activeElement是否为 挑战在于主文档的activeElement是iframe时。我可以在manifest中设置所有帧:true,这将找到任何活动的,但我只想设置活动iframe的activeElement的值 目前,我正在解决这个问题,让子内容脚本模糊除当前元素之外的所有活动元素(将处理程序附加到focusin),但是不修改文档状态的解决方案会更好 是否可以只向主文档发送消息,如果此文档

我正在寻找一种方法,以更新其价值为目标,获得任何页面的集中输入

我有一个内容脚本,它接收值并检查activeElement是否为

挑战在于主文档的activeElement是iframe时。我可以在manifest中设置
所有帧:true
,这将找到任何活动的
,但我只想设置活动iframe的activeElement的值

目前,我正在解决这个问题,让子内容脚本模糊除当前元素之外的所有活动元素(将处理程序附加到
focusin
),但是不修改文档状态的解决方案会更好

是否可以只向主文档发送消息,如果此文档的activeElement是iframe,则获取该frameId(然后重试)


我不控制网页。

插入一个新的内容脚本,用于检查帧的完整层次结构,包括跨域帧

主内容脚本在需要时询问背景/事件页面:

if(document.activeElement.matches('input')&&window==parent){
console.log('Input',document.activeElement);
document.activeElement.value+='gotcha!';
}否则{
chrome.runtime.sendMessage({action:'modifyInput'});
}
脚本在所有帧中执行附加内容脚本:

chrome.runtime.onMessage.addListener(函数(msg、sender、sendResponse)){
如果(msg.action==“modifyInput”){
chrome.tabs.executeScript(sender.tab和&sender.tab.id{
文件:“modify input.js”,
所有帧:对,
matchAboutBlank:是的,
runAt:'文档结束',
});
}
});
modify input.js,IIFE用于确保垃圾收集删除注入的内容

;(功能(){
如果(isInputActive()){
如果(窗口==父级){
找到输入();
}否则{
askParent();
}
}else if(isFrameActive()){
window.addEventListener('message',函数onMessage(e){
如果(!e.data | | e.data.id!=chrome.runtime.id)
返回;
开关(如数据动作){
//来自子帧的请求
“检查我”一案:
如果(窗口==父级){
确认儿童(如来源);
removeEventListener('message',onMessage);
}否则{
askParent();
}
打破
//家长的回应
“确诊”病例:
removeEventListener('message',onMessage);
如果(isInputActive()){
找到输入();
}else if(isFrameActive()){
确认儿童(如来源);
}
打破
}
});
}
函数是输入的(){
return document.activeElement.matches('input');
}
函数isFrameActive(){
return document.activeElement.matches('frame,iframe');
}
函数askParent(){
postMessage({id:chrome.runtime.id,action:'checkme'},'*');
}
函数confirmChild(childWindow){
console.log('Frame',document.activeElement);
postMessage({id:chrome.runtime.id,操作:'confirm':true},*');
}
函数foundTheInput(){
console.log('Input',document.activeElement);
document.activeElement.value+='gotcha!';
}
})();

我没有对此进行测试,但以前使用过类似的代码。

有趣的解决方案。。但是,如果
B
a
的子帧,并且我们正在B中搜索input activeElement,则在IsInput case上也需要一个侦听器。B将不会有一个具有建议代码的侦听器。这意味着我也需要拒绝消息(以清理侦听器)。A是主窗口。。非常复杂,但让我们完成工作吧——我还没有找到更好的方法=>接受