SlideShare una empresa de Scribd logo
1 de 57
Оранжевый - новый синий
Как портировать Chrome Extension в Firefox Extension
или написать кросс-браузерное расширение с нуля
Борис Мосунов
facebook.com/mossounov
linkedin.com/in/borismossounov
anotherguru.me
Основные отличия архитектуры:
Chrome Extension v.s. Firefox Addon
Документация для разработчика
https://developer.chrome.com/extensions https://developer.mozilla.org/en-US/Add-ons
Изучая документацию Mozilla можно наткнуться на:
Legacy Extensions Overlay extensions
Restartless Extensions Bootstrapped Extensions
Add-on SDK Extensions
Jetpack SDK Add-on SDK
=
=
=
Краткая история Firefox Addon:
Legacy Extensions / Overlay Extensions
(XUL, JSM, XPCOM)
2004.06 - Firefox 0.9
Краткая история Firefox Addon:
Legacy Extensions / Overlay Extensions
(XUL, JSM, XPCOM)
2004.06 - Firefox 0.9
Краткая история Firefox Addon:
Legacy Extensions / Overlay Extensions
(XUL, JSM, XPCOM)
2004.06 - Firefox 0.9
browser.xul:
overlay.xul:
Краткая история Firefox Addon:
Legacy Extensions / Overlay Extensions
(XUL, JSM, XPCOM)
2004.06 - Firefox 0.9
Mozilla starts Jetpack SDK project
2009.09
Краткая история Firefox Addon:
Legacy Extensions / Overlay Extensions
(XUL, JSM, XPCOM)
2004.06 - Firefox 0.9
Mozilla starts Jetpack SDK project
2009.09
Restartless Extensions / Bootstrapped Extensions
2011.03 - Firefox 4+
Jetpack SDK 0.1 release
Addon SDK extensions
cfx tool (python powered)
2011.06
jpm tool (node.js powered)
2015.05 - Firefox 38
Краткая история Chrome Extension:
Chrome стал поддерживать расширения
2009.09
Запущен Google Chrome Store
с блэкджеком и расширениями
2010.12
Краткая история:
2004.06 - Firefox 0.9
2009.09
2011.03 - Firefox 4+
2011.06
2015.05 - Firefox 38
2010.12
Chrome стал поддерживать расширения
Legacy Extensions / Overlay Extensions
(XUL, JSM, XPCOM)
addons.mozilla.org
Mozilla starts Jetpack SDK project
Restartless Extensions / Bootstrapped Extensions
Jetpack SDK 0.1 release
Addon SDK extensions
cfx tool (python powered)
jpm tool (node.js powered)
Запущен Google Chrome Store с блэкджеком и расширениями
Изучая документацию Mozilla нужно читать про:
Legacy Extensions Overlay extensions
Restartless Extensions Bootstrapped Extensions
Add-on SDK Extensions
Jetpack SDK Add-on SDK
=
=
=
Из чего состоит среднестатистическое
браузерное расширение?
manifest
background script
content scripts,
styles, assets
toolbar button
popup
locales
embedded pages
(options / help)
Основное и самое главное отличие
Chrome Extension и Firefox Addon
состоит в способах взаимодействия
javascript сценариев из 3 блоков:
background.js
contentscript.js popup.js
В Google Chrome целых два API обмена сообщениями:
• Simple one-time requests
• Long-lived connections
https://developer.chrome.com/extensions/messaging
Simple one-time requests
chrome.runtime.sendMessage({
greeting: «hello»
}, function(response) {
console.log(response.farewell);
});
background.js
contentscript.js popup.js
chrome.tabs.sendMessage(tabs[0].id, {
greeting: «hello»
}, function(response) {
console.log(response.farewell);
});
background.js
contentscript.js
chrome.runtime.onMessage.addListener(
function(request, sender, callback) {
console.log(sender.tab ?
"from a content script:" +
sender.tab.url :
"from the extension");
if (request.greeting == "hello")
callback({farewell: "goodbye"});
});
background.js
contentscript.js popup.js
?
Long-lived connections
port.postMessage({joke: "Knock knock»});
port.onMessage.addListener(function(msg) {
if (msg.question == "Who's there?"){
port.postMessage({answer: "#4front"});
}
});
background.js
contentscript.js popup.js
Window chrome.extension.getBackgroundPage()
background.js
contentscript.js popup.js
contentscript.js и popup.js могут:
Нужна кросс-браузерность?
Если да, то не стоит.
Если нет, то можно.
background.js
contentscript.js popup.js
• есть два разных API обмена сообщениями
• contentscript.js и popup.js могут получить
background window и сохранить там объект
с методами
• все могут обмениваться безымянными
сообщениями, задавая колбек для ответа.
• background.js ничего не знает об
остальных, пока они к нему не подключатся
А что там у Firefox?
eloper.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/u
port.emit("myMessage", msg);
port.on("myMessage",function(msg) {
if (msg.question == "Who's there?")
port.emit("myMessage.reply", {
answer: "#4front"
});
});
background.js
contentscript.js popup.js
background.js
contentscript.js popup.js
• все могут обмениваться
именованными сообщениями без
колбэков
• background.js создает
contentscript.js и popup.js и может
ими управлять.
callbacks = {
«1234»:
function(payload){},
«1235»:
function(payload){}
}
message = {
action: «myMessage.reply»,
uid: 1234,
paylaod: {}
}
message = {
}
message = {
action: «myMessage»,
paylaod: {}
}
message = {
action: «myMessage»,
uid: 1234,
paylaod: {}
}
Разберем отличия Mozilla Extension и Chrome Extension
по составляющим
manifest
background script
content scripts,
styles, assets
toolbar button
popup
locales
embedded pages
(options / help)
manifest
manifest.json
описывает:
• название, описание,
версия, лицензия,
• расположение всех
компонентов,
• права доступа
расширения
package.json
описывает:
• название, описание,
версия, лицензия,
• расположение
background script
а background script
подгружает все
компоненты
manifest
Как сделать кросс-браузерно:
Настроить grunt task, который будет
синхронизировать общие поля в manifest.json и
package.json (версию, название, описание…)
• Виртуальная html
страница со своим
window js-объектом,
• этот window
выполняется в одном
контексте content
script и popup script,
примерно как iframe
• Отдельный JavaScript,
без window.
• выполняется в
отдельном от
остальных контексте
• Из него подгружаются
content scripts, styles,
popup, etc.
• EcmaScript 6
background script
Как сделать кросс-браузерно:
1. Вообще не пользоваться
chrome.extension.getBackgroundPage()
2. Для firefox - отдельный background script поскольку все
firefox addon sdk на ES6.
3. Написать прослойку - систему обмена с content-script и
popup script именованными сообщениями c колбеками
который использовать и там и там
4. Заранее разделять скрипты для background и content
scripts, вплоть до клиент-серверной архитектуры.
background script
• выполняются в
изолированном мире
веб-страницы
• можно получить
доступ к background
window
• кросс-доменные
запросы в рамках
прав доступа
• выполняются в
изолированном мире
веб-страницы
• выполняются в
контексте
изолированном от
background script
• кросс-доменные
запросы запрещены
content scripts,
styles, assets
Как сделать кросс-браузерно:
1. Вообще не пользоваться chrome.extension.getBackgroundPage()
2. Написать прослойку - систему обмена с content-script и popup
script именованными сообщениями c колбеками который
использовать и там и там
3. Заранее разделять скрипты для background и content scripts,
вплоть до клиент-серверной архитектуры.
4. Для ajax запросов в firefox использовать Request на стороне
background и вышеупомянутую систему обмена сообщениями с
колбеками
content scripts,
styles, assets
• кнопка может быть только
одна
• можно получить доступ к
background window
• попап загружается по клику
на кнопку и выгружается
после закрытия
• javascript подгружается
через тег <script>
• размер попапа вычисляется
автоматически
• кнопок может быть
несколько
• контекст изолирован от
background script
• попап загружается при
старте экстеншена и
остается в памяти
• скрипты надо подгружать
как контент скрипты
• размер попапа задается
вручную
toolbar button
popup
Как сделать кросс-браузерно:
1. Вообще не пользоваться chrome.extension.getBackgroundPage()
2. Считать, что кнопка на тулбаре может быть только одна.
3. Писать popup script так, словно он загружается один раз и выгружается
при закрытии браузера (отключении экстеншена), при этом popup
должен реагировать на события экстеншена и, а не рендериться один
раз.
4. При этом помнить, что все же в разных браузерах он загружается в
разное время.
5. В firefox скрипты подгружать через content scripts, а <script>
блокировать (https://developer.mozilla.org/en-US/Add-
ons/SDK/Tutorials/Display_a_Popup).
toolbar button
popup
Формат: .json
доступны из:
• background script
• content script
• popup script
Формат: .properties
доступны из:
• только background
script, который может
передать остальным
• в popup.html можно
использовать
идентификаторы
locales
Как сделать кросс-браузерно:
1. Выбрать один из форматов как основной (json).
2. Использовать в firefox файлы .properties только
для хранения идентификатора языка.
3. В Firefox Запрашивать из content script и popup
script весь словарь сразу, который background
считывает из json. Или передавать словарь при
инициализации контент и попап скриптов в конфиге.
locales
Как собрать экстеншен
npm install -g yo
npm install -g generator-chrome-extension
npm install -g generator-firefox-extension
npm install -g jpm
Как собрать?
yo chrome-extension yo firefox-extension
Основное отличие:
background scripts - в /lib
все остальное - в /data
Cделаем единообразно
yo chrome-extension yo firefox-extension
Сводим воедино
yo chrome-extension yo firefox-extension
.gitignore
.gitignore
1. Объединяем в проект
app-chrome
app-firefox
2. grunt copy:
app-chrome/scripts/bg-* -> app-firefox/lib
все остальное -> app-firefox/data
3. добавляем в .gitignore
app-firefox/lib
app-firefox/data
Сводим воедино
yo chrome-extension yo firefox-extension
или…
просто все сводим все к
структуре папок firefox и
обновляем manifest.json.
en-US.properties содержит одну строку:
lng= en
это служит только для определения локали,
а национализированные строки подгружаются из .json
в bg-main-firefox
locales
и последнее…
generator-firefox-extension использует для
сборки утилиту cfx, запуская ее через
shell
утилита cfx устарела
и ее надо заменить на утилиту jpm
но это не сложно
cfx syntax
jpm syntax
не забыть добавить:
cd app-firefox
Как сделать кросс-браузерно:
• Для генерации пустого проекта использовать yeoman генераторы: generator-chrome-extension и
generator-firefox-extension. Заменить cfx на jpm.
• Свести всю базу кода в один проект и настроить grunt build.
• Настроить grunt task, который будет синхронизировать общие поля в manifest.json и package.json
(версию, название, описание…).
• Сделать прослойку адаптер, которая будет использовать api того браузера, в котором запущено
расширение.
• Реализовать кросс-браузерный механизм обмена именованных сообщений с колбеками.
• Вообще не пользоваться chrome.extension.getBackgroundPage()
• Сделать два отдельных background script для Chrome и Firefox.
• Заранее разделять скрипты для background и content scripts, вплоть до клиент-серверной архитектуры.
• Для ajax запросов в firefox использовать Request на стороне background и вышеупомянутую систему
обмена сообщениями с колбеками, для Chrome - jQuery.ajax отлично подойдет.
• Считать, что кнопка на тулбаре может быть только одна.
• Писать popup script так, словно он загружается один раз и выгружается при закрытии браузера
(отключении экстеншена). Другими словами popup должен подписываться на события экстеншена и
реагировать на них, а не рендериться один раз. При этом помнить, что все же в разных браузерах он
загружается в разное время.
• В firefox popup скрипты подгружать через content scripts, а <script> блокировать.
• Локали хранить в формате Chrome - json. В firefox использовать файлы .properties только для хранения
идентификатора языка и запрашивать из content script и popup script весь словарь сразу, который
background считывает из json.
manifestbackground script
content scripts,
styles, assets
toolbar button
popup
все вместе
А стоит ли оно того?
Использование браузеров в РФ
Использование браузеров в МИРЕ
Чтобы реализовать экстеншен, подобный по
функционалу на Chrome Extension или Firefox Extension,
необходимо писать на C#, так что про кросс-
браузерность здесь можно забыть.
Google Chrome = Webkit = Opera = Yandex Browser, и т.д.
Apple Safari - это почти Webkit.
К слову сказать:
А что там у Safari?
Таким образом, если следовать описанным здесь
рекомендациям, вы получите расширение
совместимое со всеми основными браузерами,
не считая IE
Вопросы?

Más contenido relacionado

La actualidad más candente

Эссе по теме браузеры
Эссе по теме браузерыЭссе по теме браузеры
Эссе по теме браузерыMaxim Moroz
 
Создание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере TwitterСоздание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере TwitterRostyslav Siryk
 
SerVal site monitoring presentation - Презентация SerVal
SerVal site monitoring presentation - Презентация SerValSerVal site monitoring presentation - Презентация SerVal
SerVal site monitoring presentation - Презентация SerValElitesru
 
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...Mikhail Egorov
 
FFCMS - вводная для пользователя
FFCMS - вводная для пользователяFFCMS - вводная для пользователя
FFCMS - вводная для пользователяzenn1989
 
сравнение браузеров
сравнение браузеровсравнение браузеров
сравнение браузеровnatasha16makritskaya
 
Обзор популярных плагинов WordPress
Обзор популярных плагинов WordPressОбзор популярных плагинов WordPress
Обзор популярных плагинов WordPressAnatoly Yumashev
 
Уязвимости веб-сервисов
Уязвимости веб-сервисовУязвимости веб-сервисов
Уязвимости веб-сервисовPositive Hack Days
 
мой любимый браузер
мой любимый браузермой любимый браузер
мой любимый браузерKsusha Sosnovskaya
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
Лекция #1. Основы Web-технологий
Лекция #1. Основы Web-технологийЛекция #1. Основы Web-технологий
Лекция #1. Основы Web-технологийЯковенко Кирилл
 
Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010
Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010
Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010Сообщество eLearning PRO
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Yandex
 

La actualidad más candente (20)

Эссе по теме браузеры
Эссе по теме браузерыЭссе по теме браузеры
Эссе по теме браузеры
 
Создание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере TwitterСоздание Adobe AIR клиента для социальных сетей на примере Twitter
Создание Adobe AIR клиента для социальных сетей на примере Twitter
 
SerVal site monitoring presentation - Презентация SerVal
SerVal site monitoring presentation - Презентация SerValSerVal site monitoring presentation - Презентация SerVal
SerVal site monitoring presentation - Презентация SerVal
 
обзор браузеров
обзор браузеровобзор браузеров
обзор браузеров
 
эссе
эссеэссе
эссе
 
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
 
FFCMS - вводная для пользователя
FFCMS - вводная для пользователяFFCMS - вводная для пользователя
FFCMS - вводная для пользователя
 
сравнение браузеров
сравнение браузеровсравнение браузеров
сравнение браузеров
 
Обзор популярных плагинов WordPress
Обзор популярных плагинов WordPressОбзор популярных плагинов WordPress
Обзор популярных плагинов WordPress
 
Браузеры
БраузерыБраузеры
Браузеры
 
Уязвимости веб-сервисов
Уязвимости веб-сервисовУязвимости веб-сервисов
Уязвимости веб-сервисов
 
браузер
браузербраузер
браузер
 
Top 3
Top 3 Top 3
Top 3
 
176023
176023176023
176023
 
мой любимый браузер
мой любимый браузермой любимый браузер
мой любимый браузер
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
Лекция #1. Основы Web-технологий
Лекция #1. Основы Web-технологийЛекция #1. Основы Web-технологий
Лекция #1. Основы Web-технологий
 
Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010
Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010
Установка и настройка CMS Plone. Грегер С.Э. 06.04.2010
 
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"Евгений Батовский, Николай Птущук "Современный станок верстальщика"
Евгений Батовский, Николай Птущук "Современный станок верстальщика"
 
Best Browser
Best BrowserBest Browser
Best Browser
 

Destacado

Как создать эффективную презентацию?V 02
Как создать эффективную презентацию?V 02Как создать эффективную презентацию?V 02
Как создать эффективную презентацию?V 02Nadezhda Ivera
 
UX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesUX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesNed Potter
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging ChallengesAaron Irizarry
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with DataSeth Familian
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017Drift
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheLeslie Samuel
 

Destacado (6)

Как создать эффективную презентацию?V 02
Как создать эффективную презентацию?V 02Как создать эффективную презентацию?V 02
Как создать эффективную презентацию?V 02
 
UX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and ArchivesUX, ethnography and possibilities: for Libraries, Museums and Archives
UX, ethnography and possibilities: for Libraries, Museums and Archives
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 

Similar a Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension

Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5Provectus
 
Phalcon. Что нового?
Phalcon. Что нового?Phalcon. Что нового?
Phalcon. Что нового?Oleksandr Torosh
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakAmasty
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word pressvovasik
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 
Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)
Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)
Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)Positive Hack Days
 
