Visit Mozilla.org

Offline resources in Firefox

出典: MDC

この記事は Firefox 3 の新機能について述べています


Firefox 3 では、HTML 5 で定義されている、Web アプリケーションのリソースをオフラインにキャッシュする機構の大半が実装されています。これは、Web アプリケーションによって提供されるリソース定義ファイル (マニフェスト) から取得された、「アプリケーションキャッシュ」と呼ばれるリソース群を使って実現されます。

目次

[編集] アプリケーションキャッシュ

註: Firefox は今のところ、アプリケーションキャッシュにおけるバージョン管理をサポートしていません。

複数の Web アプリケーションがリソースを共有できるため (そして同じマニフェスト URI も共有できるため)、各 Web アプリケーションはそれぞれ固有のキャッシュを管理します。しかし、アプリケーションキャッシュは、それらが共有しているマニフェスト URI をもとにグループ化され、共通の「更新状況」が与えられます。更新状況は以下のいずれかになります。

idle
アプリケーションキャッシュは、更新をダウンロードするプロセスの途中ではありません。
checking
キャッシュは、その内容が最新かどうか、リソースマニフェストを参照して確認を行っています。
downloading
キャッシュは、変更されたリソースマニフェストにもとづいて、新しい内容に更新されている途中です。

Firefox 3 における注記

現時点では、リソースエントリーのみがサポートされています。Firefox ではまだ、便宜的キャッシュや代替エントリーはサポートされていません。ただし、将来的な互換性のため、いずれにしても必要な場合はオンラインホワイトリストを提供することを推奨します。


[編集] リソース

キャッシュには常に、URI によって特定されるリソースが、少なくともひとつは含まれます。リソースは以下のいずれかのカテゴリに属します。

黙示的エントリー
これらは、次の理由により、キャッシュに追加されたリソースです。ユーザによって訪問される最上位のブラウジングコンテキストには、そのリソースが manifest 属性を使ってキャッシュに含まれていることを示すドキュメントが含まれるためです。
マニフェスト
これはリソースマニフェストそのものです。黙示的エントリーの html 要素の manifest 属性で指定された URI から読み込まれます。マニフェストは、アプリケーションキャッシュの更新プロセスの中でダウンロードされ、処理されます。黙示的エントリーは、マニフェストと同じスキーマ、ホスト、ポートで提供される必要があります。
明示的エントリー
これらは、キャッシュのマニフェストに記載されたリソースです。
代替エントリー
これらは、代替 (フォールバック) エントリーとしてキャッシュのマニフェストに記載されたリソースです。Firefox ではまだサポートされていません。
便宜的にキャッシュされるエントリー
これらは、取得時にその URI が便宜的キャッシュの名前空間に一致し、その結果アプリケーションキャッシュに自動的にキャッシュされたリソースです。Firefox ではまだサポートされていません。
動的エントリー
これらは、add() メソッドを使って動的に追加されたリソースです。

[編集] オンラインホワイトリスト

オンラインホワイトリストには、Web アプリケーションがオフラインキャッシュではなくサーバから直接取得する必要のある、ゼロまたはそれ以上のリソースの URI が含まれます。これは、認められたリソースのみにアクセスを制限するもので、ブラウザのセキュリティモデルが、ユーザを潜在的なセキュリティ問題から守ることを可能にします。

註: オンラインホワイトリストは Firefox 3 では使われていません。ただし、Firefox の将来のバージョンや、他のブラウザで実装されるオフラインリソースサポートとの互換性を保証するため、いずれにしても必要な場合は提供すべきです。

[編集] キャッシュマニフェスト

キャッシュマニフェストファイルは text/cache-manifest という MIME タイプで提供される必要があります。この MIME タイプを使って提供されるすべてのリソースは、ここで定義されている、アプリケーションキャッシュマニフェストのための構文に従う必要があります。キャッシュマニフェストは UTF-8 形式のテキストファイルで、任意で BOM 文字を含むこともできます。改行文字は、ラインフィード (U+000A)、キャリッジリターン (U+000D)、あるいはその両方で表すことができます。

キャッシュマニフェストの 1 行目は、ゼロあるいはそれ以上のスペースまたはタブ文字に続けて「CACHE MANIFEST」という文字列で構成される必要があります。2 つの単語の間にはひとつのスペース (U+0020) が含まれます。1 行目に書かれたそれ以外の文字列は無視されます。

キャッシュマニフェストのリマインダーは、ゼロあるいはそれ以上の、以下の行によって構成されます。

