2

나는 모든 페이지에 두 개의 콘텐트 스크립트를 주입하는 firefox addon을 가지고 있습니다.firefox sdk : 콘텐트 스크립트 기능을 다시 정의하십시오.

var workers = []; 

pageMod.PageMod({ 
    include: "*", 
    contentScriptFile: [ 
     self.data.url("content/autofill/lib_generic.js"), 
     self.data.url("content/autofill/lib.js"), 
    ], 
    // add worker to the list 
    onAttach: function(worker) 
     { 
     workers.push(worker); 

     var filename = getDomainSpecificFilename(worker.contentURL); 

     worker.on("detach", function() 
     { 
      var index = workers.indexOf(worker); 
      if (index >= 0) 
      workers.splice(index, 1); 
     }); 
     } 
}); 

lib_generic.jsapply_forms(...)가 명명 한 함수를 포함하는 (그 설명은 중요하지 않다). 이 함수는 lib.js 파일에서 호출됩니다. 그러나이 절차는 여러 페이지에서 작동하지 않으므로 각 페이지마다 특정 스크립트가 있습니다.이 파일에는 apply_forms(...)이라는 함수 하나만 포함되어 있습니다.

나는 현재 도메인을 입력으로 사용하고 원하는 특정 스크립트의 이름을 반환하거나 generic을 사용해야하는 경우 false을 반환하는 함수가 있습니다.

내가 필요한 것은 - 필요한 경우 - 다시 정의 일반 apply_formsapply_forms과 함께합니다.

나는

tabs.activeTab.attach({ 
    contentScriptFile: [ filename ] 
}); 

worker.port.emit("apply_forms_loaded"); 

을 사용하는 시도하고 콘텐츠 스크립트 중 하나에 :

VAR는 apply_forms_loaded = 거짓;

self.port.on("apply_forms_loaded", function() { 
    console.log("LOADED"); 
    apply_forms_loaded = true; 
}); 

전체 절차

는 다음과 같이 시작됩니다 :

var timer; 

timer = setInterval(function(){ 

    if (apply_forms_loaded) { 

    clearInterval(timer); 
    start(); // apply_forms is called somewhere inside this call 
    } 
}, 10); 

불행하게도 tabs.activeTab.attach 그래서 일반적인 기능에 allways라고 다른 맥락에서 내용 스크립트를 주입 것으로 보인다.

activeTab에 동일한 내용으로 콘텐츠 스크립트를 추가하도록 설득 할 수있는 방법이 있습니까? 아니면 다른 방식으로해야합니까? (그 중 하나)

또는 문제가 될 수 있습니다 - 나는 콘텐츠 스크립트가 완전히 주입되지 않았을 때 apply_forms_loaded 메시지를 보냈습니까?

나는 크롬 또한 함수 정의를 재정의하려고 봤는데 나는 조언 (url to SO question)

감사를 작동했습니다.

답변

1

맞습니다. pagemod를 통해 추가 된 스크립트는 tabs.attach에서 추가 한 것과는 다른 JS 샌드 박스에 있습니다. 당신이 할 수있는 일은 새로운 exportFunction() 함수를 사용하여 함수를 실제 윈도우에 삽입하는 것입니다.이 방법은 함수가 실제 윈도우에 있고 항상 덮어 쓰게됩니다. 그런 다음 unsafeWindow에서 호출 할 수 있습니다.