Chrome拡張入門

Google Chrome拡張の概要から作り方(@Chrome Extension TechTalk)

Shogo Ohta, 2010-4-9

はじめに

自己紹介

名前:
太田 昌吾
os0x(blog, Twitter)
Chrome ExtensionsのAPI Expertで、Chromium Extensions Japanグループの管理人
お仕事:
Chrome拡張について記事を書いたり、JavaScriptの記事を書いたりしています

2010/3/25にGoogle Chrome OS 最新技術と戦略を完全ガイド: 小池良次, 中島聡, 伊藤千光, 太田昌吾, まえだひさこ, 向井領治が発売!

Software Design 2010年5月号にChrome拡張の特集25ページが掲載予定です。

得意分野:
ほぼJavaScript専門、なかでもクロスブラウザや高速化が得意です
簡単な経歴:
元々、OperaのUserJavaScriptやGreasemonkeyを良く書いていた(oAutoPagerizeとか)
ChromeでもUserScriptsが動くらしい→拡張もできる(ようになる)らしい→UserJavaScriptより色々できて楽しい!→拡張作ったり、記事を書いていたらgihyo.jpで連載をすることに→そのまま勢いでAPI Expertに

Chromium Extensions Japan

Google Chromeの拡張機能について、APIの最新情報や開発のノウハウなどを日本語で共有するGoogle 準公式のコミュニティ

2009年12月にできたばかり。こういったイベントのほか、オンラインでの勉強会なども計画中

Google Chromeとは、Chrome拡張とは

Chromium
レンダリングエンジンにWebKitを、JavaScriptエンジンにV8を採用したオープンソースのウェブブラウザ
Google Chrome
ChromiumをGoogleがカスタムして公開しているブラウザ
Chrome拡張
Chrome/Chromium上で動く、ウェブブラウザに特定の機能を追加するHTMLベースのアプリケーション

Chrome vs Chromium

Google ChromeChromium補足
ロゴ
開発者Googler誰でも(多くはGoogler)
障害報告あり(ONにした場合)なし
利用統計あり(ONにした場合)なし
HTML5のVideo、AudioH.264、AAC、MP3、Vorbis、Theora デフォルトではVorbisとTheoraのみFFmpegを使用しているので、自己責任においてこれを差し替えれば対応フォーマットを変えることができる
ページ翻訳機能ありなし※日本語圏での評判はいまひとつ
サンドボックス(セキュリティ機構)常にON場合によってはOFFになっていることも非公式なパッケージなどは要注意
品質保証事前にテストされてからリリースされるNightly Buildsのみ

Chromiumの特徴

オープンソースなので、すべてのソースが読める。カスタムしてビルドを作れる。

オープンソースコミュニティのパワーで、日々開発が進んでいる。また、Chromiumのカスタム版が数多く存在する。

今すぐ開発に参加できる chromium - Project Hosting on Google Codeへ!

Chromeの特徴

stable(安定版)、beta(テスト版)、dev(開発版)の3つのリリースがある

安定版は名前の通り、一般ユーザーが使用するリリース、(セキュリティフィックスを除いて)半年に1回程度のリリース

テスト版は、主に安定版のリリース前に、安定化のためにリリースされる、時期によってはまったくリリースされないが、1ヶ月に1回程度のリリース

開発版は、安定版のリリース後、次のバージョンに向けた新機能追加を主目的(そのため不安定になることも多々)にリリースされる、1週間に1回程度のリリース
※開発版もリリース前は安定する。修正が多く適用されている分だけテスト版より安定することも。

Chromeの構成

JavaScriptエンジンはV8というChromeのために開発したオープンソースのエンジンを搭載

レンダリングエンジンはWebKitのWebCoreを採用

WebCoreは、WebKitのレンダリング周りの実装(JavaScript部分はJavaScriptCore)

V8とWebCoreを繋ぐ部分にバグが潜みやすい…(Safariでは正常なのに、Chromeだとなんかおかしくなるなぁという現象はここに起因することが多い)

最近はChromiumチームが積極的にWebKitにコミットするようになっていて、かなり改善しつつある

Chrome拡張とは

HTML/CSS/JavaScriptで作る、ブラウザをもっと便利にするモノ

(2010年末に登場予定の)Chrome OSではアプリケーションの役割を果たす?

とにかく作るのは簡単、でも制約は多い

Chrome拡張の例

実物を見てもらうのが一番

公式の拡張ギャラリーには2010年4月9日時点で4000以上の拡張が登録されています。

Google Mail Checker - Google Chrome 拡張機能ギャラリー
高機能版はGoogle Mail Checker Plus - Google Chrome 拡張機能ギャラリー(最近使い始めましたが便利です)

