<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージミューテックス<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">storage mutex</rt></rubyb></dfn>は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cookie</anchor> の書き込み等の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">競合状態</anchor>の回避のために使う<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ミューテックス</anchor>でした。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="42" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[42]</anchor-end> 仕様上の概念としては存在していましたが、技術的問題から現実には実装されていませんでした。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">競合状態</anchor>を正しく処理する実装方法を用意するために仕様上は残されていましたが、
今後実装される見込みもないため、2015年末に削除されました。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><strong>[1] <cite xml:lang="en-US-x-hixie">HTML Standard</cite>
( (<time>2012-03-28 21:58:58 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.whatwg.org/specs/web-apps/current-work/#storage-mutex">http://www.whatwg.org/specs/web-apps/current-work/#storage-mutex</anchor-external></strong></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="44" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[44]</anchor-end> <cite xml:lang="en-US">Fetch Standard</cite> (<time>2014-02-07 15:59:32 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://fetch.spec.whatwg.org/#basic-fetch">http://fetch.spec.whatwg.org/#basic-fetch</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <cite xml:lang="en-US-x-hixie">HTML Standard</cite> (<time>2012-03-28 21:58:58 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.whatwg.org/specs/web-apps/current-work/#obtain-the-storage-mutex">http://www.whatwg.org/specs/web-apps/current-work/#obtain-the-storage-mutex</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[34]</anchor-end> <cite xml:lang="en-US-x-hixie">HTML Standard</cite> (<time>2012-03-28 21:58:58 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.whatwg.org/specs/web-apps/current-work/#manually-releasing-the-storage-mutex">http://www.whatwg.org/specs/web-apps/current-work/#manually-releasing-the-storage-mutex</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[33]</anchor-end> <cite xml:lang="en-US-x-hixie">HTML Standard</cite> (<time>2012-03-28 21:58:58 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://www.whatwg.org/specs/web-apps/current-work/#threads">http://www.whatwg.org/specs/web-apps/current-work/#threads</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="37" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[37]</anchor-end> <cite xml:lang="en-US">XMLHttpRequest Standard</cite> (<time>2012-11-14 13:48:01 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://xhr.spec.whatwg.org/#dom-xmlhttprequest-send">http://xhr.spec.whatwg.org/#dom-xmlhttprequest-send</anchor-external></li></ul></refs></section><section><h1>処理モデル</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を1つ持って<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">構いません</strong></anchor>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>は、ある時点で<ul><li><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解放されている<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">free</rt></rubyb></li><li>特定の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント・ループ</anchor>が<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">所有<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">own</rt></rubyb>している</li><li>特定の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fetch</anchor> 算法の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実現値</anchor>が<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">所有<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">own</rt></rubyb>している</li></ul></p><p>... のいずれかの状態にあります。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal></src></p><section><h1>イベントループによる所有</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックスを得る<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">storage mutex</rt></rubyb></dfn>場合は次のように処理しなければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">なりません</strong></anchor>
<src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal></src>。<figure><ol><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 当該<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タスク</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント・ループ</anchor>が既に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を所有しているなら、
これらの手順から抜けます。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> そうでなければ、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント・ループ</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を取得できるまで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一時停止</anchor>します。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>の所有権を取得します。</li></ol></figure></p><section><h1>イベントループがストレージミューテックスを得る状況</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージミューテックスの取得</anchor>は次の状況で行われます。<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">document.cookie</anchor></code> の読み書き</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <code class="HTMLa" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">http-equiv</anchor></code> が <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set-Cookie</anchor></code> である <code class="HTMLe" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">meta</anchor></code>
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">要素</anchor>の処理</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <code class="DOMa" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">localStorage</anchor></code> の読み書き</li></ul></figure></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <code xmlns="http://www.w3.org/1999/xhtml" class="DOMa" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">sessionStorage</anchor></code> の読み書きには<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージミューテックス</anchor>は関与しません。</comment-p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="48" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[48]</anchor-end> その他<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>依存のタイミングで<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クッキー</anchor>を削除する場合
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">クッキー</anchor>参照。) にも取得する必要がありそうです (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベントループ</anchor>上の処理かどうかはわかりませんが...)。</comment-p></section></section><section><h1>fetch 算法による所有</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>は、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fetch</anchor> 算法の中で <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Set-Cookie:</anchor></code>
の処理のために<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">所有</anchor>され、処理が終わり次第解放されます。</p></section><section><h1>解放</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は次の場合に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージミューテックス</anchor>を<rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">解放<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">release</rt></rubyb>しなければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">なりません</strong></anchor>。<figure class="list"><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラグイン</anchor>を呼び出した時 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal></src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プラグイン</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>を呼び出した時 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal></src></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">fetch</anchor> 内での処理が終わった時 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;20</anchor-internal>)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">window.open</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">document.domain</anchor></code> で新しい値が設定される時</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">navigate</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">prompt to unload a document</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">unload a document</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="27" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[27]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント・ループ</anchor>で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タスク</anchor>を処理した直後</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="49" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[49]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">マイクロタスク</anchor>を処理した直後</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="28" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[28]</anchor-end> <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">alert</anchor></code>, <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">confirm</anchor></code>, <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">prompt</anchor></code> の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="29" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[29]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">printing steps</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="30" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[30]</anchor-end> <code class="DOMm" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">showModalDialog</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="31" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[31]</anchor-end> <code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">navigator.yieldForStorageUpdates</anchor></code></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="32" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[32]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">run a worker</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">算法</anchor>の途中</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="38" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[38]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XHR</anchor> <code class="DOMm" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">send</anchor></code> (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">同期フラグ</anchor>が設定されている場合) <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="37" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;37</anchor-internal></src></li></ul></figure></p><section><h1><code class="JS" xml:lang="en">navigator.yieldForStorageUpdates</code></h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="35" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[35]</anchor-end> <dfn><code class="JS" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">navigator.yieldForStorageUpdates</anchor></code></dfn>
(<code class="DOMi" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NavigatorStorageUtils</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターフェイス</anchor>の
<code class="DOMm" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">yieldForStorageUpdates</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">メソッド</anchor>) が呼び出されると、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は、そのメソッド呼び出しを行った<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">タスク</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">イベント・ループ</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を所有しているなら、
これを解放しなければ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">なりません</strong></anchor>。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="34" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;34</anchor-internal></src></p></section></section><section><h1>実装しない</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を実装しないことを選択しても構いません。
その場合、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>の取得や解放に関する要件は実装しなくて構いません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal></src></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を使わないと、あるサイトが複数の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">窓</anchor>から同時に
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cookie</anchor> や <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Storage</anchor> にアクセスした時にデータが壊れる危険性があります。
しかし<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を使うと、ある<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サイト</anchor>が <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Cookie</anchor> や
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Storage</anchor> を使うと他のすべての<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">サイト</anchor>がブロックされてしまうことから、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>全体の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">パフォーマンス</anchor>に大きく影響します。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>の実装者はこの2つの「evil」のどちらかを選択せざるを得ません。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal></src></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> これは <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Storage</anchor> が失敗だったとされる理由の一つです。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="36" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[36]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Web Storage</anchor> の仕様上、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>の実行途中に <code class="DOMa" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">localStorage</anchor></code>
の値は (その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>自身が予測できない形で) 変化することはない、とされています。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="33" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;33</anchor-internal></src>
しかし <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;4</anchor-internal> の通り<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージ・ミューテックス</anchor>を実装しないことを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">利用者エージェント</anchor>が選択しているなら、
これは保証されません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="43" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[43]</anchor-end> 現実にはすべての <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>がこの方法を選択しています <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;41</anchor-internal></src>。
すなわち<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージミューテックス</anchor>は仕様上にしか存在しません。
通常は実装されない仕様は削除されるものですが、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML Standard</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">編集者</anchor>である <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Ian Hickson</anchor>
は、データが破壊される可能性がある実装しか認められないのは好ましくないとして、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ストレージミューテックス</anchor>の仕様を残しています <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;40</anchor-internal></src>。</p></section></section><section><h1>歴史</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="45" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[45]</anchor-end> <cite xml:lang="en">Web Applications 1.0 r3705 Rename getStorageUpdates()</cite> (<time>2009-08-30 10:06:00 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://html5.org/tools/web-apps-tracker?from=3704&amp;to=3705">http://html5.org/tools/web-apps-tracker?from=3704&amp;to=3705</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="46" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[46]</anchor-end> <cite><strong>[</strong>whatwg<strong>]</strong> Storage mutex feedback</cite> (<time>2014-02-22 03:09:56 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-August/022458.html">http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-August/022458.html</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="39" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[39]</anchor-end> <cite><strong></strong>[<strong></strong>whatwg<strong></strong>]<strong></strong> localStorage, the storage mutex, document.domain, and workers</cite>
( (<time>2009-09-27 11:33:07 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-September/023059.html">http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2009-September/023059.html</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="47" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[47]</anchor-end> <cite><strong>[</strong>whatwg<strong>]</strong> localStorage feedback</cite> (<time>2014-02-22 03:12:29 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-December/024277.html">http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-December/024277.html</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="40" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[40]</anchor-end> <cite>IRC logs: freenode / #whatwg / 20140213</cite>
( (<time>2014-02-14 20:43:39 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://krijnhoetmer.nl/irc-logs/whatwg/20140213#l-39">http://krijnhoetmer.nl/irc-logs/whatwg/20140213#l-39</anchor-external></li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="41" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[41]</anchor-end> <cite xml:lang="en">Web Applications 1.0 r8503 Add a note pointing out that browsers haven't implemented the storage mutex.</cite>
( (<time>2014-02-22 07:18:00 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://html5.org/tools/web-apps-tracker?from=8502&amp;to=8503">http://html5.org/tools/web-apps-tracker?from=8502&amp;to=8503</anchor-external></li></ul></refs><section><h1>削除</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="50" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[50]</anchor-end> <cite xml:lang="en">Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf</cite>
(<time>2015-12-16 14:49:18 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3">https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="51" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[51]</anchor-end> <cite xml:lang="en">Remove navigator.yieldForStorageUpdates() due to lack of implementation · whatwg/html@c6fb03d</cite>
(<time>2015-12-16 14:53:13 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/whatwg/html/commit/c6fb03dc3d9396f3a3c7f62b1c5cba1ed73cd9c5">https://github.com/whatwg/html/commit/c6fb03dc3d9396f3a3c7f62b1c5cba1ed73cd9c5</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="52" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[52]</anchor-end> <cite xml:lang="en">Fix #45: remove references to the storage mutex · whatwg/xhr@2529712</cite>
(<time>2016-01-21 12:11:23 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/whatwg/xhr/commit/25297128a14c543c909a052b2933d2b0b72550d1">https://github.com/whatwg/xhr/commit/25297128a14c543c909a052b2933d2b0b72550d1</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="53" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[53]</anchor-end> <cite xml:lang="en">Fix #198: give precedence to custom Authorization headers · whatwg/fetch@9b18866</cite>
(<time>2016-01-22 23:28:25 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/whatwg/fetch/commit/9b188662ab3d0319fe6e5fc10f034a9f10f7b069">https://github.com/whatwg/fetch/commit/9b188662ab3d0319fe6e5fc10f034a9f10f7b069</anchor-external></p></section></section></body></html>