[4] [CODE(DOMi)@en[[[window.URL]]]] [[オブジェクト]]の [DFN[[CODE(DOMm)@en[[[createObjectURL]]]]]]
[[メソッド]]は、与えられた [CODE(DOMi)@en[[[Blob]]]] を表す [[Blob URL]]
作成し、返します。

* 仕様書

[REFS[
- [11] '''[CITE[File API]] ([TIME[2015-04-17 16:25:21 +09:00]] 版) <https://w3c.github.io/FileAPI/#dfn-createObjectURL>'''
- [29] [CITE@en[Media Source Extensions™]] ([TIME[2016-11-17 04:05:37 +09:00]]) <https://w3c.github.io/media-source/#h-url>
]REFS]

* 処理

[12] 次のようにしなければ[MUST[なりません]]。
[FIG(steps)[
= [13] [VAR[オブジェクト]]を、必須の第1引数を
[CODE(DOMi)@en[Blob]] または [CODE(DOMi)@en[MediaSource]] と解釈した結果に設定します。
= [30] [VAR[オブジェクト]]により、
[FIG(switch)[
: [CODE(DOMi)@en[Blob]] [SRC[>>11]] :
[FIG(steps)[

= [14] 
[VAR[オブジェクト]]の[F[読み取り可能性状態]]が [CODE[[[CLOSED]]]] なら、
== [16] [VAR[オブジェクト]]の [F[Blob URLのUnicode直列化]]を返します。
= [15]
それ以外の場合、
== [21] [VAR[URL]] を、[VAR[オブジェクト]]の [F[Blob URLのUnicode直列化]]に設定します。
== [18] [[Blob URL Storeに項目を追加]]します。
[FIG(list members)[
: [F[URL]] : [VAR[URL]]
: [F[[CODE(DOMi)@en[Blob]]]] : [VAR[オブジェクト]]
]FIG]
== [17]
[VAR[URL]] を返します。

]FIG]
: [CODE(DOMi)@en[MediaSource]] [SRC[>>29]] :
[FIG(steps)[

= [31] 
[VAR[URL]] を、[VAR[オブジェクト]]の [F[MediaSource object URL]] に設定します。
== [21] 
[VAR[URL]] を、[VAR[オブジェクト]]の [F[Blob URLのUnicode直列化]]に設定します。
== [32] 
[[Blob URL Storeに項目を追加]]します。
[FIG(list members)[

: [F[URL]] : [VAR[URL]]
: [F[[CODE(DOMi)@en[Blob]]]] : [VAR[オブジェクト]]

]FIG]
== [33] 
[VAR[URL]] を返します。

]FIG]
]FIG]
]FIG]

;; [19] [CODE[[[CLOSED]]]] の場合、 [[URL]] は返されますが、
[[Blob URL Store]] には追加されていませんから、参照しても[[ネットワークエラー]]になります。

;; [34] [[MSE]] [[仕様書]]は[[猿パッチ]]のような形で [CODE(DOMi)@en[MediaSource]]
の場合を規定していて、あまり厳密な挙動が記述されていません。

@@ [27] [CODE(DOMi)@en[MediaStream]] からも作成できます。

* テストケース

[10] デモ:

[REFS[
- [3] [CITE[window.URL.createObjectURL]] ([TIME[2011-09-19 20:09:05 +09:00]] 版) <http://suika.fam.cx/~wakaba/-temp/test/dom/url/createobjecturl-1.html>
]REFS]

* 関連

[5] [[URL]] を破棄する [CODE(DOMm)@en[[[revokeURLObject]]]] [[メソッド]]もあります。

[20] [CODE(DOMm)@en[[[createFor]]]] とは違って、[[自動revoke]]は行われません。

;; [22] とはいえ[[文書のunload]]が行われる時には結局すべて破棄されます。
[[文書]]が [[unload]] されずに開かれ続けるなら[[メモリリーク]]ですが、
そうでなければ致命的な問題というわけではありません。


* 歴史

[6] [[Firefox]] 4 以降で [[prefix]] 無しで実装されています。

[REFS[
- [7] [CITE@en[Using files from web applications - MDN]] ([TIME[2011-09-19 19:56:34 +09:00]] 版) <https://developer.mozilla.org/en/Using_files_from_web_applications#Using_object_URLs>
]REFS]

[8] [[WebKit]] では [CODE(DOMi)@en[[[window.webkitURL]]]] で [[prefix]] 無しで実装されています。

[1] [[Firefox]] ではこんな値になりました [TIME[2011-09-19T11:10:32.200Z]]:
[PRE(URI example code)[
moz-filedata:71f89f18-c11d-496c-83c9-f24da88689a5
]PRE]

[2] [[Chrome]] ではこんな値になりました [TIME[2011-09-19T11:10:59.500Z]]
[PRE(URI example code)[
blob:http://suika.fam.cx/6ff6e0e9-51d5-41e2-8752-411cbfc3fc7a
]PRE]

