2011-04-05 1 views
4

저는 처음으로 Firefox 확장 개발에 착수했습니다. 지금까지 꽤 편안하게 진행되었지만 문제가 있습니다. 내장 된 nsIPromptService를 덮어 쓰고 대신 내 자신의 것으로 대체해야 할 일 중 하나입니다.Firefox addon에 내장 된 XPCOM 구성 요소를 덮어 쓰는 방법은 무엇입니까?

내가 여기에 기본 XPCOM 컴포넌트 생성 자습서를 걸어와 인사의 세계를 하나의 작업을 가지고

:

https://developer.mozilla.org/en/creating_xpcom_components

그리고 그 모든 것을 잘 작동하는 것 같다,하지만 아무것도 내가 찾을 수있었습니다 또는 연구는 어떻게 자바 스크립트에서 인터페이스를 덮어 쓸 수 있는지 보여줍니다. C++과 Java에서 기본 제공 구성 요소를 덮어 쓸 수있는 것 같은 것을 보았지만 javascript에서이 작업을 수행 할 수는 없으며 계약 ID를 변경하려고하면 작동하지 않습니다. 계약 ID (아래)에서 서비스를 가져 오려고하면 원래의 기본 제공 구성 요소 버전 만 반환됩니다.

var myComponent = Components.classes['@mozilla.org/embedcomp/prompt-service;1'] 
               .getService(Components.interfaces.nsIPromptService); 

정말 실종 된 것이 있습니까? 이것은 구성 요소를 무시하는 잘못된 방법입니다 (아무 것도 찾을 수없는 것 같아서 무엇을해야하는지 잘 모르겠습니다).

+1

이 작업을 직접 해보지는 않았지만 * 귀하의 * 서비스의 계약 ID를 전달한 다음 getService()에 동일한 인터페이스를 전달하는 것이 중요하다고 생각합니다. 그 외에는, 최선의 방법은 당신이하려는 것을 수행하는 기존의 addons을 보는 것입니다. 나는 HttpFox가 이런 종류의 것을 사용한다고 믿는다. – MatrixFrog

+0

제안에 감사드립니다! 그 문제는 내가 계속 진행하는 모든 프롬프트/경고/etc에 연결해야한다는 것, 그리고 내가 스스로 부르는 것뿐만 아니라, 모든 사람들이 근본적으로 내 서비스 주소로 전화해야한다는 것을 의미한다. '). HttpFox에서 내가하는 일을 볼 수 있는지 살펴 보겠습니다. – DivineWolfwood

답변

3

닐, 제안 해 주셔서 감사합니다. 그게 내가하고있는 일이라고 생각했는데, 실제로 (새로운 것을 정의하는 대신) 계약을 오버라이드하는 경우, 대답은 nsIComponentRegistrar에 가서 실제로 공장을 등록해야한다는 것 같습니다. (chrome.manifest를 사용하여 처리하기보다는). 이것의 예는 다음과 같습니다

Components.manager.nsIComponentRegistrar.registerFactory(CLASS_ID, CLASS_NAME, CONTRACT_ID, MyPromptServiceFactory); 

콘스탄스이었다 장소 :

const CLASS_ID = Components.ID("{a2112d6a-0e28-421f-b46a-25c0b308cbd0}"); 

// description 
const CLASS_NAME = "My Prompt Service"; 

// textual unique identifier 
const CONTRACT_ID = "@mozilla.org/embedcomp/prompt-service;1"; 

CLASS_ID/CONTRACT_ID는 기존 서비스의 ID 있었다 곳.

+0

이 작업을 수행하는 방법에 대한 전체 코드를 게시 할 수 있습니까? 오랫동안이 작업을 수행하기 위해 노력했습니다. – Noitidart

0

재정의하려는 계약의 계약 ID를 사용하여 구성 요소를 등록해야합니다.

관련 문제