Использование Symfony
Использование SymfonyИспользование Symfony
Использование SymfonyMedia Gorod
 
WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...
WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...
WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...GeeksLab Odessa
 
Chrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработкаChrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработкаAlexandr Mikhaylenko
 
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample SdkSergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdkrit2010
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработкиIT-Доминанта
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptVasiliy Teliatnikov
 
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...Ontico
 
Конкурс для разработчиков от Evernote
Конкурс для разработчиков от EvernoteКонкурс для разработчиков от Evernote
Конкурс для разработчиков от EvernoteEvernote
 

Similar a Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension (20)

Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Desktop app based on node js and html5
Desktop app based on node js and html5Desktop app based on node js and html5
Desktop app based on node js and html5
 
Phalcon. Что нового?
Phalcon. Что нового?Phalcon. Что нового?
Phalcon. Что нового?
 
Meet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis BosakMeet Magento Belarus 2015: Denis Bosak
Meet Magento Belarus 2015: Denis Bosak
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Бесплатное ПО
Бесплатное ПОБесплатное ПО
Бесплатное ПО
 
Как быть с большими сайтами на Word press
Как быть с большими сайтами  на Word pressКак быть с большими сайтами  на Word press
Как быть с большими сайтами на Word press
 
Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
PHP
PHPPHP
PHP
 
Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)
Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)
Positive Hack Days. Воронцов. Безопасность браузеров: новый взгляд (0-day)
 
