/
761.txt
1066 lines (871 loc) · 64 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]]]] は、[[資源]]へのアクセスを行い[[閲覧文脈]]の表示を切り替えたり、
[[ダウンロード]]その他の動作を発生させたりする操作です。[[ハイパーリンク]]の[[クリック]]などにより呼び出されます。
[[Webブラウザー]]を構成する最も基礎的で重要な[[アルゴリズム]]の1つです。
* 仕様書
[REFS[
- [12] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#navigate>'''
- [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>
]REFS]
* 文脈
[16] [[navigate]] は、[[仕様書]]で規定されている手順により ([[著者]]の指示により)
実行される場合もあれば、[[利用者エージェント]]依存の方法で ([[利用者]]の直接の指示により)
実行される場合もあります。
[EG[
[17] 前者の例として [CODE(JS)@en[[[location.href]]]] の設定が、
後者の例として[[アドレスバー]]からの [[URL]] の指定があります。
]EG]
[13] [[navigate]] を発生させる操作には、例えば次のものがあります。
[FIG(short list)[
- [[ハイパーリンクをたどる]]
- [[フォーム提出]]
- [CODE(JS)@en[[[window.open]]]]
- [CODE(JS)@en[[[location.assign]]]]
- [CODE(JS)@en[[[location.replace]]]]
- [CODE(JS)@en[[[location.href]]]]
- [CODE(JS)@en[[[location.reload]]]]
- [[アドレスバー]]、[[メニュー]]、[[DnD]]、[[WebDriver]] 等からの [[URL]] の指定
- [[再読込]]操作
- [[栞]]の選択
- [[コマンドライン引数]]等の他の[[アプリケーション]]からの [[URL]] の指定
- [[navigate]] によって生成された[[利用者]]に対する選択肢の実行
- [[change the encoding]]
]FIG]
[178] [[履歴の探索]]が行われる場合で、[[セッション履歴エントリー]]の[[文書]]が既に破棄されている時 ([[bfcache]] 上に[[文書]]が保存されていない時)
には、[RUBYB[エントリー更新]@en[entry update]]のための [[navigate]]
が行われます。
;; [[履歴の探索]]や[[セッション履歴エントリー]]を参照。
* 入力
[41] [[navigate]] には、次の入力 ([[引数]]) があります。最初の3つは必須です。
[FIG(list members)[
:[14] [VAR[[[navigate]] する[[閲覧文脈]]]]:[[navigate]] によって[VAR[新しい[[資源]]]]を表示するべき[[閲覧文脈]]です。
:[21] [VAR[新しい[[資源]]]]:[VAR[[[navigate]] する[[閲覧文脈]]]]に新たに表示するべき[[資源]]です。
ここで[[資源]]は次のものによって表されます。
[FIG(list)[
- [[URL]] ([[絶対URL]])
- [[fetch]]
- [[応答]]
- [[a known definite encoding]]
- 非文書として[[行内]]に表示するべきエラーページ
- [[要求メソッド]]
- [[フォーム提出アルゴリズム]]からの呼び出しか否か
- [[fetch]] 時の [[referrer]]
- その他 [[fetch]] に必要な引数
- [[AppCache]] から [[fetch]] したか否か
- 失敗 ([[DNS]] エラー、 [CODE(HTTP)[[[4xx]]]] や [CODE(HTTP)[[[5xx]]]]
など) か否か
[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]
:[15] [DFN[[VAR[[RUBYB[始点閲覧文脈]@en[source browsing context]]]]]]:
[[navigate]] の開始に責任を持つ[[閲覧文脈]]です [SRC[>>12]]。
[VAR[[[始点閲覧文脈]]]]は、 [VAR[[[navigate]] する[[閲覧文脈]]]]について
[[navigate]] を認められているか、いないかのいずれかです。
:[20] [DFN[[VAR[[RUBYB[明示的自己ナビゲーション上書き]@en[explicit self-navigation override]]]]]] [SRC[>>12]]:
[VAR[[[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] [[ポップアップ]]が認められるか否か:[[外部アプリケーション]]を起動するべきかどうかに影響します。
:[98] [VAR[[[エントリー更新]]する[[エントリー]]]]:[[エントリー更新]]のための [[navigate]]
の場合には、その[[セッション履歴エントリー]]。
:[179] 再読込時にキャッシュを上書きするか:[[利用者]]による[[再読込]]時に指定されます。
(その場合の動作は正確には規定されていません。)
:[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]]文書]]かどうかを表します。
]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[gone async]]]] と
[DFN[[VAR[[[mature]]]]]] の2つのフラグを使います。どちらも初期値は[[偽]]です。 [SRC[>>12]]
;; [177] [[mature]] フラグは [[traverse the history by a delta]] からも参照されます。
[117] 入力ではありませんが、アルゴリズム内で[VAR[新しい[[文書]]]]が作成されることがあります。
* 概略
[226] [[navigate]] は次のように複雑に動作します。
[FIG(flow)[
:start:開始 >>18
:->:terminate
:->:url
:terminate: 停止
:>>:5
:url:URL >>162
:->:fragment
:->:fetch
:->:nondoc
:->:outside
:fetch: Fetch >>145
:->:url
:->: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)[
= [[ストレージミューテックス]]を解放します。
= [VAR[[[始点閲覧文脈]]]]が [VAR[[[navigate]] する[[閲覧文脈]]]]を [[navigate]]
することを認められていなければ、
== [[利用者エージェント]]は、[[利用者]]に次の選択肢を提示しても構いません。
ただしこれらの操作は[[著者]]の[[砂箱化]]の要求を無視する場合もあり、危険かもしれません。
==- 新しい[[最上位閲覧文脈]]を開き、そちらをかわりに [[navigate]]
==- [VAR[[[始点閲覧文脈]]]]の[[最上位閲覧文脈]]をかわりに [[navigate]]
== [VAR[[[例外有効]]]]なら、 [CODE(DOMe)@en[[[SecurityError]]]] [[例外]]を投げます。
== 停止します。
=
[FIG(list)[
- [VAR[[[始点閲覧文脈]]]]が [VAR[[[navigate]] する[[閲覧文脈]]]]と同じで、
- [VAR[[[navigate]] する[[閲覧文脈]]]]に[[seamless browsing context flag]] が設定されていて、
- [VAR[[[明示的自己ナビゲーション上書き]]]]フラグが設定されていないなら、
]FIG]
... [[seamless browsing context flag]] が設定されていない直近の
[VAR[[[navigate]] する[[閲覧文脈]]]]の[[祖先閲覧文脈]]を
[VAR[[[navigate]] する[[閲覧文脈]]]]とします。
=
[FIG(list)[
- [VAR[[[始点閲覧文脈]]]]と [VAR[[[navigate]] する[[閲覧文脈]]]]が同じで、
- [VAR[[[navigate]] する[[閲覧文脈]]]]が他の [[navigate]] を実行中で、
- その [[navigate]] が [[unload a document]] を実行中で、
- その [[navigate]] の[VAR[新しい[[資源]]]]の [[URL]] の[[起源]]と本 [[navigate]]
の[VAR[新しい[[資源]]]]の [[URL]] の[[起源]]が[[同じ起源]]では''ない''なら、
]FIG]
... ここで停止します。
= [[traverse the history by a delta]] の[[タスク]]が [[unload a document]]
を実行中で、それが [VAR[[[navigate]] する[[閲覧文脈]]]]の[[活性文書]]に関するものなら、
ここで停止します。
= [[prompt to unload a document]] を実行中で、
それが [VAR[[[navigate]] する[[閲覧文脈]]]]の[[活性文書]]に関するものなら、ここで停止します。
= [[URL]] に基づく処理 (>>162) に移ります。
]FIG]
;; [180] [VAR[新しい[[資源]]]]の [[URL]] が無い場合は[[上書きURL]]
を使うものと思われます。
* URL に基づく処理
[162] [[利用者エージェント]]は次のようにしなければ[['''なりません''']] [SRC[>>12]]。
[FIG(steps)[
=
[FIG(list)[
- [VAR[[[reload-triggered navigation]]]] ではなく、
- [VAR[新しい[[資源]]]]の [[URL]] と [VAR[[[navigate]] する[[閲覧文脈]]]]の[[活性文書]]の[[文書の番地]]
(を[[構文解析]]したもの) が[[素片識別子]]以外すべて同じで、
- [VAR[新しい[[資源]]]]に[[素片識別子]]があり ([[空文字列]]を含む。)、
- [VAR[新しい[[資源]]]]の[[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] なら、
]FIG]
... [[素片識別子]]に navigate (>>163) する処理に移り、こちらはここで終わります。
= [VAR[gone async]] が[[偽]]なら、
== [VAR[[[navigate]] する[[閲覧文脈]]]]が同じ [[navigate]] のうち、 [VAR[[[mature]]]]
フラグが設定されていないものがあれば、当該 [[navigate]] の取り消し処理を実行します。
= 条件によっては、[VAR[新しい[[資源]]]]を[[閲覧文脈]]外で処理 (>>48) し、こちらはここで終わります。
= [VAR[gone asnyc]] が[[偽]]なら、
== [[prompt to unload a document]] を実行します。
== [VAR[取り消し]]フラグが設定されているか、 [[refused to allow the document to be unloaded]] なら、
=== 後片付け (>>109) に移り、こちらはここで終わります。
== [VAR[[[navigate]] する[[閲覧文脈]]]]の[[活性文書]]について[[文書のabort]]を実行します。
= 条件によっては、[VAR[新しい[[資源]]]]を[[閲覧文脈]]内で非[[文書]]として表示 (>>47)
し、こちらはここで終わります。
= [VAR[[[navigate]] する[[閲覧文脈]]]]が[[入れ子閲覧文脈]]の場合は、
その[[入れ子閲覧文脈]]の [[delaying [CODE(DOMe)@en[load]] events mode]] フラグを設定します。
= [[fetch]] またはそれに相当するもの (>>145) を実行します。
]FIG]
;; [224] [[素片識別子]]が無い [[URL]] なら、[[文書の番地]]と同じ [[URL]]
であっても、[[素片識別子]]への [[navigate]] ではなく通常の [[navigate]]
になります。
[214] 条件次第の処理方法の決定については、取扱器の処理の項 (>>26) も参照してください。
* fetch またはそれに相当するもの
[145] [[navigate]] は、 [[fetch]] やそれに相当する操作を次の通り行わなければ[['''なりません''']]。
[FIG(steps)[
= [146] [VAR[新しい[[資源]]]]に[[応答]]が含まれているなら、
== [201] [[process response]] を実行します [SRC[>>12]]。
== [202] [VAR[新しい[[資源]]]]に [[fetch]] が含まれていないなら、
=== [198] [[process response body]] を実行します。
=== [199] [[process response end-of-file]] を実行します。
= [147] それ以外で、 [VAR[新しい[[資源]]]]の [[URL]] の [[URL scheme]]
が [CODE(URI)@en[[[javascript:]]]] なら、
== [148] [CODE(URI)@en[[[javascript:]]]] [[URL]] の [[navigate]] を実行します [SRC[>>12]]。
([CODE(URI)@en[[[javascript:]]]] 参照。
なお [VAR[[[navigate]] する[[閲覧文脈]]]]、[VAR[新しい[[資源]]]]、
[VAR[[[始点閲覧文脈]]]]、[VAR[[[上書きURL]]]]
が [CODE(URI)@en[[[javascript:]]]] の [[navigate]] でも参照されます。)
== [154] [[非同期的]]に[[応答]]が得られるので、
=== これを[VAR[新しい[[資源]]]]の[[応答]]とします。
=== [[process response body]] を実行します。
=== [[process response end-of-file]] を実行します。
= [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[新しい[[資源]]]]が[[フォーム提出アルゴリズム]]からの呼び出しなら、
[[fetch]] の呼び出し元の[[起源]]は[VAR[[[始点閲覧文脈]]]]の[[活性文書]]の[[起源]]に (あれば)
します [SRC[>>12]]。
= [151] それ以外なら、 [[manual redirect flag]] 付きで[VAR[新しい[[資源]]]]の [[fetch]]
を呼び出します [SRC[>>12]]。
=- [152] [VAR[新しい[[資源]]]]の[[要求メソッド]]が非 [CODE(HTTP)@en[[[GET]]]] であるか、
[VAR[新しい[[資源]]]]が[[フォーム提出アルゴリズム]]からの呼び出しなら、
[[fetch]] の呼び出し元の[[起源]]は[VAR[[[始点閲覧文脈]]]]の[[活性文書]]の[[起源]]に (あれば)
します。
=- [153] それ以外で、 [VAR[[[navigate]] する[[閲覧文脈]]]]が[[子供閲覧文脈]]なら、
[[fetch]] の呼び出し元の[[起源]]は [VAR[[[navigate]] する[[閲覧文脈]]]]の[[閲覧文脈包含子]]の[[閲覧文脈適用範囲起源]]に (あれば) します。
= [155] いずれにせよ、[VAR[gone async]] が[[偽]]の場合、
[[navigate]] の呼び出し元へと制御を戻します。
[VAR[gone async]] は[[真]]に設定します。 [SRC[>>12]]
]FIG]
;; [196] ソースが指定されている場合 (>>202) は [[HTML Standard]] では明確な規定がありません。
すべてを同期的に実行するべきか、[[非同期的]]に実行するべきか不明です。
[156] [[process response]] は、次のようにしなければ[['''なりません''']]。
[FIG(steps)[
= 与えられた[[応答]]が[[リダイレクト]]なら、
==
[FIG(list)[
- [[リダイレクト]]先の [[URL]] が元の[VAR[新しい[[資源]]]]の [[URL]] と[[同じ起源]]
- [[要求メソッド]]が [CODE(HTTP)@en[[[POST]]]] か[[安全なメソッド]]
]FIG]
... の一方でも満たせば、
=== [[リダイレクト]]先の [[URL]] に[[素片識別子]]があれば、
==== その [[URL]] を[VAR[新しい[[資源]]]]の [[URL]] に設定します。 [SRC[>>12]]
=== それ以外なら、
==== [[リダイレクト]]先の [[URL]] に現在の[VAR[新しい[[資源]]]] の [[URL]] を
(あれば) 付け足し、これを[VAR[新しい[[資源]]]]に設定します。 [SRC[>>12]]
=== [[リダイレクト]]先の[[要求メソッド]]を[VAR[新しい[[資源]]]]の[[要求メソッド]]に設定します。
=== 改めて [[URL]] に基づく処理 (>>162) に移り、こちらはここで終わります [SRC[>>12]]。
== それ以外なら、
=== [[セキュリティー]]上の理由で [[navigate]] を停止したことを[[利用者]]に示しても構いません [SRC[>>12]]。
=== 後片付け (>>109) に移り、こちらはここで終わります [SRC[>>12]]。
= [VAR[新しい[[資源]]]]の[[応答]]を与えられた[[応答]]に設定します。
= '''Fallback in prefer-online mode''':
[FIG(list)[
- [VAR[新しい[[資源]]]]を [[AppCache]] から [[fetch]] した場合で、
- [VAR[新しい[[資源]]]]の[[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] で、
- [VAR[新しい[[資源]]]]の [[URL]] と[[同じ起源]]の [[URL]] を持つ [[relevant application cache]] があり、
- その [[AppCache]] [[エントリー]]のいずれかが[VAR[新しい[[資源]]]]の [[URL]] を持ち、
- ただしその[[エントリー]]は [[foreign]] ではなく、
- その [[mode]] が [[prefer-online]] であり、
- [VAR[取り消し]]フラグが理由 [[end-user abort]] で設定されておらず、
- [VAR[新しい[[資源]]]]の失敗フラグが設定されているなら、
]FIG]
== [[最適AppCache]]から[VAR[新しい[[資源]]]]の [[URL]] で識別されるエントリーを得ます [SRC[>>12]]。
== そのエントリーが [[foreign]] でないなら、
=== エントリーの[[応答]]を[VAR[新しい[[資源]]]]の[[応答]]とします [SRC[>>12]]。
=== [[process response body]] と [[process response end-of-file]]
をそれぞれ実行する[[タスク]]を[[ネットワークタスク源]]で[[タスクキュー]]に追加します。
=== [[利用者]]に対して失敗したこととキャッシュを使うことを示して構いません [SRC[>>12]]。
= '''Fallback for fallback entries''':
[FIG(list)[
- [VAR[新しい[[資源]]]]を [[AppCache]] から [[fetch]] しなかった場合で、
- [VAR[新しい[[資源]]]]の[[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] で、
- [VAR[新しい[[資源]]]]の [[URL]] が [[relevant application cache]] の [[fallback namespace]]
に一致する場合で、
- その[[最適AppCache]]の [[online whitelist]] に[VAR[新しい[[資源]]]]の [[URL]] と[[同じ起源]]の [[URL]] を持ち、[VAR[新しい[[資源]]]]の [[URL]] の先頭と一致するようなエントリーが無く、
- [VAR[取り消し]]フラグが理由 [[end-user abort]] で設定されておらず、
- [VAR[新しい[[資源]]]]の失敗フラグが設定されているなら、
]FIG]
== [[最適AppCache]]の [[fallback namespace]] に対する [[fallback resource]] を得ます [SRC[>>12]]。
== そのエントリーが [[foreign]] でないなら、
=== エントリーの[[応答]]を[VAR[新しい[[資源]]]]の[[応答]]とします [SRC[>>12]]。
=== [[process response body]] と [[process response end-of-file]]
をそれぞれ実行する[[タスク]]を[[ネットワークタスク源]]で[[タスクキュー]]に追加します。
=== [[利用者]]に対して失敗したことと [[fallback resource]] を使うことを示して構いません [SRC[>>12]]。
= [VAR[新しい[[資源]]]]の[[応答]]の処理 (>>26) を行います。
]FIG]
[157] [[process response body]] と [[process response end-of-file]] は、
[VAR[新しい[[資源]]]]の[[応答]]を処理 (>>26) の一部を構成するものです。
* 応答の処理
[26] [[navigate]] により [[fetch]] (相当) を行い、
[[HTTP]] や [[TLS]] 等の[[プロトコル]]から ([[MIME型]]以外の)
処理の指示と解釈できる[[メタデータ]]を与えられた場合には、
[[fetch]] (相当) の結果の処理ではなく、当該[[メタデータ]]に基づく処理を行います。
[25] [[HTML Standard]] はほとんど具体的な処理を規定せず、
いくつか例示するにとどまっていますが (プロトコル側で規定するべきと考えているのでしょう)、
次の処理が行われるようです。
[FIG(list)[
- [132] [[閲覧文脈]]外の処理 (>>48)
-- [134] [VAR[取り消し]]フラグが設定されていれば、何もしません。
-- [51] [[状態符号]] [CODE(HTTP)[[[204]]]] [SRC[>>12]] なら、何もしません。
-- [53] [CODE(HTTP)@en[[[Content-Disposition:]] [[attachment]]]] なら、
[[ダウンロード]]とし[['''なければなりません''']]。 [SRC[>>12]]
- [52] [[ネットワークエラー]]、[[TLS証明書]]エラー [SRC[>>12]] なら、非[[文書]]として表示 (>>47)
します。
- [54] [[状態符号]] [CODE(HTTP)[[[401]]]] で [[challenge]] があれば、
[[認証]]の[[モーダルダイアログ]]を表示します。
]FIG]
[27] ここで、[[利用者エージェント]]が認識できる [[challenge]] を含まない
[CODE(HTTP)[[[401]]]] [[応答]]は、 [CODE(HTTP)[[[200]]]]
[[応答]]同様に扱わなければ[['''なりません''']] [SRC[>>12]]。
[28] [[利用者エージェント]]は [CODE(HTTP)[[[401]]]] [[応答]]で認識できる [[challenge]]
を含む場合であっても、[[応答]]を表示した上で、
非[[モーダルダイアログ]]によって[[ログイン]]できるようにしても構いません [SRC[>>12]]。
[129] [[認証]]のための[[モーダルダイアログ]]の処理の規定は明確にはなされていません。
[[モーダルダイアログ]]表示中は [[navigate]] は完了しておらず、
次の [[fetch]] も同じ [[navigate]] 内で行われるとみられます。
[158] どの条件にも該当しなければ、[[MIME型]]依存の処理 (>>44)
を適用しなければ[['''なりません''']] [SRC[>>12]]。
* MIME 型依存の処理
[44] [[navigate]] により [[fetch]] (相当) を行い最終的に処理するべき[[資源]]が確定したら、
その[[資源]]の[[MIME型]]によって適切な処理を行います。
[45] ここで [[MIME型]]は、 [[sniffed MIME type]] を使わなければ[['''なりません''']]
[SRC[>>12]]。
;; [[MIME Sniffing]] の規定に基づき、 [[HTTP]] [CODE(HTTP)@en[[[Content-Type:]]]]
[[ヘッダー]]を無視することがあります。
[46] [[利用者エージェント]]は、[[MIME型]]と設定に基づき次のいずれかの処理を行わなければ[['''なりません''']] [SRC[>>12]]。
[FIG(list)[
- [[閲覧文脈]]内で[[文書]]を[[レンダリング]]する (>>30)
- [[閲覧文脈]]内で非[[文書]]を表示する (>>47)
- [[閲覧文脈]]に影響しない処理を行う (>>48)
]FIG]
[50] いずれを選択するかは実装や設定に依存します (>>206)。 [[HTML Standard]]
仕様上「設定により」となっており、完全には規定されていませんが、
実際上は任意の動作が許されているわけではありません。例えば
[CODE(MIME)@en[[[text/html]]]] を常に[[ダウンロード]]として扱うような実装は
[[Web互換]]とは言えません。
[68] [[著者]]は、[[Webブラウザー]]の実装や設定によって挙動が変わり得る
[[MIME型]]を使わないよう、使う場合は特定の挙動を仮定しないよう注意するべきでしょう。
[EG[
[69] 例えば [[PDF]] が[[プラグイン]]により表示されるか、[[外部アプリケーション]]により表示されるか仮定するべきではありません。
]EG]
* 閲覧文脈内の文書表示
[30] [[閲覧文脈]]内に内容を[[レンダリング]]する方法は、
次の各 [[MIME型]]について規定されています。
[FIG(list)[
- [31] [[HTML文書]]
-- [CODE(MIME)@en[[[text/html]]]] [SRC[>>12]]
- [32] [[XML文書]] (>>33 も参照)
-- [CODE(MIME)@en[[[application/xml]]]] [SRC[>>12]]
-- [CODE(MIME)@en[[[text/xml]]]] [SRC[>>12]]
-- [CODE(MIME)@en[[[image/svg+xml]]]] [SRC[>>12]]
-- [CODE(MIME)@en[[[application/xhtml+xml]]]] [SRC[>>12]]
-- [[明示的対応XML型]]以外の [[XML MIME型]] [SRC[>>12]]
- [35] [[平文]]
-- [CODE(MIME)@en[[[text/plain]]]] [SRC[>>12]]
- [37] [[媒体]]
-- 対応している[[画像形式]]、[[動画形式]]、[[音声形式]] [SRC[>>12]]
- [38] [[プラグイン]]
-- [[外部アプリケーション]]を使って[[閲覧文脈]]内に内容を[[レンダリング]]する型 [SRC[>>12]]
]FIG]
[42] [DFN[[RUBYB[明示的対応XML型]@en[explicitly supported XML type]]]]は、
内容を[[外部アプリケーション]]によって ([[プラグイン]]として[[閲覧文脈]]内に、または外部に) 表示するよう設定されている、
[[利用者エージェント]]が特別な処理を行う (例えば組み込みの[[フィードビューアー]]を使う)、
専用の取り扱い器がある (例えば[[登録済み内容取扱器]])
といったものを指します [SRC[>>12]]。
;; [216] 実際の[[Webブラウザー]]は、ごく限られた [[XML MIME型]]を除き、ほとんどの
[[XML MIME型]]を未対応として扱うことがあります。
;; [217] 実際の [[Webブラウザー]]は、いくつかの [[MIME型]]を[[テキストファイル]]として
[CODE(MIME)@en[[[text/plain]]]] 同様に[[レンダリング]]します。
[[テキストファイル]]を参照。
;; [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]]。
非 [[DOM]] 行内内容の場合 (>>47) も、次のように行う[['''べき''']]です。
[FIG(steps)[
= [135] [VAR[取り消し]]フラグが設定されていれば、何もしない処理 (>>48) に移り、こちらはここで終わります。
= [102] [CODE(DOMi)@en[[[Document]]]] を作成します [SRC[>>12]]。
= [103] [[MIME型]]などを設定します [SRC[>>12]]。
= [104] [[文書オブジェクトの初期化]]を実行します [SRC[>>12]]。
= [119] [VAR[新しい[[文書]]]]をこの[[文書]]に設定します。
= [105] [[構文解析器]]を作成し、[[文書]]を関連付けます [SRC[>>12]]。
= [181] [[上書きURL]]が設定されていれば、
== [182] [[文書の番地]]を[[上書きURL]]に設定します [SRC[>>12]]。
= [183] それ以外なら、
== [184] [[文書の番地]]を[VAR[新しい[[資源]]]]の [[URL]] に設定します [SRC[>>12]]。
= [192] [VAR[[[reload override flag]]]] が[[真]]なら、
== [193] [[文書]]の [[reload override flag]] を、[[真]]に設定します [SRC[>>191]]。
== [194] [[文書]]の [[reload override buffer]] を、[VAR[新しい[[資源]]]]の[[応答]]の[[本体]]の[[文字列]]に設定します [SRC[>>191]]。
= [197] [VAR[[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]が設定されていれば、
[[文書]]を[[[CODE(HTMLe)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]とします。
= [223] 必要があれば、[[ブラウザー拡張]]の[[内容スクリプト]]を実行します。
= [106] これより後、[[スクリプト]]の実行や [[stop parsing]] よりも前に、
(他のモードに移行 (>>33) したり[VAR[取り消し]]されたりしていなければ)
[[update the session history with the new page]] (>>95) を実行します [SRC[>>12]]。
]FIG]
[79] [[XML文書]]の場合[[タスクキュー]]に追加しなければならないと仕様書には明記されていませんが、
おそらくそうすることが想定されていると思われます。もっともそうしないとしても[[著者]]から違いを観測できるのか不明です。できたとしても困難と思われます。
[185] [[文書の番地]]は、[[リダイレクト]]を辿った場合には、最終的な [[URL]]
に設定されます。
[75] [[MIME型]]の設定においては、[[XML文書]]以外の時は[VAR[新しい[[文書]]]]の
[[HTML文書]]フラグを設定しなければ[['''なりません''']] [SRC[>>12]]。
[[プラグイン]]の時は[[プラグイン文書]]フラグを設定する[['''べきです''']] [SRC[>>12]]。
また[VAR[新しい[[文書]]]]の[[内容型]]を [[HTML文書]]なら [CODE(MIME)@en[[[text/html]]]] に、
[[平文]]なら [CODE(MIME)@en[[[text/plain]]]] に設定しなければ[['''なりません''']] [SRC[>>12]]。
[[媒体]]や[[プラグイン]]なら [[sniffed MIME type]] に設定する[['''べきです''']] [SRC[>>12]]。
;; [76] [[XML文書]]の場合の[[文書]]の[[内容型]]の設定の規定はなぜかありません。
[77] [[構文解析器]]は、 [[HTML文書]]なら[[HTML構文解析器]]、
[[XML文書]]なら[[XML構文解析器]]です。
ただし[[平文]]の場合は[[テキストファイルのDOM構築]]方法を使います。
[[媒体]]の場合は[[構文解析器]]のかわりに[[媒体文書]]のDOMを構築し、
[[プラグイン]]の場合は[[構文解析器]]のかわりに[[プラグイン文書]]のDOMを構築します。
非 [[DOM]] 行内内容の場合は[[構文解析器]]のかわりに任意の [[DOM]] を構築できます (>>84)。
;; [72] [[構文解析器]]は、 [[fetch]] によって得られた[[応答]]の [[MIME型]]に含まれる[[文字符号化]]の指定を入力として受け取ります。
ここでの [[MIME型]]は、 [[sniffed MIME type]] ではありません [SRC[>>12]]。
[71] [[process response body]] は、
ここで作成された[[構文解析器]]の[[入力バイト列]]に受信した[[バイト列]]を連結して、
適宜処理を行わなければ[['''なりません''']] [SRC[>>12]]。
[73] [[process response end-of-file]] は、[[構文解析器]]の入力として暗黙の [[EOF]]
文字を与えて処理させる[[ネットワークタスク源]]の[[タスク]]を[[キュー]]に追加しなければ[['''なりません''']]
[SRC[>>12]]。
[74] [[構文解析器]]は、構文解析中のいずれかのタイミングで[[文書の文字符号化]]を設定します。
[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]
;; [173] [[CSS]] などのない [[XML文書]] ([[unstyle document]])は、
その[[木構造]]が表示されますが、これは [[unstyled document view]] と呼ばれる [[DOM]]
の特別な表示モードなので、非文書表示モードではありません。
[94] [[媒体]]、[[プラグイン]]、 >>33 により非 [[DOM]] 表示に切り替える場合には、
仕様書上は [[navigate]] による [[fetch]] はそのまま放置され、
改めて [CODE(HTMLe)@en[[[img]]]] [[要素]]などで [[fetch]] が発生することになっています。
実際には [[Webブラウザー]]の[[キャッシュ]]により、あるいは何らかの特別な仕組みにより、
[[navigate]] による [[fetch]] の結果あるいは経過が[[媒体]]の表示処理や[[プラグイン]]等に引き渡される可能性もあります。
* 閲覧文脈内の非文書表示
[47] [[閲覧文脈]]内であっても [[DOM]] を[[レンダリング]]するのではなく、
専用ビューアーやエラーメッセージなど特別なものを表示する場合があります。
;; [49] 仕様書では[[閲覧文脈]]内に表示することを“[RUBYB[行内]@en[inline]]”と言っています。
[59] [[fetch]] (相当) を行う前にこちらの処理方法に移行する場合と、
[[fetch]] 結果をこちらの方法で処理する場合があります。
[EG[
[23] 例えば [[URL scheme]] に対応していないエラーを表示部に示す場合や、
[[登録済みプロトコル取扱器]]を[[利用者]]に選択する画面を表示部に示す場合があります。
(選択した取り扱い器を実行する場合は、 [[navigate]] を改めて実行することになります。)
[SRC[>>12]]
]EG]
[EG[
[60] 例えば大多数の [CODE(URI)@en[[[about:]]]] [[URL]] のように [[fetch]]
ではアクセスできない特別な [[Webページ]]を表示させる場合が該当するかもしれません。
[131] [CODE(URI)@en[[[http:]]]] [[URL]] から[[リダイレクト]]で [CODE(URI)@en[[[about:]]]]
[[URL]] が示された場合や [CODE(URI)@en[[[http:]]]] ページの[[ハイパーリンク]]からの
[[navigate]] のように、特別なページの表示は文脈によって認められないこともあります。
]EG]
[EG[
[39] 例えば内容を ([[DOM]] ではなく) 専用の方法で表示する場合、
[[MIME型]]に対応していないエラーを表示部に示す場合や、
[CODE(DOMm)@en[[[registerContentHandler]]]] で登録された取り扱い器を[[利用者]]に選択する画面を表示部に示す場合があります。
(選択した取り扱い器を実行する場合は、 [[navigate]] を改めて実行することになります。)
]EG]
[EG[
[81] [[Webブラウザー]]と[[MUA]]が統合された製品で、それぞれが別の[[窓]]を開くのではなく、
[[閲覧文脈]]内に [[MUA]] 機能が表示されるような場合は、 [[MUA]]
機能の表示は本項に該当しそうです。
]EG]
[EG[
[92] かつては[[ネットワークエラー]]を[[ダイアログ]]で表示する [[Webブラウザー]]もありましたが、
現在では多くの [[Webブラウザー]]が行内表示を使っています。
]EG]
[EG[
[93] 本来の内容の代わりに [[Safe Browsing]] エラーが[[閲覧文脈]]内に表示されることもあります。
]EG]
[EG[
[130] 仕様書上明記はされていませんが、[[リダイレクト]]ループを検出したら[[ネットワークエラー]]として表示する必要があります。
]EG]
[EG[
[203] [[入れ子閲覧文脈]]の深さが限界を超えたら、エラーページを表示するべきかもしれません。
]EG]
[83] 非 [[DOM]] の行内内容を[[閲覧文脈]]に表示する場合でも、[[文書]]の作成は
[[DOM]] の表示の場合と同じく行います (>>77)。
[84] [[DOM]] の構築の段階では、任意の[[DOM木]]を作成して構いません
([CODE(DOMi)@en[[[Document]]]] のみ でも構いません)。いずれにしても
[[AppCache選択アルゴリズム]]を[[マニフェスト]]無しで実行しておかなければ[['''なりません''']]。
また完了時に [[stop parsing]] を実行しなければ[['''なりません''']] [SRC[>>12]]。
[85] [[レンダリング]]は通常の規則で [[DOM]] を表示しても構いませんし、
特別な方法を使っても構いません [SRC[>>12]]。
[96] 仕様書上は [[navigate]] による [[fetch]] が行われた場合、そのまま放置されています。
実際には [[Webブラウザー]]の[[キャッシュ]]により、あるいは何らかの特別な仕組みにより、
[[navigate]] による [[fetch]] の結果あるいは経過が非 [[DOM]] 表示の処理へと引き渡される可能性もあります。
* 履歴と素片識別子の処理
** ページ遷移が行われなかった場合
[163] [[素片識別子]]への [[navigate]] は、次のように行わなければ[['''なりません''']]
[SRC[>>12]]。
[FIG(steps)[
= [165] [VAR[[[navigate]] する[[閲覧文脈]]]]の[[セッション履歴]]に、
新しい[[セッション履歴エントリーを挿入]]します。
[FIG(list members)[
[FIGCAPTION[
[[セッション履歴エントリー]]
]FIGCAPTION]
:[[URL]]:[VAR[新しい[[資源]]]]の [[URL]]
:[[文書]]:[VAR[[[navigate]] する[[閲覧文脈]]]]の[[活性文書]]
:[[題名]]:未設定
:その他:[VAR[新しい[[資源]]]]と [VAR[[[navigate]] する[[閲覧文脈]]]]の現在の状態による値
]FIG]
= [168] 新しいエントリーへ[[履歴を探索]]します。 [[non-blocking events]]
フラグを設定します。
= [169] 後片付け (>>109) に移ります。
]FIG]
;; [164] [[素片識別子へのスクロール]]は、[[履歴を探索]]する過程で行われます。
** ページ遷移が行われた場合
[95] [[閲覧文脈]]内に何らかの表示を行う場合には、ある程度処理が進んだ段階で
[DFN[[RUBYB[セッション履歴を新しいページで更新]@en[[[update the session history with the new page]]]]]]
[SRC[>>12]] が呼び出されます。
[97] これは、 [VAR[[[navigate]] する[[閲覧文脈]]]]の[[セッション履歴]]の[[現在エントリー]]の[[文書]]について、
次の通り処理する[[タスク]]を[[ネットワークタスク源]]で[[タスクキュー]]に追加しなければ[['''なりません''']] [SRC[>>12]]。
;; [99] [[navigate]] の[[引数]]である [VAR[[[navigate]] する[[閲覧文脈]]]]、[VAR[新しい[[資源]]]]、
[VAR[[[置換有効]]]]、[VAR[[[エントリー更新]]する[[エントリー]]]]と
[[navigate]] によって作成された[VAR[新しい[[文書]]]]を参照します。
また [[navigate]] の [VAR[[[mature]]]] フラグを設定します。
[FIG(steps)[
= [111] [VAR[[[文書]]]]について [[unload a document]] を実行します。 [VAR[recycle]] は[[偽]]とします。 [SRC[>>12]]
= [127] [VAR[取り消し]]フラグが設定されていれば、
== 後片付け (>>109) に移り、こちらはここで終わります。 [SRC[>>12]]
= [112] [VAR[[[エントリー更新]]する[[エントリー]]]]があるなら、
== [VAR[[[エントリー更新]]する[[エントリー]]]]の[[文書]]およびそれと同じ[[文書]]を参照する他の[[エントリー]]の[[文書]]を[VAR[新しい[[文書]]]]に変更します。 [SRC[>>12]]
== [VAR[[[エントリー更新]]する[[エントリー]]]]へ[[履歴を探索]]します。 [SRC[>>12]]
= [113] そうでないなら、
== [VAR[[[navigate]] する[[閲覧文脈]]]]の[[セッション履歴]]に新しい[[セッション履歴エントリーを挿入]]します [SRC[>>12]]。
[FIG(list members)[
[FIGCAPTION[
[[セッション履歴エントリー]]
]FIGCAPTION]
:[[URL]]:[[上書きURL]]か[VAR[新しい[[資源]]]]の [[URL]]
:[[navigate]] の引数の新しい[[資源]]の[[応答]]:[VAR[新しい[[資源]]]]の[[応答]] (あれば)
:[[文書]]:[VAR[新しい[[文書]]]] [SRC[>>12]]
:その他:関係する状態 [SRC[>>12]]
]FIG]
== 新しいエントリーへ[[履歴を探索]]します。[[置換有効]]フラグを引き渡します。 [SRC[>>12]]
= [114] [VAR[[[mature]]]] フラグを設定します。 [SRC[>>12]]
= [115] [VAR[[[navigate]] する[[閲覧文脈]]]]が[[入れ子閲覧文脈]]で
[[delaying [CODE(DOMe)@en[load]] events mode]] フラグが設定されている場合は、
これを削除します。 [SRC[>>12]]
]FIG]
;; [107] これは[VAR[新しい[[文書]]]]の[[レンダリングの開始]]のタイミングであり、
他の[[フレーム]]の[[スクリプト]]から[VAR[新しい[[文書]]]]にアクセスできるタイミングでもあります。
本アルゴリズムは[VAR[新しい[[文書]]]]自体の[[スクリプト]] (あれば) よりも前に実行されます (>>106)。
;; [187] [VAR[新しい[[資源]]]]の [[URL]] が指定されない時もありますが
([CODE(JS)@en[[[window.open]]]])、その場合の[[セッション履歴エントリー]]がどうなるかは不明です。
[CODE(URI)@en[[[about:blank]]]] または [[Webブラウザー]]依存のエラーページの [[URL]]
でしょうか。
[100] 更に、[[利用者エージェント]]は、 [VAR[[[mature]]]] フラグの設定後で[VAR[新しい[[文書]]]]が[[構文解析器]]を有し、
[[stop parsing]] よりも前で適切と認められるタイミングが一度でもあれば、
[[素片識別子にスクロール]]することになっています。これは、
[[ネットワークタスク源]]の[[タスク]]として[[タスクキュー]]に追加しなければ[['''なりません''']]。
[SRC[>>12]]
;; [101] 仕様書上は [VAR[[[mature]]]] とした後に[[スピン]]することになっていますが、
[[セッション履歴を新しいページで更新]]自体も[[素片識別子にスクロール]]する操作も任意のタイミングで行える規定になっているため、
実質的に[[スピン]]でない形と等価と思われます。仕様書が[[スピン]]により記述しているのは、
「適切と認められるタイミング」を厳密に表現するためでしょう。
[89] [[素片識別子にスクロール]]に成功するか、適切なタイミングが無いと判断した時点で、
[[navigate]] としての処理は完了です [SRC[>>12]]。後片付け (>>109) に移ります。
** 媒体文書やプラグイン文書の場合
[159] [[媒体文書]]や[[プラグイン文書]]として表示される場合には、
[[素片識別子]]が付いた [[URL]] が [CODE(HTMLa)@en[[[src]]]] [[属性]]に設定されることになりますから、
その[[要素]]の処理の一部として[[素片識別子]]が適用されることがあります。
[EG[
[160] 例えば[[動画]]の[[素片識別子]]で [CODE[[[t=]]]] が指定されていれば、
その位置から再生されます。
]EG]
;; [161] 理論上は[[媒体文書]]や[[プラグイン文書]]における[[文書の示された部分]]へと[[素片識別子にスクロール]]されることになりますが、
実際には[[媒体文書]]や[[プラグイン文書]]に示された部分は存在しないでしょうから、
そちらでは何も起こらないと思われます。
* 閲覧文脈外の処理
[48] [[閲覧文脈]]に影響せずに新しい[[資源]]を処理する場合もあります。
[133] [VAR[取り消し]]されていれば、何もしません。[VAR[取り消し]]されていなければ、
次の通り何らかの処理を実行します。
[FIG(short list)[
- 何もしない
- [[閲覧文脈]]以外にメッセージやエラーを表示
- [[ダウンロード]]
- [[証明書ダウンロード]]
- [[外部アプリケーション]]の起動
- 処理方法選択ダイアログの表示
]FIG]
;; [57] なお[[fetch]] (相当) を行う前にこちらの処理方法に移行する場合と、
[[fetch]] 結果をこちらの方法で処理する場合があります。
[[外部アプリケーション]]を起動する場合、前者なら [[URL]] を渡し、
後者なら [[fetch]] して得られたデータを渡すことになります。
[EG[
[29] 例えば [[fetch]] 前の時点で [[URL scheme]] に対応していないので無視する場合があります
[SRC[>>12]]。
]EG]
[EG[
[86] [[MUA]] が利用できない状態での [CODE(URI)@en[[[mailto:]]]] への [[navigate]] や、
特権を持たないページからの [CODE(URI)@en[[[about:]]]] や [CODE(URI)@en[[[chrome:]]]]
や [CODE(URI)@en[[[file:]]]] への [[navigate]] で何もせずに無視する実装があります。
;; [87] しかしそのような動作は不親切で好ましくないと思われます。
[CODE(URI)@en[[[mailto:]]]] へリンクするページは数多ありますが、
[[クリック]]しても何も起こらないのは何かが壊れているように見えます。
]EG]
[EG[
[58] [[fetch]] 前の時点で [[URL]] を[[外部アプリケーション]]に引き渡す場合
(例えば [CODE(URI)@en[[[mailto:]]]] [[URL]] を [[MUA]] に渡す場合 [SRC[>>12]]) があります。
]EG]
[EG[
[40] 例えば [[fetch]] 結果を[[外部アプリケーション]]によって処理したり、
未知の[[MIME型]]なので[[ダウンロード]]として処理したりします [SRC[>>12]]。
;; [56] 多くの [[Webブラウザー]]では、どう処理するか[[利用者]]に問い合わせる
(非モーダル) [[ダイアログ]]を表示します。
[EG[
[61] [[fetch]] した [[Word]] 文書を[[ワープロ]]アプリケーションに引き渡す場合があります
[SRC[>>12]]。
]EG]
]EG]
[EG[
[90] [[OS]] によっては、 ([CODE(URI)@en[[[http:]]]] [[URL]] も含め)
[[URL scheme]] や [[URL]] のパターンに対して処理する[[アプリケーション]]を登録できるものがあります。
その場合には、候補が1つならそれを起動したり、候補が複数なら候補リストを表示したりできます。
[[Webブラウザー]]自身が扱えるものなら、[[Webブラウザー]]か[[外部アプリケーション]]かも選択できたりします。
;; [91] [CODE(URI)@en[[[http:]]]] [[URL]] や [[HTML文書]]のすべてをそうした形で処理するのは、
[[Webブラウザー]]として実用的では無さそうです。一定期間選択結果を覚えておいたり、
同じ[[起源]]からの [[navigate]] なら無条件で [[Webブラウザー]]自身で処理することにしたりしないと、
頻繁に確認ダイアログを表示することになるかもしれません。
]EG]
[62] [[利用者エージェント]]は、[[外部アプリケーション]]に引き渡す場合は、
[[著者]]による対象ソフトウェアの悪用を防ぐよう努力する[['''べきです''']] [SRC[>>12]]。
[EG[
[63] 例えば、[VAR[[[始点閲覧文脈]]]]の[[活性文書]]の[[文書の起源]]が当該ソフトウェアを起動することを認められているかを[[利用者]]に確認させることができます [SRC[>>12]]。
]EG]
[64] 特に[[ポップアップ]]が認められない場合には、事前の[[利用者]]の確認無しで外部ソフトウェアを起動する[['''べきではありません''']] [SRC[>>12]]。
;; [67] [[外部アプリケーション]]の実行自体が[[ブラクラ]]となり得ます。
[[同じ起源]]や[[利用者]]により既に認められた[[起源]]であっても、
何度も重ねて起動することは抑制するべきでしょう。
また様々な異なる[[外部アプリケーション]]を次々と起動しようとすることも抑制するべきでしょう。
;; [80] ここでいう[[外部アプリケーション]]とは、実装方法によらず、[[閲覧文脈]]や[[ダウンロード]]など
[[Webブラウザー]]の機能以外を指すものと思われます。例えば [[Webブラウザー]]と [[MUA]]
が統合され同一[[プロセス]]で動作する製品があったとしても、
その [[MUA]] は[[外部アプリケーション]]と解釈するべきでしょう。
また[[ダウンロード]]や[[証明書ダウンロード]]のような [[Webブラウザー]]内の機能も、
[[ブラクラ]]化を防ぐなど類似した配慮が必要かもしれません。
[66] [[実行可能ファイル]]など、ダウンロード後の実行には特に注意しなければならない場合もあります。
;; [[ダウンロード]]も参照。
[128] いずれにせよ、[[閲覧文脈]]外の処理を開始したら、 (その完了を待たずに)
[[navigate]] としての処理は完了です。その時点で後片付け (>>109) に移ります。
* 取扱器による処理
[206] [[登録済み内容取扱器]]や[[登録済みプロトコル取扱器]]で適用可能なものがあれば、
それが使われることがあります。
ただしどの条件で使われるかや、使われる場合にどのような [[navigate]]
が行われるかの詳細は、 [[HTML Standard]] では規定されていません。
[207] 多くの [[Webブラウザー]]は、 [[URL]] の処理方法を次のように決定するようです。
[FIG(steps)[
= セキュリティー上の制限 (>>174) があれば、それに従うこととし、
こちらはここで終わります。
= [[Webブラウザー]]が扱える [[URL]] なら、通常の [[navigate]] を行うこととし、
こちらはここで終わります。
= [[Webブラウザー]]に登録されている[[登録済みプロトコル取扱器]]や
[[OS]] の[[プロトコル取扱器]]のうち、 [[URL scheme]]
が一致するものの一覧を取得します。順序は、実装方法や利用者の設定に依存します。
= 一覧が空の場合は、 [[URL scheme]] に対応していない旨のエラーを表すエラー文書を[[閲覧文脈]]に表示することとし、こちらはここで終わります。
= 実装や利用者の設定により既定の[[プロトコル取扱器]]を利用する場合は、
一覧の先頭の[[プロトコル取扱器]]を使うこととし、こちらはここで終わります。
= 一覧を非モーダルな[[ダイアログ]]として表示することにします。
]FIG]
;; [[登録済みプロトコル取扱器]]も参照。
[209] 多くの [[Webブラウザー]]は、 [[MIME型]]依存の処理方法を次のように決定するようです。
[FIG(steps)[
= [[Webブラウザー]]が扱える [[sniffed MIME type]] なら、通常の [[navigate]] を行うこととし、
こちらはここで終わります。
=
[FIG(list)[
- [213] [VAR[新しい[[資源]]]]の[[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] の場合 [SRC[>>210]] に、
- [212] [[Webブラウザー]]に登録されている[[登録済み内容取扱器]]で、
- [211] [[応答]]の [[sniffed MIME type]] の [CODE[[VAR[type]]/[VAR[subtype]]]]
部分 ([[引数]]なし) と[[登録済み内容取扱器]]の[[MIME型]]が同じ [SRC[>>210]] で、
]FIG]
... や、 [[OS]] の[[内容取扱器]]のうち [[MIME型]]が[[応答]]の [[sniffed MIME type]]
と一致するものの一覧を取得します。順序は、実装方法や利用者の設定に依存します。
= 一覧が空の場合は、[[ダウンロード]]として処理することとし、こちらはここで終わります。
= 実装や利用者の設定により既定の[[内容取扱器]]を利用する場合は、
一覧の先頭の[[内容取扱器]]を使うこととし、こちらはここで終わります。
= 一覧および「[[ダウンロード]]」の選択肢を非モーダルな[[ダイアログ]]として表示することにします。
]FIG]
;; [[登録済み内容取扱器]]も参照。
[208] [[Chrome]] では、[[登録済みプロトコル取扱器]]への [[navigate]]
が行われたら、元の[[文書の番地]]が[[文書のreferrer]]になるようです。
[[Firefox]] では、[[文書のreferrer]]は設定されないようです。
;; 他の [[fetch]] や [[navigate]] の[[引数]]が引き継がれるのかどうかは不明です。
* 取り消し処理
[138] [[利用者エージェント]]は、[[利用者]]が ([[取り消し]]フラグが設定されていない)
[[navigate]] を[RUBYB[取り消し]@en[cancel]]する手段を提供しても構いません [SRC[>>12]]。
あるいは[[利用者]]が他の [[navigate]] を開始できるようにしても構いません [SRC[>>12]]。
その場合の取り消しの [VAR[reason]] は [[end-user abort]] と思われます。
[139] [[navigate]] は、他の [[navigate]] や
[[traverse the history by a delta]] により取り消しされることもあります。
[166] [[navigate]] は、 [CODE(JS)@en[[[window.stop]]]] により取り消されることがあります。
[123] [[navigate]] を取り消す場合は、次のように処理しなければ[['''なりません''']]
[SRC[>>12]]。取り消しは、[[引数]]として事由 [VAR[reason]] と共に行います。
;; [137] が、現時点で [[HTML Standard]] は [VAR[reason]] を規定していません。
基本的には [[end-user abort]] か [[fatal]] に当たると思われます。
[FIG(steps)[
= [124] [VAR[取り消し]]フラグを設定します。
= [125] [VAR[新しい[[資源]]]]の [[fetch]] を実行中なら、これを [[terminate]] します
[SRC[>>12]]。 [VAR[reason]] を引き渡します。
= [126] [VAR[新しい[[文書]]]]があれば、[[文書のabort]] を実行します [SRC[>>12]]。
]FIG]
;; [136] [[navigate]] が取り消しされても、 [[navigate]] が呼び出されている
[[unload a document]] を完了させたり、後片付け (>>109) を実行したりする必要があり、
直ちに [[navigate]] 処理が停止されるわけではありません。
;; [144] [[navigate]] の結果[[ダウンロード]]に移行した場合、その[[ダウンロード]]処理は最早
[[navigate]] の一部ではないので、他の [[navigate]] から取り消されはしません。
* navigate の停止
[109] [VAR[[[navigate]] する[[閲覧文脈]]]]が[[入れ子閲覧文脈]]で
[[delaying [CODE(DOMe)@en[load]] events mode]] フラグが設定された場合は、
[[navigate]] の停止時にこれを削除しなければ[['''なりません''']]
[SRC[>>12]]。
;; 完全に実行して終了した場合も、途中で終了した場合や取り消された場合もこれが実行されます。
;; [110] 複数の [[navigate]] が同時に実行されることは (最初のチェック部分を除き)
ないはずなので、本フラグを設定する [[navigate]] は1つだけのはずですし、
本 [[navigate]] が設定していないのに他の [[navigate]] が設定していることもないはずです。
* 進捗表示
[140] [[navigate]] が開始してから停止するまでの間、 [[Webブラウザー]]は何らかの形で
[[navigate]] 中であることやその進捗を表示するのが普通です。
[141] 90年代には、[[アドレスバー]]の横に [[Webブラウザー]]の[[ロゴ]]などを表示し、
[[navigate]] 中には簡単な[[アニメーション]]を表示するのが一般的でした。
[[状態バー]]を設けて進捗の度合いや処理内容を表示することもありました。
[143] 既定の[[マウスポインター]]が(裏側で)処理中を表すものに変化する実装もありました。
[142] 現在は小さなアイコン程度の簡潔な表示が一般的です。[[タブ]]のボタン部分などに進捗度を表示することもあります。
@@ [205] [CODE(DOMi)@en[[[PerformanceNavigationTiming]]]]
* URL scheme による navigate 制限
[174] [[著者]]が発生させた [[navigate]] ([[スクリプト]]によるものの他、
[[利用者]]が[[ハイパーリンクを辿る]]ことにより発生したものを含みます。)
は、その前後の [[URL]] の [[URL scheme]] 等によって制限されることがあります。
[175] 制限される対象となる場合には、何も起こらなかったり、エラーが行内で表示されたりします。
[176] 制限されるのは、 [[navigate]] の呼び出し元 (?) の[[起源]]が特権を持たない場合で、
[VAR[新しい[[資源]]]]が特権を持つ場合です。ここでいう特権を持った[[起源]]の
[[URL]] とは、例えば
[FIG(list)[
- [[Webブラウザー]]の特別な機能を表す [[URL]]
-- ほとんどの [CODE(URI)@en[[[about:]]]] [[URL]]
-- [[Chrome]] の [CODE(URI)@en[[[chrome:]]]] [[URL]]
- [[ブラウザー拡張]]のための [[URL]]
-- [[Firefox]] の [CODE(URI)@en[[[chrome:]]]] [[URL]]
-- 特権を持った[[起源]]を持つ [CODE(URI)@en[[[jar:]]]] [[URL]]
-- [CODE(URI)@en[[[chrome-extension:]]]] [[URL]]
- [[ローカルファイル]]を表す [[URL]]
-- [CODE(URI)@en[[[file:]]]]
]FIG]
... のようなものをいいます。