Post on 21-Dec-2014
description
Chrome & Opera Extensions
Radek Šimkoradek.simko@gmail.com
Martin Šteklmartin.stekl@gmail.com
16. března 2011
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 1 / 58
GTUGGoogle Technical User Groups
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 2 / 58
GUG v České republice
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 3 / 58
Proběhlé akce
Google Maps Application DevelopmentEffective programming in IntelliJ IDEAGoogle Web Toolkit (lecture, workshop)CZNIC: Internet administration, routing protocols and the way to IPv6In what are Chrome extensions better than Firefox plugins?Google Chrome hackatonGUGcampOpen source Red Hat vs. GoogleDjango and Google App EngineFlash and HTML5HTML5 and Android hackatonSelenium...
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 4 / 58
Jak zůstat v kontaktu?
http://www.gug.cz
http://twitter.com/gugcz
http://www.facebook.com/GUG.cz
http://www.youtube.com/gugczgroup
http://groups.google.com/group/gugcz
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 5 / 58
Vytvořte HTML5/CSS3 aplikaci velikosti max. do 1kB (1024 bajtů)/připojené jQuery se nepočítá/ a krátce nám ji před akcí představte.
Nejlepší 3 aplikace získají ceny! Prezentace vašich aplikací budou zároveňzpropagovány na GUG.cz.
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 6 / 58
Agenda
Chrome Extensions (30-45 min)UIAPIpublishing (WebStore)měření úspěšnosti (Google Analytics)FAQ
Opera Extensions (30-45 min)Struktura rozšířeníTypy rozšířeníAPIPublikační proces
Live coding show - Chrome Extension
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 7 / 58
Proč Chrome Extensions?
Vše již léta známé technologie (HTML & CSS & JS)Spolehlivě obsáhlá implementace HTML5 & CSS3Integrované debuggovací nástrojePřipravené nástroje pro deployment (Google Code)Veřejná galerie rozšíření, kam kdokoliv může přispívat
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 8 / 58
manifest.json
manifest.json
{"name": "FIT Checker","version": "0.7","description": "Extension pro studenty FIT CTU","icons": {
"16": "media/img/icon-16.png","48": "media/img/icon-48.png","128": "media/img/icon-128.png"},
"browser_action": {"default_icon": "media/img/icon-19.png","default_title": "FIT Checker","default_popup": "popup.html"
},"options_page": "settings.html","permissions": [
"tabs","https://edux.fit.cvut.cz/*"
]}
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 9 / 58
Chrome UIJak může extension interagovat s uživatelem
1 Browser action2 Page action3 Override pages
1 Bookmark manager2 History3 New tab
4 Desktop Notifications5 Context Menu6 Option Pages
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 10 / 58
I. Browser actionAkce vyvolaná po kliknutí na ikonku v toolbaru
manifest.json
// ..."browser_action": {
"default_icon": "images/icon19.png","default_title": "Google Mail","default_popup": "popup.html"
},// ...
(a) Popup (b) Action
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 11 / 58
II. Page action
manifest.json
// ..."page_action": {
"default_icon": "icons/foo.png","default_title": "Do action","default_popup": "popup.html"
}// ...
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 12 / 58
III. Override pages
1 Bookmark manager - chrome://bookmarks2 History - chrome://history3 New tab - chrome://newtab
manifest.json
// ..."chrome_url_overrides" : {"pageToOverride": "myPage.html"// pageToOverride = (bookmarks|history|newtab)},// ...
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 13 / 58
IV. Desktop Notifications
HTML nebo plain-text hodnoty částí toastuvar notification1 = webkitNotifications.createNotification(
’48.png’,’Hello!’,’Lorem ipsum...’
);
var notification2 = webkitNotifications.createHTMLNotification(’notification.html’
);
notification1.show();
DEMORadek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 14 / 58
V. Context Menu
integer chrome.contextMenus.create(object createProperties, function callback)
chrome.contextMenus.remove(integer menuItemId, function callback)
chrome.contextMenus.removeAll(function callback)
chrome.contextMenus.update(integer id, object updateProperties, functioncallback)
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 15 / 58
VI. Option PagesOddělená strana pro nastavení celé extension
Možnost ukládat nastavení lokálně do prohlížečeLocalStoragevar foo = localStorage.getItem("bar");localStorage.setItem("bar", foo);
WebSQL (SQLite)var db = openDatabase(’foo’, ’1.0’, ’foo’, 2 * 1024);db.transaction(function (tx) {
tx.executeSql(’INSERT INTO foo (id, text) VALUES (1, "foobar")’);}, function(tx, result){
sucessCallback(result);}, function(tx, error){
errorCallback(error);});
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 16 / 58
Chrome APIs
1 Background page2 Content script3 Message passing4 Cross-origin XHR5 Bookmarks6 Cookies7 Tabs
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 17 / 58
I. Background pageOtevřená HTML stránka po celou dobu životního cyklu prohlížeče
Dokud běží alespoň jedna instance Chrome, beží všechny background page.
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 18 / 58
II. Content script
Otravná reklama a její „standardní“ odstranění je neobvykle nemožné,nebo drahé (AdBlock apod.)Doplnění funkčnosti webu (často funkčnosti, která je jinak „premium“)
manifest.json
// ..."content_scripts": [
{"matches": ["http://www.google.com/*"],"css": ["mystyles.css"],"js": ["jquery.js", "myscript.js"]
}]// ...
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 19 / 58
III. Message passingZpůsob komunikace mezi jednotlivými částmi rozšíření
contentScript.js
chrome.extension.sendRequest({greeting: "hello"}, function(response) {console.log(response.farewell);
});
background.html
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {console.log(sender.tab ?
"from a content script:" + sender.tab.url :"from the extension");
if (request.greeting == "hello")sendResponse({farewell: "goodbye"});
elsesendResponse({});
});
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 20 / 58
IV. Cross-origin XHR
var xhr = new XMLHttpRequest();xhr.open("GET", "https://www.google.com", true);xhr.onreadystatechange = function() {if (xhr.readyState == 4) {
console.log(xhr.responseText);}
};xhr.send();
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 21 / 58
V. Bookmarks
chrome.bookmarks.create(object bookmark, function callback)
chrome.bookmarks.get(string or array of string idOrIdList, function callback)
chrome.bookmarks.getTree(function callback)
chrome.bookmarks.search(string query, function callback)
chrome.bookmarks.remove(string id, function callback)
chrome.bookmarks.onCreated.addListener(function(string id, BookmarkTreeNodebookmark) {...});
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 22 / 58
VI. Cookies
chrome.cookies.get(object details, function callback)
chrome.cookies.set(object details)
chrome.cookies.getAll(object details, function callback)
chrome.cookies.onChanged.addListener(function(object changeInfo) {...});
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 23 / 58
VII. Tabs
chrome.tabs.create(object createProperties, function callback)
chrome.tabs.captureVisibleTab(integer windowId, object options, functioncallback)
chrome.tabs.detectLanguage(integer tabId, function callback)
chrome.tabs.executeScript(integer tabId, object details, function callback)
chrome.tabs.insertCSS(integer tabId, object details, function callback)
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 24 / 58
Aktualizace
Aktualizační mechanismus Extensions (XML) – plně automatizováno
Změna oprávněníPokud se změní oprávnění v nové verzi, uživatel je dotázán
Každé rozšíření == unikátní ID vygenerované privátním klíčemNikdo jiný, než majitel privátního klíče, nemůže vydat aktualizaci kdané extension
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 25 / 58
FAQ - Answers
Kdo z vás vyvinul nějakou Chrome Extension?
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 26 / 58
FAQ - Answers
Jak přesunout extension z vlastního hostingu na WebStore a neztratituživatele?
Vydat novou verzi s WebStore-ovou update URLPřibalit key.pem (stávající privátní klíč)
manifest.json
"update_url": "http://clients2.google.com/service/update2/crx",
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 27 / 58
FAQ - Answers
Jak může extension využít již uložené přihlašovací údaje v prohlížeči?Otevřít tab na pozadí a spustit vlastní JS kód
chrome.tabs.create({’url’: ’https://server.with.saved.credentials.com’,’selected’: false
}, function(tab) {chrome.tabs.executeScript(tab.id, {
’code’:"var data = {};" +"data.user = document.forms[’login’].username.value;" +"data.pass = document.forms[’login’].password.value;" +"data.tab_id = " + tab.id + ";" +"chrome.extension.sendRequest(data);"
});});
chrome.extension.onRequest.addListener(function(request) {
chrome.tabs.remove(request.tab_id);success(request);
});
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 28 / 58
FAQ - Answers
Jaká úskalí může skrývat komunikace se servery via HTTPS?Nedůvěryhodný certifikát => komunikace nemožná
Měření úspěchů pomocí Google AnalyticsWebStore
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 29 / 58
Q & A
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 30 / 58
Opera Extensions
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 31 / 58
Proč Opera Extensions?
Ano nebo ne?Podobné jako Chrome Extensions:
SpolečnéHTML, CSS, JavaScriptVeřejná galerie rozšíření
Opera postrádáPodpora HTML5 a CSS3 není kompletníDebuggovací nástroje nemají přímý přístup k rozšířeníNěkteré API funkce
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 32 / 58
Struktura rozšíření
/config.xml/index.html/background.js/popup.html/icons/example.png/options.html
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 33 / 58
Struktura rozšířeníconfig.xml
W3C standardDefinice informací o rozšířeníPotřebná oprávněníPočáteční uživatelské nastavení
<?xml version="1.0" encoding="utf-8" ?><widget xmlns="http://www.w3.org/ns/widgets" id="extensions:example" version="
1.0.0"><name>Example Extension</name><description>Short description</description><author href="http://example.org/tony/" email="tony@example.org">Tony Manero
</author><license>License text</license><icon src="icons/icon-128.png"/><access origin="http://ajax.googleapis.com"/><update-description href="http://example.org/example/updates.xml"/>
</widget>
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 34 / 58
Struktura rozšířeníindex.html
Inicializace rozšířeníProces na pozadí
theButton = opera.contexts.toolbar.createItem({title : "Click here",icon : "icons/icon-18.png",popup : {
href : "popup.html",width : "460px",height : "600px"
}});opera.contexts.toolbar.addItem(theButton);
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 35 / 58
Struktura rozšířeníoptions.html
Další obyčejná HTML stránkaExistuje vzor designu od OperyPravděpodobně bude obsahovat formulář a (hodně) javascriptUkládání nastavení přes background procesUkládání do widget.preferences
Pevně daný název souboru
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 36 / 58
Typy rozšíření
Injected script + index.htmlButton + PopupA bookmarklet extensionContent analysisContent-aware actionAuto-action
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 37 / 58
Typy rozšířeníInjected script + index.html
Jednoduché, nevyužívá výhody APIPrůběžně se něco vykonává, uživatel pravděpodobně ani neví, že tamněco takového jeNapříklad: Redirect to HTTPS
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 38 / 58
Typy rozšířeníButton + Popup
Zobrazení HTML stránky v popupuUžitečné pro klienty webových služebPo otevření popupu vlastně jen obyčejný webNapříklad: FIT Checker
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 39 / 58
Typy rozšířeníA bookmarklet extension
Pracuje se stránkouUmožňuje měnit design a UI webuNapříklad: AdBlock+
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 40 / 58
Typy rozšířeníContent analysis
Provede se při načtení stránky, výsledky akce v popupu nebo natlačítkuAnalýza webu - použití nejvíce asi u vývojářských nástrojůMožnost použití: vytvoří v popupu galerii obrázků na stránce
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 41 / 58
Typy rozšířeníContent-aware action
Podobné jako předchozí, jen pracuje až po kliknutí na tlačítkoNemusíme chtít validovat HTML při každém načtení stránkyNapříklad: Validator
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 42 / 58
Typy rozšířeníAuto-action
"hlídací pes"Akce spouštěné jednou za daný časPoužití u hlídačů na různé novinkyNapříklad: GMail Checker
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 43 / 58
Opera API
Background processBrowser ToolbarInjected ScriptsPopupWindows and TabsMessaging
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 44 / 58
Opera APIBackground process
Přístup k toolbaruopera.contexts.toolbar;
Informace o rozšířeníwindow.widget.author;window.widget.preferences;
Jako jediný má přístup k rozšíření jako celkuPráva na práci s okny a tabyopera.extension.tabs;opera.extension.windows;
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 45 / 58
Opera APIBrowser Toolbar
Umožňuje práci s toolbaremopera.contexts.toolbar.length;
Vytváření, změny a rušení tlačítekvar button = opera.contexts.toolbar.createItem({
title : ’Example Extension’,icon : ’icons/icon-18.png’
});opera.contexts.toolbar.addItem(button);opera.contexts.toolbar.removeItem(button);
Nastavení popupuPráce s badge
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 46 / 58
Opera APIInjected Scripts
Pracují s objektem prohlížečeopera.extension;opera.addEventListener();opera.removeEventListener();
Množství událostí k poslechuPosílání zprávopera.postError(); // odesle zpravu do error consoleopera.extension.postMessage();
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 47 / 58
Opera APIPopup
Jednoduchéondisconnect;onmessage;
Posílání zprávpostMessage();
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 48 / 58
Opera APIWindows and Tabs
Zatím nekompletníOtevírání a zavírání tabů/okenUmožňuje přístup ke všem otevřeným oknům
opera.extension.windows.addEventListener();opera.extension.windows.create();opera.extension.windows.getAll();
opera.extension.tabs.addEventListener();opera.extension.tabs.create();
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 49 / 58
Opera APIMessaging
Posílání zpráv mezi jednotlivými částmi rozšířeníBackground processInjected scriptPopup
Řešení přes odchytávání událostíMezi Injected scriptem a popupem lze vytvořit komunikační kanál
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 50 / 58
Přihlášení k webové aplikaci
Cookies nejsou sdílené s prohlížečemAni simulace otevření tabu na pozadí nepomůžeNutné vlastní přihlášeníUložené jméno a heslo ve widget.preferences
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 51 / 58
Publikační proces
Nestačí jen nahrát na webSchvalovací proces
Nahrát rozšíření na web OperyPočkat, zda bude schválenoPublikováno nebo odmítnuto
Požadavky ke schváleníJménoKategorieLicencePopisIkona 64x64Alespoň jeden screenshot
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 52 / 58
Aktualizace
Soubor ve formátu XMLPokud není třeba aktualizovat, je prázdnýAutomatické aktualizace každých 24 hodinNa vlastním serveru potřeba definice typu souboru pro rozšířeníUživatel musí dát souhlas s důvěryhodností
<?xml version="1.0" encoding="utf-8" ?><update-info
xmlns="http://www.w3.org/ns/widgets"src="http://example.org/tony/example.oex"version="1.0.0"
></update-info>
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 53 / 58
Q & A
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 54 / 58
Srovnání Chrome a Opery
PozitivaChrome
HTML5, CSS3Opera
BezpečnostPráce s uživatelským nastavenímSchvalovací proces
NegativaChrome
Cookies safety?Opera
HTML5, CSS3Nesdílené cookiesAPI omezenější než u Chrome
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 55 / 58
Co teď?
Hurá programovat!
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 56 / 58
Odkazy
http://dev.opera.com/articles/view/opera-extensions-quick-documentation-overview/http://code.google.com/chrome/extensions/index.html
betadevtrunk
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 57 / 58
To už je vše přátelé
Děkujeme za pozornost
Radek Šimko, Martin Štekl (FIT ČVUT) Chrome & Opera Extensions 16. března 2011 58 / 58