2009-10-25 7 views
6

私はクロムのユーザースクリプトを使っていますので、私の潜在的な無知/馬鹿騒ぎに気をつけてください。Greasemonkey/FirefoxのunsafeWindow機能をChromeでどうやって模倣できますか?

私がスクリプトを書いているページでは、変数xを宣言する<script>要素があります。 これは、私のユーザスクリプトでは、グローバル名前空間からxにアクセスすることができますか?

たとえば、私のuserscript内の唯一の行がalert(x);であれば、それは期待どおりに動作するはずです(xは文字列と仮定します)。私はクロムがunsafewindowをサポートしていないと理解していますが、何らかの理由で私はその機能を模倣する方法を理解することが不可能であることがわかっています。それも可能ですか?

答えて

9

contentWindowは、Chrome 3では利用できましたが、removed in Chrome 4でした。クローム4のための唯一の可能な解決策:

location.href="javascript:(function(){ alert('Hello'); })()" 
0

OK HERESにアドレスバーを使用してスクリプトを注入することができるという考え...

javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm); 

あなたはあなたのJavaScriptでウィンドウにあなたが好きな実行することができます

+0

ああ、変数がページのグローバルであれば、あなたにそれを読むことができるはずですjavascript –

13

これは、あなた(Pなど)のウィンドウオブジェクトへの参照を提供します:

var p = unsafeWindow; 

if(window.navigator.vendor.match(/Google/)) { 
    var div = document.createElement("div"); 
    div.setAttribute("onclick", "return window;"); 
    p = div.onclick(); 
}; 
+0

ありがとう、ありがとう、ありがとうございました – ysth

+6

"ベンダースニッフィング"の必要はありません、このような何かをすることができます:https://gist.github.com/1143845 –

+7

これは最新ではもう動作しませんChromeのバージョン –

1

Yの場合あなたがページのJavaScriptと対話したい場合は、ページにスクリプトを挿入する必要があります。 (もちろん、このページで提案されているハックを使用したいのでない限り)私は自分のスクリプトのためにそれを行うための関数を作成しました。誰でもそれを使用したい場合に備えてここに投稿します。明確にする

/* 
    @description This function will insert the given code as a <script> or <style> block into a page. 
    @param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS). 
    @param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'. 
    @return The HTML element that was inserted, or FALSE on failure 
*/ 
function insert(z,t){ 
    var j,f,x,c,i,n,d 
    d=document 
    c=d.createElement 
    i=d.head.appendChild 
    a=d.createTextNode 
    if(typeof z==='function') j=!0,f=!0; 
    if((t=='js'||!t)&&!f){j=!0,f=!1} 
    if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')} 
    if(j){x=c('script');x.setAttribute('type','text/javascript')} 
    if(f) n=a('('+z+')()');else n=a(z) 
    x.appendChild(n) 

    if(x){return i(x)}else{return !1} 
} 

いくつかの例:

//Inserting a JavaScript function 
var func=function(){ 
    stopAds(); 
    startFileDownload(); 
} 

insert(func); 


//Inserting JavaScript as a string 
var strJS="prompt(\"Copy:\",someVariableAtThePage);"; 

insert(strJS); 
//Or with an OPTIONAL 2nd parameter: 
insert(strJS,'js'); 


//Inserting CSS 
var strCSS=".ad{display:none !important} #downloadButton{display:block}"; 

insert(strCSS,'css');//Specifying 2nd parameter as "css" is required. 
11

更新:
onclickは、最新のクロームのリリースで動作しなくなりまし悪用しません。

ChromeでunsafeWindowの機能を利用するには、Tampermonkeyをインストールして使用することをお勧めします。 TampermonkeyはGreasemonkey APIを完全にサポートしており、スクリプト管理ははるかに簡単です。

GreasemonkeyスクリプトとTampermonkeyスクリプトは、ほとんどの場合、完全に互換性があります。これは、一般的なChromeのユーザスクリプトには当てはまりません。

Tampermonkeyを送信すると、まだ動作している唯一の方法は、script injectionという形式を使用することです。



次は廃止されました:

Chrome now defines unsafeWindow for userscripts/content-scriptsが、ChromeのunsafeWindowは、まだターゲットページで作成されたJSオブジェクトへのアクセスを許可していません。

ここでは、適切に危険なを提供する方法ですunsafeWindowからFeature Detection (good) versus Browser Sniffing (Bad)を使用していますクロスブラウザの方法で:

/*--- Create a proper unsafeWindow object on browsers where it doesn't exist 
    (Chrome, mainly). 
    Chrome now defines unsafeWindow, but does not give it the same access to 
    a page's javascript that a properly unsafe, unsafeWindow has. 
    This code remedies that. 
*/ 
var bGreasemonkeyServiceDefined  = false; 

try { 
    if (typeof Components.interfaces.gmIGreasemonkeyService === "object") { 
     bGreasemonkeyServiceDefined = true; 
    } 
} 
catch (err) { 
    //Ignore. 
} 

if (typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) { 
    unsafeWindow = (function() { 
     var dummyElem = document.createElement('p'); 
     dummyElem.setAttribute ('onclick', 'return window;'); 
     return dummyElem.onclick(); 
    })(); 
} 
+0

これはまだ動作しますか?私はXHRの送信を無効にするためにクロムで試しましたが、何もしないようです。私はちょうど追加: 'var oldSend = unsafeWindow.XMLHttpRequest.prototype.send; unsafeWindow.XMLHttpRequest.prototype.send = function(){console.log( "XHRアップデートの通知"); oldSend.apply(これ、引数); } 'しかし、私は要求の間に出力を得ません。このコードは、ページに挿入すると出力を生成します。 – mix

+0

@Mix、はい、Chromeバージョン18とバージョン19(19.0.1084.56 m)で動作することが確認されました。問題の新しい質問を開きます。 –

+0

クロムでこれ以上は役に立たない – user280109

関連する問題