Использование Symfony
Использование SymfonyИспользование Symfony
Использование Symfony
 
WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...
WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...
WebCamp:Front-end Developers Day. Александр Михайленко "Обзор библиотек и кан...
 
Chrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработкаChrome push notifications. Анатомия и разработка
Chrome push notifications. Анатомия и разработка
 
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample SdkSergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
Sergey Ilinsky Rit 2010 Complex Gui Development Ample Sdk
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
Экскурс в мир WEB разработки
Экскурс в мир WEB разработкиЭкскурс в мир WEB разработки
Экскурс в мир WEB разработки
 
What do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScriptWhat do you MEAN? или введение в Fullstack JavaScript
What do you MEAN? или введение в Fullstack JavaScript
 
php frameworks
php frameworksphp frameworks
php frameworks
 
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
CSRF-уязвимости все еще актуальны: как атакующие обходят CSRF-защиту в вашем ...
 
Конкурс для разработчиков от Evernote
Конкурс для разработчиков от EvernoteКонкурс для разработчиков от Evernote
Конкурс для разработчиков от Evernote
 

Más de chaykaborya

AngularJS2 vs VueJS2 (ru)
AngularJS2 vs VueJS2 (ru)AngularJS2 vs VueJS2 (ru)
AngularJS2 vs VueJS2 (ru)chaykaborya
 
