
* 仕様書

[REFS[
- [22] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-06-10 18:36:00 +09:00]]) <https://html.spec.whatwg.org/#link-type-prerender>
- [26] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-prerender>
- [41] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-fetching-the-resource-hint-link>
- [48] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-load-and-error-events>
- [50] [CITE@en[Resource Hints]] ([TIME[2016-05-21 01:13:13 +09:00]]) <https://w3c.github.io/resource-hints/#h-security-and-privacy>
- [16] [CITE@en[Page Visibility (Second Edition)]] ([TIME[2015-11-13 18:23:52 +09:00]] 版) <https://w3c.github.io/page-visibility/#idl-def-.prerender>
- [5] [CITE@en[Page Visibility]] ([TIME[2013-05-20 14:28:58 +09:00]] 版) <https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#pv-prerender>
- [18] [CITE@en[Page Visibility (Second Edition)]] ([TIME[2015-11-13 18:23:52 +09:00]] 版) <https://w3c.github.io/page-visibility/#h-visibilitystate-attribute>
]REFS]

* リンク型 [CODE(HTML)@en[prerender]]

[25] [[リンク型]] [DFN[[CODE(HTML)@en[prerender]]]] は、
指定された[[資源]]が次の [[navigate]] で必要となるかもしれず、
予め [[fetch]] およびその先の処理 ([[部分資源]]の [[fetch]]
や[[レンダリング]]の一部の実施) が有用と思われる
(する[SHOULD[べき]] [SRC[>>26]]) ことを示します [SRC[>>22]]。

[23] [[リンク型]] [CODE(HTML)@en[prerender]] は、 [CODE(HTMLe)@en[link]]
[[要素]]で指定でき、[[外部資源リンク]]を作成します [SRC[>>22]]。

[42] [CODE(HTTP)@en[Link:]] [[ヘッダー]]でも指定できます [SRC[>>41]]。

[24] この[[リンク型]]は [[body-ok]] です [SRC[>>22]]。つまりこの[[リンク型]]の
[CODE(HTMLe)@en[link]] [[要素]]は、 [CODE(HTMLe)@en[head]] [[要素]]内のみならず、
[CODE(HTMLe)@en[body]] [[要素]]内でも使えます。

[53] [[著者]]は、 [CODE(HTML)@en[prerender]] [CODE(HTMLe)@en[link]] [[要素]]よりも前に関係する
[[CSP]] [CODE(HTMLe)@en[meta]] [[要素]]を置く[SHOULD[べきです]] [SRC[>>50]]。

[54] [[著者]]は、 [CODE(HTML)@en[prerender]] [CODE(HTTP)@en[Link:]] [[ヘッダー]]を使うなら関係する
[[CSP]] [[ヘッダー]]も含める[SHOULD[べきです]] [SRC[>>50]]。

;; [55] >>53、>>54 に違反すると、処理順序の規定により、
[[CSP]] の制限が適用されないことになります。

[36] この[[リンク型]]は次に [[navigate]] されるであろう [[HTML]]
を指定するのに有用です。それ以外の時は、 [CODE[prefetch]] が適切です。 [SRC[>>26]]

* [CODE(DOMa)@en[visibilityState]] 属性の値 [CODE(DOM)@en[prerender]] (DOM)

[6] [CODE(DOMi)@en[[[Document]]]] [[オブジェクト]]の [CODE(DOMa)@en[[[visibilityState]]]]
[[属性]]は、[[最上位閲覧文脈]]に含まれている [CODE(DOMi)@en[[[Document]]]] が画面外で読み込まれていて表示されていない時は、
[DFN[[CODE(DOM)@en[[[prerender]]]]]] を返して[['''構いません''']]。 [SRC[>>5]]

;; [7] ただし [CODE(DOM)@en[[[prerender]]]] という値には対応しなくても構わない [SRC[>>5]] とされています。

;; [8] [CODE(JS)@en[[[document.hidden]]]] は[[偽]]になります。

[35] [CODE[prerender]] による[[事前レンダリング]]の場合、
[CODE[visibilityState]] を [CODE[prerender]] としなければ[MUST[なりません]] [SRC[>>26]]。

