Обработка и прерывание загрузки из расширения Firefox - PullRequest
0 голосов
/ 09 февраля 2011

Мне нужно странное поведение для моего расширения:)

Когда пользователь вводит URL-адрес или щелкает ссылку, указывающую на какой-либо документ, мне нужно показать ему какую-то веб-страницу вместо загрузки этого файла (средство просмотра веб-страниц для PDF, дляпример).Другими словами, я хочу иметь связь между mimetype контента и действием.

Есть ли способ сделать это из привилегированного кода XUL?

PS.Я знаю, что могу написать плагин для отображения контента в браузере, например плагин Adobe Reader, но я предпочитаю писать на JS вместо C ++ (и не хочу кросс-компилировать мой код для всех платформ, где плагин должен работать).

1 Ответ

1 голос
/ 10 февраля 2011

Вы можете зарегистрировать компонент, который реализует интерфейс nsIRUIContentListener, с помощью менеджера категорий.Категория external-uricontentlisteners.Запись - это MIME-тип, который вы хотите зарегистрировать.Значение - это идентификатор контракта вашего компонента.

В качестве альтернативы можно зарегистрировать компонент напрямую с помощью прослушивателя URI, но это полезно только в том случае, если вы уже загружаете свой компонент при запуске.

Когда вашпользователь нажимает на ссылку на документ, обслуживаемый этим типом MIME (и нет установленных плагинов, которые уже обрабатывают этот тип), после чего ваш компонент будет создан.Будет вызван один из методов isPreferred или canHandleContent;Вы должны убедиться, что тип контента соответствует желаемому, а затем вернуть true.Затем будет вызван ваш метод doContent, и вы можете использовать его, чтобы открыть окно для обработки запроса.Вы должны возвратить true, чтобы указать, что вы фактически не предоставляете контент для существующего окна.

РЕДАКТИРОВАТЬ:

Если вы хотите прочитать документ и вывести другой документ на месте, вам нужновместо этого зарегистрируйте преобразователь потока.Это делается путем регистрации компонента, реализующего интерфейсную иерархию nsIStreamConverter с идентификатором контракта @mozilla.org/streamconv;1?from=<MIME>&to=<MIME>.Я не уверен на 100%, но вам, возможно, придется установить to равным */*, и тогда ваш метод GetContentType должен вернуть фактический тип контента, который вы предоставляете.Ваш метод asyncConvertData будет передан слушателю потока назначения.Данные будут доступны вам через базовый интерфейс nsIStreamListener, и затем вы сможете сделать преобразованные данные доступными для потока назначения.

...