Submit Search
Upload
Chrome Extensionsの基本とデザインパターン
•
Download as PPTX, PDF
•
9 likes
•
1,504 views
Yoichiro Tanaka
Follow
Chrome+html5 developers live japan #1
Read less
Read more
Software
Report
Share
Report
Share
1 of 71
Download now
Recommended
Nuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlify
ogawatti
Openresty
Openresty
ogawatti
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
Akihiko Horiuchi
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
Hayato Mizuno
静的サイトどこにする?
静的サイトどこにする?
ogawatti
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
LINQ in Unity
LINQ in Unity
Yoshifumi Kawai
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
Tsuyoshi Yamamoto
Recommended
Nuxt.js + microCMS + netlify
Nuxt.js + microCMS + netlify
ogawatti
Openresty
Openresty
ogawatti
Ginとbindataで作るシングルバイナリWebApp
Ginとbindataで作るシングルバイナリWebApp
Akihiko Horiuchi
jQuery Performance Tips – jQueryにおける高速化 -
jQuery Performance Tips – jQueryにおける高速化 -
Hayato Mizuno
静的サイトどこにする?
静的サイトどこにする?
ogawatti
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
Kiyoshi SATOH
LINQ in Unity
LINQ in Unity
Yoshifumi Kawai
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
Tsuyoshi Yamamoto
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefs
guest172cfb
Tide - SmalltalkでSPA
Tide - SmalltalkでSPA
Masashi Umezawa
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
Shota TAMURA
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
Nodejs
Nodejs
Masanobu Masuda
第8回KPF発表資料
第8回KPF発表資料
cryks
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Kohei KaiGai
TDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
Nobuhiro Sue
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみた
JustSystems Corporation
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
Kazuyuki Honda
Pycon2014 django performance
Pycon2014 django performance
hirokiky
VarnishではじめるESI
VarnishではじめるESI
Iwana Chan
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Tsuyoshi Yamamoto
HTML5&API総まくり
HTML5&API総まくり
Shumpei Shiraishi
Gradle a new Generation Build Tool
Gradle a new Generation Build Tool
Shinya Mochida
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
Iwana Chan
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
Kiyoshi Sawada
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
Yuki Takei
More Related Content
What's hot
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefs
guest172cfb
Tide - SmalltalkでSPA
Tide - SmalltalkでSPA
Masashi Umezawa
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
Shota TAMURA
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
Nodejs
Nodejs
Masanobu Masuda
第8回KPF発表資料
第8回KPF発表資料
cryks
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Kohei KaiGai
TDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
Nobuhiro Sue
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみた
JustSystems Corporation
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
Kazuyuki Honda
Pycon2014 django performance
Pycon2014 django performance
hirokiky
VarnishではじめるESI
VarnishではじめるESI
Iwana Chan
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
博文 斉藤
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Tsuyoshi Yamamoto
HTML5&API総まくり
HTML5&API総まくり
Shumpei Shiraishi
Gradle a new Generation Build Tool
Gradle a new Generation Build Tool
Shinya Mochida
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
Iwana Chan
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
Kiyoshi Sawada
What's hot
(20)
Shibuya Pm Tt08 Advanced Mogilefs
Shibuya Pm Tt08 Advanced Mogilefs
Tide - SmalltalkでSPA
Tide - SmalltalkでSPA
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Nodejs
Nodejs
第8回KPF発表資料
第8回KPF発表資料
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
Custom Scan API - PostgreSQL Unconference #3 (18-Jan-2014)
TDC20111031_Groovy_Geb
TDC20111031_Groovy_Geb
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
JavaでインメモリSQLエンジンを作ってみた
JavaでインメモリSQLエンジンを作ってみた
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
Pycon2014 django performance
Pycon2014 django performance
VarnishではじめるESI
VarnishではじめるESI
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
日本 GNU AWK ユーザー会チラシ - OSC2012 Tokyo/Fall
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
Grails-1.1を斬る!~Grails-1.1からのチーム開発~ in Tokyo
HTML5&API総まくり
HTML5&API総まくり
Gradle a new Generation Build Tool
Gradle a new Generation Build Tool
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
Similar to Chrome Extensionsの基本とデザインパターン
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
Yuki Takei
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
Try Jetpack
Try Jetpack
Hideaki Miyake
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
Yuji Takayama
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
Data api workshop at Co-Edo
Data api workshop at Co-Edo
Yuji Takayama
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto
Ajax 応用
Ajax 応用
Katsuyuki Seino
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
Akira Inoue
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Akira Inoue
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ
Developers Summit
Html5 Web Applications
Html5 Web Applications
totty jp
Express Web Application Framework
Express Web Application Framework
LearningTech
Android Architecture Componentsの新機能
Android Architecture Componentsの新機能
Damper Matsu
Ajax basic
Ajax basic
Katsuyuki Seino
アプリコンテスト
アプリコンテスト
Tomonori Yamada
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
Kohki Nakashima
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
Yosuke Furukawa
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
ria1201
Similar to Chrome Extensionsの基本とデザインパターン
(20)
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
自作node.jsフレームワークとnginxを使ってラジオサイトを作ってみた
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
Try Jetpack
Try Jetpack
初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Data api workshop at Co-Edo
Data api workshop at Co-Edo
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ajax 応用
Ajax 応用
ASP.NET シングル ページ アプリケーション (SPA) 詳説
ASP.NET シングル ページ アプリケーション (SPA) 詳説
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
【18-C-4】Google App Engine - 無限の彼方へ
【18-C-4】Google App Engine - 無限の彼方へ
Html5 Web Applications
Html5 Web Applications
Express Web Application Framework
Express Web Application Framework
Android Architecture Componentsの新機能
Android Architecture Componentsの新機能
Ajax basic
Ajax basic
アプリコンテスト
アプリコンテスト
JavaScriptでWebDriverのテストコードを書きましょ
JavaScriptでWebDriverのテストコードを書きましょ
ヒカルのGo 資料 Webアプリケーションの作り方
ヒカルのGo 資料 Webアプリケーションの作り方
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
More from Yoichiro Tanaka
Navigate users from assistant app to android app
Navigate users from assistant app to android app
Yoichiro Tanaka
Chrome Extensionsから見るWebExtensions
Chrome Extensionsから見るWebExtensions
Yoichiro Tanaka
みんなの知らないChrome appsの世界
みんなの知らないChrome appsの世界
Yoichiro Tanaka
Chromeウェブストア - Html5とか勉強会42
Chromeウェブストア - Html5とか勉強会42
Yoichiro Tanaka
Info scoop opensource
Info scoop opensource
Yoichiro Tanaka
Yapc
Yapc
Yoichiro Tanaka
SocialWeb-Japan Vol.2 20090428
SocialWeb-Japan Vol.2 20090428
Yoichiro Tanaka
JRuby on Rails
JRuby on Rails
Yoichiro Tanaka
JavaEdge第3回ライブセッション
JavaEdge第3回ライブセッション
Yoichiro Tanaka
maven2+aptで楽々ドキュメント
maven2+aptで楽々ドキュメント
Yoichiro Tanaka
丸山先生レクチャーシリーズ2007-2008
丸山先生レクチャーシリーズ2007-2008
Yoichiro Tanaka
Sun Tech Days 2007 Mash up
Sun Tech Days 2007 Mash up
Yoichiro Tanaka
体操競技のルール改正と今後の日本の方向性
体操競技のルール改正と今後の日本の方向性
Yoichiro Tanaka
Wicket勉強会2
Wicket勉強会2
Yoichiro Tanaka
世間の荒波を乗りこなせ!
世間の荒波を乗りこなせ!
Yoichiro Tanaka
More from Yoichiro Tanaka
(15)
Navigate users from assistant app to android app
Navigate users from assistant app to android app
Chrome Extensionsから見るWebExtensions
Chrome Extensionsから見るWebExtensions
みんなの知らないChrome appsの世界
みんなの知らないChrome appsの世界
Chromeウェブストア - Html5とか勉強会42
Chromeウェブストア - Html5とか勉強会42
Info scoop opensource
Info scoop opensource
Yapc
Yapc
SocialWeb-Japan Vol.2 20090428
SocialWeb-Japan Vol.2 20090428
JRuby on Rails
JRuby on Rails
JavaEdge第3回ライブセッション
JavaEdge第3回ライブセッション
maven2+aptで楽々ドキュメント
maven2+aptで楽々ドキュメント
丸山先生レクチャーシリーズ2007-2008
丸山先生レクチャーシリーズ2007-2008
Sun Tech Days 2007 Mash up
Sun Tech Days 2007 Mash up
体操競技のルール改正と今後の日本の方向性
体操競技のルール改正と今後の日本の方向性
Wicket勉強会2
Wicket勉強会2
世間の荒波を乗りこなせ!
世間の荒波を乗りこなせ!
Chrome Extensionsの基本とデザインパターン
1.
Chrome Extensionsの基本 とデザインパターン Chrome+HTML5 Developers
Live Japan #1
2.
Chrome Extension 使ってますか?
3.
4.
5.
6.
7.
Chrome Extensionで 何ができるの?
8.
Browser Actions
9.
Page Actions
10.
Context Menus
11.
Desktop Notifications
12.
Options Pages
13.
Options Pages
14.
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
15.
APIs
16.
Chrome Extensionは 何でできてるの?
17.
Technologies Web pages +
JavaScript API
18.
Structure マニフェストファイル(manifest.json) 1つ以上のHTMLファイル (Optional) 1つ以上のJavaScriptファイル (Optional) 必要となる他のファイル -
画像ファイルなど これらをzipファイルにまとめてChromeウェブ ストアにアップロードする
19.
Minimum Extension manifest.json { "manifest_version": 2, "name":
"Minimum Extension", "version": "0.0.1", "browser_action": { "default_popup": "popup.html" } }
20.
Minimum Extension popup.html <!DOCTYPE html> <html> <head></head> <body> <div>Hello,
Chrome extension!</div> </body> </html>
21.
Minimum Extension
22.
Minimum Extension
23.
Minimum Extension
24.
Minimum Extension
25.
Minimum Extension
26.
オレ流 Chrome Extension デザインパターン
27.
Structure manifest.json analytics.json background.js options.html options.js popup.html popup.js
28.
My design pattern
for Chrome Extension manifest.json
29.
{ ... "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", ... }
30.
{ ... "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」という ファイル名にする
31.
{ ... "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とする
32.
{ ... "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」というファ イル名で作成する
33.
{ ... "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をサポートする
34.
{ ... "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に記載しておく
35.
Google Analytics ポリシー: 「Google Analyticsを使っていることを開示し、 トラッキングデータの収集のためにCookieが使 われていることも明記する」 ChromeウェブストアのページやExtension内に てちゃんとユーザに説明しましょう。
36.
My design pattern
for Chrome Extension background.js
37.
popup.html popup.js options.html options.js background.js Backend server UI処理に専念 UI処理に専念 Ajaxでの通信 設定値出し入れ イベント処理
38.
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background();
39.
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background(); 各種イベントハンドラを登録する 処理を「assignEventHandlers()」 関数にまとめる
40.
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", "..", ".."]); } ); ... },
41.
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しやすくなるため)
42.
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/"; },
43.
var Background =
function() { this.assignEventHandlers(); }; Background.prototype = { assignEventHandlers: function() {...}, load***: function(callbacks) {...}, get***Config: function() {...}, set***Config: function() {...} ... }; var bg = new Background();設定ページで設定されるような動 的な設定値の格納と取得処理も background.jsにまとめておく
44.
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; },
45.
popup.html popup.js options.html options.js background.js Backend server chrome.runtime.getBackgroundPage() でアクセス可能 Chrome
DevTools
46.
My design pattern
for Chrome Extension options.html
47.
Options Pages
48.
<!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> ...
49.
<!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で設定ページへの アクセスを計測できるようにする
50.
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); })();
51.
<!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属性はしっかり 書いておく
52.
My design pattern
for Chrome Extension options.js
53.
(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(); }); })();
54.
(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イベント発生に応じて初期 化処理が動くようにしておく
55.
(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と関数名を揃えておく
56.
(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属性を振っ た要素)に対して、メッセージリソース から得た国際化文字列をセットする
57.
(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に値 をセットしていく
58.
(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の設定値格納 関数を使って設定値を保存する
59.
(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項目名」 とする
60.
My design pattern
for Chrome Extension popup.html
61.
62.
<!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とほぼ一緒
63.
My design pattern
for Chrome Extension popup.js
64.
(function() { var Popup
= function() { this.assignMessages(); this.assignEventHandlers(); }; Popup.prototype = { assignMessages: function() { ... }, assignEventHandlers: function() { ... }, ... }; window.addEventListener( "load", function(evt) { new Popup(); }); })(); options.jsとほぼ一緒
65.
(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が提 供する関数を利用
66.
My design pattern ロジックを整理&集中させる -
Background pageをうまく使うこと 統一感を作り出す - assign***() , onClick***() , set/get***Config() 国際化を徹底させる - id属性, assignMessages()
67.
利用者が増えるのを 楽しむには?
68.
69.
70.
71.
http://developer.chrome.com/extensions/
Download now