selenium-webdriver 2.43.5 → 2.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/CHANGES.md +20 -0
  2. package/README.md +8 -13
  3. package/builder.js +4 -3
  4. package/docs/class_webdriver_Alert.html +6 -6
  5. package/docs/class_webdriver_AlertPromise.html +6 -6
  6. package/docs/class_webdriver_UnhandledAlertError.html +4 -4
  7. package/docs/class_webdriver_WebDriver.html +39 -37
  8. package/docs/class_webdriver_WebDriver_Logs.html +3 -3
  9. package/docs/class_webdriver_WebDriver_Navigation.html +5 -5
  10. package/docs/class_webdriver_WebDriver_Options.html +9 -9
  11. package/docs/class_webdriver_WebDriver_TargetLocator.html +6 -6
  12. package/docs/class_webdriver_WebDriver_Timeouts.html +4 -4
  13. package/docs/class_webdriver_WebDriver_Window.html +6 -6
  14. package/docs/class_webdriver_WebElement.html +23 -23
  15. package/docs/class_webdriver_WebElementPromise.html +22 -22
  16. package/docs/class_webdriver_promise_CancellationError.html +3 -0
  17. package/docs/class_webdriver_promise_ControlFlow.html +32 -32
  18. package/docs/class_webdriver_promise_Deferred.html +7 -8
  19. package/docs/class_webdriver_promise_Frame_.html +14 -30
  20. package/docs/class_webdriver_promise_Promise.html +2 -2
  21. package/docs/class_webdriver_promise_Task_.html +12 -12
  22. package/docs/class_webdriver_until_Condition.html +3 -0
  23. package/docs/enum_webdriver_Key.html +1 -1
  24. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +1 -1
  25. package/docs/enum_webdriver_promise_Deferred_State_.html +1 -1
  26. package/docs/index.html +8 -13
  27. package/docs/interface_webdriver_promise_Thenable.html +8 -10
  28. package/docs/license.html +1 -1
  29. package/docs/module_selenium-webdriver.html +2 -2
  30. package/docs/module_selenium-webdriver__base.html +1 -1
  31. package/docs/module_selenium-webdriver__base_class_Context.html +1 -1
  32. package/docs/module_selenium-webdriver_builder.html +1 -1
  33. package/docs/module_selenium-webdriver_builder_class_Builder.html +1 -1
  34. package/docs/module_selenium-webdriver_chrome.html +1 -1
  35. package/docs/module_selenium-webdriver_chrome_class_Driver.html +2 -2
  36. package/docs/module_selenium-webdriver_chrome_class_Options.html +2 -2
  37. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +1 -1
  38. package/docs/module_selenium-webdriver_error.html +1 -1
  39. package/docs/module_selenium-webdriver_executors.html +1 -1
  40. package/docs/module_selenium-webdriver_firefox.html +1 -1
  41. package/docs/module_selenium-webdriver_firefox_binary.html +1 -1
  42. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +1 -1
  43. package/docs/module_selenium-webdriver_firefox_class_Driver.html +2 -2
  44. package/docs/module_selenium-webdriver_firefox_class_Options.html +1 -1
  45. package/docs/module_selenium-webdriver_firefox_extension.html +1 -1
  46. package/docs/module_selenium-webdriver_firefox_profile.html +1 -1
  47. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +1 -1
  48. package/docs/module_selenium-webdriver_http.html +1 -1
  49. package/docs/module_selenium-webdriver_http_class_HttpClient.html +1 -1
  50. package/docs/module_selenium-webdriver_http_util.html +1 -1
  51. package/docs/module_selenium-webdriver_io.html +1 -1
  52. package/docs/module_selenium-webdriver_io_exec.html +1 -1
  53. package/docs/module_selenium-webdriver_net.html +1 -1
  54. package/docs/module_selenium-webdriver_net_portprober.html +1 -1
  55. package/docs/module_selenium-webdriver_phantomjs.html +1 -1
  56. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +2 -2
  57. package/docs/module_selenium-webdriver_proxy.html +1 -1
  58. package/docs/module_selenium-webdriver_remote.html +1 -1
  59. package/docs/module_selenium-webdriver_remote_class_DriverService.html +2 -2
  60. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +2 -2
  61. package/docs/module_selenium-webdriver_testing.html +16 -29
  62. package/docs/module_selenium-webdriver_testing_assert.html +1 -1
  63. package/docs/namespace_webdriver_promise.html +18 -20
  64. package/docs/namespace_webdriver_stacktrace.html +15 -15
  65. package/docs/namespace_webdriver_until.html +32 -0
  66. package/docs/source/_base.js.src.html +1 -1
  67. package/docs/source/builder.js.src.html +1 -1
  68. package/docs/source/chrome.js.src.html +1 -1
  69. package/docs/source/error.js.src.html +1 -1
  70. package/docs/source/executors.js.src.html +1 -1
  71. package/docs/source/firefox/binary.js.src.html +1 -1
  72. package/docs/source/firefox/extension.js.src.html +1 -1
  73. package/docs/source/firefox/index.js.src.html +1 -1
  74. package/docs/source/firefox/profile.js.src.html +1 -1
  75. package/docs/source/http/index.js.src.html +1 -1
  76. package/docs/source/http/util.js.src.html +1 -1
  77. package/docs/source/index.js.src.html +1 -1
  78. package/docs/source/io/exec.js.src.html +1 -1
  79. package/docs/source/io/index.js.src.html +1 -1
  80. package/docs/source/lib/atoms/error.js.src.html +1 -1
  81. package/docs/source/lib/atoms/json.js.src.html +1 -1
  82. package/docs/source/lib/atoms/response.js.src.html +1 -1
  83. package/docs/source/lib/atoms/userAgent.js.src.html +1 -1
  84. package/docs/source/lib/goog/array/array.js.src.html +1 -1
  85. package/docs/source/lib/goog/asserts/asserts.js.src.html +1 -1
  86. package/docs/source/lib/goog/async/nexttick.js.src.html +1 -1
  87. package/docs/source/lib/goog/async/run.js.src.html +1 -1
  88. package/docs/source/lib/goog/base.js.src.html +1 -1
  89. package/docs/source/lib/goog/debug/debug.js.src.html +1 -1
  90. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +1 -1
  91. package/docs/source/lib/goog/debug/error.js.src.html +1 -1
  92. package/docs/source/lib/goog/debug/logbuffer.js.src.html +1 -1
  93. package/docs/source/lib/goog/debug/logger.js.src.html +1 -1
  94. package/docs/source/lib/goog/debug/logrecord.js.src.html +1 -1
  95. package/docs/source/lib/goog/deps.js.src.html +1 -1
  96. package/docs/source/lib/goog/disposable/disposable.js.src.html +1 -1
  97. package/docs/source/lib/goog/disposable/idisposable.js.src.html +1 -1
  98. package/docs/source/lib/goog/dom/browserfeature.js.src.html +1 -1
  99. package/docs/source/lib/goog/dom/dom.js.src.html +1 -1
  100. package/docs/source/lib/goog/dom/nodetype.js.src.html +1 -1
  101. package/docs/source/lib/goog/dom/tagname.js.src.html +1 -1
  102. package/docs/source/lib/goog/dom/vendor.js.src.html +1 -1
  103. package/docs/source/lib/goog/events/browserevent.js.src.html +1 -1
  104. package/docs/source/lib/goog/events/browserfeature.js.src.html +1 -1
  105. package/docs/source/lib/goog/events/event.js.src.html +1 -1
  106. package/docs/source/lib/goog/events/eventid.js.src.html +1 -1
  107. package/docs/source/lib/goog/events/events.js.src.html +1 -1
  108. package/docs/source/lib/goog/events/eventtarget.js.src.html +1 -1
  109. package/docs/source/lib/goog/events/eventtype.js.src.html +1 -1
  110. package/docs/source/lib/goog/events/keycodes.js.src.html +1 -1
  111. package/docs/source/lib/goog/events/listenable.js.src.html +1 -1
  112. package/docs/source/lib/goog/events/listener.js.src.html +1 -1
  113. package/docs/source/lib/goog/events/listenermap.js.src.html +1 -1
  114. package/docs/source/lib/goog/functions/functions.js.src.html +1 -1
  115. package/docs/source/lib/goog/iter/iter.js.src.html +1 -1
  116. package/docs/source/lib/goog/json/json.js.src.html +1 -1
  117. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +1 -1
  118. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +1 -1
  119. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +1 -1
  120. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +1 -1
  121. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +1 -1
  122. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +1 -1
  123. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +1 -1
  124. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +1 -1
  125. package/docs/source/lib/goog/labs/useragent/util.js.src.html +1 -1
  126. package/docs/source/lib/goog/math/box.js.src.html +1 -1
  127. package/docs/source/lib/goog/math/coordinate.js.src.html +1 -1
  128. package/docs/source/lib/goog/math/math.js.src.html +1 -1
  129. package/docs/source/lib/goog/math/rect.js.src.html +1 -1
  130. package/docs/source/lib/goog/math/size.js.src.html +1 -1
  131. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +1 -1
  132. package/docs/source/lib/goog/net/xhrlike.js.src.html +1 -1
  133. package/docs/source/lib/goog/net/xmlhttp.js.src.html +1 -1
  134. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +1 -1
  135. package/docs/source/lib/goog/object/object.js.src.html +1 -1
  136. package/docs/source/lib/goog/reflect/reflect.js.src.html +1 -1
  137. package/docs/source/lib/goog/string/string.js.src.html +1 -1
  138. package/docs/source/lib/goog/structs/collection.js.src.html +1 -1
  139. package/docs/source/lib/goog/structs/map.js.src.html +1 -1
  140. package/docs/source/lib/goog/structs/set.js.src.html +1 -1
  141. package/docs/source/lib/goog/structs/structs.js.src.html +1 -1
  142. package/docs/source/lib/goog/style/style.js.src.html +1 -1
  143. package/docs/source/lib/goog/testing/asserts.js.src.html +1 -1
  144. package/docs/source/lib/goog/testing/asynctestcase.js.src.html +1 -1
  145. package/docs/source/lib/goog/testing/events/events.js.src.html +1 -1
  146. package/docs/source/lib/goog/testing/functionmock.js.src.html +1 -1
  147. package/docs/source/lib/goog/testing/jsunit.js.src.html +1 -1
  148. package/docs/source/lib/goog/testing/loosemock.js.src.html +1 -1
  149. package/docs/source/lib/goog/testing/mock.js.src.html +1 -1
  150. package/docs/source/lib/goog/testing/mockclock.js.src.html +1 -1
  151. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +1 -1
  152. package/docs/source/lib/goog/testing/mockinterface.js.src.html +1 -1
  153. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +1 -1
  154. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +1 -1
  155. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +1 -1
  156. package/docs/source/lib/goog/testing/recordfunction.js.src.html +1 -1
  157. package/docs/source/lib/goog/testing/stacktrace.js.src.html +1 -1
  158. package/docs/source/lib/goog/testing/strictmock.js.src.html +1 -1
  159. package/docs/source/lib/goog/testing/testcase.js.src.html +1 -1
  160. package/docs/source/lib/goog/testing/testrunner.js.src.html +1 -1
  161. package/docs/source/lib/goog/testing/watchers.js.src.html +1 -1
  162. package/docs/source/lib/goog/uri/uri.js.src.html +1 -1
  163. package/docs/source/lib/goog/uri/utils.js.src.html +1 -1
  164. package/docs/source/lib/goog/useragent/product.js.src.html +1 -1
  165. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +1 -1
  166. package/docs/source/lib/goog/useragent/useragent.js.src.html +1 -1
  167. package/docs/source/lib/webdriver/abstractbuilder.js.src.html +1 -1
  168. package/docs/source/lib/webdriver/actionsequence.js.src.html +1 -1
  169. package/docs/source/lib/webdriver/builder.js.src.html +1 -1
  170. package/docs/source/lib/webdriver/button.js.src.html +1 -1
  171. package/docs/source/lib/webdriver/capabilities.js.src.html +1 -1
  172. package/docs/source/lib/webdriver/command.js.src.html +1 -1
  173. package/docs/source/lib/webdriver/events.js.src.html +1 -1
  174. package/docs/source/lib/webdriver/firefoxdomexecutor.js.src.html +1 -1
  175. package/docs/source/lib/webdriver/http/corsclient.js.src.html +1 -1
  176. package/docs/source/lib/webdriver/http/http.js.src.html +1 -1
  177. package/docs/source/lib/webdriver/http/xhrclient.js.src.html +1 -1
  178. package/docs/source/lib/webdriver/key.js.src.html +1 -1
  179. package/docs/source/lib/webdriver/locators.js.src.html +1 -1
  180. package/docs/source/lib/webdriver/logging.js.src.html +1 -1
  181. package/docs/source/lib/webdriver/process.js.src.html +1 -1
  182. package/docs/source/lib/webdriver/promise.js.src.html +1 -1
  183. package/docs/source/lib/webdriver/session.js.src.html +1 -1
  184. package/docs/source/lib/webdriver/stacktrace.js.src.html +1 -1
  185. package/docs/source/lib/webdriver/testing/asserts.js.src.html +1 -1
  186. package/docs/source/lib/webdriver/testing/testcase.js.src.html +1 -1
  187. package/docs/source/lib/webdriver/until.js.src.html +1 -0
  188. package/docs/source/lib/webdriver/webdriver.js.src.html +1 -1
  189. package/docs/source/net/index.js.src.html +1 -1
  190. package/docs/source/net/portprober.js.src.html +1 -1
  191. package/docs/source/phantomjs.js.src.html +1 -1
  192. package/docs/source/proxy.js.src.html +1 -1
  193. package/docs/source/remote/index.js.src.html +1 -1
  194. package/docs/source/testing/assert.js.src.html +1 -1
  195. package/docs/source/testing/index.js.src.html +1 -1
  196. package/docs/types.js +1 -1
  197. package/example/google_search.js +9 -17
  198. package/example/google_search_generator.js +6 -7
  199. package/example/google_search_test.js +10 -18
  200. package/example/parallel_flows.js +4 -7
  201. package/index.js +6 -0
  202. package/lib/firefox/webdriver.xpi +0 -0
  203. package/lib/goog/deps.js +7 -5
  204. package/lib/test/index.js +0 -8
  205. package/lib/webdriver/promise.js +263 -251
  206. package/lib/webdriver/stacktrace.js +15 -1
  207. package/lib/webdriver/test/promise_flow_test.js +82 -76
  208. package/lib/webdriver/test/promise_test.js +22 -62
  209. package/lib/webdriver/test/stacktrace_test.js +18 -0
  210. package/lib/webdriver/test/until_test.js +388 -0
  211. package/lib/webdriver/test/webdriver_test.js +41 -0
  212. package/lib/webdriver/until.js +408 -0
  213. package/lib/webdriver/webdriver.js +91 -29
  214. package/package.json +2 -2
  215. package/test/element_finding_test.js +6 -6
  216. package/test/http/util_test.js +4 -5
  217. package/test/page_loading_test.js +7 -7
  218. package/test/stale_element_test.js +2 -10
  219. package/testing/index.js +9 -22
