/
166.txt
338 lines (257 loc) · 15.2 KB
/
166.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
[3] [DFN[[CODE(URI)@en[[[blob:]]]] [[URL]]]] は [CODE(DOMi)@en[[[Blob]]]] や
[CODE(DOMi)@en[[[File]]]] を表すために使われます。
* 仕様書
[REFS[
- [2] '''[CITE[File API]] ([TIME[2011-05-18 03:16:07 +09:00]] 版) <http://dev.w3.org/2006/webapi/FileAPI/#url>'''
- [30] [CITE@en[URL Standard]] ([TIME[2015-07-07 17:17:42 +09:00]] 版) <https://url.spec.whatwg.org/#concept-url-object>
- [35] [CITE@en[URL Standard]] ([TIME[2015-07-07 17:17:42 +09:00]] 版) <https://url.spec.whatwg.org/#local-scheme>
- [32] [CITE@en[URL Standard]] ([TIME[2015-07-07 17:17:42 +09:00]] 版) <https://url.spec.whatwg.org/#concept-url-parser>
- [34] [CITE@en[URL Standard]] ([TIME[2015-07-07 17:17:42 +09:00]] 版) <https://url.spec.whatwg.org/#concept-url-origin>
- [37] [CITE@en-US[Fetch Standard]] ([TIME[2015-07-07 18:54:30 +09:00]] 版) <https://fetch.spec.whatwg.org/#concept-basic-fetch>
- [62] [CITE@en[Media Source Extensions™]] ([TIME[2016-11-17 04:05:37 +09:00]]) <https://w3c.github.io/media-source/#mediasource-object-url>
]REFS]
* 意味
[64] [CODE(DOMi)@en[Blob]] (やその[[サブクラス]]である [CODE(DOMi)@en[File]]) [SRC[>>2]]
や、 [CODE(DOMi)@en[MediaSource]] [SRC[>>62]] を表します。
* 構文
[14] [DFN[[[Blob URL]]]] は、 [[URL scheme]] [CODE(URI)@en[[[blob:]]]]
の後に[[起源]]、 [CODE[[[/]]]]、 [[UUID]] を続けたものです。
[[素片識別子]]を使うこともできます。 [SRC[>>2]]
[FIG(railroad)[
= [CODE(URI)@en[[[blob:]]]]
= [[起源]]
= [CODE[[[/]]]]
= [[UUID]]
= ?
== [CODE[#]]
== [[素片識別子]]
]FIG]
* 素片識別子
[27] [[素片識別子]]の処理は [[MIME型]]に依存します。
[[利用者エージェント]]が[[MIME型]]を認識できない時や当該[[資源]]中で意味が無い時は、
無視しなければ[['''なりません''']]。[[素片識別子]]は、
[[資源]]を識別するために使っては[['''なりません''']]。[SRC[>>2]]
* 生成
[10] [[Blob URL]] を生成する手順である
[DFN[[RUBYB[Blob URLの直列化]@en[Serialization of a Blob URL]]]]は、
次のようにしなければ[['''なりません''']] [SRC[>>2]]。
[FIG(steps)[
= [11] [VAR[結果]]を、[CODE(URI)@en[blob:]] に設定します。
= [69] [VAR[直列化]]を、[[現在設定群オブジェクト]]の[F[起源]]の[F[ASCII直列化]]に設定します。
= [70] [VAR[直列化]]が [CODE[null]] なら、
== [71] [VAR[結果]]の末尾に、[[実装定義]]の値を追加します。
= [72] それ以外なら、
== [73] [VAR[結果]]の末尾に、[VAR[直列化]]を追加します。
= [23] [VAR[結果]]の末尾に、 [CODE[/]] を追加します。
= [24] [VAR[UUID]] を、新しい [[RFC 4122]] [[UUID]] [[文字列]]に設定します。
= [13] [VAR[結果]]の末尾に、[VAR[UUID]] を追加します。
= [25] [VAR[結果]]を返します。
]FIG]
;; [21] [[実装定義]]とはいっても、他の[[起源]]と衝突しない値が期待されていると思われます。
* 起源
** Blob URL の生成時
[17] [[Blob URL]] の [[起源][URLの起源]]は、作成する[[メソッド]]が呼び出された時の[[現在設定群オブジェクト]]の[F[起源]]と同じでなければ[['''なりません''']] [SRC[>>2]]。
[18] 直列化した [[Blob URL]] の[[起源][URLの起源]]は、
[[起源]]の [[Unicode直列化]]でなければ[['''なりません''']] [SRC[>>2]]。
[20] [[File API]] 仕様書としては、 [CODE(URI)@en[[[http:]]]] と [CODE(URI)@en[[[https:]]]]
が[[起源]]の場合しか規定していません。 [CODE(URI)@en[[[file:]]]] [[URL]]
の[[起源]]は実装依存となっており、例えば
[CODE(URI)@en[blob:file:///Users/arunranga/702efefb-c234-4988-a73b-6104f1b615ee]]
は実装によっては妥当かもしれませんし、そうでないかもしれません。 [SRC[>>2]]
[19] [[Blob URL]] に対する [[cross-origin]] の[[要求]]は、[[ネットワークエラー]]としなければ[['''なりません''']] [SRC[>>2]]。
[63] [[MediaSource object URL]] の場合 ([CODE(DOMm)@en[createObjectURL]] で作成した場合)
にあっては、 [CODE(DOMm)@en[createObjectURL]] [[メソッド]]の [CODE(JS)@en[this]]
の[[関連設定群オブジェクト]] (の[[起源]]???)
が[[起源][URLの起源]]です。 [SRC[>>62]]
** Blob URL の利用時
[26] [CODE(URI)@en[[[blob:]]]] [[URL]] の[[起源]]は、 [[scheme data]]
を[[URLの構文解析]]した結果得られる [[URLの起源]]です。
[[構文解析]]に失敗する場合は、新しい[[大域的に固有な識別子]]です。 [SRC[>>34]]
* 分類
[36] [CODE(URI)@en[[[blob:]]]] [[URL scheme]] は、[[局所スキーム]]です [SRC[>>35]]。
* URL のオブジェクト
[31] [[URL構文解析器]]によって[[構文解析]]した [[URL]] は、
[DFN[[RUBYB[オブジェクト]@en[object]]]]を持つことができます [SRC[>>30]]。
[33] 通常は [[null]] です [SRC[>>30]] が、
[[Blob URL Store]] に [[Blob URL]] が登録されていれば、その
[CODE(DOMi)@en[Blob]]、
[CODE(DOMi)@en[MediaStream]] の[[構造化クローン]]となります [SRC[>>32]]。
[HISTORY[
[79] かつては [CODE(DOMi)@en[MediaSource]] にも使われていました。
]HISTORY]
[41] [[URLの構文解析]]の時点で [CODE(DOMi)@en[[[Blob]]]] との関連付けが行われることになりますから、
[[自動revoke]]や手動の [CODE(DOMm)@en[[[revokeObjectURL]]]] で [[Blob URL Store]]
から削除されたとしても、既に [[fetch]] が始まっていれば、その [[fetch]]
は成功するはずです。
* 作成
[15] [[Blob URL]] は、次の方法で作成できます。
[FIG(list short)[
- [CODE(JS)@en[[[URL.createObjectURL]]]]
[HISTORY[
- [CODE(JS)@en[[[URL.createFor]]]]
]HISTORY]
]FIG]
* fetch
[38] [CODE(URI)@en[[[blob:]]]] [[URL]] の[[基本fetch]]は、次のようにしなければ[['''なりません''']] [SRC[>>37]]。
[FIG(steps)[
= [39] 構文解析した [[URL]] の[F[オブジェクト]]が [CODE[Blob]] で''ない''場合、
== [74] [[ネットワークエラー]]を返し、ここで停止します。
= [51] [[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] ''以外''の場合、
== [75] [[ネットワークエラー]]を返し、ここで停止します。
= [40] 新しい[[応答]]を作成し、返します。
[FIG(list members)[
[FIGCAPTION[
[[応答]]
]FIGCAPTION]
: [F[状態メッセージ]] : [CODE[OK][200]]
:[[ヘッダーリスト]]:
[FIG(list)[
= [CODE(HTTP)@en[[[Content-Length]]]]: [[URL]] の[[オブジェクト]]である
[CODE(DOMi)@en[[[Blob]]]] の [CODE(DOMa)@en[[[size]]]]
= [CODE(HTTP)@en[[[Content-Type]]]]: [[URL]] の[[オブジェクト]]である
[CODE(DOMi)@en[[[Blob]]]] の [CODE(DOMa)@en[[[type]]]]
]FIG]
:[[HTTPS状態]]:[[要求]]の[[クライアント]]が [[null]] でなければ、その [[HTTPS状態]]
:[[本体]]:[[URL]] の[[オブジェクト]]である
[CODE(DOMi)@en[[[Blob]]]] の[[読み取り操作]]の結果
]FIG]
]FIG]
;; [48] 実際には[[読み取り操作]]は[[非同期的]]に結果を返すものですから、
[[応答]]も一度に返されるものではなく、[[非同期的]]に[[本体]]が完成してゆくものと考えるべきでしょう。
;; [46] [[読み取り操作]]はエラーになるかもしれません。 [[Fetch Standard]]
には明記されていませんが、他のプロトコルで[[応答]]の途中でエラーとなった場合同様に取り扱うべきと思われます。
;; [42] [[File API]] が[[参考]]として述べている [SRC[>>2]] 次の点は、 [[Fetch Standard]]
には反映されていないようです。これが意図的なものなのかどうか、実装はどうなっているのかは不明です。
[TIME[2015-07-08T12:32:12.00Z]]
[FIG(list)[
- [43] [DEL[[CODE(HTTP)@en[[[GET]]]] 以外の[[要求メソッド]]は、[[ネットワークエラー]]]]
- [45] [[異なる起源]]への要求なら[[ネットワークエラー]]
([CODE(JS)@en[[[document.domain]]]] により[[実効スクリプト起源]]が変化した場合)
- [44] [CODE(DOMi)@en[[[File]]]] の [CODE(DOMa)@en[[[name]]]] が
[CODE(HTTP)@en[[[Content-Disposition:]]]] [[ヘッダー]]の [CODE(MIME)@en[[[filename]]]]
[[引数]]となる
- [47] [[読み取り操作]]を行う前に [CODE(DOMi)@en[[[Blob]]]]
の[[読み取り可能性状態]]が [[closed]] なら、[[ネットワークエラー]]
]FIG]
* 破棄
[16] [[Blob URL]] は、次の方法で [[revoke]] できます。
[FIG(short list)[
- [CODE(JS)@en[[[URL.revokeObjectURL]]]]
]FIG]
[HISTORY[
[29] [CODE(DOMm)@en[[[createFor]]]] [[メソッド]]で作成された [[Blob URL]]
は、[[自動revoke]]の対象となります。
]HISTORY]
* 歴史
[28] 当初 [[Gecko]] は [DFN[[CODE(URI)@en[[[moz-filedata:]]]]]] [[URL scheme]]
を使っていました。
* 実装
[1] [CITE[url_constants.cc - chrome/common - Code Search]]
( ([TIME[2011-02-11 16:29:55 +09:00]] 版))
<http://www.google.co.jp/codesearch/p?hl=ja#hfE6470xZHk/chrome/common/url_constants.cc&q=package:chromium>
* 例
[4]
[PRE(URI example code)[
blob:550e8400-e29b-41d4-a716-446655440000#aboutABBA
]PRE]
[5] [[Chrome]] が [CODE(DOMm)@en[[[createObjectURL]]]] で返す例
[PRE(URI example code)[
blob:http://suika.fam.cx/6ff6e0e9-51d5-41e2-8752-411cbfc3fc7a
]PRE]
* メモ
[6] [CITE[IRC logs: freenode / #whatwg / 20140508]]
( ([TIME[2014-05-12 14:41:45 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20140508#l-839>
[7] [CITE@en[Blob URL Origin]]
( ([[Arun Ranganathan]] 著, [TIME[2014-05-10 06:29:40 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webapps/2014AprJun/0369.html>
[8] [CITE[Data URL loading is now controlled through a flag. Blob URLs have an ori... · 5b64685 · whatwg/fetch]]
( ([TIME[2014-06-03 03:28:22 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/5b64685a97a7d6f24814172de68399d0225a4cae>
[9] [CITE[Define fetching blob URLs part 1 · a53a57d · whatwg/fetch]]
( ([TIME[2014-07-03 07:38:52 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/a53a57dfc66911686488111d6cd19297cdb5c354#diff-8d4d847e6257b75f4bf8030496281de4L1105>
[12] [CITE@en[Reference File API's read operation https://www.w3.org/Bugs/Public/show_... · ecf0661 · whatwg/fetch]]
( ([TIME[2014-11-27 20:40:40 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/ecf06611c36b4beae4a50fd039957dd8f7238a22>
[FIG(quote)[
[FIGCAPTION[
[49] ([TIME[2015-07-18 08:10:31 +09:00]] 版)
<http://www.iana.org/assignments/uri-schemes/prov/blob>
]FIGCAPTION]
> (last updated 2015-07-17)
> Scheme name: blob
> Status: Provisional
]FIG]
[50] [CITE@en[Fix #125: only allow fetching blob URLs with `GET` · whatwg/fetch@53c071b]]
([TIME[2015-09-17 14:40:53 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/53c071b078bf345aaad7e9cbf2d1d425d53c82ef>
[52] [CITE@en[28925 – Append the hyperlink suffix to the URL before resolving]]
([TIME[2016-04-05 14:02:52 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=28925>
[53] [CITE@en[Make the Blob URL creating/revoking methods not be exposed on the ser… · w3c/FileAPI@b9c2275]]
([TIME[2016-04-16 15:35:20 +09:00]] 版)
<https://github.com/w3c/FileAPI/commit/b9c2275df53cf3a808f1f272f3d6134d1b920549>
[54] [CITE@en[1270451 – A Blob URL object's origin property should not be "null"]]
( ([TIME[2016-05-14 12:53:36 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=1270451>
[55] [CITE@en[Treat (valid) blob: URLs as local in the resource fetch algorithm]]
( ([[@zcorpan]]著, [TIME[2016-06-09 18:39:53 +09:00]]))
<https://github.com/whatwg/html/commit/f8bc379091f3afc71aa4133a05176a69bb01416e>
[56] [CITE@en[A URL's object can be a MediaSource or MediaStream object]]
( ([[annevk]]著, [TIME[2016-06-10 22:02:06 +09:00]]))
<https://github.com/whatwg/url/commit/1099bb20c056ed5226ee36f20296fe5850fe1cc9>
[57] [CITE@en[Allow for a URL record's object to be a MediaSource or MediaStream · Issue #126 · whatwg/url]]
( ([TIME[2016-06-12 12:39:33 +09:00]]))
<https://github.com/whatwg/url/issues/126>
[58] [CITE@en[Blob URLs for MediaStreams]]
( ([[Robert O'Callahan]] 著, [TIME[2012-10-09 14:26:15 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-media-capture/2012Oct/0023.html>
[59] [CITE@en-US[MediaStream API - Web API Interfaces | MDN]]
( ([TIME[2014-05-30 02:46:51 +09:00]] 版))
<https://developer.mozilla.org/en-US/docs/Web/API/MediaStream_API>
[60] [CITE@en[1279493 – Use blob URLs exclusively rather than having mediastream and mediasource URLs]]
( ([TIME[2016-06-12 12:41:04 +09:00]]))
<https://bugzilla.mozilla.org/show_bug.cgi?id=1279493>
[61] [CITE@en[Remove the GET method restriction for data URLs]]
([[annevk]]著, [TIME[2016-08-23 22:36:24 +09:00]])
<https://github.com/whatwg/fetch/commit/c4cb4f4a5fa90a72f1000449495aec04f6c8c96b>
[65] [CITE@en[Remove the URL.createFor method. (#62)]]
([[mkruisselbrink]]著, [TIME[2017-02-02 00:44:53 +09:00]])
<https://github.com/w3c/FileAPI/commit/c04e485a8d4eb93c62de873776b44a806b6e9c9c>
[66] [CITE@en[Fix several issues with the "Serialization of a Blob URL" algorithm. (#…]]
([[mkruisselbrink]]著, [TIME[2017-02-04 07:19:05 +09:00]])
<https://github.com/w3c/FileAPI/commit/b2e4c236d2015676e20e4bde52bce3d0ffc24a2f>
[22] [CITE@en[Refactor Blob URL Store definition. (#92)]]
([[mkruisselbrink]]著, [TIME[2018-01-10 04:11:42 +09:00]])
<https://github.com/w3c/FileAPI/commit/0fd8922f877b7701b9d364d9257c5d9d76971fae>
[67] [CITE[Clipboard API Improvements | WebKit]]
([TIME[2018-03-23 02:11:33 +09:00]])
<https://webkit.org/blog/8170/clipboard-api-improvements/>
[68] [CITE@en[Only allow blob: URLs that point to Blob objects]]
([[annevk]]著, [TIME[2018-04-18 20:58:25 +09:00]])
<https://github.com/whatwg/fetch/commit/8193ffef20b659a1ec1e6ae58831dd40fc08aad9>
[76] [CITE@en[fetch assumes a url's object is always a Blob · Issue #457 · whatwg/fetch]]
([TIME[2018-04-19 13:06:52 +09:00]])
<https://github.com/whatwg/fetch/issues/457>
[77] [CITE@en[Only allow blob: URLs that point to Blob objects by annevk · Pull Request #708 · whatwg/fetch]]
([TIME[2018-04-19 13:43:07 +09:00]])
<https://github.com/whatwg/fetch/pull/708>
[78] [CITE@en[Make status message default to the empty byte sequence]]
([[annevk]]著, [TIME[2018-04-25 01:21:13 +09:00]])
<https://github.com/whatwg/fetch/commit/0dec453f642c1fe57e6e7627c9a66cf7f8b8394d>
[80] [CITE@en[URL's object can no longer be a MediaStream]]
([[annevk]]著, [TIME[2018-04-21 01:40:56 +09:00]])
<https://github.com/whatwg/url/commit/21711b0c85bc489612a5e39473d525d903ead824>
[81] [CITE@en[Remove mention of MediaStream · Issue #380 · whatwg/url]]
([TIME[2018-04-25 11:31:50 +09:00]])
<https://github.com/whatwg/url/issues/380>
[82] [CITE@en[URL's object can no longer be a MediaStream by annevk · Pull Request #381 · whatwg/url]]
([TIME[2018-04-25 11:32:05 +09:00]])
<https://github.com/whatwg/url/pull/381>
[83] [CITE@en[Refactor Blob URL Store definition. (#92)]]
([[mkruisselbrink]]著, [TIME[2018-01-10 04:11:42 +09:00]])
<https://github.com/w3c/FileAPI/commit/0fd8922f877b7701b9d364d9257c5d9d76971fae>
[84] [CITE@en[Refactor Blob URL Store definition. by mkruisselbrink · Pull Request #92 · w3c/FileAPI]]
([TIME[2018-05-06 15:37:09 +09:00]])
<https://github.com/w3c/FileAPI/pull/92>