[17] [[文書]]の[F[[[可視性状態]]]]の値[DFN[[RUBYB[事前レンダリング]@en[prerender]]]]は、
[[文書]]が[[事前レンダリング]]のため読み込まれ、まだ可視状態になっていないことを表します
[SRC[>>16]]。

[19] [[文書]]は、[[事前レンダリング]]された時、[F[[[可視性状態]]]]が[[事前レンダリング]]に設定されます
[SRC[>>18]]。一旦[[可視]]状態に遷移すると、再び[[事前レンダリング]]に戻ることはありません。

;; [CODE[[[visibilitychange]]]] も参照。

* 処理

[46] [[fetch]] は、[[obtain the resource]] によります [SRC[>>41]]。

[49] [[混合内容]]に関して [[optionally blockable]] です [SRC[>>50]]。

[51] [[CSP]] や [[Referrer Policy]] が適用されます [SRC[>>50]]。

[52] 適用するかどうか、[[利用者]]が設定できるようにすることができます [SRC[>>50]]。

[44] 現在の [[navigate]] の処理の干渉する[SHOULD[べきではありません]]。
それを防ぐため [[fetch]] を遅延させて構いません [SRC[>>41]]。

[27] [[利用者エージェント]]の判断により、
[CODE(HTML)@en[prerender]] で指定された [[HTML]] の[[応答]]について、
その [[fetch]] その他の[[部分資源]]も含めて次のように[[前処理]]して構いません [SRC[>>26]]。

[FIG(list)[
- [28] 事前レンダリング中の内容に対して、少な目に [[CPU]]、[[GPU]]、[[メモリー]]の[[資源]]を割り当てる。
- [29] [[HTML]] が可視状態になるまで[[要求]]の一部を遅延させる。
([[媒体]]、[[プラグイン]]など。)
- [30] 利用できる[[資源]]が限られる時は[[事前レンダリング]]しない。
- [31] 資源消費が激しいときは[[事前レンダリング]]を取りやめる。
([[CPU]] や[[メモリー]]の利用量が多い、データアクセスが高価など)
- [32] [[fetch]] の内容の種別や特性に応じて[[事前レンダリング]]を取りやめる。
-- [33] [[冪等]]でない挙動を示す - 共有[[局所ストレージ]]への書き込み、
[CODE[GET]]・[CODE[HEAD]]・[CODE[OPTION]] 以外の [[XHR]] など。
-- [34] [[利用者]]の入力を求める挙動を示す - [[確認ダイアログ]]、
[[認証ダイアログ]]、[[alert]] その他。
- [37] その他[[利用者エージェント]]依存の実装戦略に依る。
]FIG]

[38] [[事前レンダリング]]の動作の詳細は不明です。元の[[閲覧文脈]]に属するものとみなされると思われます。
[[スクリプト]]も動作するようです。各種処理が正常に動作するためには[[活性文書]]は[[事前レンダリング]]される[[文書]]である必要がありそうですが、
現在表示中の[[文書]]のみが当該[[閲覧文脈]]の[[活性文書]]のはずですから、
特別な扱いがなされていると思われます。

[39] [[事前レンダリング]]が本[[レンダリング]]に移行する処理の詳細も不明です。
少なくても [[now visible algorithm]] により[F[可視性状態]]が変更されると思われます。

[69] [CODE[webNavigation]] [[API]] の [CODE[onTabReplaced]] は、
[[事前レンダリング]]への [[navigate]] が発生した時に現在時刻と共に実行されます。

[40] [[事前レンダリング]]が[[入れ子閲覧文脈]]の本[[レンダリング]]に利用されるのかは不明です。

[43] [[利用者エージェント]]は、その判断により、[[投機的fetch]]を取り消しできます
[SRC[>>41]]。

[45] [[利用者エージェント]]は、次の [[navigate]] があっても[[投機的fetch]]を継続する[SHOULD[べきです]] [SRC[>>41]]。

[47] [[obtain the resource]] により [CODE(DOM)@en[load]]/[CODE(DOM)@en[error]]
[[イベント]]が[[発火]]されることになっています。しかし[[投機的fetch]]
の実行のタイミングは実装依存ですし、完全には処理されないかもしれません。
従ってできるだけ適切に[[発火]]する[SHOULD[べき]]ですが、
[[発火]]しなくても構いませんし、完全に処理せずとも[[発火]]することも認められています [SRC[>>48]]。