@@ -1 +1 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>listenermap.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/events/listenermap.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview A map of listeners that provides utility functions to<tr><td><a name="l17" href="#l17">17</a><td> * deal with listeners on an event target. Used by<tr><td><a name="l18" href="#l18">18</a><td> * {@code goog.events.EventTarget}.<tr><td><a name="l19" href="#l19">19</a><td> *<tr><td><a name="l20" href="#l20">20</a><td> * WARNING: Do not use this class from outside goog.events package.<tr><td><a name="l21" href="#l21">21</a><td> *<tr><td><a name="l22" href="#l22">22</a><td> * @visibility {//closure/goog/bin/sizetests:__pkg__}<tr><td><a name="l23" href="#l23">23</a><td> * @visibility {//closure/goog/events:__pkg__}<tr><td><a name="l24" href="#l24">24</a><td> * @visibility {//closure/goog/labs/events:__pkg__}<tr><td><a name="l25" href="#l25">25</a><td> */<tr><td><a name="l26" href="#l26">26</a><td><tr><td><a name="l27" href="#l27">27</a><td>goog.provide(&#39;goog.events.ListenerMap&#39;);<tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td>goog.require(&#39;goog.array&#39;);<tr><td><a name="l30" href="#l30">30</a><td>goog.require(&#39;goog.events.Listener&#39;);<tr><td><a name="l31" href="#l31">31</a><td>goog.require(&#39;goog.object&#39;);<tr><td><a name="l32" href="#l32">32</a><td><tr><td><a name="l33" href="#l33">33</a><td><tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td>/**<tr><td><a name="l36" href="#l36">36</a><td> * Creates a new listener map.<tr><td><a name="l37" href="#l37">37</a><td> * @param {EventTarget|goog.events.Listenable} src The src object.<tr><td><a name="l38" href="#l38">38</a><td> * @constructor<tr><td><a name="l39" href="#l39">39</a><td> * @final<tr><td><a name="l40" href="#l40">40</a><td> */<tr><td><a name="l41" href="#l41">41</a><td>goog.events.ListenerMap = function(src) {<tr><td><a name="l42" href="#l42">42</a><td> /** @type {EventTarget|goog.events.Listenable} */<tr><td><a name="l43" href="#l43">43</a><td> this.src = src;<tr><td><a name="l44" href="#l44">44</a><td><tr><td><a name="l45" href="#l45">45</a><td> /**<tr><td><a name="l46" href="#l46">46</a><td> * Maps of event type to an array of listeners.<tr><td><a name="l47" href="#l47">47</a><td> * @type {Object.&lt;string, !Array.&lt;!goog.events.Listener&gt;&gt;}<tr><td><a name="l48" href="#l48">48</a><td> */<tr><td><a name="l49" href="#l49">49</a><td> this.listeners = {};<tr><td><a name="l50" href="#l50">50</a><td><tr><td><a name="l51" href="#l51">51</a><td> /**<tr><td><a name="l52" href="#l52">52</a><td> * The count of types in this map that have registered listeners.<tr><td><a name="l53" href="#l53">53</a><td> * @private {number}<tr><td><a name="l54" href="#l54">54</a><td> */<tr><td><a name="l55" href="#l55">55</a><td> this.typeCount_ = 0;<tr><td><a name="l56" href="#l56">56</a><td>};<tr><td><a name="l57" href="#l57">57</a><td><tr><td><a name="l58" href="#l58">58</a><td><tr><td><a name="l59" href="#l59">59</a><td>/**<tr><td><a name="l60" href="#l60">60</a><td> * @return {number} The count of event types in this map that actually<tr><td><a name="l61" href="#l61">61</a><td> * have registered listeners.<tr><td><a name="l62" href="#l62">62</a><td> */<tr><td><a name="l63" href="#l63">63</a><td>goog.events.ListenerMap.prototype.getTypeCount = function() {<tr><td><a name="l64" href="#l64">64</a><td> return this.typeCount_;<tr><td><a name="l65" href="#l65">65</a><td>};<tr><td><a name="l66" href="#l66">66</a><td><tr><td><a name="l67" href="#l67">67</a><td><tr><td><a name="l68" href="#l68">68</a><td>/**<tr><td><a name="l69" href="#l69">69</a><td> * @return {number} Total number of registered listeners.<tr><td><a name="l70" href="#l70">70</a><td> */<tr><td><a name="l71" href="#l71">71</a><td>goog.events.ListenerMap.prototype.getListenerCount = function() {<tr><td><a name="l72" href="#l72">72</a><td> var count = 0;<tr><td><a name="l73" href="#l73">73</a><td> for (var type in this.listeners) {<tr><td><a name="l74" href="#l74">74</a><td> count += this.listeners[type].length;<tr><td><a name="l75" href="#l75">75</a><td> }<tr><td><a name="l76" href="#l76">76</a><td> return count;<tr><td><a name="l77" href="#l77">77</a><td>};<tr><td><a name="l78" href="#l78">78</a><td><tr><td><a name="l79" href="#l79">79</a><td><tr><td><a name="l80" href="#l80">80</a><td>/**<tr><td><a name="l81" href="#l81">81</a><td> * Adds an event listener. A listener can only be added once to an<tr><td><a name="l82" href="#l82">82</a><td> * object and if it is added again the key for the listener is<tr><td><a name="l83" href="#l83">83</a><td> * returned.<tr><td><a name="l84" href="#l84">84</a><td> *<tr><td><a name="l85" href="#l85">85</a><td> * Note that a one-off listener will not change an existing listener,<tr><td><a name="l86" href="#l86">86</a><td> * if any. On the other hand a normal listener will change existing<tr><td><a name="l87" href="#l87">87</a><td> * one-off listener to become a normal listener.<tr><td><a name="l88" href="#l88">88</a><td> *<tr><td><a name="l89" href="#l89">89</a><td> * @param {string|!goog.events.EventId} type The listener event type.<tr><td><a name="l90" href="#l90">90</a><td> * @param {!Function} listener This listener callback method.<tr><td><a name="l91" href="#l91">91</a><td> * @param {boolean} callOnce Whether the listener is a one-off<tr><td><a name="l92" href="#l92">92</a><td> * listener.<tr><td><a name="l93" href="#l93">93</a><td> * @param {boolean=} opt_useCapture The capture mode of the listener.<tr><td><a name="l94" href="#l94">94</a><td> * @param {Object=} opt_listenerScope Object in whose scope to call the<tr><td><a name="l95" href="#l95">95</a><td> * listener.<tr><td><a name="l96" href="#l96">96</a><td> * @return {goog.events.ListenableKey} Unique key for the listener.<tr><td><a name="l97" href="#l97">97</a><td> */<tr><td><a name="l98" href="#l98">98</a><td>goog.events.ListenerMap.prototype.add = function(<tr><td><a name="l99" href="#l99">99</a><td> type, listener, callOnce, opt_useCapture, opt_listenerScope) {<tr><td><a name="l100" href="#l100">100</a><td> var typeStr = type.toString();<tr><td><a name="l101" href="#l101">101</a><td> var listenerArray = this.listeners[typeStr];<tr><td><a name="l102" href="#l102">102</a><td> if (!listenerArray) {<tr><td><a name="l103" href="#l103">103</a><td> listenerArray = this.listeners[typeStr] = [];<tr><td><a name="l104" href="#l104">104</a><td> this.typeCount_++;<tr><td><a name="l105" href="#l105">105</a><td> }<tr><td><a name="l106" href="#l106">106</a><td><tr><td><a name="l107" href="#l107">107</a><td> var listenerObj;<tr><td><a name="l108" href="#l108">108</a><td> var index = goog.events.ListenerMap.findListenerIndex_(<tr><td><a name="l109" href="#l109">109</a><td> listenerArray, listener, opt_useCapture, opt_listenerScope);<tr><td><a name="l110" href="#l110">110</a><td> if (index &gt; -1) {<tr><td><a name="l111" href="#l111">111</a><td> listenerObj = listenerArray[index];<tr><td><a name="l112" href="#l112">112</a><td> if (!callOnce) {<tr><td><a name="l113" href="#l113">113</a><td> // Ensure that, if there is an existing callOnce listener, it is no<tr><td><a name="l114" href="#l114">114</a><td> // longer a callOnce listener.<tr><td><a name="l115" href="#l115">115</a><td> listenerObj.callOnce = false;<tr><td><a name="l116" href="#l116">116</a><td> }<tr><td><a name="l117" href="#l117">117</a><td> } else {<tr><td><a name="l118" href="#l118">118</a><td> listenerObj = new goog.events.Listener(<tr><td><a name="l119" href="#l119">119</a><td> listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope);<tr><td><a name="l120" href="#l120">120</a><td> listenerObj.callOnce = callOnce;<tr><td><a name="l121" href="#l121">121</a><td> listenerArray.push(listenerObj);<tr><td><a name="l122" href="#l122">122</a><td> }<tr><td><a name="l123" href="#l123">123</a><td> return listenerObj;<tr><td><a name="l124" href="#l124">124</a><td>};<tr><td><a name="l125" href="#l125">125</a><td><tr><td><a name="l126" href="#l126">126</a><td><tr><td><a name="l127" href="#l127">127</a><td>/**<tr><td><a name="l128" href="#l128">128</a><td> * Removes a matching listener.<tr><td><a name="l129" href="#l129">129</a><td> * @param {string|!goog.events.EventId} type The listener event type.<tr><td><a name="l130" href="#l130">130</a><td> * @param {!Function} listener This listener callback method.<tr><td><a name="l131" href="#l131">131</a><td> * @param {boolean=} opt_useCapture The capture mode of the listener.<tr><td><a name="l132" href="#l132">132</a><td> * @param {Object=} opt_listenerScope Object in whose scope to call the<tr><td><a name="l133" href="#l133">133</a><td> * listener.<tr><td><a name="l134" href="#l134">134</a><td> * @return {boolean} Whether any listener was removed.<tr><td><a name="l135" href="#l135">135</a><td> */<tr><td><a name="l136" href="#l136">136</a><td>goog.events.ListenerMap.prototype.remove = function(<tr><td><a name="l137" href="#l137">137</a><td> type, listener, opt_useCapture, opt_listenerScope) {<tr><td><a name="l138" href="#l138">138</a><td> var typeStr = type.toString();<tr><td><a name="l139" href="#l139">139</a><td> if (!(typeStr in this.listeners)) {<tr><td><a name="l140" href="#l140">140</a><td> return false;<tr><td><a name="l141" href="#l141">141</a><td> }<tr><td><a name="l142" href="#l142">142</a><td><tr><td><a name="l143" href="#l143">143</a><td> var listenerArray = this.listeners[typeStr];<tr><td><a name="l144" href="#l144">144</a><td> var index = goog.events.ListenerMap.findListenerIndex_(<tr><td><a name="l145" href="#l145">145</a><td> listenerArray, listener, opt_useCapture, opt_listenerScope);<tr><td><a name="l146" href="#l146">146</a><td> if (index &gt; -1) {<tr><td><a name="l147" href="#l147">147</a><td> var listenerObj = listenerArray[index];<tr><td><a name="l148" href="#l148">148</a><td> listenerObj.markAsRemoved();<tr><td><a name="l149" href="#l149">149</a><td> goog.array.removeAt(listenerArray, index);<tr><td><a name="l150" href="#l150">150</a><td> if (listenerArray.length == 0) {<tr><td><a name="l151" href="#l151">151</a><td> delete this.listeners[typeStr];<tr><td><a name="l152" href="#l152">152</a><td> this.typeCount_--;<tr><td><a name="l153" href="#l153">153</a><td> }<tr><td><a name="l154" href="#l154">154</a><td> return true;<tr><td><a name="l155" href="#l155">155</a><td> }<tr><td><a name="l156" href="#l156">156</a><td> return false;<tr><td><a name="l157" href="#l157">157</a><td>};<tr><td><a name="l158" href="#l158">158</a><td><tr><td><a name="l159" href="#l159">159</a><td><tr><td><a name="l160" href="#l160">160</a><td>/**<tr><td><a name="l161" href="#l161">161</a><td> * Removes the given listener object.<tr><td><a name="l162" href="#l162">162</a><td> * @param {goog.events.ListenableKey} listener The listener to remove.<tr><td><a name="l163" href="#l163">163</a><td> * @return {boolean} Whether the listener is removed.<tr><td><a name="l164" href="#l164">164</a><td> */<tr><td><a name="l165" href="#l165">165</a><td>goog.events.ListenerMap.prototype.removeByKey = function(listener) {<tr><td><a name="l166" href="#l166">166</a><td> var type = listener.type;<tr><td><a name="l167" href="#l167">167</a><td> if (!(type in this.listeners)) {<tr><td><a name="l168" href="#l168">168</a><td> return false;<tr><td><a name="l169" href="#l169">169</a><td> }<tr><td><a name="l170" href="#l170">170</a><td><tr><td><a name="l171" href="#l171">171</a><td> var removed = goog.array.remove(this.listeners[type], listener);<tr><td><a name="l172" href="#l172">172</a><td> if (removed) {<tr><td><a name="l173" href="#l173">173</a><td> listener.markAsRemoved();<tr><td><a name="l174" href="#l174">174</a><td> if (this.listeners[type].length == 0) {<tr><td><a name="l175" href="#l175">175</a><td> delete this.listeners[type];<tr><td><a name="l176" href="#l176">176</a><td> this.typeCount_--;<tr><td><a name="l177" href="#l177">177</a><td> }<tr><td><a name="l178" href="#l178">178</a><td> }<tr><td><a name="l179" href="#l179">179</a><td> return removed;<tr><td><a name="l180" href="#l180">180</a><td>};<tr><td><a name="l181" href="#l181">181</a><td><tr><td><a name="l182" href="#l182">182</a><td><tr><td><a name="l183" href="#l183">183</a><td>/**<tr><td><a name="l184" href="#l184">184</a><td> * Removes all listeners from this map. If opt_type is provided, only<tr><td><a name="l185" href="#l185">185</a><td> * listeners that match the given type are removed.<tr><td><a name="l186" href="#l186">186</a><td> * @param {string|!goog.events.EventId=} opt_type Type of event to remove.<tr><td><a name="l187" href="#l187">187</a><td> * @return {number} Number of listeners removed.<tr><td><a name="l188" href="#l188">188</a><td> */<tr><td><a name="l189" href="#l189">189</a><td>goog.events.ListenerMap.prototype.removeAll = function(opt_type) {<tr><td><a name="l190" href="#l190">190</a><td> var typeStr = opt_type &amp;&amp; opt_type.toString();<tr><td><a name="l191" href="#l191">191</a><td> var count = 0;<tr><td><a name="l192" href="#l192">192</a><td> for (var type in this.listeners) {<tr><td><a name="l193" href="#l193">193</a><td> if (!typeStr || type == typeStr) {<tr><td><a name="l194" href="#l194">194</a><td> var listenerArray = this.listeners[type];<tr><td><a name="l195" href="#l195">195</a><td> for (var i = 0; i &lt; listenerArray.length; i++) {<tr><td><a name="l196" href="#l196">196</a><td> ++count;<tr><td><a name="l197" href="#l197">197</a><td> listenerArray[i].markAsRemoved();<tr><td><a name="l198" href="#l198">198</a><td> }<tr><td><a name="l199" href="#l199">199</a><td> delete this.listeners[type];<tr><td><a name="l200" href="#l200">200</a><td> this.typeCount_--;<tr><td><a name="l201" href="#l201">201</a><td> }<tr><td><a name="l202" href="#l202">202</a><td> }<tr><td><a name="l203" href="#l203">203</a><td> return count;<tr><td><a name="l204" href="#l204">204</a><td>};<tr><td><a name="l205" href="#l205">205</a><td><tr><td><a name="l206" href="#l206">206</a><td><tr><td><a name="l207" href="#l207">207</a><td>/**<tr><td><a name="l208" href="#l208">208</a><td> * Gets all listeners that match the given type and capture mode. The<tr><td><a name="l209" href="#l209">209</a><td> * returned array is a copy (but the listener objects are not).<tr><td><a name="l210" href="#l210">210</a><td> * @param {string|!goog.events.EventId} type The type of the listeners<tr><td><a name="l211" href="#l211">211</a><td> * to retrieve.<tr><td><a name="l212" href="#l212">212</a><td> * @param {boolean} capture The capture mode of the listeners to retrieve.<tr><td><a name="l213" href="#l213">213</a><td> * @return {!Array.&lt;goog.events.ListenableKey&gt;} An array of matching<tr><td><a name="l214" href="#l214">214</a><td> * listeners.<tr><td><a name="l215" href="#l215">215</a><td> */<tr><td><a name="l216" href="#l216">216</a><td>goog.events.ListenerMap.prototype.getListeners = function(type, capture) {<tr><td><a name="l217" href="#l217">217</a><td> var listenerArray = this.listeners[type.toString()];<tr><td><a name="l218" href="#l218">218</a><td> var rv = [];<tr><td><a name="l219" href="#l219">219</a><td> if (listenerArray) {<tr><td><a name="l220" href="#l220">220</a><td> for (var i = 0; i &lt; listenerArray.length; ++i) {<tr><td><a name="l221" href="#l221">221</a><td> var listenerObj = listenerArray[i];<tr><td><a name="l222" href="#l222">222</a><td> if (listenerObj.capture == capture) {<tr><td><a name="l223" href="#l223">223</a><td> rv.push(listenerObj);<tr><td><a name="l224" href="#l224">224</a><td> }<tr><td><a name="l225" href="#l225">225</a><td> }<tr><td><a name="l226" href="#l226">226</a><td> }<tr><td><a name="l227" href="#l227">227</a><td> return rv;<tr><td><a name="l228" href="#l228">228</a><td>};<tr><td><a name="l229" href="#l229">229</a><td><tr><td><a name="l230" href="#l230">230</a><td><tr><td><a name="l231" href="#l231">231</a><td>/**<tr><td><a name="l232" href="#l232">232</a><td> * Gets the goog.events.ListenableKey for the event or null if no such<tr><td><a name="l233" href="#l233">233</a><td> * listener is in use.<tr><td><a name="l234" href="#l234">234</a><td> *<tr><td><a name="l235" href="#l235">235</a><td> * @param {string|!goog.events.EventId} type The type of the listener<tr><td><a name="l236" href="#l236">236</a><td> * to retrieve.<tr><td><a name="l237" href="#l237">237</a><td> * @param {!Function} listener The listener function to get.<tr><td><a name="l238" href="#l238">238</a><td> * @param {boolean} capture Whether the listener is a capturing listener.<tr><td><a name="l239" href="#l239">239</a><td> * @param {Object=} opt_listenerScope Object in whose scope to call the<tr><td><a name="l240" href="#l240">240</a><td> * listener.<tr><td><a name="l241" href="#l241">241</a><td> * @return {goog.events.ListenableKey} the found listener or null if not found.<tr><td><a name="l242" href="#l242">242</a><td> */<tr><td><a name="l243" href="#l243">243</a><td>goog.events.ListenerMap.prototype.getListener = function(<tr><td><a name="l244" href="#l244">244</a><td> type, listener, capture, opt_listenerScope) {<tr><td><a name="l245" href="#l245">245</a><td> var listenerArray = this.listeners[type.toString()];<tr><td><a name="l246" href="#l246">246</a><td> var i = -1;<tr><td><a name="l247" href="#l247">247</a><td> if (listenerArray) {<tr><td><a name="l248" href="#l248">248</a><td> i = goog.events.ListenerMap.findListenerIndex_(<tr><td><a name="l249" href="#l249">249</a><td> listenerArray, listener, capture, opt_listenerScope);<tr><td><a name="l250" href="#l250">250</a><td> }<tr><td><a name="l251" href="#l251">251</a><td> return i &gt; -1 ? listenerArray[i] : null;<tr><td><a name="l252" href="#l252">252</a><td>};<tr><td><a name="l253" href="#l253">253</a><td><tr><td><a name="l254" href="#l254">254</a><td><tr><td><a name="l255" href="#l255">255</a><td>/**<tr><td><a name="l256" href="#l256">256</a><td> * Whether there is a matching listener. If either the type or capture<tr><td><a name="l257" href="#l257">257</a><td> * parameters are unspecified, the function will match on the<tr><td><a name="l258" href="#l258">258</a><td> * remaining criteria.<tr><td><a name="l259" href="#l259">259</a><td> *<tr><td><a name="l260" href="#l260">260</a><td> * @param {string|!goog.events.EventId=} opt_type The type of the listener.<tr><td><a name="l261" href="#l261">261</a><td> * @param {boolean=} opt_capture The capture mode of the listener.<tr><td><a name="l262" href="#l262">262</a><td> * @return {boolean} Whether there is an active listener matching<tr><td><a name="l263" href="#l263">263</a><td> * the requested type and/or capture phase.<tr><td><a name="l264" href="#l264">264</a><td> */<tr><td><a name="l265" href="#l265">265</a><td>goog.events.ListenerMap.prototype.hasListener = function(<tr><td><a name="l266" href="#l266">266</a><td> opt_type, opt_capture) {<tr><td><a name="l267" href="#l267">267</a><td> var hasType = goog.isDef(opt_type);<tr><td><a name="l268" href="#l268">268</a><td> var typeStr = hasType ? opt_type.toString() : &#39;&#39;;<tr><td><a name="l269" href="#l269">269</a><td> var hasCapture = goog.isDef(opt_capture);<tr><td><a name="l270" href="#l270">270</a><td><tr><td><a name="l271" href="#l271">271</a><td> return goog.object.some(<tr><td><a name="l272" href="#l272">272</a><td> this.listeners, function(listenerArray, type) {<tr><td><a name="l273" href="#l273">273</a><td> for (var i = 0; i &lt; listenerArray.length; ++i) {<tr><td><a name="l274" href="#l274">274</a><td> if ((!hasType || listenerArray[i].type == typeStr) &amp;&amp;<tr><td><a name="l275" href="#l275">275</a><td> (!hasCapture || listenerArray[i].capture == opt_capture)) {<tr><td><a name="l276" href="#l276">276</a><td> return true;<tr><td><a name="l277" href="#l277">277</a><td> }<tr><td><a name="l278" href="#l278">278</a><td> }<tr><td><a name="l279" href="#l279">279</a><td><tr><td><a name="l280" href="#l280">280</a><td> return false;<tr><td><a name="l281" href="#l281">281</a><td> });<tr><td><a name="l282" href="#l282">282</a><td>};<tr><td><a name="l283" href="#l283">283</a><td><tr><td><a name="l284" href="#l284">284</a><td><tr><td><a name="l285" href="#l285">285</a><td>/**<tr><td><a name="l286" href="#l286">286</a><td> * Finds the index of a matching goog.events.Listener in the given<tr><td><a name="l287" href="#l287">287</a><td> * listenerArray.<tr><td><a name="l288" href="#l288">288</a><td> * @param {!Array.&lt;!goog.events.Listener&gt;} listenerArray Array of listener.<tr><td><a name="l289" href="#l289">289</a><td> * @param {!Function} listener The listener function.<tr><td><a name="l290" href="#l290">290</a><td> * @param {boolean=} opt_useCapture The capture flag for the listener.<tr><td><a name="l291" href="#l291">291</a><td> * @param {Object=} opt_listenerScope The listener scope.<tr><td><a name="l292" href="#l292">292</a><td> * @return {number} The index of the matching listener within the<tr><td><a name="l293" href="#l293">293</a><td> * listenerArray.<tr><td><a name="l294" href="#l294">294</a><td> * @private<tr><td><a name="l295" href="#l295">295</a><td> */<tr><td><a name="l296" href="#l296">296</a><td>goog.events.ListenerMap.findListenerIndex_ = function(<tr><td><a name="l297" href="#l297">297</a><td> listenerArray, listener, opt_useCapture, opt_listenerScope) {<tr><td><a name="l298" href="#l298">298</a><td> for (var i = 0; i &lt; listenerArray.length; ++i) {<tr><td><a name="l299" href="#l299">299</a><td> var listenerObj = listenerArray[i];<tr><td><a name="l300" href="#l300">300</a><td> if (!listenerObj.removed &amp;&amp;<tr><td><a name="l301" href="#l301">301</a><td> listenerObj.listener == listener &amp;&amp;<tr><td><a name="l302" href="#l302">302</a><td> listenerObj.capture == !!opt_useCapture &amp;&amp;<tr><td><a name="l303" href="#l303">303</a><td> listenerObj.handler == opt_listenerScope) {<tr><td><a name="l304" href="#l304">304</a><td> return i;<tr><td><a name="l305" href="#l305">305</a><td> }<tr><td><a name="l306" href="#l306">306</a><td> }<tr><td><a name="l307" href="#l307">307</a><td> return -1;<tr><td><a name="l308" href="#l308">308</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
1
+ <!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>listenermap.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/events/listenermap.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview A map of listeners that provides utility functions to<tr><td><a name="l17" href="#l17">17</a><td> * deal with listeners on an event target. Used by<tr><td><a name="l18" href="#l18">18</a><td> * {@code goog.events.EventTarget}.<tr><td><a name="l19" href="#l19">19</a><td> *<tr><td><a name="l20" href="#l20">20</a><td> * WARNING: Do not use this class from outside goog.events package.<tr><td><a name="l21" href="#l21">21</a><td> *<tr><td><a name="l22" href="#l22">22</a><td> * @visibility {//closure/goog/bin/sizetests:__pkg__}<tr><td><a name="l23" href="#l23">23</a><td> * @visibility {//closure/goog/events:__pkg__}<tr><td><a name="l24" href="#l24">24</a><td> * @visibility {//closure/goog/labs/events:__pkg__}<tr><td><a name="l25" href="#l25">25</a><td> */<tr><td><a name="l26" href="#l26">26</a><td><tr><td><a name="l27" href="#l27">27</a><td>goog.provide(&#39;goog.events.ListenerMap&#39;);<tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td>goog.require(&#39;goog.array&#39;);<tr><td><a name="l30" href="#l30">30</a><td>goog.require(&#39;goog.events.Listener&#39;);<tr><td><a name="l31" href="#l31">31</a><td>goog.require(&#39;goog.object&#39;);<tr><td><a name="l32" href="#l32">32</a><td><tr><td><a name="l33" href="#l33">33</a><td><tr><td><a name="l34" href="#l34">34</a><td><tr><td><a name="l35" href="#l35">35</a><td>/**<tr><td><a name="l36" href="#l36">36</a><td> * Creates a new listener map.<tr><td><a name="l37" href="#l37">37</a><td> * @param {EventTarget|goog.events.Listenable} src The src object.<tr><td><a name="l38" href="#l38">38</a><td> * @constructor<tr><td><a name="l39" href="#l39">39</a><td> * @final<tr><td><a name="l40" href="#l40">40</a><td> */<tr><td><a name="l41" href="#l41">41</a><td>goog.events.ListenerMap = function(src) {<tr><td><a name="l42" href="#l42">42</a><td> /** @type {EventTarget|goog.events.Listenable} */<tr><td><a name="l43" href="#l43">43</a><td> this.src = src;<tr><td><a name="l44" href="#l44">44</a><td><tr><td><a name="l45" href="#l45">45</a><td> /**<tr><td><a name="l46" href="#l46">46</a><td> * Maps of event type to an array of listeners.<tr><td><a name="l47" href="#l47">47</a><td> * @type {Object.&lt;string, !Array.&lt;!goog.events.Listener&gt;&gt;}<tr><td><a name="l48" href="#l48">48</a><td> */<tr><td><a name="l49" href="#l49">49</a><td> this.listeners = {};<tr><td><a name="l50" href="#l50">50</a><td><tr><td><a name="l51" href="#l51">51</a><td> /**<tr><td><a name="l52" href="#l52">52</a><td> * The count of types in this map that have registered listeners.<tr><td><a name="l53" href="#l53">53</a><td> * @private {number}<tr><td><a name="l54" href="#l54">54</a><td> */<tr><td><a name="l55" href="#l55">55</a><td> this.typeCount_ = 0;<tr><td><a name="l56" href="#l56">56</a><td>};<tr><td><a name="l57" href="#l57">57</a><td><tr><td><a name="l58" href="#l58">58</a><td><tr><td><a name="l59" href="#l59">59</a><td>/**<tr><td><a name="l60" href="#l60">60</a><td> * @return {number} The count of event types in this map that actually<tr><td><a name="l61" href="#l61">61</a><td> * have registered listeners.<tr><td><a name="l62" href="#l62">62</a><td> */<tr><td><a name="l63" href="#l63">63</a><td>goog.events.ListenerMap.prototype.getTypeCount = function() {<tr><td><a name="l64" href="#l64">64</a><td> return this.typeCount_;<tr><td><a name="l65" href="#l65">65</a><td>};<tr><td><a name="l66" href="#l66">66</a><td><tr><td><a name="l67" href="#l67">67</a><td><tr><td><a name="l68" href="#l68">68</a><td>/**<tr><td><a name="l69" href="#l69">69</a><td> * @return {number} Total number of registered listeners.<tr><td><a name="l70" href="#l70">70</a><td> */<tr><td><a name="l71" href="#l71">71</a><td>goog.events.ListenerMap.prototype.getListenerCount = function() {<tr><td><a name="l72" href="#l72">72</a><td> var count = 0;<tr><td><a name="l73" href="#l73">73</a><td> for (var type in this.listeners) {<tr><td><a name="l74" href="#l74">74</a><td> count += this.listeners[type].length;<tr><td><a name="l75" href="#l75">75</a><td> }<tr><td><a name="l76" href="#l76">76</a><td> return count;<tr><td><a name="l77" href="#l77">77</a><td>};<tr><td><a name="l78" href="#l78">78</a><td><tr><td><a name="l79" href="#l79">79</a><td><tr><td><a name="l80" href="#l80">80</a><td>/**<tr><td><a name="l81" href="#l81">81</a><td> * Adds an event listener. A listener can only be added once to an<tr><td><a name="l82" href="#l82">82</a><td> * object and if it is added again the key for the listener is<tr><td><a name="l83" href="#l83">83</a><td> * returned.<tr><td><a name="l84" href="#l84">84</a><td> *<tr><td><a name="l85" href="#l85">85</a><td> * Note that a one-off listener will not change an existing listener,<tr><td><a name="l86" href="#l86">86</a><td> * if any. On the other hand a normal listener will change existing<tr><td><a name="l87" href="#l87">87</a><td> * one-off listener to become a normal listener.<tr><td><a name="l88" href="#l88">88</a><td> *<tr><td><a name="l89" href="#l89">89</a><td> * @param {string|!goog.events.EventId} type The listener event type.<tr><td><a name="l90" href="#l90">90</a><td> * @param {!Function} listener This listener callback method.<tr><td><a name="l91" href="#l91">91</a><td> * @param {boolean} callOnce Whether the listener is a one-off<tr><td><a name="l92" href="#l92">92</a><td> * listener.<tr><td><a name="l93" href="#l93">93</a><td> * @param {boolean=} opt_useCapture The capture mode of the listener.<tr><td><a name="l94" href="#l94">94</a><td> * @param {Object=} opt_listenerScope Object in whose scope to call the<tr><td><a name="l95" href="#l95">95</a><td> * listener.<tr><td><a name="l96" href="#l96">96</a><td> * @return {goog.events.ListenableKey} Unique key for the listener.<tr><td><a name="l97" href="#l97">97</a><td> */<tr><td><a name="l98" href="#l98">98</a><td>goog.events.ListenerMap.prototype.add = function(<tr><td><a name="l99" href="#l99">99</a><td> type, listener, callOnce, opt_useCapture, opt_listenerScope) {<tr><td><a name="l100" href="#l100">100</a><td> var typeStr = type.toString();<tr><td><a name="l101" href="#l101">101</a><td> var listenerArray = this.listeners[typeStr];<tr><td><a name="l102" href="#l102">102</a><td> if (!listenerArray) {<tr><td><a name="l103" href="#l103">103</a><td> listenerArray = this.listeners[typeStr] = [];<tr><td><a name="l104" href="#l104">104</a><td> this.typeCount_++;<tr><td><a name="l105" href="#l105">105</a><td> }<tr><td><a name="l106" href="#l106">106</a><td><tr><td><a name="l107" href="#l107">107</a><td> var listenerObj;<tr><td><a name="l108" href="#l108">108</a><td> var index = goog.events.ListenerMap.findListenerIndex_(<tr><td><a name="l109" href="#l109">109</a><td> listenerArray, listener, opt_useCapture, opt_listenerScope);<tr><td><a name="l110" href="#l110">110</a><td> if (index &gt; -1) {<tr><td><a name="l111" href="#l111">111</a><td> listenerObj = listenerArray[index];<tr><td><a name="l112" href="#l112">112</a><td> if (!callOnce) {<tr><td><a name="l113" href="#l113">113</a><td> // Ensure that, if there is an existing callOnce listener, it is no<tr><td><a name="l114" href="#l114">114</a><td> // longer a callOnce listener.<tr><td><a name="l115" href="#l115">115</a><td> listenerObj.callOnce = false;<tr><td><a name="l116" href="#l116">116</a><td> }<tr><td><a name="l117" href="#l117">117</a><td> } else {<tr><td><a name="l118" href="#l118">118</a><td> listenerObj = new goog.events.Listener(<tr><td><a name="l119" href="#l119">119</a><td> listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope);<tr><td><a name="l120" href="#l120">120</a><td> listenerObj.callOnce = callOnce;<tr><td><a name="l121" href="#l121">121</a><td> listenerArray.push(listenerObj);<tr><td><a name="l122" href="#l122">122</a><td> }<tr><td><a name="l123" href="#l123">123</a><td> return listenerObj;<tr><td><a name="l124" href="#l124">124</a><td>};<tr><td><a name="l125" href="#l125">125</a><td><tr><td><a name="l126" href="#l126">126</a><td><tr><td><a name="l127" href="#l127">127</a><td>/**<tr><td><a name="l128" href="#l128">128</a><td> * Removes a matching listener.<tr><td><a name="l129" href="#l129">129</a><td> * @param {string|!goog.events.EventId} type The listener event type.<tr><td><a name="l130" href="#l130">130</a><td> * @param {!Function} listener This listener callback method.<tr><td><a name="l131" href="#l131">131</a><td> * @param {boolean=} opt_useCapture The capture mode of the listener.<tr><td><a name="l132" href="#l132">132</a><td> * @param {Object=} opt_listenerScope Object in whose scope to call the<tr><td><a name="l133" href="#l133">133</a><td> * listener.<tr><td><a name="l134" href="#l134">134</a><td> * @return {boolean} Whether any listener was removed.<tr><td><a name="l135" href="#l135">135</a><td> */<tr><td><a name="l136" href="#l136">136</a><td>goog.events.ListenerMap.prototype.remove = function(<tr><td><a name="l137" href="#l137">137</a><td> type, listener, opt_useCapture, opt_listenerScope) {<tr><td><a name="l138" href="#l138">138</a><td> var typeStr = type.toString();<tr><td><a name="l139" href="#l139">139</a><td> if (!(typeStr in this.listeners)) {<tr><td><a name="l140" href="#l140">140</a><td> return false;<tr><td><a name="l141" href="#l141">141</a><td> }<tr><td><a name="l142" href="#l142">142</a><td><tr><td><a name="l143" href="#l143">143</a><td> var listenerArray = this.listeners[typeStr];<tr><td><a name="l144" href="#l144">144</a><td> var index = goog.events.ListenerMap.findListenerIndex_(<tr><td><a name="l145" href="#l145">145</a><td> listenerArray, listener, opt_useCapture, opt_listenerScope);<tr><td><a name="l146" href="#l146">146</a><td> if (index &gt; -1) {<tr><td><a name="l147" href="#l147">147</a><td> var listenerObj = listenerArray[index];<tr><td><a name="l148" href="#l148">148</a><td> listenerObj.markAsRemoved();<tr><td><a name="l149" href="#l149">149</a><td> goog.array.removeAt(listenerArray, index);<tr><td><a name="l150" href="#l150">150</a><td> if (listenerArray.length == 0) {<tr><td><a name="l151" href="#l151">151</a><td> delete this.listeners[typeStr];<tr><td><a name="l152" href="#l152">152</a><td> this.typeCount_--;<tr><td><a name="l153" href="#l153">153</a><td> }<tr><td><a name="l154" href="#l154">154</a><td> return true;<tr><td><a name="l155" href="#l155">155</a><td> }<tr><td><a name="l156" href="#l156">156</a><td> return false;<tr><td><a name="l157" href="#l157">157</a><td>};<tr><td><a name="l158" href="#l158">158</a><td><tr><td><a name="l159" href="#l159">159</a><td><tr><td><a name="l160" href="#l160">160</a><td>/**<tr><td><a name="l161" href="#l161">161</a><td> * Removes the given listener object.<tr><td><a name="l162" href="#l162">162</a><td> * @param {goog.events.ListenableKey} listener The listener to remove.<tr><td><a name="l163" href="#l163">163</a><td> * @return {boolean} Whether the listener is removed.<tr><td><a name="l164" href="#l164">164</a><td> */<tr><td><a name="l165" href="#l165">165</a><td>goog.events.ListenerMap.prototype.removeByKey = function(listener) {<tr><td><a name="l166" href="#l166">166</a><td> var type = listener.type;<tr><td><a name="l167" href="#l167">167</a><td> if (!(type in this.listeners)) {<tr><td><a name="l168" href="#l168">168</a><td> return false;<tr><td><a name="l169" href="#l169">169</a><td> }<tr><td><a name="l170" href="#l170">170</a><td><tr><td><a name="l171" href="#l171">171</a><td> var removed = goog.array.remove(this.listeners[type], listener);<tr><td><a name="l172" href="#l172">172</a><td> if (removed) {<tr><td><a name="l173" href="#l173">173</a><td> listener.markAsRemoved();<tr><td><a name="l174" href="#l174">174</a><td> if (this.listeners[type].length == 0) {<tr><td><a name="l175" href="#l175">175</a><td> delete this.listeners[type];<tr><td><a name="l176" href="#l176">176</a><td> this.typeCount_--;<tr><td><a name="l177" href="#l177">177</a><td> }<tr><td><a name="l178" href="#l178">178</a><td> }<tr><td><a name="l179" href="#l179">179</a><td> return removed;<tr><td><a name="l180" href="#l180">180</a><td>};<tr><td><a name="l181" href="#l181">181</a><td><tr><td><a name="l182" href="#l182">182</a><td><tr><td><a name="l183" href="#l183">183</a><td>/**<tr><td><a name="l184" href="#l184">184</a><td> * Removes all listeners from this map. If opt_type is provided, only<tr><td><a name="l185" href="#l185">185</a><td> * listeners that match the given type are removed.<tr><td><a name="l186" href="#l186">186</a><td> * @param {string|!goog.events.EventId=} opt_type Type of event to remove.<tr><td><a name="l187" href="#l187">187</a><td> * @return {number} Number of listeners removed.<tr><td><a name="l188" href="#l188">188</a><td> */<tr><td><a name="l189" href="#l189">189</a><td>goog.events.ListenerMap.prototype.removeAll = function(opt_type) {<tr><td><a name="l190" href="#l190">190</a><td> var typeStr = opt_type &amp;&amp; opt_type.toString();<tr><td><a name="l191" href="#l191">191</a><td> var count = 0;<tr><td><a name="l192" href="#l192">192</a><td> for (var type in this.listeners) {<tr><td><a name="l193" href="#l193">193</a><td> if (!typeStr || type == typeStr) {<tr><td><a name="l194" href="#l194">194</a><td> var listenerArray = this.listeners[type];<tr><td><a name="l195" href="#l195">195</a><td> for (var i = 0; i &lt; listenerArray.length; i++) {<tr><td><a name="l196" href="#l196">196</a><td> ++count;<tr><td><a name="l197" href="#l197">197</a><td> listenerArray[i].markAsRemoved();<tr><td><a name="l198" href="#l198">198</a><td> }<tr><td><a name="l199" href="#l199">199</a><td> delete this.listeners[type];<tr><td><a name="l200" href="#l200">200</a><td> this.typeCount_--;<tr><td><a name="l201" href="#l201">201</a><td> }<tr><td><a name="l202" href="#l202">202</a><td> }<tr><td><a name="l203" href="#l203">203</a><td> return count;<tr><td><a name="l204" href="#l204">204</a><td>};<tr><td><a name="l205" href="#l205">205</a><td><tr><td><a name="l206" href="#l206">206</a><td><tr><td><a name="l207" href="#l207">207</a><td>/**<tr><td><a name="l208" href="#l208">208</a><td> * Gets all listeners that match the given type and capture mode. The<tr><td><a name="l209" href="#l209">209</a><td> * returned array is a copy (but the listener objects are not).<tr><td><a name="l210" href="#l210">210</a><td> * @param {string|!goog.events.EventId} type The type of the listeners<tr><td><a name="l211" href="#l211">211</a><td> * to retrieve.<tr><td><a name="l212" href="#l212">212</a><td> * @param {boolean} capture The capture mode of the listeners to retrieve.<tr><td><a name="l213" href="#l213">213</a><td> * @return {!Array.&lt;goog.events.ListenableKey&gt;} An array of matching<tr><td><a name="l214" href="#l214">214</a><td> * listeners.<tr><td><a name="l215" href="#l215">215</a><td> */<tr><td><a name="l216" href="#l216">216</a><td>goog.events.ListenerMap.prototype.getListeners = function(type, capture) {<tr><td><a name="l217" href="#l217">217</a><td> var listenerArray = this.listeners[type.toString()];<tr><td><a name="l218" href="#l218">218</a><td> var rv = [];<tr><td><a name="l219" href="#l219">219</a><td> if (listenerArray) {<tr><td><a name="l220" href="#l220">220</a><td> for (var i = 0; i &lt; listenerArray.length; ++i) {<tr><td><a name="l221" href="#l221">221</a><td> var listenerObj = listenerArray[i];<tr><td><a name="l222" href="#l222">222</a><td> if (listenerObj.capture == capture) {<tr><td><a name="l223" href="#l223">223</a><td> rv.push(listenerObj);<tr><td><a name="l224" href="#l224">224</a><td> }<tr><td><a name="l225" href="#l225">225</a><td> }<tr><td><a name="l226" href="#l226">226</a><td> }<tr><td><a name="l227" href="#l227">227</a><td> return rv;<tr><td><a name="l228" href="#l228">228</a><td>};<tr><td><a name="l229" href="#l229">229</a><td><tr><td><a name="l230" href="#l230">230</a><td><tr><td><a name="l231" href="#l231">231</a><td>/**<tr><td><a name="l232" href="#l232">232</a><td> * Gets the goog.events.ListenableKey for the event or null if no such<tr><td><a name="l233" href="#l233">233</a><td> * listener is in use.<tr><td><a name="l234" href="#l234">234</a><td> *<tr><td><a name="l235" href="#l235">235</a><td> * @param {string|!goog.events.EventId} type The type of the listener<tr><td><a name="l236" href="#l236">236</a><td> * to retrieve.<tr><td><a name="l237" href="#l237">237</a><td> * @param {!Function} listener The listener function to get.<tr><td><a name="l238" href="#l238">238</a><td> * @param {boolean} capture Whether the listener is a capturing listener.<tr><td><a name="l239" href="#l239">239</a><td> * @param {Object=} opt_listenerScope Object in whose scope to call the<tr><td><a name="l240" href="#l240">240</a><td> * listener.<tr><td><a name="l241" href="#l241">241</a><td> * @return {goog.events.ListenableKey} the found listener or null if not found.<tr><td><a name="l242" href="#l242">242</a><td> */<tr><td><a name="l243" href="#l243">243</a><td>goog.events.ListenerMap.prototype.getListener = function(<tr><td><a name="l244" href="#l244">244</a><td> type, listener, capture, opt_listenerScope) {<tr><td><a name="l245" href="#l245">245</a><td> var listenerArray = this.listeners[type.toString()];<tr><td><a name="l246" href="#l246">246</a><td> var i = -1;<tr><td><a name="l247" href="#l247">247</a><td> if (listenerArray) {<tr><td><a name="l248" href="#l248">248</a><td> i = goog.events.ListenerMap.findListenerIndex_(<tr><td><a name="l249" href="#l249">249</a><td> listenerArray, listener, capture, opt_listenerScope);<tr><td><a name="l250" href="#l250">250</a><td> }<tr><td><a name="l251" href="#l251">251</a><td> return i &gt; -1 ? listenerArray[i] : null;<tr><td><a name="l252" href="#l252">252</a><td>};<tr><td><a name="l253" href="#l253">253</a><td><tr><td><a name="l254" href="#l254">254</a><td><tr><td><a name="l255" href="#l255">255</a><td>/**<tr><td><a name="l256" href="#l256">256</a><td> * Whether there is a matching listener. If either the type or capture<tr><td><a name="l257" href="#l257">257</a><td> * parameters are unspecified, the function will match on the<tr><td><a name="l258" href="#l258">258</a><td> * remaining criteria.<tr><td><a name="l259" href="#l259">259</a><td> *<tr><td><a name="l260" href="#l260">260</a><td> * @param {string|!goog.events.EventId=} opt_type The type of the listener.<tr><td><a name="l261" href="#l261">261</a><td> * @param {boolean=} opt_capture The capture mode of the listener.<tr><td><a name="l262" href="#l262">262</a><td> * @return {boolean} Whether there is an active listener matching<tr><td><a name="l263" href="#l263">263</a><td> * the requested type and/or capture phase.<tr><td><a name="l264" href="#l264">264</a><td> */<tr><td><a name="l265" href="#l265">265</a><td>goog.events.ListenerMap.prototype.hasListener = function(<tr><td><a name="l266" href="#l266">266</a><td> opt_type, opt_capture) {<tr><td><a name="l267" href="#l267">267</a><td> var hasType = goog.isDef(opt_type);<tr><td><a name="l268" href="#l268">268</a><td> var typeStr = hasType ? opt_type.toString() : &#39;&#39;;<tr><td><a name="l269" href="#l269">269</a><td> var hasCapture = goog.isDef(opt_capture);<tr><td><a name="l270" href="#l270">270</a><td><tr><td><a name="l271" href="#l271">271</a><td> return goog.object.some(<tr><td><a name="l272" href="#l272">272</a><td> this.listeners, function(listenerArray, type) {<tr><td><a name="l273" href="#l273">273</a><td> for (var i = 0; i &lt; listenerArray.length; ++i) {<tr><td><a name="l274" href="#l274">274</a><td> if ((!hasType || listenerArray[i].type == typeStr) &amp;&amp;<tr><td><a name="l275" href="#l275">275</a><td> (!hasCapture || listenerArray[i].capture == opt_capture)) {<tr><td><a name="l276" href="#l276">276</a><td> return true;<tr><td><a name="l277" href="#l277">277</a><td> }<tr><td><a name="l278" href="#l278">278</a><td> }<tr><td><a name="l279" href="#l279">279</a><td><tr><td><a name="l280" href="#l280">280</a><td> return false;<tr><td><a name="l281" href="#l281">281</a><td> });<tr><td><a name="l282" href="#l282">282</a><td>};<tr><td><a name="l283" href="#l283">283</a><td><tr><td><a name="l284" href="#l284">284</a><td><tr><td><a name="l285" href="#l285">285</a><td>/**<tr><td><a name="l286" href="#l286">286</a><td> * Finds the index of a matching goog.events.Listener in the given<tr><td><a name="l287" href="#l287">287</a><td> * listenerArray.<tr><td><a name="l288" href="#l288">288</a><td> * @param {!Array.&lt;!goog.events.Listener&gt;} listenerArray Array of listener.<tr><td><a name="l289" href="#l289">289</a><td> * @param {!Function} listener The listener function.<tr><td><a name="l290" href="#l290">290</a><td> * @param {boolean=} opt_useCapture The capture flag for the listener.<tr><td><a name="l291" href="#l291">291</a><td> * @param {Object=} opt_listenerScope The listener scope.<tr><td><a name="l292" href="#l292">292</a><td> * @return {number} The index of the matching listener within the<tr><td><a name="l293" href="#l293">293</a><td> * listenerArray.<tr><td><a name="l294" href="#l294">294</a><td> * @private<tr><td><a name="l295" href="#l295">295</a><td> */<tr><td><a name="l296" href="#l296">296</a><td>goog.events.ListenerMap.findListenerIndex_ = function(<tr><td><a name="l297" href="#l297">297</a><td> listenerArray, listener, opt_useCapture, opt_listenerScope) {<tr><td><a name="l298" href="#l298">298</a><td> for (var i = 0; i &lt; listenerArray.length; ++i) {<tr><td><a name="l299" href="#l299">299</a><td> var listenerObj = listenerArray[i];<tr><td><a name="l300" href="#l300">300</a><td> if (!listenerObj.removed &amp;&amp;<tr><td><a name="l301" href="#l301">301</a><td> listenerObj.listener == listener &amp;&amp;<tr><td><a name="l302" href="#l302">302</a><td> listenerObj.capture == !!opt_useCapture &amp;&amp;<tr><td><a name="l303" href="#l303">303</a><td> listenerObj.handler == opt_listenerScope) {<tr><td><a name="l304" href="#l304">304</a><td> return i;<tr><td><a name="l305" href="#l305">305</a><td> }<tr><td><a name="l306" href="#l306">306</a><td> }<tr><td><a name="l307" href="#l307">307</a><td> return -1;<tr><td><a name="l308" href="#l308">308</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
@@ -1 +1 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>functions.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/functions/functions.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2008 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview Utilities for creating functions. Loosely inspired by the<tr><td><a name="l17" href="#l17">17</a><td> * java classes: http://goo.gl/GM0Hmu and http://goo.gl/6k7nI8.<tr><td><a name="l18" href="#l18">18</a><td> *<tr><td><a name="l19" href="#l19">19</a><td> * @author nicksantos@google.com (Nick Santos)<tr><td><a name="l20" href="#l20">20</a><td> */<tr><td><a name="l21" href="#l21">21</a><td><tr><td><a name="l22" href="#l22">22</a><td><tr><td><a name="l23" href="#l23">23</a><td>goog.provide(&#39;goog.functions&#39;);<tr><td><a name="l24" href="#l24">24</a><td><tr><td><a name="l25" href="#l25">25</a><td><tr><td><a name="l26" href="#l26">26</a><td>/**<tr><td><a name="l27" href="#l27">27</a><td> * Creates a function that always returns the same value.<tr><td><a name="l28" href="#l28">28</a><td> * @param {T} retValue The value to return.<tr><td><a name="l29" href="#l29">29</a><td> * @return {function():T} The new function.<tr><td><a name="l30" href="#l30">30</a><td> * @template T<tr><td><a name="l31" href="#l31">31</a><td> */<tr><td><a name="l32" href="#l32">32</a><td>goog.functions.constant = function(retValue) {<tr><td><a name="l33" href="#l33">33</a><td> return function() {<tr><td><a name="l34" href="#l34">34</a><td> return retValue;<tr><td><a name="l35" href="#l35">35</a><td> };<tr><td><a name="l36" href="#l36">36</a><td>};<tr><td><a name="l37" href="#l37">37</a><td><tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td>/**<tr><td><a name="l40" href="#l40">40</a><td> * Always returns false.<tr><td><a name="l41" href="#l41">41</a><td> * @type {function(...): boolean}<tr><td><a name="l42" href="#l42">42</a><td> */<tr><td><a name="l43" href="#l43">43</a><td>goog.functions.FALSE = goog.functions.constant(false);<tr><td><a name="l44" href="#l44">44</a><td><tr><td><a name="l45" href="#l45">45</a><td><tr><td><a name="l46" href="#l46">46</a><td>/**<tr><td><a name="l47" href="#l47">47</a><td> * Always returns true.<tr><td><a name="l48" href="#l48">48</a><td> * @type {function(...): boolean}<tr><td><a name="l49" href="#l49">49</a><td> */<tr><td><a name="l50" href="#l50">50</a><td>goog.functions.TRUE = goog.functions.constant(true);<tr><td><a name="l51" href="#l51">51</a><td><tr><td><a name="l52" href="#l52">52</a><td><tr><td><a name="l53" href="#l53">53</a><td>/**<tr><td><a name="l54" href="#l54">54</a><td> * Always returns NULL.<tr><td><a name="l55" href="#l55">55</a><td> * @type {function(...): null}<tr><td><a name="l56" href="#l56">56</a><td> */<tr><td><a name="l57" href="#l57">57</a><td>goog.functions.NULL = goog.functions.constant(null);<tr><td><a name="l58" href="#l58">58</a><td><tr><td><a name="l59" href="#l59">59</a><td><tr><td><a name="l60" href="#l60">60</a><td>/**<tr><td><a name="l61" href="#l61">61</a><td> * A simple function that returns the first argument of whatever is passed<tr><td><a name="l62" href="#l62">62</a><td> * into it.<tr><td><a name="l63" href="#l63">63</a><td> * @param {T=} opt_returnValue The single value that will be returned.<tr><td><a name="l64" href="#l64">64</a><td> * @param {...*} var_args Optional trailing arguments. These are ignored.<tr><td><a name="l65" href="#l65">65</a><td> * @return {T} The first argument passed in, or undefined if nothing was passed.<tr><td><a name="l66" href="#l66">66</a><td> * @template T<tr><td><a name="l67" href="#l67">67</a><td> */<tr><td><a name="l68" href="#l68">68</a><td>goog.functions.identity = function(opt_returnValue, var_args) {<tr><td><a name="l69" href="#l69">69</a><td> return opt_returnValue;<tr><td><a name="l70" href="#l70">70</a><td>};<tr><td><a name="l71" href="#l71">71</a><td><tr><td><a name="l72" href="#l72">72</a><td><tr><td><a name="l73" href="#l73">73</a><td>/**<tr><td><a name="l74" href="#l74">74</a><td> * Creates a function that always throws an error with the given message.<tr><td><a name="l75" href="#l75">75</a><td> * @param {string} message The error message.<tr><td><a name="l76" href="#l76">76</a><td> * @return {!Function} The error-throwing function.<tr><td><a name="l77" href="#l77">77</a><td> */<tr><td><a name="l78" href="#l78">78</a><td>goog.functions.error = function(message) {<tr><td><a name="l79" href="#l79">79</a><td> return function() {<tr><td><a name="l80" href="#l80">80</a><td> throw Error(message);<tr><td><a name="l81" href="#l81">81</a><td> };<tr><td><a name="l82" href="#l82">82</a><td>};<tr><td><a name="l83" href="#l83">83</a><td><tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td>/**<tr><td><a name="l86" href="#l86">86</a><td> * Creates a function that throws the given object.<tr><td><a name="l87" href="#l87">87</a><td> * @param {*} err An object to be thrown.<tr><td><a name="l88" href="#l88">88</a><td> * @return {!Function} The error-throwing function.<tr><td><a name="l89" href="#l89">89</a><td> */<tr><td><a name="l90" href="#l90">90</a><td>goog.functions.fail = function(err) {<tr><td><a name="l91" href="#l91">91</a><td> return function() {<tr><td><a name="l92" href="#l92">92</a><td> throw err;<tr><td><a name="l93" href="#l93">93</a><td> }<tr><td><a name="l94" href="#l94">94</a><td>};<tr><td><a name="l95" href="#l95">95</a><td><tr><td><a name="l96" href="#l96">96</a><td><tr><td><a name="l97" href="#l97">97</a><td>/**<tr><td><a name="l98" href="#l98">98</a><td> * Given a function, create a function that keeps opt_numArgs arguments and<tr><td><a name="l99" href="#l99">99</a><td> * silently discards all additional arguments.<tr><td><a name="l100" href="#l100">100</a><td> * @param {Function} f The original function.<tr><td><a name="l101" href="#l101">101</a><td> * @param {number=} opt_numArgs The number of arguments to keep. Defaults to 0.<tr><td><a name="l102" href="#l102">102</a><td> * @return {!Function} A version of f that only keeps the first opt_numArgs<tr><td><a name="l103" href="#l103">103</a><td> * arguments.<tr><td><a name="l104" href="#l104">104</a><td> */<tr><td><a name="l105" href="#l105">105</a><td>goog.functions.lock = function(f, opt_numArgs) {<tr><td><a name="l106" href="#l106">106</a><td> opt_numArgs = opt_numArgs || 0;<tr><td><a name="l107" href="#l107">107</a><td> return function() {<tr><td><a name="l108" href="#l108">108</a><td> return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs));<tr><td><a name="l109" href="#l109">109</a><td> };<tr><td><a name="l110" href="#l110">110</a><td>};<tr><td><a name="l111" href="#l111">111</a><td><tr><td><a name="l112" href="#l112">112</a><td><tr><td><a name="l113" href="#l113">113</a><td>/**<tr><td><a name="l114" href="#l114">114</a><td> * Creates a function that returns its nth argument.<tr><td><a name="l115" href="#l115">115</a><td> * @param {number} n The position of the return argument.<tr><td><a name="l116" href="#l116">116</a><td> * @return {!Function} A new function.<tr><td><a name="l117" href="#l117">117</a><td> */<tr><td><a name="l118" href="#l118">118</a><td>goog.functions.nth = function(n) {<tr><td><a name="l119" href="#l119">119</a><td> return function() {<tr><td><a name="l120" href="#l120">120</a><td> return arguments[n];<tr><td><a name="l121" href="#l121">121</a><td> };<tr><td><a name="l122" href="#l122">122</a><td>};<tr><td><a name="l123" href="#l123">123</a><td><tr><td><a name="l124" href="#l124">124</a><td><tr><td><a name="l125" href="#l125">125</a><td>/**<tr><td><a name="l126" href="#l126">126</a><td> * Given a function, create a new function that swallows its return value<tr><td><a name="l127" href="#l127">127</a><td> * and replaces it with a new one.<tr><td><a name="l128" href="#l128">128</a><td> * @param {Function} f A function.<tr><td><a name="l129" href="#l129">129</a><td> * @param {T} retValue A new return value.<tr><td><a name="l130" href="#l130">130</a><td> * @return {function(...[?]):T} A new function.<tr><td><a name="l131" href="#l131">131</a><td> * @template T<tr><td><a name="l132" href="#l132">132</a><td> */<tr><td><a name="l133" href="#l133">133</a><td>goog.functions.withReturnValue = function(f, retValue) {<tr><td><a name="l134" href="#l134">134</a><td> return goog.functions.sequence(f, goog.functions.constant(retValue));<tr><td><a name="l135" href="#l135">135</a><td>};<tr><td><a name="l136" href="#l136">136</a><td><tr><td><a name="l137" href="#l137">137</a><td><tr><td><a name="l138" href="#l138">138</a><td>/**<tr><td><a name="l139" href="#l139">139</a><td> * Creates the composition of the functions passed in.<tr><td><a name="l140" href="#l140">140</a><td> * For example, (goog.functions.compose(f, g))(a) is equivalent to f(g(a)).<tr><td><a name="l141" href="#l141">141</a><td> * @param {function(...[?]):T} fn The final function.<tr><td><a name="l142" href="#l142">142</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l143" href="#l143">143</a><td> * @return {function(...[?]):T} The composition of all inputs.<tr><td><a name="l144" href="#l144">144</a><td> * @template T<tr><td><a name="l145" href="#l145">145</a><td> */<tr><td><a name="l146" href="#l146">146</a><td>goog.functions.compose = function(fn, var_args) {<tr><td><a name="l147" href="#l147">147</a><td> var functions = arguments;<tr><td><a name="l148" href="#l148">148</a><td> var length = functions.length;<tr><td><a name="l149" href="#l149">149</a><td> return function() {<tr><td><a name="l150" href="#l150">150</a><td> var result;<tr><td><a name="l151" href="#l151">151</a><td> if (length) {<tr><td><a name="l152" href="#l152">152</a><td> result = functions[length - 1].apply(this, arguments);<tr><td><a name="l153" href="#l153">153</a><td> }<tr><td><a name="l154" href="#l154">154</a><td><tr><td><a name="l155" href="#l155">155</a><td> for (var i = length - 2; i &gt;= 0; i--) {<tr><td><a name="l156" href="#l156">156</a><td> result = functions[i].call(this, result);<tr><td><a name="l157" href="#l157">157</a><td> }<tr><td><a name="l158" href="#l158">158</a><td> return result;<tr><td><a name="l159" href="#l159">159</a><td> };<tr><td><a name="l160" href="#l160">160</a><td>};<tr><td><a name="l161" href="#l161">161</a><td><tr><td><a name="l162" href="#l162">162</a><td><tr><td><a name="l163" href="#l163">163</a><td>/**<tr><td><a name="l164" href="#l164">164</a><td> * Creates a function that calls the functions passed in in sequence, and<tr><td><a name="l165" href="#l165">165</a><td> * returns the value of the last function. For example,<tr><td><a name="l166" href="#l166">166</a><td> * (goog.functions.sequence(f, g))(x) is equivalent to f(x),g(x).<tr><td><a name="l167" href="#l167">167</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l168" href="#l168">168</a><td> * @return {!Function} A function that calls all inputs in sequence.<tr><td><a name="l169" href="#l169">169</a><td> */<tr><td><a name="l170" href="#l170">170</a><td>goog.functions.sequence = function(var_args) {<tr><td><a name="l171" href="#l171">171</a><td> var functions = arguments;<tr><td><a name="l172" href="#l172">172</a><td> var length = functions.length;<tr><td><a name="l173" href="#l173">173</a><td> return function() {<tr><td><a name="l174" href="#l174">174</a><td> var result;<tr><td><a name="l175" href="#l175">175</a><td> for (var i = 0; i &lt; length; i++) {<tr><td><a name="l176" href="#l176">176</a><td> result = functions[i].apply(this, arguments);<tr><td><a name="l177" href="#l177">177</a><td> }<tr><td><a name="l178" href="#l178">178</a><td> return result;<tr><td><a name="l179" href="#l179">179</a><td> };<tr><td><a name="l180" href="#l180">180</a><td>};<tr><td><a name="l181" href="#l181">181</a><td><tr><td><a name="l182" href="#l182">182</a><td><tr><td><a name="l183" href="#l183">183</a><td>/**<tr><td><a name="l184" href="#l184">184</a><td> * Creates a function that returns true if each of its components evaluates<tr><td><a name="l185" href="#l185">185</a><td> * to true. The components are evaluated in order, and the evaluation will be<tr><td><a name="l186" href="#l186">186</a><td> * short-circuited as soon as a function returns false.<tr><td><a name="l187" href="#l187">187</a><td> * For example, (goog.functions.and(f, g))(x) is equivalent to f(x) &amp;&amp; g(x).<tr><td><a name="l188" href="#l188">188</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l189" href="#l189">189</a><td> * @return {function(...[?]):boolean} A function that ANDs its component<tr><td><a name="l190" href="#l190">190</a><td> * functions.<tr><td><a name="l191" href="#l191">191</a><td> */<tr><td><a name="l192" href="#l192">192</a><td>goog.functions.and = function(var_args) {<tr><td><a name="l193" href="#l193">193</a><td> var functions = arguments;<tr><td><a name="l194" href="#l194">194</a><td> var length = functions.length;<tr><td><a name="l195" href="#l195">195</a><td> return function() {<tr><td><a name="l196" href="#l196">196</a><td> for (var i = 0; i &lt; length; i++) {<tr><td><a name="l197" href="#l197">197</a><td> if (!functions[i].apply(this, arguments)) {<tr><td><a name="l198" href="#l198">198</a><td> return false;<tr><td><a name="l199" href="#l199">199</a><td> }<tr><td><a name="l200" href="#l200">200</a><td> }<tr><td><a name="l201" href="#l201">201</a><td> return true;<tr><td><a name="l202" href="#l202">202</a><td> };<tr><td><a name="l203" href="#l203">203</a><td>};<tr><td><a name="l204" href="#l204">204</a><td><tr><td><a name="l205" href="#l205">205</a><td><tr><td><a name="l206" href="#l206">206</a><td>/**<tr><td><a name="l207" href="#l207">207</a><td> * Creates a function that returns true if any of its components evaluates<tr><td><a name="l208" href="#l208">208</a><td> * to true. The components are evaluated in order, and the evaluation will be<tr><td><a name="l209" href="#l209">209</a><td> * short-circuited as soon as a function returns true.<tr><td><a name="l210" href="#l210">210</a><td> * For example, (goog.functions.or(f, g))(x) is equivalent to f(x) || g(x).<tr><td><a name="l211" href="#l211">211</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l212" href="#l212">212</a><td> * @return {function(...[?]):boolean} A function that ORs its component<tr><td><a name="l213" href="#l213">213</a><td> * functions.<tr><td><a name="l214" href="#l214">214</a><td> */<tr><td><a name="l215" href="#l215">215</a><td>goog.functions.or = function(var_args) {<tr><td><a name="l216" href="#l216">216</a><td> var functions = arguments;<tr><td><a name="l217" href="#l217">217</a><td> var length = functions.length;<tr><td><a name="l218" href="#l218">218</a><td> return function() {<tr><td><a name="l219" href="#l219">219</a><td> for (var i = 0; i &lt; length; i++) {<tr><td><a name="l220" href="#l220">220</a><td> if (functions[i].apply(this, arguments)) {<tr><td><a name="l221" href="#l221">221</a><td> return true;<tr><td><a name="l222" href="#l222">222</a><td> }<tr><td><a name="l223" href="#l223">223</a><td> }<tr><td><a name="l224" href="#l224">224</a><td> return false;<tr><td><a name="l225" href="#l225">225</a><td> };<tr><td><a name="l226" href="#l226">226</a><td>};<tr><td><a name="l227" href="#l227">227</a><td><tr><td><a name="l228" href="#l228">228</a><td><tr><td><a name="l229" href="#l229">229</a><td>/**<tr><td><a name="l230" href="#l230">230</a><td> * Creates a function that returns the Boolean opposite of a provided function.<tr><td><a name="l231" href="#l231">231</a><td> * For example, (goog.functions.not(f))(x) is equivalent to !f(x).<tr><td><a name="l232" href="#l232">232</a><td> * @param {!Function} f The original function.<tr><td><a name="l233" href="#l233">233</a><td> * @return {function(...[?]):boolean} A function that delegates to f and returns<tr><td><a name="l234" href="#l234">234</a><td> * opposite.<tr><td><a name="l235" href="#l235">235</a><td> */<tr><td><a name="l236" href="#l236">236</a><td>goog.functions.not = function(f) {<tr><td><a name="l237" href="#l237">237</a><td> return function() {<tr><td><a name="l238" href="#l238">238</a><td> return !f.apply(this, arguments);<tr><td><a name="l239" href="#l239">239</a><td> };<tr><td><a name="l240" href="#l240">240</a><td>};<tr><td><a name="l241" href="#l241">241</a><td><tr><td><a name="l242" href="#l242">242</a><td><tr><td><a name="l243" href="#l243">243</a><td>/**<tr><td><a name="l244" href="#l244">244</a><td> * Generic factory function to construct an object given the constructor<tr><td><a name="l245" href="#l245">245</a><td> * and the arguments. Intended to be bound to create object factories.<tr><td><a name="l246" href="#l246">246</a><td> *<tr><td><a name="l247" href="#l247">247</a><td> * Callers should cast the result to the appropriate type for proper type<tr><td><a name="l248" href="#l248">248</a><td> * checking by the compiler.<tr><td><a name="l249" href="#l249">249</a><td> * @param {!Function} constructor The constructor for the Object.<tr><td><a name="l250" href="#l250">250</a><td> * @param {...*} var_args The arguments to be passed to the constructor.<tr><td><a name="l251" href="#l251">251</a><td> * @return {!Object} A new instance of the class given in {@code constructor}.<tr><td><a name="l252" href="#l252">252</a><td> */<tr><td><a name="l253" href="#l253">253</a><td>goog.functions.create = function(constructor, var_args) {<tr><td><a name="l254" href="#l254">254</a><td> /**<tr><td><a name="l255" href="#l255">255</a><td> * @constructor<tr><td><a name="l256" href="#l256">256</a><td> * @final<tr><td><a name="l257" href="#l257">257</a><td> */<tr><td><a name="l258" href="#l258">258</a><td> var temp = function() {};<tr><td><a name="l259" href="#l259">259</a><td> temp.prototype = constructor.prototype;<tr><td><a name="l260" href="#l260">260</a><td><tr><td><a name="l261" href="#l261">261</a><td> // obj will have constructor&#39;s prototype in its chain and<tr><td><a name="l262" href="#l262">262</a><td> // &#39;obj instanceof constructor&#39; will be true.<tr><td><a name="l263" href="#l263">263</a><td> var obj = new temp();<tr><td><a name="l264" href="#l264">264</a><td><tr><td><a name="l265" href="#l265">265</a><td> // obj is initialized by constructor.<tr><td><a name="l266" href="#l266">266</a><td> // arguments is only array-like so lacks shift(), but can be used with<tr><td><a name="l267" href="#l267">267</a><td> // the Array prototype function.<tr><td><a name="l268" href="#l268">268</a><td> constructor.apply(obj, Array.prototype.slice.call(arguments, 1));<tr><td><a name="l269" href="#l269">269</a><td> return obj;<tr><td><a name="l270" href="#l270">270</a><td>};<tr><td><a name="l271" href="#l271">271</a><td><tr><td><a name="l272" href="#l272">272</a><td><tr><td><a name="l273" href="#l273">273</a><td>/**<tr><td><a name="l274" href="#l274">274</a><td> * @define {boolean} Whether the return value cache should be used.<tr><td><a name="l275" href="#l275">275</a><td> * This should only be used to disable caches when testing.<tr><td><a name="l276" href="#l276">276</a><td> */<tr><td><a name="l277" href="#l277">277</a><td>goog.define(&#39;goog.functions.CACHE_RETURN_VALUE&#39;, true);<tr><td><a name="l278" href="#l278">278</a><td><tr><td><a name="l279" href="#l279">279</a><td><tr><td><a name="l280" href="#l280">280</a><td>/**<tr><td><a name="l281" href="#l281">281</a><td> * Gives a wrapper function that caches the return value of a parameterless<tr><td><a name="l282" href="#l282">282</a><td> * function when first called.<tr><td><a name="l283" href="#l283">283</a><td> *<tr><td><a name="l284" href="#l284">284</a><td> * When called for the first time, the given function is called and its<tr><td><a name="l285" href="#l285">285</a><td> * return value is cached (thus this is only appropriate for idempotent<tr><td><a name="l286" href="#l286">286</a><td> * functions). Subsequent calls will return the cached return value. This<tr><td><a name="l287" href="#l287">287</a><td> * allows the evaluation of expensive functions to be delayed until first used.<tr><td><a name="l288" href="#l288">288</a><td> *<tr><td><a name="l289" href="#l289">289</a><td> * To cache the return values of functions with parameters, see goog.memoize.<tr><td><a name="l290" href="#l290">290</a><td> *<tr><td><a name="l291" href="#l291">291</a><td> * @param {!function():T} fn A function to lazily evaluate.<tr><td><a name="l292" href="#l292">292</a><td> * @return {!function():T} A wrapped version the function.<tr><td><a name="l293" href="#l293">293</a><td> * @template T<tr><td><a name="l294" href="#l294">294</a><td> */<tr><td><a name="l295" href="#l295">295</a><td>goog.functions.cacheReturnValue = function(fn) {<tr><td><a name="l296" href="#l296">296</a><td> var called = false;<tr><td><a name="l297" href="#l297">297</a><td> var value;<tr><td><a name="l298" href="#l298">298</a><td><tr><td><a name="l299" href="#l299">299</a><td> return function() {<tr><td><a name="l300" href="#l300">300</a><td> if (!goog.functions.CACHE_RETURN_VALUE) {<tr><td><a name="l301" href="#l301">301</a><td> return fn();<tr><td><a name="l302" href="#l302">302</a><td> }<tr><td><a name="l303" href="#l303">303</a><td><tr><td><a name="l304" href="#l304">304</a><td> if (!called) {<tr><td><a name="l305" href="#l305">305</a><td> value = fn();<tr><td><a name="l306" href="#l306">306</a><td> called = true;<tr><td><a name="l307" href="#l307">307</a><td> }<tr><td><a name="l308" href="#l308">308</a><td><tr><td><a name="l309" href="#l309">309</a><td> return value;<tr><td><a name="l310" href="#l310">310</a><td> }<tr><td><a name="l311" href="#l311">311</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>
1
+ <!DOCTYPE html><meta charset="UTF-8"><meta http-equiv="Content-Language" content="en" /><title>functions.js</title><link href="../../../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>lib/goog/functions/functions.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2008 The Closure Library Authors. All Rights Reserved.<tr><td><a name="l2" href="#l2">2</a><td>//<tr><td><a name="l3" href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l4" href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l5" href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a name="l6" href="#l6">6</a><td>//<tr><td><a name="l7" href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l8" href="#l8">8</a><td>//<tr><td><a name="l9" href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l10" href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a name="l11" href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l12" href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l13" href="#l13">13</a><td>// limitations under the License.<tr><td><a name="l14" href="#l14">14</a><td><tr><td><a name="l15" href="#l15">15</a><td>/**<tr><td><a name="l16" href="#l16">16</a><td> * @fileoverview Utilities for creating functions. Loosely inspired by the<tr><td><a name="l17" href="#l17">17</a><td> * java classes: http://goo.gl/GM0Hmu and http://goo.gl/6k7nI8.<tr><td><a name="l18" href="#l18">18</a><td> *<tr><td><a name="l19" href="#l19">19</a><td> * @author nicksantos@google.com (Nick Santos)<tr><td><a name="l20" href="#l20">20</a><td> */<tr><td><a name="l21" href="#l21">21</a><td><tr><td><a name="l22" href="#l22">22</a><td><tr><td><a name="l23" href="#l23">23</a><td>goog.provide(&#39;goog.functions&#39;);<tr><td><a name="l24" href="#l24">24</a><td><tr><td><a name="l25" href="#l25">25</a><td><tr><td><a name="l26" href="#l26">26</a><td>/**<tr><td><a name="l27" href="#l27">27</a><td> * Creates a function that always returns the same value.<tr><td><a name="l28" href="#l28">28</a><td> * @param {T} retValue The value to return.<tr><td><a name="l29" href="#l29">29</a><td> * @return {function():T} The new function.<tr><td><a name="l30" href="#l30">30</a><td> * @template T<tr><td><a name="l31" href="#l31">31</a><td> */<tr><td><a name="l32" href="#l32">32</a><td>goog.functions.constant = function(retValue) {<tr><td><a name="l33" href="#l33">33</a><td> return function() {<tr><td><a name="l34" href="#l34">34</a><td> return retValue;<tr><td><a name="l35" href="#l35">35</a><td> };<tr><td><a name="l36" href="#l36">36</a><td>};<tr><td><a name="l37" href="#l37">37</a><td><tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td>/**<tr><td><a name="l40" href="#l40">40</a><td> * Always returns false.<tr><td><a name="l41" href="#l41">41</a><td> * @type {function(...): boolean}<tr><td><a name="l42" href="#l42">42</a><td> */<tr><td><a name="l43" href="#l43">43</a><td>goog.functions.FALSE = goog.functions.constant(false);<tr><td><a name="l44" href="#l44">44</a><td><tr><td><a name="l45" href="#l45">45</a><td><tr><td><a name="l46" href="#l46">46</a><td>/**<tr><td><a name="l47" href="#l47">47</a><td> * Always returns true.<tr><td><a name="l48" href="#l48">48</a><td> * @type {function(...): boolean}<tr><td><a name="l49" href="#l49">49</a><td> */<tr><td><a name="l50" href="#l50">50</a><td>goog.functions.TRUE = goog.functions.constant(true);<tr><td><a name="l51" href="#l51">51</a><td><tr><td><a name="l52" href="#l52">52</a><td><tr><td><a name="l53" href="#l53">53</a><td>/**<tr><td><a name="l54" href="#l54">54</a><td> * Always returns NULL.<tr><td><a name="l55" href="#l55">55</a><td> * @type {function(...): null}<tr><td><a name="l56" href="#l56">56</a><td> */<tr><td><a name="l57" href="#l57">57</a><td>goog.functions.NULL = goog.functions.constant(null);<tr><td><a name="l58" href="#l58">58</a><td><tr><td><a name="l59" href="#l59">59</a><td><tr><td><a name="l60" href="#l60">60</a><td>/**<tr><td><a name="l61" href="#l61">61</a><td> * A simple function that returns the first argument of whatever is passed<tr><td><a name="l62" href="#l62">62</a><td> * into it.<tr><td><a name="l63" href="#l63">63</a><td> * @param {T=} opt_returnValue The single value that will be returned.<tr><td><a name="l64" href="#l64">64</a><td> * @param {...*} var_args Optional trailing arguments. These are ignored.<tr><td><a name="l65" href="#l65">65</a><td> * @return {T} The first argument passed in, or undefined if nothing was passed.<tr><td><a name="l66" href="#l66">66</a><td> * @template T<tr><td><a name="l67" href="#l67">67</a><td> */<tr><td><a name="l68" href="#l68">68</a><td>goog.functions.identity = function(opt_returnValue, var_args) {<tr><td><a name="l69" href="#l69">69</a><td> return opt_returnValue;<tr><td><a name="l70" href="#l70">70</a><td>};<tr><td><a name="l71" href="#l71">71</a><td><tr><td><a name="l72" href="#l72">72</a><td><tr><td><a name="l73" href="#l73">73</a><td>/**<tr><td><a name="l74" href="#l74">74</a><td> * Creates a function that always throws an error with the given message.<tr><td><a name="l75" href="#l75">75</a><td> * @param {string} message The error message.<tr><td><a name="l76" href="#l76">76</a><td> * @return {!Function} The error-throwing function.<tr><td><a name="l77" href="#l77">77</a><td> */<tr><td><a name="l78" href="#l78">78</a><td>goog.functions.error = function(message) {<tr><td><a name="l79" href="#l79">79</a><td> return function() {<tr><td><a name="l80" href="#l80">80</a><td> throw Error(message);<tr><td><a name="l81" href="#l81">81</a><td> };<tr><td><a name="l82" href="#l82">82</a><td>};<tr><td><a name="l83" href="#l83">83</a><td><tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td>/**<tr><td><a name="l86" href="#l86">86</a><td> * Creates a function that throws the given object.<tr><td><a name="l87" href="#l87">87</a><td> * @param {*} err An object to be thrown.<tr><td><a name="l88" href="#l88">88</a><td> * @return {!Function} The error-throwing function.<tr><td><a name="l89" href="#l89">89</a><td> */<tr><td><a name="l90" href="#l90">90</a><td>goog.functions.fail = function(err) {<tr><td><a name="l91" href="#l91">91</a><td> return function() {<tr><td><a name="l92" href="#l92">92</a><td> throw err;<tr><td><a name="l93" href="#l93">93</a><td> }<tr><td><a name="l94" href="#l94">94</a><td>};<tr><td><a name="l95" href="#l95">95</a><td><tr><td><a name="l96" href="#l96">96</a><td><tr><td><a name="l97" href="#l97">97</a><td>/**<tr><td><a name="l98" href="#l98">98</a><td> * Given a function, create a function that keeps opt_numArgs arguments and<tr><td><a name="l99" href="#l99">99</a><td> * silently discards all additional arguments.<tr><td><a name="l100" href="#l100">100</a><td> * @param {Function} f The original function.<tr><td><a name="l101" href="#l101">101</a><td> * @param {number=} opt_numArgs The number of arguments to keep. Defaults to 0.<tr><td><a name="l102" href="#l102">102</a><td> * @return {!Function} A version of f that only keeps the first opt_numArgs<tr><td><a name="l103" href="#l103">103</a><td> * arguments.<tr><td><a name="l104" href="#l104">104</a><td> */<tr><td><a name="l105" href="#l105">105</a><td>goog.functions.lock = function(f, opt_numArgs) {<tr><td><a name="l106" href="#l106">106</a><td> opt_numArgs = opt_numArgs || 0;<tr><td><a name="l107" href="#l107">107</a><td> return function() {<tr><td><a name="l108" href="#l108">108</a><td> return f.apply(this, Array.prototype.slice.call(arguments, 0, opt_numArgs));<tr><td><a name="l109" href="#l109">109</a><td> };<tr><td><a name="l110" href="#l110">110</a><td>};<tr><td><a name="l111" href="#l111">111</a><td><tr><td><a name="l112" href="#l112">112</a><td><tr><td><a name="l113" href="#l113">113</a><td>/**<tr><td><a name="l114" href="#l114">114</a><td> * Creates a function that returns its nth argument.<tr><td><a name="l115" href="#l115">115</a><td> * @param {number} n The position of the return argument.<tr><td><a name="l116" href="#l116">116</a><td> * @return {!Function} A new function.<tr><td><a name="l117" href="#l117">117</a><td> */<tr><td><a name="l118" href="#l118">118</a><td>goog.functions.nth = function(n) {<tr><td><a name="l119" href="#l119">119</a><td> return function() {<tr><td><a name="l120" href="#l120">120</a><td> return arguments[n];<tr><td><a name="l121" href="#l121">121</a><td> };<tr><td><a name="l122" href="#l122">122</a><td>};<tr><td><a name="l123" href="#l123">123</a><td><tr><td><a name="l124" href="#l124">124</a><td><tr><td><a name="l125" href="#l125">125</a><td>/**<tr><td><a name="l126" href="#l126">126</a><td> * Given a function, create a new function that swallows its return value<tr><td><a name="l127" href="#l127">127</a><td> * and replaces it with a new one.<tr><td><a name="l128" href="#l128">128</a><td> * @param {Function} f A function.<tr><td><a name="l129" href="#l129">129</a><td> * @param {T} retValue A new return value.<tr><td><a name="l130" href="#l130">130</a><td> * @return {function(...[?]):T} A new function.<tr><td><a name="l131" href="#l131">131</a><td> * @template T<tr><td><a name="l132" href="#l132">132</a><td> */<tr><td><a name="l133" href="#l133">133</a><td>goog.functions.withReturnValue = function(f, retValue) {<tr><td><a name="l134" href="#l134">134</a><td> return goog.functions.sequence(f, goog.functions.constant(retValue));<tr><td><a name="l135" href="#l135">135</a><td>};<tr><td><a name="l136" href="#l136">136</a><td><tr><td><a name="l137" href="#l137">137</a><td><tr><td><a name="l138" href="#l138">138</a><td>/**<tr><td><a name="l139" href="#l139">139</a><td> * Creates the composition of the functions passed in.<tr><td><a name="l140" href="#l140">140</a><td> * For example, (goog.functions.compose(f, g))(a) is equivalent to f(g(a)).<tr><td><a name="l141" href="#l141">141</a><td> * @param {function(...[?]):T} fn The final function.<tr><td><a name="l142" href="#l142">142</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l143" href="#l143">143</a><td> * @return {function(...[?]):T} The composition of all inputs.<tr><td><a name="l144" href="#l144">144</a><td> * @template T<tr><td><a name="l145" href="#l145">145</a><td> */<tr><td><a name="l146" href="#l146">146</a><td>goog.functions.compose = function(fn, var_args) {<tr><td><a name="l147" href="#l147">147</a><td> var functions = arguments;<tr><td><a name="l148" href="#l148">148</a><td> var length = functions.length;<tr><td><a name="l149" href="#l149">149</a><td> return function() {<tr><td><a name="l150" href="#l150">150</a><td> var result;<tr><td><a name="l151" href="#l151">151</a><td> if (length) {<tr><td><a name="l152" href="#l152">152</a><td> result = functions[length - 1].apply(this, arguments);<tr><td><a name="l153" href="#l153">153</a><td> }<tr><td><a name="l154" href="#l154">154</a><td><tr><td><a name="l155" href="#l155">155</a><td> for (var i = length - 2; i &gt;= 0; i--) {<tr><td><a name="l156" href="#l156">156</a><td> result = functions[i].call(this, result);<tr><td><a name="l157" href="#l157">157</a><td> }<tr><td><a name="l158" href="#l158">158</a><td> return result;<tr><td><a name="l159" href="#l159">159</a><td> };<tr><td><a name="l160" href="#l160">160</a><td>};<tr><td><a name="l161" href="#l161">161</a><td><tr><td><a name="l162" href="#l162">162</a><td><tr><td><a name="l163" href="#l163">163</a><td>/**<tr><td><a name="l164" href="#l164">164</a><td> * Creates a function that calls the functions passed in in sequence, and<tr><td><a name="l165" href="#l165">165</a><td> * returns the value of the last function. For example,<tr><td><a name="l166" href="#l166">166</a><td> * (goog.functions.sequence(f, g))(x) is equivalent to f(x),g(x).<tr><td><a name="l167" href="#l167">167</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l168" href="#l168">168</a><td> * @return {!Function} A function that calls all inputs in sequence.<tr><td><a name="l169" href="#l169">169</a><td> */<tr><td><a name="l170" href="#l170">170</a><td>goog.functions.sequence = function(var_args) {<tr><td><a name="l171" href="#l171">171</a><td> var functions = arguments;<tr><td><a name="l172" href="#l172">172</a><td> var length = functions.length;<tr><td><a name="l173" href="#l173">173</a><td> return function() {<tr><td><a name="l174" href="#l174">174</a><td> var result;<tr><td><a name="l175" href="#l175">175</a><td> for (var i = 0; i &lt; length; i++) {<tr><td><a name="l176" href="#l176">176</a><td> result = functions[i].apply(this, arguments);<tr><td><a name="l177" href="#l177">177</a><td> }<tr><td><a name="l178" href="#l178">178</a><td> return result;<tr><td><a name="l179" href="#l179">179</a><td> };<tr><td><a name="l180" href="#l180">180</a><td>};<tr><td><a name="l181" href="#l181">181</a><td><tr><td><a name="l182" href="#l182">182</a><td><tr><td><a name="l183" href="#l183">183</a><td>/**<tr><td><a name="l184" href="#l184">184</a><td> * Creates a function that returns true if each of its components evaluates<tr><td><a name="l185" href="#l185">185</a><td> * to true. The components are evaluated in order, and the evaluation will be<tr><td><a name="l186" href="#l186">186</a><td> * short-circuited as soon as a function returns false.<tr><td><a name="l187" href="#l187">187</a><td> * For example, (goog.functions.and(f, g))(x) is equivalent to f(x) &amp;&amp; g(x).<tr><td><a name="l188" href="#l188">188</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l189" href="#l189">189</a><td> * @return {function(...[?]):boolean} A function that ANDs its component<tr><td><a name="l190" href="#l190">190</a><td> * functions.<tr><td><a name="l191" href="#l191">191</a><td> */<tr><td><a name="l192" href="#l192">192</a><td>goog.functions.and = function(var_args) {<tr><td><a name="l193" href="#l193">193</a><td> var functions = arguments;<tr><td><a name="l194" href="#l194">194</a><td> var length = functions.length;<tr><td><a name="l195" href="#l195">195</a><td> return function() {<tr><td><a name="l196" href="#l196">196</a><td> for (var i = 0; i &lt; length; i++) {<tr><td><a name="l197" href="#l197">197</a><td> if (!functions[i].apply(this, arguments)) {<tr><td><a name="l198" href="#l198">198</a><td> return false;<tr><td><a name="l199" href="#l199">199</a><td> }<tr><td><a name="l200" href="#l200">200</a><td> }<tr><td><a name="l201" href="#l201">201</a><td> return true;<tr><td><a name="l202" href="#l202">202</a><td> };<tr><td><a name="l203" href="#l203">203</a><td>};<tr><td><a name="l204" href="#l204">204</a><td><tr><td><a name="l205" href="#l205">205</a><td><tr><td><a name="l206" href="#l206">206</a><td>/**<tr><td><a name="l207" href="#l207">207</a><td> * Creates a function that returns true if any of its components evaluates<tr><td><a name="l208" href="#l208">208</a><td> * to true. The components are evaluated in order, and the evaluation will be<tr><td><a name="l209" href="#l209">209</a><td> * short-circuited as soon as a function returns true.<tr><td><a name="l210" href="#l210">210</a><td> * For example, (goog.functions.or(f, g))(x) is equivalent to f(x) || g(x).<tr><td><a name="l211" href="#l211">211</a><td> * @param {...Function} var_args A list of functions.<tr><td><a name="l212" href="#l212">212</a><td> * @return {function(...[?]):boolean} A function that ORs its component<tr><td><a name="l213" href="#l213">213</a><td> * functions.<tr><td><a name="l214" href="#l214">214</a><td> */<tr><td><a name="l215" href="#l215">215</a><td>goog.functions.or = function(var_args) {<tr><td><a name="l216" href="#l216">216</a><td> var functions = arguments;<tr><td><a name="l217" href="#l217">217</a><td> var length = functions.length;<tr><td><a name="l218" href="#l218">218</a><td> return function() {<tr><td><a name="l219" href="#l219">219</a><td> for (var i = 0; i &lt; length; i++) {<tr><td><a name="l220" href="#l220">220</a><td> if (functions[i].apply(this, arguments)) {<tr><td><a name="l221" href="#l221">221</a><td> return true;<tr><td><a name="l222" href="#l222">222</a><td> }<tr><td><a name="l223" href="#l223">223</a><td> }<tr><td><a name="l224" href="#l224">224</a><td> return false;<tr><td><a name="l225" href="#l225">225</a><td> };<tr><td><a name="l226" href="#l226">226</a><td>};<tr><td><a name="l227" href="#l227">227</a><td><tr><td><a name="l228" href="#l228">228</a><td><tr><td><a name="l229" href="#l229">229</a><td>/**<tr><td><a name="l230" href="#l230">230</a><td> * Creates a function that returns the Boolean opposite of a provided function.<tr><td><a name="l231" href="#l231">231</a><td> * For example, (goog.functions.not(f))(x) is equivalent to !f(x).<tr><td><a name="l232" href="#l232">232</a><td> * @param {!Function} f The original function.<tr><td><a name="l233" href="#l233">233</a><td> * @return {function(...[?]):boolean} A function that delegates to f and returns<tr><td><a name="l234" href="#l234">234</a><td> * opposite.<tr><td><a name="l235" href="#l235">235</a><td> */<tr><td><a name="l236" href="#l236">236</a><td>goog.functions.not = function(f) {<tr><td><a name="l237" href="#l237">237</a><td> return function() {<tr><td><a name="l238" href="#l238">238</a><td> return !f.apply(this, arguments);<tr><td><a name="l239" href="#l239">239</a><td> };<tr><td><a name="l240" href="#l240">240</a><td>};<tr><td><a name="l241" href="#l241">241</a><td><tr><td><a name="l242" href="#l242">242</a><td><tr><td><a name="l243" href="#l243">243</a><td>/**<tr><td><a name="l244" href="#l244">244</a><td> * Generic factory function to construct an object given the constructor<tr><td><a name="l245" href="#l245">245</a><td> * and the arguments. Intended to be bound to create object factories.<tr><td><a name="l246" href="#l246">246</a><td> *<tr><td><a name="l247" href="#l247">247</a><td> * Callers should cast the result to the appropriate type for proper type<tr><td><a name="l248" href="#l248">248</a><td> * checking by the compiler.<tr><td><a name="l249" href="#l249">249</a><td> * @param {!Function} constructor The constructor for the Object.<tr><td><a name="l250" href="#l250">250</a><td> * @param {...*} var_args The arguments to be passed to the constructor.<tr><td><a name="l251" href="#l251">251</a><td> * @return {!Object} A new instance of the class given in {@code constructor}.<tr><td><a name="l252" href="#l252">252</a><td> */<tr><td><a name="l253" href="#l253">253</a><td>goog.functions.create = function(constructor, var_args) {<tr><td><a name="l254" href="#l254">254</a><td> /**<tr><td><a name="l255" href="#l255">255</a><td> * @constructor<tr><td><a name="l256" href="#l256">256</a><td> * @final<tr><td><a name="l257" href="#l257">257</a><td> */<tr><td><a name="l258" href="#l258">258</a><td> var temp = function() {};<tr><td><a name="l259" href="#l259">259</a><td> temp.prototype = constructor.prototype;<tr><td><a name="l260" href="#l260">260</a><td><tr><td><a name="l261" href="#l261">261</a><td> // obj will have constructor&#39;s prototype in its chain and<tr><td><a name="l262" href="#l262">262</a><td> // &#39;obj instanceof constructor&#39; will be true.<tr><td><a name="l263" href="#l263">263</a><td> var obj = new temp();<tr><td><a name="l264" href="#l264">264</a><td><tr><td><a name="l265" href="#l265">265</a><td> // obj is initialized by constructor.<tr><td><a name="l266" href="#l266">266</a><td> // arguments is only array-like so lacks shift(), but can be used with<tr><td><a name="l267" href="#l267">267</a><td> // the Array prototype function.<tr><td><a name="l268" href="#l268">268</a><td> constructor.apply(obj, Array.prototype.slice.call(arguments, 1));<tr><td><a name="l269" href="#l269">269</a><td> return obj;<tr><td><a name="l270" href="#l270">270</a><td>};<tr><td><a name="l271" href="#l271">271</a><td><tr><td><a name="l272" href="#l272">272</a><td><tr><td><a name="l273" href="#l273">273</a><td>/**<tr><td><a name="l274" href="#l274">274</a><td> * @define {boolean} Whether the return value cache should be used.<tr><td><a name="l275" href="#l275">275</a><td> * This should only be used to disable caches when testing.<tr><td><a name="l276" href="#l276">276</a><td> */<tr><td><a name="l277" href="#l277">277</a><td>goog.define(&#39;goog.functions.CACHE_RETURN_VALUE&#39;, true);<tr><td><a name="l278" href="#l278">278</a><td><tr><td><a name="l279" href="#l279">279</a><td><tr><td><a name="l280" href="#l280">280</a><td>/**<tr><td><a name="l281" href="#l281">281</a><td> * Gives a wrapper function that caches the return value of a parameterless<tr><td><a name="l282" href="#l282">282</a><td> * function when first called.<tr><td><a name="l283" href="#l283">283</a><td> *<tr><td><a name="l284" href="#l284">284</a><td> * When called for the first time, the given function is called and its<tr><td><a name="l285" href="#l285">285</a><td> * return value is cached (thus this is only appropriate for idempotent<tr><td><a name="l286" href="#l286">286</a><td> * functions). Subsequent calls will return the cached return value. This<tr><td><a name="l287" href="#l287">287</a><td> * allows the evaluation of expensive functions to be delayed until first used.<tr><td><a name="l288" href="#l288">288</a><td> *<tr><td><a name="l289" href="#l289">289</a><td> * To cache the return values of functions with parameters, see goog.memoize.<tr><td><a name="l290" href="#l290">290</a><td> *<tr><td><a name="l291" href="#l291">291</a><td> * @param {!function():T} fn A function to lazily evaluate.<tr><td><a name="l292" href="#l292">292</a><td> * @return {!function():T} A wrapped version the function.<tr><td><a name="l293" href="#l293">293</a><td> * @template T<tr><td><a name="l294" href="#l294">294</a><td> */<tr><td><a name="l295" href="#l295">295</a><td>goog.functions.cacheReturnValue = function(fn) {<tr><td><a name="l296" href="#l296">296</a><td> var called = false;<tr><td><a name="l297" href="#l297">297</a><td> var value;<tr><td><a name="l298" href="#l298">298</a><td><tr><td><a name="l299" href="#l299">299</a><td> return function() {<tr><td><a name="l300" href="#l300">300</a><td> if (!goog.functions.CACHE_RETURN_VALUE) {<tr><td><a name="l301" href="#l301">301</a><td> return fn();<tr><td><a name="l302" href="#l302">302</a><td> }<tr><td><a name="l303" href="#l303">303</a><td><tr><td><a name="l304" href="#l304">304</a><td> if (!called) {<tr><td><a name="l305" href="#l305">305</a><td> value = fn();<tr><td><a name="l306" href="#l306">306</a><td> called = true;<tr><td><a name="l307" href="#l307">307</a><td> }<tr><td><a name="l308" href="#l308">308</a><td><tr><td><a name="l309" href="#l309">309</a><td> return value;<tr><td><a name="l310" href="#l310">310</a><td> }<tr><td><a name="l311" href="#l311">311</a><td>};</table></pre></main><nav id="topnav"><div><div id="menubutton"><label for="sidenav-toggle">Menu</label></div><form id="searchbox"><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></nav><nav id="sidenav"><input type="checkbox" id="sidenav-types-ctrl" /><input type="checkbox" id="sidenav-files-ctrl" /><input type="checkbox" id="sidenav-modules-ctrl" /><a id="sidenav-overview"><div><h4>Overview</h4></div></a><div id="sidenav-types"><label for="sidenav-types-ctrl"><h4>Types</h4></label><i>Loading</i></div><div id="sidenav-modules"><label for="sidenav-modules-ctrl"><h4>Modules</h4></label><i>Loading</i></div><div id="sidenav-files"><label for="sidenav-files-ctrl"><h4>Files</h4></label><i>Loading</i></div><a href="../../../../license.html"><div><h4>License</h4></div></a></nav><div id="push-footer"></div></div><footer><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></footer><script src="../../../../types.js"></script><script src="../../../../dossier.js"></script>