Orange is the new blue: How to port Chrome Extension to Firefox Extension
Orange is the new blue: How to port Chrome Extension to Firefox ExtensionOrange is the new blue: How to port Chrome Extension to Firefox Extension
Orange is the new blue: How to port Chrome Extension to Firefox Extensionchaykaborya
 
Особенности разработки браузерных расширений для Single Page Application
Особенности разработки браузерных расширений для Single Page ApplicationОсобенности разработки браузерных расширений для Single Page Application
Особенности разработки браузерных расширений для Single Page Applicationchaykaborya
 
How to build augmented reality for Single Page Application using browser exte...
How to build augmented reality for Single Page Application using browser exte...How to build augmented reality for Single Page Application using browser exte...
How to build augmented reality for Single Page Application using browser exte...chaykaborya
 
Yeoman generator своими руками
Yeoman generator своими рукамиYeoman generator своими руками
Yeoman generator своими рукамиchaykaborya
 

Más de chaykaborya (6)

AngularJS2 vs VueJS2 (ru)
AngularJS2 vs VueJS2 (ru)AngularJS2 vs VueJS2 (ru)
AngularJS2 vs VueJS2 (ru)
 
Orange is the new blue: How to port Chrome Extension to Firefox Extension
Orange is the new blue: How to port Chrome Extension to Firefox ExtensionOrange is the new blue: How to port Chrome Extension to Firefox Extension
Orange is the new blue: How to port Chrome Extension to Firefox Extension
 