;; [[起源]]を [[URL]] 内に入れておきたいという意図かな。

[9] [CITE@en[''''''[''''''FileAPI'''''']'''''' createObjectURL isReusable proposal]]
( ([[Adrian Bateman]] 著, [TIME[2011-12-14 09:52:04 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webapps/2011OctDec/1499.html>

* メモ

[23] [[イベントハンドラー内容属性]]では [CODE[URL]] が [CODE(JS)@en[[[document.URL]]]]
と解釈されてしまうので、
[FIG[
[PRE(HTML example code)[
<p onclick=" window.URL.createObjectURL (...) ">
]PRE]
]FIG]
... のように [CODE(JS)@en[window.]] を補う必要があります。

[24] [CITE@en[Make the Blob URL creating/revoking methods not be exposed on the ser… · w3c/FileAPI@b9c2275]]
([TIME[2016-04-16 15:33:34 +09:00]] 版)
<https://github.com/w3c/FileAPI/commit/b9c2275df53cf3a808f1f272f3d6134d1b920549>

[25] [CITE@en[Media Source Extensions]]
( ([TIME[2016-06-10 10:07:55 +09:00]]))
<https://w3c.github.io/media-source/#url>

[26] [CITE@en[Allow for a URL record's object to be a MediaSource or MediaStream · Issue #126 · whatwg/url]]
( ([TIME[2016-06-12 12:38:08 +09:00]]))
<https://github.com/whatwg/url/issues/126>

[28] [CITE@en[Media Source Extensions™]]
([TIME[2016-11-17 04:05:37 +09:00]])
<https://w3c.github.io/media-source/#h-url>

[35] [CITE@en[Revive createObjectURL? · Issue #404 · w3c/mediacapture-main]]
([TIME[2017-02-04 00:42:42 +09:00]])
<https://github.com/w3c/mediacapture-main/issues/404>

[36] [CITE@en[591719 - Blink::MediaStream Remove deprecated createObjectURL() - chromium - Monorail]]
([TIME[2017-02-04 00:48:13 +09:00]])
<https://bugs.chromium.org/p/chromium/issues/detail?id=591719>

[37] [CITE@en[1334564 – Deprecate and remove URL.createObjectURL(mediastream)]]
([TIME[2017-02-04 00:50:01 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1334564>

[38] [CITE@en[Bug 167518 – Deprecate and remove URL.createObjectURL(mediastream)]]
([TIME[2017-02-04 00:50:11 +09:00]])
<https://bugs.webkit.org/show_bug.cgi?id=167518>

[39] [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>

[40] [CITE@en[URL.createObjectURL should not work with MediaStream by annevk · Pull Request #10515 · w3c/web-platform-tests]]
([TIME[2018-04-18 23:04:44 +09:00]])
<https://github.com/w3c/web-platform-tests/pull/10515>

[41] [CITE@en[fetch assumes a url's object is always a Blob · Issue #457 · whatwg/fetch]]
([TIME[2018-04-19 13:07:28 +09:00]])
<https://github.com/whatwg/fetch/issues/457>

[42] [CITE@en[Revive createObjectURL? · Issue #404 · w3c/mediacapture-main]]
([TIME[2018-04-19 13:11:36 +09:00]])
<https://github.com/w3c/mediacapture-main/issues/404>

[43] [CITE@en[591719 - Blink::MediaStream Remove deprecated createObjectURL() - chromium - Monorail]]
([TIME[2018-04-19 13:32:56 +09:00]])
<https://bugs.chromium.org/p/chromium/issues/detail?id=591719>

[44] [CITE@en[800767 - Deprecate and Remove URL.createObjectURL for MediaStream - chromium - Monorail]]
([TIME[2018-04-19 13:33:17 +09:00]])
<https://bugs.chromium.org/p/chromium/issues/detail?id=800767&desc=2>

[45] [CITE@en[7e16825899d0362f71ff8d7585f54985d2d4c4ef - chromium/src - Git at Google]]
([TIME[2018-04-19 13:33:39 +09:00]])
<https://chromium.googlesource.com/chromium/src/+/7e16825899d0362f71ff8d7585f54985d2d4c4ef>

[46] [CITE@en[1334564 - Deprecate URL.createObjectURL(mediastream)]]
([TIME[2018-04-19 13:41:26 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1334564>

[47] [CITE@en[1454889 - Remove createObjectURL()'s MediaStream overload]]
([TIME[2018-04-19 13:42:28 +09:00]])
<https://bugzilla.mozilla.org/show_bug.cgi?id=1454889>

[48] [CITE@en[167518 – Deprecate and remove URL.createObjectURL(mediastream)]]
([TIME[2018-04-19 13:42:53 +09:00]])
<https://bugs.webkit.org/show_bug.cgi?id=167518>

[49] [CITE@en[Remove mention of MediaStream · Issue #380 · whatwg/url]]
([TIME[2018-04-25 11:32:00 +09:00]])
<https://github.com/whatwg/url/issues/380>