Как букмарклет может получить доступ к расширению Firefox (или наоборот)

Я написал расширение для Firefox, которое улавливает ввод определенного URL-адреса и делает некоторые вещи. Мое основное приложение запускает Firefox с этим URL-адресом. URL-адрес содержит конфиденциальную информацию, поэтому я не хочу, чтобы она сохранялась в истории.

Меня беспокоит случай, когда расширение не установлено. Если он не установлен и Firefox запускается с конфиденциальным URL-адресом, он будет сохранен в истории, и я ничего не могу с этим поделать. Итак, моя идея состоит в том, чтобы использовать букмарклет.

Я запущу Firefox с помощью "javascript:window.location.href='pleaseinstallthisplugin.html'; secureinfo='blahblah'".

Если расширение не установлено, они будут перенаправлены на страницу, где им будет предложено установить его, и конфиденциальная информация не будет сохранена в истории. Если расширение IS установлено, оно захватит информацию из переменной secureinfo и сделает свое дело.

Мой вопрос: может ли букмарклет вызывать метод в расширении для передачи конфиденциальной информации (и если да, то как), или может ли расширение перехватывать вызов javascript в букмарклете?

Как букмарклет и расширение Firefox могут взаимодействовать?

p.s. Альтернативным способом обойти эту ситуацию было бы для моего основного приложения запускать Firefox и связываться с расширением с помощью сокетов, но я не хочу этого делать, потому что за эти годы я столкнулся со слишком большим количеством проблем с пользователями с сумасшедшими брандмауэрами, блокирующими сокет. коммуникация. Я хотел бы сделать все без сокетов, если это возможно.


person mhenry1384    schedule 18.08.2009    source источник


Ответы (3)


Насколько я знаю, букмарклеты никогда не могут получить доступ к хром-файлам (расширениям).

person Community    schedule 18.08.2009

Букмарклеты выполняются в рамках текущего документа, который почти всегда является документом содержимого. Однако, если вы передаете его через командную строку, похоже, он работает:

/Applications/Namoroka.app/Contents/MacOS/firefox-bin javascript:alert\(Components\)

Доступ к Components вызовет исключение, если это не разрешено, но в предупреждении отображается правильный объект.

person sdwilsh    schedule 19.08.2009
comment
Хотя вы можете получить доступ к объекту Components, похоже, что при попытке доступа к любому полезному методу/свойству этого объекта, такого как классы или QueryInterface(), ваше разрешение будет отклонено. Так что я думаю, что это просто невозможно. - person mhenry1384; 19.08.2009

Вы можете использовать unsafeWindow для внедрения файла global. Вы можете добавить простое свойство, чтобы вашему букмарклету нужно было только определить, определен ли глобальный или нет, но вы должны знать, что, насколько я знаю, нет способа запретить сайтам в контексте, отличном от букмарклета, также нюхать для этого же глобального (поскольку для некоторых может быть проблемой конфиденциальности то, что сайты могут определить, используют ли они расширение). Я подтвердил в своем собственном дополнении, которое внедряет глобальный объект способом, аналогичным приведенному ниже, что он работает как в букмарклете, так и в обычном контексте сайта.

Если вы регистрируете nsIObserver, например, где content-document-global-created — это тема, а затем разверните subject, вы можете внедрить свой глобальный (см. это, если вам нужно внедрить что-то более сложное, например объект с методами).

Вот некоторый (непроверенный) код, который должен помочь:

var observerService = Cc['@mozilla.org/observer-service;1'].getService(Ci.nsIObserverService);
observerService.addObserver({observe: function (subject, topic, data) {

    var unsafeWindow = XPCNativeWrapper.unwrap(subject);
    unsafeWindow.myGlobal = true;

}}, 'content-document-global-created', false);

См. это. и это, если вы хотите более простой способ в надстройке SDK (не уверен, что SDK postMessage коммуникация будет работать как альтернатива, но, по-видимому, с тем же опасением, что она будет подвергаться воздействию контекстов, отличных от букмарклетов (т. е. обычных веб-сайтов)).

person Brett Zamir    schedule 04.03.2014
comment
Мне нравится этот пост, спасибо, что поделились Бреттом, но почему content-document-global-created, а не document-element-inserted для наблюдения за темой? - person Noitidart; 04.03.2014
comment
Ах. Можете ли вы помочь мне понять, что он делает, например, что бы сделать его лучше? Знаете ли вы, какова тема содержания-документа-глобального-создания? Что именно он делает? Он устанавливает javascript перед выполнением скриптов? Когда элемент документа вставлен, ничего еще не выполнено, вы даже не можете получить доступ к dom в этот момент. И если вам нужно вставить javascript, зачем использовать наблюдатель? Почему бы просто не пойти gBrowser.contentWindow.wrappedJSObject.myGlobal = true? - person Noitidart; 04.03.2014
comment
Да, это также добавляет переменную до выполнения скриптов (к вашему сведению, в сообщении есть ссылка для content-document-global-created, возможно, скрытая тем фактом, что я также обозначил это как код). Я думаю, что ваш код gBrowser добавит глобальное значение только в главное окно браузера, а не в окно каждого отдельного документа содержимого. Мой код делает переменную доступной для отдельных веб-страниц, включая букмарклеты, наблюдая за каждой загрузкой новой. - person Brett Zamir; 04.03.2014
comment
Поскольку переменная добавляется на ранней стадии, документ может проверить переменную в любой точке своего скрипта. Субъектом content-document-global-created является nsIDOMWindow, то есть отдельное окно документа, загрузка которого только что наблюдалась. - person Brett Zamir; 04.03.2014
comment
Ах, я понял! Тогда content-document-global-created идеален, и я вижу, вы хотите добавить его при каждой загрузке страницы. Так почему бы не делать это при каждой загрузке страницы: subject.contentWindow.wrappedJSObject.myGlobal = true? Также вы уверены, что это nsIDOMWindow, потому что nsIDOMWindow будет контекстом Chrome, а не веб-страницей, верно? - person Noitidart; 04.03.2014
comment
Согласно developer.mozilla.org/en/docs/Observer_Notifications#Documents это nsIDOMWindow и это описание интерфейса, похоже, не ограничивается хромированными окнами. Я думаю, вы правы в том, что вам не нужно все, что я сделал (мне нужна была распаковка, потому что я вводил объект с методами для вызова хрома), хотя я не думаю, что вам нужно contentWindow. часть вашего фрагмента кода всего subject.wrappedJSObject.myGlobal = true. (не уверен, что wrapJSObject вообще нужен для логических значений, хотя, вероятно, да) - person Brett Zamir; 05.03.2014