* 歴史

[60] [CITE[Instant Support - The Chromium Projects]]
( ([TIME[2016-06-18 00:23:35 +09:00]]))
<https://www.chromium.org/developers/design-documents/instant/instant-support>

[61] [CITE@en[Official Google Blog: Knocking down barriers to knowledge]]
( ([TIME[2016-06-18 01:07:55 +09:00]]))
<https://googleblog.blogspot.jp/2011/06/knocking-down-barriers-to-knowledge.html>

[62] [CITE@en[Google Chrome Blog: Instant Pages on Google Chrome]]
( ([TIME[2016-06-17 16:56:29 +09:00]]))
<https://chrome.googleblog.com/2011/08/instant-pages-on-google-chrome.html>

[63] [CITE@en[Google Chrome Blog: Faster than fast]]
( ([TIME[2016-06-17 16:56:29 +09:00]]))
<https://chrome.googleblog.com/2011/06/faster-than-fast.html>

[64] [CITE@ja[Google InstantがChrome(dev/canary)のアドレスバーで利用可能に! | ライフハッカー[日本版]]]
( ([TIME[2016-06-18 01:21:54 +09:00]]))
<http://www.lifehacker.jp/2010/10/101004googleinstantincanary.html>

[65] [CITE@en[Issue 509313 - chromium - chrome.embeddedSearch.newTabPage.navigateContentWindow is too powerful - Monorail]]
( ([TIME[2016-06-18 01:25:34 +09:00]]))
<https://bugs.chromium.org/p/chromium/issues/detail?id=509313>

[66] [CITE@en[CVE - CVE-2016-1625]]
( ([TIME[2016-06-18 01:25:58 +09:00]]))
<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-1625>

[FIG(quote)[
[FIGCAPTION[
[67] [CITE[chrome.webNavigation - Google Chrome]]
( ([TIME[2016-06-18 01:26:46 +09:00]]))
<https://developer.chrome.com/extensions/webNavigation>
]FIGCAPTION]

> If a navigation was triggered via Chrome Instant or Instant Pages, a completely loaded page is swapped into the current tab. In that case, an onTabReplaced event is fired.

]FIG]

