2014-06-13 1 views
3

애드온 SDK 및 PageMod를 사용하지 않고도 간단한 컨텐츠 스크립트를위한 Firefox 확장을 쉽게 만들 수 있습니까? 파이썬과 SDK를 설치하는 번거 로움, SDK와 API 사용법을 배우는 것, 그리고 불필요한 부 풀림과 추상화 레이어를 추가하는 것만으로도 간단한 콘텐츠 스크립트를 실행하는 데 과장된 것 같습니다.애드온 SDK를 사용하지 않고 Firefox 확장의 ContentScript

이미 대신 document.body 또한 많은 복잡성을 추가의 browser.xul 맥락에서 주입 모든 XUL 브라우저 오버레이를 사용하고이 스크립트를 주입하지만, 가진 시도 ...

그래서 가장 쉬운 경량 방법은 무엇 XUL 문서 대신 HTML 문서에 몇 개의 스크립트와 CSS 파일을 삽입 하시겠습니까?

답변

7

귀하의 게스트가 너무 광범위하기 때문에 모든 내용을 자세히 논의하지는 않겠지 만 일반적인 개요를 제공합니다.

쉽게 과장 될 수도 있지만 SDK 콘텐츠 스크립트 (실제로 모듈도 포함), Greasemonkey/Scriptish 및 콘텐츠 스크립트와 유사한 모든 요소는 내부적으로 Sandbox을 사용합니다. 재시작없는 애드온의 bootstrap.js조차도 샌드 박스에서 실행됩니다.

  1. 가 너무 부착 할 콘텐츠 창에 대한 참조를 가져옵니다 :

    기본 개념은 다음과 같다.

  2. 스크립트가 실행될 "주체"를 선택하십시오. 보안 주체는 기본적으로 동일한 출처를 정의하는 보안 컨텍스트/정책입니다. 특권이없는 콘텐츠 스크립트 (일반적으로 역시 교장)는 내용 창 자체를 사용하지만 특권이 부여 된 스크립트 (Components에 대한 크롬 액세스)는 시스템 교장을 사용합니다.
  3. XRay 래퍼를 원한다면 선택하십시오. 문서에서 자세히 알려줍니다.
  4. 샌드 박스 프로토 타입 ("전역"또는 최상위 레벨)을 선택하십시오. 일반적으로 콘텐츠 스크립트의 경우 콘텐츠 창을 선택합니다.
  5. Sandbox을 만듭니다.
  6. 콘텐츠 스크립트가 샌드 박스에 필요할 수있는 것들을 추가하십시오.
  7. 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); 
+0

덕분에,이 많은 도움이되었습니다. loadSheet 메소드에 대한 정보를 좀 더 제공해 주시겠습니까? 문서에서 무언가를 찾는 것은 정말 고통 스럽습니다 ... 아무것도 찾을 수 없으며 loadSheet는 첫 번째 문서로드 이후에 쓰레기를 내고 있습니다. 구성 요소가 실패 코드를 반환했습니다 : 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMWindowUtils.loadSheet]. –

+0

신경 쓰지 마라. 틀린 창문에 시트를 적재했다 ... DOH! 그래도 문서를 찾을 수 있다면 여전히 좋을 것입니다 :) –

+0

샌드 박스에 예제를 사용하려면 XUL에 스크립트를로드해야합니다. SDK는'contentScriptFile'을 통해로드하지만 XUL은 일반'script' 태그 만 사용합니다. – bgmCoder