2009-10-25 6 views
6

저는 크롬에있는 사용자 스크립트로 지금 막 놀고 있습니다. 그러므로 제 잠재적 인 무지/멍청함을 참아주십시오.Greasemonkey/Firefox의 unsafeWindow 기능을 Chrome에서 어떻게 모방 할 수 있습니까?

스크립트를 작성중인 페이지에서 변수 x을 선언하는 <script> 요소가 있습니다. 내 사용자 스크립트에서 전역 네임 스페이스의 x에 액세스 할 수 있습니까?

예를 들어 내 사용자 스크립트의 유일한 줄이 alert(x); 인 경우 예상대로 작동해야합니까? (x은 문자열) Chrome이 unsafewindow를 지원하지 않는다는 것을 이해합니다. 그러나 어떤 이유로 나는 기능을 모방하는 방법을 알아내는 것이 불가능하다는 것을 알고 있습니다. 심지어 가능할까요?

답변

9

contentWindow은 Chrome 3에서 사용할 수 있지만 removed in Chrome 4입니다. 크롬 4 만 가능한 솔루션 :

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

이를 heres 생각하면 ... 주소 표시 줄을 사용하여 스크립트를 확인 삽입 할 수

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

다음 당신은 당신의 자바 스크립트와 창에 당신이 원하는대로 실행할 수 있습니다

+0

오와 변수가 페이지에 대한 글로벌 경우 당신은 그것을 읽을 수 있어야 당신의 자바 스크립트 –

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가 더 이상 크롬이 출시 최신 작동 이용하지 않습니다.

크롬에서 unsafeWindow 기능을 사용하려면 가장 좋은 방법은 Tampermonkey을 설치하고 사용하는 것입니다. Tampermonkey는 Greasemonkey API와 훨씬 쉬운 스크립트 관리를 완벽하게 지원합니다.

Greasemonkey 스크립트와 Tampermonkey 스크립트는 거의 항상 완벽하게 호환되며 일반적인 Chrome 사용자 스크립트에는 해당되지 않습니다.

계속 진행되는 Tampermonkey는 여전히 어떤 형태의 script injection을 사용하는 것입니다.

Chrome now defines unsafeWindow for userscripts/content-scripts하지만 크롬의 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 (this, arguments); }'하지만 요청하는 동안 출력이 없습니다. 이 코드는 페이지에 삽입하면 출력을 생성합니다. – mix

+0

@Mix, 예, 방금 Chrome 버전 18 및 버전 19 (19.0.1084.56 m)에서 작동 함을 확인했습니다. 문제에 대한 새로운 질문을 엽니 다. –

+0

크롬에서 더 이상 작동하지 않습니다 – user280109

관련 문제