Chrome扩展程序" all_frames"是无效的

时间:2015-11-21 13:46:46

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

问题

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

的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;
}

嵌件的script.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

1 个答案:

答案 0 :(得分:1)

已更改,仅比<body onload中显示的更晚,您可以在devtools中进行检查:

screenshot

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

if (xmlhttp.readyState == 4) {

至于减少延迟:

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