Hatena Bookmark GoogleChrome extension - Google Chrome 拡張機能ギャラリー(はてな公式のChrome拡張、こちらも便利です)

Chrome拡張でできること(API)

APIの詳細は公式ドキュメントとその非公式日本語訳(@nao58)へ

APIはまだまだ少ないが、バックグラウンド処理、クロスドメイン通信、データの永続化をベースに、可能性は無限

Chrome5では履歴を扱うAPIが追加される(chrome.history)

実験段階のAPI(experimental.* APIs)もあります

Chrome拡張のセキュリティ

拡張コンテキスト、コンテントコンテキスト、ページコンテキストの3つのコンテキストが存在し、それぞれは完全に分かれているので、お互いが干渉してしまうことはない。さらに、拡張同士も独立したコンテキストで実行される。

拡張コンテキストはタブ操作やクロスドメイン通信などの特権を実行でき、コンテントコンテキストと通信したり、スクリプトを実行したりといったことができます。

コンテントコンテキスト(Content Scripts)は特権を持っていませんが、読み込んだページのDOMを操作することができ、拡張コンテキストと相互に通信できます。

ページコンテキストは通常のウェブページで実行されるコンテキストで、コンテントコンテキストとはDOM経由でしかやり取りできませんし、拡張コンテキストとは完全に分断されています

「悪意のあるページで拡張の特権を利用されてしまう」といったことが起こりにくい仕様になっているが、開発者から見ると面倒に感じる部分も…

拡張同士の関係

拡張同士はお互いに独立しており、特にBackground Pageのプロセスは完全に分かれている

拡張同士で連携するには、chrome.extension.sendRequestなどのAPIを使用する必要がある

拡張はそれぞれIDを持っており、拡張機能のページでデベロッパー モードにすると確認できる。また、公式ギャラリーのURLにもIDがそのまま使われている。

このIDはドメインに相当するもので、CookieやlocalStorageなどはこのIDに関連付けて保存される。また、拡張コンテキスト上でlocation.hostをみるとやはりIDが使われている。

なお、拡張のスキームはchrome-extension://である。IDと組み合わせて、例えば chrome-extension://dnlfpnhinnjdgmjfpccajboogcjocdla/images/favicon32.png がフルパスとなる。

通常のウェブページと同様で、ドメインが違えばクロスドメインの制約を受けるので、拡張間でのXMLHttpRequestなどはできない。

manifest.json

{
   
"name": "simple note",
   
"description":"簡易メモ帳です",
   
"browser_action": {
     
"default_icon": "pad19.png",
     
"default_title": "simple note",
     
"popup": "popup.html"
   
},
   
"icons": {
     
"128": "pad128.png",
     
"48": "pad48.png"
   
},
   
"permissions": ["tabs" ,"http://*/", "https://*/"],
   
"version": "0.0.1"
}

拡張を定義するjsonファイル。名前、バージョンのほか、アイコンや拡張の持つ権限、ContentScriptsを実行するURLの定義など。

manifest.jsonで宣言していない機能は使用できない。(URLのほか、tabs/bookmarksに、Chrome5からはnotifications/historyとexperimentalを指定できます)

セキュリティを高めつつ、機械的にその拡張の権限を判断して、インストールするユーザーに警告を出すことができる。

Chrome拡張の作り方

拡張を作るにあたって必要なものは特にありません。あえて挙げるなら、アイコンは用意しておきましょう。

まず、manifest.jsonを用意します。

{
 
"name": "Hello",
 
"description": "Chrome拡張入門",
 
"version": "0.1"
}

このmanifest.jsonだけで拡張として読み込むことができます。もちろん、何の機能もありません。

{
 
"name": "Hello World",
 
"description": "Chrome拡張入門",
 
"version": "0.1",
 
"browser_action": {
   
"default_icon": "icon.png",
   
"popup": "popup.html"
 
},
 
"icons": {
   
"48": "icon.png"
 
}
}

browser_actionとiconsを追加しました。popupには以下のhtmlを用意しました。

