2013-03-02 3 views
1

예제를 읽는 것으로부터 이것은 아주 쉬워야하는 것처럼 보입니다.loadSubScript()에 "targetObj"매개 변수를 사용하려면 어떻게해야합니까?

rhkTest = { 
    onPageLoad: function(event) { 
    var doc = event.originalTarget; 
    var wnd = doc.defaultView; 
    var loader = Components.classes["@mozilla.org/moz/jssubscript-loader;1"] 
     .getService(Components.interfaces.mozIJSSubScriptLoader); 
    loader.loadSubScript("chrome://rhkoshi-extension/content/testfoo.js", wnd); 
    alert('typeof(wnd) = ' + typeof(wnd)); 
    alert('typeof(wnd.window.rhk_test1) = ' + typeof(wnd.window.rhk_test1)); 
    alert('typeof(wnd.window.rhk_test2) = ' + typeof(wnd.window.rhk_test2)); 
    alert('typeof(wnd.window.rhk_test3) = ' + typeof(wnd.window.rhk_test3)); 
    alert('typeof(wnd.rhk_test1) = ' + typeof(wnd.rhk_test1)); 
    alert('typeof(wnd.rhk_test2) = ' + typeof(wnd.rhk_test2)); 
    alert('typeof(wnd.rhk_test3) = ' + typeof(wnd.rhk_test3)); 
    alert('typeof(rhk_test1) = ' + typeof(rhk_test1)); 
    alert('typeof(rhk_test2) = ' + typeof(rhk_test2)); 
    alert('typeof(rhk_test3) = ' + typeof(rhk_test3)); 
    alert('typeof(this.rhk_test1) = ' + typeof(this.rhk_test1)); 
    alert('typeof(this.rhk_test2) = ' + typeof(this.rhk_test2)); 
    alert('typeof(this.rhk_test3) = ' + typeof(this.rhk_test3)); 
    alert('typeof(window.rhk_test1) = ' + typeof(window.rhk_test1)); 
    alert('typeof(window.rhk_test2) = ' + typeof(window.rhk_test2)); 
    alert('typeof(window.rhk_test3) = ' + typeof(window.rhk_test3)); 
    }, 
    onLoad: function(event) { 
    var appcontent = document.getElementById("appcontent"); 
    if (appcontent) { 
     appcontent.addEventListener("DOMContentLoaded", rhkTest.onPageLoad, true); 
    } 
    }, 
}; 

window.addEventListener("load", function(e) { rhkTest.onLoad(e); }, false); 

testfoo.js가 포함되어 있습니다 : 여기 내 코드의

window.rhk_test1 = 'testval1'; 
rhk_test2 = 'testval2'; 
var rhk_test3 = 'testval3'; 

window.alert('Running testfoo.js'); 

파일이 발견되고 실행될 수 있도록 내가 경고 "실행 testfoo.js"를 얻는다. 또한 wnd가 "객체"라는 경고를 받는다 (예상대로 - 다른 곳에서는 초기화 됨). 그러나 다른 모든 경고는 다양한 typeof() 호출에 대해 "정의되지 않음"을 표시합니다. 당연히, 나는 모두에 값이 있다고 기대하지 않지만 적어도 하나의 중 하나가 표시 될 수 있습니다.

내 가치에는 어떤 변화가 있습니까? 그들은 wnd의 재산에 있어야하지 않니?

Windows 7에서 Firefox 19.0을 실행 중입니다 (문제가있는 경우).

답변

1

참고 : 더 일반적인 개요는 Wladimir Palant의 대답을 참조하십시오.

필자는 필자의 경우 실제로 기능을 올바르게 사용하고 있었지만 다소 기대가 크지 않았습니다. 문제는 Firefox의 XPCNativeWrapper 기능 때문이었습니다.

