Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
Shibuya Pm Tt08 Advanced Mogilefs
guest172cfb
Tide - SmalltalkでSPA
Masashi Umezawa
About GStreamer 1.0 application development for beginners
Shota TAMURA
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
Nodejs
Masanobu Masuda
第8回KPF発表資料
cryks
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Kohei KaiGai
TDC20111031_Groovy_Geb
Nobuhiro Sue
1
of
71
Top clipped slide
Chrome Extensionsの基本とデザインパターン
Jan. 17, 2016
•
0 likes
9 likes
×
Be the first to like this
Show More
•
1,498 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Software
Chrome+html5 developers live japan #1
Yoichiro Tanaka
Follow
Software Engineer at Increments, Inc.
Advertisement
Advertisement
Advertisement
Recommended
Nuxt.js + microCMS + netlify
ogawatti
147 views
•
46 slides
Openresty
ogawatti
1K views
•
41 slides
Ginとbindataで作るシングルバイナリWebApp
Akihiko Horiuchi
4.5K views
•
18 slides
jQuery Performance Tips – jQueryにおける高速化 -
Hayato Mizuno
14K views
•
93 slides
静的サイトどこにする?
ogawatti
186 views
•
72 slides
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
11.3K views
•
48 slides
More Related Content
Slideshows for you
(20)
Shibuya Pm Tt08 Advanced Mogilefs
guest172cfb
•
971 views
Tide - SmalltalkでSPA
Masashi Umezawa
•
1.4K views
About GStreamer 1.0 application development for beginners
Shota TAMURA
•
9.5K views
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
•
14.2K views
Nodejs
Masanobu Masuda
•
520 views
第8回KPF発表資料
cryks
•
4.3K views
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Kohei KaiGai
•
1.8K views
TDC20111031_Groovy_Geb
Nobuhiro Sue
•
675 views
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
•
5.3K views
JavaでインメモリSQLエンジンを作ってみた
JustSystems Corporation
•
4.6K views
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
•
13.4K views
10分で作る Node.js Auto Scale 環境 with CloudFormation
Kazuyuki Honda
•
4K views
Pycon2014 django performance
hirokiky
•
12.4K views
VarnishではじめるESI
Iwana Chan
•
11.4K views
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤
•
692 views
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Tsuyoshi Yamamoto
•
930 views
HTML5&API総まくり
Shumpei Shiraishi
•
10.1K views
Gradle a new Generation Build Tool
Shinya Mochida
•
7.6K views
社内勉強会資料(Varnish Module)
Iwana Chan
•
7K views
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
Kiyoshi Sawada
•
334 views
Similar to Chrome Extensionsの基本とデザインパターン
(20)
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
•
2.7K views
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
Yuki Takei
•
21.2K views
Selenium webdriver使ってみようず
Oda Shinsuke
•
2.6K views
Try Jetpack
Hideaki Miyake
•
1.1K views
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama
•
4.8K views
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
•
1.5K views
Data api workshop at Co-Edo
Yuji Takayama
•
4.9K views
エンタープライズ分野での実践AngularJS
Ayumi Goto
•
9.7K views
Ajax 応用
Katsuyuki Seino
•
5.9K views
ASP.NET シングル ページ アプリケーション (SPA) 詳説
Akira Inoue
•
17.8K views
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Akira Inoue
•
2K views
【18-C-4】Google App Engine - 無限の彼方へ
Developers Summit
•
2.7K views
Html5 Web Applications
totty jp
•
3.4K views
Express Web Application Framework
LearningTech
•
665 views
Android Architecture Componentsの新機能
Damper Matsu
•
221 views
Ajax basic
Katsuyuki Seino
•
4.3K views
アプリコンテスト
Tomonori Yamada
•
530 views
JavaScriptでWebDriverのテストコードを書きましょ
Kohki Nakashima
•
8.3K views
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
•
25.8K views
EC-CUBEプラグイン講義
ria1201
•
16.9K views
Advertisement
More from Yoichiro Tanaka
(15)
Navigate users from assistant app to android app
Yoichiro Tanaka
•
482 views
Chrome Extensionsから見るWebExtensions
Yoichiro Tanaka
•
1.3K views
みんなの知らないChrome appsの世界
Yoichiro Tanaka
•
2.2K views
Chromeウェブストア - Html5とか勉強会42
Yoichiro Tanaka
•
2.4K views
Info scoop opensource
Yoichiro Tanaka
•
961 views
Yapc
Yoichiro Tanaka
•
1K views
SocialWeb-Japan Vol.2 20090428
Yoichiro Tanaka
•
788 views
JRuby on Rails
Yoichiro Tanaka
•
2K views
JavaEdge第3回ライブセッション
Yoichiro Tanaka
•
889 views
maven2+aptで楽々ドキュメント
Yoichiro Tanaka
•
685 views
丸山先生レクチャーシリーズ2007-2008
Yoichiro Tanaka
•
1.2K views
Sun Tech Days 2007 Mash up
Yoichiro Tanaka
•
721 views
体操競技のルール改正と今後の日本の方向性
Yoichiro Tanaka
•
2.2K views
Wicket勉強会2
Yoichiro Tanaka
•
1.4K views
世間の荒波を乗りこなせ!
Yoichiro Tanaka
•
1.5K views
Recently uploaded
(20)
留信网认证可查【艾格伍学院文凭证书毕业证购买】
32lkhng
•
2 views
測量支援ソフト「みとおしえ」「みとおしえクラウド」の紹介
ssuserbceee8
•
59 views
WEB-jsug info14_final.pdf
Draft One
•
4 views
留信网认证可查【马努卡理工学院文凭证书毕业证购买】
ihh14ds
•
2 views
①【威得恩大学毕业证文凭学位证书|工艺完美复刻】
0987hgh789
•
2 views
留信网认证可查【萨福克大学文凭证书毕业证购买】
hh123hh1
•
3 views
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
Tomoharu ASAMI
•
9 views
☀️《URI毕业证仿真》
sada332
•
2 views
キレイなコードって.pdf
shumashimo1
•
12 views
☀️【斯旺西大学毕业证成绩单留学生首选】
25mjhd12
•
2 views
留信网认证可查【堪萨斯大学文凭证书毕业证购买】
1lkjhg
•
2 views
脆弱性がみつかってからパッチとSecurity Bulletinが作られるまで
Hiroko Takamiya
•
2 views
留信网认证可查【莱比锡大学文凭证书毕业证购买】
khh123kj
•
2 views
①【利兹贝克特大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 views
留信网认证可查【麻省大学洛威尔分校文凭证书毕业证购买】
hh123hh1
•
2 views
留信网认证可查【俄亥俄大学文凭证书毕业证购买】
1lkjhg
•
2 views
留信网认证可查【伯明翰大学文凭证书毕业证购买】
32lkhng
•
2 views
①【诺丁汉大学毕业证文凭学位证书|工艺完美复刻】
0987hgh789
•
2 views
測量データ処理ソフト・MarineDiscoveryの紹介
ssuserbceee8
•
39 views
☀️【萨德伯里大学毕业证成绩单留学生首选】
15sad
•
2 views
Advertisement
Chrome Extensionsの基本とデザインパターン
Chrome Extensionsの基本 とデザインパターン Chrome+HTML5 Developers
Live Japan #1
Chrome Extension 使ってますか?
Chrome Extensionで 何ができるの?
Browser Actions
Page Actions
Context Menus
Desktop Notifications
Options Pages
Options Pages
APIs alarms, bookmarks, browserAction,
browsingData, commands, contentSettings, contextMenus, cookies, debugger, declarativeWebRequest, devtools.network, devtools.inspectedWindow, devtools.panels, downloads, events, extension, fileBrowserHandler, fontSettings, history, i18n, idle, input.ime, management, omnibox, pageAction, pageCapture, permissions, privacy, proxy, pushMessaging, runtime, scriptBadge, storage, tabs, topSites, tts, ttsEngine, types, webNavigation, webRequest, webstore, windows
APIs
Chrome Extensionは 何でできてるの?
Technologies Web pages +
JavaScript API
Structure マニフェストファイル(manifest.json) 1つ以上のHTMLファイル (Optional) 1つ以上のJavaScriptファイル (Optional) 必要となる他のファイル -
画像ファイルなど これらをzipファイルにまとめてChromeウェブ ストアにアップロードする
Minimum Extension manifest.json { "manifest_version": 2, "name":
"Minimum Extension", "version": "0.0.1", "browser_action": { "default_popup": "popup.html" } }
Minimum Extension popup.html <!DOCTYPE html> <html> <head></head> <body> <div>Hello,
Chrome extension!</div> </body> </html>
Minimum Extension
Minimum Extension
Minimum Extension
Minimum Extension
Minimum Extension
オレ流 Chrome Extension デザインパターン
Structure manifest.json analytics.json background.js options.html options.js popup.html popup.js
My design pattern
for Chrome Extension manifest.json
{ ... "version": "バージョン番号(XX.XX.XX形式)", "browser_action":
{ "default_icon": "./icon_**.png (**はサイズ)", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... }
{ ... "version": "バージョン番号(XX.XX.XX形式)", "browser_action":
{ "default_icon": "./icon_**.png (**はサイズ)", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persist": false, ... }, "options_page": "./options.html", "default_locale": "en", ... } Browser/Page actionのコンテ ンツは「popup.html」という ファイル名にする
{ ... "version": "バージョン番号(XX.XX.XX形式)", "browser_action":
{ "default_icon": "./icon_**.png (**はサイズ)", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": ["./jquery-min.js","./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... } Background Pageは必ず作成 し「background.js」というフ ァイル名とする 軽いExtensionとするために Event pageとする
{ ... "version": "バージョン番号(XX.XX.XX形式)", "browser_action":
{ "default_icon": "./icon_**.png (**はサイズ)", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... } 設定ページが必要な場合は 「options.html」というファ イル名で作成する
{ ... "version": "バージョン番号(XX.XX.XX形式)", "browser_action":
{ "default_icon": "./icon_**.png (**はサイズ)", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... } どんなに小さなExtensionで も国際化しておく 最低限enとjaをサポートする
{ ... "version": "バージョン番号(XX.XX.XX形式)", "browser_action":
{ "default_icon": "./icon_**.png (**はサイズ)", "default_popup": "./popup.html", ... }, "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", "background": { "scripts": [ "./jquery-min.js", "./background.js" ], "persistent": false, ... }, "options_page": "./options.html", "default_locale": "en", ... } 利用状況を把握するために Google Analyticsを仕込んでおく Google Analyticsサーバと通信す るためにCSPに記載しておく
Google Analytics ポリシー: 「Google Analyticsを使っていることを開示し、 トラッキングデータの収集のためにCookieが使 われていることも明記する」 ChromeウェブストアのページやExtension内に てちゃんとユーザに説明しましょう。
My design pattern
for Chrome Extension background.js
popup.html popup.js options.html options.js background.js Backend server UI処理に専念 UI処理に専念 Ajaxでの通信 設定値出し入れ イベント処理
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background();
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background(); 各種イベントハンドラを登録する 処理を「assignEventHandlers()」 関数にまとめる
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background(); assignEventHandlers: function() { // タブの変更監視 chrome.tab.onActivated.addListener( function(activeInfo) { ... } ); // Chromeの起動監視 chrome.runtime.onStartup.addListener( function() { // Google Analyticsに記録など _gaq.push(["_trackEvent", "..", ".."]); } ); ... },
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background(); Ajax処理は「load***()」という関 数名にする Ajax処理をbackground.jsに集めて おく(Debugしやすくなるため)
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background(); load***: function(callbacks) { $.ajax({ url: this.getServerUrl + "ajax/get_***" }) .done(function(data) { callbacks.onSuccess(data); }); }, getServerUrl: function() { return "http://backend.server.name/"; },
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background();設定ページで設定されるような動 的な設定値の格納と取得処理も background.jsにまとめておく
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background(); get***Config: function() { var value = localStorage["***"]; if (value) { return value; } else { return "初期値"; } }, set***Config: function() { localStorage["***"] = value; },
popup.html popup.js options.html options.js background.js Backend server chrome.runtime.getBackgroundPage() でアクセス可能 Chrome
DevTools
My design pattern
for Chrome Extension options.html
Options Pages
<!DOCTYPE html> <html> <head> <script type="text/javascript"
src="./jquery-min.js"> <script type="text/javascript" src="./options.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> ... <div><span id="opt***"></span></div> <table> <tr> <td> <input type="checkbox" id="***" /> </td> <td> <span id="opt***"></span> </td> </tr> ... </table> ...
<!DOCTYPE html> <html> <head> <script type="text/javascript"
src="./jquery-min.js"> <script type="text/javascript" src="./options.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> ... <div><span id="opt***"></span></div> <table> <tr> <td> <input type="checkbox" id="***" /> </td> <td> <span id="opt***"></span> </td> </tr> ... </table> ... Google Analyticsで設定ページへの アクセスを計測できるようにする
var _gaq =
_gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxx-xx']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = 'https://ssl.google-analytics.com/ga.js'; var s = document.getElementByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
<!DOCTYPE html> <html> <head> <script type="text/javascript"
src="./jquery-min.js"> <script type="text/javascript" src="./options.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> ... <div><span id="opt***"></span></div> <table> <tr> <td> <input type="checkbox" id="***" /> </td> <td> <span id="opt***"></span> </td> </tr> ... </table> ... 表示文字列はhtmlに 一切記載しない id属性はしっかり 書いておく
My design pattern
for Chrome Extension options.js
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })();
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })(); onloadイベント発生に応じて初期 化処理が動くようにしておく
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })(); 各種初期化処理を呼び出す 他のjsと関数名を揃えておく
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })(); assignMessages: function() { var hash = { "opt***" : "opt***", ... }; for (var key in hash) { $("#" + key).text( chrome.i18n.getMessage(hash[key])); } }, HTMLの各プレースホルダ(id属性を振っ た要素)に対して、メッセージリソース から得た国際化文字列をセットする
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })(); restoreConfigurations: function() { chrome.runtime.getBackgroundPage( function(bg) { $("#***").val(bg.get***Config()); ... } ); }; Background pageの設定値取得 関数を使って、せっせとUIに値 をセットしていく
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })(); assignEventHandlers: function() { $("#***").on("click", $.proxy( function(evt) { this.onClick***(evt); }, this )); }, onClick***: function(evt) { chrome.runtime.getBackgroundPage( function(bg) { var value = $("#***").val(); bg.set***Config(value); } ); }, Background pageの設定値格納 関数を使って設定値を保存する
(function() { var Options
= function() { this.assignMessages(); this.assignEventHandlers(); this.restoreConfigurations(); }); }; Options.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, restoreConfigurations: function() { ... }, }; window.addEventListener( "load", function(evt) { new Options(); }); })(); assignEventHandlers: function() { $("#***").on("click", $.proxy( function(evt) { this.onClick***(evt); }, this )); }, onClick***: function(evt) { chrome.runtime.getBackgroundPage( function(bg) { var value = $("#***").val(); bg.set***Config(value); } ); }, イベントハンドラの名前は 「on+イベント種別+UI項目名」 とする
My design pattern
for Chrome Extension popup.html
<!DOCTYPE html> <html> <head> <script type="text/javascript"
src="./jquery-min.js"> <script type="text/javascript" src="./popup.js"> </head> <body> <script type="text/javascript" src="./analytics.js"> <span id="***"></span> ... options.jsとほぼ一緒
My design pattern
for Chrome Extension popup.js
(function() { var Popup
= function() { this.assignMessages(); this.assignEventHandlers(); }; Popup.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, ... }; window.addEventListener( "load", function(evt) { new Popup(); }); })(); options.jsとほぼ一緒
(function() { var Popup
= function() { this.assignMessages(); this.assignEventHandlers(); }; Popup.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, ... }; window.addEventListener( "load", function(evt) { new Popup(); }); })(); assignEventHandlers: function() { $("#***").on("click", $.proxy(function(evt) { this.onClick***(evt); }, this)); }, onClick***: function(evt) { chrome.runtime.getBackgroundPage( function(bg) { // 設定値を取得 var config =bg.get***Config(); // Ajax通信 bg.load***({ onSuccess: function(data) { ... } }); } ); }, Background pageが提 供する関数を利用
My design pattern ロジックを整理&集中させる -
Background pageをうまく使うこと 統一感を作り出す - assign***() , onClick***() , set/get***Config() 国際化を徹底させる - id属性, assignMessages()
利用者が増えるのを 楽しむには?
http://developer.chrome.com/extensions/
Advertisement