[REFS[
-[1] [CITE@en[Web Developer's Guide to Prerendering in Chrome - Google Chrome — Google Developers]]
( ([TIME[2012-03-31 07:53:52 +09:00]] 版))
<https://developers.google.com/chrome/whitepapers/prerender>
-[2] [CITE[''''''[''''''whatwg'''''']'''''' Prerendering and APIs]]
( ([TIME[2012-04-10 21:01:06 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-April/035394.html>
-[3] [CITE[''''''[''''''whatwg'''''']'''''' Proposal: Link prerender events]]
( ([TIME[2012-11-08 01:11:26 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-November/037833.html>
-[4] [CITE[''''''[''''''whatwg'''''']'''''' Prerendering and APIs]]
( ([TIME[2012-04-10 21:00:55 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-March/035065.html>
]REFS]

[9] [CITE@en[Web Developer's Guide to Prerendering in Chrome - Google Chrome — Google Developers]]
( ([TIME[2012-03-30 22:53:52 +09:00]] 版))
<https://developers.google.com/chrome/whitepapers/prerender?hl=ja>

[10] [CITE@en[Resource Hints]]
( ([TIME[2014-08-05 22:14:16 +09:00]] 版))
<https://igrigorik.github.io/resource-hints/#prerender>

[11] [CITE@en[Add preload/prerender. Still need CSP alignment. See #36 · whatwg/fetch@26e5cca]]
([TIME[2015-04-05 18:50:23 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/26e5cca8ab5bb4b68a8f238f41dd7364d8c276b3>

[12] [CITE@en[Add "prerender" as navigation request context per https://github.com/w3c... · whatwg/fetch@04f7c75]]
([TIME[2015-05-05 11:35:34 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/04f7c7560fdd1d7f09cd1aa62b94794e1cd094a8>

[13] [CITE@ja[プリレンダリングとプリフェッチのサポート (Windows)]]
([TIME[2015-05-07 17:14:06 +09:00]] 版)
<https://msdn.microsoft.com/library/dn265039(v=vs.85).aspx>

[14] [CITE@en[22676 – APIs for page prerendering]]
([TIME[2015-09-17 14:47:09 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=22676>

[15] [CITE@en[cleanup visibilityState conditions · w3c/page-visibility@cd72018]] ([TIME[2015-11-13 23:46:11 +09:00]] 版) <https://github.com/w3c/page-visibility/commit/cd7201817c3f2115e7a4ef8e05fbca01e5e91103>

[20] [CITE@en[Link relations: add dns-prefetch/preconnect/prerender; update prefetch]]
( ([[domenic]]著, [TIME[2016-04-28 07:26:36 +09:00]]))
<https://github.com/whatwg/html/commit/0f54b54307647ca15ace16ef03c570db1b918193>

[21] [CITE@en[Treat <link rel="next"> as a general resource hint]]
( ([[domenic]]著, [TIME[2016-05-19 16:38:13 +09:00]]))
<https://github.com/whatwg/html/commit/7ff5b096d423bf5750463957aed69680368ed99e>

[56] [CITE[Prerender Test]]
( ([TIME[2016-06-18 01:30:36 +09:00]]))
<https://prerender-test.appspot.com/>

[57] [CITE[Prerender - Google グループ]]
( ([TIME[2016-06-18 01:30:50 +09:00]]))
<https://groups.google.com/a/chromium.org/forum/?csw=1#!forum/prerender>

[58] [CITE@en[Chromium Blog: Prerendering in Chrome]]
( ([TIME[2016-06-15 21:23:08 +09:00]]))
<http://blog.chromium.org/2011/06/prerendering-in-chrome.html>


[FIG(quote)[
[FIGCAPTION[
[59] [CITE@en[What Google Chrome Instant Is And Why It's Badass]]
( ([TIME[2016-06-18 01:15:39 +09:00]]))
<http://www.makeuseof.com/tag/google-chrome-instant-badass/>
]FIGCAPTION]

> Chrome Instant is a feature that was rolled into the latest stable version of Google’s Chrome browser. If you spend a lot of time surfing the web, it can save you some serious time while browsing different websites.
> Similar to instant search on Google.com, Chrome Instant loads websites for you as you’re typing in the URL. For example, let’s say you open up your browser and want to head to Facebook. As you start typing ‘www.fa’ your Facebook homepage loads up. If you were intending to go to, say, FailBlog.org instead, just keep typing and Chrome Instant will continue loading pages instantly for you.

]FIG]


[FIG(quote)[
[FIGCAPTION[
[68] [CITE@ja[プリレンダリングとプリフェッチのサポート (Windows)]]
( ([TIME[2016-06-18 01:34:03 +09:00]]))
<https://msdn.microsoft.com/library/dn265039(v=vs.85).aspx>
]FIGCAPTION]

> プリレンダリングでは次の条件が満たされている必要があります。
> ユーザーが従量制課金接続を使っている場合、Web ページをプリレンダリングできるかどうかは、ページの表示に使用しているデバイスのデータ使用プランによって決まります。
> ターゲット URL がファイル ダウンロードではない。
> ターゲット URL で "http://" プロトコルまたは "https://" プロトコルが使われている。
> ターゲット URL がトップ レベルのドキュメントである (iframe ドキュメントではない)。
> 一度にプリレンダリングできる Web ページは 1 つまでである。
> link 要素を含むドキュメントが表示される (ドキュメントがフォアグラウンド タブで読み込まれ、最小化されない)。
> 次の場合は、ページをバックグラウンドで完全にレンダリングすることはできません。
> ターゲット ページでユーザー インターフェイスの変更 (alert ボックス、window.open の呼び出し、セキュリティ通知など) がトリガーされる場合。
> ターゲット ページで video 要素または audio 要素を使ってメディア ファイルが自動的に再生される場合。
> ターゲット ページで travel log が変更される場合。
> F12 ツール ウィンドウが開いている場合。
> これらの場合、ターゲット ページがバックグラウンドで一時停止します。 ユーザーがターゲット ページを選ぶと、ターゲット ページが表示されて、一時停止した場所からレンダリングが再開されます。
> プリレンダリングされたページは、常にユーザーに表示されるとは限りません。 次の場合は、プリレンダリングされたページが表示されずにメモリから破棄されます。
> ユーザーがターゲット ページを 5 分以内に開かなかった場合。
> ユーザーが別のページを開いた場合。
> ユーザーが別のタブまたは別のブラウザー インスタンスに切り替えた場合。
> JavaScript プロセスによって、プリレンダリングされた別の Web ページを要求する新しい link 要素が追加された場合。
> ターゲット ページの読み込み中にエラーが発生した場合 (HTTP エラー コード 500 (サーバー エラー)、404 (リソースが見つかりません)、接続の問題などの関連エラーなど)。
> プリレンダリングされたページが破棄された後に要求された場合は、ホストするサーバーから直接読み込まれます。ページがブラウザー キャッシュにまだ残っている場合はすぐに読み込まれることもありますが、これが保証されるわけではありません。
> バックグラウンドでページを読み込むと、副次的な影響が発生することがあります。 具体的には、load イベントの間に実行される操作には次のような問題があります。
> Microsoft ActiveX コントロールは、ユーザーがページを表示するまで読み込まれません。 そのオブジェクトを JavaScript で使う前に、使用可能なことを readyState プロパティで確認してください。
> ページが表示されるときに、一部のアニメーションが表示されない場合があります。これは、ページがバックグラウンドで読み込まれている間にアニメーションが既に実行されたためと考えられます。
> タイマーで予期しない結果が返される場合があります。
> Cookie、キャッシュされたコンテンツ、非同期操作による変更 (IndexedDB、Web ストレージなど) は維持されます。

]FIG]

[70] [CITE@en[Mark prerender at risk]]
([[plehegar]]著, [TIME[2017-03-23 03:31:31 +09:00]])
<https://github.com/w3c/page-visibility/commit/088beae54455ae3f0114f79159de989ed1447a21>

[71] [CITE@en[Introduce 'prefetch-src'. (#283)]]
([[mikewest]]著, [TIME[2018-01-15 23:18:59 +09:00]])
<https://github.com/w3c/webappsec-csp/commit/91adc4ab7beb21bcc05e3ebeeb035d2745c7817d>

[72] [CITE@en[Introduce 'prefetch-src'. Closes w3c/webappsec-csp#107. by mikewest · Pull Request #283 · w3c/webappsec-csp]]
([TIME[2018-01-16 11:15:12 +09:00]])
<https://github.com/w3c/webappsec-csp/pull/283>

[73] [CITE@en[Add prefetch and prerender initiators]]
([[yoavweiss]]著, [TIME[2018-04-27 17:36:34 +09:00]])
<https://github.com/whatwg/fetch/commit/d5d084096392f2c47841308952a76751bafdd375>

[74] [CITE@en[Introduce 'prefetch-src'. Closes w3c/webappsec-csp#107. by mikewest · Pull Request #283 · w3c/webappsec-csp]]
([TIME[2018-05-02 13:06:25 +09:00]])
<https://github.com/w3c/webappsec-csp/pull/283>

[75] [CITE[Intent to Deprecate and Remove: Prerender - Google グループ]]
([TIME[2018-09-05 02:17:26 +09:00]])
<https://groups.google.com/a/chromium.org/forum/#!msg/blink-dev/0nSxuuv9bBw/EMfaclV-AwAJ>

[76] [CITE@en[Introducing NoState Prefetch  |  Web  |  Google Developers]]
([TIME[2018-08-03 01:49:07 +09:00]])
<https://developers.google.com/web/updates/2018/07/nostate-prefetch>

[77] [CITE@en[Temporal proposal · Issue #311 · w3ctag/design-reviews]]
([TIME[2018-11-01 18:40:01 +09:00]])
<https://github.com/w3ctag/design-reviews/issues/311>

[78] [CITE@en[tc39/proposal-temporal]]
([TIME[2018-11-01 18:43:28 +09:00]])
<https://github.com/tc39/proposal-temporal>