空白行
ゼロあるいはそれ以上のスペースまたはタブ文字から成る空白行を用いることができます。
コメント
コメントは、ひとつの「#」文字に続くゼロあるいはそれ以上のスペースまたはタブ文字と、それに続くゼロあるいはそれ以上のコメント文字列によって構成されます。コメントは単独の行のみで用いることができ、他の行に付加することはできません。
セクションヘッダ
セクションヘッダは、キャッシュマニフェストのどのセクションが操作されるかを示すものです。3 種類のセクションヘッダを用いることができます。
セクションヘッダ 説明
CACHE: 明示的セクションに切り替えます。これは既定のセクションです。
FALLBACK: 代替セクションに切り替えます。
註: 代替セクションは、Firefox ではまだサポートされておらず、無視されます。
NETWORK: オンラインホワイトリストセクションに切り替えます。
註: オンラインホワイトリストセクションは、Firefox ではまだサポートされておらず、無視されます。ただし、適切なオンラインホワイトリストを提供することを強く推奨します。
セクションヘッダ行には空白を含めることも可能ですが、セクション名には必ずコロンを含める必要があります。
各セクションのデータ
データ行の形式はセクションとごとに異なります。明示的セクションでは、各行は、キャッシュのリソースを参照した正しい URI または IRI を含む必要があります。各行の URI または IRI の前後には空白を含めることも可能です。

キャッシュマニフェストは、それぞれのセクションを任意で行き来することができます (つまり、各セクションヘッダを複数回用いることができます)。また、セクションを空白にしておくことも許容されています。

註: 相対 URI は、マニフェストを参照するドキュメントの URI ではなく、キャッシュマニフェストの URI からの相対となります。

[編集] キャッシュマニフェストの例

これは、架空の Web サイト foo.com におけるシンプルなキャッシュマニフェストです。

CACHE MANIFEST
# v1
# これはコメントです。
http://www.foo.com/index.html
http://www.foo.com/header.png
http://www.foo.com/blah/blah

この例では、セクションヘッダがありません。つまり、すべてのデータ行が明示的セクションとして解釈されます。

「v1」というコメントは、もっともな理由があって書かれています。キャッシュはマニフェストが変更された時だけ更新されるため、リソースを変更した場合は (例えば、header.png を新しい画像に差し替えた場合)、ブラウザにキャッシュの更新が必要なことを知らせるには、マニフェストファイルに変更を加える必要があります。マニフェストに何らかの変更を加えることでキャッシュを最新の状態にできますが、バージョン番号は変更を加える部分として適しているというわけです。

所定の Web サイトでオフラインアプリケーションキャッシュを使うよう Firefox に知らせるには、次のように、サイトの html 要素に manifest 属性を追加する必要があります。

<html manifest="http://www.foo.com/cache-manifest">
  ...
</html>

[編集] 更新プロセス

  1. Firefox は、manifest 属性を含むドキュメントを訪れると、window.applicationCache オブジェクトに対して checking イベントを送ります。そして、適切な HTTP キャッシュ規則に従いマニフェストファイルを取得します。その時点でキャッシュされているマニフェストのコピーが最新であった場合、applicationCachenoupdate イベントが送られ、更新プロセスは完了します。
  2. マニフェストファイルが、前回の更新チェック以降、変更されていなかった場合もまた、applicationCachenoupdate イベントが送られ、更新プロセスは完了します。繰り返しになりますが、リソースを変更した際はマニフェストファイルにも変更を加える必要があるのはこのためです。そうすることで Firefox はリソースを再度キャッシュする必要があると判断します。
  3. マニフェストファイルが変更されていた場合は、マニフェストに書かれたすべてのファイルと、applicationCache.add() を呼び出すことでキャッシュに追加されたファイルが、適切な HTTP キャッシュ規則に従い一時キャッシュに取得されます。各ファイルがキャッシュに取得されるたびに、applicationCache オブジェクトに progress イベントが送られます。エラーが発生した場合は、error イベントが送られ、更新は中止されます。
  4. すべてのファイルの取得に成功すると、それらは実際のオフラインキャッシュへ一度に移動され、applicationCache オブジェクトに cached イベントが送られます。

[編集] Firefox で未実装の機能

Firefox 3 の機能フリーズ日が近づく中、HTML 5 仕様書の草案はまだ流動的であることから、オフラインキャッシュ機能の一部はまだ実装されていません。

  1. WHATWG の仕様書草案では、ブラウザがオンラインの場合でも、利用可能な場合は、すべてのリクエストをオフラインキャッシュに対して行うよう指示されています。Firefox は今のところ、オフラインの場合のみオフラインキャッシュにアクセスします。このため、オンラインホワイトリストはまだサポートされていません。
  2. Firefox は今のところ、各 Web アプリケーションのキャッシュを個別に管理していません。アプリケーションは、リソースのバージョン不一致について心配がない限り、異なるマニフェスト間でリソースを共有することは避けるべきです。しかし、アプリケーションは一般的に、アプリケーションごとに各リソースのコピーを管理すべきです。
  3. Firefox はまだ、便宜的キャッシュや代替エントリーをサポートしていません。

[編集] 参考資料