[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[[F[blob URL entry]]]]
を持つことができます [SRC[>>30]]。

[33] 値は [CODE[null]] か
[[blob URL entry]] です [SRC[>>30]]。

[HISTORY[
[95] かつては[DFN[[RUBYB[オブジェクト]@en[object]]]]と呼ばれ、
[[Blob URL Store]] に [[Blob URL]] が登録されていれば、その
[CODE(DOMi)@en[Blob]]、 
[CODE(DOMi)@en[MediaStream]] の[[構造化クローン]] [SRC[>>32]]、
そうでなければ [CODE[null]] でした。

[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記録]] [VAR[URL]]
の[[基本fetch]]は、次のようにしなければ[['''なりません''']] [SRC[>>37]]。

[FIG(steps)[
= [86] 
[VAR[blob]] を、
[VAR[URL]] の
[F[blob URL entry]]
の[F[オブジェクト]]に設定します。
= [39] [VAR[blob]] が [CODE[Blob]] で''ない''場合、
== [74] [[ネットワークエラー]]を返し、ここで停止します。
= [51] [[要求メソッド]]が [CODE(HTTP)@en[[[GET]]]] ''以外''の場合、
== [75] [[ネットワークエラー]]を返し、ここで停止します。
= [40] 新しい[[応答]]を作成し、返します。
[FIG(list members)[ [87] [[応答]]

: [F[状態メッセージ]] : [CODE[OK][200]]
:[[ヘッダーリスト]]:
[FIG(list)[
= [CODE(HTTP)@en[[[Content-Length]]]]: 
[VAR[blob]] の [CODE(DOMa)@en[[[size]]]]
= [CODE(HTTP)@en[[[Content-Type]]]]: 
[VAR[blob]] の [CODE(DOMa)@en[[[type]]]]
]FIG]
:[[HTTPS状態]]:[[要求]]の[[クライアント]]が [[null]] でなければ、その [[HTTPS状態]]
:[[本体]]:
[VAR[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>

[85] [[Firefox]] は
[CODE[blob:resource://pdf.js/77b77780-4e37-4b69-99b2-9d0c636ab46d?AttachedFile.txt]]
のような [[URL]] を使うようです。
[TIME[2019-03-26T09:40:16.000Z]]

[88] [CITE@en[Editorial: align with changes to URL and File API]]
([[mkruisselbrink]]著, [TIME[2019-01-15 18:42:32 +09:00]])
<https://github.com/whatwg/fetch/commit/939817ce80c08ac48232d8bce9ed1aca47567657>

[89] [CITE@en[Use definitions in FileAPI spec to resolve blob URLs and their origins. by mkruisselbrink · Pull Request #371 · whatwg/url]]
([TIME[2019-06-03 20:17:53 +09:00]])
<https://github.com/whatwg/url/pull/371>

[90] [CITE@en[there can be more than one Blob URL Store · Issue #290 · whatwg/url]]
([TIME[2019-06-03 20:18:22 +09:00]])
<https://github.com/whatwg/url/issues/290>

[91] [CITE@en[Origin of blob URLs doesn't match what implementations do · Issue #127 · whatwg/url]]
([TIME[2019-06-03 20:18:35 +09:00]])
<https://github.com/whatwg/url/issues/127>

[92] [CITE@en[Fix Blob Origin · Issue #20 · w3c/FileAPI]]
([TIME[2019-06-03 20:18:49 +09:00]])
<https://github.com/w3c/FileAPI/issues/20>

[93] [CITE@en["origin of a blob URL" is redundant/confusing · Issue #63 · w3c/FileAPI]]
([TIME[2019-06-03 20:19:12 +09:00]])
<https://github.com/w3c/FileAPI/issues/63>

[94] [CITE@en[Follow changes from whatwg/url#371. by mkruisselbrink · Pull Request #857 · whatwg/fetch]]
([TIME[2019-06-03 20:19:29 +09:00]])
<https://github.com/whatwg/fetch/pull/857>

[96] [CITE@en[Use File API to resolve blob: URLs and their origins]]
([[mkruisselbrink]]著, [TIME[2019-01-14 23:24:01 +09:00]])
<https://github.com/whatwg/url/commit/d2ef633869b3f31d8c7e3bb76602400e4d2c126c>

[97] [CITE@en[Origin of blob URLs doesn't match what implementations do · Issue #127 · whatwg/url]]
([TIME[2019-06-20 10:35:10 +09:00]])
<https://github.com/whatwg/url/issues/127>

[98] [CITE@en[there can be more than one Blob URL Store · Issue #290 · whatwg/url]]
([TIME[2019-06-20 10:40:35 +09:00]])
<https://github.com/whatwg/url/issues/290>

[99] [CITE@en[Fix Blob Origin · Issue #20 · w3c/FileAPI]]
([TIME[2019-06-20 10:41:01 +09:00]])
<https://github.com/w3c/FileAPI/issues/20>

[100] [CITE@en["origin of a blob URL" is redundant/confusing · Issue #63 · w3c/FileAPI]]
([TIME[2019-06-20 10:41:23 +09:00]])
<https://github.com/w3c/FileAPI/issues/63>

[101] [CITE@en[Use definitions in FileAPI spec to resolve blob URLs and their origins. by mkruisselbrink · Pull Request #371 · whatwg/url]]
([TIME[2019-06-20 10:42:17 +09:00]])
<https://github.com/whatwg/url/pull/371>