5

私はこの質問への答えを見つけようとしていたるところを見ました。拡張機能でページ上のすべてのJavaScriptを無効にしますが、機能するcotentスクリプトを挿入できるようにします。(したがって、chrome.contentSettings.javascriptは今のところ有効なオプションではありません)あるいは、スクリプトタグが起動する前にすべてのスクリプトタグを削除する方法が必要です(これはちょっと同じことです)

runat:document_startにコンテンツスクリプトを挿入しようとしましたが、その時点でdomが完全に存在していません。状態がロードされているときにtabs.onUpdateにコンテンツリップを追加しようとしましたが、それは遅すぎます。また、document_endのコンテンツスクリプト(すべてスクリプトタグを削除しようとします)も遅すぎます。必死になって、element.innerHTMLのゲッターとセッターの動作をに変更してみました。タグを削除しますが、それもうまくいきませんでした

xhrリクエストをlocation.hrefに送信することを避け、コンテンツを解析して再設定しようとしています。これは集中的すぎるためです。

何か案は?

4

2 に答える 2

7

あなたのコメントを見た後、私はこれがあなたのニーズに合うかもしれないと思います。これは、ページのソースを取得し、それをDOMにレンダリングし、すべてのJSを無効にしてから、ページに戻すことで機能します。正確にはあなたが望んでいたものではありませんが、あなたのケースによく合うはずです...

mainfest.json

{
  "name": "Reload and Kill JS - Using a content script",
  "version": "1.0",
  "permissions": [
    "tabs", "<all_urls>" , "storage"
  ],
  "background": {
    "scripts": ["background.js"]
  },
   "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["injectedCode.js"],
      "run_at" : "document_start"
    }
  ],
  "minimum_chrome_version" : "20",
  "manifest_version" : 2
}

background.js

chrome.storage.local.set({"blockhttp://paez.kodingen.com/":true});

注入されたCode.js

reloadAndKillJS = function() {
    document.documentElement.innerHTML = 'Reloading Page...';
    
    var xhr = new XMLHttpRequest();
    
    xhr.open('GET', window.location.href, true);
    
    xhr.onerror = function() {
        document.documentElement.innerHTML = 'Error getting Page';
    }
    
    xhr.onload = function() {
        var page = document.implementation.createHTMLDocument("");
        page.documentElement.innerHTML = this.responseText;
    
        var newPage = document.importNode(page.documentElement,true);
    
        var nodeList = newPage.querySelectorAll('script');
        for (var i = 0; i < nodeList.length; ++i) {
            var node = nodeList[i];
            if (node.src) {
                node.setAttribute('original-src', node.src);
                node.removeAttribute('src');
            }
            node.innerText = '';
        }
    
        document.replaceChild(newPage, document.documentElement);
        delete page;
    
        // Do your thing here
    }
    
    xhr.send();
}
    
   
chrome.storage.local.get("block"+window.location.href,function(items) 
{
    if (items["block"+window.location.href]){
        window.stop();
        reloadAndKillJS();  
    }
});
于 2012-07-26T12:44:33.483 に答える
1

スクリプトを本当に防ぐ唯一の方法は、contentSettingsを使用することです。したがって、contentSettingsルールは特定のURLに適用できるため、コードを別のドメインの別の場所に配置する必要があります。

ドキュメントの開始時に実行するコンテンツスクリプトを配置します。

contentScript.js:

window.stop();
document.all[0].innerHTML = "\
<html>\
    <body>\
        <iframe src=\"chrome-extension://ID/inject.html?url="+encodeURIComponent(location.href)+"\"></iframe>\
    </body>\
</html>";

inject.html:

<html>
<head>
<script>
    var frame = document.querySelector('iframe');
    frame.src = location.search.replace('?url=', '');
    frame.onload = function() {
        //Your stuff here
    }
</script>
</head>
<body>
    <iframe></iframe>
</body>
<html>

これで、コードは親フレームと別のドメインにありますが、CORSの問題が発生する可能性があり、後でいくつかの回避策を見つけることができます。試してみて、修正するものがあるかどうか教えてください。

于 2012-07-25T14:18:31.973 に答える