2009-08-18 3 views
0

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

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

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

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

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

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

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

ответ

1

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

1

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

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

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

+0

Хотя вы можете получить доступ к объекту «Компоненты», похоже, что он пытается получить доступ к любому полезному методу/свойству на этом объекте, например классах или QueryInterface(), отклоняет ваше разрешение. Поэтому я думаю, это просто невозможно. – mhenry1384

1

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

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

Вот некоторые (непроверенные) код, который должен сделать трюк:

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); 

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

+0

Мне нравится этот пост для обмена Brett, но почему '' 'content-document-global-created''', а не' '' document-element-вставил''' для просмотра темы? – Noitidart

+0

Нет причин - может быть, было бы лучше ... –

+0

Ах. Можете ли вы помочь мне понять, что он делает, как то, что сделает его лучше? Вы знаете, что такое объект content-document-global-created? Что он делает точно? Является ли настройка javascript перед выполнением скриптов? Когда документ-элемент вставлен, ничего еще не выполнено, вы даже не можете получить доступ к dom в этой точке. И если вам нужно вставить javascript, зачем использовать наблюдателя? Почему бы просто не пойти '' 'gBrowser.contentWindow.wrappedJSObject.myGlobal = true'''? – Noitidart

Смежные вопросы