cleaning up (1)
This commit is contained in:
192
bower_components/observe-shim/docs/docco.css
vendored
Normal file
192
bower_components/observe-shim/docs/docco.css
vendored
Normal file
@@ -0,0 +1,192 @@
|
||||
/*--------------------- Layout and Typography ----------------------------*/
|
||||
body {
|
||||
font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
|
||||
font-size: 15px;
|
||||
line-height: 22px;
|
||||
color: #252519;
|
||||
margin: 0; padding: 0;
|
||||
}
|
||||
a {
|
||||
color: #261a3b;
|
||||
}
|
||||
a:visited {
|
||||
color: #261a3b;
|
||||
}
|
||||
p {
|
||||
margin: 0 0 15px 0;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
margin: 0px 0 15px 0;
|
||||
}
|
||||
h1 {
|
||||
margin-top: 40px;
|
||||
}
|
||||
hr {
|
||||
border: 0 none;
|
||||
border-top: 1px solid #e5e5ee;
|
||||
height: 1px;
|
||||
margin: 20px 0;
|
||||
}
|
||||
#container {
|
||||
position: relative;
|
||||
}
|
||||
#background {
|
||||
position: fixed;
|
||||
top: 0; left: 525px; right: 0; bottom: 0;
|
||||
background: #f5f5ff;
|
||||
border-left: 1px solid #e5e5ee;
|
||||
z-index: -1;
|
||||
}
|
||||
#jump_to, #jump_page {
|
||||
background: white;
|
||||
-webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;
|
||||
-webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;
|
||||
font: 10px Arial;
|
||||
text-transform: uppercase;
|
||||
cursor: pointer;
|
||||
text-align: right;
|
||||
}
|
||||
#jump_to, #jump_wrapper {
|
||||
position: fixed;
|
||||
right: 0; top: 0;
|
||||
padding: 5px 10px;
|
||||
}
|
||||
#jump_wrapper {
|
||||
padding: 0;
|
||||
display: none;
|
||||
}
|
||||
#jump_to:hover #jump_wrapper {
|
||||
display: block;
|
||||
}
|
||||
#jump_page {
|
||||
padding: 5px 0 3px;
|
||||
margin: 0 0 25px 25px;
|
||||
}
|
||||
#jump_page .source {
|
||||
display: block;
|
||||
padding: 5px 10px;
|
||||
text-decoration: none;
|
||||
border-top: 1px solid #eee;
|
||||
}
|
||||
#jump_page .source:hover {
|
||||
background: #f5f5ff;
|
||||
}
|
||||
#jump_page .source:first-child {
|
||||
}
|
||||
table td {
|
||||
border: 0;
|
||||
outline: 0;
|
||||
}
|
||||
td.docs, th.docs {
|
||||
max-width: 450px;
|
||||
min-width: 450px;
|
||||
min-height: 5px;
|
||||
padding: 10px 25px 1px 50px;
|
||||
overflow-x: hidden;
|
||||
vertical-align: top;
|
||||
text-align: left;
|
||||
}
|
||||
.docs pre {
|
||||
margin: 15px 0 15px;
|
||||
padding-left: 15px;
|
||||
}
|
||||
.docs p tt, .docs p code {
|
||||
background: #f8f8ff;
|
||||
border: 1px solid #dedede;
|
||||
font-size: 12px;
|
||||
padding: 0 0.2em;
|
||||
}
|
||||
.pilwrap {
|
||||
position: relative;
|
||||
}
|
||||
.pilcrow {
|
||||
font: 12px Arial;
|
||||
text-decoration: none;
|
||||
color: #454545;
|
||||
position: absolute;
|
||||
top: 3px; left: -20px;
|
||||
padding: 1px 2px;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.2s linear;
|
||||
}
|
||||
td.docs:hover .pilcrow {
|
||||
opacity: 1;
|
||||
}
|
||||
td.code, th.code {
|
||||
padding: 14px 15px 16px 25px;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
background: #f5f5ff;
|
||||
border-left: 1px solid #e5e5ee;
|
||||
}
|
||||
pre, tt, code {
|
||||
font-size: 12px; line-height: 18px;
|
||||
font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace;
|
||||
margin: 0; padding: 0;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------- Syntax Highlighting -----------------------------*/
|
||||
td.linenos { background-color: #f0f0f0; padding-right: 10px; }
|
||||
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
|
||||
body .hll { background-color: #ffffcc }
|
||||
body .c { color: #408080; font-style: italic } /* Comment */
|
||||
body .err { border: 1px solid #FF0000 } /* Error */
|
||||
body .k { color: #954121 } /* Keyword */
|
||||
body .o { color: #666666 } /* Operator */
|
||||
body .cm { color: #408080; font-style: italic } /* Comment.Multiline */
|
||||
body .cp { color: #BC7A00 } /* Comment.Preproc */
|
||||
body .c1 { color: #408080; font-style: italic } /* Comment.Single */
|
||||
body .cs { color: #408080; font-style: italic } /* Comment.Special */
|
||||
body .gd { color: #A00000 } /* Generic.Deleted */
|
||||
body .ge { font-style: italic } /* Generic.Emph */
|
||||
body .gr { color: #FF0000 } /* Generic.Error */
|
||||
body .gh { color: #000080; font-weight: bold } /* Generic.Heading */
|
||||
body .gi { color: #00A000 } /* Generic.Inserted */
|
||||
body .go { color: #808080 } /* Generic.Output */
|
||||
body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
|
||||
body .gs { font-weight: bold } /* Generic.Strong */
|
||||
body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
|
||||
body .gt { color: #0040D0 } /* Generic.Traceback */
|
||||
body .kc { color: #954121 } /* Keyword.Constant */
|
||||
body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */
|
||||
body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */
|
||||
body .kp { color: #954121 } /* Keyword.Pseudo */
|
||||
body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */
|
||||
body .kt { color: #B00040 } /* Keyword.Type */
|
||||
body .m { color: #666666 } /* Literal.Number */
|
||||
body .s { color: #219161 } /* Literal.String */
|
||||
body .na { color: #7D9029 } /* Name.Attribute */
|
||||
body .nb { color: #954121 } /* Name.Builtin */
|
||||
body .nc { color: #0000FF; font-weight: bold } /* Name.Class */
|
||||
body .no { color: #880000 } /* Name.Constant */
|
||||
body .nd { color: #AA22FF } /* Name.Decorator */
|
||||
body .ni { color: #999999; font-weight: bold } /* Name.Entity */
|
||||
body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
|
||||
body .nf { color: #0000FF } /* Name.Function */
|
||||
body .nl { color: #A0A000 } /* Name.Label */
|
||||
body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
|
||||
body .nt { color: #954121; font-weight: bold } /* Name.Tag */
|
||||
body .nv { color: #19469D } /* Name.Variable */
|
||||
body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
|
||||
body .w { color: #bbbbbb } /* Text.Whitespace */
|
||||
body .mf { color: #666666 } /* Literal.Number.Float */
|
||||
body .mh { color: #666666 } /* Literal.Number.Hex */
|
||||
body .mi { color: #666666 } /* Literal.Number.Integer */
|
||||
body .mo { color: #666666 } /* Literal.Number.Oct */
|
||||
body .sb { color: #219161 } /* Literal.String.Backtick */
|
||||
body .sc { color: #219161 } /* Literal.String.Char */
|
||||
body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */
|
||||
body .s2 { color: #219161 } /* Literal.String.Double */
|
||||
body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
|
||||
body .sh { color: #219161 } /* Literal.String.Heredoc */
|
||||
body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
|
||||
body .sx { color: #954121 } /* Literal.String.Other */
|
||||
body .sr { color: #BB6688 } /* Literal.String.Regex */
|
||||
body .s1 { color: #219161 } /* Literal.String.Single */
|
||||
body .ss { color: #19469D } /* Literal.String.Symbol */
|
||||
body .bp { color: #954121 } /* Name.Builtin.Pseudo */
|
||||
body .vc { color: #19469D } /* Name.Variable.Class */
|
||||
body .vg { color: #19469D } /* Name.Variable.Global */
|
||||
body .vi { color: #19469D } /* Name.Variable.Instance */
|
||||
body .il { color: #666666 } /* Literal.Number.Integer.Long */
|
||||
428
bower_components/observe-shim/docs/observe-shim.html
vendored
Normal file
428
bower_components/observe-shim/docs/observe-shim.html
vendored
Normal file
@@ -0,0 +1,428 @@
|
||||
<!DOCTYPE html> <html> <head> <title>observe-shim.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> observe-shim.js </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> <p>Copyright 2012 Kap IT (http://www.kapit.fr/)</p>
|
||||
|
||||
<p>Licensed under the Apache License, Version 2.0 (the 'License');
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at</p>
|
||||
|
||||
<pre><code> http://www.apache.org/licenses/LICENSE-2.0
|
||||
</code></pre>
|
||||
|
||||
<p>Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an 'AS IS' BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
Author : François de Campredon (http://francois.de-campredon.fr/),</p> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-2"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-2">¶</a> </div> <h1>Object.observe Shim</h1> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-3"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-3">¶</a> </div> <p><em>See <a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe">The harmony proposal page</a></em></p> </td> <td class="code"> <div class="highlight"><pre><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">global</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="s1">'use strict'</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-4"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-4">¶</a> </div> <h2>Utilities</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-5"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-5">¶</a> </div> <p>setImmediate shim used to deliver changes records asynchronously
|
||||
use setImmediate if available</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">setImmediate</span> <span class="o">=</span> <span class="nx">global</span><span class="p">.</span><span class="nx">setImmediate</span> <span class="o">||</span> <span class="nx">global</span><span class="p">.</span><span class="nx">msSetImmediate</span><span class="p">,</span>
|
||||
<span class="nx">clearImmediate</span> <span class="o">=</span> <span class="nx">global</span><span class="p">.</span><span class="nx">clearImmediate</span> <span class="o">||</span> <span class="nx">global</span><span class="p">.</span><span class="nx">msClearImmediate</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">setImmediate</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-6"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-6">¶</a> </div> <p>fallback on setTimeout if not</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">setImmediate</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">func</span><span class="p">,</span> <span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="nx">setTimeout</span><span class="p">(</span><span class="nx">func</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
|
||||
<span class="p">};</span>
|
||||
<span class="nx">clearImmediate</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">clearTimeout</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
|
||||
<span class="p">};</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-7"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-7">¶</a> </div> <h2>WeakMap</h2> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">PrivateMap</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">WeakMap</span> <span class="o">!==</span> <span class="s1">'undefined'</span><span class="p">)</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>use weakmap if defined</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">PrivateMap</span> <span class="o">=</span> <span class="nx">WeakMap</span><span class="p">;</span>
|
||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <p>else use ses like shim of WeakMap</p> </td> <td class="code"> <div class="highlight"><pre> <span class="cm">/* jshint -W016 */</span>
|
||||
<span class="kd">var</span> <span class="nx">HIDDEN_PREFIX</span> <span class="o">=</span> <span class="s1">'__weakmap:'</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1</span><span class="nx">e9</span> <span class="o">>>></span> <span class="mi">0</span><span class="p">),</span>
|
||||
<span class="nx">counter</span> <span class="o">=</span> <span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">getTime</span><span class="p">()</span> <span class="o">%</span> <span class="mi">1</span><span class="nx">e9</span><span class="p">,</span>
|
||||
<span class="nx">mascot</span> <span class="o">=</span> <span class="p">{};</span>
|
||||
|
||||
<span class="nx">PrivateMap</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
||||
<span class="k">this</span><span class="p">.</span><span class="nx">name</span> <span class="o">=</span> <span class="nx">HIDDEN_PREFIX</span> <span class="o">+</span> <span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1</span><span class="nx">e9</span> <span class="o">>>></span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="nx">counter</span><span class="o">++</span> <span class="o">+</span> <span class="s1">'__'</span><span class="p">);</span>
|
||||
<span class="p">};</span>
|
||||
|
||||
<span class="nx">PrivateMap</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span>
|
||||
<span class="nx">has</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="nx">key</span> <span class="o">&&</span> <span class="nx">key</span><span class="p">.</span><span class="nx">hasOwnProperty</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
|
||||
<span class="p">},</span>
|
||||
|
||||
<span class="nx">get</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">key</span> <span class="o">&&</span> <span class="nx">key</span><span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">];</span>
|
||||
<span class="k">return</span> <span class="nx">value</span> <span class="o">===</span> <span class="nx">mascot</span> <span class="o">?</span> <span class="kc">undefined</span> <span class="o">:</span> <span class="nx">value</span><span class="p">;</span>
|
||||
<span class="p">},</span>
|
||||
|
||||
<span class="nx">set</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="nx">value</span> <span class="o">:</span> <span class="k">typeof</span> <span class="nx">value</span> <span class="o">===</span> <span class="s1">'undefined'</span> <span class="o">?</span> <span class="nx">mascot</span> <span class="o">:</span> <span class="nx">value</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">writable</span> <span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">});</span>
|
||||
<span class="p">},</span>
|
||||
|
||||
<span class="s1">'delete'</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="k">delete</span> <span class="nx">key</span><span class="p">[</span><span class="k">this</span><span class="p">.</span><span class="nx">name</span><span class="p">];</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">};</span>
|
||||
|
||||
|
||||
<span class="kd">var</span> <span class="nx">getOwnPropertyName</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">getOwnPropertyNames</span><span class="p">;</span>
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nb">Object</span><span class="p">,</span> <span class="s1">'getOwnPropertyNames'</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">fakeGetOwnPropertyNames</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="nx">getOwnPropertyName</span><span class="p">(</span><span class="nx">obj</span><span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">name</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="nx">name</span><span class="p">.</span><span class="nx">substr</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">HIDDEN_PREFIX</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">HIDDEN_PREFIX</span><span class="p">;</span>
|
||||
<span class="p">});</span>
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">});</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <h2>Internal Properties</h2> </td> <td class="code"> <div class="highlight"><pre></pre></div> </td> </tr> <tr id="section-11"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-11">¶</a> </div> <p>An ordered list used to provide a deterministic ordering in which callbacks are called.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#observercallbacks">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">observerCallbacks</span> <span class="o">=</span> <span class="p">[];</span></pre></div> </td> </tr> <tr id="section-12"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-12">¶</a> </div> <p>This object is used as the prototype of all the notifiers that are returned by Object.getNotifier(O).
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#notifierprototype">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">NotifierPrototype</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">prototype</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>Used to store immediate uid reference</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">changeDeliveryImmediateUid</span><span class="p">;</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Used to schedule a call to _deliverAllChangeRecords</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">setUpChangesDelivery</span><span class="p">()</span> <span class="p">{</span>
|
||||
<span class="nx">clearImmediate</span><span class="p">(</span><span class="nx">changeDeliveryImmediateUid</span><span class="p">);</span>
|
||||
<span class="nx">changeDeliveryImmediateUid</span> <span class="o">=</span> <span class="nx">setImmediate</span><span class="p">(</span><span class="nx">_deliverAllChangeRecords</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">NotifierPrototype</span><span class="p">,</span> <span class="s1">'notify'</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">notify</span><span class="p">(</span><span class="nx">changeRecord</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">notifier</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">notifier</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'this must be an Object, given '</span> <span class="o">+</span> <span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">changeRecord</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">changeRecord</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'changeRecord must be an Object, given '</span> <span class="o">+</span> <span class="nx">changeRecord</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
|
||||
<span class="kd">var</span> <span class="nx">type</span> <span class="o">=</span> <span class="nx">changeRecord</span><span class="p">.</span><span class="nx">type</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">type</span> <span class="o">!==</span> <span class="s1">'string'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'changeRecord.type must be a string, given '</span> <span class="o">+</span> <span class="nx">type</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="kd">var</span> <span class="nx">changeObservers</span> <span class="o">=</span> <span class="nx">changeObserversMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">changeObservers</span> <span class="o">||</span> <span class="nx">changeObservers</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="kd">var</span> <span class="nx">target</span> <span class="o">=</span> <span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">,</span>
|
||||
<span class="nx">newRecord</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="s1">'object'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="nx">target</span><span class="p">,</span>
|
||||
<span class="nx">writable</span> <span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span> <span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">false</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">});</span>
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">prop</span> <span class="k">in</span> <span class="nx">changeRecord</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">prop</span> <span class="o">!==</span> <span class="s1">'object'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">changeRecord</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">newRecord</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="nx">value</span><span class="p">,</span>
|
||||
<span class="nx">writable</span> <span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span> <span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">false</span>
|
||||
<span class="p">});</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">preventExtensions</span><span class="p">(</span><span class="nx">newRecord</span><span class="p">);</span>
|
||||
<span class="nx">_enqueueChangeRecord</span><span class="p">(</span><span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">,</span> <span class="nx">newRecord</span><span class="p">);</span>
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span> <span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">});</span>
|
||||
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">NotifierPrototype</span><span class="p">,</span> <span class="s1">'performChange'</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">performChange</span><span class="p">(</span><span class="nx">changeType</span><span class="p">,</span> <span class="nx">changeFn</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">notifier</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">notifier</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'this must be an Object, given '</span> <span class="o">+</span> <span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">changeType</span> <span class="o">!==</span> <span class="s1">'string'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'changeType must be a string given '</span> <span class="o">+</span> <span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">changeFn</span> <span class="o">!==</span> <span class="s1">'function'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'changeFn must be a function, given '</span> <span class="o">+</span> <span class="nx">changeFn</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="nx">_beginChange</span><span class="p">(</span><span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">,</span> <span class="nx">changeType</span><span class="p">);</span>
|
||||
<span class="kd">var</span> <span class="nx">error</span><span class="p">,</span> <span class="nx">changeRecord</span><span class="p">;</span>
|
||||
<span class="k">try</span> <span class="p">{</span>
|
||||
<span class="nx">changeRecord</span> <span class="o">=</span> <span class="nx">changeFn</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="kc">undefined</span><span class="p">);</span>
|
||||
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">error</span> <span class="o">=</span> <span class="nx">e</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="nx">_endChange</span><span class="p">(</span><span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">,</span> <span class="nx">changeType</span><span class="p">);</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">error</span> <span class="o">!==</span> <span class="s1">'undefined'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="kd">var</span> <span class="nx">changeObservers</span> <span class="o">=</span> <span class="nx">changeObserversMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">changeObservers</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="kd">var</span> <span class="nx">target</span> <span class="o">=</span> <span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">,</span>
|
||||
<span class="nx">newRecord</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="s1">'object'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="nx">target</span><span class="p">,</span>
|
||||
<span class="nx">writable</span> <span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span> <span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">false</span>
|
||||
<span class="p">},</span>
|
||||
<span class="s1">'type'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="nx">changeType</span><span class="p">,</span>
|
||||
<span class="nx">writable</span> <span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span> <span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">false</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">});</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">changeRecord</span> <span class="o">!==</span> <span class="s1">'undefined'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">prop</span> <span class="k">in</span> <span class="nx">changeRecord</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">prop</span> <span class="o">!==</span> <span class="s1">'object'</span> <span class="o">&&</span> <span class="nx">prop</span> <span class="o">!==</span> <span class="s1">'type'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">changeRecord</span><span class="p">[</span><span class="nx">prop</span><span class="p">];</span>
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">newRecord</span><span class="p">,</span> <span class="nx">prop</span><span class="p">,</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="nx">value</span><span class="p">,</span>
|
||||
<span class="nx">writable</span> <span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span> <span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">false</span>
|
||||
<span class="p">});</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">preventExtensions</span><span class="p">(</span><span class="nx">newRecord</span><span class="p">);</span>
|
||||
<span class="nx">_enqueueChangeRecord</span><span class="p">(</span><span class="nx">notifier</span><span class="p">.</span><span class="nx">__target</span><span class="p">,</span> <span class="nx">newRecord</span><span class="p">);</span>
|
||||
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">enumerable</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span> <span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">});</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Implementation of the internal algorithm 'BeginChange'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#beginchange">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_beginChange</span><span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">changeType</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">getNotifier</span><span class="p">(</span><span class="nx">object</span><span class="p">),</span>
|
||||
<span class="nx">activeChanges</span> <span class="o">=</span> <span class="nx">activeChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">),</span>
|
||||
<span class="nx">changeCount</span> <span class="o">=</span> <span class="nx">activeChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">)[</span><span class="nx">changeType</span><span class="p">];</span>
|
||||
<span class="nx">activeChanges</span><span class="p">[</span><span class="nx">changeType</span><span class="p">]</span> <span class="o">=</span> <span class="k">typeof</span> <span class="nx">changeCount</span> <span class="o">===</span> <span class="s1">'undefined'</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="nx">changeCount</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <p>Implementation of the internal algorithm 'EndChange'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#endchange">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_endChange</span><span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">changeType</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">getNotifier</span><span class="p">(</span><span class="nx">object</span><span class="p">),</span>
|
||||
<span class="nx">activeChanges</span> <span class="o">=</span> <span class="nx">activeChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">),</span>
|
||||
<span class="nx">changeCount</span> <span class="o">=</span> <span class="nx">activeChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">)[</span><span class="nx">changeType</span><span class="p">];</span>
|
||||
<span class="nx">activeChanges</span><span class="p">[</span><span class="nx">changeType</span><span class="p">]</span> <span class="o">=</span> <span class="nx">changeCount</span> <span class="o">></span> <span class="mi">0</span> <span class="o">?</span> <span class="nx">changeCount</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>Implementation of the internal algorithm 'ShouldDeliverToObserver'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#shoulddelivertoobserver">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_shouldDeliverToObserver</span><span class="p">(</span><span class="nx">activeChanges</span><span class="p">,</span> <span class="nx">acceptList</span><span class="p">,</span> <span class="nx">changeType</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">doesAccept</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">acceptList</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">acceptList</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">accept</span> <span class="o">=</span> <span class="nx">acceptList</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">activeChanges</span><span class="p">[</span><span class="nx">accept</span><span class="p">]</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">accept</span> <span class="o">===</span> <span class="nx">changeType</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">doesAccept</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">return</span> <span class="nx">doesAccept</span><span class="p">;</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>Map used to store corresponding notifier to an object</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">notifierMap</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrivateMap</span><span class="p">(),</span>
|
||||
<span class="nx">changeObserversMap</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrivateMap</span><span class="p">(),</span>
|
||||
<span class="nx">activeChangesMap</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrivateMap</span><span class="p">();</span></pre></div> </td> </tr> <tr id="section-19"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-19">¶</a> </div> <p>Implementation of the internal algorithm 'GetNotifier'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#getnotifier">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_getNotifier</span><span class="p">(</span><span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">notifierMap</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">target</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">NotifierPrototype</span><span class="p">);</span></pre></div> </td> </tr> <tr id="section-20"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-20">¶</a> </div> <p>we does not really need to hide this, since anyway the host object is accessible from outside of the
|
||||
implementation. we just make it unwritable</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperty</span><span class="p">(</span><span class="nx">notifier</span><span class="p">,</span> <span class="s1">'__target'</span><span class="p">,</span> <span class="p">{</span> <span class="nx">value</span> <span class="o">:</span> <span class="nx">target</span> <span class="p">});</span>
|
||||
<span class="nx">changeObserversMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">notifier</span><span class="p">,</span> <span class="p">[]);</span>
|
||||
<span class="nx">activeChangesMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">notifier</span><span class="p">,</span> <span class="p">{});</span>
|
||||
<span class="nx">notifierMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">return</span> <span class="nx">notifierMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">target</span><span class="p">);</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-21"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-21">¶</a> </div> <p>map used to store reference to a list of pending changeRecords
|
||||
in observer callback.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">pendingChangesMap</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrivateMap</span><span class="p">();</span></pre></div> </td> </tr> <tr id="section-22"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-22">¶</a> </div> <p>Implementation of the internal algorithm 'EnqueueChangeRecord'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#enqueuechangerecord">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_enqueueChangeRecord</span><span class="p">(</span><span class="nx">object</span><span class="p">,</span> <span class="nx">changeRecord</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">getNotifier</span><span class="p">(</span><span class="nx">object</span><span class="p">),</span>
|
||||
<span class="nx">changeType</span> <span class="o">=</span> <span class="nx">changeRecord</span><span class="p">.</span><span class="nx">type</span><span class="p">,</span>
|
||||
<span class="nx">activeChanges</span> <span class="o">=</span> <span class="nx">activeChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">),</span>
|
||||
<span class="nx">changeObservers</span> <span class="o">=</span> <span class="nx">changeObserversMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">);</span>
|
||||
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">changeObservers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">observerRecord</span> <span class="o">=</span> <span class="nx">changeObservers</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span>
|
||||
<span class="nx">acceptList</span> <span class="o">=</span> <span class="nx">observerRecord</span><span class="p">.</span><span class="nx">accept</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">_shouldDeliverToObserver</span><span class="p">(</span><span class="nx">activeChanges</span><span class="p">,</span> <span class="nx">acceptList</span><span class="p">,</span> <span class="nx">changeType</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">observer</span> <span class="o">=</span> <span class="nx">observerRecord</span><span class="p">.</span><span class="nx">callback</span><span class="p">,</span>
|
||||
<span class="nx">pendingChangeRecords</span> <span class="o">=</span> <span class="p">[];</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">pendingChangesMap</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">observer</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="nx">pendingChangesMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">observer</span><span class="p">,</span> <span class="nx">pendingChangeRecords</span><span class="p">);</span>
|
||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<span class="nx">pendingChangeRecords</span> <span class="o">=</span> <span class="nx">pendingChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="nx">pendingChangeRecords</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">changeRecord</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="nx">setUpChangesDelivery</span><span class="p">();</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-23"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-23">¶</a> </div> <p>map used to store a count of associated notifier to a function</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">var</span> <span class="nx">attachedNotifierCountMap</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PrivateMap</span><span class="p">();</span></pre></div> </td> </tr> <tr id="section-24"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-24">¶</a> </div> <p>Remove reference all reference to an observer callback,
|
||||
if this one is not used anymore.
|
||||
In the proposal the ObserverCallBack has a weak reference over observers,
|
||||
Without this possibility we need to clean this list to avoid memory leak</p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_cleanObserver</span><span class="p">(</span><span class="nx">observer</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">observer</span><span class="p">)</span> <span class="o">&&</span> <span class="o">!</span><span class="nx">pendingChangesMap</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">observer</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="kd">var</span> <span class="nx">index</span> <span class="o">=</span> <span class="nx">observerCallbacks</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">index</span> <span class="o">!==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">observerCallbacks</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-25"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-25">¶</a> </div> <p>Implementation of the internal algorithm 'DeliverChangeRecords'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#deliverchangerecords">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_deliverChangeRecords</span><span class="p">(</span><span class="nx">observer</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">pendingChangeRecords</span> <span class="o">=</span> <span class="nx">pendingChangesMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="nx">pendingChangesMap</span><span class="p">.</span><span class="k">delete</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">pendingChangeRecords</span> <span class="o">||</span> <span class="nx">pendingChangeRecords</span><span class="p">.</span><span class="nx">length</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">try</span> <span class="p">{</span>
|
||||
<span class="nx">observer</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="kc">undefined</span><span class="p">,</span> <span class="nx">pendingChangeRecords</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
|
||||
|
||||
<span class="nx">_cleanObserver</span><span class="p">(</span><span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
|
||||
<span class="p">}</span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>Implementation of the internal algorithm 'DeliverAllChangeRecords'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_internals#deliverallchangerecords">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="kd">function</span> <span class="nx">_deliverAllChangeRecords</span><span class="p">()</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">observers</span> <span class="o">=</span> <span class="nx">observerCallbacks</span><span class="p">.</span><span class="nx">slice</span><span class="p">();</span>
|
||||
<span class="kd">var</span> <span class="nx">anyWorkDone</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">observers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">observer</span> <span class="o">=</span> <span class="nx">observers</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">_deliverChangeRecords</span><span class="p">(</span><span class="nx">observer</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="nx">anyWorkDone</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">return</span> <span class="nx">anyWorkDone</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
|
||||
<span class="nb">Object</span><span class="p">.</span><span class="nx">defineProperties</span><span class="p">(</span><span class="nb">Object</span><span class="p">,</span> <span class="p">{</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-27">¶</a> </div> <p>Implementation of the public api 'Object.observe'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_public_api#object.observe">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'observe'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">observe</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="nx">callback</span><span class="p">,</span> <span class="nx">accept</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">target</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'target must be an Object, given '</span> <span class="o">+</span> <span class="nx">target</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">!==</span> <span class="s1">'function'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'observer must be a function, given '</span> <span class="o">+</span> <span class="nx">callback</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">isFrozen</span><span class="p">(</span><span class="nx">callback</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'observer cannot be frozen'</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="kd">var</span> <span class="nx">acceptList</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">accept</span> <span class="o">===</span> <span class="s1">'undefined'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">acceptList</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'add'</span><span class="p">,</span> <span class="s1">'update'</span><span class="p">,</span> <span class="s1">'delete'</span><span class="p">,</span> <span class="s1">'reconfigure'</span><span class="p">,</span> <span class="s1">'setPrototype'</span><span class="p">,</span> <span class="s1">'preventExtensions'</span><span class="p">];</span>
|
||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">accept</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">accept</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'accept must be an object, given '</span> <span class="o">+</span> <span class="nx">accept</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="kd">var</span> <span class="nx">len</span> <span class="o">=</span> <span class="nx">accept</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">len</span> <span class="o">!==</span> <span class="s1">'number'</span> <span class="o">||</span> <span class="nx">len</span> <span class="o">>>></span> <span class="mi">0</span> <span class="o">!==</span> <span class="nx">len</span> <span class="o">||</span> <span class="nx">len</span> <span class="o"><</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'the \'length\' property of accept must be a positive integer, given '</span> <span class="o">+</span> <span class="nx">len</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="kd">var</span> <span class="nx">nextIndex</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
|
||||
<span class="nx">acceptList</span> <span class="o">=</span> <span class="p">[];</span>
|
||||
<span class="k">while</span> <span class="p">(</span><span class="nx">nextIndex</span> <span class="o"><</span> <span class="nx">len</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="kd">var</span> <span class="nx">next</span> <span class="o">=</span> <span class="nx">accept</span><span class="p">[</span><span class="nx">nextIndex</span><span class="p">];</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">next</span> <span class="o">!==</span> <span class="s1">'string'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'accept must contains only string, given'</span> <span class="o">+</span> <span class="nx">next</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="nx">acceptList</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">next</span><span class="p">);</span>
|
||||
<span class="nx">nextIndex</span><span class="o">++</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nx">_getNotifier</span><span class="p">(</span><span class="nx">target</span><span class="p">),</span>
|
||||
<span class="nx">changeObservers</span> <span class="o">=</span> <span class="nx">changeObserversMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">);</span>
|
||||
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">changeObservers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">changeObservers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">callback</span> <span class="o">===</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">changeObservers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">accept</span> <span class="o">=</span> <span class="nx">acceptList</span><span class="p">;</span>
|
||||
<span class="k">return</span> <span class="nx">target</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="nx">changeObservers</span><span class="p">.</span><span class="nx">push</span><span class="p">({</span>
|
||||
<span class="nx">callback</span><span class="o">:</span> <span class="nx">callback</span><span class="p">,</span>
|
||||
<span class="nx">accept</span><span class="o">:</span> <span class="nx">acceptList</span>
|
||||
<span class="p">});</span>
|
||||
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">observerCallbacks</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="o">===</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">observerCallbacks</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">callback</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">has</span><span class="p">(</span><span class="nx">callback</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
|
||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">return</span> <span class="nx">target</span><span class="p">;</span>
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-28">¶</a> </div> <p>Implementation of the public api 'Object.unobseve'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_public_api#object.unobseve">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'unobserve'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">unobserve</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">target</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'target must be an Object, given '</span> <span class="o">+</span> <span class="nx">target</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">callback</span> <span class="o">!==</span> <span class="s1">'function'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'observer must be a function, given '</span> <span class="o">+</span> <span class="nx">callback</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="kd">var</span> <span class="nx">notifier</span> <span class="o">=</span> <span class="nx">_getNotifier</span><span class="p">(</span><span class="nx">target</span><span class="p">),</span>
|
||||
<span class="nx">changeObservers</span> <span class="o">=</span> <span class="nx">changeObserversMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">notifier</span><span class="p">);</span>
|
||||
<span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">l</span> <span class="o">=</span> <span class="nx">changeObservers</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">l</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nx">changeObservers</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">callback</span> <span class="o">===</span> <span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="nx">changeObservers</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
|
||||
<span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">callback</span><span class="p">,</span> <span class="nx">attachedNotifierCountMap</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
|
||||
<span class="nx">_cleanObserver</span><span class="p">(</span><span class="nx">callback</span><span class="p">);</span>
|
||||
<span class="k">break</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">return</span> <span class="nx">target</span><span class="p">;</span>
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-29">¶</a> </div> <p>Implementation of the public api 'Object.deliverChangeRecords'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_public_api#object.deliverchangerecords">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'deliverChangeRecords'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">deliverChangeRecords</span><span class="p">(</span><span class="nx">observer</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">observer</span> <span class="o">!==</span> <span class="s1">'function'</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'callback must be a function, given '</span> <span class="o">+</span> <span class="nx">observer</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">while</span> <span class="p">(</span><span class="nx">_deliverChangeRecords</span><span class="p">(</span><span class="nx">observer</span><span class="p">))</span> <span class="p">{}</span>
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">},</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-30">¶</a> </div> <p>Implementation of the public api 'Object.getNotifier'
|
||||
described in the proposal.
|
||||
<a href="http://wiki.ecmascript.org/doku.php?id=harmony:observe_public_api#object.getnotifier">Corresponding Section in ECMAScript wiki</a></p> </td> <td class="code"> <div class="highlight"><pre> <span class="s1">'getNotifier'</span><span class="o">:</span> <span class="p">{</span>
|
||||
<span class="nx">value</span><span class="o">:</span> <span class="kd">function</span> <span class="nx">getNotifier</span><span class="p">(</span><span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">(</span><span class="nx">target</span><span class="p">)</span> <span class="o">!==</span> <span class="nx">target</span><span class="p">)</span> <span class="p">{</span>
|
||||
<span class="k">throw</span> <span class="k">new</span> <span class="nx">TypeError</span><span class="p">(</span><span class="s1">'target must be an Object, given '</span> <span class="o">+</span> <span class="nx">target</span><span class="p">);</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span> <span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nx">isFrozen</span><span class="p">(</span><span class="nx">target</span><span class="p">))</span> <span class="p">{</span>
|
||||
<span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">return</span> <span class="nx">_getNotifier</span><span class="p">(</span><span class="nx">target</span><span class="p">);</span>
|
||||
<span class="p">},</span>
|
||||
<span class="nx">writable</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
|
||||
<span class="nx">configurable</span><span class="o">:</span> <span class="kc">true</span>
|
||||
<span class="p">}</span>
|
||||
|
||||
<span class="p">});</span>
|
||||
|
||||
<span class="p">})(</span><span class="k">typeof</span> <span class="nx">global</span> <span class="o">!==</span> <span class="s1">'undefined'</span> <span class="o">?</span> <span class="nx">global</span> <span class="o">:</span> <span class="k">this</span><span class="p">);</span>
|
||||
|
||||
</pre></div> </td> </tr> </tbody> </table> </div> </body> </html>
|
||||
Reference in New Issue
Block a user