Особенности разработки браузерных расширений для Single Page Application
Особенности разработки браузерных расширений для Single Page ApplicationОсобенности разработки браузерных расширений для Single Page Application
Особенности разработки браузерных расширений для Single Page Application
 
How to build augmented reality for Single Page Application using browser exte...
How to build augmented reality for Single Page Application using browser exte...How to build augmented reality for Single Page Application using browser exte...
How to build augmented reality for Single Page Application using browser exte...
 
Yeoman generator своими руками
Yeoman generator своими рукамиYeoman generator своими руками
Yeoman generator своими руками
 
Wordpress promo
Wordpress promoWordpress promo
Wordpress promo
 

Оранжевый - новый синий: Как портировать Chrome Extension в Firefox Extension

  • 1. Оранжевый - новый синий Как портировать Chrome Extension в Firefox Extension или написать кросс-браузерное расширение с нуля Борис Мосунов facebook.com/mossounov linkedin.com/in/borismossounov anotherguru.me
  • 4. Изучая документацию Mozilla можно наткнуться на: Legacy Extensions Overlay extensions Restartless Extensions Bootstrapped Extensions Add-on SDK Extensions Jetpack SDK Add-on SDK = = =
  • 5. Краткая история Firefox Addon: Legacy Extensions / Overlay Extensions (XUL, JSM, XPCOM) 2004.06 - Firefox 0.9
  • 6. Краткая история Firefox Addon: Legacy Extensions / Overlay Extensions (XUL, JSM, XPCOM) 2004.06 - Firefox 0.9
  • 7. Краткая история Firefox Addon: Legacy Extensions / Overlay Extensions (XUL, JSM, XPCOM) 2004.06 - Firefox 0.9 browser.xul: overlay.xul:
  • 8. Краткая история Firefox Addon: Legacy Extensions / Overlay Extensions (XUL, JSM, XPCOM) 2004.06 - Firefox 0.9 Mozilla starts Jetpack SDK project 2009.09
  • 9.
  • 10. Краткая история Firefox Addon: Legacy Extensions / Overlay Extensions (XUL, JSM, XPCOM) 2004.06 - Firefox 0.9 Mozilla starts Jetpack SDK project 2009.09 Restartless Extensions / Bootstrapped Extensions 2011.03 - Firefox 4+ Jetpack SDK 0.1 release Addon SDK extensions cfx tool (python powered) 2011.06 jpm tool (node.js powered) 2015.05 - Firefox 38
  • 11. Краткая история Chrome Extension: Chrome стал поддерживать расширения 2009.09 Запущен Google Chrome Store с блэкджеком и расширениями 2010.12
  • 12. Краткая история: 2004.06 - Firefox 0.9 2009.09 2011.03 - Firefox 4+ 2011.06 2015.05 - Firefox 38 2010.12 Chrome стал поддерживать расширения Legacy Extensions / Overlay Extensions (XUL, JSM, XPCOM) addons.mozilla.org Mozilla starts Jetpack SDK project Restartless Extensions / Bootstrapped Extensions Jetpack SDK 0.1 release Addon SDK extensions cfx tool (python powered) jpm tool (node.js powered) Запущен Google Chrome Store с блэкджеком и расширениями
  • 13. Изучая документацию Mozilla нужно читать про: Legacy Extensions Overlay extensions Restartless Extensions Bootstrapped Extensions Add-on SDK Extensions Jetpack SDK Add-on SDK = = =
  • 14. Из чего состоит среднестатистическое браузерное расширение? manifest background script content scripts, styles, assets toolbar button popup locales embedded pages (options / help)
  • 15. Основное и самое главное отличие Chrome Extension и Firefox Addon состоит в способах взаимодействия javascript сценариев из 3 блоков: background.js contentscript.js popup.js
  • 16. В Google Chrome целых два API обмена сообщениями: • Simple one-time requests • Long-lived connections https://developer.chrome.com/extensions/messaging
  • 18. chrome.runtime.sendMessage({ greeting: «hello» }, function(response) { console.log(response.farewell); }); background.js contentscript.js popup.js
  • 19. chrome.tabs.sendMessage(tabs[0].id, { greeting: «hello» }, function(response) { console.log(response.farewell); }); background.js contentscript.js
  • 20. chrome.runtime.onMessage.addListener( function(request, sender, callback) { console.log(sender.tab ? "from a content script:" + sender.tab.url : "from the extension"); if (request.greeting == "hello") callback({farewell: "goodbye"}); }); background.js contentscript.js popup.js ?
  • 22. port.postMessage({joke: "Knock knock»}); port.onMessage.addListener(function(msg) { if (msg.question == "Who's there?"){ port.postMessage({answer: "#4front"}); } }); background.js contentscript.js popup.js
  • 23. Window chrome.extension.getBackgroundPage() background.js contentscript.js popup.js contentscript.js и popup.js могут: Нужна кросс-браузерность? Если да, то не стоит. Если нет, то можно.
  • 24. background.js contentscript.js popup.js • есть два разных API обмена сообщениями • contentscript.js и popup.js могут получить background window и сохранить там объект с методами • все могут обмениваться безымянными сообщениями, задавая колбек для ответа. • background.js ничего не знает об остальных, пока они к нему не подключатся
  • 25. А что там у Firefox? eloper.mozilla.org/en-US/Add-ons/SDK/Guides/Content_Scripts/u
  • 26. port.emit("myMessage", msg); port.on("myMessage",function(msg) { if (msg.question == "Who's there?") port.emit("myMessage.reply", { answer: "#4front" }); }); background.js contentscript.js popup.js
  • 27.
  • 28. background.js contentscript.js popup.js • все могут обмениваться именованными сообщениями без колбэков • background.js создает contentscript.js и popup.js и может ими управлять.
  • 29. callbacks = { «1234»: function(payload){}, «1235»: function(payload){} } message = { action: «myMessage.reply», uid: 1234, paylaod: {} } message = { } message = { action: «myMessage», paylaod: {} } message = { action: «myMessage», uid: 1234, paylaod: {} }
  • 30. Разберем отличия Mozilla Extension и Chrome Extension по составляющим manifest background script content scripts, styles, assets toolbar button popup locales embedded pages (options / help)
  • 31. manifest manifest.json описывает: • название, описание, версия, лицензия, • расположение всех компонентов, • права доступа расширения package.json описывает: • название, описание, версия, лицензия, • расположение background script а background script подгружает все компоненты
  • 32. manifest Как сделать кросс-браузерно: Настроить grunt task, который будет синхронизировать общие поля в manifest.json и package.json (версию, название, описание…)
  • 33. • Виртуальная html страница со своим window js-объектом, • этот window выполняется в одном контексте content script и popup script, примерно как iframe • Отдельный JavaScript, без window. • выполняется в отдельном от остальных контексте • Из него подгружаются content scripts, styles, popup, etc. • EcmaScript 6 background script
  • 34. Как сделать кросс-браузерно: 1. Вообще не пользоваться chrome.extension.getBackgroundPage() 2. Для firefox - отдельный background script поскольку все firefox addon sdk на ES6. 3. Написать прослойку - систему обмена с content-script и popup script именованными сообщениями c колбеками который использовать и там и там 4. Заранее разделять скрипты для background и content scripts, вплоть до клиент-серверной архитектуры. background script
  • 35. • выполняются в изолированном мире веб-страницы • можно получить доступ к background window • кросс-доменные запросы в рамках прав доступа • выполняются в изолированном мире веб-страницы • выполняются в контексте изолированном от background script • кросс-доменные запросы запрещены content scripts, styles, assets
  • 36. Как сделать кросс-браузерно: 1. Вообще не пользоваться chrome.extension.getBackgroundPage() 2. Написать прослойку - систему обмена с content-script и popup script именованными сообщениями c колбеками который использовать и там и там 3. Заранее разделять скрипты для background и content scripts, вплоть до клиент-серверной архитектуры. 4. Для ajax запросов в firefox использовать Request на стороне background и вышеупомянутую систему обмена сообщениями с колбеками content scripts, styles, assets
  • 37. • кнопка может быть только одна • можно получить доступ к background window • попап загружается по клику на кнопку и выгружается после закрытия • javascript подгружается через тег <script> • размер попапа вычисляется автоматически • кнопок может быть несколько • контекст изолирован от background script • попап загружается при старте экстеншена и остается в памяти • скрипты надо подгружать как контент скрипты • размер попапа задается вручную toolbar button popup
  • 38. Как сделать кросс-браузерно: 1. Вообще не пользоваться chrome.extension.getBackgroundPage() 2. Считать, что кнопка на тулбаре может быть только одна. 3. Писать popup script так, словно он загружается один раз и выгружается при закрытии браузера (отключении экстеншена), при этом popup должен реагировать на события экстеншена и, а не рендериться один раз. 4. При этом помнить, что все же в разных браузерах он загружается в разное время. 5. В firefox скрипты подгружать через content scripts, а <script> блокировать (https://developer.mozilla.org/en-US/Add- ons/SDK/Tutorials/Display_a_Popup). toolbar button popup
  • 39. Формат: .json доступны из: • background script • content script • popup script Формат: .properties доступны из: • только background script, который может передать остальным • в popup.html можно использовать идентификаторы locales
  • 40. Как сделать кросс-браузерно: 1. Выбрать один из форматов как основной (json). 2. Использовать в firefox файлы .properties только для хранения идентификатора языка. 3. В Firefox Запрашивать из content script и popup script весь словарь сразу, который background считывает из json. Или передавать словарь при инициализации контент и попап скриптов в конфиге. locales
  • 41. Как собрать экстеншен npm install -g yo npm install -g generator-chrome-extension npm install -g generator-firefox-extension npm install -g jpm
  • 42. Как собрать? yo chrome-extension yo firefox-extension Основное отличие: background scripts - в /lib все остальное - в /data
  • 44. Сводим воедино yo chrome-extension yo firefox-extension .gitignore .gitignore 1. Объединяем в проект app-chrome app-firefox 2. grunt copy: app-chrome/scripts/bg-* -> app-firefox/lib все остальное -> app-firefox/data 3. добавляем в .gitignore app-firefox/lib app-firefox/data
  • 45. Сводим воедино yo chrome-extension yo firefox-extension или… просто все сводим все к структуре папок firefox и обновляем manifest.json.
  • 46. en-US.properties содержит одну строку: lng= en это служит только для определения локали, а национализированные строки подгружаются из .json в bg-main-firefox locales
  • 47. и последнее… generator-firefox-extension использует для сборки утилиту cfx, запуская ее через shell утилита cfx устарела и ее надо заменить на утилиту jpm но это не сложно
  • 49. jpm syntax не забыть добавить: cd app-firefox
  • 50. Как сделать кросс-браузерно: • Для генерации пустого проекта использовать yeoman генераторы: generator-chrome-extension и generator-firefox-extension. Заменить cfx на jpm. • Свести всю базу кода в один проект и настроить grunt build. • Настроить grunt task, который будет синхронизировать общие поля в manifest.json и package.json (версию, название, описание…). • Сделать прослойку адаптер, которая будет использовать api того браузера, в котором запущено расширение. • Реализовать кросс-браузерный механизм обмена именованных сообщений с колбеками. • Вообще не пользоваться chrome.extension.getBackgroundPage() • Сделать два отдельных background script для Chrome и Firefox. • Заранее разделять скрипты для background и content scripts, вплоть до клиент-серверной архитектуры. • Для ajax запросов в firefox использовать Request на стороне background и вышеупомянутую систему обмена сообщениями с колбеками, для Chrome - jQuery.ajax отлично подойдет. • Считать, что кнопка на тулбаре может быть только одна. • Писать popup script так, словно он загружается один раз и выгружается при закрытии браузера (отключении экстеншена). Другими словами popup должен подписываться на события экстеншена и реагировать на них, а не рендериться один раз. При этом помнить, что все же в разных браузерах он загружается в разное время. • В firefox popup скрипты подгружать через content scripts, а <script> блокировать. • Локали хранить в формате Chrome - json. В firefox использовать файлы .properties только для хранения идентификатора языка и запрашивать из content script и popup script весь словарь сразу, который background считывает из json. manifestbackground script content scripts, styles, assets toolbar button popup все вместе
  • 51. А стоит ли оно того?
  • 54. Чтобы реализовать экстеншен, подобный по функционалу на Chrome Extension или Firefox Extension, необходимо писать на C#, так что про кросс- браузерность здесь можно забыть. Google Chrome = Webkit = Opera = Yandex Browser, и т.д. Apple Safari - это почти Webkit. К слову сказать:
  • 55. А что там у Safari?
  • 56. Таким образом, если следовать описанным здесь рекомендациям, вы получите расширение совместимое со всеми основными браузерами, не считая IE