1

파이어 폭스의 검색 엔진에서 관찰자를 추가하는 데 문제가 있습니다. 나는 Mozilla Developer Site에있는 nsIBrowserSearchService 페이지에서 Services.search 객체의 init() 메소드 사용을 제안합니다. nsIBrowserSearchService에 옵저버를 추가하는 방법

void init([optional] in nsIBrowserSearchInitObserver observer); 

나는 그 시도하고 난에 한 번 기능을 실행 시작을 얻을 수 있었다하지만 추가 또는 제거하거나 검색 엔진을 재정렬 할 때 결코 다시 호출하지 않습니다. 그래서 나는 잘못된 것을하고 있습니다.

나는 관측자와 경험이 있지만 일반적인 선호도를 사용하고 있으며, 일반적으로 그것을 사용하여 아래 코드를 사용하여 제거합니다. 나는 nsIBrowserSearchService으로 그것을하는 방법을 모르겠습니다. 나는 동일 또는 유사한 방법으로 nsIBrowserSearchService를 관찰하고자하지만 난 내가 생각 Services.prefs하지만 Services.search을 관찰하고 있지 않다

branch = Services.prefs.getBranch("preferenceNameHere"); 

에 대한 넣어 될지 확실하지 않다, 그것은 더 getBranch 방법으로이 없습니다 내가 말할 수있는 한 멀리.

내가 일반적으로 Chrome.js에 관찰자를 추가 및 제거하는 방법이다

const {Ci, Cu} = require("chrome"); 
const {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); 

branch = Services.prefs.getBranch("preferenceNameHere"); 
branch.addObserver("", observe, false); 

function observe(subject, topic, data) { 
// instanceof actually also "casts" subject 
    if (!(subject instanceof Ci.nsIPrefBranch)) { 
     return; 
    } 
    //do stuff here 
}; 

exports.onUnload = function(reason) { 
    // Need to remove our observer again! This isn't automatic and will leak 
    // otherwise. 

    branch.removeObserver("", observe); 
    if(reason == "disable" || reason == "uninstall"){ 
     //restore changes made by addon 
    } 
}; 

사람이 그래서 변화를 관찰하고 내가 제대로 관찰자를 제거하도록 할 수 있습니다이 작업을 수행하는 방법에 저를 조언 해 줄 수 있습니다 검색 개체. 감사합니다

답변

2

위에서 시도한 것은 pref observer를 non-prefs로 사용하려고 시도했지만 가능한 것은 아닙니다. 이런 식으로 정규 관찰자 서비스를 사용해야합니다.

사용자가 엔진을 변경하면이를 알려줍니다.

Cu.import('resource://gre/modules/Services.jsm'); 

var observers = { 
    'browser-search-engine-modified': { 
     aTopic: 'browser-search-engine-modified', 
     observe: function (aSubject, aTopic, aData) { 
      if (aData == 'engine-current') { 
       console.log('current engine was changed!'); 
       //console.log('aSubject on change:', aSubject.name, 'same as Services.search.currentEngine.name:', Services.search.currentEngine.name); //aSubject is the engine 
       //console.log('aTopic on change:', aTopic); //aTopic is obviously `browser-search-engine-modified` 
      } 
     }, 
     reg: function() { 
      Services.obs.addObserver(observers[this.aTopic], this.aTopic, false); 
     }, 
     unreg: function() { 
      Services.obs.removeObserver(observers[this.aTopic], this.aTopic); 
     } 
    } 
}; 

시작하려면 청취이 수행

for (var o in observers) { 
    observers[o].reg(); 
} 

것은 듣기를 중지 할이 : 나는 사용자가 새 엔진을 추가 할 때 어떻게되는지 모르겠지만를 선택 doenst

for (var o in observers) { 
    observers[o].unreg(); 
} 

. 또는 그가 엔진을 제거하면. 사용자가 그 메시지가 무엇인지 알려주십시오.

+0

Noitidart. 정말 감사. 다른 이벤트는'engine-added'입니다. 'engine-loaded' 'engine-current'' engine-default'' engine-removed' – hooray

+1

구문 오류가 수정되었습니다. 브래킷을 잊어 버렸습니다. 물론 사람이 내게 나와있는 메시지를 공유하는 것은 사용자가 엔진을 추가하거나 제거 할 때 발생하는 메시지입니다. – Noitidart

+1

위의 내용을 편집하지 않으므로 여기에 게시하겠습니다. 고마워요. 정말 감사. 다른 이벤트는'engine-added'입니다. 'engine-loaded' 'engine-current'' 엔진 - 디폴트''엔진 - 제거'입니다. 새 엔진이 추가되면 엔진이 추가 된 다음 엔진이로드 된 두 가지 이벤트가 먼저 발생합니다. 'engine-current'는 새로운 엔진을 곧바로 사용하도록 설정하고'engine-removed'가 제거 될 때 발생합니다. – hooray