【问题标题】:Chrome extension "all_frames" is invalidChrome 扩展“all_frames”无效
【发布时间】:2015-11-21 13:46:46
【问题描述】:

问题

我尝试做一个插件来帮助修改navigator.platform,在主页(网络浏览器请求的页面)是好的,但我发现如果页面中有iframeiframe在我的content_scripts.js 不会修改页面,尽管我必须在manifest.json 文件中设置 all_frames: true`。这是为什么?

manifest.json

{  
    "name": "Platform Modifier",  
    "version": "1.0.0.0",  
    "manifest_version":2,
    "default_locale": "en",
    "permissions": ["tabs", "webRequest", "webRequestBlocking", "<all_urls>"],
    "background":{
        "persistent":true,
        "scripts":["bg.js"]
    },
    "browser_action": {
        "default_icon": "icon.png" ,
        "default_title": "Platform Modifier",
        "default_popup": "popup.html"
    },
    "content_scripts": [{
        "matches": ["*://*/*"],
        "all_frames": true,
        "js": ["content_scripts.js"],
        "run_at":"document_start"
    }],
    "web_accessible_resources":[
        "insert-script.js"
    ]
}

content_scripts.js

var xmlhttp = null;
var url = chrome.extension.getURL("insert-script.js");

if (window.XMLHttpRequest){
    xmlhttp=new XMLHttpRequest();
}

if(xmlhttp == null){
    console.log("not support XMLHTTP")
}else{
    xmlhttp.onreadystatechange=state_Change;
    xmlhttp.open("GET",url,true);
    xmlhttp.send(null);
}

function state_Change(){
    if(xmlhttp.status == 200){
        chrome.extension.sendRequest({op: "getAll"}, function(response) {
            var replaceList = {
                "TAG_PlatForm":response.value.platform,
                "TAG_UserAgent":response.value.userAgent
            };
            var sc=document.createElement("script");
            sc.type="text/javascript";
            sc.innerHTML= replaceText(xmlhttp.responseText,replaceList);
            var html=document.getElementsByTagName("html");
            html[0].appendChild(sc);
        });
    }
}

function replaceText(str,regexp){
    for(var key in regexp){
        str = str.replace(key,regexp[key]);
    }
    return str;
}

插入脚本.js

var myPlatForm = function() {
        return 'TAG_PlatForm';
};
var myUserAgent = function() {
    return 'TAG_UserAgent';
};
if (Object.defineProperty) {
    Object.defineProperty(navigator, 'platform', {
        get: myPlatForm
    });
    Object.defineProperty(navigator, 'userAgent', {
        get: myUserAgent
    }); 
} else if (Object.prototype.__defineGetter__) {
    navigator.__defineGetter__('platform', myPlatForm);
    navigator.__defineGetter__('userAgent', myPlatForm);
}

完整文件

Download Link,这个文件包含两部分:extensions.zip是Chrome扩展; testPages.zip 是用于测试的 HTML 文件。在测试文件中,打开main.html

【问题讨论】:

  • 谢谢,我已经编辑了问题。
  • 再次感谢,我已经上传了扩展。

标签: javascript google-chrome iframe google-chrome-extension


【解决方案1】:

改变了,只是比&lt;body onload显示的晚,你可以在devtools中查看:

通过在 XHR 中使用正确的条件来修复控制台中的错误(在每个 XHR 加载阶段多次注入代码,副本尝试重新定义不可配置的属性):

if (xmlhttp.readyState == 4) {

关于减少延迟:

  • 目前您正在等待 XHR 获取注入的脚本并等待对后台页面的消息请求。
  • 而是将注入的脚本代码作为文字字符串放入内容脚本中,并使用 chrome.storage.local 并直接在内容脚本和弹出页面中访问值。

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2014-12-06
    • 2013-08-17
    相关资源
    最近更新 更多