Переопределение PromptService в более новом XULRunner - PullRequest
0 голосов
/ 16 ноября 2011

Наше приложение использует встроенный xulrunner. Мы перезаписываем PromptService по умолчанию, чтобы предоставить пользовательские диалоги для предупреждений, подсказок и т. Д.

componentRegistrar.RegisterFactory (PROMPTSERVICE_CID, aClassName, aContractID, MyPromptServiceFactory);

, где

PROMPTSERVICE_CID is "a2112d6a-0e28-421f-b46a-25c0b308cbd0"
CONTRACT_ID is "@mozilla.org/embedcomp/prompt-service;1"

При использовании версий XULRunner 1.9. * Это работает отлично, и вызов приходит к MyPromptSerivceFactory. Но это не работает на более новых версиях XULRunner (> = 4.0)

Я изменил PROMPTSERVICE_CID на "7ad1b327-6dfa-46ec-9234-f2a620ea7e00" (скопировано с nsPrompter.manifest). При регистрации завода я получаю ошибку NS_ERROR_FACTORY_EXISTS.

Если я продолжу использовать старый PROMPTSERVICE_CID, тогда nsIPromptService2 не будет использоваться вместо nsIWindowCreator2.CreateChromeWindow2 используется для отображения предупреждений и подсказок.

Я гуглил по этому вопросу, но не смог найти решение, чтобы либо исправить ошибку NS_ERROR_FACTORY_EXISTS, либо использовать MyPromptServiceFactory.

Любая помощь / предложения?

1 Ответ

0 голосов
/ 16 ноября 2011

Вероятно, было бы лучше использовать существующую службу подсказок так, как это делает Firefox, а не заменять ее.Если вы посмотрите на nsPrompter.openPrompt () , то перед открытием модального диалога он попытается найти и вызвать функцию JavaScript getTabModalPrompt() в окне, содержащем браузер.Он ожидает получить элемент promptBox и вызовет методы appendPrompt() и removePrompt().Очевидно, вам не нужно присваивать ему элемент promptBox, просто что-то, что ведет себя аналогично - и отображает сообщение любым удобным вам способом.

Но если вы действительно хотите заменить компоненты системы, вам не следует• дублировать CID подсказки - используйте свой собственный, но @mozilla.org/prompter;1 в качестве идентификатора контракта (старый идентификатор контракта предназначен только для обратной совместимости).

...