귀하의 게스트가 너무 광범위하기 때문에 모든 내용을 자세히 논의하지는 않겠지 만 일반적인 개요를 제공합니다.
쉽게 과장 될 수도 있지만 SDK 콘텐츠 스크립트 (실제로 모듈도 포함), Greasemonkey/Scriptish 및 콘텐츠 스크립트와 유사한 모든 요소는 내부적으로 Sandbox
을 사용합니다. 재시작없는 애드온의 bootstrap.js
조차도 샌드 박스에서 실행됩니다.
- 가 너무 부착 할 콘텐츠 창에 대한 참조를 가져옵니다 :
기본 개념은 다음과 같다.
- 스크립트가 실행될 "주체"를 선택하십시오. 보안 주체는 기본적으로 동일한 출처를 정의하는 보안 컨텍스트/정책입니다. 특권이없는 콘텐츠 스크립트 (일반적으로 역시 교장)는 내용 창 자체를 사용하지만 특권이 부여 된 스크립트 (
Components
에 대한 크롬 액세스)는 시스템 교장을 사용합니다.
- XRay 래퍼를 원한다면 선택하십시오. 문서에서 자세히 알려줍니다.
- 샌드 박스 프로토 타입 ("전역"또는 최상위 레벨)을 선택하십시오. 일반적으로 콘텐츠 스크립트의 경우 콘텐츠 창을 선택합니다.
Sandbox
을 만듭니다.
- 콘텐츠 스크립트가 샌드 박스에 필요할 수있는 것들을 추가하십시오.
evalInSandbox
또는 subscript loader으로 스크립트를 실행하십시오. // 1. get the content window, e.g. the currently selected tab window
var contentWindow = gBrowser.contentWindow;
// 2. Choose the principal, e.g. just use the content window again
var principal = contentWindow;
// 3. We want XRay wrappers, to keep our content script and the actual
// page scripts in their own corners.
var wantXrays = true;
// 4. Our prototype will be the window
var sbProto = contentWindow;
// 5. Putting it all together to create a sandbox
var sandbox = Cu.Sandbox(principal, {
sandboxPrototype: sbProto,
wantXrays: wantXrays
});
// 6. Adding a random helper function (e.g.)
sandbox.getRandomInt = function (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
};
// 7. Execute some content script, aka. the stupid example.
try {
var execute = function() {
var demo1 = document.querySelector('title').textContent;
var demo2 = getRandomInt(1, 1000);
alert(demo1 + " " + demo2);
}
Cu.evalInSandbox(
"(" + execute.toSource() + ")()",
sandbox
);
} catch(ex) {
console.error(ex);
}
PS : 여기
이 창으로 권한이없는 컨텐츠 스크립트를 추가 제한된 예이다이 예에서는 Scratchpad with Environment/Browser에서 그대로 실행됩니다.
에 관한 스타일 :
내가 단순화 된, 추측, SDK가 무엇을 수행
var wu = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).
getInterface(Ci.nsIDOMWindowUtils);
var uri = Services.io.newURI(
"chrome://myaddon/style/content-style.css",
null,
null);
wu.loadSheet(uri, wu.USER_SHEET);
덕분에,이 많은 도움이되었습니다. loadSheet 메소드에 대한 정보를 좀 더 제공해 주시겠습니까? 문서에서 무언가를 찾는 것은 정말 고통 스럽습니다 ... 아무것도 찾을 수 없으며 loadSheet는 첫 번째 문서로드 이후에 쓰레기를 내고 있습니다. 구성 요소가 실패 코드를 반환했습니다 : 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMWindowUtils.loadSheet]. –
신경 쓰지 마라. 틀린 창문에 시트를 적재했다 ... DOH! 그래도 문서를 찾을 수 있다면 여전히 좋을 것입니다 :) –
샌드 박스에 예제를 사용하려면 XUL에 스크립트를로드해야합니다. SDK는'contentScriptFile'을 통해로드하지만 XUL은 일반'script' 태그 만 사용합니다. – bgmCoder