세부 사항을 이해하는 데 여전히 어려움을 겪고 있지만 간단히 말해 내 wnd 개체는 XPCNativeWrapper에 래핑되고 testfoo.js은 "보호 된"스크립트로 간주되어 변경 사항을 볼 수 없었습니다. 컨트롤이 일단 testfoo.js에서 되돌려지면 객체가 반환됩니다.

이 솔루션은 전에 개체 랩을 해제하는 것입니다 (또는 후 -도 작동 할 수), 다음과 같이 첨자에 전달 :

var wnd = XPCNativeWrapper.unwrap(doc.defaultView); 

을 최대한 빨리 변수/속성에 의해 수정 된 것을처럼 testfoo.js이 상위 스크립트에서 볼 수있게되었습니다.

아직 전체 인프라가 "안전한지"알 수있을만큼 충분히 이해하지 못했습니다. 결국 이는 브라우저 페이지의 악성 코드로부터 내 확장 프로그램을 보호하도록 설계된 보안 메커니즘입니다.

것은 나는 또한 첨자에 의해 정의 된 방법으로 객체를 전달하는 몇 가지 문제를보고하고 (내 예에 도시하지 않음). 이를 위해 별도의 질문을 할 것입니다.

짧은 이야기 : 언 래핑은 내 질문에 제기 된 즉각적인 문제에 대한 (아마도 "the") 해결책이지만, 내가 가지고 있었던 어려움에 대한 완전한 해결책으로 보이지는 않습니다. 장소.

3

실제로는 약간 복잡하며 무엇이 wnd인지에 따라 다릅니다. 아래 첨자의 범위로 일반 개체를 사용할 수 있습니다.

var myScope = this; 
var subscriptScope = {}; 
loader.loadSubScript("testfoo.js", subscriptScope); 

그러나 스코프는 완전히 격리되지 않습니다. testfoo.js의 코드에 대한 다음은 몇 가지 예 :

var foo = "bar;  // Creates subscriptScope.foo 
xyz = 1;    // Creates myScope.xyz 
function dummy() {} // Creates subscriptScope.dummy 
var outer = myScope; // Assigns a value from outer scope 
그래서

첨자의 변수와 함수가 그 범위에 정의되어 있지만, 그것은 여전히로드 스크립트의 범위에 액세스 할 수 있습니다 - 선언되지 않은 변수가 여전히 만들어집니다 바깥 쪽 범위에서 바깥 쪽 범위는 아래 첨자 범위에서 해결할 수없는 변수를 검색합니다.

당신이 정말로 첨자를 분리 할 경우, 당신은 윈도우 객체 또는 샌드 박스와 같은 "적절한"전역 객체를 사용한다 :

var myScope = this; 
var subscriptScope = new Components.utils.Sandbox("about:blank"); 
loader.loadSubScript("testfoo.js", subscriptScope); 

지금 testfoo.js이 외부 범위에 액세스 할 수 없습니다를 더 :

window 변수에 대한 특별한 아무것도 없다는 것을
var foo = "bar;  // Creates subscriptScope.foo 
xyz = 1;    // Creates subscriptScope.xyz 
function dummy() {} // Creates subscriptScope.dummy 
var outer = myScope; // Exception: myScope is not defined 

주 - 첨자가 변수가하려는 경우 예를 들어, 범위 객체를 정의 할 수 있습니다

subscriptScope.window = subscriptScope; 

범위 개체 자체는 아래 첨자의 최상위 수준에서 this으로 액세스 할 수 있습니다.

+0

자세한 답변 해 주셔서 감사합니다. 불행히도, 내 결과는 당신이 말한대로 기대했던 것과 일치하지 않는 것 같습니다. 좀 더 완벽한 예를 반영하도록 제 질문을 업데이트했습니다. 보시다시피, wnd는 창 개체로, 의미 상 "적절"합니다. 데이터가 사라질 수있는 위치에 대해 더 많은 테스트를 추가했지만 아직 비어 있습니다. –

관련 문제