/
761.txt
1989 lines (1616 loc) · 118 KB
/
761.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[88] [DFN[[[navigate]]]] ([[名詞形]] [DFN[navigation]]) は、
[[資源]]へのアクセスを行い[[閲覧文脈]]の表示を切り替えたり、
[[ダウンロード]]その他の動作を発生させたりする操作です。[[ハイパーリンク]]の[[クリック]]やそれに相当する
[[JavaScript]] の操作などにより呼び出されます。
[[Webブラウザー]]を構成する最も基礎的で重要な
(しかし複雑で難解な) [[アルゴリズム]]の1つです。
* 仕様書
[REFS[
- [CITE[HTML Standard]]
-- [12] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#navigate>'''
--- [246] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#initialise-the-document-object>
-- [191] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#an-overridden-reload>
-- [210] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#dom-navigator-registercontenthandler>
-- [244] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#origin-2>
-- [258] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#the-sessionstorage-attribute>
-- [446] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#traverse-the-history>
- [266] [CITE@en[DOM Standard]] ([TIME[2015-07-16 14:57:57 +09:00]] 版) <https://dom.spec.whatwg.org/#document>
- [285] [CITE@en[Upgrade Insecure Requests]] ([TIME[2015-10-07 03:24:10 +09:00]] 版) <https://w3c.github.io/webappsec-upgrade-insecure-requests/#nesting>
- [416] [CITE@en[High Resolution Time Level 2]] ([TIME[2016-02-26 04:49:50 +09:00]]) <https://w3c.github.io/hr-time/#h-time-origin-1>
]REFS]
* 意味
[282] [[navigate]] は、[[閲覧文脈]]の[[履歴]]上に新しい[[エントリー][セッション履歴エントリー]]を作成し、
移動することを目的とした様々な一連の処理です。新しい[[エントリー][セッション履歴エントリー]]は新たにネットワークから取得
([[fetch]]) した[[資源]]かもしれませんし、現在[[閲覧文脈]]で表示中の[[文書]]の[[素片][素片識別子]]かもしれません。
[283] [[navigate]] の結果[[閲覧文脈]]の[[履歴]]上の移動が発生し表示が更新されるのが基本的な動作ですが、
[[navigate]] 先によっては[[ダウンロード]]などの処理が起動することがあります。
あるいは現在の[[閲覧文脈]]ではなく、新しい[[閲覧文脈]] (新しい[[窓]]や[[タブ]])
を開いて [[navigate]] することもあります。
* 文脈
[16] [[navigate]] は、[[仕様書]]で規定されている手順により ([[著者]]の指示により)
実行される場合もあれば、[[利用者エージェント]]依存の方法で ([[利用者]]の直接の指示により)
実行される場合もあります。
[EG[
[17] 前者の例として [CODE(JS)@en[[[location.href]]]] の設定が、
後者の例として[[アドレスバー]]からの [[URL]] の指定があります。
]EG]
[13] [[navigate]] を発生させる操作には、例えば次のものがあります。
[FIG(list middle)[
- [[利用者]]の指示
-- [[再読込]]操作
-- [[アドレスバー]]、[[メニュー]]、[[DnD]] 等[[利用者インターフェイス]]からの [[URL]] の指定
-- [[アドレスバー]]、[[メニュー]]、[[DnD]] 等[[利用者インターフェイス]]からの[[ファイル]]の指定
-- [[栞]]の選択
-- [[navigate]] によって生成された[[利用者]]に対する選択肢の実行
-- [[ソースの表示]]
-- [[入れ子閲覧文脈]]内の[[文書]]を新しい[[閲覧文脈]]で開く
-- [CODE(HTMLe)@en[[[blockquote]]]]/[CODE(HTMLe)@en[[[ins]]]]/[CODE(HTMLe)@en[[[del]]]] [CODE(HTMLa)@en[[[cite]]]]
をたどる[[利用者インターフェイス]]上の操作
- [[利用者]]または[[著者]]の指示
-- [[ハイパーリンクをたどる]]
-- [[フォーム提出]]
-- [178] [DFN[[RUBYB[エントリー更新]@en[entry update]]]] [SRC[>>446]] のための [[navigate]]:
[[bfcache]] が既に破棄されている場合 ([[履歴の探索]]や[[セッション履歴エントリー]]を参照。)
や、[[再読込]]が指示された場合。
- [[著者]]の指示
-- [[フレーム]]
-- [CODE(HTMLe)@en[[[object]]]] [[要素]]
-- [CODE(HTMLe)@en[[[embed]]]] [[要素]]
-- [CODE(JS)@en[[[window.open]]]]
-- [CODE(JS)@en[[[location.assign]]]]
-- [CODE(JS)@en[[[location.replace]]]]
-- [CODE(JS)@en[location.href]] および各[[URL分解属性]]
-- [CODE(JS)@en[[[location.reload]]]]
-- [CODE(JS)@en[navigator.plugins.refresh]]
-- [CODE(HTTP)@en[[[Refresh]]]]
-- [[プラグイン]]からの指示
-- [[change the encoding]]
- 他のアプリケーションからの指示
-- [[コマンドライン引数]]や[[プロセス間通信]]等の他の[[アプリケーション]]からの [[URL]] の指定
-- [[WebDriver]] の操作
-- [[ブラウザー拡張]]からの指示
-- [[開発者コンソール]]など[[ブラウザー]]内の外部機能からの指示
]FIG]
* 入力
[41] [[navigate]] には、次の入力 ([[引数]]) があります。最初の3つは必須です。
[FIG(list members)[
:[14] [VAR[[[navigate]] する[[閲覧文脈]]]]:[[navigate]] によって[VAR[新しい[[資源]]]]を表示するべき[[閲覧文脈]]です。
:[21] [VAR[新しい[[資源]]]]:[VAR[[[navigate]] する[[閲覧文脈]]]]に新たに表示するべき[[資源]]です。
ここで[[資源]]は次のものによって表されます。
[FIG(list members)[
: [F[要求]] : [[要求]]または [[null]]。
[FIG(list members)[
([[要求]]は[F[URL][要求URL]] ([[URL記録]]。必須。)、
[F[参照元]] ([CODE[client]] または [CODE[no-referrer]]。既定値は [CODE[client]]。)、
[F[参照元ポリシー]] ([[参照元ポリシー]]。既定値は[[空文字列]]。)、
[F[メソッド][要求メソッド]] ([CODE(HTTP)@en[GET]] または [CODE(HTTP)@en[POST]]。
既定値は [CODE(HTTP)[GET]]。)
を持ちます。)
: [VAR[[CODE[acceptSslCerts]]]] :
[[WebDriver]] の [CODE[acceptSslCerts]] か、それに相当する[[利用者インターフェイス]]上の操作を[[利用者]]が行ったかどうかを表すフラグです。
[[既定値]]は[[偽]]です。
]FIG]
: [F[応答]] : [[応答]]または [[null]]。
([CODE(HTMLe)@en[embed]]/[CODE(HTMLe)@en[object]] の [[fetch]] の結果、
[[ネットワークエラー]]など。)
- ([[リダイレクト]]前の) 最初の [[URL]]
- [[応答]]
- [[a known definite encoding]]
- [[AppCache]] から [[fetch]] したか否か
[EG[
[24] [CODE(HTMLe)@en[[[object]]]] [[要素]]や [CODE(HTMLe)@en[[[embed]]]] の処理では、
[[資源]]の [[fetch]] が開始されてから [[navigate]] が呼び出されることがあります。
]EG]
[EG[
[55] [[navigate]] の結果表示される [[navigate]] の選択肢を[[利用者]]が選んだ場合にも、
(再度 [[fetch]] するのは無駄なので) [[fetch]] 結果付きで [[navigate]] を呼び出すべきかもしれません。
]EG]
[EG[
[186] [[ハイパーリンクをたどる]]場合や [CODE(JS)@en[[[window.open]]]] や [[overridden reload]] では、
[[URL]] のかわりにソースやエラーページが指定された [[navigate]] が実行されることもあります。
]EG]
[EG[
[188] [[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]では [[URL]]
と共にソースが指定されます。
]EG]
[EG[
[189] [CODE(JS)@en[[[document.open]]]] で追加される[[セッション履歴エントリー]]の[[エントリー更新]]では指定されたソースが使われます。
]EG]
[EG[
[225] [[change the encoding]] は[[応答]]を指定して、または [[URL]] 等 [[fetch]]
条件を指定しての [[navigate]] を呼び出すことがあります。その際
[[a known definite encoding]] も指定されます。
]EG]
]FIG]
: [VAR[ナビゲーション型]] : [CODE[form-submission]] または [CODE[other]]。
[[既定値]]は [CODE[other]]。
:[15] [DFN[[VAR[[RUBYB[始点閲覧文脈]@en[source browsing context]]]]]]:
[[navigate]] の開始に責任を持つ[[閲覧文脈]]です [SRC[>>12]]。
[VAR[[[始点閲覧文脈]]]]は、 [VAR[[[navigate]] する[[閲覧文脈]]]]について
[[navigate]] を認められているか、いないかのいずれかです。
:[19] [DFN[[VAR[[RUBYB[例外有効]@en[exceptions enabled]]]]]] [SRC[>>12]]:
[[navigate]] できない時に[[例外]]を投げるかどうかのフラグです。
:[22] [DFN[[VAR[[[reload-triggered navigation]]]]]] [SRC[>>12]]:[[再読込]]操作かどうかのフラグです。
このフラグが設定されていれば、[[素片識別子]]を無視すると現在表示中の[[文書]]の
[[URL]] と等しい時でも、 [[navigate]] が行われます。
:[43] [DFN[[VAR[[RUBYB[上書きURL][override URL]]]]]] [SRC[>>12]]:[[文書の番地]]として使う [[URL]]
です。外部から設定されるのは [[override reload]] やそれに相当する[[履歴の探索]]の時だけですが、
[[navigate]] 中に [CODE(URI)@en[[[javascript:]]]] の処理で設定されることもあります。
:[65] [VAR[triggered by user activation]]:
[[allowed to navigate]] や[[外部アプリケーション]]を起動するべきかどうかに影響します。
[[navigate]] 呼び出し元の[[タスク]]によって決まります。
[[triggered by user activation]] や[[閲覧文脈の選択]]を参照。
:[238] [VAR[新しい[[最上位閲覧文脈]]]] :
[[閲覧文脈]]を使わなかった時に[[窓]]や[[タブ]]を閉じるべきかどうかに影響します。
[[閲覧文脈の選択]]を参照。
: [VAR[[[利用者]]が[[閲覧文脈]]を明示した]] :
[[allowed to navigate]] をバイパスするか否かに影響します。
:[98] [VAR[[[エントリー更新]]する[[エントリー]]]]:[[エントリー更新]]のための [[navigate]]
の場合には、その[[セッション履歴エントリー]]。
:[179] [VAR[キャッシュ上書き]] :
[[スーパーリロード]]による [[navigate]] 時に指定されます。
[[再読込]]参照。
:[190] [VAR[[[reload override flag]]]]:[CODE(JS)@en[[[document.open]]]] により破棄された[[文書]]を再表示するために使います。
:[195] [VAR[[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]:
[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]かどうかを表します。
:[245] [VAR[[[文書の起源]]]] [DEL[と[VAR[[[実効スクリプト起源]]]]]] :
[VAR[新しい[[資源]]]]の[F[URL]]の[F[scheme][URL scheme]]が
[CODE(URI)@en[data][data:]] や [CODE(URI)@en[javascript][javascript:]]
の場合に使われる可能性のある[[起源]][DEL[と[[実効スクリプト起源]]]]です。
[CODE(URI)@en[[[data:]]]] [[URL]] では、
[[スクリプト]]による呼び出しの場合は[[現職設定群オブジェクト]]の[F[起源][文書の起源]][DEL[と[F[実効スクリプト起源]]]]、
そうでない場合は[[要素]]の[F[節点文書]]の[F[起源][文書の起源]][DEL[と[F[実効スクリプト起源]]]]です [SRC[>>244]]。
[CODE(URI)@en[[[javascript:]]]] [[URL]] では、
[VAR[[[navigate]] する[[閲覧文脈]]]]の[F[活性文書]]の[F[起源][文書の起源]][DEL[と[F[実効スクリプト起源]]]]です [SRC[>>244]]。
(いずれにせよ、 [[navigate]] 呼び出し時点での値です。)
: [VAR[提案ファイル名]] :
[[navigate]] の結果[[ダウンロード]]となった時に使う[[ファイル名]]です。
[[リンク元]]の[[要素]]の [CODE(HTMLa)@en[download]] [[属性値]]が設定されます。
: [VAR[[[遷移型]]]] : ページ遷移を発生させた利用者等の操作の種類を表す値です。
: [VAR[[[遷移修飾子]]群]] : [[navigate]] の発生要因を表す値のリストです。
[HISTORY[
[310] 次のオプションは廃止されました:
:[20] [DFN[[VAR[[RUBYB[明示的自己ナビゲーション上書き]@en[explicit self-navigation override]]]]]] [SRC[>>12]]:
[VAR[[[navigate]] する[[閲覧文脈]]]]の選択方法についてのフラグです。
[CODE(DOMa)@en[[[seamless]]]] な [CODE(HTMLe)@en[[[iframe]]]] 内での[[リンク]]が外側の[[閲覧文脈]]の
[[navigate]] に読み替えられるべきかどうかの判断に影響します。 ([CODE(HTMLa)@en[[[target]]]]
による[[閲覧文脈]]の選択と [[navigate]] は別[[タスク]]で行われることがあるため、
その間に [CODE(HTMLa)@en[[[seamless]]]] かどうかは変化することがあり、
一般に [[navigate]] 呼び出し前に予めその判断を済ませておくことはできません。)
]HISTORY]
]FIG]
[116] [VAR[[[navigate]] する[[閲覧文脈]]]]や[VAR[新しい[[資源]]]]はアルゴリズム内で変更されることがあります。
[121] [[navigate]] は [[unload a document]] や [[prompt to unload a document]]
が実行中かどうかにより分岐することがあります。それらが同じ[[閲覧文脈]]の [[navigate]]
と[[並列]]に実行されることは無いので、事実上、それらの手続きの内側での呼び出しかどうかを調べるものです。
[120] [[navigate]] や [[traverse the history by a delta]] や
[CODE(JS)@en[[[window.stop]]]] は、
同じ[[閲覧文脈]]に関する他の [[navigate]] にアクセスすることがあります。
;; [167] [[navigate]] から呼び出した [[unload a document]] を実行中か調べることもあります。
[122] [[navigate]] は、取り消しされることがあります (>>123)。
[VAR[取り消し]]フラグは取り消されたかどうかを表します。
取り消された場合は理由が設定されます。
[108] 入力ではありませんが、アルゴリズム中で
[DFN[[VAR[[[mature]]]]]] フラグを使います。どちらも初期値は[[偽]]です。 [SRC[>>12]]
[VAR[時刻起源]]の初期値は[[未定義]]です。
;; [177] [[mature]] フラグは [[traverse the history by a delta]] からも参照されます。
[HISTORY[
[422] かつては [DFN[[VAR[gone async]]]] フラグがあり、
[[リダイレクト]]に関する複雑な処理が記述されていました。
2016年7月改訂でこれを使わない形に改められました。
]HISTORY]
[117] 入力ではありませんが、アルゴリズム内で[VAR[新しい[[文書]]]]が作成されることがあります。
[42] [VAR[始点文書]]は、[[navigate]] 開始時点の[VAR[始点閲覧文脈]]の[F[活性文書]]です。
[VAR[始点設定群オブジェクト]]は、 [[navigate]]
開始時点の[VAR[始点文書]]の[F[環境設定群オブジェクト]]です。
;; [330] [[HTML Standard]] は「[[navigate]] 開始時点」とは規定していませんが、
[[リダイレクト]]を含む場合、[VAR[始点閲覧文脈]]の他の [[navigate]]
によって[F[活性文書]]が変化する可能性がありそうで、
その場合でも元の[F[活性文書]]を使うのが適切そうです。
* 概略
[226] [[navigate]] は次のように複雑に動作します。
[FIG(flow)[
:start:開始 >>18
:->:terminate
:->:url
:terminate: 停止
:>>:5
:url:URL >>162
:->:fragment
:->:fetch
:->:nondoc
:->:outside
:fetch: Fetch >>145
:->:cleanup
:->:res
:res:[[応答]] >>26
:->:mime
:->:nondoc
:->:outside
:mime:MIME 型 >>44
:->:doc
:->:nondoc
:->:outside
:doc: 文書 >>30
:->:history
:nondoc:非文書 >>47
:>>:1
:->:history
:outside: 文脈外 >>48
:>>:2
:->:cleanup
:history: 履歴 >>95
:->:cleanup
:fragment: 素片 >>163
:>>:4
:->:cleanup
:cleanup: 停止 >>109
:v:
:>>:5
]FIG]
* navigate の開始
[18] [[利用者エージェント]]は、 [[navigate]] を次のように行わなければ[['''なりません''']]
[SRC[>>12]]。
[FIG(steps)[
= [293]
[VAR[[[利用者]]が[[閲覧文脈]]を明示した]]が[[偽]]の場合で [SRC[仕様書になし]]、
[VAR[triggered by user activation]] について
[VAR[[[始点閲覧文脈]]]]が [VAR[[[navigate]] する[[閲覧文脈]]]]を
[[navigate することを認められてい][allowed to navigate]]''ない''場合、
== [296] [VAR[例外有効]]なら、
=== [453] [CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を投げます。
== [237] そうでなければ、
=== [454] [[利用者エージェント]]は、[[利用者]]に次の選択肢を提示しても構いません。
(>>236 も参照)
[FIG(list)[
- [294] 新しい[[最上位閲覧文脈]]を開き、そちらをかわりに [[navigate]]
- [295] [VAR[[[始点閲覧文脈]]]]の[[最上位閲覧文脈]]をかわりに [[navigate]]
]FIG]
== [297] 停止します。
= [298]
[FIG(list)[
- [VAR[[[始点閲覧文脈]]]]と [VAR[[[navigate]] する[[閲覧文脈]]]]が同じで、
- [VAR[[[navigate]] する[[閲覧文脈]]]]が他の [[navigate]] を実行中で、
- その [[navigate]] が [[unload a document]] を実行中
]FIG]
... なら、
== [450] ここで停止します。
= [451] [[prompt to unload a document]] を実行中で、
それが [VAR[[[navigate]] する[[閲覧文脈]]]]の[[活性文書]]に関するものなら、ここで停止します。
= [452] [[URL]] に基づく処理 (>>162) に移ります。
]FIG]
;; [180] [VAR[新しい[[資源]]]]の [[URL]] が無い場合は[[上書きURL]]
を使うものと思われます。
[236] [[入れ子閲覧文脈]]で [[navigate]] するべきところ、かわりに
>>237 操作を[[利用者]]に選択させるのは、[[著者]]の[[砂箱化]]の要求を無視する場合もあり、
危険かもしれません [SRC[>>12]]。 [[Webブラウザー]]は、 [[popup sandboxing flag set]]
を活用するなど、安全性への配慮が必要かもしれません。
;; [[砂箱化]]や[[閲覧文脈の選択]]も参照。
[404] [CODE[webNavigation]] API の [CODE[onBeforeNavigate]] はこの付近のタイミングで現在時刻と共に呼び出されるものと思われますが、
明文規定は存在しないようです。
[458] [[ハイパーリンク]]を[[利用者]]が他の[[閲覧文脈]]に[[ドラッグ]]したことにより
[[navigate]] が開始された場合など、 [[navigate]] 開始の時点で[VAR[始点閲覧文脈]]が
(本来なら) 既に消滅している[[閲覧文脈]]であったり、
[[活性文書]]が別のものに変化していたりする可能性があります。
そうした場合でも元の[[閲覧文脈]]が始点であるものとして処理を続けるべきかもしれませんし、
始点がない新しい [[navigate]] として扱うべきかもしれません。
-*-*-
[491] [CITE[Web App Manifest]] は [[navigation scope]] と称して
[[Webアプリケーション]]の「内側」の範囲を規定することができ、
その外側への[[リンク]]を拒んだり、[[Webアプリケーション]]とは別の
[[Webブラウザー]]の[[窓]]の[[閲覧文脈]]を [[navigate]]
したりすることになっています。
この処理もこの段階で行う必要があります (が、現時点で [CITE[HTML Standard]]
の [[navigate]] の処理と統合されていません)。
;; [[navigation scope]] も参照。
[492] [[埋め込みブラウザー]]も、[[アプリケーション]]に対して [[navigate]]
可能な [[URL]] の範囲を限定する機能を提供している場合があり、
同様に検査が入ることがあります。
;; [[埋め込みブラウザー]]も参照。
[493] なお、これらの検査は、後述の通り [[HTTPリダイレクト]]後の [[URL]]
に対しても行う必要があります。
* URL に基づく処理
[162] [[利用者エージェント]]は次のようにしなければ[['''なりません''']] [SRC[>>12]]。
[FIG(steps)[
= [382]
[FIG(list)[
- [383] [VAR[[[reload-triggered navigation]]]] が[[偽]]
- [434] [VAR[新しい[[資源]]]]の[F[要求]]が [[null]] でない
- [384] [VAR[新しい[[資源]]]]の[F[要求]]の [F[URL][要求URL]] と
[VAR[[[navigate]] する[[閲覧文脈]]]]の[F[活性文書]]の[F[URL][文書の番地]]が
[VAR[[[URL除外フラグ]]]]付き[[URL等価]]
- [385] [VAR[新しい[[資源]]]]の[F[要求]]の [F[URL][要求URL]] の[F[素片][素片識別子]]が [[null]] でない
-
@@ [386] [DEL[[VAR[新しい[[資源]]]]の[F[メソッド][要求メソッド]]が [CODE(HTTP)@en[[[GET]]]]]]
]FIG]
... のすべてを満たすなら、
== [387] [[素片識別子]]に navigate (>>163) する処理に移り、こちらはここで終わります。
= [423] [VAR[[[navigate]] する[[閲覧文脈]]]]が同じ [[navigate]] のうち、 [VAR[[[mature]]]]
フラグが設定されていないものがあれば、当該 [[navigate]] の取り消し処理を実行します。
= [411] [[prompt to unload a document]] を実行します。
= [412] [VAR[取り消し]]フラグが設定されているか、 [[refused to allow the document to be unloaded]] なら、
== [413] 後片付け (>>109) に移り、こちらはここで終わります。
= [414] [VAR[[[navigate]] する[[閲覧文脈]]]]の[F[活性文書]]を[[abort][文書のabort]]します。
= [415] [VAR[時刻起源]]を、[[現在時刻]]に設定します。 [SRC[>>416]]
= [477] [VAR[[[navigate]] する[[閲覧文脈]]]]が[[入れ子閲覧文脈]]の場合、
== [478] [VAR[[[navigate]] する[[閲覧文脈]]]]の
[F[[[delaying [CODE(DOMe)@en[load]] events mode]]]] フラグを、
[[真]]に設定します。
= [155] [[並列に]]、[[fetch]] またはそれに相当するもの (>>145) を実行します。
]FIG]
;; [196] [[navigate]] の続きの処理は[[並列に]]実行され、 [[navigate]]
の呼び出し元はそちらの次の処理へと進みます。
;; [224] [[素片識別子]]が無い [[URL]] なら、[[文書の番地]]と同じ [[URL]]
であっても、[[素片識別子]]への [[navigate]] ではなく通常の [[navigate]]
になります。
[410] [VAR[新しい[[資源]]]]の [F[URL]] に [[userinfo]] が含まれる場合、
[[Chrome]] は無視する (認証に使わない) ようです。
[[Firefox]] は[[フィッシング]]の可能性を指摘する [[confirm]]
[[モーダルダイアログ]]を表示し、[[利用者]]が拒んだ場合は何もしないこととするようです。
[TIME[2016-06-19T15:55:48.300Z]]
[403] [[事前レンダリング]]が実装されていて本 [[navigate]] で利用できる場合には、
[[fetch]] のかわりに[[事前レンダリング]]への差し替えが行われるものと思われますが、
明文規定はありません。
;; [[事前レンダリング]]参照。
* fetch またはそれに相当するもの
[145] [[navigate]] は、 [[fetch]] やそれに相当する操作を次の通り行わなければ[['''なりません''']]。
[FIG(steps)[
= [146] [VAR[新しい[[資源]]]]の[F[応答]]が [[null]] でなければ、
== [201] [[navigate応答の処理]] (>>26) を実行します [SRC[>>12]]。
[FIG(list members)[
: [VAR[要求]] : [CODE[null]]
: [VAR[応答]] : [VAR[新しい[[資源]]]]の[F[応答]]
: [VAR[閲覧文脈]] : [VAR[[[navigate]]する[[閲覧文脈]]]]
: [VAR[始点閲覧文脈]] : [VAR[始点閲覧文脈]]
: [VAR[ナビゲーション型]] : [VAR[ナビゲーション型]]
]FIG]
= [147] それ以外で、 [VAR[新しい[[資源]]]]の [F[URL]] の [F[scheme][URL scheme]]
が [CODE(URI)@en[javascript][javascript:]] なら、
== [148] [[[CODE(URI)@en[javascript:]] URLへのnavigate]]を実行します [SRC[>>12]]。
[VAR[[[navigate]] する[[閲覧文脈]]]]、[VAR[新しい[[資源]]]]、
[VAR[[[始点閲覧文脈]]]]、[VAR[[[上書きURL]]]]を引き渡します。
= [149] それ以外で、
[FIG(list)[
- [VAR[新しい[[資源]]]]の[[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] で、
- [VAR[新しい[[資源]]]]の [[URL]] と[[同じ起源]]の [[URL]] を持つ [[relevant application cache]] があり、
- その [[AppCache]] [[エントリー]]のいずれかが[VAR[新しい[[資源]]]]の [[URL]] を持ち、
- ただしその[[エントリー]]は [[foreign]] ではなく、
- その [[mode]] が [[fast]] であり、
- [[利用者エージェント]]が[[AppCache]]を使わないモードでなければ、
]FIG]
... [[最適AppCache]]からの[VAR[新しい[[資源]]]]の [[fetch]] を呼び出します [SRC[>>12]]。
=- [150] この時、[VAR[ナビゲーション型]]が [CODE[form-submission]] なら、
[[fetch]] の呼び出し元の[[起源]]は[VAR[始点文書]]の[[起源]]に (あれば)
します [SRC[>>12]]。
==
@@
= [154] [VAR[新しい[[資源]]]]の[F[要求]]の[F[URL][要求URL]]の[F[scheme][URL scheme]]が
[[fetch scheme]] なら、
== [198] [[navigate fetchの処理]]を実行します。
[FIG(list members middle)[
: [VAR[要求]] : [VAR[新しい[[資源]]]]の[F[要求]]
: [VAR[閲覧文脈]] : [VAR[[[navigate]]する[[閲覧文脈]]]]
: [VAR[始点閲覧文脈]] : [VAR[始点閲覧文脈]]
: [VAR[ナビゲーション型]] : [VAR[ナビゲーション型]]
]FIG]
= [199] それ以外なら、
== [202] [VAR[新しい[[資源]]]]の[F[URL]]と[VAR[[[navigate]]する[[閲覧文脈]]]]について[[navigate URL schemeの処理]]を実行します。
]FIG]
[214] 以前は、 [[Webブラウザー]]依存の条件 (>>206) 次第で[[閲覧文脈]]外 (>>48) または[[非文書表示]]に移れることになっていました。
2016年7月の改訂で条件が明確化されたのですが、それによって、例えば
[CODE(URI)@en[about:blank]] 以外の [CODE(URI)@en[about:]] [[URL]]
の表示や、一部の [CODE(URI)@en[http:]] [[URL]] で[[アプリ]]が起動される機能が認められない形になってしまいました。
[153] [[Chrome]] など一部の [[Webブラウザー]]は、 [[Safe Browsing]]
により [[URL]] を検査し、危険と判断すれば[[ネットワークエラー]]の[[非文書表示]]に移ります。
-*-*-
[398] [VAR[要求]]、[VAR[閲覧文脈]]、[VAR[始点閲覧文脈]]、
[VAR[ナビゲーション型]]についての
[DFN[[RUBYB[navigate fetchの処理]@en[process a navigate fetch]]]]は、
次のようにします [SRC[>>12]]。
[FIG(steps)[
= [462] [VAR[予約済み環境]]を、新しい[[環境]]に設定します。
[FIG(list members)[ [463] [[環境]]
: [F[識別子][環境設定群オブジェクト]] :
新しい固有識別子
: [F[作成URL]] :
[VAR[要求]]の[F[URL][要求URL]]
: [F[対象閲覧文脈]] :
[VAR[閲覧文脈]]
]FIG]
= [151] [VAR[要求]]の各欄を次の通り設定します。
[FIG(list members)[ [461] [[要求]]
: [F[クライアント]] : [VAR[始点設定群オブジェクト]]
: [F[終点]] : [CODE[document]]
: [F[モード]] : [CODE[navigate]]
: [F[credentialsモード]]: [CODE[include]]
: [F[URL credentials利用フラグ]]: [[真]]
: [F[リダイレクトモード]]: [CODE[manual]]
: [F[起源]] :
[FIG(list)[
- [276] [VAR[[[navigate]] する[[閲覧文脈]]]]が[[子供閲覧文脈]]で、かつ、
- [277] [VAR[[[navigate]] する[[閲覧文脈]]]]の[[閲覧文脈包含子]]が[[閲覧文脈適用範囲起源]]を持つ
]FIG]
... なら、その[[閲覧文脈適用範囲起源]]
: [F[キャッシュモード]] : [VAR[キャッシュ上書き]]により定める [SRC[仕様書に規定なし]]
: [F[対象クライアント識別子]] :
[VAR[閲覧文脈]]の[F[活性文書]]の[F[関連設定群オブジェクト]]の[F[識別子][環境設定群オブジェクト]]
: [F[予約済みクライアント]] :
[VAR[予約済み環境]]
]FIG]
= [443] [VAR[要求]]、[VAR[ナビゲーション型]]、
[VAR[始点閲覧文脈]]、[VAR[閲覧文脈]]について
[[Should navigation request of type from source in target be blocked by Content Security Policy?]]
を実行した結果が [CODE[Blocked]] なら、
== [444] [[ネットワークエラー]]について >>156 を実行します。
= [445] それ以外なら、
== [152] [VAR[要求]]を [[fetch]] します。 [[process response]] は、 >>156 とします。
]FIG]
[156] 次の処理は、[VAR[応答]]について次のようにします [SRC[>>12]]。
[FIG(steps)[
= [362] [VAR[応答]]の[F[location URL]]が[[失敗]]なら、
== [363] [VAR[要求]]と[VAR[応答]]について、[[HTTPリダイレクトfetch]]を実行します。
[[process response]] は、 >>156 とします。
= [364] それ以外で、[VAR[応答]]の[F[location URL]]が [[URL記録]]なら、
[VAR[応答]]の[F[location URL]]の[F[scheme][URL scheme]]により、
[FIG(switch)[
: [[HTTP(S) scheme]] :
[VAR[要求]]と[VAR[応答]]について、[[HTTPリダイレクトfetch]]を実行します。
[[process response]] は、 >>156 とします。
: [CODE(URI)@en[blob]], [CODE(URI)@en[file]], [CODE(URI)@en[filesystem]], [CODE(URI)@en[javascript]] :
[VAR[応答]]を、[[ネットワークエラー]]に設定します。
: その他の [[fetch scheme]] :
[[navigate fetchの処理]]を実行します。
[FIG(list members)[
: [VAR[要求]] :
[FIG(list members)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
: [F[URL][要求URL]] : [VAR[応答]]の[F[location URL]]
]FIG]
: [VAR[閲覧文脈]] : [VAR[閲覧文脈]]
: [VAR[始点閲覧文脈]] : [VAR[始点閲覧文脈]]
: [VAR[ナビゲーション型]] : [VAR[ナビゲーション型]]
]FIG]
: それ以外 :
[[navigate URL schemeの処理]]を実行します。[VAR[応答]]の[F[location URL]]と[VAR[閲覧文脈]]を引き渡します。
こちらはここで終わります。
]FIG]
= [365] '''Fallback in prefer-online mode''':
[FIG(list)[
- [VAR[応答]]を [[AppCache]] から [[fetch]] した場合で、
- [VAR[要求]]の[F[メソッド][要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] で、
- [VAR[応答]]の[F[URL]]と[[同じ起源]]の [[URL]] を持つ [[relevant application cache]] があり、
- その [[AppCache]] [[エントリー]]のいずれかの[F[URL]]が[VAR[応答]]の[F[URL]]で、
- ただしその[[エントリー]]は [[foreign]] ではなく、
- その [[mode]] が [[prefer-online]] であり、
- [VAR[取り消し]]フラグが理由 [[end-user abort]] で設定されておらず、
- [VAR[応答]]が[[ネットワークエラー]]か[VAR[応答]]の[F[状態][状態符号]]が非[[OK状態]]
]FIG]
... のすべてを満たすなら、
== [366] [[最適AppCache]]から[VAR[応答]]の[F[URL]]で識別されるエントリーを得ます。
== [367] そのエントリーが [[foreign]] でないなら、
=== [368] [VAR[応答]]を、そのエントリーの[[応答]]に設定します。
=== [[利用者]]に対して失敗したこととキャッシュを使うことを示して構いません。
= [369] '''Fallback for fallback entries''':
[FIG(list)[
- [VAR[応答]]を [[AppCache]] から [[fetch]] しなかった場合で、
- [VAR[要求]]の[F[メソッド][要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] で、
- [VAR[応答]]の[F[URL]]が [[relevant application cache]] の [[fallback namespace]]
に一致する場合で、
- その[[最適AppCache]]の [[online whitelist]] に[VAR[応答]]の[F[URL]]と[[同じ起源]]の [[URL]] を持ち、
[VAR[応答]]の[F[URL]]の先頭と一致するようなエントリーが無く、
- [VAR[取り消し]]フラグが理由 [[end-user abort]] で設定されておらず、
- [VAR[応答]]が[[ネットワークエラー]]か[VAR[応答]]の[F[状態][状態符号]]が非[[OK状態]]
]FIG]
... のすべてを満たすなら、
== [424] [[最適AppCache]]の [[fallback namespace]] に対する [[fallback resource]] を得ます。
== [425] そのエントリーが [[foreign]] でないなら、
=== [426] [VAR[応答]]を、そのエントリーの[[応答]]に設定します。
=== [427] [[利用者]]に対して失敗したことと [[fallback resource]] を使うことを示して構いません。
= [428] [[navigate応答の処理]] (>>26) を実行します。
[FIG(list members middle)[
: [VAR[要求]] : [VAR[要求]]
: [VAR[応答]] : [VAR[応答]]
: [VAR[閲覧文脈]] : [VAR[閲覧文脈]]
: [VAR[始点閲覧文脈]] : [VAR[始点閲覧文脈]]
: [VAR[ナビゲーション型]] : [VAR[ナビゲーション型]]
: [VAR[予約済み環境]] : [VAR[予約済み環境]]
]FIG]
]FIG]
[489] ここで、[[HTTPリダイレクト]]の場合に [[navigate]] の一部分を繰り返し (再帰的に)
実行する形になっています。 [[navigate]] における [[HTTPリダイレクト]]の取り扱いは、
[[素片識別子]]の取り扱いなど、細部が微妙に [[navigate]] 以外の [[fetch]]
での取り扱いと異なっています。
[490] [[URL]] の範囲の検査 (>>491) もここで行われる必要があります。
[HISTORY[
[370] 以前は[[安全なメソッド]]と [CODE(HTTP)@en[POST]] の場合を除き、
[[リダイレクト]]先も[[同じ起源]]でなければエラーとしてそれ以上処理しないことになっていました。
[[WF2]] 時代には[[フォームの提出]]で [CODE(HTTP)@en[PUT]] や [CODE(HTTP)@en[DELETE]]
を使って [[navigate]] できました。 [[Opera]] ([[Presto]]) がこれを実装していました。
しかし現在では [CODE(HTTP)@en[GET]] と [CODE(HTTP)@en[POST]]
でしか [[navigate]] する方法はありません。
]HISTORY]
* 応答の処理
[26] [VAR[要求]]、[VAR[応答]]、[VAR[閲覧文脈]]、[VAR[始点閲覧文脈]]、
[VAR[ナビゲーション型]]、[VAR[予約済み環境]]に関する[DFN[[RUBYB[navigate応答の処理]@en[process a navigate response]]]]は、次のようにします。
[FIG(steps)[
= [25] [VAR[取り消し]]フラグが設定されていれば、終わりとします (>>109 へ)。
= [52] それ以外で、
[FIG(list)[
- [435] [VAR[応答]]が[[ネットワークエラー]]
- [441]
@@ [CODE(HTTP)@en[X-Frame-Options:]] 違反
- [442] [VAR[要求]]、[VAR[応答]]、[VAR[ナビゲーション型]]、[VAR[始点閲覧文脈]]、
[VAR[閲覧文脈]]について
[[Should navigation response to navigation request of type from source in target be blocked by Content Security Policy?]]
が [CODE[Blocked]] を返す場合
]FIG]
... のいずれかの場合、
== [440] [[非文書表示]] (>>47) によることとします [SRC[>>12]]。
= [51] それ以外で、[VAR[応答]]の[F[状態][状態符号]]が [CODE(HTTP)[204]] か [CODE(HTTP)[205]]
なら、終わりとします (>>109 へ) [SRC[>>12]]。
= [53] それ以外で、[VAR[応答]]が [CODE(HTTP)@en[[[Content-Disposition:]] [[attachment]]]]
なら、[[ダウンロード]]とします [SRC[>>12]] ([VAR[閲覧文脈]]外の処理 >>48)。
= [158] それ以外なら、[[MIME型]]依存の処理 (>>44) に進みます [SRC[>>12]]。
]FIG]
;; [157] [[navigate応答の処理]]は、[[navigate]] 本体の他に、
[[[CODE(URI)@en[javascript:]] URLへのnavigate]] からも呼び出されます。
[183] [[Webブラウザー]]によっては、[VAR[応答]]の[F[状態][状態符号]]が
[CODE[4[VAR[xx]]]] や [CODE[5[VAR[xx]]]] で[F[本体][応答本体]]が一定サイズ以下の時、
[[非文書表示]]とすることがあります (>>134)。
[408] おそらく[[既読化]]もこの段階で行われると思われます。
[[既読化]]には[VAR[新しい[[資源]]]]の[F[URL]]や[VAR[応答]]の[F[URL][応答のURL]]を引き渡します。
@@ [[リダイレクト]]前の [[URL]] の[[既読化]]はいつの時点か?
[HISTORY[
[132] 2016年6月の改訂までは次のような規定がありましたが、削除されました。
[FIG(list)[
- [27] ここで、[[利用者エージェント]]が認識できる [[challenge]] を含まない
[CODE(HTTP)[[[401]]]] [[応答]]は、 [CODE(HTTP)[[[200]]]]
[[応答]]同様に扱わなければ[['''なりません''']] [SRC[>>12]]。
- [28] [[利用者エージェント]]は [CODE(HTTP)[[[401]]]] [[応答]]で認識できる [[challenge]]
を含む場合であっても、[[応答]]を表示した上で、
非[[モーダルダイアログ]]によって[[ログイン]]できるようにしても構いません [SRC[>>12]]。
]FIG]
[184] [[TLSクライアント認証]]のダイアログの処理は [[fetch]] 側で規定されています。
[CODE(HTTP)[401]] や [CODE(HTTP)[407]] の[[HTTP認証ダイアログ]]の処理は、
以前より明確な規定はありませんが、将来的に [[fetch]] 側で規定されるものと思われます。
;; [284] [[クライアント認証]]のダイアログは、処理が更に進んだ[[応答]]の受信の後の方でも表示されることがあります。
[54] 改訂前は [[HTML Standard]] は [[HTTP]] の規定に委ねており、理論上はこれら以外にも
[[HTTPヘッダー]]等の指示に基づく動作を行う余地が残されていました (が[[仕様書]]の[[注釈]]で、
他のものは考えつかないと記されていました)。 [[fetch]] との統合と明確化により、
そうした曖昧な規定は削除されて動作が明確になりました。
]HISTORY]
* MIME 型依存の処理
[44] [[navigate]] により [[fetch]] (相当) を行い最終的に処理するべき[[資源]]が確定したら、
その[[資源]]の[[MIME型]]によって適切な処理を行います。
[45] ここで [[MIME型]]は、 [[sniffed MIME type]] を使わなければ[['''なりません''']]
[SRC[>>12]]。
;; [[Fetch Standard]] と [[MIME Sniffing]] の規定に基づき、 [[HTTP]] [CODE(HTTP)@en[[[Content-Type:]]]]
[[ヘッダー]]を無視することがあります。
[46] [[利用者エージェント]]は、[[MIME型]]と設定に基づき次のいずれかの処理を行わなければ[['''なりません''']] [SRC[>>12]]。
[FIG(list)[
- [VAR[閲覧文脈]]内で[[文書]]を[[レンダリング]]する (>>30)
- [VAR[閲覧文脈]]内で非[[文書]]を表示する (>>47)
- [VAR[閲覧文脈]]に影響しない処理を行う (>>48)
]FIG]
[50] いずれを選択するかは実装や設定に依存します (>>206)。 [[HTML Standard]]
仕様上「設定により」となっており、完全には規定されていませんが、
実際上は任意の動作が許されているわけではありません。例えば
[CODE(MIME)@en[[[text/html]]]] を常に[[ダウンロード]]として扱うような実装は
[[Web互換]]とは言えません。
[68] [[著者]]は、[[Webブラウザー]]の実装や設定によって挙動が変わり得る
[[MIME型]]を使わないよう、使う場合は特定の挙動を仮定しないよう注意するべきでしょう。
[EG[
[69] 例えば [[PDF]] が[[プラグイン]]により表示されるか、[[外部アプリケーション]]により表示されるか仮定するべきではありません。
]EG]
[399] この段階に達した時点で、 [CODE[webNavigation]] [[API]] の
[CODE[onCommitted]] を呼び出せるものと思われます。
[VAR[遷移型]]と[VAR[遷移修飾子群]]と現在時刻を引き渡します。
* 閲覧文脈内の文書表示
[30] [[閲覧文脈]]内に内容を[[レンダリング]]する方法は、
次の各 [[MIME型]]について規定されています。
[FIG(switch)[
:[31] [[HTML文書]]: [CODE(MIME)@en[[[text/html]]]] [SRC[>>12]]
:[32] [[XML文書]] (>>33 も参照) :[[明示的対応XML型]]以外の [[XML MIME型]] [SRC[>>12]]
:[35] [[平文]] :[CODE(MIME)@en[[[text/plain]]]] や [[JSON]] などの[[テキストファイル]] ([[明示的対応JSON型]]以外) [SRC[>>12]]
:[37] [[媒体]]: [[利用者エージェントが対応]]している[[画像形式]]、[[動画形式]]、[[音声形式]] [SRC[>>12]]
:[38] [[プラグイン]]: [[外部アプリケーション]]を使って[[閲覧文脈]]内に内容を[[レンダリング]]する型 [SRC[>>12]]
]FIG]
;; [216] 実際の[[Webブラウザー]]は、ごく限られた [[XML MIME型]]を除き、ほとんどの
[[XML MIME型]]を ([[XML]] としてではなく) 未対応として扱うことがあります。
;; [36] [[HTML Standard]] では [CODE(MIME)@en[[[multipart/x-mixed-replace]]]]
の処理方法も規定されています [SRC[>>12]] が、最近の [[Webブラウザー]]からは削除されています。
([[画像形式]]としての [[MJPEG over HTTP]] には対応していますが、 [[navigate]]
では対応しないようになっています。)
;; [215] [[Webブラウザー]]によってはこの他にも独自の [[MIME型]]の処理を実装している場合があります。
例えば [[IE]] や [[Chrome]] は [[MHT]] に対応しています。
** 閲覧文脈内の文書の作成
[70] [[閲覧文脈]]で表示する[[文書]]は、次のように作成します。
[[HTML文書]]や[[平文]]の場合は、次のような[[タスク]]を[[ネットワークタスク源]]で[[キュー]]に追加しなければ[['''なりません''']] [SRC[>>12]]。
[[XML文書]]の場合も、次のように行います [SRC[>>12]]。
[[媒体]]や[[プラグイン]]の場合も、次のような[[タスク]]を[[ネットワークタスク源]]で[[キュー]]に追加する[['''べきです''']] [SRC[>>12]]。
[[非文書表示]]の場合 (>>47) も、次のように行う[SHOULD[べき]]です。
[FIG(steps)[
= [135] [VAR[取り消し]]フラグが設定されていれば、何もしない処理 (>>48) に移り、こちらはここで終わります。
= [102] [CODE(DOMi)@en[[[Document]]]] を作成します [SRC[>>12]]。
[VAR[新しい[[文書]]]]をこの[[文書]]に設定します。
= [103] [[MIME型]]などを設定します [SRC[>>12]]。
= [197] [VAR[[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]が設定されていれば、
[[文書]]を[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]とします。
= [192] [VAR[[[reload override flag]]]] が[[真]]なら、
== [193] [VAR[新しい[[文書]]]]の [[reload override flag]] を、[[真]]に設定します [SRC[>>191]]。
== [194] [VAR[新しい[[文書]]]]の [[reload override buffer]] を、[VAR[新しい[[資源]]]]の[[応答]]の[[本体]]の[[文字列]]に設定します [SRC[>>191]]。
= [417] [VAR[新しい[[文書]]]]の[F[時刻起源]]を、[VAR[時刻起源]]に設定します [SRC[>>416]]。
= [181] [VAR[新しい[[文書]]]]の[F[番地][文書の番地]] (>>182) と[F[起源][文書の起源]]
(>>268) を設定します。
= [104] [DFN[[RUBYB[文書オブジェクトの初期化]@en[initialise the document object]]]] [SRC[>>246]] を実行します [SRC[>>12]]。すなわち、
== [248]
[FIG(list)[
- [VAR[[[navigate]] する[[閲覧文脈]]]]の[F[[[セッション履歴]]]]が[[初期「[CODE(URI)@en[about:blank]]」文書]][VAR[初期文書]]の[[セッション履歴エントリー]]しか含まず、
- [VAR[[[置換有効]]]]であり、
- [VAR[初期文書]]の[F[起源][文書の起源]]と[VAR[新しい[[文書]]]]の[F[起源][文書の起源]]が[[同じ起源]]なら、
]FIG]
=== [301] [VAR[窓]]を、[VAR[初期文書]]の [F[[CODE(DOMi)@en[[[Window]]]]]] に設定します。 [SRC[>>246]]
=== [464] [VAR[設定群オブジェクト]]を、[VAR[窓]]の[F[関連設定群オブジェクト]]に設定します
[SRC[>>246]]。
== [249] そうでなければ、
=== [304] [VAR[窓]]を、新しい [CODE(DOMi)@en[[[Window]]]] に設定します [SRC[>>246]]。
=== [336] [CODE[InitializeHostDefinedRealm]] を実行します。
[FIG(list members)[
: [VAR[[[大域オブジェクト]]]] : [VAR[窓]]
: [VAR[大域[CODE[this]]値]] : [VAR[[[navigate]] する[[閲覧文脈]]]]の [F[[CODE(DOMi)@en[WindowProxy]]]]
]FIG]
[VAR[realm実行文脈]]を、作成された[[JavaScript実行文脈]]に設定します。 [SRC[>>246]]
=== [337] [VAR[設定群オブジェクト]]を、[VAR[realm実行文脈]]と[VAR[予約済み環境]]について[[閲覧文脈環境設定群オブジェクトの設定]]を実行した結果に設定します。 [SRC[>>246]]
== [302] [VAR[窓]]の[F[文書]]を[VAR[新しい[[文書]]]]に設定します [SRC[>>246]]。
== [324] [VAR[[[navigate]] する[[閲覧文脈]]]]の [F[[CODE(DOMi)@en[WindowProxy]]]] の
[F(ss)[Window]] を、[VAR[窓]]に設定します [SRC[>>246]]。
== [279] [VAR[新しい[[文書]]]]の[F[[[HTTPS状態]]]]を、[VAR[新しい[[資源]]]]の[F[[[応答]]]]の[F[[[HTTPS状態]]]]に設定します
[SRC[>>246]]。
== [378] [VAR[新しい[[文書]]]]の[F[参照元ポリシー]]を、[VAR[新しい[[資源]]]]の[F[応答]]について
[CODE(HTTP)@en[Referrer-Policy:]] [[ヘッダー]]の構文解析の結果得られた[[参照元ポリシー]]に設定します [SRC[>>246]]。
== [141] [VAR[新しい[[文書]]]]と[VAR[新しい[[資源]]]]について[[[CODE(DOMi)@en[Document]]のCSPリストの初期化]]を実行します [SRC[>>246]]。
== [379] [VAR[新しい[[資源]]]]の[[要求]]の[F[参照元]]が [CODE[no-referrer]] でなければ、
=== [250] [VAR[新しい[[文書]]]]の[F[参照元]]を、[VAR[新しい[[資源]]]]の[[要求]]の[F[参照元]]に設定します。 [SRC[>>246]]
== [251] [VAR[新しい[[文書]]]]について[[砂箱化を実装]]します。 [SRC[>>246]]
== [484]
[VAR[新しい[[文書]]]]について[[set the allow* flags]]します。
[SRC[>>246]]
== [471]
[VAR[設定群オブジェクト]]の[F[実行準備完了フラグ]]を設定します。
[SRC[>>246]]
== [267] [VAR[設定群オブジェクト]]の[F[活性サービスワーカー]]が [CODE[null]] でなければ、
[SRC[>>246]]
=== [465] [VAR[設定群オブジェクト]]の[F[保安文脈]]が[[真]]なら、
==== [466] [VAR[閲覧文脈]]の[F[opener browsing context]]が [CODE[null]] でなく、
[VAR[要求]]の[F[クライアント][要求クライアント]]が[[非保安文脈]]なら、
===== [467] [VAR[閲覧文脈]]の[F[opener]]を[[disown]]します。
==== [468] それ以外なら、
===== [469] [VAR[設定群オブジェクト]]の[F[活性サービスワーカー]]を、
[CODE[null]] に設定します。
= [105] [[構文解析器]][VAR[構文解析器]]を作成し (>>77)、
[VAR[新しい[[文書]]]]を関連付けます [SRC[>>12]]。
= [286] [VAR[[[navigate]] する[[閲覧文脈]]]]が[[入れ子閲覧文脈]]の場合、 [SRC[>>285]]
== [287] [VAR[[[navigate]] する[[閲覧文脈]]]]の[[非保安要求ポリシー]]が「格上げする」なら、
=== [288] [VAR[新しい[[文書]]]]の[[現職設定群オブジェクト]]の[[非保安要求ポリシー]]を、「格上げする」に設定します。
=== [289] [VAR[[[navigate]] する[[閲覧文脈]]]]の[[非保安navigate格上げ集合]]の各値について、
[VAR[新しい[[文書]]]]の[[現職設定群オブジェクト]]の[[非保安navigate格上げ集合]]に追加します。
= [223] 必要があれば、[[ブラウザー拡張]]によって指定された [[CSS]]
を読み込んだり、[[内容スクリプト]]を実行したりします。
= [106] これより後、[[スクリプト]]の実行や [[stop parsing]] よりも前に、
(他のモードに移行 (>>33) したり[VAR[取り消し]]されたりしていなければ)
[[update the session history with the new page]] (>>95) を実行します [SRC[>>12]]。
]FIG]
;; [253] [[初期「[CODE(URI)@en[about:blank]]」文書]]なら
[CODE(DOMi)@en[[[Window]]]] [[オブジェクト]]が新しい[[文書]]に再利用されます。
これは [CODE(DOMi)@en[[[Window]]]] と[[文書]]との一対一対応関係が崩れる例外の1つです。
;; [254] 仕様書上は[[セッションストレージ領域]]の初期化に関する規定 [SRC[>>258]]
がありますが、実際上は [CODE(DOMa)@en[[[sessionStorage]]]] の最初の利用時まで遅延させられます。
[79] [[XML文書]]の場合[[タスクキュー]]に追加しなければならないと仕様書には明記されていませんが、
おそらくそうすることが想定されていると思われます。もっともそうしないとしても[[著者]]から違いを観測できるのか不明です。できたとしても困難と思われます。
[75] [[MIME型]]の設定においては、[[XML文書]]以外の時は[VAR[新しい[[文書]]]]の
[[HTML文書]]フラグを設定しなければ[['''なりません''']] [SRC[>>12]]。
[[プラグイン]]の時は[[プラグイン文書]]フラグを設定する[['''べきです''']] [SRC[>>12]]。
また[VAR[新しい[[文書]]]]の[[内容型]]を [[HTML文書]]なら [CODE(MIME)@en[[[text/html]]]] に、
[[平文]]なら [[sniffed MIME type]] に設定しなければ[['''なりません''']] [SRC[>>12]]。
[[媒体]]や[[プラグイン]]なら [[sniffed MIME type]] に設定する[['''べきです''']] [SRC[>>12]]。
;; [76] [[XML文書]]の場合の[[文書]]の[[内容型]]の設定の規定はなぜかありません。
[235] 更に [[sniffed type]] が [CODE(MIME)@en[[[image/svg+xml]]]] であれば、
その旨のフラグ ([F[[[SVG]] [[navigate]] フラグ]]) を設定する必要があります。
;; [CODE(DOMm)@en[[[getSVGDocument]]]] で参照されます。
[182] [[文書の番地]]は、[[上書きURL]]が設定されていればその値に、
そうでなければ[VAR[新しい[[資源]]]]の [[URL]] に設定しなければ[['''なりません''']]
[SRC[>>12]]。
;; [185] [[リダイレクト]]を辿った場合には、最終的な [[URL]] に設定されます。
;; [329] [CODE(URI)@en[view-source:]] も参照。
[268] [[文書の[F[起源]]]][DEL[と[[実効スクリプト起源]]]]は、次のように決定しなければ[MUST[なりません]]。
[FIG(steps)[
= [390] [VAR[応答]]が[[ネットワークエラー]]の場合、
== [448] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、新しい[[不透明起源]]に設定します
[SRC[>>12]]。
= [256] それ以外で、[VAR[新しい[[文書]]]]の[F[活性砂箱化フラグ集合]]の[F[砂箱化起源閲覧文脈フラグ]]が設定されていれば、 [SRC[>>244]]
== [257] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、新しい[[不透明起源]]に設定します。
= [119] それ以外で、[VAR[新しい[[文書]]]]の[F[文書の番地]]の[F[scheme][URL scheme]]が
[[network scheme]] なら、[SRC[>>244]]
== [247] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、[VAR[新しい[[文書]]]]の[F[番地][文書の番地]]の[F[起源][URLの起源]]の複製に設定します。
= [255] それ以外で、
[VAR[新しい[[文書]]]]の[F[文書の番地]]が [CODE(URI)@en[about:blank]] なら、[SRC[>>244]]
== [259] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、[VAR[文書の起源]]に設定します。
= [260] それ以外で、[VAR[新しい[[資源]]]]の [F[URL]] ([[リダイレクト]]前の最初のもの)
があってその [F[scheme][URL scheme]] が [CODE(URI)@en[javascript][javascript:]] なら、
[SRC[>>244]]
== [261] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、[VAR[文書の起源]]に設定します。
= [262] それ以外で、 [VAR[[[[CODE(HTMLa)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]なら、
[SRC[>>244]]
== [263] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、
[VAR[[[navigate]] する[[閲覧文脈]]]]の[F[閲覧文脈包含子]]の[F[節点文書]]の[F[起源][文書の起源]]に設定します。
= [264] それ以外なら、 [SRC[>>244, >>266]]
== [265] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、新しい[[不透明起源]]に設定します。
]FIG]
;; [334] [[HTML Standard]] は [CODE(URI)@en[about:blank]] への [[navigate]] をすべて >>255
としていますが、[[著者]]以外が [[URL]] を与えた場合 ([[アドレスバー]]や[[お気に入り]]からの選択の場合など)
は >>264 が適用されると思われます。
;; [333] [[初期[CODE(URI)@en[about:blank]]文書]]は [[navigate]] で作成される[[文書]]ではなく、
[[閲覧文脈の作成]]で作成される[[文書]]です。[[起源]]は[[初期[CODE(URI)@en[about:blank]]文書]]を参照。
;; [327] [CODE(URI)@en[view-source:]] は >>264 より[[不透明起源]]となります。
;; [328] [CODE(URI)@en[chrome:]] や [CODE(URI)@en[chrome-extension:]]
やその他の [CODE(URI)@en[about:]] のような[[Webブラウザー]]固有の [[URL]]
や[[ブラウザー拡張]]の [[URL]] への [[navigate]]
では、[[Webブラウザー]]依存の方法で決めた[[起源]]に設定すると思われます。
** 文書木の構築
[77] 表示する[[文書木]]を構築するために使う[[構文解析器]][VAR[構文解析器]]は、
[[HTML文書]]なら[[HTML構文解析器]]、[[XML文書]]なら[[XML構文解析器]]です。
ただし[[平文]]の場合は[[テキストファイルのDOM構築]]方法を使います。
[[媒体]]の場合は[[構文解析器]]のかわりに[[媒体文書]]のDOMを構築し、
[[プラグイン]]の場合は[[構文解析器]]のかわりに[[プラグイン文書]]のDOMを構築します。
[[非文書表示]]の場合は[[構文解析器]]のかわりに任意の [[DOM]] を構築できます (>>84)。
;; [72] [VAR[構文解析器]]は、 [[fetch]] によって得られた[[応答]]の [[MIME型]]に含まれる[[文字符号化]]の指定を入力として受け取ります。
ここでの [[MIME型]]は、 [[sniffed MIME type]] ではありません [SRC[>>12]]。
[71] [[process response body]] は、次のようにしなければ[['''なりません''']]。
[FIG(steps)[
= [312] [VAR[構文解析器]]の[[入力バイト列]]に受信した[[バイト列]]を連結します [SRC[>>12]]。
= [313] [VAR[構文解析器]]の処理を行います [SRC[>>12]]。
]FIG]
[73] [[process response end-of-file]] は、次のようにしなければ[['''なりません''']]。
[FIG(steps)[
= [314] [VAR[構文解析器]]の入力として暗黙の [[EOF]] 文字を与えます [SRC[>>12]]。
= [315] [VAR[構文解析器]]の処理を行います [SRC[>>12]]。
]FIG]
[316] [[process response body]] と [[process response end-of-file]]
を実行する[[ネットワークタスク源]]の[[タスク]]の[F[実行可否判断]]は、
次のようにしなければ[['''なりません''']]。
[FIG(steps)[
= [319] [VAR[構文解析器]]の[F[[[字句化器]]をブロック]]フラグが設定されていれば、
== [320] [[偽]]を返します。
= [318] それ以外なら、
== [317] [[真]]を返します。
]FIG]
;; [321] [[構文解析器]]の [CODE(HTMLe)@en[[[script]]]] [[要素]]の処理により、
[[字句化]]を行う[[タスク]]の処理が中断されることがあります。
[CODE(HTMLe)@en[[[script]]]] を参照。
[74] [VAR[構文解析器]]は、構文解析中のいずれかのタイミングで[[文書の文字符号化]]を設定します。
[78] [[構文解析器]]や[[プラグイン文書]]の構築処理は、
[[文書要素]]を[[文書に挿入]]するタイミングで
[[AppCache選択アルゴリズム]]を実行します [SRC[>>12]]。
;; [221] [[文書要素]]は、[[XML構文解析器]]が [[XML]] [[整形式制約]]違反を通知するものかもしれません。 ([[XML構文解析器]]参照。)
[222] [[Webブラウザー]]によっては、[[ブラウザー拡張]]の[[内容スクリプト]]を[[文書要素]]の最初の挿入時点で実行するものもあります。
[33] [[XML文書]]の場合、[[文書要素]]の[[名前空間]]によっては他の方法 (>>47、>>48)
で表示することにしても構いません [SRC[>>12]]。
[EG[
[34] 例えば[[フィード]]は、[[XML]] として [[DOM]] を表示するのではなく、
[[Webブラウザー]]組み込みの[[フィードビューアー]]により表示できます [SRC[>>12]]。
]EG]
;; [82] その場合、(少なくても仕様書のアルゴリズム上は) 作成されかけた
[[XML文書]]オブジェクトに[[著者]]がアクセスする方法はありません。
;; [118] 仕様書にはありませんが、理論上は [[abort a document]] を実行するべきかもしれません。
([[文書要素]]より前に [CODE(XML)@en[[[xml-stylesheet]]]] [[処理指令]]の [[fetch]]
が行われていたら、 [[abort a document]] により取り消されます。)
;; [171] [[IE]] は [CODE(MIME)@en[[[application/atom+xml]]]] や
[CODE(MIME)@en[[[application/rss+xml]]]] を[[フィードビューアー]]で表示するのに加え、
[CODE(MIME)@en[[[text/xml]]]] の時にバイト列を [[sniffing]] して[[フィード]]かどうか判定し、
[[フィードビューアー]]で表示します [SRC[>>170]]。 [[Firefox]]
も同様に [[sniffing]] を行います [SRC[>>172]]。厳密には [[HTML Standard]]
に沿った動作ではありません。
[REFS[
- [170] [CITE@en[Windows RSS Publisher's Guide (work-in-progress) - Microsoft RSS Blog - Site Home - MSDN Blogs]] ([TIME[2015-05-04 11:42:57 +09:00]] 版) <http://blogs.msdn.com/b/rssteam/archive/2005/08/02/publishersguide.aspx>
- [172] [CITE@en-US[XSL Transformations in Mozilla FAQ | MDN]] ([TIME[2014-03-22 05:56:30 +09:00]] 版) <https://developer.mozilla.org/en-US/docs/XSL_Transformations_in_Mozilla_FAQ>
]REFS]
[229] [CODE(XML)@en[[[xml-stylesheet]]]] により [[XSLT]]
[[スタイルシート]]が指定されているときは、 [[XSLT]] によって変換したものを
[[DOM]] として表示することになります。
;; これがどのように処理されるかはどこでも規定されていません。 [[フィードリーダー]]モードになることがあるのか、
[[unstyle document]] 表示もあるのか、どの時点で表示が切り替わるのか、
[[スクリプト]]から何にアクセスできるのかなど謎は多いです。
[EG[
[231] >>143 を [[Chrome]] は [[XSLT]] [[スタイルシート]]により表示しますが、
[[Firefox]] と [[IE]] は[[フィード]]として表示するようです。 [CODE(MIME)@en[[[text/xml]]]]
で、
[PRE(XML code)[
<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.technet.com/utility/feedstylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>日本のセキュリティチーム</title>
]PRE]
... から始まっています。
[REFS[
- [143] [CITE@en[日本のセキュリティチーム]] ([TIME[2015-11-02 17:00:31 +09:00]] 版) <http://blogs.technet.com/b/jpsecurity/rss.aspx>
]REFS]
]EG]
[173] [[CSS]] などのない [[XML文書]] ([[unstyle document]])は、
その[[木構造]]が表示されます。
;; これは [[unstyled document view]] と呼ばれる [[DOM]]
の特別な表示モードなので、非文書表示モードではありません。
[94] [[媒体]]、[[プラグイン]]、 >>33 により非 [[DOM]] 表示に切り替える場合には、
仕様書上は [[navigate]] による [[fetch]] はそのまま放置され、
改めて [CODE(HTMLe)@en[[[img]]]] [[要素]]などで [[fetch]] が発生することになっています。
実際には [[Webブラウザー]]の[[キャッシュ]]により、あるいは何らかの特別な仕組みにより、
[[navigate]] による [[fetch]] の結果あるいは経過が[[媒体]]の表示処理や[[プラグイン]]等に引き渡される可能性もあります。
@@ [[CSP]] [[enforce]] / [[monitor]]
* 閲覧文脈内の非文書表示
[47] [[閲覧文脈]]内であっても [[DOM]] を[[レンダリング]]するのではなく、
専用ビューアーやエラーメッセージなど特別なものを表示する場合があります。
;; [49] 仕様書では[[閲覧文脈]]内に表示することを“[RUBYB[行内]@en[inline]]”と言っています。
[59] [[fetch]] (相当) を行う前にこちらの処理方法に移行する場合と、