<!doctype html>
<html>
<style>
*{
  margin
: 0px;
  padding
: 0px;
}
body
> h1{
  width
:300px;
  text
-align:center;
  background
: -webkit-gradient(
    linear
, left top, left bottom, from(#06c), to(#39f)
 
);
  border
-radius:4px;
  margin
:0px;
  padding
:1em;
  color
:white;
  text
-shadow: 3px 3px 3px black;
  line
-height:1.4;
}
</style>
<h1>Chrome extensions</h1>
<script>
document
.querySelector('h1').onclick=function(){
 
this.innerText = 'Chrome拡張入門';
}
</script>
</html>

パッケージ化

chrome://extensions/ で「拡張機能のパッケージ化」からパッケージを作成できます。

Constellation's crxmake at master - GitHubでCUI環境でもパッケージングができます。

出来上がったcrxファイルをChromeにドロップすると、インストールダイアログが現れて、拡張としてインストールできます。インストールした拡張は(Windowsの場合)以下のパスに保存されています。

//XP
"C:\Documents and Settings\[USERNAME]\Local Settings\Application Data\Google\Chrome\User Data\Default\Extensions"
//7
"C:\Users\[USERNAME]\AppData\Local\Google\Chrome\User Data\Default\Extensions"

インストールした拡張はIDが開発時と変わってしまいます。その代わりにインストール後のmanifest.jsonには"key"というフィールドが追加されています。このkeyがあるとパッケージ化されていない拡張を読み込んだ際もパッケージ化した拡張のIDと同じものが使用できます。

なお、.crxファイルはzip形式なので、解凍することができます。

本格的な拡張の概要

では、少し本格的な拡張を紹介します。今回はChrome Stylistをサンプルとして使用します

manifest.json
background.html
スタイルの定義を変数として保持しておき、URLをContent Scriptから受け取ったらそのURLにマッチするスタイルを返す
スタイルのインストール処理も行う
options_page.html
インストール済みスタイルの管理画面
popup.html
現在表示しているページでスタイルを適用しつつ保存もできるインターフェース
stylist.js
ContentScriptsとして実行されるJSファイル。表示されたURLをBackgroundに送り、取得したスタイルを適用させる
アイコン

以上のファイルを1つのフォルダに置き、拡張機能ページで「デベロッパーモード」選択し、パッケージ化されてない拡張の読み込みを行います

拡張のデバッグ

Web Inspectorを使用する(参考:続・先取り! Google Chrome Extensions:第6回 Firebug要らずなChromeのWeb Inspector|gihyo.jp … 技術評論社)

Chrome拡張で使えるHTML5

ChromeのHTML5対応:関連API

canvas
対応済み
video, audio
対応済み(対応フォーマットは前述の通り)
Web Workers
対応済み
Web Storage
Chrome4ではlocalStorageのみ対応、Chrome5でsessionStorageも対応予定
コミュニケーションAPI
対応済み(ただし、Chrome4ではテキストのみの送受信)
Web Sockets
対応済み(ただし、WokerからのSocketsはChrome5で対応予定)
HTML Ruby
対応済み
Web Fonts
対応済み
Web SQL Database
対応済み(残念ながら標準化はストップしてしまいましたが…)
Desktop notifications
Chrome5で正式対応予定
HTML Forms
一部のみ対応、Chrome5ではバリデーションなどを追加、UIはChrome6以降
Application Cache
Chrome5で対応予定
Geolocation API
Chrome5で対応
Drag & drop
一部実装されているが、Chrome5で完全に対応する予定
File API
Chrome5で対応予定
Indexed Database API
Chrome6で対応予定、2010/3/11に動作したとの第一報あり

最新の情報は、Web Platform Status (The Chromium Projects)にまとまっています

ChromeのHTML5対応:HTMLパーサー

<p>第1パラグラフ
<section>セクション</section>
<p>第2パラグラフ

わざとらしい例ですが、パーサーがsectionに対応しているか否かで、下記のように解釈が変わります。

ChromeFirefox
section要素未対応
Chrome4

Firefox3.6
section要素対応
Chrome5

Firefox3.6(html5.enable)

Chrome拡張からHTML5へ

元々、Chrome拡張のAPIの仕様だったDesktop Notificationsが、2010年1月にW3C Editor's Draftとして(Web Notifications)公開されました。

このように、Chrome拡張は各種APIがHTML5をベースとしており、同時に、Chrome拡張からHTML5にフィードバックする、という相互作用の関係があります

HTML5を使いたい!という方は、是非Chrome拡張を!!

Appendix

Chrome Extensionsの参考URL

この資料についてのお話

この資料自体がHTML5のサンプルとなるよう作ってあります。

HTML5 Validator
Validator.nu (X)HTML5 Validator
(X)HTML5 validation results for http://ss-o.net/chrome/extension/introduction.html
HTML5 Outliner
HTML 5 Outliner
Outline
Outlineと目次
HTML5 のセクションアウトラインを生成してみよう! - IT戦記のOutliner.jsを使用して、右上の目次を自動生成しています。

Creative Commons License
This work is in the Public Domain.

設定 閉じる


10% 500%