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>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>http/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2011 Software Freedom Conservancy. 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 Defines a the {@code webdriver.http.Client} for use with<tr><td><a name="l17" href="#l17">17</a><td> * NodeJS.<tr><td><a name="l18" href="#l18">18</a><td> */<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var http = require(&#39;http&#39;),<tr><td><a name="l21" href="#l21">21</a><td> url = require(&#39;url&#39;);<tr><td><a name="l22" href="#l22">22</a><td><tr><td><a name="l23" href="#l23">23</a><td>var base = require(&#39;../_base&#39;),<tr><td><a name="l24" href="#l24">24</a><td> HttpResponse = base.require(&#39;webdriver.http.Response&#39;);<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>/**<tr><td><a name="l28" href="#l28">28</a><td> * A {@link webdriver.http.Client} implementation using Node&#39;s built-in http<tr><td><a name="l29" href="#l29">29</a><td> * module.<tr><td><a name="l30" href="#l30">30</a><td> * @param {string} serverUrl URL for the WebDriver server to send commands to.<tr><td><a name="l31" href="#l31">31</a><td> * @param {http.Agent=} opt_agent The agent to use for each request.<tr><td><a name="l32" href="#l32">32</a><td> * Defaults to {@code http.globalAgent}.<tr><td><a name="l33" href="#l33">33</a><td> * @constructor<tr><td><a name="l34" href="#l34">34</a><td> * @implements {webdriver.http.Client}<tr><td><a name="l35" href="#l35">35</a><td> */<tr><td><a name="l36" href="#l36">36</a><td>var HttpClient = function(serverUrl, opt_agent) {<tr><td><a name="l37" href="#l37">37</a><td> var parsedUrl = url.parse(serverUrl);<tr><td><a name="l38" href="#l38">38</a><td> if (!parsedUrl.hostname) {<tr><td><a name="l39" href="#l39">39</a><td> throw new Error(&#39;Invalid server URL: &#39; + serverUrl);<tr><td><a name="l40" href="#l40">40</a><td> }<tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td> /** @private {http.Agent} */<tr><td><a name="l43" href="#l43">43</a><td> this.agent_ = opt_agent;<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> * Base options for each request.<tr><td><a name="l47" href="#l47">47</a><td> * @private {!Object}<tr><td><a name="l48" href="#l48">48</a><td> */<tr><td><a name="l49" href="#l49">49</a><td> this.options_ = {<tr><td><a name="l50" href="#l50">50</a><td> host: parsedUrl.hostname,<tr><td><a name="l51" href="#l51">51</a><td> path: parsedUrl.pathname,<tr><td><a name="l52" href="#l52">52</a><td> port: parsedUrl.port<tr><td><a name="l53" href="#l53">53</a><td> };<tr><td><a name="l54" href="#l54">54</a><td>};<tr><td><a name="l55" href="#l55">55</a><td><tr><td><a name="l56" href="#l56">56</a><td><tr><td><a name="l57" href="#l57">57</a><td>/** @override */<tr><td><a name="l58" href="#l58">58</a><td>HttpClient.prototype.send = function(httpRequest, callback) {<tr><td><a name="l59" href="#l59">59</a><td> var data;<tr><td><a name="l60" href="#l60">60</a><td> httpRequest.headers[&#39;Content-Length&#39;] = 0;<tr><td><a name="l61" href="#l61">61</a><td> if (httpRequest.method == &#39;POST&#39; || httpRequest.method == &#39;PUT&#39;) {<tr><td><a name="l62" href="#l62">62</a><td> data = JSON.stringify(httpRequest.data);<tr><td><a name="l63" href="#l63">63</a><td> httpRequest.headers[&#39;Content-Length&#39;] = Buffer.byteLength(data, &#39;utf8&#39;);<tr><td><a name="l64" href="#l64">64</a><td> httpRequest.headers[&#39;Content-Type&#39;] = &#39;application/json;charset=UTF-8&#39;;<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> var path = this.options_.path;<tr><td><a name="l68" href="#l68">68</a><td> if (path[path.length - 1] === &#39;/&#39; &amp;&amp; httpRequest.path[0] === &#39;/&#39;) {<tr><td><a name="l69" href="#l69">69</a><td> path += httpRequest.path.substring(1);<tr><td><a name="l70" href="#l70">70</a><td> } else {<tr><td><a name="l71" href="#l71">71</a><td> path += httpRequest.path;<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> var options = {<tr><td><a name="l75" href="#l75">75</a><td> method: httpRequest.method,<tr><td><a name="l76" href="#l76">76</a><td> host: this.options_.host,<tr><td><a name="l77" href="#l77">77</a><td> port: this.options_.port,<tr><td><a name="l78" href="#l78">78</a><td> path: path,<tr><td><a name="l79" href="#l79">79</a><td> headers: httpRequest.headers<tr><td><a name="l80" href="#l80">80</a><td> };<tr><td><a name="l81" href="#l81">81</a><td> if (this.agent_) {<tr><td><a name="l82" href="#l82">82</a><td> options.agent = this.agent_;<tr><td><a name="l83" href="#l83">83</a><td> }<tr><td><a name="l84" href="#l84">84</a><td> sendRequest(options, callback, data);<tr><td><a name="l85" href="#l85">85</a><td>};<tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td><tr><td><a name="l88" href="#l88">88</a><td>/**<tr><td><a name="l89" href="#l89">89</a><td> * Sends a single HTTP request.<tr><td><a name="l90" href="#l90">90</a><td> * @param {!Object} options The request options.<tr><td><a name="l91" href="#l91">91</a><td> * @param {function(Error, !webdriver.http.Response=)} callback The function to<tr><td><a name="l92" href="#l92">92</a><td> * invoke with the server&#39;s response.<tr><td><a name="l93" href="#l93">93</a><td> * @param {string=} opt_data The data to send with the request.<tr><td><a name="l94" href="#l94">94</a><td> */<tr><td><a name="l95" href="#l95">95</a><td>var sendRequest = function(options, callback, opt_data) {<tr><td><a name="l96" href="#l96">96</a><td> var request = http.request(options, function(response) {<tr><td><a name="l97" href="#l97">97</a><td> if (response.statusCode == 302 || response.statusCode == 303) {<tr><td><a name="l98" href="#l98">98</a><td> try {<tr><td><a name="l99" href="#l99">99</a><td> var location = url.parse(response.headers[&#39;location&#39;]);<tr><td><a name="l100" href="#l100">100</a><td> } catch (ex) {<tr><td><a name="l101" href="#l101">101</a><td> callback(Error(<tr><td><a name="l102" href="#l102">102</a><td> &#39;Failed to parse &quot;Location&quot; header for server redirect: &#39; +<tr><td><a name="l103" href="#l103">103</a><td> ex.message + &#39;\nResponse was: \n&#39; +<tr><td><a name="l104" href="#l104">104</a><td> new HttpResponse(response.statusCode, response.headers, &#39;&#39;)));<tr><td><a name="l105" href="#l105">105</a><td> return;<tr><td><a name="l106" href="#l106">106</a><td> }<tr><td><a name="l107" href="#l107">107</a><td><tr><td><a name="l108" href="#l108">108</a><td> if (!location.hostname) {<tr><td><a name="l109" href="#l109">109</a><td> location.hostname = options.host;<tr><td><a name="l110" href="#l110">110</a><td> location.port = options.port;<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> request.abort();<tr><td><a name="l114" href="#l114">114</a><td> sendRequest({<tr><td><a name="l115" href="#l115">115</a><td> method: &#39;GET&#39;,<tr><td><a name="l116" href="#l116">116</a><td> host: location.hostname,<tr><td><a name="l117" href="#l117">117</a><td> path: location.pathname + (location.search || &#39;&#39;),<tr><td><a name="l118" href="#l118">118</a><td> port: location.port,<tr><td><a name="l119" href="#l119">119</a><td> headers: {<tr><td><a name="l120" href="#l120">120</a><td> &#39;Accept&#39;: &#39;application/json; charset=utf-8&#39;<tr><td><a name="l121" href="#l121">121</a><td> }<tr><td><a name="l122" href="#l122">122</a><td> }, callback);<tr><td><a name="l123" href="#l123">123</a><td> return;<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> var body = [];<tr><td><a name="l127" href="#l127">127</a><td> response.on(&#39;data&#39;, body.push.bind(body));<tr><td><a name="l128" href="#l128">128</a><td> response.on(&#39;end&#39;, function() {<tr><td><a name="l129" href="#l129">129</a><td> var resp = new HttpResponse(response.statusCode,<tr><td><a name="l130" href="#l130">130</a><td> response.headers, body.join(&#39;&#39;).replace(/\0/g, &#39;&#39;));<tr><td><a name="l131" href="#l131">131</a><td> callback(null, resp);<tr><td><a name="l132" href="#l132">132</a><td> });<tr><td><a name="l133" href="#l133">133</a><td> });<tr><td><a name="l134" href="#l134">134</a><td><tr><td><a name="l135" href="#l135">135</a><td> request.on(&#39;error&#39;, function(e) {<tr><td><a name="l136" href="#l136">136</a><td> if (e.code === &#39;ECONNRESET&#39;) {<tr><td><a name="l137" href="#l137">137</a><td> setTimeout(function() {<tr><td><a name="l138" href="#l138">138</a><td> sendRequest(options, callback, opt_data);<tr><td><a name="l139" href="#l139">139</a><td> }, 15);<tr><td><a name="l140" href="#l140">140</a><td> } else {<tr><td><a name="l141" href="#l141">141</a><td> var message = e.message;<tr><td><a name="l142" href="#l142">142</a><td> if (e.code) {<tr><td><a name="l143" href="#l143">143</a><td> message = e.code + &#39; &#39; + message;<tr><td><a name="l144" href="#l144">144</a><td> }<tr><td><a name="l145" href="#l145">145</a><td> callback(new Error(message));<tr><td><a name="l146" href="#l146">146</a><td> }<tr><td><a name="l147" href="#l147">147</a><td> });<tr><td><a name="l148" href="#l148">148</a><td><tr><td><a name="l149" href="#l149">149</a><td> if (opt_data) {<tr><td><a name="l150" href="#l150">150</a><td> request.write(opt_data);<tr><td><a name="l151" href="#l151">151</a><td> }<tr><td><a name="l152" href="#l152">152</a><td><tr><td><a name="l153" href="#l153">153</a><td> request.end();<tr><td><a name="l154" href="#l154">154</a><td>};<tr><td><a name="l155" href="#l155">155</a><td><tr><td><a name="l156" href="#l156">156</a><td><tr><td><a name="l157" href="#l157">157</a><td>// PUBLIC API<tr><td><a name="l158" href="#l158">158</a><td><tr><td><a name="l159" href="#l159">159</a><td>/** @type {webdriver.http.Executor.} */<tr><td><a name="l160" href="#l160">160</a><td>exports.Executor = base.require(&#39;webdriver.http.Executor&#39;);<tr><td><a name="l161" href="#l161">161</a><td><tr><td><a name="l162" href="#l162">162</a><td>/** @type {webdriver.http.Request.} */<tr><td><a name="l163" href="#l163">163</a><td>exports.Request = base.require(&#39;webdriver.http.Request&#39;);<tr><td><a name="l164" href="#l164">164</a><td><tr><td><a name="l165" href="#l165">165</a><td>/** @type {webdriver.http.Response.} */<tr><td><a name="l166" href="#l166">166</a><td>exports.Response = base.require(&#39;webdriver.http.Response&#39;);<tr><td><a name="l167" href="#l167">167</a><td><tr><td><a name="l168" href="#l168">168</a><td>exports.HttpClient = HttpClient;</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>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>http/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2011 Software Freedom Conservancy. 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 Defines a the {@code webdriver.http.Client} for use with<tr><td><a name="l17" href="#l17">17</a><td> * NodeJS.<tr><td><a name="l18" href="#l18">18</a><td> */<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var http = require(&#39;http&#39;),<tr><td><a name="l21" href="#l21">21</a><td> url = require(&#39;url&#39;);<tr><td><a name="l22" href="#l22">22</a><td><tr><td><a name="l23" href="#l23">23</a><td>var base = require(&#39;../_base&#39;),<tr><td><a name="l24" href="#l24">24</a><td> HttpResponse = base.require(&#39;webdriver.http.Response&#39;);<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>/**<tr><td><a name="l28" href="#l28">28</a><td> * A {@link webdriver.http.Client} implementation using Node&#39;s built-in http<tr><td><a name="l29" href="#l29">29</a><td> * module.<tr><td><a name="l30" href="#l30">30</a><td> * @param {string} serverUrl URL for the WebDriver server to send commands to.<tr><td><a name="l31" href="#l31">31</a><td> * @param {http.Agent=} opt_agent The agent to use for each request.<tr><td><a name="l32" href="#l32">32</a><td> * Defaults to {@code http.globalAgent}.<tr><td><a name="l33" href="#l33">33</a><td> * @constructor<tr><td><a name="l34" href="#l34">34</a><td> * @implements {webdriver.http.Client}<tr><td><a name="l35" href="#l35">35</a><td> */<tr><td><a name="l36" href="#l36">36</a><td>var HttpClient = function(serverUrl, opt_agent) {<tr><td><a name="l37" href="#l37">37</a><td> var parsedUrl = url.parse(serverUrl);<tr><td><a name="l38" href="#l38">38</a><td> if (!parsedUrl.hostname) {<tr><td><a name="l39" href="#l39">39</a><td> throw new Error(&#39;Invalid server URL: &#39; + serverUrl);<tr><td><a name="l40" href="#l40">40</a><td> }<tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td> /** @private {http.Agent} */<tr><td><a name="l43" href="#l43">43</a><td> this.agent_ = opt_agent;<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> * Base options for each request.<tr><td><a name="l47" href="#l47">47</a><td> * @private {!Object}<tr><td><a name="l48" href="#l48">48</a><td> */<tr><td><a name="l49" href="#l49">49</a><td> this.options_ = {<tr><td><a name="l50" href="#l50">50</a><td> host: parsedUrl.hostname,<tr><td><a name="l51" href="#l51">51</a><td> path: parsedUrl.pathname,<tr><td><a name="l52" href="#l52">52</a><td> port: parsedUrl.port<tr><td><a name="l53" href="#l53">53</a><td> };<tr><td><a name="l54" href="#l54">54</a><td>};<tr><td><a name="l55" href="#l55">55</a><td><tr><td><a name="l56" href="#l56">56</a><td><tr><td><a name="l57" href="#l57">57</a><td>/** @override */<tr><td><a name="l58" href="#l58">58</a><td>HttpClient.prototype.send = function(httpRequest, callback) {<tr><td><a name="l59" href="#l59">59</a><td> var data;<tr><td><a name="l60" href="#l60">60</a><td> httpRequest.headers[&#39;Content-Length&#39;] = 0;<tr><td><a name="l61" href="#l61">61</a><td> if (httpRequest.method == &#39;POST&#39; || httpRequest.method == &#39;PUT&#39;) {<tr><td><a name="l62" href="#l62">62</a><td> data = JSON.stringify(httpRequest.data);<tr><td><a name="l63" href="#l63">63</a><td> httpRequest.headers[&#39;Content-Length&#39;] = Buffer.byteLength(data, &#39;utf8&#39;);<tr><td><a name="l64" href="#l64">64</a><td> httpRequest.headers[&#39;Content-Type&#39;] = &#39;application/json;charset=UTF-8&#39;;<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> var path = this.options_.path;<tr><td><a name="l68" href="#l68">68</a><td> if (path[path.length - 1] === &#39;/&#39; &amp;&amp; httpRequest.path[0] === &#39;/&#39;) {<tr><td><a name="l69" href="#l69">69</a><td> path += httpRequest.path.substring(1);<tr><td><a name="l70" href="#l70">70</a><td> } else {<tr><td><a name="l71" href="#l71">71</a><td> path += httpRequest.path;<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> var options = {<tr><td><a name="l75" href="#l75">75</a><td> method: httpRequest.method,<tr><td><a name="l76" href="#l76">76</a><td> host: this.options_.host,<tr><td><a name="l77" href="#l77">77</a><td> port: this.options_.port,<tr><td><a name="l78" href="#l78">78</a><td> path: path,<tr><td><a name="l79" href="#l79">79</a><td> headers: httpRequest.headers<tr><td><a name="l80" href="#l80">80</a><td> };<tr><td><a name="l81" href="#l81">81</a><td> if (this.agent_) {<tr><td><a name="l82" href="#l82">82</a><td> options.agent = this.agent_;<tr><td><a name="l83" href="#l83">83</a><td> }<tr><td><a name="l84" href="#l84">84</a><td> sendRequest(options, callback, data);<tr><td><a name="l85" href="#l85">85</a><td>};<tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td><tr><td><a name="l88" href="#l88">88</a><td>/**<tr><td><a name="l89" href="#l89">89</a><td> * Sends a single HTTP request.<tr><td><a name="l90" href="#l90">90</a><td> * @param {!Object} options The request options.<tr><td><a name="l91" href="#l91">91</a><td> * @param {function(Error, !webdriver.http.Response=)} callback The function to<tr><td><a name="l92" href="#l92">92</a><td> * invoke with the server&#39;s response.<tr><td><a name="l93" href="#l93">93</a><td> * @param {string=} opt_data The data to send with the request.<tr><td><a name="l94" href="#l94">94</a><td> */<tr><td><a name="l95" href="#l95">95</a><td>var sendRequest = function(options, callback, opt_data) {<tr><td><a name="l96" href="#l96">96</a><td> var request = http.request(options, function(response) {<tr><td><a name="l97" href="#l97">97</a><td> if (response.statusCode == 302 || response.statusCode == 303) {<tr><td><a name="l98" href="#l98">98</a><td> try {<tr><td><a name="l99" href="#l99">99</a><td> var location = url.parse(response.headers[&#39;location&#39;]);<tr><td><a name="l100" href="#l100">100</a><td> } catch (ex) {<tr><td><a name="l101" href="#l101">101</a><td> callback(Error(<tr><td><a name="l102" href="#l102">102</a><td> &#39;Failed to parse &quot;Location&quot; header for server redirect: &#39; +<tr><td><a name="l103" href="#l103">103</a><td> ex.message + &#39;\nResponse was: \n&#39; +<tr><td><a name="l104" href="#l104">104</a><td> new HttpResponse(response.statusCode, response.headers, &#39;&#39;)));<tr><td><a name="l105" href="#l105">105</a><td> return;<tr><td><a name="l106" href="#l106">106</a><td> }<tr><td><a name="l107" href="#l107">107</a><td><tr><td><a name="l108" href="#l108">108</a><td> if (!location.hostname) {<tr><td><a name="l109" href="#l109">109</a><td> location.hostname = options.host;<tr><td><a name="l110" href="#l110">110</a><td> location.port = options.port;<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> request.abort();<tr><td><a name="l114" href="#l114">114</a><td> sendRequest({<tr><td><a name="l115" href="#l115">115</a><td> method: &#39;GET&#39;,<tr><td><a name="l116" href="#l116">116</a><td> host: location.hostname,<tr><td><a name="l117" href="#l117">117</a><td> path: location.pathname + (location.search || &#39;&#39;),<tr><td><a name="l118" href="#l118">118</a><td> port: location.port,<tr><td><a name="l119" href="#l119">119</a><td> headers: {<tr><td><a name="l120" href="#l120">120</a><td> &#39;Accept&#39;: &#39;application/json; charset=utf-8&#39;<tr><td><a name="l121" href="#l121">121</a><td> }<tr><td><a name="l122" href="#l122">122</a><td> }, callback);<tr><td><a name="l123" href="#l123">123</a><td> return;<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> var body = [];<tr><td><a name="l127" href="#l127">127</a><td> response.on(&#39;data&#39;, body.push.bind(body));<tr><td><a name="l128" href="#l128">128</a><td> response.on(&#39;end&#39;, function() {<tr><td><a name="l129" href="#l129">129</a><td> var resp = new HttpResponse(response.statusCode,<tr><td><a name="l130" href="#l130">130</a><td> response.headers, body.join(&#39;&#39;).replace(/\0/g, &#39;&#39;));<tr><td><a name="l131" href="#l131">131</a><td> callback(null, resp);<tr><td><a name="l132" href="#l132">132</a><td> });<tr><td><a name="l133" href="#l133">133</a><td> });<tr><td><a name="l134" href="#l134">134</a><td><tr><td><a name="l135" href="#l135">135</a><td> request.on(&#39;error&#39;, function(e) {<tr><td><a name="l136" href="#l136">136</a><td> if (e.code === &#39;ECONNRESET&#39;) {<tr><td><a name="l137" href="#l137">137</a><td> setTimeout(function() {<tr><td><a name="l138" href="#l138">138</a><td> sendRequest(options, callback, opt_data);<tr><td><a name="l139" href="#l139">139</a><td> }, 15);<tr><td><a name="l140" href="#l140">140</a><td> } else {<tr><td><a name="l141" href="#l141">141</a><td> var message = e.message;<tr><td><a name="l142" href="#l142">142</a><td> if (e.code) {<tr><td><a name="l143" href="#l143">143</a><td> message = e.code + &#39; &#39; + message;<tr><td><a name="l144" href="#l144">144</a><td> }<tr><td><a name="l145" href="#l145">145</a><td> callback(new Error(message));<tr><td><a name="l146" href="#l146">146</a><td> }<tr><td><a name="l147" href="#l147">147</a><td> });<tr><td><a name="l148" href="#l148">148</a><td><tr><td><a name="l149" href="#l149">149</a><td> if (opt_data) {<tr><td><a name="l150" href="#l150">150</a><td> request.write(opt_data);<tr><td><a name="l151" href="#l151">151</a><td> }<tr><td><a name="l152" href="#l152">152</a><td><tr><td><a name="l153" href="#l153">153</a><td> request.end();<tr><td><a name="l154" href="#l154">154</a><td>};<tr><td><a name="l155" href="#l155">155</a><td><tr><td><a name="l156" href="#l156">156</a><td><tr><td><a name="l157" href="#l157">157</a><td>// PUBLIC API<tr><td><a name="l158" href="#l158">158</a><td><tr><td><a name="l159" href="#l159">159</a><td>/** @type {webdriver.http.Executor.} */<tr><td><a name="l160" href="#l160">160</a><td>exports.Executor = base.require(&#39;webdriver.http.Executor&#39;);<tr><td><a name="l161" href="#l161">161</a><td><tr><td><a name="l162" href="#l162">162</a><td>/** @type {webdriver.http.Request.} */<tr><td><a name="l163" href="#l163">163</a><td>exports.Request = base.require(&#39;webdriver.http.Request&#39;);<tr><td><a name="l164" href="#l164">164</a><td><tr><td><a name="l165" href="#l165">165</a><td>/** @type {webdriver.http.Response.} */<tr><td><a name="l166" href="#l166">166</a><td>exports.Response = base.require(&#39;webdriver.http.Response&#39;);<tr><td><a name="l167" href="#l167">167</a><td><tr><td><a name="l168" href="#l168">168</a><td>exports.HttpClient = HttpClient;</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>util.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>http/util.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>/**<tr><td><a name="l17" href="#l17">17</a><td> * @fileoverview Various HTTP utilities.<tr><td><a name="l18" href="#l18">18</a><td> */<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var base = require(&#39;../_base&#39;),<tr><td><a name="l21" href="#l21">21</a><td> HttpClient = require(&#39;./index&#39;).HttpClient,<tr><td><a name="l22" href="#l22">22</a><td> checkResponse = base.require(&#39;bot.response&#39;).checkResponse,<tr><td><a name="l23" href="#l23">23</a><td> Executor = base.require(&#39;webdriver.http.Executor&#39;),<tr><td><a name="l24" href="#l24">24</a><td> HttpRequest = base.require(&#39;webdriver.http.Request&#39;),<tr><td><a name="l25" href="#l25">25</a><td> Command = base.require(&#39;webdriver.Command&#39;),<tr><td><a name="l26" href="#l26">26</a><td> CommandName = base.require(&#39;webdriver.CommandName&#39;),<tr><td><a name="l27" href="#l27">27</a><td> promise = base.require(&#39;webdriver.promise&#39;);<tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td><tr><td><a name="l31" href="#l31">31</a><td>/**<tr><td><a name="l32" href="#l32">32</a><td> * Queries a WebDriver server for its current status.<tr><td><a name="l33" href="#l33">33</a><td> * @param {string} url Base URL of the server to query.<tr><td><a name="l34" href="#l34">34</a><td> * @param {function(Error, *=)} callback The function to call with the<tr><td><a name="l35" href="#l35">35</a><td> * response.<tr><td><a name="l36" href="#l36">36</a><td> */<tr><td><a name="l37" href="#l37">37</a><td>function getStatus(url, callback) {<tr><td><a name="l38" href="#l38">38</a><td> var client = new HttpClient(url);<tr><td><a name="l39" href="#l39">39</a><td> var executor = new Executor(client);<tr><td><a name="l40" href="#l40">40</a><td> var command = new Command(CommandName.GET_SERVER_STATUS);<tr><td><a name="l41" href="#l41">41</a><td> executor.execute(command, function(err, responseObj) {<tr><td><a name="l42" href="#l42">42</a><td> if (err) return callback(err);<tr><td><a name="l43" href="#l43">43</a><td> try {<tr><td><a name="l44" href="#l44">44</a><td> checkResponse(responseObj);<tr><td><a name="l45" href="#l45">45</a><td> } catch (ex) {<tr><td><a name="l46" href="#l46">46</a><td> return callback(ex);<tr><td><a name="l47" href="#l47">47</a><td> }<tr><td><a name="l48" href="#l48">48</a><td> callback(null, responseObj[&#39;value&#39;]);<tr><td><a name="l49" href="#l49">49</a><td> });<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><tr><td><a name="l53" href="#l53">53</a><td>// PUBLIC API<tr><td><a name="l54" href="#l54">54</a><td><tr><td><a name="l55" href="#l55">55</a><td><tr><td><a name="l56" href="#l56">56</a><td>/**<tr><td><a name="l57" href="#l57">57</a><td> * Queries a WebDriver server for its current status.<tr><td><a name="l58" href="#l58">58</a><td> * @param {string} url Base URL of the server to query.<tr><td><a name="l59" href="#l59">59</a><td> * @return {!webdriver.promise.Promise.&lt;!Object&gt;} A promise that resolves with<tr><td><a name="l60" href="#l60">60</a><td> * a hash of the server status.<tr><td><a name="l61" href="#l61">61</a><td> */<tr><td><a name="l62" href="#l62">62</a><td>exports.getStatus = function(url) {<tr><td><a name="l63" href="#l63">63</a><td> return promise.checkedNodeCall(getStatus.bind(null, url));<tr><td><a name="l64" href="#l64">64</a><td>};<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> * Waits for a WebDriver server to be healthy and accepting requests.<tr><td><a name="l69" href="#l69">69</a><td> * @param {string} url Base URL of the server to query.<tr><td><a name="l70" href="#l70">70</a><td> * @param {number} timeout How long to wait for the server.<tr><td><a name="l71" href="#l71">71</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a name="l72" href="#l72">72</a><td> * server is ready.<tr><td><a name="l73" href="#l73">73</a><td> */<tr><td><a name="l74" href="#l74">74</a><td>exports.waitForServer = function(url, timeout) {<tr><td><a name="l75" href="#l75">75</a><td> var ready = promise.defer(),<tr><td><a name="l76" href="#l76">76</a><td> start = Date.now(),<tr><td><a name="l77" href="#l77">77</a><td> checkServerStatus = getStatus.bind(null, url, onResponse);<tr><td><a name="l78" href="#l78">78</a><td> checkServerStatus();<tr><td><a name="l79" href="#l79">79</a><td> return ready.promise;<tr><td><a name="l80" href="#l80">80</a><td><tr><td><a name="l81" href="#l81">81</a><td> function onResponse(err) {<tr><td><a name="l82" href="#l82">82</a><td> if (!ready.isPending()) return;<tr><td><a name="l83" href="#l83">83</a><td> if (!err) return ready.fulfill();<tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td> if (Date.now() - start &gt; timeout) {<tr><td><a name="l86" href="#l86">86</a><td> ready.reject(<tr><td><a name="l87" href="#l87">87</a><td> Error(&#39;Timed out waiting for the WebDriver server at &#39; + url));<tr><td><a name="l88" href="#l88">88</a><td> } else {<tr><td><a name="l89" href="#l89">89</a><td> setTimeout(function() {<tr><td><a name="l90" href="#l90">90</a><td> if (ready.isPending()) {<tr><td><a name="l91" href="#l91">91</a><td> checkServerStatus();<tr><td><a name="l92" href="#l92">92</a><td> }<tr><td><a name="l93" href="#l93">93</a><td> }, 50);<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><tr><td><a name="l99" href="#l99">99</a><td>/**<tr><td><a name="l100" href="#l100">100</a><td> * Polls a URL with GET requests until it returns a 2xx response or the<tr><td><a name="l101" href="#l101">101</a><td> * timeout expires.<tr><td><a name="l102" href="#l102">102</a><td> * @param {string} url The URL to poll.<tr><td><a name="l103" href="#l103">103</a><td> * @param {number} timeout How long to wait, in milliseconds.<tr><td><a name="l104" href="#l104">104</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a name="l105" href="#l105">105</a><td> * URL responds with 2xx.<tr><td><a name="l106" href="#l106">106</a><td> */<tr><td><a name="l107" href="#l107">107</a><td>exports.waitForUrl = function(url, timeout) {<tr><td><a name="l108" href="#l108">108</a><td> var client = new HttpClient(url),<tr><td><a name="l109" href="#l109">109</a><td> request = new HttpRequest(&#39;GET&#39;, &#39;&#39;),<tr><td><a name="l110" href="#l110">110</a><td> testUrl = client.send.bind(client, request, onResponse),<tr><td><a name="l111" href="#l111">111</a><td> ready = promise.defer(),<tr><td><a name="l112" href="#l112">112</a><td> start = Date.now();<tr><td><a name="l113" href="#l113">113</a><td> testUrl();<tr><td><a name="l114" href="#l114">114</a><td> return ready.promise;<tr><td><a name="l115" href="#l115">115</a><td><tr><td><a name="l116" href="#l116">116</a><td> function onResponse(err, response) {<tr><td><a name="l117" href="#l117">117</a><td> if (!ready.isPending()) return;<tr><td><a name="l118" href="#l118">118</a><td> if (!err &amp;&amp; response.status &gt; 199 &amp;&amp; response.status &lt; 300) {<tr><td><a name="l119" href="#l119">119</a><td> return ready.fulfill();<tr><td><a name="l120" href="#l120">120</a><td> }<tr><td><a name="l121" href="#l121">121</a><td><tr><td><a name="l122" href="#l122">122</a><td> if (Date.now() - start &gt; timeout) {<tr><td><a name="l123" href="#l123">123</a><td> ready.reject(Error(<tr><td><a name="l124" href="#l124">124</a><td> &#39;Timed out waiting for the URL to return 2xx: &#39; + url));<tr><td><a name="l125" href="#l125">125</a><td> } else {<tr><td><a name="l126" href="#l126">126</a><td> setTimeout(function() {<tr><td><a name="l127" href="#l127">127</a><td> if (ready.isPending()) {<tr><td><a name="l128" href="#l128">128</a><td> testUrl();<tr><td><a name="l129" href="#l129">129</a><td> }<tr><td><a name="l130" href="#l130">130</a><td> }, 50);<tr><td><a name="l131" href="#l131">131</a><td> }<tr><td><a name="l132" href="#l132">132</a><td> }<tr><td><a name="l133" href="#l133">133</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>util.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>http/util.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>/**<tr><td><a name="l17" href="#l17">17</a><td> * @fileoverview Various HTTP utilities.<tr><td><a name="l18" href="#l18">18</a><td> */<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var base = require(&#39;../_base&#39;),<tr><td><a name="l21" href="#l21">21</a><td> HttpClient = require(&#39;./index&#39;).HttpClient,<tr><td><a name="l22" href="#l22">22</a><td> checkResponse = base.require(&#39;bot.response&#39;).checkResponse,<tr><td><a name="l23" href="#l23">23</a><td> Executor = base.require(&#39;webdriver.http.Executor&#39;),<tr><td><a name="l24" href="#l24">24</a><td> HttpRequest = base.require(&#39;webdriver.http.Request&#39;),<tr><td><a name="l25" href="#l25">25</a><td> Command = base.require(&#39;webdriver.Command&#39;),<tr><td><a name="l26" href="#l26">26</a><td> CommandName = base.require(&#39;webdriver.CommandName&#39;),<tr><td><a name="l27" href="#l27">27</a><td> promise = base.require(&#39;webdriver.promise&#39;);<tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td><tr><td><a name="l31" href="#l31">31</a><td>/**<tr><td><a name="l32" href="#l32">32</a><td> * Queries a WebDriver server for its current status.<tr><td><a name="l33" href="#l33">33</a><td> * @param {string} url Base URL of the server to query.<tr><td><a name="l34" href="#l34">34</a><td> * @param {function(Error, *=)} callback The function to call with the<tr><td><a name="l35" href="#l35">35</a><td> * response.<tr><td><a name="l36" href="#l36">36</a><td> */<tr><td><a name="l37" href="#l37">37</a><td>function getStatus(url, callback) {<tr><td><a name="l38" href="#l38">38</a><td> var client = new HttpClient(url);<tr><td><a name="l39" href="#l39">39</a><td> var executor = new Executor(client);<tr><td><a name="l40" href="#l40">40</a><td> var command = new Command(CommandName.GET_SERVER_STATUS);<tr><td><a name="l41" href="#l41">41</a><td> executor.execute(command, function(err, responseObj) {<tr><td><a name="l42" href="#l42">42</a><td> if (err) return callback(err);<tr><td><a name="l43" href="#l43">43</a><td> try {<tr><td><a name="l44" href="#l44">44</a><td> checkResponse(responseObj);<tr><td><a name="l45" href="#l45">45</a><td> } catch (ex) {<tr><td><a name="l46" href="#l46">46</a><td> return callback(ex);<tr><td><a name="l47" href="#l47">47</a><td> }<tr><td><a name="l48" href="#l48">48</a><td> callback(null, responseObj[&#39;value&#39;]);<tr><td><a name="l49" href="#l49">49</a><td> });<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><tr><td><a name="l53" href="#l53">53</a><td>// PUBLIC API<tr><td><a name="l54" href="#l54">54</a><td><tr><td><a name="l55" href="#l55">55</a><td><tr><td><a name="l56" href="#l56">56</a><td>/**<tr><td><a name="l57" href="#l57">57</a><td> * Queries a WebDriver server for its current status.<tr><td><a name="l58" href="#l58">58</a><td> * @param {string} url Base URL of the server to query.<tr><td><a name="l59" href="#l59">59</a><td> * @return {!webdriver.promise.Promise.&lt;!Object&gt;} A promise that resolves with<tr><td><a name="l60" href="#l60">60</a><td> * a hash of the server status.<tr><td><a name="l61" href="#l61">61</a><td> */<tr><td><a name="l62" href="#l62">62</a><td>exports.getStatus = function(url) {<tr><td><a name="l63" href="#l63">63</a><td> return promise.checkedNodeCall(getStatus.bind(null, url));<tr><td><a name="l64" href="#l64">64</a><td>};<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> * Waits for a WebDriver server to be healthy and accepting requests.<tr><td><a name="l69" href="#l69">69</a><td> * @param {string} url Base URL of the server to query.<tr><td><a name="l70" href="#l70">70</a><td> * @param {number} timeout How long to wait for the server.<tr><td><a name="l71" href="#l71">71</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a name="l72" href="#l72">72</a><td> * server is ready.<tr><td><a name="l73" href="#l73">73</a><td> */<tr><td><a name="l74" href="#l74">74</a><td>exports.waitForServer = function(url, timeout) {<tr><td><a name="l75" href="#l75">75</a><td> var ready = promise.defer(),<tr><td><a name="l76" href="#l76">76</a><td> start = Date.now(),<tr><td><a name="l77" href="#l77">77</a><td> checkServerStatus = getStatus.bind(null, url, onResponse);<tr><td><a name="l78" href="#l78">78</a><td> checkServerStatus();<tr><td><a name="l79" href="#l79">79</a><td> return ready.promise;<tr><td><a name="l80" href="#l80">80</a><td><tr><td><a name="l81" href="#l81">81</a><td> function onResponse(err) {<tr><td><a name="l82" href="#l82">82</a><td> if (!ready.isPending()) return;<tr><td><a name="l83" href="#l83">83</a><td> if (!err) return ready.fulfill();<tr><td><a name="l84" href="#l84">84</a><td><tr><td><a name="l85" href="#l85">85</a><td> if (Date.now() - start &gt; timeout) {<tr><td><a name="l86" href="#l86">86</a><td> ready.reject(<tr><td><a name="l87" href="#l87">87</a><td> Error(&#39;Timed out waiting for the WebDriver server at &#39; + url));<tr><td><a name="l88" href="#l88">88</a><td> } else {<tr><td><a name="l89" href="#l89">89</a><td> setTimeout(function() {<tr><td><a name="l90" href="#l90">90</a><td> if (ready.isPending()) {<tr><td><a name="l91" href="#l91">91</a><td> checkServerStatus();<tr><td><a name="l92" href="#l92">92</a><td> }<tr><td><a name="l93" href="#l93">93</a><td> }, 50);<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><tr><td><a name="l99" href="#l99">99</a><td>/**<tr><td><a name="l100" href="#l100">100</a><td> * Polls a URL with GET requests until it returns a 2xx response or the<tr><td><a name="l101" href="#l101">101</a><td> * timeout expires.<tr><td><a name="l102" href="#l102">102</a><td> * @param {string} url The URL to poll.<tr><td><a name="l103" href="#l103">103</a><td> * @param {number} timeout How long to wait, in milliseconds.<tr><td><a name="l104" href="#l104">104</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a name="l105" href="#l105">105</a><td> * URL responds with 2xx.<tr><td><a name="l106" href="#l106">106</a><td> */<tr><td><a name="l107" href="#l107">107</a><td>exports.waitForUrl = function(url, timeout) {<tr><td><a name="l108" href="#l108">108</a><td> var client = new HttpClient(url),<tr><td><a name="l109" href="#l109">109</a><td> request = new HttpRequest(&#39;GET&#39;, &#39;&#39;),<tr><td><a name="l110" href="#l110">110</a><td> testUrl = client.send.bind(client, request, onResponse),<tr><td><a name="l111" href="#l111">111</a><td> ready = promise.defer(),<tr><td><a name="l112" href="#l112">112</a><td> start = Date.now();<tr><td><a name="l113" href="#l113">113</a><td> testUrl();<tr><td><a name="l114" href="#l114">114</a><td> return ready.promise;<tr><td><a name="l115" href="#l115">115</a><td><tr><td><a name="l116" href="#l116">116</a><td> function onResponse(err, response) {<tr><td><a name="l117" href="#l117">117</a><td> if (!ready.isPending()) return;<tr><td><a name="l118" href="#l118">118</a><td> if (!err &amp;&amp; response.status &gt; 199 &amp;&amp; response.status &lt; 300) {<tr><td><a name="l119" href="#l119">119</a><td> return ready.fulfill();<tr><td><a name="l120" href="#l120">120</a><td> }<tr><td><a name="l121" href="#l121">121</a><td><tr><td><a name="l122" href="#l122">122</a><td> if (Date.now() - start &gt; timeout) {<tr><td><a name="l123" href="#l123">123</a><td> ready.reject(Error(<tr><td><a name="l124" href="#l124">124</a><td> &#39;Timed out waiting for the URL to return 2xx: &#39; + url));<tr><td><a name="l125" href="#l125">125</a><td> } else {<tr><td><a name="l126" href="#l126">126</a><td> setTimeout(function() {<tr><td><a name="l127" href="#l127">127</a><td> if (ready.isPending()) {<tr><td><a name="l128" href="#l128">128</a><td> testUrl();<tr><td><a name="l129" href="#l129">129</a><td> }<tr><td><a name="l130" href="#l130">130</a><td> }, 50);<tr><td><a name="l131" href="#l131">131</a><td> }<tr><td><a name="l132" href="#l132">132</a><td> }<tr><td><a name="l133" href="#l133">133</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>index.js</title><link href="../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2012 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2012 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>/**<tr><td><a name="l17" href="#l17">17</a><td> * @fileoverview The main user facing module. Exports WebDriver&#39;s primary<tr><td><a name="l18" href="#l18">18</a><td> * public API and provides convenience assessors to certain sub-modules.<tr><td><a name="l19" href="#l19">19</a><td> */<tr><td><a name="l20" href="#l20">20</a><td><tr><td><a name="l21" href="#l21">21</a><td>var base = require(&#39;./_base&#39;);<tr><td><a name="l22" href="#l22">22</a><td>var builder = require(&#39;./builder&#39;);<tr><td><a name="l23" href="#l23">23</a><td>var error = require(&#39;./error&#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>// NOTE: the remainder of this file is nasty and verbose, but the annotations<tr><td><a name="l27" href="#l27">27</a><td>// are necessary to guide the Closure Compiler&#39;s type analysis. Without them,<tr><td><a name="l28" href="#l28">28</a><td>// we would not be able to extract any meaningful API documentation.<tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td><tr><td><a name="l31" href="#l31">31</a><td>/** @type {function(new: webdriver.ActionSequence)} */<tr><td><a name="l32" href="#l32">32</a><td>exports.ActionSequence = base.require(&#39;webdriver.ActionSequence&#39;);<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>/** @type {function(new: builder.Builder)} */<tr><td><a name="l36" href="#l36">36</a><td>exports.Builder = builder.Builder;<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>/** @type {webdriver.By.} */<tr><td><a name="l40" href="#l40">40</a><td>exports.By = base.require(&#39;webdriver.By&#39;);<tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td><tr><td><a name="l43" href="#l43">43</a><td>/** @type {function(new: webdriver.Capabilities)} */<tr><td><a name="l44" href="#l44">44</a><td>exports.Capabilities = base.require(&#39;webdriver.Capabilities&#39;);<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>/** @type {function(new: webdriver.Command)} */<tr><td><a name="l48" href="#l48">48</a><td>exports.Command = base.require(&#39;webdriver.Command&#39;);<tr><td><a name="l49" href="#l49">49</a><td><tr><td><a name="l50" href="#l50">50</a><td><tr><td><a name="l51" href="#l51">51</a><td>/** @type {function(new: webdriver.EventEmitter)} */<tr><td><a name="l52" href="#l52">52</a><td>exports.EventEmitter = base.require(&#39;webdriver.EventEmitter&#39;);<tr><td><a name="l53" href="#l53">53</a><td><tr><td><a name="l54" href="#l54">54</a><td><tr><td><a name="l55" href="#l55">55</a><td>/** @type {function(new: webdriver.Session)} */<tr><td><a name="l56" href="#l56">56</a><td>exports.Session = base.require(&#39;webdriver.Session&#39;);<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>/** @type {function(new: webdriver.WebDriver)} */<tr><td><a name="l60" href="#l60">60</a><td>exports.WebDriver = base.require(&#39;webdriver.WebDriver&#39;);<tr><td><a name="l61" href="#l61">61</a><td><tr><td><a name="l62" href="#l62">62</a><td><tr><td><a name="l63" href="#l63">63</a><td>/** @type {function(new: webdriver.WebElement)} */<tr><td><a name="l64" href="#l64">64</a><td>exports.WebElement = base.require(&#39;webdriver.WebElement&#39;);<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>/** @type {function(new: webdriver.WebElementPromise)} */<tr><td><a name="l68" href="#l68">68</a><td>exports.WebElementPromise = base.require(&#39;webdriver.WebElementPromise&#39;);<tr><td><a name="l69" href="#l69">69</a><td><tr><td><a name="l70" href="#l70">70</a><td><tr><td><a name="l71" href="#l71">71</a><td>// Export the remainder of our API through getters to keep things cleaner<tr><td><a name="l72" href="#l72">72</a><td>// when this module is used in a REPL environment.<tr><td><a name="l73" href="#l73">73</a><td><tr><td><a name="l74" href="#l74">74</a><td><tr><td><a name="l75" href="#l75">75</a><td>/** @type {webdriver.Browser.} */<tr><td><a name="l76" href="#l76">76</a><td>(exports.__defineGetter__(&#39;Browser&#39;, function() {<tr><td><a name="l77" href="#l77">77</a><td> return base.require(&#39;webdriver.Browser&#39;);<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>/** @type {webdriver.Button.} */<tr><td><a name="l82" href="#l82">82</a><td>(exports.__defineGetter__(&#39;Button&#39;, function() {<tr><td><a name="l83" href="#l83">83</a><td> return base.require(&#39;webdriver.Button&#39;);<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><tr><td><a name="l87" href="#l87">87</a><td>/** @type {webdriver.Capability.} */<tr><td><a name="l88" href="#l88">88</a><td>(exports.__defineGetter__(&#39;Capability&#39;, function() {<tr><td><a name="l89" href="#l89">89</a><td> return base.require(&#39;webdriver.Capability&#39;);<tr><td><a name="l90" href="#l90">90</a><td>}));<tr><td><a name="l91" href="#l91">91</a><td><tr><td><a name="l92" href="#l92">92</a><td><tr><td><a name="l93" href="#l93">93</a><td>/** @type {webdriver.CommandName.} */<tr><td><a name="l94" href="#l94">94</a><td>(exports.__defineGetter__(&#39;CommandName&#39;, function() {<tr><td><a name="l95" href="#l95">95</a><td> return base.require(&#39;webdriver.CommandName&#39;);<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><tr><td><a name="l99" href="#l99">99</a><td>/** @type {webdriver.Key.} */<tr><td><a name="l100" href="#l100">100</a><td>(exports.__defineGetter__(&#39;Key&#39;, function() {<tr><td><a name="l101" href="#l101">101</a><td> return base.require(&#39;webdriver.Key&#39;);<tr><td><a name="l102" href="#l102">102</a><td>}));<tr><td><a name="l103" href="#l103">103</a><td><tr><td><a name="l104" href="#l104">104</a><td><tr><td><a name="l105" href="#l105">105</a><td>/** @type {error.} */<tr><td><a name="l106" href="#l106">106</a><td>(exports.__defineGetter__(&#39;error&#39;, function() {<tr><td><a name="l107" href="#l107">107</a><td> return error;<tr><td><a name="l108" href="#l108">108</a><td>}));<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>/** @type {error.} */<tr><td><a name="l112" href="#l112">112</a><td>(exports.__defineGetter__(&#39;error&#39;, function() {<tr><td><a name="l113" href="#l113">113</a><td> return error;<tr><td><a name="l114" href="#l114">114</a><td>}));<tr><td><a name="l115" href="#l115">115</a><td><tr><td><a name="l116" href="#l116">116</a><td><tr><td><a name="l117" href="#l117">117</a><td>/** @type {webdriver.logging.} */<tr><td><a name="l118" href="#l118">118</a><td>(exports.__defineGetter__(&#39;logging&#39;, function() {<tr><td><a name="l119" href="#l119">119</a><td> return base.exportPublicApi(&#39;webdriver.logging&#39;);<tr><td><a name="l120" href="#l120">120</a><td>}));<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>/** @type {webdriver.promise.} */<tr><td><a name="l124" href="#l124">124</a><td>(exports.__defineGetter__(&#39;promise&#39;, function() {<tr><td><a name="l125" href="#l125">125</a><td> return base.exportPublicApi(&#39;webdriver.promise&#39;);<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><tr><td><a name="l129" href="#l129">129</a><td>/** @type {webdriver.stacktrace.} */<tr><td><a name="l130" href="#l130">130</a><td>(exports.__defineGetter__(&#39;stacktrace&#39;, function() {<tr><td><a name="l131" href="#l131">131</a><td> return base.exportPublicApi(&#39;webdriver.stacktrace&#39;);<tr><td><a name="l132" href="#l132">132</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>index.js</title><link href="../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2012 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2012 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>/**<tr><td><a name="l17" href="#l17">17</a><td> * @fileoverview The main user facing module. Exports WebDriver&#39;s primary<tr><td><a name="l18" href="#l18">18</a><td> * public API and provides convenience assessors to certain sub-modules.<tr><td><a name="l19" href="#l19">19</a><td> */<tr><td><a name="l20" href="#l20">20</a><td><tr><td><a name="l21" href="#l21">21</a><td>var base = require(&#39;./_base&#39;);<tr><td><a name="l22" href="#l22">22</a><td>var builder = require(&#39;./builder&#39;);<tr><td><a name="l23" href="#l23">23</a><td>var error = require(&#39;./error&#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>// NOTE: the remainder of this file is nasty and verbose, but the annotations<tr><td><a name="l27" href="#l27">27</a><td>// are necessary to guide the Closure Compiler&#39;s type analysis. Without them,<tr><td><a name="l28" href="#l28">28</a><td>// we would not be able to extract any meaningful API documentation.<tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td><tr><td><a name="l31" href="#l31">31</a><td>/** @type {function(new: webdriver.ActionSequence)} */<tr><td><a name="l32" href="#l32">32</a><td>exports.ActionSequence = base.require(&#39;webdriver.ActionSequence&#39;);<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>/** @type {function(new: builder.Builder)} */<tr><td><a name="l36" href="#l36">36</a><td>exports.Builder = builder.Builder;<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>/** @type {webdriver.By.} */<tr><td><a name="l40" href="#l40">40</a><td>exports.By = base.require(&#39;webdriver.By&#39;);<tr><td><a name="l41" href="#l41">41</a><td><tr><td><a name="l42" href="#l42">42</a><td><tr><td><a name="l43" href="#l43">43</a><td>/** @type {function(new: webdriver.Capabilities)} */<tr><td><a name="l44" href="#l44">44</a><td>exports.Capabilities = base.require(&#39;webdriver.Capabilities&#39;);<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>/** @type {function(new: webdriver.Command)} */<tr><td><a name="l48" href="#l48">48</a><td>exports.Command = base.require(&#39;webdriver.Command&#39;);<tr><td><a name="l49" href="#l49">49</a><td><tr><td><a name="l50" href="#l50">50</a><td><tr><td><a name="l51" href="#l51">51</a><td>/** @type {function(new: webdriver.EventEmitter)} */<tr><td><a name="l52" href="#l52">52</a><td>exports.EventEmitter = base.require(&#39;webdriver.EventEmitter&#39;);<tr><td><a name="l53" href="#l53">53</a><td><tr><td><a name="l54" href="#l54">54</a><td><tr><td><a name="l55" href="#l55">55</a><td>/** @type {function(new: webdriver.Session)} */<tr><td><a name="l56" href="#l56">56</a><td>exports.Session = base.require(&#39;webdriver.Session&#39;);<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>/** @type {function(new: webdriver.WebDriver)} */<tr><td><a name="l60" href="#l60">60</a><td>exports.WebDriver = base.require(&#39;webdriver.WebDriver&#39;);<tr><td><a name="l61" href="#l61">61</a><td><tr><td><a name="l62" href="#l62">62</a><td><tr><td><a name="l63" href="#l63">63</a><td>/** @type {function(new: webdriver.WebElement)} */<tr><td><a name="l64" href="#l64">64</a><td>exports.WebElement = base.require(&#39;webdriver.WebElement&#39;);<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>/** @type {function(new: webdriver.WebElementPromise)} */<tr><td><a name="l68" href="#l68">68</a><td>exports.WebElementPromise = base.require(&#39;webdriver.WebElementPromise&#39;);<tr><td><a name="l69" href="#l69">69</a><td><tr><td><a name="l70" href="#l70">70</a><td><tr><td><a name="l71" href="#l71">71</a><td>// Export the remainder of our API through getters to keep things cleaner<tr><td><a name="l72" href="#l72">72</a><td>// when this module is used in a REPL environment.<tr><td><a name="l73" href="#l73">73</a><td><tr><td><a name="l74" href="#l74">74</a><td><tr><td><a name="l75" href="#l75">75</a><td>/** @type {webdriver.Browser.} */<tr><td><a name="l76" href="#l76">76</a><td>(exports.__defineGetter__(&#39;Browser&#39;, function() {<tr><td><a name="l77" href="#l77">77</a><td> return base.require(&#39;webdriver.Browser&#39;);<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>/** @type {webdriver.Button.} */<tr><td><a name="l82" href="#l82">82</a><td>(exports.__defineGetter__(&#39;Button&#39;, function() {<tr><td><a name="l83" href="#l83">83</a><td> return base.require(&#39;webdriver.Button&#39;);<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><tr><td><a name="l87" href="#l87">87</a><td>/** @type {webdriver.Capability.} */<tr><td><a name="l88" href="#l88">88</a><td>(exports.__defineGetter__(&#39;Capability&#39;, function() {<tr><td><a name="l89" href="#l89">89</a><td> return base.require(&#39;webdriver.Capability&#39;);<tr><td><a name="l90" href="#l90">90</a><td>}));<tr><td><a name="l91" href="#l91">91</a><td><tr><td><a name="l92" href="#l92">92</a><td><tr><td><a name="l93" href="#l93">93</a><td>/** @type {webdriver.CommandName.} */<tr><td><a name="l94" href="#l94">94</a><td>(exports.__defineGetter__(&#39;CommandName&#39;, function() {<tr><td><a name="l95" href="#l95">95</a><td> return base.require(&#39;webdriver.CommandName&#39;);<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><tr><td><a name="l99" href="#l99">99</a><td>/** @type {webdriver.Key.} */<tr><td><a name="l100" href="#l100">100</a><td>(exports.__defineGetter__(&#39;Key&#39;, function() {<tr><td><a name="l101" href="#l101">101</a><td> return base.require(&#39;webdriver.Key&#39;);<tr><td><a name="l102" href="#l102">102</a><td>}));<tr><td><a name="l103" href="#l103">103</a><td><tr><td><a name="l104" href="#l104">104</a><td><tr><td><a name="l105" href="#l105">105</a><td>/** @type {error.} */<tr><td><a name="l106" href="#l106">106</a><td>(exports.__defineGetter__(&#39;error&#39;, function() {<tr><td><a name="l107" href="#l107">107</a><td> return error;<tr><td><a name="l108" href="#l108">108</a><td>}));<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>/** @type {error.} */<tr><td><a name="l112" href="#l112">112</a><td>(exports.__defineGetter__(&#39;error&#39;, function() {<tr><td><a name="l113" href="#l113">113</a><td> return error;<tr><td><a name="l114" href="#l114">114</a><td>}));<tr><td><a name="l115" href="#l115">115</a><td><tr><td><a name="l116" href="#l116">116</a><td><tr><td><a name="l117" href="#l117">117</a><td>/** @type {webdriver.logging.} */<tr><td><a name="l118" href="#l118">118</a><td>(exports.__defineGetter__(&#39;logging&#39;, function() {<tr><td><a name="l119" href="#l119">119</a><td> return base.exportPublicApi(&#39;webdriver.logging&#39;);<tr><td><a name="l120" href="#l120">120</a><td>}));<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>/** @type {webdriver.promise.} */<tr><td><a name="l124" href="#l124">124</a><td>(exports.__defineGetter__(&#39;promise&#39;, function() {<tr><td><a name="l125" href="#l125">125</a><td> return base.exportPublicApi(&#39;webdriver.promise&#39;);<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><tr><td><a name="l129" href="#l129">129</a><td>/** @type {webdriver.stacktrace.} */<tr><td><a name="l130" href="#l130">130</a><td>(exports.__defineGetter__(&#39;stacktrace&#39;, function() {<tr><td><a name="l131" href="#l131">131</a><td> return base.exportPublicApi(&#39;webdriver.stacktrace&#39;);<tr><td><a name="l132" href="#l132">132</a><td>}));<tr><td><a name="l133" href="#l133">133</a><td><tr><td><a name="l134" href="#l134">134</a><td><tr><td><a name="l135" href="#l135">135</a><td>/** @type {webdriver.until.} */<tr><td><a name="l136" href="#l136">136</a><td>(exports.__defineGetter__(&#39;until&#39;, function() {<tr><td><a name="l137" href="#l137">137</a><td> return base.exportPublicApi(&#39;webdriver.until&#39;);<tr><td><a name="l138" href="#l138">138</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>exec.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>io/exec.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2014 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2014 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>&#39;use strict&#39;;<tr><td><a name="l17" href="#l17">17</a><td><tr><td><a name="l18" href="#l18">18</a><td>var childProcess = require(&#39;child_process&#39;);<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var promise = require(&#39;..&#39;).promise;<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>/**<tr><td><a name="l24" href="#l24">24</a><td> * A hash with configuration options for an executed command.<tr><td><a name="l25" href="#l25">25</a><td> * &lt;ul&gt;<tr><td><a name="l26" href="#l26">26</a><td> * &lt;li&gt;<tr><td><a name="l27" href="#l27">27</a><td> * &lt;li&gt;{@code args} - Command line arguments.<tr><td><a name="l28" href="#l28">28</a><td> * &lt;li&gt;{@code env} - Command environment; will inherit from the current process<tr><td><a name="l29" href="#l29">29</a><td> * if missing.<tr><td><a name="l30" href="#l30">30</a><td> * &lt;li&gt;{@code stdio} - IO configuration for the spawned server process. For<tr><td><a name="l31" href="#l31">31</a><td> * more information, refer to the documentation of<tr><td><a name="l32" href="#l32">32</a><td> * {@code child_process.spawn}.<tr><td><a name="l33" href="#l33">33</a><td> * &lt;/ul&gt;<tr><td><a name="l34" href="#l34">34</a><td> *<tr><td><a name="l35" href="#l35">35</a><td> * @typedef {{<tr><td><a name="l36" href="#l36">36</a><td> * args: (!Array.&lt;string&gt;|undefined),<tr><td><a name="l37" href="#l37">37</a><td> * env: (!Object.&lt;string, string&gt;|undefined),<tr><td><a name="l38" href="#l38">38</a><td> * stdio: (string|!Array.&lt;string|number|!Stream|null|undefined&gt;|undefined)<tr><td><a name="l39" href="#l39">39</a><td> * }}<tr><td><a name="l40" href="#l40">40</a><td> */<tr><td><a name="l41" href="#l41">41</a><td>var Options;<tr><td><a name="l42" href="#l42">42</a><td><tr><td><a name="l43" href="#l43">43</a><td><tr><td><a name="l44" href="#l44">44</a><td>/**<tr><td><a name="l45" href="#l45">45</a><td> * Describes a command&#39;s termination conditions.<tr><td><a name="l46" href="#l46">46</a><td> * @param {?number} code The exit code, or {@code null} if the command did not<tr><td><a name="l47" href="#l47">47</a><td> * exit normally.<tr><td><a name="l48" href="#l48">48</a><td> * @param {?string} signal The signal used to kill the command, or<tr><td><a name="l49" href="#l49">49</a><td> * {@code null}.<tr><td><a name="l50" href="#l50">50</a><td> * @constructor<tr><td><a name="l51" href="#l51">51</a><td> */<tr><td><a name="l52" href="#l52">52</a><td>var Result = function(code, signal) {<tr><td><a name="l53" href="#l53">53</a><td> /** @type {?number} */<tr><td><a name="l54" href="#l54">54</a><td> this.code = code;<tr><td><a name="l55" href="#l55">55</a><td><tr><td><a name="l56" href="#l56">56</a><td> /** @type {?string} */<tr><td><a name="l57" href="#l57">57</a><td> this.signal = signal;<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>/** @override */<tr><td><a name="l62" href="#l62">62</a><td>Result.prototype.toString = function() {<tr><td><a name="l63" href="#l63">63</a><td> return &#39;Result(code=&#39; + this.code + &#39;, signal=&#39; + this.signal + &#39;)&#39;;<tr><td><a name="l64" href="#l64">64</a><td>};<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> * Represents a command running in a sub-process.<tr><td><a name="l70" href="#l70">70</a><td> * @param {!promise.Promise.&lt;!Result&gt;} result The command result.<tr><td><a name="l71" href="#l71">71</a><td> * @constructor<tr><td><a name="l72" href="#l72">72</a><td> */<tr><td><a name="l73" href="#l73">73</a><td>var Command = function(result, onKill) {<tr><td><a name="l74" href="#l74">74</a><td> /** @return {boolean} Whether this command is still running. */<tr><td><a name="l75" href="#l75">75</a><td> this.isRunning = function() {<tr><td><a name="l76" href="#l76">76</a><td> return result.isPending();<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> * @return {!promise.Promise.&lt;!Result&gt;} A promise for the result of this<tr><td><a name="l81" href="#l81">81</a><td> * command.<tr><td><a name="l82" href="#l82">82</a><td> */<tr><td><a name="l83" href="#l83">83</a><td> this.result = function() {<tr><td><a name="l84" href="#l84">84</a><td> return result;<tr><td><a name="l85" href="#l85">85</a><td> };<tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td> /**<tr><td><a name="l88" href="#l88">88</a><td> * Sends a signal to the underlying process.<tr><td><a name="l89" href="#l89">89</a><td> * @param {string=} opt_signal The signal to send; defaults to<tr><td><a name="l90" href="#l90">90</a><td> * {@code SIGTERM}.<tr><td><a name="l91" href="#l91">91</a><td> */<tr><td><a name="l92" href="#l92">92</a><td> this.kill = function(opt_signal) {<tr><td><a name="l93" href="#l93">93</a><td> onKill(opt_signal || &#39;SIGTERM&#39;);<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>// PUBLIC API<tr><td><a name="l99" href="#l99">99</a><td><tr><td><a name="l100" href="#l100">100</a><td><tr><td><a name="l101" href="#l101">101</a><td>/**<tr><td><a name="l102" href="#l102">102</a><td> * Spawns a child process. The returned {@link Command} may be used to wait<tr><td><a name="l103" href="#l103">103</a><td> * for the process result or to send signals to the process.<tr><td><a name="l104" href="#l104">104</a><td> *<tr><td><a name="l105" href="#l105">105</a><td> * @param {string} command The executable to spawn.<tr><td><a name="l106" href="#l106">106</a><td> * @param {Options=} opt_options The command options.<tr><td><a name="l107" href="#l107">107</a><td> * @return {!Command} The launched command.<tr><td><a name="l108" href="#l108">108</a><td> */<tr><td><a name="l109" href="#l109">109</a><td>module.exports = function(command, opt_options) {<tr><td><a name="l110" href="#l110">110</a><td> var options = opt_options || {};<tr><td><a name="l111" href="#l111">111</a><td><tr><td><a name="l112" href="#l112">112</a><td> var proc = childProcess.spawn(command, options.args || [], {<tr><td><a name="l113" href="#l113">113</a><td> env: options.env || process.env,<tr><td><a name="l114" href="#l114">114</a><td> stdio: options.stdio || &#39;ignore&#39;<tr><td><a name="l115" href="#l115">115</a><td> }).once(&#39;exit&#39;, onExit);<tr><td><a name="l116" href="#l116">116</a><td><tr><td><a name="l117" href="#l117">117</a><td> // This process should not wait on the spawned child, however, we do<tr><td><a name="l118" href="#l118">118</a><td> // want to ensure the child is killed when this process exits.<tr><td><a name="l119" href="#l119">119</a><td> proc.unref();<tr><td><a name="l120" href="#l120">120</a><td> process.once(&#39;exit&#39;, killCommand);<tr><td><a name="l121" href="#l121">121</a><td><tr><td><a name="l122" href="#l122">122</a><td> var result = promise.defer();<tr><td><a name="l123" href="#l123">123</a><td> var cmd = new Command(result.promise, function(signal) {<tr><td><a name="l124" href="#l124">124</a><td> if (!result.isPending() || !proc) {<tr><td><a name="l125" href="#l125">125</a><td> return; // No longer running.<tr><td><a name="l126" href="#l126">126</a><td> }<tr><td><a name="l127" href="#l127">127</a><td> proc.kill(signal);<tr><td><a name="l128" href="#l128">128</a><td> });<tr><td><a name="l129" href="#l129">129</a><td> return cmd;<tr><td><a name="l130" href="#l130">130</a><td><tr><td><a name="l131" href="#l131">131</a><td> function onExit(code, signal) {<tr><td><a name="l132" href="#l132">132</a><td> proc = null;<tr><td><a name="l133" href="#l133">133</a><td> process.removeListener(&#39;exit&#39;, killCommand);<tr><td><a name="l134" href="#l134">134</a><td> result.fulfill(new Result(code, signal));<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> function killCommand() {<tr><td><a name="l138" href="#l138">138</a><td> process.removeListener(&#39;exit&#39;, killCommand);<tr><td><a name="l139" href="#l139">139</a><td> proc &amp;&amp; proc.kill(&#39;SIGTERM&#39;);<tr><td><a name="l140" href="#l140">140</a><td> }<tr><td><a name="l141" href="#l141">141</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>exec.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>io/exec.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2014 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2014 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>&#39;use strict&#39;;<tr><td><a name="l17" href="#l17">17</a><td><tr><td><a name="l18" href="#l18">18</a><td>var childProcess = require(&#39;child_process&#39;);<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var promise = require(&#39;..&#39;).promise;<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>/**<tr><td><a name="l24" href="#l24">24</a><td> * A hash with configuration options for an executed command.<tr><td><a name="l25" href="#l25">25</a><td> * &lt;ul&gt;<tr><td><a name="l26" href="#l26">26</a><td> * &lt;li&gt;<tr><td><a name="l27" href="#l27">27</a><td> * &lt;li&gt;{@code args} - Command line arguments.<tr><td><a name="l28" href="#l28">28</a><td> * &lt;li&gt;{@code env} - Command environment; will inherit from the current process<tr><td><a name="l29" href="#l29">29</a><td> * if missing.<tr><td><a name="l30" href="#l30">30</a><td> * &lt;li&gt;{@code stdio} - IO configuration for the spawned server process. For<tr><td><a name="l31" href="#l31">31</a><td> * more information, refer to the documentation of<tr><td><a name="l32" href="#l32">32</a><td> * {@code child_process.spawn}.<tr><td><a name="l33" href="#l33">33</a><td> * &lt;/ul&gt;<tr><td><a name="l34" href="#l34">34</a><td> *<tr><td><a name="l35" href="#l35">35</a><td> * @typedef {{<tr><td><a name="l36" href="#l36">36</a><td> * args: (!Array.&lt;string&gt;|undefined),<tr><td><a name="l37" href="#l37">37</a><td> * env: (!Object.&lt;string, string&gt;|undefined),<tr><td><a name="l38" href="#l38">38</a><td> * stdio: (string|!Array.&lt;string|number|!Stream|null|undefined&gt;|undefined)<tr><td><a name="l39" href="#l39">39</a><td> * }}<tr><td><a name="l40" href="#l40">40</a><td> */<tr><td><a name="l41" href="#l41">41</a><td>var Options;<tr><td><a name="l42" href="#l42">42</a><td><tr><td><a name="l43" href="#l43">43</a><td><tr><td><a name="l44" href="#l44">44</a><td>/**<tr><td><a name="l45" href="#l45">45</a><td> * Describes a command&#39;s termination conditions.<tr><td><a name="l46" href="#l46">46</a><td> * @param {?number} code The exit code, or {@code null} if the command did not<tr><td><a name="l47" href="#l47">47</a><td> * exit normally.<tr><td><a name="l48" href="#l48">48</a><td> * @param {?string} signal The signal used to kill the command, or<tr><td><a name="l49" href="#l49">49</a><td> * {@code null}.<tr><td><a name="l50" href="#l50">50</a><td> * @constructor<tr><td><a name="l51" href="#l51">51</a><td> */<tr><td><a name="l52" href="#l52">52</a><td>var Result = function(code, signal) {<tr><td><a name="l53" href="#l53">53</a><td> /** @type {?number} */<tr><td><a name="l54" href="#l54">54</a><td> this.code = code;<tr><td><a name="l55" href="#l55">55</a><td><tr><td><a name="l56" href="#l56">56</a><td> /** @type {?string} */<tr><td><a name="l57" href="#l57">57</a><td> this.signal = signal;<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>/** @override */<tr><td><a name="l62" href="#l62">62</a><td>Result.prototype.toString = function() {<tr><td><a name="l63" href="#l63">63</a><td> return &#39;Result(code=&#39; + this.code + &#39;, signal=&#39; + this.signal + &#39;)&#39;;<tr><td><a name="l64" href="#l64">64</a><td>};<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> * Represents a command running in a sub-process.<tr><td><a name="l70" href="#l70">70</a><td> * @param {!promise.Promise.&lt;!Result&gt;} result The command result.<tr><td><a name="l71" href="#l71">71</a><td> * @constructor<tr><td><a name="l72" href="#l72">72</a><td> */<tr><td><a name="l73" href="#l73">73</a><td>var Command = function(result, onKill) {<tr><td><a name="l74" href="#l74">74</a><td> /** @return {boolean} Whether this command is still running. */<tr><td><a name="l75" href="#l75">75</a><td> this.isRunning = function() {<tr><td><a name="l76" href="#l76">76</a><td> return result.isPending();<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> * @return {!promise.Promise.&lt;!Result&gt;} A promise for the result of this<tr><td><a name="l81" href="#l81">81</a><td> * command.<tr><td><a name="l82" href="#l82">82</a><td> */<tr><td><a name="l83" href="#l83">83</a><td> this.result = function() {<tr><td><a name="l84" href="#l84">84</a><td> return result;<tr><td><a name="l85" href="#l85">85</a><td> };<tr><td><a name="l86" href="#l86">86</a><td><tr><td><a name="l87" href="#l87">87</a><td> /**<tr><td><a name="l88" href="#l88">88</a><td> * Sends a signal to the underlying process.<tr><td><a name="l89" href="#l89">89</a><td> * @param {string=} opt_signal The signal to send; defaults to<tr><td><a name="l90" href="#l90">90</a><td> * {@code SIGTERM}.<tr><td><a name="l91" href="#l91">91</a><td> */<tr><td><a name="l92" href="#l92">92</a><td> this.kill = function(opt_signal) {<tr><td><a name="l93" href="#l93">93</a><td> onKill(opt_signal || &#39;SIGTERM&#39;);<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>// PUBLIC API<tr><td><a name="l99" href="#l99">99</a><td><tr><td><a name="l100" href="#l100">100</a><td><tr><td><a name="l101" href="#l101">101</a><td>/**<tr><td><a name="l102" href="#l102">102</a><td> * Spawns a child process. The returned {@link Command} may be used to wait<tr><td><a name="l103" href="#l103">103</a><td> * for the process result or to send signals to the process.<tr><td><a name="l104" href="#l104">104</a><td> *<tr><td><a name="l105" href="#l105">105</a><td> * @param {string} command The executable to spawn.<tr><td><a name="l106" href="#l106">106</a><td> * @param {Options=} opt_options The command options.<tr><td><a name="l107" href="#l107">107</a><td> * @return {!Command} The launched command.<tr><td><a name="l108" href="#l108">108</a><td> */<tr><td><a name="l109" href="#l109">109</a><td>module.exports = function(command, opt_options) {<tr><td><a name="l110" href="#l110">110</a><td> var options = opt_options || {};<tr><td><a name="l111" href="#l111">111</a><td><tr><td><a name="l112" href="#l112">112</a><td> var proc = childProcess.spawn(command, options.args || [], {<tr><td><a name="l113" href="#l113">113</a><td> env: options.env || process.env,<tr><td><a name="l114" href="#l114">114</a><td> stdio: options.stdio || &#39;ignore&#39;<tr><td><a name="l115" href="#l115">115</a><td> }).once(&#39;exit&#39;, onExit);<tr><td><a name="l116" href="#l116">116</a><td><tr><td><a name="l117" href="#l117">117</a><td> // This process should not wait on the spawned child, however, we do<tr><td><a name="l118" href="#l118">118</a><td> // want to ensure the child is killed when this process exits.<tr><td><a name="l119" href="#l119">119</a><td> proc.unref();<tr><td><a name="l120" href="#l120">120</a><td> process.once(&#39;exit&#39;, killCommand);<tr><td><a name="l121" href="#l121">121</a><td><tr><td><a name="l122" href="#l122">122</a><td> var result = promise.defer();<tr><td><a name="l123" href="#l123">123</a><td> var cmd = new Command(result.promise, function(signal) {<tr><td><a name="l124" href="#l124">124</a><td> if (!result.isPending() || !proc) {<tr><td><a name="l125" href="#l125">125</a><td> return; // No longer running.<tr><td><a name="l126" href="#l126">126</a><td> }<tr><td><a name="l127" href="#l127">127</a><td> proc.kill(signal);<tr><td><a name="l128" href="#l128">128</a><td> });<tr><td><a name="l129" href="#l129">129</a><td> return cmd;<tr><td><a name="l130" href="#l130">130</a><td><tr><td><a name="l131" href="#l131">131</a><td> function onExit(code, signal) {<tr><td><a name="l132" href="#l132">132</a><td> proc = null;<tr><td><a name="l133" href="#l133">133</a><td> process.removeListener(&#39;exit&#39;, killCommand);<tr><td><a name="l134" href="#l134">134</a><td> result.fulfill(new Result(code, signal));<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> function killCommand() {<tr><td><a name="l138" href="#l138">138</a><td> process.removeListener(&#39;exit&#39;, killCommand);<tr><td><a name="l139" href="#l139">139</a><td> proc &amp;&amp; proc.kill(&#39;SIGTERM&#39;);<tr><td><a name="l140" href="#l140">140</a><td> }<tr><td><a name="l141" href="#l141">141</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>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>io/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>var fs = require(&#39;fs&#39;),<tr><td><a name="l17" href="#l17">17</a><td> path = require(&#39;path&#39;),<tr><td><a name="l18" href="#l18">18</a><td> tmp = require(&#39;tmp&#39;);<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var promise = require(&#39;..&#39;).promise;<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>var PATH_SEPARATOR = process.platform === &#39;win32&#39; ? &#39;;&#39; : &#39;:&#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>// PUBLIC API<tr><td><a name="l27" href="#l27">27</a><td><tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td>/**<tr><td><a name="l31" href="#l31">31</a><td> * Copies one file to another.<tr><td><a name="l32" href="#l32">32</a><td> * @param {string} src The source file.<tr><td><a name="l33" href="#l33">33</a><td> * @param {string} dst The destination file.<tr><td><a name="l34" href="#l34">34</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the copied file&#39;s path.<tr><td><a name="l35" href="#l35">35</a><td> */<tr><td><a name="l36" href="#l36">36</a><td>exports.copy = function(src, dst) {<tr><td><a name="l37" href="#l37">37</a><td> var copied = promise.defer();<tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td> var rs = fs.createReadStream(src);<tr><td><a name="l40" href="#l40">40</a><td> rs.on(&#39;error&#39;, copied.reject);<tr><td><a name="l41" href="#l41">41</a><td> rs.on(&#39;end&#39;, function() {<tr><td><a name="l42" href="#l42">42</a><td> copied.fulfill(dst);<tr><td><a name="l43" href="#l43">43</a><td> });<tr><td><a name="l44" href="#l44">44</a><td><tr><td><a name="l45" href="#l45">45</a><td> var ws = fs.createWriteStream(dst);<tr><td><a name="l46" href="#l46">46</a><td> ws.on(&#39;error&#39;, copied.reject);<tr><td><a name="l47" href="#l47">47</a><td><tr><td><a name="l48" href="#l48">48</a><td> rs.pipe(ws);<tr><td><a name="l49" href="#l49">49</a><td><tr><td><a name="l50" href="#l50">50</a><td> return copied.promise;<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>/**<tr><td><a name="l55" href="#l55">55</a><td> * Recursively copies the contents of one directory to another.<tr><td><a name="l56" href="#l56">56</a><td> * @param {string} src The source directory to copy.<tr><td><a name="l57" href="#l57">57</a><td> * @param {string} dst The directory to copy into.<tr><td><a name="l58" href="#l58">58</a><td> * @param {(RegEx|function(string): boolean)=} opt_exclude An exclusion filter<tr><td><a name="l59" href="#l59">59</a><td> * as either a regex or predicate function. All files matching this filter<tr><td><a name="l60" href="#l60">60</a><td> * will not be copied.<tr><td><a name="l61" href="#l61">61</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the destination<tr><td><a name="l62" href="#l62">62</a><td> * directory&#39;s path once all files have been copied.<tr><td><a name="l63" href="#l63">63</a><td> */<tr><td><a name="l64" href="#l64">64</a><td>exports.copyDir = function(src, dst, opt_exclude) {<tr><td><a name="l65" href="#l65">65</a><td> var predicate = opt_exclude;<tr><td><a name="l66" href="#l66">66</a><td> if (opt_exclude &amp;&amp; typeof opt_exclude !== &#39;function&#39;) {<tr><td><a name="l67" href="#l67">67</a><td> predicate = function(p) {<tr><td><a name="l68" href="#l68">68</a><td> return !opt_exclude.test(p);<tr><td><a name="l69" href="#l69">69</a><td> };<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> // TODO(jleyba): Make this function completely async.<tr><td><a name="l73" href="#l73">73</a><td> if (!fs.existsSync(dst)) {<tr><td><a name="l74" href="#l74">74</a><td> fs.mkdirSync(dst);<tr><td><a name="l75" href="#l75">75</a><td> }<tr><td><a name="l76" href="#l76">76</a><td><tr><td><a name="l77" href="#l77">77</a><td> var files = fs.readdirSync(src);<tr><td><a name="l78" href="#l78">78</a><td> files = files.map(function(file) {<tr><td><a name="l79" href="#l79">79</a><td> return path.join(src, file);<tr><td><a name="l80" href="#l80">80</a><td> });<tr><td><a name="l81" href="#l81">81</a><td><tr><td><a name="l82" href="#l82">82</a><td> if (predicate) {<tr><td><a name="l83" href="#l83">83</a><td> files = files.filter(predicate);<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> var results = [];<tr><td><a name="l87" href="#l87">87</a><td> files.forEach(function(file) {<tr><td><a name="l88" href="#l88">88</a><td> var stats = fs.statSync(file);<tr><td><a name="l89" href="#l89">89</a><td> var target = path.join(dst, path.basename(file));<tr><td><a name="l90" href="#l90">90</a><td><tr><td><a name="l91" href="#l91">91</a><td> if (stats.isDirectory()) {<tr><td><a name="l92" href="#l92">92</a><td> if (!fs.existsSync(target)) {<tr><td><a name="l93" href="#l93">93</a><td> fs.mkdirSync(target, stats.mode);<tr><td><a name="l94" href="#l94">94</a><td> }<tr><td><a name="l95" href="#l95">95</a><td> results.push(exports.copyDir(file, target, predicate));<tr><td><a name="l96" href="#l96">96</a><td> } else {<tr><td><a name="l97" href="#l97">97</a><td> results.push(exports.copy(file, target));<tr><td><a name="l98" href="#l98">98</a><td> }<tr><td><a name="l99" href="#l99">99</a><td> });<tr><td><a name="l100" href="#l100">100</a><td><tr><td><a name="l101" href="#l101">101</a><td> return promise.all(results).then(function() {<tr><td><a name="l102" href="#l102">102</a><td> return dst;<tr><td><a name="l103" href="#l103">103</a><td> });<tr><td><a name="l104" href="#l104">104</a><td>};<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>/**<tr><td><a name="l108" href="#l108">108</a><td> * Tests if a file path exists.<tr><td><a name="l109" href="#l109">109</a><td> * @param {string} path The path to test.<tr><td><a name="l110" href="#l110">110</a><td> * @return {!promise.Promise.&lt;boolean&gt;} A promise for whether the file exists.<tr><td><a name="l111" href="#l111">111</a><td> */<tr><td><a name="l112" href="#l112">112</a><td>exports.exists = function(path) {<tr><td><a name="l113" href="#l113">113</a><td> var result = promise.defer();<tr><td><a name="l114" href="#l114">114</a><td> fs.exists(path, result.fulfill);<tr><td><a name="l115" href="#l115">115</a><td> return result.promise;<tr><td><a name="l116" href="#l116">116</a><td>};<tr><td><a name="l117" href="#l117">117</a><td><tr><td><a name="l118" href="#l118">118</a><td><tr><td><a name="l119" href="#l119">119</a><td>/**<tr><td><a name="l120" href="#l120">120</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the path to a temporary<tr><td><a name="l121" href="#l121">121</a><td> * directory.<tr><td><a name="l122" href="#l122">122</a><td> * @see https://www.npmjs.org/package/tmp<tr><td><a name="l123" href="#l123">123</a><td> */<tr><td><a name="l124" href="#l124">124</a><td>exports.tmpDir = function() {<tr><td><a name="l125" href="#l125">125</a><td> return promise.checkedNodeCall(tmp.dir);<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><tr><td><a name="l129" href="#l129">129</a><td>/**<tr><td><a name="l130" href="#l130">130</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the path to a temporary<tr><td><a name="l131" href="#l131">131</a><td> * file.<tr><td><a name="l132" href="#l132">132</a><td> * @see https://www.npmjs.org/package/tmp<tr><td><a name="l133" href="#l133">133</a><td> */<tr><td><a name="l134" href="#l134">134</a><td>exports.tmpFile = function() {<tr><td><a name="l135" href="#l135">135</a><td> return promise.checkedNodeCall(tmp.file);<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>/**<tr><td><a name="l140" href="#l140">140</a><td> * Searches the {@code PATH} environment variable for the given file.<tr><td><a name="l141" href="#l141">141</a><td> * @param {string} file The file to locate on the PATH.<tr><td><a name="l142" href="#l142">142</a><td> * @param {boolean=} opt_checkCwd Whether to always start with the search with<tr><td><a name="l143" href="#l143">143</a><td> * the current working directory, regardless of whether it is explicitly<tr><td><a name="l144" href="#l144">144</a><td> * listed on the PATH.<tr><td><a name="l145" href="#l145">145</a><td> * @return {?string} Path to the located file, or {@code null} if it could<tr><td><a name="l146" href="#l146">146</a><td> * not be found.<tr><td><a name="l147" href="#l147">147</a><td> */<tr><td><a name="l148" href="#l148">148</a><td>exports.findInPath = function(file, opt_checkCwd) {<tr><td><a name="l149" href="#l149">149</a><td> if (opt_checkCwd) {<tr><td><a name="l150" href="#l150">150</a><td> var tmp = path.join(process.cwd(), file);<tr><td><a name="l151" href="#l151">151</a><td> if (fs.existsSync(tmp)) {<tr><td><a name="l152" href="#l152">152</a><td> return tmp;<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><tr><td><a name="l156" href="#l156">156</a><td> var dirs = process.env[&#39;PATH&#39;].split(PATH_SEPARATOR);<tr><td><a name="l157" href="#l157">157</a><td> var found = null;<tr><td><a name="l158" href="#l158">158</a><td> dirs.forEach(function(dir) {<tr><td><a name="l159" href="#l159">159</a><td> var tmp = path.join(dir, file);<tr><td><a name="l160" href="#l160">160</a><td> if (!found &amp;&amp; fs.existsSync(tmp)) {<tr><td><a name="l161" href="#l161">161</a><td> found = tmp;<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> return found;<tr><td><a name="l165" href="#l165">165</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>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><div id="main-wrapper"><input type="checkbox" id="sidenav-toggle" /><main><header><h1>io/index.js</h1></header><pre><table class="srcfile"><tbody><tr><td><a name="l1" href="#l1">1</a><td>// Copyright 2013 Selenium committers<tr><td><a name="l2" href="#l2">2</a><td>// Copyright 2013 Software Freedom Conservancy<tr><td><a name="l3" href="#l3">3</a><td>//<tr><td><a name="l4" href="#l4">4</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a name="l5" href="#l5">5</a><td>// you may not use this file except in compliance with the License.<tr><td><a name="l6" href="#l6">6</a><td>// You may obtain a copy of the License at<tr><td><a name="l7" href="#l7">7</a><td>//<tr><td><a name="l8" href="#l8">8</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a name="l9" href="#l9">9</a><td>//<tr><td><a name="l10" href="#l10">10</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a name="l11" href="#l11">11</a><td>// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<tr><td><a name="l12" href="#l12">12</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a name="l13" href="#l13">13</a><td>// See the License for the specific language governing permissions and<tr><td><a name="l14" href="#l14">14</a><td>// limitations under the License.<tr><td><a name="l15" href="#l15">15</a><td><tr><td><a name="l16" href="#l16">16</a><td>var fs = require(&#39;fs&#39;),<tr><td><a name="l17" href="#l17">17</a><td> path = require(&#39;path&#39;),<tr><td><a name="l18" href="#l18">18</a><td> tmp = require(&#39;tmp&#39;);<tr><td><a name="l19" href="#l19">19</a><td><tr><td><a name="l20" href="#l20">20</a><td>var promise = require(&#39;..&#39;).promise;<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>var PATH_SEPARATOR = process.platform === &#39;win32&#39; ? &#39;;&#39; : &#39;:&#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>// PUBLIC API<tr><td><a name="l27" href="#l27">27</a><td><tr><td><a name="l28" href="#l28">28</a><td><tr><td><a name="l29" href="#l29">29</a><td><tr><td><a name="l30" href="#l30">30</a><td>/**<tr><td><a name="l31" href="#l31">31</a><td> * Copies one file to another.<tr><td><a name="l32" href="#l32">32</a><td> * @param {string} src The source file.<tr><td><a name="l33" href="#l33">33</a><td> * @param {string} dst The destination file.<tr><td><a name="l34" href="#l34">34</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the copied file&#39;s path.<tr><td><a name="l35" href="#l35">35</a><td> */<tr><td><a name="l36" href="#l36">36</a><td>exports.copy = function(src, dst) {<tr><td><a name="l37" href="#l37">37</a><td> var copied = promise.defer();<tr><td><a name="l38" href="#l38">38</a><td><tr><td><a name="l39" href="#l39">39</a><td> var rs = fs.createReadStream(src);<tr><td><a name="l40" href="#l40">40</a><td> rs.on(&#39;error&#39;, copied.reject);<tr><td><a name="l41" href="#l41">41</a><td> rs.on(&#39;end&#39;, function() {<tr><td><a name="l42" href="#l42">42</a><td> copied.fulfill(dst);<tr><td><a name="l43" href="#l43">43</a><td> });<tr><td><a name="l44" href="#l44">44</a><td><tr><td><a name="l45" href="#l45">45</a><td> var ws = fs.createWriteStream(dst);<tr><td><a name="l46" href="#l46">46</a><td> ws.on(&#39;error&#39;, copied.reject);<tr><td><a name="l47" href="#l47">47</a><td><tr><td><a name="l48" href="#l48">48</a><td> rs.pipe(ws);<tr><td><a name="l49" href="#l49">49</a><td><tr><td><a name="l50" href="#l50">50</a><td> return copied.promise;<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>/**<tr><td><a name="l55" href="#l55">55</a><td> * Recursively copies the contents of one directory to another.<tr><td><a name="l56" href="#l56">56</a><td> * @param {string} src The source directory to copy.<tr><td><a name="l57" href="#l57">57</a><td> * @param {string} dst The directory to copy into.<tr><td><a name="l58" href="#l58">58</a><td> * @param {(RegEx|function(string): boolean)=} opt_exclude An exclusion filter<tr><td><a name="l59" href="#l59">59</a><td> * as either a regex or predicate function. All files matching this filter<tr><td><a name="l60" href="#l60">60</a><td> * will not be copied.<tr><td><a name="l61" href="#l61">61</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the destination<tr><td><a name="l62" href="#l62">62</a><td> * directory&#39;s path once all files have been copied.<tr><td><a name="l63" href="#l63">63</a><td> */<tr><td><a name="l64" href="#l64">64</a><td>exports.copyDir = function(src, dst, opt_exclude) {<tr><td><a name="l65" href="#l65">65</a><td> var predicate = opt_exclude;<tr><td><a name="l66" href="#l66">66</a><td> if (opt_exclude &amp;&amp; typeof opt_exclude !== &#39;function&#39;) {<tr><td><a name="l67" href="#l67">67</a><td> predicate = function(p) {<tr><td><a name="l68" href="#l68">68</a><td> return !opt_exclude.test(p);<tr><td><a name="l69" href="#l69">69</a><td> };<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> // TODO(jleyba): Make this function completely async.<tr><td><a name="l73" href="#l73">73</a><td> if (!fs.existsSync(dst)) {<tr><td><a name="l74" href="#l74">74</a><td> fs.mkdirSync(dst);<tr><td><a name="l75" href="#l75">75</a><td> }<tr><td><a name="l76" href="#l76">76</a><td><tr><td><a name="l77" href="#l77">77</a><td> var files = fs.readdirSync(src);<tr><td><a name="l78" href="#l78">78</a><td> files = files.map(function(file) {<tr><td><a name="l79" href="#l79">79</a><td> return path.join(src, file);<tr><td><a name="l80" href="#l80">80</a><td> });<tr><td><a name="l81" href="#l81">81</a><td><tr><td><a name="l82" href="#l82">82</a><td> if (predicate) {<tr><td><a name="l83" href="#l83">83</a><td> files = files.filter(predicate);<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> var results = [];<tr><td><a name="l87" href="#l87">87</a><td> files.forEach(function(file) {<tr><td><a name="l88" href="#l88">88</a><td> var stats = fs.statSync(file);<tr><td><a name="l89" href="#l89">89</a><td> var target = path.join(dst, path.basename(file));<tr><td><a name="l90" href="#l90">90</a><td><tr><td><a name="l91" href="#l91">91</a><td> if (stats.isDirectory()) {<tr><td><a name="l92" href="#l92">92</a><td> if (!fs.existsSync(target)) {<tr><td><a name="l93" href="#l93">93</a><td> fs.mkdirSync(target, stats.mode);<tr><td><a name="l94" href="#l94">94</a><td> }<tr><td><a name="l95" href="#l95">95</a><td> results.push(exports.copyDir(file, target, predicate));<tr><td><a name="l96" href="#l96">96</a><td> } else {<tr><td><a name="l97" href="#l97">97</a><td> results.push(exports.copy(file, target));<tr><td><a name="l98" href="#l98">98</a><td> }<tr><td><a name="l99" href="#l99">99</a><td> });<tr><td><a name="l100" href="#l100">100</a><td><tr><td><a name="l101" href="#l101">101</a><td> return promise.all(results).then(function() {<tr><td><a name="l102" href="#l102">102</a><td> return dst;<tr><td><a name="l103" href="#l103">103</a><td> });<tr><td><a name="l104" href="#l104">104</a><td>};<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>/**<tr><td><a name="l108" href="#l108">108</a><td> * Tests if a file path exists.<tr><td><a name="l109" href="#l109">109</a><td> * @param {string} path The path to test.<tr><td><a name="l110" href="#l110">110</a><td> * @return {!promise.Promise.&lt;boolean&gt;} A promise for whether the file exists.<tr><td><a name="l111" href="#l111">111</a><td> */<tr><td><a name="l112" href="#l112">112</a><td>exports.exists = function(path) {<tr><td><a name="l113" href="#l113">113</a><td> var result = promise.defer();<tr><td><a name="l114" href="#l114">114</a><td> fs.exists(path, result.fulfill);<tr><td><a name="l115" href="#l115">115</a><td> return result.promise;<tr><td><a name="l116" href="#l116">116</a><td>};<tr><td><a name="l117" href="#l117">117</a><td><tr><td><a name="l118" href="#l118">118</a><td><tr><td><a name="l119" href="#l119">119</a><td>/**<tr><td><a name="l120" href="#l120">120</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the path to a temporary<tr><td><a name="l121" href="#l121">121</a><td> * directory.<tr><td><a name="l122" href="#l122">122</a><td> * @see https://www.npmjs.org/package/tmp<tr><td><a name="l123" href="#l123">123</a><td> */<tr><td><a name="l124" href="#l124">124</a><td>exports.tmpDir = function() {<tr><td><a name="l125" href="#l125">125</a><td> return promise.checkedNodeCall(tmp.dir);<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><tr><td><a name="l129" href="#l129">129</a><td>/**<tr><td><a name="l130" href="#l130">130</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the path to a temporary<tr><td><a name="l131" href="#l131">131</a><td> * file.<tr><td><a name="l132" href="#l132">132</a><td> * @see https://www.npmjs.org/package/tmp<tr><td><a name="l133" href="#l133">133</a><td> */<tr><td><a name="l134" href="#l134">134</a><td>exports.tmpFile = function() {<tr><td><a name="l135" href="#l135">135</a><td> return promise.checkedNodeCall(tmp.file);<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>/**<tr><td><a name="l140" href="#l140">140</a><td> * Searches the {@code PATH} environment variable for the given file.<tr><td><a name="l141" href="#l141">141</a><td> * @param {string} file The file to locate on the PATH.<tr><td><a name="l142" href="#l142">142</a><td> * @param {boolean=} opt_checkCwd Whether to always start with the search with<tr><td><a name="l143" href="#l143">143</a><td> * the current working directory, regardless of whether it is explicitly<tr><td><a name="l144" href="#l144">144</a><td> * listed on the PATH.<tr><td><a name="l145" href="#l145">145</a><td> * @return {?string} Path to the located file, or {@code null} if it could<tr><td><a name="l146" href="#l146">146</a><td> * not be found.<tr><td><a name="l147" href="#l147">147</a><td> */<tr><td><a name="l148" href="#l148">148</a><td>exports.findInPath = function(file, opt_checkCwd) {<tr><td><a name="l149" href="#l149">149</a><td> if (opt_checkCwd) {<tr><td><a name="l150" href="#l150">150</a><td> var tmp = path.join(process.cwd(), file);<tr><td><a name="l151" href="#l151">151</a><td> if (fs.existsSync(tmp)) {<tr><td><a name="l152" href="#l152">152</a><td> return tmp;<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><tr><td><a name="l156" href="#l156">156</a><td> var dirs = process.env[&#39;PATH&#39;].split(PATH_SEPARATOR);<tr><td><a name="l157" href="#l157">157</a><td> var found = null;<tr><td><a name="l158" href="#l158">158</a><td> dirs.forEach(function(dir) {<tr><td><a name="l159" href="#l159">159</a><td> var tmp = path.join(dir, file);<tr><td><a name="l160" href="#l160">160</a><td> if (!found &amp;&amp; fs.existsSync(tmp)) {<tr><td><a name="l161" href="#l161">161</a><td> found = tmp;<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> return found;<tr><td><a name="l165" href="#l165">165</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>