/
491.txt
497 lines (392 loc) · 35.1 KB
/
491.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
[107] [[Web]] において[[スクリプト]]の[[エラー]]は、 [DFN[[CODE(DOMe)@en[[[error]]]]]]
[[イベント]]として通知されます。この[[イベント]]が所定の手順で処理されない場合、
[[利用者]]に通知されます。
* 仕様書
[REFS[
- [13] '''[CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#report-the-error>'''
- [48] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#muted-errors>
- [49] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#create-a-script>
- [51] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#execute-the-script-block>
- [55] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#dom-workerglobalscope-importscripts>
- [61] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors-in-documents>
- [64] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#errorevent>
- [75] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors-0>
- [93] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#the-event-handler-processing-algorithm>
- [91] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#handler-onerror>
- [90] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#handler-workerglobalscope-onerror>
- [92] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#onerroreventhandler>
- [106] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2014-04-03 03:44:44 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#getting-the-current-value-of-the-event-handler>
- [140] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-11-22 09:02:55 +09:00]] 版) <https://html.spec.whatwg.org/#run-the-animation-frame-callbacks>
- [142] [CITE@en-US[DOM Standard]] ([TIME[2014-11-27 19:54:36 +09:00]] 版) <https://dom.spec.whatwg.org/#concept-event-listener-invoke>
- [143] [CITE@en-US[DOM Standard]] ([TIME[2014-11-27 19:54:36 +09:00]] 版) <https://dom.spec.whatwg.org/#notify-mutation-observers>
- [146] [CITE@en-US[Notifications API Standard]] ([TIME[2014-11-26 20:41:09 +09:00]] 版) <https://notifications.spec.whatwg.org/#dom-notification-requestpermission>
]REFS]
* エラーの処理
[108] [[スクリプト]]の構文解析の失敗や[[スクリプト]]内で[[例外]]が投げられてそれが [[catch]]
されない場合など、[[スクリプト]]の処理中に検出され[[スクリプト]]内で直接処理されなかった失敗が本項でいう[[エラー]]です。
[109] [[エラー]]はまず[[エラーの報告]]手順に引き渡されて、
[[エラー]]を処理するために事前に登録された[[スクリプト]]によって扱おうとします。
[110] そのような[[スクリプト]]が存在しない場合や、処理できないとされる場合、
エラー処理中にエラーが発生した場合には、このエラーを[[利用者]]に報告することができます。
;; [141] この2つのステップをまとめたものが「[[例外を報告]]」です。
(「[[エラーを報告]]」と紛らわしいので注意。) しかし次に示す通り「[[例外を報告]]」
を呼び出さずに「[[エラーを報告]]」が直接呼び出される場合もあります。
[57] 仕様書上の手順としてエラーがどのように処理されるかは、
エラーが静的 ([[構文解析]]、[[コンパイル]]等で検出されるエラー)
か動的 (実行時エラー、 [[catch]] されない[[例外]]など)
か、[[スクリプト]]が仕様書上どのように定義されているかによって異なります。
;; エラーがまず[[イベント]]として報告され、
そこで取り扱われなかったら[[利用者]] ([[開発者コンソール]]) に報告する、
という流れは共通ですが、細部が異なります。
[167] [[コード入口点に飛ぶ]]処理の結果[[例外の報告]]が呼び出されるかもしれません。
[59] [[イベントハンドラー]]の静的エラーについては、
[[get the current value of the event handler]] 手順から[[エラーの報告]]手順が呼び出されます。
([[イベントハンドラー]]の項を参照。)
;; [41] [[エラー]]が[[取り扱われなかった]]場合、呼び出し元である >>58, >>59
から[[利用者]]に[[エラー]]を報告して[['''構わない''']]とされています。
[139] [[イベントリスナー]] [SRC[>>142]] ([CODE(DOMm)@en[[[addEventListener]]]])、
[[変異観察器]] [SRC[>>143]]、
[[アニメーションフレームコールバック]] [SRC[>>140]] ([CODE(DOMm)@en[[[requestAnimationFrame]]]])、
[CODE(DOMm)@en[[[requestPermission]]]] [[コールバック]] [SRC[>>146]]
からの[[例外]]が[[捕捉]]されなかった場合は、
[[例外を報告]]しなければ[['''なりません''']]。
[159] [CODE[[[NextJob]]]] は、[[例外]]に終わったら、
[[例外を報告]]しなければなりません。
;; [CODE(JS)@en[[[Promise]]]] の[[コールバック]]の[[補足]]されない[[例外]]が該当します。
[60] [[ワーカー]]の静的エラーについては、
[[run a worker]] 手順により、[[実行時エラー]]と同じように処理されることになっています。
[76] [[ワーカー]]のスクリプトで [[catch]] されていないエラーが発生した時は、
[CODE(DOMi)@en[[[WorkerGlobalScope]]]] を[[対象]]として[[エラーを報告]]しなければ[['''なりません''']]。
それによって[[エラー]]が[[取り扱われなかった]]場合は、次のようにします。 [SRC[>>75]]
[FIG[
- [77] [[共有ワーカー]]の場合は、[[利用者]]に報告して[['''構いません''']]。 [SRC[>>76]]
- [78] [[専用ワーカー]]の場合は、次のような[[タスク]]を[[DOM操作タスク源]]で[[キュー]]に追加します。
-= [79] [[ワーカー]]に関連付けられた [CODE(DOMi)@en[[[Worker]]]] [[オブジェクト]]において
[CODE(DOMi)@en[[[ErrorEvent]]]] を[[発火]]します。
--- [80] [[trusted]] とします。
--- [81] [[イベント型]]は [CODE(DOMe)@en[[[error]]]] とします。
--- [82] [[bubble]] しません。
--- [83] [[キャンセル可能]]とします。
--- [84] [CODE(DOMa)@en[[[message]]]], [CODE(DOMa)@en[[[filename]]]], [CODE(DOMa)@en[[[lineno]]]],
[CODE(DOMa)@en[[[colno]]]] は適当に設定します。
--- [85] [CODE(DOMa)@en[[[error]]]] は [[null]] とします。
-= [86] >>79 で[[キャンセル]]されなければ、 [CODE(DOMi)@en[[[Worker]]]] の[[大域スコープ]]において [[catch]]
されていない実行時エラーが発生したこととします。
-- [87] [[ワーカー]]から [CODE(DOMi)@en[[[Worker]]]] への接続が解かれている場合
(親[[ワーカー]]が終端されている場合) には、 [CODE(DOMa)@en[[[event]]]] [[イベントハンドラー]]はなく、
[CODE(DOMa)@en[[[onerror]]]] は [[null]] であるとみなします。
]FIG]
;; [88] 従って[[専用ワーカー]]でのエラーは処理されなければ作成元をたどって結局最初の[[閲覧文脈]]に到達し、
そこから[[利用者]]へと通知されることになります。経路途中の[[ワーカー]]が破棄されている場合は >>87
によりスキップされます。
;; [89] >>84 は適当な値がどのようなものか明確になっていませんが、元の [CODE(DOMi)@en[[[ErrorEvent]]]]
と同じ値でいいのでしょうか。 (たとえ[[起源]]が違っていたとしても、 [CODE(DOMm)@en[[[postMessage]]]]
によって通信できる[[ワーカー]]からの情報なので、[[起源]]を超えた情報の漏洩には当たらないはずです。
[148] [[開発者ツール]]の[[コンソール]]から実行した[[スクリプト]]のエラーについて[[エラーの報告]]を呼び出すのは不適切でしょう。
[[ブラウザー拡張]]や [[WebDriver]] 等により実行された[[スクリプト]]のエラーも好ましくないと思われます。
しかし、それらが[[コールバック]]などを登録し、それが通常の方法 ([[イベント]]の [[dispatch]]
など) により実行されるのであれば、そのエラーについては[[著者]]による[[スクリプト]]のエラー同様に[[エラーの報告]]が行われることになります。
;; [149] ですから、[[著者]]はまったく想定しないエラーの報告を受ける可能性があります。
[HISTORY[
[58] かつては、[[スクリプトの作成]]手順によって作られる[[スクリプト]] (ほとんどの[[スクリプト]])
の静的エラーについては、
[[スクリプトの作成]]手順から[[エラーの報告]]手順が呼び出されていました。
現在はそこから呼び出される[[コード入口点に飛ぶ]]手順から[[例外の報告]]が呼び出されています。
[62] [CODE(DOMi)@en[[[Document]]]] と関連付けられた[[スクリプト]]で[[捕捉]]されていない実行時エラーが発生した時は、
[[例外を報告]]しなければ[['''なりません''']] [SRC[>>61]]。
;; [63] [CODE(DOMi)@en[[[Document]]]] と関連付けられた[[スクリプト]]というのが曖昧ですが、
[[ワーカー]]ではなく[[閲覧文脈]]内で実行されている[[スクリプト]]のことを指していると思われます。
しかし >>58 や >>59 で [[HTML]] 中で実行される[[スクリプト]]はカバーされています。
この規定はそれ以外の[[イベントリスナー]]や [[SVG]] の[[スクリプト]]などが対象なのでしょうか。
]HISTORY]
* 例外の報告
[16] [DFN[[RUBYB[[[例外を報告]]]@en[report the exception]]]]する場合、
[[例外]][VAR[例外]]について、次のようにしなければ[['''なりません''']] [SRC[>>61]]。
[FIG(steps)[
= [162] [VAR[スクリプト]]を、関係する[[スクリプト]]に設定します。
= [165] [VAR[エラー]]を、[[例外]][VAR[例外]]に設定します。
= [161] [[エラーの報告]]をします。
[FIG(list members)[
:[VAR[スクリプト]]: [VAR[スクリプト]]
:[VAR[エラー]]: [VAR[エラー]]
:[VAR[行]]と[VAR[列]]: [VAR[スクリプト]]を含む[[資源]]における問題の位置
:[VAR[対象]]: [VAR[スクリプト]]の[F[[[設定群オブジェクト]]]]の[F[[[大域オブジェクト]]]]
]FIG]
= [163] [VAR[エラー]]が取り扱われなかった場合、
== [164] [VAR[エラー]]を[[利用者]]に報告して構いません。
]FIG]
;; [166] 関係する[[スクリプト]]や問題の位置の特定方法は明確ではありません。[[実装の品質]]の問題かもしれません。
* エラーの報告
[157] エラーは、まず [CODE(DOMe)@en[[[error]]]] [[イベント]]によって[[著者]]の[[スクリプト]]に報告が試みられます。
その処理が[[エラーの報告]]です。
[12] [DFN[[RUBYB[[[エラーを報告]]]@en[report the error]]]] [SRC[>>13]]
する処理は、次の[[引数]]を受け取ります。
[FIG(list members)[
:[VAR[[RUBYB[スクリプト]@en[script]]]]: [[スクリプト]]です。
:[VAR[エラー]]: 報告するべき何らかのエラーです。
:[VAR[[RUBYB[行]@en[line]]]]、[VAR[[RUBYB[列]@en[col]]]]: [VAR[エラー]]が発生した位置です。
:[VAR[[RUBYB[対象]@en[target]]]]: [VAR[エラー]]を報告する[[イベント]]の[[対象]]とする[[オブジェクト]]です。
[[大域オブジェクト]]が使われます。
]FIG]
[151] 次のようにしなければ[['''なりません''']] [SRC[>>13]]。
[FIG(steps)[
= [14] [VAR[対象]]が[F[[[誤り報告モード]]]]なら、
== [152] エラーは[[取り扱われなかった]]とし、終わります。
= [15] [VAR[対象]]を[F[[[誤り報告モード]]]]に設定します。
= [21] [VAR[スクリプト]]の[F[[[エラーミュートフラグ]]]]が設定されていれば、
== [20] [VAR[イベント]]を、新しい [CODE(DOMi)@en[[[ErrorEvent]]]] に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[CODE(DOMi)@en[[[ErrorEvent]]]]
]FIGCAPTION]
:[26] [F[[[trusted]]]]: [[真]]
:[27] [F[[[bubble]]]]: [[偽]]
:[28] [F[[[取消可能]]]]: [[真]]
:[29] [F[[[イベント型]]]]: [CODE(DOMe)@en[[[error]]]]
:[31] [F[[CODE(DOMa)@en[[[filename]]]]]]: [[空文字列]]
:[23] [F[[CODE(DOMa)@en[[[lineno]]]]]]: [CODE[[[0]]]]
:[24] [F[[CODE(DOMa)@en[[[colno]]]]]]: [CODE[[[0]]]]
:[22] [F[[CODE(DOMa)@en[[[message]]]]]]: [DFN[[CODE[[[Script error.]]]]]]
:[25] [F[[CODE(DOMa)@en[[[error]]]]]]: [[null]]
]FIG]
= [30] そうでなければ、
== [17] [VAR[エラー]]が[[捕獲]]されなかった[[例外]]の場合、
=== [156] [VAR[エラーオブジェクト]]を、[VAR[エラー]]の[F[[[例外]]]]に設定します。
== [18] それ以外で、[VAR[エラー]]が [[JavaScript]] の[[エラー]]の場合、
=== [158] [VAR[エラーオブジェクト]]を、[VAR[エラー]]の
[F[[CODE(JS)@en[[[Error]]]] [[オブジェクト]]]]に設定します。
== [19] それ以外なら、
=== [160] [VAR[エラーオブジェクト]]を、 [[null]] に設定します。
== [153] [VAR[イベント]]を、新しい [CODE(DOMi)@en[[[ErrorEvent]]]] に設定します。
[FIG(list members middle)[
[FIGCAPTION[
[CODE(DOMi)@en[[[ErrorEvent]]]]
]FIGCAPTION]
:[F[[[trusted]]]]: [[真]]
:[F[[[bubble]]]]: [[偽]]
:[F[[[取消可能]]]]: [[真]]
:[F[[[イベント型]]]]: [CODE(DOMe)@en[[[error]]]]
:[32] [F[[CODE(DOMa)@en[[[filename]]]]]]: [VAR[スクリプト]]を得た[F[元の[[資源]]の[[絶対URL]]]]
:[34] [F[[CODE(DOMa)@en[[[lineno]]]]]]: [VAR[行]]
:[33] [F[[CODE(DOMa)@en[[[colno]]]]]]: [VAR[列]]
:[36] [F[[CODE(DOMa)@en[[[message]]]]]]: [VAR[エラー]]を説明する[[利用者エージェント]]定義の文字列
:[35] [F[[CODE(DOMa)@en[[[error]]]]]]: [VAR[エラーオブジェクト]]
]FIG]
= [37] [VAR[イベント]]を[VAR[対象]]において [[dispatch]] します。
= [38] [VAR[対象]]における[F[[[誤り報告モード]]]]を終えます。
= [39] [VAR[イベント]]が[F[[[取消]]]]されていれば、
== [154] [VAR[エラー]]は[[取り扱われた]]とします。
= [155] そうでなければ、
== [VAR[エラー]]は[[取り扱われなかった]]とします。
]FIG]
[40] 本手順を終えると[VAR[エラー]]は[DFN[[RUBYB[[[取り扱われた]]]@en[handled]]]]か[DFN[[RUBYB[[[取り扱われなかった]]]@en[not handled]]]]かのいずれかとなります。
;; この2状態は、[[約束の拒絶]]と同様のものです。
[42] この[[エラーの報告]]で[VAR[対象]]となる[[オブジェクト]]は、[[大域オブジェクト]]です。
言い換えると[[大域オブジェクト]]は[[エラー]]を報告する[[イベント]]の[F[[[対象]]]]オブジェクトとなります。
[[エラー]]を報告する[[イベント]]により他の[[スクリプト]]が起動されることがあるので、
[[対象]]は[F[[DFN[[RUBYB[[[エラー報告モード]]]@en[in error reporting mode]]]]フラグ]]を持っています。
[[エラーの報告]]による[[イベント]]の[[発火]]は[[エラー報告モード]]中には行われません。
;; [43] つまり [CODE(DOMa)@en[[[onerror]]]] 中の[[エラー]]によって [CODE(DOMa)@en[[[onerror]]]]
が[[再帰的]]に呼ばれることはなく、 ([[利用者エージェント]]が[[利用者]]に[[エラー]]を報告するなら)
必ず[[利用者]]に報告されることになります。
* エラーの位置
[44] [CODE(DOMi)@en[[[ErrorEvent]]]] には [CODE(DOMa)@en[[[filename]]]]、[CODE(DOMa)@en[[[lineno]]]]、
[CODE(DOMa)@en[[[colno]]]] という[[属性]]があり、エラーが発生した元の位置の [[URL]]、
[[行番号]]、[[列番号]]を表しています。
[45] [[HTML Standard]] は動的に作られた ([CODE(JS)@en[[[document.write]]]] などによる)
[[スクリプト]]であっても、また複数行にわたる[[イベントハンドラー]]などであっても、
[[利用者エージェント]]ががんばって位置を特定することをすすめています [SRC[>>13]]。
しかしその具体的な方法は規定されておらず、[[実装の品質]]の問題であると考えられます。
* エラーの起源
[46] 異なる[[起源]]の[[資源]]を[[スクリプト]]として ([CODE(HTMLe)@en[[[script]]]] [CODE(HTMLa)@en[[[src]]]]
などにより) 実行させることができますが、本来[[スクリプト]]ではない[[資源]]を実行させ、
エラーメッセージなどからその[[資源]]の内容の一部または全部を取得したり、
推測したりすることができてしまうと異なる[[起源]]の情報の流出源となってしまうため、
[[同一起源方針]]によってエラーの報告は制限されています。
[47] [[スクリプト]]の[DFN[[RUBYB[[[エラーミュート]]]@en[muted errors]]]]フラグ [SRC[>>48]]
が設定されていると、 [CODE(DOMi)@en[[[ErrorEvent]]]]
によって[[エラー]]が発生した事実は伝えられますが、その内容や位置にはアクセスできなくなります (>>21)。
[50] [[エラーミュートフラグ]]は、[[スクリプトの作成]]手順を呼び出す際に指定されていれば設定されます [SRC[>>49]]。
これは次の場合に設定されます。
[FIG[
- [52] [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[要素]]の [[execute a script block]] 手順によって[[スクリプトが作成]]される場合で、
[[スクリプト]]が [[fetch]] により得られた場合で、 [[CORS-cross-origin]] である場合 [SRC[>>51]]
- [53] [CODE(DOMm)@en[[[importScripts]]]] によって[[スクリプトが作成]]される場合で、
[[スクリプト]]が[[現職設定群オブジェクト]]と[[同一起源]]でない[[起源]]を持つ [[URL]] の[[資源]]から来た場合
[SRC[>>55]]
;; [56] 仕様書が存在しませんが、 [[SVG]] [CODE(XMLe)@en[[[script]]]] [[要素]]でも同様と思われます。
]FIG]
;; [54] つまり [CODE(HTMLe)@en[[[script]]]] [[要素]]では [[CORS]] によって[[同一起源ポリシー]]を緩和できます。
* [CODE(DOMi)@en[ErrorEvent]] インターフェイス (DOM)
[65] [DFN[[CODE(DOMi)@en[[[ErrorEvent]]]]]] [[インターフェイス]]は [CODE(DOMi)@en[[[Event]]]]
[[インターフェイス]]を[[継承]]した[[インターフェイス]]です。 [SRC[>>64]]
[66] 他の [CODE(DOMi)@en[[[Event]]]] と同様に、 [CODE(DOMi)@en[[[ErrorEvent]]]]
[[構築子]]を使って[[実現値]]を得ることができます。[[引数]]としては[[イベント型]]と、
省略可能で[[辞書]] ([CODE(DOMi)@en[[[EventInit]]]] を継承した
[DFN[[CODE(DOMi)@en[[[ErrorEventInit]]]]]]) によって各種オプションを指定できます。 [SRC[>>64]]
[67] [CODE(DOMi)@en[[[ErrorEvent]]]] は[[文書環境]]と[[ワーカー環境]]の両方に[[晒されています]] [SRC[>>64]]。
** メンバー
[68] [CODE(DOMi)@en[[[ErrorEvent]]]] は [CODE(DOMi)@en[[[Event]]]] のメンバーに加えて次のメンバーを持ちます。
いずれも初期値は[[空文字列]]、[[0]]、[[null]] のいずれか適切なものです [SRC[>>64]]。
[FIG[
- [72] [DFN[[CODE(DOMa)@en[[[colno]]]]]] ([CODE(DOMi)@en[[[unsigned long]]]])
- [73] [DFN[[CODE(DOMa)@en[[[error]]]]]] ([CODE(DOMi)@en[[[any]]]])
- [70] [DFN[[CODE(DOMa)@en[[[filename]]]]]] ([CODE(DOMi)@en[[[DOMString]]]])
- [71] [DFN[[CODE(DOMa)@en[[[lineno]]]]]] ([CODE(DOMi)@en[[[unsigned long]]]])
- [69] [CODE(DOMa)@en[[[message]]]] ([CODE(DOMi)@en[[[DOMString]]]])
]FIG]
[74] [[利用者エージェント]]によって[[発送]]される[[イベント]]に関しては、これらの値は >>20, >>79
のようにして決定されます。
* [CODE(DOMa)@en[onerror]] 属性 (DOM)
[99] [CODE(DOMi)@en[[[GlobalEventHandlers]]]] [[インターフェイス]] [SRC[>>91]]
と [CODE(DOMi)@en[[[WorkerGlobalScope]]]] [[インターフェイス]] [SRC[>>90]] の [DFN[[CODE(DOMa)@en[[[onerror]]]]]] は、
[CODE(DOMe)@en[[[error]]]] [[イベント]]に対応する[[イベントハンドラーIDL属性]]です。
[[IDL属性]]の型は [CODE(DOMi)@en[[[OnErrorEventHandler]]]] です。
;; [100] [CODE(DOMi)@en[[[GlobalEventHandlers]]]] [[インターフェイス]]は [CODE(DOMi)@en[[[Window]]]],
[CODE(DOMi)@en[[[Document]]]], [CODE(DOMi)@en[[[HTMLElement]]]] が[[実装]]しています。
[98] [DFN[[CODE(DOMi)@en[[[OnErrorEventHandler]]]]]] [SRC[>>92]] は、 [CODE(DOMi)@en[[[EventHandler]]]]
とほぼ同じ[[コールバック]]型ですが、[[引数]]として通常の[[イベントハンドラー]]のような
[CODE(DOMi)@en[[[Event]]]] 1つに加えて、 >>94 の場合も扱えるようになっています。
[101] [[HTML要素]]の [DFN[[CODE(HTMLa)@en[[[onerror]]]]]] [[属性]]は、
[CODE(DOMe)@en[[[error]]]] [[イベント]]に対応する[[イベントハンドラー内容属性]]です [SRC[>>91]]。
;; [102] [CODE(HTMLe)@en[[[body]]]] [[要素]]と [CODE(HTMLe)@en[[[frameset]]]] [[要素]]では、
これらの[[イベントハンドラーIDL属性]]と[[イベントハンドラー内容属性]]は[[要素]]自身ではなく [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]に対してのものとなります。
[103] [CODE(DOMe)@en[[[error]]]] [[イベント]]は[[エラーを報告]]するためのものと、
[[HTML要素]]などで用いられる通常の[[DOMイベント]]としてのものの2種類があります。
[CODE@en[[[onerror]]]] はそのどちらにも対応する[[イベントハンドラー]]であり、
>>98 の通り両方の形に対応していますし、次に示すように挙動も変わります。
[94] [[イベントハンドラー処理アルゴリズム]]は[[イベント]]が [CODE(DOMi)@en[[[ErrorEvent]]]]
で[[イベントハンドラーIDL属性]]が [CODE(DOMi)@en[[[OnErrorEventHandler]]]] として定義されている場合に、
[[コールバック]]の呼び出し時の[[引数]]を次のようにします。 [SRC[>>93]]
[FIG[
= [CODE(DOMa)@en[[[message]]]] [[属性値]]
= [CODE(DOMa)@en[[[filename]]]] [[属性値]]
= [CODE(DOMa)@en[[[lineno]]]] [[属性値]]
= [CODE(DOMa)@en[[[colno]]]] [[属性値]]
= [CODE(DOMa)@en[[[error]]]] [[属性値]]
]FIG]
;; [95] 他の場合には[[引数]]としては [CODE(DOMi)@en[[[Event]]]] だけが渡されますが、
この場合は [CODE(DOMi)@en[[[Event]]]] にはアクセスできません。
[96] [[イベントハンドラー処理アルゴリズム]]は[[イベント]]が [CODE(DOMi)@en[[[ErrorEvent]]]]
で[[イベント型]]が [CODE(DOMa)@en[[[error]]]] の時に、[[コールバック]]が返した値が
[[WebIDL]] [[boolean]] の[[真]]の値なら、[[イベント]]を[[キャンセル]]します。 [SRC[>>93]]
;; [97] 他の場合には逆に[[偽]]の値の時、[[キャンセル]]します。
[104] [[get the current value of the event handler]] は [CODE(HTMLe)@en[[[body]]]] [[要素]]や
[CODE(HTMLa)@en[[[frameset]]]] [[要素]]の [CODE(HTMLa)@en[[[onerror]]]]
[[内容属性]]の値を解釈するにあたり、
[CODE(DOMp)@en[[[event]]]], [CODE(DOMp)@en[[[source]]]], [CODE(DOMp)@en[[[lineno]]]],
[CODE(DOMp)@en[[[colno]]]], [CODE(DOMp)@en[[[error]]]] の5つの[[引数]]が順に与えられてるものとします。
[SRC[>>106]]
;; [105] 他の場合には [CODE(DOMp)@en[[[event]]]] のみとなります。
* 歴史
** 誕生
[129] [CODE(DOMa)@en[[[onerror]]]] は [[JavaScript 1.1]] で [CODE(DOMi)@en[[[Window]]]],
[CODE(DOMi)@en[[[Image]]]], [CODE(HTMLe)@en[[[img]]]] [[要素]]に追加されました [SRC[>>128]]。
;; [130] この頃はまだ [CODE(JS)@en[[[try]]]] もありませんでしたから、[[エラー]]を回避する唯一の方法でした。
;; [131] [CODE(HTMLe)@en[[[body]]]] [[要素]]にはまだなかったようです。
[132] この当時の定義では、初期値が [CODE(JS)@en[[[undefined]]]] で、値を [CODE(JS)@en[[[null]]]]
にするとエラーを[[利用者]]に報告しない、となっていました。
;; [133] 当時の [[Netscape Navigator]] は [[JavaScript]] エラーを必ず新しい[[窓]]に表示する仕様でした。
[134] >>128 には
[PRE(HTML example code)[
<IMG NAME="imageBad1" SRC="corrupt.gif" ALIGN="left" BORDER="2"
onError="null">
]PRE]
... によって画像のエラーの表示を抑制できるとあります。現在の仕様や実装だとエラーは直接[[利用者]]には提示されませんし、
このように [[null]] を書いたところで抑制(?)できません。
[135] また [CODE(HTMLe)@en[[[img]]]] のエラーの通知を (個々の [CODE(HTMLe)@en[[[img]]]] に指定せずとも)
[CODE(JS)@en[[[window.onerror]] = [[null]]]] によって無効化できたようです [SRC[>>128]]。
[REFS[
- [128] [CITE[Event Handlers]] ([TIME[2014-04-15 17:01:20 +09:00]] 版) <http://web.archive.org/web/20040615233210/http://devedge.netscape.com/library/manuals/2000/javascript/1.3/reference/handlers.html#1120097>
]REFS]
** 標準不在の時代
[11] [CITE[ryuzi_kambe の?D - onError="this.src=altimage";]] ([TIME[2007-06-08 01:22:17 +09:00]] 版) <http://d.hatena.ne.jp/ryuzi_kambe/20070221/p3>
[1] [CITE@ja[第五章 クライアントサイドの技術:エラー処理 (try...catch)]] ([TIME[2008-12-01 09:28:12 +09:00]] 版) <http://www.openspc2.org/JavaScript/Ajax/Ajax_study/chapter05/015/index.html>
>
このスクリプトが期待通り動作するのはInternet ExplorerとFirefoxのみです。Safari 2やOperaではwindow.onerrorの処理は無視されエラーが発生してしまいます。また、エラーメッセージやエラー行数に関しても Internet ExplorerとFirefoxでは内容が異なります(行数もカウント位置が違うため互換性がない)。
[2] [CITE[JavaScript掲示板]] ([TIME[2008-12-01 09:29:06 +09:00]] 版) <http://otd8.jbbs.livedoor.jp/javascript/bbs_plain?base=14946&range=1>
>> ただし、Opera(私のは最新より1つバージョン古い)はwindow.onerrorをハンドリングできませんでした。
>
ボクが使っているOperaは8.5ですが、ハンドリングできました(^_^;A
>> 私の環境では、onerrorからcallerをたどれるのはIEだけでした。
>> スタックトレースの取得は(以前かぱさんがしていたように)Exceptionコンストラクタの中でして、onerrorはそれがなかったとき補助的にした方がNetscape等もサポートできるはずです。
>
う~ん。私の環境(Mozilla1.7.12、Firefox1.5、Opera8.5、IE6.0、NN7.1)ではすべて取得できましたよ。
ただしOperaに関してだけは、エラーメッセージ中にスタックトレース情報が含まれていました。
また、NN(Mozilla系?)では、onerrorハンドラの第4引数に謎のスタックトレース情報が入ってきました!
(今はそれを使わずに自分でcallerを使って取り直していますが…)
[3] うちの [[Opera]] 9.61 でも window.onerror は効かないみたいですが。
[6] [CITE[機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記]]
( ([TIME[2013-05-17 04:25:50 +09:00]] 版))
<http://d.hatena.ne.jp/hasegawayosuke/20130517/p1>
** HTML5
[114] [[Web Applications 1.0]] (現在の [[HTML Standard]]) によって初めて[[エラーの報告]]の仕組みが詳細に記述されました。
[125] 最初に追加されたのは2004年8月28日のようです。 [[JavaScript 1.3]]
のドキュメントをもとにしていて [SRC[>>124]]、現在に比べるとまだ単純な定義しかありませんでした。
;; [122] >>121 の2004年9月23日付けが、[[Internet Archive]] に残っている [CODE(DOMa)@en[[[onerror]]]]
の定義を含む最古のものです。 (当時はまだ [[svn]] で管理されていませんでした。)
[REFS[
- [124] [CITE['''['''whatwg''']''' window.onerror]] ([TIME[2014-04-10 19:48:08 +09:00]] 版) <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2004-August/213847.html>
- [121] [CITE@en-GB-hixie[Web Applications 1.0]] ([TIME[2014-04-15 16:40:06 +09:00]] 版) <http://web.archive.org/web/20041009144718/http://www.whatwg.org/specs/web-apps/current-work/#onerror>
- [116] [CITE@en[Web Applications 1.0 r2550 Redefine onerror='' handling to be reusable from other specs.]] ([TIME[2008-12-24 05:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2549&to=2550>
- [120] [CITE@en[Web Applications 1.0 r2684 Bring the event handler attribute stuff in line with reality. Make onerror='' and .onerror make sense and compatible with legacy content.]] ([TIME[2009-01-21 18:09:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2683&to=2684>
- [118] [CITE@en[Web Applications 1.0 r2685 Define how the Window-magic event handler attributes like window.onload work. Tighten up the text around event handler attributes.]] ([TIME[2009-01-21 20:08:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2684&to=2685>
- [115] [CITE@en[Web Applications 1.0 r2807 Simplify window.onerror.]] ([TIME[2009-02-13 11:19:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2806&to=2807>
- [126] [CITE@en[Re: window.onerror initial value]] ([[Ian Hickson]] 著, [TIME[2009-02-13 11:19:52 +09:00]] 版) <http://lists.w3.org/Archives/Public/public-html/2009Feb/0292.html>
- [117] [CITE@en[Web Applications 1.0 r5828 report compile-time errors as well as runtime errors (and a typo fix from an earlier checkin)]] ([TIME[2011-02-04 06:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=5827&to=5828>
- [119] [CITE@en[Web Applications 1.0 r6263 Make worker errors propagate all the way up to the Document, hitting the global scope .onerror each step of the way. This isn't a great way to specify it but I couldn't work out a cleaner way that didn't involve major (potentially risky) surgery and inventing new terms. If it turns out that there are other things that'd need the parent/child infrastructure to be better defined I'll do it then.]] ([TIME[2011-06-22 06:20:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=6262&to=6263>
- [5] [CITE[''''''[''''''whatwg'''''']'''''' Spec for handling runtime script errors doesn't seem to match reality]]
( ([TIME[2013-01-08 04:45:11 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-January/038524.html>
]REFS]
[123] >>115 によって初期値が [CODE(JS)@en[[[undefined]]]] で [CODE(JS)@en[[[null]]]]
によってエラーを抑制できるという伝統的な定義から、初期値が [CODE(JS)@en[[[null]]]]
で特に意味を持たない現在の定義に改められました。 >>126 によると当時の実装状況に追随したようです。
;; [127] >>125 の当時の実装状況がどうだったのか、気になります。
** エラーイベントの拡張
[111] [[JavaScript 1.1]] 以来、なぜか [[URL]] と[[行番号]]しかありませんでしたが、
2012年に[[列番号]]が追加されました。
[REFS[
- [4] [CITE@en[Web Applications 1.0 r6957 Try adding a fourth argument, 'column', to onerror handlers.Fixing https://www.w3.org/Bugs/Public/show_bug.cgi?id=13319]]
( ([TIME[2012-02-01 08:36:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6956&to=6957>
- [7] [CITE@en[Web Applications 1.0 r8087 Rename 'ErrorEvent.column' to 'colno' to match IE.]]
( ([TIME[2013-07-26 08:42:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8086&to=8087>
]REFS]
[112] 2013年には、[[エラー]]のオブジェクト自体にも[[エラーイベント]]からアクセスできるように拡張されました。
[REFS[
- [8] [CITE@en[Web Applications 1.0 r8086 New argument to onerror: the Error object itself.]]
( ([TIME[2013-07-25 03:50:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8085&to=8086>
]REFS]
** DOM イベントとの統合
[113] 2013年には[[エラーの報告]]も特別な仕組みとしてではなく、[[DOMイベント]]の特別な場合として[[発送]]される形に変更されました。
[REFS[
- [9] [CITE@en[Web Applications 1.0 r7995 Revamp how errors are reported to be a little more sane and hopefully slightly closer to more browsers (but there's not a huge amount of interop here and so this won't exactly match anything). This is a very risky change so let me know if anything broke.]]
( ([TIME[2013-06-22 03:04:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7994&to=7995>
]REFS]
** 2013年以降
[REFS[
- [10] [CITE@en[Web Applications 1.0 r8239 Drop the ability to catch 'error' events from <iframe>, since nobody implemented it after 5 years.]]
( ([TIME[2013-10-24 03:48:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8238&to=8239>
- [136] [CITE@en[Bug 25522 – No need to special case onerror attribute event handler]]
( ([TIME[2014-06-06 11:51:34 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=25522>
- [137] [CITE@en[Bug 26182 – Introduce a method that invokes this algorithm]]
( ([TIME[2014-06-26 13:24:13 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=26182>
- [138] [CITE@en[Web Applications 1.0 r8849 Flesh out how rendering happens in the event loop. This also defines requestAnimationFrame() and obsoletes the 'Timing control for script-based animations' spec (by request of that spec's editors)]] ([TIME[2014-11-20 06:56:00 +09:00]] 版) <https://html5.org/r/8849>
- [144] [CITE@en[If an event listener callback throws, report the exception (window.onerr... · 55f7dbf · whatwg/dom]] ([TIME[2014-11-30 14:54:44 +09:00]] 版) <https://github.com/whatwg/dom/commit/55f7dbf200bfb63a26f66a3875dc6f9d402c7728>
- [147] [CITE@en[Exceptions thrown from mutation observer callbacks should be reported pe... · 2e567d3 · whatwg/dom]] ([TIME[2014-11-30 15:00:59 +09:00]] 版) <https://github.com/whatwg/dom/commit/2e567d3308724b29c9787bd069332775a3dbd8cc>
- [145] [CITE@en[Make sure any exceptions from requestPermission's callback are reported ... · 87f285e · whatwg/notifications]] ([TIME[2014-11-30 14:56:37 +09:00]] 版) <https://github.com/whatwg/notifications/commit/87f285ebd4bcc5fa423f1480a6bcbd16c70d6d98>
]REFS]
[150] [CITE[CVE-2015-1729(fixed by MS15-065) - masa’s memo]]
([TIME[2015-09-14 23:02:49 +09:00]] 版)
<http://d.hatena.ne.jp/masa141421356/20150914/1442239071>
[168] [CITE@en[Rewrite script execution on top of ES · whatwg/html@4891d18]]
([TIME[2015-12-22 23:54:49 +09:00]] 版)
<https://github.com/whatwg/html/commit/4891d18aaf2df1d40aa61f467a5a10cfc19dd85d>