2012-11-02 2 views
4

Google 크롬 확장 프로그램을 Firefox Add-On SDK에 이식하려고하는데 내 웹 사이트의 페이지를 필터링하고 리디렉션하도록 확장 프로그램이 필요합니다. 예를 들어 사용자가 "http://example.com/special"을 열면 동일한 브라우저 탭에서 "http://example.com/redirect"으로 전송해야합니다. Firefox 페이지 - 모드에서 리디렉션을 만드는 방법은 무엇입니까?

내가이 일을 시도하는 방법입니다

var pageMod = require("page-mod").PageMod({ 
    include: "*", 
    contentScriptWhen: "start", 
    contentScript: "", 

    onAttach: function(worker) { 
     if (worker.tab.url == worker.url && 
      worker.url.indexOf("example.com/special") > -1) { 
      worker.tab.url = "http://example.com/redirect"; 
     } 
    } 
}); 

문제는 다음과 같습니다 브라우저는 경로 재 지정 (새 페이지가 탭에 표시 직후) 후 때때로 중단됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 파이어 폭스 16.0.2를 사용

, 애드온 SDK 1.11

+1

나는 무엇을하는지 이해하지 못합니다 : worker.tab.url == worker.url. 오류가 발생할 수 있습니다. 오류 로그의 내용은 무엇입니까? – canuckistani

+0

@canuckistani 이것은 메인 페이지에 붙이기위한 간단한 검사지만, 중첩 된 프레임에는 붙이지 않습니다. 일부 포럼에서이 패턴을 발견했습니다. – Andrew

답변

4

가장 좋은 방법은 낮은 수준에서 그것을 할 수있을 것입니다 : 당신이 actiton이 코드를보고 싶다면

const { Cc, Ci, Cr } = require("chrome"); 

var events = require("sdk/system/events"); 
var utils = require("sdk/window/utils"); 


function listener(event) { 
    var channel = event.subject.QueryInterface(Ci.nsIHttpChannel); 
    var url = event.subject.URI.spec; 

    // Here you should evaluate the url and decide if make a redirect or not. 
    // Notice that "shouldIredirect" and "newUrl" are guessed objects you must replace! 
    if (shouldIredirect) { 
     // If you want to redirect to another url, the you have to abort current request 
     // See https://developer.mozilla.org/en-US/docs/XUL/School_tutorial/Intercepting_Page_Loads 
     channel.cancel(Cr.NS_BINDING_ABORTED); 

     // Aet the current gbrowser object (since the user may have several windows and tabs) and load the fixed URI 
     var gBrowser = utils.getMostRecentBrowserWindow().gBrowser; 
     var domWin = channel.notificationCallbacks.getInterface(Ci.nsIDOMWindow); 
     var browser = gBrowser.getBrowserForDocument(domWin.top.document); 

     browser.loadURI(newUrl); 
    } else { 
     // do nothing, let Firefox keep going on the normal flow 
    } 
    }; 
}; 

exports.main = function() { 
    events.on("http-on-modify-request", listener); 
}; 

this addon (면책 조항 : 내가 개발 한 애드온)을 살펴보십시오.

관련 문제