selenium-webdriver 2.48.2 → 2.52.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 (524) hide show
  1. package/CHANGES.md +57 -0
  2. package/NOTICE +1 -1
  3. package/README.md +56 -6
  4. package/builder.js +375 -358
  5. package/chrome.js +549 -586
  6. package/edge.js +378 -0
  7. package/error.js +597 -5
  8. package/example/google_search_generator.js +2 -4
  9. package/example/logging.js +6 -2
  10. package/executors.js +11 -27
  11. package/firefox/binary.js +79 -87
  12. package/firefox/extension.js +10 -18
  13. package/firefox/index.js +173 -173
  14. package/firefox/profile.js +220 -240
  15. package/http/index.js +396 -79
  16. package/http/util.js +35 -35
  17. package/ie.js +288 -309
  18. package/index.js +34 -125
  19. package/io/exec.js +58 -39
  20. package/io/index.js +54 -48
  21. package/lib/actions.js +594 -0
  22. package/lib/by.js +276 -0
  23. package/lib/capabilities.js +404 -0
  24. package/lib/{webdriver/command.js → command.js} +88 -72
  25. package/lib/{webdriver/button.js → devmode.js} +13 -8
  26. package/lib/events.js +210 -0
  27. package/lib/firefox/amd64/libnoblur64.so +0 -0
  28. package/lib/firefox/i386/libnoblur.so +0 -0
  29. package/lib/firefox/webdriver.json +5 -1
  30. package/lib/firefox/webdriver.xpi +0 -0
  31. package/lib/{webdriver/key.js → input.js} +82 -2
  32. package/lib/logging.js +668 -0
  33. package/lib/{webdriver/promise.js → promise.js} +688 -644
  34. package/lib/session.js +79 -0
  35. package/lib/{webdriver/serializable.js → symbols.js} +11 -16
  36. package/lib/test/build.js +4 -4
  37. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  38. package/lib/test/data/click_tests/overlapping_elements.html +15 -4
  39. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  40. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  41. package/lib/test/data/readOnlyPage.html +1 -1
  42. package/lib/test/data/selectPage.html +18 -2
  43. package/lib/test/fileserver.js +3 -4
  44. package/lib/test/index.js +7 -3
  45. package/lib/test/resources.js +1 -1
  46. package/lib/until.js +428 -0
  47. package/lib/webdriver.js +2351 -0
  48. package/net/portprober.js +15 -11
  49. package/opera.js +295 -314
  50. package/package.json +6 -5
  51. package/phantomjs.js +135 -140
  52. package/proxy.js +6 -4
  53. package/remote/index.js +229 -221
  54. package/safari.js +319 -310
  55. package/test/chrome/options_test.js +11 -9
  56. package/test/element_finding_test.js +51 -13
  57. package/test/error_test.js +163 -0
  58. package/test/execute_script_test.js +1 -1
  59. package/test/http/http_test.js +317 -55
  60. package/test/http/util_test.js +25 -23
  61. package/test/io_test.js +6 -1
  62. package/test/lib/by_test.js +127 -0
  63. package/test/lib/capabilities_test.js +84 -0
  64. package/test/lib/events_test.js +177 -0
  65. package/test/lib/logging_test.js +272 -0
  66. package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
  67. package/test/lib/promise_error_test.js +808 -0
  68. package/test/lib/promise_flow_test.js +2282 -0
  69. package/test/lib/promise_generator_test.js +308 -0
  70. package/test/lib/promise_test.js +996 -0
  71. package/test/lib/testutil.js +90 -0
  72. package/test/lib/until_test.js +436 -0
  73. package/test/lib/webdriver_test.js +2207 -0
  74. package/test/page_loading_test.js +7 -9
  75. package/test/stale_element_test.js +2 -2
  76. package/test/testing/assert_test.js +374 -0
  77. package/test/testing/index_test.js +9 -11
  78. package/testing/assert.js +334 -17
  79. package/testing/index.js +10 -0
  80. package/_base.js +0 -200
  81. package/docs/Changes.html +0 -356
  82. package/docs/class_bot_Error.html +0 -15
  83. package/docs/class_webdriver_ActionSequence.html +0 -115
  84. package/docs/class_webdriver_Alert.html +0 -24
  85. package/docs/class_webdriver_AlertPromise.html +0 -92
  86. package/docs/class_webdriver_Capabilities.html +0 -60
  87. package/docs/class_webdriver_Command.html +0 -15
  88. package/docs/class_webdriver_EventEmitter.html +0 -35
  89. package/docs/class_webdriver_FileDetector.html +0 -21
  90. package/docs/class_webdriver_Locator.html +0 -12
  91. package/docs/class_webdriver_Serializable.html +0 -9
  92. package/docs/class_webdriver_Session.html +0 -13
  93. package/docs/class_webdriver_TouchSequence.html +0 -49
  94. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  95. package/docs/class_webdriver_WebDriver.html +0 -313
  96. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  97. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  98. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  99. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  100. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  101. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  102. package/docs/class_webdriver_WebElement.html +0 -223
  103. package/docs/class_webdriver_WebElementPromise.html +0 -274
  104. package/docs/class_webdriver_http_Executor.html +0 -22
  105. package/docs/class_webdriver_http_Request.html +0 -12
  106. package/docs/class_webdriver_http_Response.html +0 -13
  107. package/docs/class_webdriver_logging_Entry.html +0 -15
  108. package/docs/class_webdriver_logging_Level.html +0 -55
  109. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  110. package/docs/class_webdriver_logging_Logger.html +0 -119
  111. package/docs/class_webdriver_logging_Preferences.html +0 -8
  112. package/docs/class_webdriver_promise_CancellationError.html +0 -17
  113. package/docs/class_webdriver_promise_ControlFlow.html +0 -153
  114. package/docs/class_webdriver_promise_Deferred.html +0 -84
  115. package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
  116. package/docs/class_webdriver_promise_Promise.html +0 -75
  117. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  118. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  119. package/docs/class_webdriver_testing_Assertion.html +0 -99
  120. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  121. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  122. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  123. package/docs/class_webdriver_until_Condition.html +0 -7
  124. package/docs/dossier.css +0 -1
  125. package/docs/dossier.js +0 -86
  126. package/docs/enum_bot_ErrorCode.html +0 -3
  127. package/docs/enum_bot_Error_State.html +0 -2
  128. package/docs/enum_webdriver_Browser.html +0 -2
  129. package/docs/enum_webdriver_Button.html +0 -2
  130. package/docs/enum_webdriver_Capability.html +0 -33
  131. package/docs/enum_webdriver_CommandName.html +0 -3
  132. package/docs/enum_webdriver_Key.html +0 -12
  133. package/docs/enum_webdriver_logging_Type.html +0 -6
  134. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  135. package/docs/index.html +0 -125
  136. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  137. package/docs/interface_webdriver_http_Client.html +0 -10
  138. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  139. package/docs/module_selenium-webdriver.html +0 -23
  140. package/docs/module_selenium-webdriver__base.html +0 -23
  141. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  142. package/docs/module_selenium-webdriver_builder.html +0 -2
  143. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  144. package/docs/module_selenium-webdriver_chrome.html +0 -90
  145. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  146. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  147. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  148. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  149. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  150. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  151. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  152. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  153. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  154. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  155. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  156. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  157. package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
  158. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
  159. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  160. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  161. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  162. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  163. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  164. package/docs/module_selenium-webdriver_error.html +0 -4
  165. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  166. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  167. package/docs/module_selenium-webdriver_executors.html +0 -10
  168. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  169. package/docs/module_selenium-webdriver_firefox.html +0 -68
  170. package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
  171. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
  172. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
  173. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  174. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  175. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  176. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  177. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  178. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  179. package/docs/module_selenium-webdriver_http.html +0 -9
  180. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  181. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  182. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  183. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  184. package/docs/module_selenium-webdriver_http_util.html +0 -17
  185. package/docs/module_selenium-webdriver_ie.html +0 -11
  186. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  187. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  188. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  189. package/docs/module_selenium-webdriver_io.html +0 -37
  190. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  191. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  192. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  193. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  194. package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
  195. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  196. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  197. package/docs/module_selenium-webdriver_net.html +0 -7
  198. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  199. package/docs/module_selenium-webdriver_opera.html +0 -62
  200. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  201. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  202. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  203. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  204. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  205. package/docs/module_selenium-webdriver_proxy.html +0 -28
  206. package/docs/module_selenium-webdriver_remote.html +0 -8
  207. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  208. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  209. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
  210. package/docs/module_selenium-webdriver_safari.html +0 -9
  211. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  212. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  213. package/docs/module_selenium-webdriver_testing.html +0 -74
  214. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  215. package/docs/namespace_bot.html +0 -4
  216. package/docs/namespace_bot_json.html +0 -20
  217. package/docs/namespace_bot_response.html +0 -18
  218. package/docs/namespace_bot_userAgent.html +0 -33
  219. package/docs/namespace_webdriver.html +0 -30
  220. package/docs/namespace_webdriver_By.html +0 -56
  221. package/docs/namespace_webdriver_http.html +0 -6
  222. package/docs/namespace_webdriver_logging.html +0 -70
  223. package/docs/namespace_webdriver_promise.html +0 -688
  224. package/docs/namespace_webdriver_stacktrace.html +0 -17
  225. package/docs/namespace_webdriver_testing.html +0 -7
  226. package/docs/namespace_webdriver_testing_assert.html +0 -9
  227. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  228. package/docs/namespace_webdriver_until.html +0 -82
  229. package/docs/source/_base.js.src.html +0 -1
  230. package/docs/source/builder.js.src.html +0 -1
  231. package/docs/source/chrome.js.src.html +0 -1
  232. package/docs/source/error.js.src.html +0 -1
  233. package/docs/source/executors.js.src.html +0 -1
  234. package/docs/source/firefox/binary.js.src.html +0 -1
  235. package/docs/source/firefox/extension.js.src.html +0 -1
  236. package/docs/source/firefox/index.js.src.html +0 -1
  237. package/docs/source/firefox/profile.js.src.html +0 -1
  238. package/docs/source/http/index.js.src.html +0 -1
  239. package/docs/source/http/util.js.src.html +0 -1
  240. package/docs/source/ie.js.src.html +0 -1
  241. package/docs/source/index.js.src.html +0 -1
  242. package/docs/source/io/exec.js.src.html +0 -1
  243. package/docs/source/io/index.js.src.html +0 -1
  244. package/docs/source/lib/atoms/error.js.src.html +0 -1
  245. package/docs/source/lib/atoms/json.js.src.html +0 -1
  246. package/docs/source/lib/atoms/response.js.src.html +0 -1
  247. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  248. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  249. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  250. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  251. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  252. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  253. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  254. package/docs/source/lib/goog/base.js.src.html +0 -1
  255. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  256. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  257. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  258. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  259. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  260. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  261. package/docs/source/lib/goog/deps.js.src.html +0 -1
  262. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  263. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  264. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  265. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  266. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  267. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  268. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  269. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  270. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  271. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  272. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  273. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  274. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  275. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  276. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  277. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  278. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  279. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  280. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  282. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  283. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  284. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  285. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  286. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  287. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  288. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  289. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  290. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  291. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  292. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  293. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  294. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  295. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  296. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  297. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  298. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  299. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  300. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  301. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  302. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  303. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  304. package/docs/source/lib/goog/log/log.js.src.html +0 -1
  305. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  306. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  307. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  308. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  309. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  310. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  311. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  312. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  313. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  314. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  315. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  316. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  317. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  318. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  319. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  320. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  321. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  322. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  323. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  324. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  325. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  326. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  327. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  328. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  329. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  330. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  331. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  332. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  333. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  334. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  335. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  336. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  344. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  345. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  346. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  347. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  348. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  349. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  350. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  351. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  352. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  353. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  354. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  355. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  356. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  357. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  358. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  366. package/docs/source/net/index.js.src.html +0 -1
  367. package/docs/source/net/portprober.js.src.html +0 -1
  368. package/docs/source/opera.js.src.html +0 -1
  369. package/docs/source/phantomjs.js.src.html +0 -1
  370. package/docs/source/proxy.js.src.html +0 -1
  371. package/docs/source/remote/index.js.src.html +0 -1
  372. package/docs/source/safari.js.src.html +0 -1
  373. package/docs/source/testing/assert.js.src.html +0 -1
  374. package/docs/source/testing/index.js.src.html +0 -1
  375. package/docs/types.js +0 -1
  376. package/lib/atoms/error.js +0 -202
  377. package/lib/atoms/json.js +0 -80
  378. package/lib/atoms/response.js +0 -110
  379. package/lib/atoms/userAgent.js +0 -257
  380. package/lib/goog/LICENSE +0 -176
  381. package/lib/goog/array/array.js +0 -1654
  382. package/lib/goog/asserts/asserts.js +0 -365
  383. package/lib/goog/async/freelist.js +0 -88
  384. package/lib/goog/async/nexttick.js +0 -241
  385. package/lib/goog/async/run.js +0 -133
  386. package/lib/goog/async/workqueue.js +0 -139
  387. package/lib/goog/base.js +0 -2548
  388. package/lib/goog/debug/debug.js +0 -653
  389. package/lib/goog/debug/entrypointregistry.js +0 -158
  390. package/lib/goog/debug/error.js +0 -63
  391. package/lib/goog/debug/logbuffer.js +0 -148
  392. package/lib/goog/debug/logger.js +0 -873
  393. package/lib/goog/debug/logrecord.js +0 -242
  394. package/lib/goog/deps.js +0 -151
  395. package/lib/goog/disposable/disposable.js +0 -307
  396. package/lib/goog/disposable/idisposable.js +0 -45
  397. package/lib/goog/dom/browserfeature.js +0 -72
  398. package/lib/goog/dom/dom.js +0 -2991
  399. package/lib/goog/dom/nodetype.js +0 -48
  400. package/lib/goog/dom/safe.js +0 -347
  401. package/lib/goog/dom/tagname.js +0 -160
  402. package/lib/goog/dom/tags.js +0 -41
  403. package/lib/goog/dom/vendor.js +0 -96
  404. package/lib/goog/events/browserevent.js +0 -400
  405. package/lib/goog/events/browserfeature.js +0 -85
  406. package/lib/goog/events/event.js +0 -143
  407. package/lib/goog/events/eventid.js +0 -47
  408. package/lib/goog/events/events.js +0 -984
  409. package/lib/goog/events/eventtarget.js +0 -394
  410. package/lib/goog/events/eventtype.js +0 -237
  411. package/lib/goog/events/keycodes.js +0 -427
  412. package/lib/goog/events/listenable.js +0 -335
  413. package/lib/goog/events/listener.js +0 -131
  414. package/lib/goog/events/listenermap.js +0 -308
  415. package/lib/goog/fs/url.js +0 -109
  416. package/lib/goog/functions/functions.js +0 -442
  417. package/lib/goog/html/safehtml.js +0 -757
  418. package/lib/goog/html/safescript.js +0 -234
  419. package/lib/goog/html/safestyle.js +0 -442
  420. package/lib/goog/html/safestylesheet.js +0 -276
  421. package/lib/goog/html/safeurl.js +0 -398
  422. package/lib/goog/html/trustedresourceurl.js +0 -224
  423. package/lib/goog/html/uncheckedconversions.js +0 -232
  424. package/lib/goog/i18n/bidi.js +0 -908
  425. package/lib/goog/iter/iter.js +0 -1302
  426. package/lib/goog/json/json.js +0 -363
  427. package/lib/goog/labs/testing/assertthat.js +0 -58
  428. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  429. package/lib/goog/labs/testing/matcher.js +0 -80
  430. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  431. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  432. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  433. package/lib/goog/labs/useragent/browser.js +0 -341
  434. package/lib/goog/labs/useragent/engine.js +0 -160
  435. package/lib/goog/labs/useragent/platform.js +0 -160
  436. package/lib/goog/labs/useragent/util.js +0 -148
  437. package/lib/goog/log/log.js +0 -197
  438. package/lib/goog/math/box.js +0 -398
  439. package/lib/goog/math/coordinate.js +0 -268
  440. package/lib/goog/math/math.js +0 -451
  441. package/lib/goog/math/rect.js +0 -476
  442. package/lib/goog/math/size.js +0 -227
  443. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  444. package/lib/goog/net/xhrlike.js +0 -124
  445. package/lib/goog/net/xmlhttp.js +0 -246
  446. package/lib/goog/net/xmlhttpfactory.js +0 -67
  447. package/lib/goog/object/object.js +0 -686
  448. package/lib/goog/promise/promise.js +0 -1350
  449. package/lib/goog/promise/resolver.js +0 -48
  450. package/lib/goog/promise/thenable.js +0 -126
  451. package/lib/goog/reflect/reflect.js +0 -77
  452. package/lib/goog/string/const.js +0 -182
  453. package/lib/goog/string/string.js +0 -1599
  454. package/lib/goog/string/typedstring.js +0 -48
  455. package/lib/goog/structs/collection.js +0 -56
  456. package/lib/goog/structs/map.js +0 -457
  457. package/lib/goog/structs/set.js +0 -279
  458. package/lib/goog/structs/structs.js +0 -354
  459. package/lib/goog/style/style.js +0 -2037
  460. package/lib/goog/testing/asserts.js +0 -1278
  461. package/lib/goog/testing/events/events.js +0 -767
  462. package/lib/goog/testing/functionmock.js +0 -175
  463. package/lib/goog/testing/jsunit.js +0 -162
  464. package/lib/goog/testing/loosemock.js +0 -242
  465. package/lib/goog/testing/mock.js +0 -645
  466. package/lib/goog/testing/mockclock.js +0 -606
  467. package/lib/goog/testing/mockcontrol.js +0 -220
  468. package/lib/goog/testing/mockinterface.js +0 -45
  469. package/lib/goog/testing/mockmatchers.js +0 -400
  470. package/lib/goog/testing/objectpropertystring.js +0 -68
  471. package/lib/goog/testing/propertyreplacer.js +0 -262
  472. package/lib/goog/testing/recordfunction.js +0 -215
  473. package/lib/goog/testing/stacktrace.js +0 -594
  474. package/lib/goog/testing/strictmock.js +0 -130
  475. package/lib/goog/testing/testcase.js +0 -1629
  476. package/lib/goog/testing/testrunner.js +0 -440
  477. package/lib/goog/uri/uri.js +0 -1524
  478. package/lib/goog/uri/utils.js +0 -1064
  479. package/lib/goog/useragent/product.js +0 -183
  480. package/lib/goog/useragent/product_isversion.js +0 -144
  481. package/lib/goog/useragent/useragent.js +0 -572
  482. package/lib/webdriver/actionsequence.js +0 -356
  483. package/lib/webdriver/builder.js +0 -207
  484. package/lib/webdriver/capabilities.js +0 -412
  485. package/lib/webdriver/events.js +0 -179
  486. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  487. package/lib/webdriver/http/corsclient.js +0 -133
  488. package/lib/webdriver/http/http.js +0 -525
  489. package/lib/webdriver/http/xhrclient.js +0 -67
  490. package/lib/webdriver/locators.js +0 -257
  491. package/lib/webdriver/logging.js +0 -347
  492. package/lib/webdriver/session.js +0 -74
  493. package/lib/webdriver/stacktrace.js +0 -619
  494. package/lib/webdriver/test/builder_test.js +0 -53
  495. package/lib/webdriver/test/capabilities_test.js +0 -72
  496. package/lib/webdriver/test/events_test.js +0 -203
  497. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  498. package/lib/webdriver/test/http/http_test.js +0 -428
  499. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  500. package/lib/webdriver/test/locators_test.js +0 -59
  501. package/lib/webdriver/test/logging_test.js +0 -85
  502. package/lib/webdriver/test/promise_error_test.js +0 -892
  503. package/lib/webdriver/test/promise_flow_test.js +0 -2365
  504. package/lib/webdriver/test/promise_generator_test.js +0 -323
  505. package/lib/webdriver/test/promise_test.js +0 -2012
  506. package/lib/webdriver/test/stacktrace_test.js +0 -480
  507. package/lib/webdriver/test/test_bootstrap.js +0 -67
  508. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  509. package/lib/webdriver/test/testing/client_test.js +0 -88
  510. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  511. package/lib/webdriver/test/testutil.js +0 -209
  512. package/lib/webdriver/test/testutil_test.js +0 -104
  513. package/lib/webdriver/test/until_test.js +0 -411
  514. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  515. package/lib/webdriver/test/webdriver_test.js +0 -2369
  516. package/lib/webdriver/testing/asserts.js +0 -487
  517. package/lib/webdriver/testing/client.js +0 -179
  518. package/lib/webdriver/testing/jsunit.js +0 -363
  519. package/lib/webdriver/testing/testcase.js +0 -168
  520. package/lib/webdriver/testing/window.js +0 -244
  521. package/lib/webdriver/touchsequence.js +0 -248
  522. package/lib/webdriver/until.js +0 -412
  523. package/lib/webdriver/webdriver.js +0 -2511
  524. package/test/_base_test.js +0 -129
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>firefox/index.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Defines the {@linkplain Driver WebDriver} client for Firefox.<tr><td><a id="l20"></a><a href="#l20">20</a><td> * Each FirefoxDriver instance will be created with an anonymous profile,<tr><td><a id="l21"></a><a href="#l21">21</a><td> * ensuring browser historys do not share session data (cookies, history, cache,<tr><td><a id="l22"></a><a href="#l22">22</a><td> * offline storage, etc.)<tr><td><a id="l23"></a><a href="#l23">23</a><td> *<tr><td><a id="l24"></a><a href="#l24">24</a><td> * __Customizing the Firefox Profile__<tr><td><a id="l25"></a><a href="#l25">25</a><td> *<tr><td><a id="l26"></a><a href="#l26">26</a><td> * The {@link Profile} class may be used to configure the browser profile used<tr><td><a id="l27"></a><a href="#l27">27</a><td> * with WebDriver, with functions to install additional<tr><td><a id="l28"></a><a href="#l28">28</a><td> * {@linkplain Profile#addExtension extensions}, configure browser<tr><td><a id="l29"></a><a href="#l29">29</a><td> * {@linkplain Profile#setPreference preferences}, and more. For example, you<tr><td><a id="l30"></a><a href="#l30">30</a><td> * may wish to include Firebug:<tr><td><a id="l31"></a><a href="#l31">31</a><td> *<tr><td><a id="l32"></a><a href="#l32">32</a><td> * var firefox = require(&#39;selenium-webdriver/firefox&#39;);<tr><td><a id="l33"></a><a href="#l33">33</a><td> *<tr><td><a id="l34"></a><a href="#l34">34</a><td> * var profile = new firefox.Profile();<tr><td><a id="l35"></a><a href="#l35">35</a><td> * profile.addExtension(&#39;/path/to/firebug.xpi&#39;);<tr><td><a id="l36"></a><a href="#l36">36</a><td> * profile.setPreference(&#39;extensions.firebug.showChromeErrors&#39;, true);<tr><td><a id="l37"></a><a href="#l37">37</a><td> *<tr><td><a id="l38"></a><a href="#l38">38</a><td> * var options = new firefox.Options().setProfile(profile);<tr><td><a id="l39"></a><a href="#l39">39</a><td> * var driver = new firefox.Driver(options);<tr><td><a id="l40"></a><a href="#l40">40</a><td> *<tr><td><a id="l41"></a><a href="#l41">41</a><td> * The {@link Profile} class may also be used to configure WebDriver based on a<tr><td><a id="l42"></a><a href="#l42">42</a><td> * pre-existing browser profile:<tr><td><a id="l43"></a><a href="#l43">43</a><td> *<tr><td><a id="l44"></a><a href="#l44">44</a><td> * var profile = new firefox.Profile(<tr><td><a id="l45"></a><a href="#l45">45</a><td> * &#39;/usr/local/home/bob/.mozilla/firefox/3fgog75h.testing&#39;);<tr><td><a id="l46"></a><a href="#l46">46</a><td> * var options = new firefox.Options().setProfile(profile);<tr><td><a id="l47"></a><a href="#l47">47</a><td> * var driver = new firefox.Driver(options);<tr><td><a id="l48"></a><a href="#l48">48</a><td> *<tr><td><a id="l49"></a><a href="#l49">49</a><td> * The FirefoxDriver will _never_ modify a pre-existing profile; instead it will<tr><td><a id="l50"></a><a href="#l50">50</a><td> * create a copy for it to modify. By extension, there are certain browser<tr><td><a id="l51"></a><a href="#l51">51</a><td> * preferences that are required for WebDriver to function properly and they<tr><td><a id="l52"></a><a href="#l52">52</a><td> * will always be overwritten.<tr><td><a id="l53"></a><a href="#l53">53</a><td> *<tr><td><a id="l54"></a><a href="#l54">54</a><td> * __Using a Custom Firefox Binary__<tr><td><a id="l55"></a><a href="#l55">55</a><td> *<tr><td><a id="l56"></a><a href="#l56">56</a><td> * On Windows and OSX, the FirefoxDriver will search for Firefox in its<tr><td><a id="l57"></a><a href="#l57">57</a><td> * default installation location:<tr><td><a id="l58"></a><a href="#l58">58</a><td> *<tr><td><a id="l59"></a><a href="#l59">59</a><td> * * Windows: C:\Program Files and C:\Program Files (x86).<tr><td><a id="l60"></a><a href="#l60">60</a><td> * * Mac OS X: /Applications/Firefox.app<tr><td><a id="l61"></a><a href="#l61">61</a><td> *<tr><td><a id="l62"></a><a href="#l62">62</a><td> * For Linux, Firefox will be located on the PATH: `$(where firefox)`.<tr><td><a id="l63"></a><a href="#l63">63</a><td> *<tr><td><a id="l64"></a><a href="#l64">64</a><td> * You can configure WebDriver to start use a custom Firefox installation with<tr><td><a id="l65"></a><a href="#l65">65</a><td> * the {@link Binary} class:<tr><td><a id="l66"></a><a href="#l66">66</a><td> *<tr><td><a id="l67"></a><a href="#l67">67</a><td> * var firefox = require(&#39;selenium-webdriver/firefox&#39;);<tr><td><a id="l68"></a><a href="#l68">68</a><td> * var binary = new firefox.Binary(&#39;/my/firefox/install/dir/firefox-bin&#39;);<tr><td><a id="l69"></a><a href="#l69">69</a><td> * var options = new firefox.Options().setBinary(binary);<tr><td><a id="l70"></a><a href="#l70">70</a><td> * var driver = new firefox.Driver(options);<tr><td><a id="l71"></a><a href="#l71">71</a><td> *<tr><td><a id="l72"></a><a href="#l72">72</a><td> * __Remote Testing__<tr><td><a id="l73"></a><a href="#l73">73</a><td> *<tr><td><a id="l74"></a><a href="#l74">74</a><td> * You may customize the Firefox binary and profile when running against a<tr><td><a id="l75"></a><a href="#l75">75</a><td> * remote Selenium server. Your custom profile will be packaged as a zip and<tr><td><a id="l76"></a><a href="#l76">76</a><td> * transfered to the remote host for use. The profile will be transferred<tr><td><a id="l77"></a><a href="#l77">77</a><td> * _once for each new session_. The performance impact should be minimal if<tr><td><a id="l78"></a><a href="#l78">78</a><td> * you&#39;ve only configured a few extra browser preferences. If you have a large<tr><td><a id="l79"></a><a href="#l79">79</a><td> * profile with several extensions, you should consider installing it on the<tr><td><a id="l80"></a><a href="#l80">80</a><td> * remote host and defining its path via the {@link Options} class. Custom<tr><td><a id="l81"></a><a href="#l81">81</a><td> * binaries are never copied to remote machines and must be referenced by<tr><td><a id="l82"></a><a href="#l82">82</a><td> * installation path.<tr><td><a id="l83"></a><a href="#l83">83</a><td> *<tr><td><a id="l84"></a><a href="#l84">84</a><td> * var options = new firefox.Options()<tr><td><a id="l85"></a><a href="#l85">85</a><td> * .setProfile(&#39;/profile/path/on/remote/host&#39;)<tr><td><a id="l86"></a><a href="#l86">86</a><td> * .setBinary(&#39;/install/dir/on/remote/host/firefox-bin&#39;);<tr><td><a id="l87"></a><a href="#l87">87</a><td> *<tr><td><a id="l88"></a><a href="#l88">88</a><td> * var driver = new (require(&#39;selenium-webdriver&#39;)).Builder()<tr><td><a id="l89"></a><a href="#l89">89</a><td> * .forBrowser(&#39;firefox&#39;)<tr><td><a id="l90"></a><a href="#l90">90</a><td> * .usingServer(&#39;http://127.0.0.1:4444/wd/hub&#39;)<tr><td><a id="l91"></a><a href="#l91">91</a><td> * .setFirefoxOptions(options)<tr><td><a id="l92"></a><a href="#l92">92</a><td> * .build();<tr><td><a id="l93"></a><a href="#l93">93</a><td> */<tr><td><a id="l94"></a><a href="#l94">94</a><td><tr><td><a id="l95"></a><a href="#l95">95</a><td>&#39;use strict&#39;;<tr><td><a id="l96"></a><a href="#l96">96</a><td><tr><td><a id="l97"></a><a href="#l97">97</a><td>var url = require(&#39;url&#39;),<tr><td><a id="l98"></a><a href="#l98">98</a><td> util = require(&#39;util&#39;);<tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td>var Binary = require(&#39;./binary&#39;).Binary,<tr><td><a id="l101"></a><a href="#l101">101</a><td> Profile = require(&#39;./profile&#39;).Profile,<tr><td><a id="l102"></a><a href="#l102">102</a><td> decodeProfile = require(&#39;./profile&#39;).decode,<tr><td><a id="l103"></a><a href="#l103">103</a><td> webdriver = require(&#39;..&#39;),<tr><td><a id="l104"></a><a href="#l104">104</a><td> executors = require(&#39;../executors&#39;),<tr><td><a id="l105"></a><a href="#l105">105</a><td> httpUtil = require(&#39;../http/util&#39;),<tr><td><a id="l106"></a><a href="#l106">106</a><td> io = require(&#39;../io&#39;),<tr><td><a id="l107"></a><a href="#l107">107</a><td> net = require(&#39;../net&#39;),<tr><td><a id="l108"></a><a href="#l108">108</a><td> portprober = require(&#39;../net/portprober&#39;);<tr><td><a id="l109"></a><a href="#l109">109</a><td><tr><td><a id="l110"></a><a href="#l110">110</a><td><tr><td><a id="l111"></a><a href="#l111">111</a><td>/**<tr><td><a id="l112"></a><a href="#l112">112</a><td> * Configuration options for the FirefoxDriver.<tr><td><a id="l113"></a><a href="#l113">113</a><td> * @constructor<tr><td><a id="l114"></a><a href="#l114">114</a><td> */<tr><td><a id="l115"></a><a href="#l115">115</a><td>var Options = function() {<tr><td><a id="l116"></a><a href="#l116">116</a><td> /** @private {Profile} */<tr><td><a id="l117"></a><a href="#l117">117</a><td> this.profile_ = null;<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td> /** @private {Binary} */<tr><td><a id="l120"></a><a href="#l120">120</a><td> this.binary_ = null;<tr><td><a id="l121"></a><a href="#l121">121</a><td><tr><td><a id="l122"></a><a href="#l122">122</a><td> /** @private {webdriver.logging.Preferences} */<tr><td><a id="l123"></a><a href="#l123">123</a><td> this.logPrefs_ = null;<tr><td><a id="l124"></a><a href="#l124">124</a><td><tr><td><a id="l125"></a><a href="#l125">125</a><td> /** @private {webdriver.ProxyConfig} */<tr><td><a id="l126"></a><a href="#l126">126</a><td> this.proxy_ = null;<tr><td><a id="l127"></a><a href="#l127">127</a><td>};<tr><td><a id="l128"></a><a href="#l128">128</a><td><tr><td><a id="l129"></a><a href="#l129">129</a><td><tr><td><a id="l130"></a><a href="#l130">130</a><td>/**<tr><td><a id="l131"></a><a href="#l131">131</a><td> * Sets the profile to use. The profile may be specified as a<tr><td><a id="l132"></a><a href="#l132">132</a><td> * {@link Profile} object or as the path to an existing Firefox profile to use<tr><td><a id="l133"></a><a href="#l133">133</a><td> * as a template.<tr><td><a id="l134"></a><a href="#l134">134</a><td> *<tr><td><a id="l135"></a><a href="#l135">135</a><td> * @param {(string|!Profile)} profile The profile to use.<tr><td><a id="l136"></a><a href="#l136">136</a><td> * @return {!Options} A self reference.<tr><td><a id="l137"></a><a href="#l137">137</a><td> */<tr><td><a id="l138"></a><a href="#l138">138</a><td>Options.prototype.setProfile = function(profile) {<tr><td><a id="l139"></a><a href="#l139">139</a><td> if (typeof profile === &#39;string&#39;) {<tr><td><a id="l140"></a><a href="#l140">140</a><td> profile = new Profile(profile);<tr><td><a id="l141"></a><a href="#l141">141</a><td> }<tr><td><a id="l142"></a><a href="#l142">142</a><td> this.profile_ = profile;<tr><td><a id="l143"></a><a href="#l143">143</a><td> return this;<tr><td><a id="l144"></a><a href="#l144">144</a><td>};<tr><td><a id="l145"></a><a href="#l145">145</a><td><tr><td><a id="l146"></a><a href="#l146">146</a><td><tr><td><a id="l147"></a><a href="#l147">147</a><td>/**<tr><td><a id="l148"></a><a href="#l148">148</a><td> * Sets the binary to use. The binary may be specified as the path to a Firefox<tr><td><a id="l149"></a><a href="#l149">149</a><td> * executable, or as a {@link Binary} object.<tr><td><a id="l150"></a><a href="#l150">150</a><td> *<tr><td><a id="l151"></a><a href="#l151">151</a><td> * @param {(string|!Binary)} binary The binary to use.<tr><td><a id="l152"></a><a href="#l152">152</a><td> * @return {!Options} A self reference.<tr><td><a id="l153"></a><a href="#l153">153</a><td> */<tr><td><a id="l154"></a><a href="#l154">154</a><td>Options.prototype.setBinary = function(binary) {<tr><td><a id="l155"></a><a href="#l155">155</a><td> if (typeof binary === &#39;string&#39;) {<tr><td><a id="l156"></a><a href="#l156">156</a><td> binary = new Binary(binary);<tr><td><a id="l157"></a><a href="#l157">157</a><td> }<tr><td><a id="l158"></a><a href="#l158">158</a><td> this.binary_ = binary;<tr><td><a id="l159"></a><a href="#l159">159</a><td> return this;<tr><td><a id="l160"></a><a href="#l160">160</a><td>};<tr><td><a id="l161"></a><a href="#l161">161</a><td><tr><td><a id="l162"></a><a href="#l162">162</a><td><tr><td><a id="l163"></a><a href="#l163">163</a><td>/**<tr><td><a id="l164"></a><a href="#l164">164</a><td> * Sets the logging preferences for the new session.<tr><td><a id="l165"></a><a href="#l165">165</a><td> * @param {webdriver.logging.Preferences} prefs The logging preferences.<tr><td><a id="l166"></a><a href="#l166">166</a><td> * @return {!Options} A self reference.<tr><td><a id="l167"></a><a href="#l167">167</a><td> */<tr><td><a id="l168"></a><a href="#l168">168</a><td>Options.prototype.setLoggingPreferences = function(prefs) {<tr><td><a id="l169"></a><a href="#l169">169</a><td> this.logPrefs_ = prefs;<tr><td><a id="l170"></a><a href="#l170">170</a><td> return this;<tr><td><a id="l171"></a><a href="#l171">171</a><td>};<tr><td><a id="l172"></a><a href="#l172">172</a><td><tr><td><a id="l173"></a><a href="#l173">173</a><td><tr><td><a id="l174"></a><a href="#l174">174</a><td>/**<tr><td><a id="l175"></a><a href="#l175">175</a><td> * Sets the proxy to use.<tr><td><a id="l176"></a><a href="#l176">176</a><td> *<tr><td><a id="l177"></a><a href="#l177">177</a><td> * @param {webdriver.ProxyConfig} proxy The proxy configuration to use.<tr><td><a id="l178"></a><a href="#l178">178</a><td> * @return {!Options} A self reference.<tr><td><a id="l179"></a><a href="#l179">179</a><td> */<tr><td><a id="l180"></a><a href="#l180">180</a><td>Options.prototype.setProxy = function(proxy) {<tr><td><a id="l181"></a><a href="#l181">181</a><td> this.proxy_ = proxy;<tr><td><a id="l182"></a><a href="#l182">182</a><td> return this;<tr><td><a id="l183"></a><a href="#l183">183</a><td>};<tr><td><a id="l184"></a><a href="#l184">184</a><td><tr><td><a id="l185"></a><a href="#l185">185</a><td><tr><td><a id="l186"></a><a href="#l186">186</a><td>/**<tr><td><a id="l187"></a><a href="#l187">187</a><td> * Converts these options to a {@link webdriver.Capabilities} instance.<tr><td><a id="l188"></a><a href="#l188">188</a><td> *<tr><td><a id="l189"></a><a href="#l189">189</a><td> * @return {!webdriver.Capabilities} A new capabilities object.<tr><td><a id="l190"></a><a href="#l190">190</a><td> */<tr><td><a id="l191"></a><a href="#l191">191</a><td>Options.prototype.toCapabilities = function(opt_remote) {<tr><td><a id="l192"></a><a href="#l192">192</a><td> var caps = webdriver.Capabilities.firefox();<tr><td><a id="l193"></a><a href="#l193">193</a><td> if (this.logPrefs_) {<tr><td><a id="l194"></a><a href="#l194">194</a><td> caps.set(webdriver.Capability.LOGGING_PREFS, this.logPrefs_);<tr><td><a id="l195"></a><a href="#l195">195</a><td> }<tr><td><a id="l196"></a><a href="#l196">196</a><td> if (this.proxy_) {<tr><td><a id="l197"></a><a href="#l197">197</a><td> caps.set(webdriver.Capability.PROXY, this.proxy_);<tr><td><a id="l198"></a><a href="#l198">198</a><td> }<tr><td><a id="l199"></a><a href="#l199">199</a><td> if (this.binary_) {<tr><td><a id="l200"></a><a href="#l200">200</a><td> caps.set(&#39;firefox_binary&#39;, this.binary_);<tr><td><a id="l201"></a><a href="#l201">201</a><td> }<tr><td><a id="l202"></a><a href="#l202">202</a><td> if (this.profile_) {<tr><td><a id="l203"></a><a href="#l203">203</a><td> caps.set(&#39;firefox_profile&#39;, this.profile_);<tr><td><a id="l204"></a><a href="#l204">204</a><td> }<tr><td><a id="l205"></a><a href="#l205">205</a><td> return caps;<tr><td><a id="l206"></a><a href="#l206">206</a><td>};<tr><td><a id="l207"></a><a href="#l207">207</a><td><tr><td><a id="l208"></a><a href="#l208">208</a><td><tr><td><a id="l209"></a><a href="#l209">209</a><td>/**<tr><td><a id="l210"></a><a href="#l210">210</a><td> * A WebDriver client for Firefox.<tr><td><a id="l211"></a><a href="#l211">211</a><td> *<tr><td><a id="l212"></a><a href="#l212">212</a><td> * @param {(Options|webdriver.Capabilities|Object)=} opt_config The<tr><td><a id="l213"></a><a href="#l213">213</a><td> * configuration options for this driver, specified as either an<tr><td><a id="l214"></a><a href="#l214">214</a><td> * {@link Options} or {@link webdriver.Capabilities}, or as a raw hash<tr><td><a id="l215"></a><a href="#l215">215</a><td> * object.<tr><td><a id="l216"></a><a href="#l216">216</a><td> * @param {webdriver.promise.ControlFlow=} opt_flow The flow to<tr><td><a id="l217"></a><a href="#l217">217</a><td> * schedule commands through. Defaults to the active flow object.<tr><td><a id="l218"></a><a href="#l218">218</a><td> * @constructor<tr><td><a id="l219"></a><a href="#l219">219</a><td> * @extends {webdriver.WebDriver}<tr><td><a id="l220"></a><a href="#l220">220</a><td> */<tr><td><a id="l221"></a><a href="#l221">221</a><td>var Driver = function(opt_config, opt_flow) {<tr><td><a id="l222"></a><a href="#l222">222</a><td> var caps;<tr><td><a id="l223"></a><a href="#l223">223</a><td> if (opt_config instanceof Options) {<tr><td><a id="l224"></a><a href="#l224">224</a><td> caps = opt_config.toCapabilities();<tr><td><a id="l225"></a><a href="#l225">225</a><td> } else {<tr><td><a id="l226"></a><a href="#l226">226</a><td> caps = new webdriver.Capabilities(opt_config);<tr><td><a id="l227"></a><a href="#l227">227</a><td> }<tr><td><a id="l228"></a><a href="#l228">228</a><td><tr><td><a id="l229"></a><a href="#l229">229</a><td> var binary = caps.get(&#39;firefox_binary&#39;) || new Binary();<tr><td><a id="l230"></a><a href="#l230">230</a><td> if (typeof binary === &#39;string&#39;) {<tr><td><a id="l231"></a><a href="#l231">231</a><td> binary = new Binary(binary);<tr><td><a id="l232"></a><a href="#l232">232</a><td> }<tr><td><a id="l233"></a><a href="#l233">233</a><td><tr><td><a id="l234"></a><a href="#l234">234</a><td> var profile = caps.get(&#39;firefox_profile&#39;) || new Profile();<tr><td><a id="l235"></a><a href="#l235">235</a><td><tr><td><a id="l236"></a><a href="#l236">236</a><td> caps.set(&#39;firefox_binary&#39;, null);<tr><td><a id="l237"></a><a href="#l237">237</a><td> caps.set(&#39;firefox_profile&#39;, null);<tr><td><a id="l238"></a><a href="#l238">238</a><td><tr><td><a id="l239"></a><a href="#l239">239</a><td> /** @private {?string} */<tr><td><a id="l240"></a><a href="#l240">240</a><td> this.profilePath_ = null;<tr><td><a id="l241"></a><a href="#l241">241</a><td><tr><td><a id="l242"></a><a href="#l242">242</a><td> var self = this;<tr><td><a id="l243"></a><a href="#l243">243</a><td> var freePort = portprober.findFreePort();<tr><td><a id="l244"></a><a href="#l244">244</a><td><tr><td><a id="l245"></a><a href="#l245">245</a><td> /** @private */<tr><td><a id="l246"></a><a href="#l246">246</a><td> this.command_ = freePort.then(function(port) {<tr><td><a id="l247"></a><a href="#l247">247</a><td> if (typeof profile === &#39;string&#39;) {<tr><td><a id="l248"></a><a href="#l248">248</a><td> return decodeProfile(profile).then(function(dir) {<tr><td><a id="l249"></a><a href="#l249">249</a><td> var profile = new Profile(dir);<tr><td><a id="l250"></a><a href="#l250">250</a><td> profile.setPreference(&#39;webdriver_firefox_port&#39;, port);<tr><td><a id="l251"></a><a href="#l251">251</a><td> return profile.writeToDisk();<tr><td><a id="l252"></a><a href="#l252">252</a><td> });<tr><td><a id="l253"></a><a href="#l253">253</a><td> } else {<tr><td><a id="l254"></a><a href="#l254">254</a><td> profile.setPreference(&#39;webdriver_firefox_port&#39;, port);<tr><td><a id="l255"></a><a href="#l255">255</a><td> return profile.writeToDisk();<tr><td><a id="l256"></a><a href="#l256">256</a><td> }<tr><td><a id="l257"></a><a href="#l257">257</a><td> }).then(function(profileDir) {<tr><td><a id="l258"></a><a href="#l258">258</a><td> self.profilePath_ = profileDir;<tr><td><a id="l259"></a><a href="#l259">259</a><td> return binary.launch(profileDir);<tr><td><a id="l260"></a><a href="#l260">260</a><td> });<tr><td><a id="l261"></a><a href="#l261">261</a><td><tr><td><a id="l262"></a><a href="#l262">262</a><td> var serverUrl = this.command_<tr><td><a id="l263"></a><a href="#l263">263</a><td> .then(function() { return freePort; })<tr><td><a id="l264"></a><a href="#l264">264</a><td> .then(function(port) {<tr><td><a id="l265"></a><a href="#l265">265</a><td> var serverUrl = url.format({<tr><td><a id="l266"></a><a href="#l266">266</a><td> protocol: &#39;http&#39;,<tr><td><a id="l267"></a><a href="#l267">267</a><td> hostname: net.getLoopbackAddress(),<tr><td><a id="l268"></a><a href="#l268">268</a><td> port: port,<tr><td><a id="l269"></a><a href="#l269">269</a><td> pathname: &#39;/hub&#39;<tr><td><a id="l270"></a><a href="#l270">270</a><td> });<tr><td><a id="l271"></a><a href="#l271">271</a><td><tr><td><a id="l272"></a><a href="#l272">272</a><td> return httpUtil.waitForServer(serverUrl, 45 * 1000).then(function() {<tr><td><a id="l273"></a><a href="#l273">273</a><td> return serverUrl;<tr><td><a id="l274"></a><a href="#l274">274</a><td> });<tr><td><a id="l275"></a><a href="#l275">275</a><td> });<tr><td><a id="l276"></a><a href="#l276">276</a><td><tr><td><a id="l277"></a><a href="#l277">277</a><td> var executor = executors.createExecutor(serverUrl);<tr><td><a id="l278"></a><a href="#l278">278</a><td> var driver = webdriver.WebDriver.createSession(executor, caps, opt_flow);<tr><td><a id="l279"></a><a href="#l279">279</a><td><tr><td><a id="l280"></a><a href="#l280">280</a><td> webdriver.WebDriver.call(this, driver.getSession(), executor, opt_flow);<tr><td><a id="l281"></a><a href="#l281">281</a><td>};<tr><td><a id="l282"></a><a href="#l282">282</a><td>util.inherits(Driver, webdriver.WebDriver);<tr><td><a id="l283"></a><a href="#l283">283</a><td><tr><td><a id="l284"></a><a href="#l284">284</a><td><tr><td><a id="l285"></a><a href="#l285">285</a><td>/**<tr><td><a id="l286"></a><a href="#l286">286</a><td> * This function is a no-op as file detectors are not supported by this<tr><td><a id="l287"></a><a href="#l287">287</a><td> * implementation.<tr><td><a id="l288"></a><a href="#l288">288</a><td> * @override<tr><td><a id="l289"></a><a href="#l289">289</a><td> */<tr><td><a id="l290"></a><a href="#l290">290</a><td>Driver.prototype.setFileDetector = function() {<tr><td><a id="l291"></a><a href="#l291">291</a><td>};<tr><td><a id="l292"></a><a href="#l292">292</a><td><tr><td><a id="l293"></a><a href="#l293">293</a><td><tr><td><a id="l294"></a><a href="#l294">294</a><td>/** @override */<tr><td><a id="l295"></a><a href="#l295">295</a><td>Driver.prototype.quit = function() {<tr><td><a id="l296"></a><a href="#l296">296</a><td> return this.call(function() {<tr><td><a id="l297"></a><a href="#l297">297</a><td> var self = this;<tr><td><a id="l298"></a><a href="#l298">298</a><td> return Driver.super_.prototype.quit.call(this)<tr><td><a id="l299"></a><a href="#l299">299</a><td> .thenFinally(function() {<tr><td><a id="l300"></a><a href="#l300">300</a><td> return self.command_.then(function(command) {<tr><td><a id="l301"></a><a href="#l301">301</a><td> command.kill();<tr><td><a id="l302"></a><a href="#l302">302</a><td> return command.result();<tr><td><a id="l303"></a><a href="#l303">303</a><td> });<tr><td><a id="l304"></a><a href="#l304">304</a><td> })<tr><td><a id="l305"></a><a href="#l305">305</a><td> .thenFinally(function() {<tr><td><a id="l306"></a><a href="#l306">306</a><td> if (self.profilePath_) {<tr><td><a id="l307"></a><a href="#l307">307</a><td> return io.rmDir(self.profilePath_);<tr><td><a id="l308"></a><a href="#l308">308</a><td> }<tr><td><a id="l309"></a><a href="#l309">309</a><td> });<tr><td><a id="l310"></a><a href="#l310">310</a><td> }, this);<tr><td><a id="l311"></a><a href="#l311">311</a><td>};<tr><td><a id="l312"></a><a href="#l312">312</a><td><tr><td><a id="l313"></a><a href="#l313">313</a><td><tr><td><a id="l314"></a><a href="#l314">314</a><td>// PUBLIC API<tr><td><a id="l315"></a><a href="#l315">315</a><td><tr><td><a id="l316"></a><a href="#l316">316</a><td><tr><td><a id="l317"></a><a href="#l317">317</a><td>exports.Binary = Binary;<tr><td><a id="l318"></a><a href="#l318">318</a><td>exports.Driver = Driver;<tr><td><a id="l319"></a><a href="#l319">319</a><td>exports.Options = Options;<tr><td><a id="l320"></a><a href="#l320">320</a><td>exports.Profile = Profile;</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>profile.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>firefox/profile.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Profile management module. This module is considered internal;<tr><td><a id="l20"></a><a href="#l20">20</a><td> * users should use {@link selenium-webdriver/firefox}.<tr><td><a id="l21"></a><a href="#l21">21</a><td> */<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td>&#39;use strict&#39;;<tr><td><a id="l24"></a><a href="#l24">24</a><td><tr><td><a id="l25"></a><a href="#l25">25</a><td>var AdmZip = require(&#39;adm-zip&#39;),<tr><td><a id="l26"></a><a href="#l26">26</a><td> AdmConstants = require(&#39;adm-zip/util/constants&#39;),<tr><td><a id="l27"></a><a href="#l27">27</a><td> fs = require(&#39;fs&#39;),<tr><td><a id="l28"></a><a href="#l28">28</a><td> path = require(&#39;path&#39;),<tr><td><a id="l29"></a><a href="#l29">29</a><td> util = require(&#39;util&#39;),<tr><td><a id="l30"></a><a href="#l30">30</a><td> vm = require(&#39;vm&#39;);<tr><td><a id="l31"></a><a href="#l31">31</a><td><tr><td><a id="l32"></a><a href="#l32">32</a><td>var Serializable = require(&#39;..&#39;).Serializable,<tr><td><a id="l33"></a><a href="#l33">33</a><td> promise = require(&#39;..&#39;).promise,<tr><td><a id="l34"></a><a href="#l34">34</a><td> _base = require(&#39;../_base&#39;),<tr><td><a id="l35"></a><a href="#l35">35</a><td> io = require(&#39;../io&#39;),<tr><td><a id="l36"></a><a href="#l36">36</a><td> extension = require(&#39;./extension&#39;);<tr><td><a id="l37"></a><a href="#l37">37</a><td><tr><td><a id="l38"></a><a href="#l38">38</a><td><tr><td><a id="l39"></a><a href="#l39">39</a><td>/** @const */<tr><td><a id="l40"></a><a href="#l40">40</a><td>var WEBDRIVER_PREFERENCES_PATH = _base.isDevMode()<tr><td><a id="l41"></a><a href="#l41">41</a><td> ? path.join(__dirname, &#39;../../../firefox-driver/webdriver.json&#39;)<tr><td><a id="l42"></a><a href="#l42">42</a><td> : path.join(__dirname, &#39;../lib/firefox/webdriver.json&#39;);<tr><td><a id="l43"></a><a href="#l43">43</a><td><tr><td><a id="l44"></a><a href="#l44">44</a><td>/** @const */<tr><td><a id="l45"></a><a href="#l45">45</a><td>var WEBDRIVER_EXTENSION_PATH = _base.isDevMode()<tr><td><a id="l46"></a><a href="#l46">46</a><td> ? path.join(__dirname,<tr><td><a id="l47"></a><a href="#l47">47</a><td> &#39;../../../../build/javascript/firefox-driver/webdriver.xpi&#39;)<tr><td><a id="l48"></a><a href="#l48">48</a><td> : path.join(__dirname, &#39;../lib/firefox/webdriver.xpi&#39;);<tr><td><a id="l49"></a><a href="#l49">49</a><td><tr><td><a id="l50"></a><a href="#l50">50</a><td>/** @const */<tr><td><a id="l51"></a><a href="#l51">51</a><td>var WEBDRIVER_EXTENSION_NAME = &#39;fxdriver@googlecode.com&#39;;<tr><td><a id="l52"></a><a href="#l52">52</a><td><tr><td><a id="l53"></a><a href="#l53">53</a><td><tr><td><a id="l54"></a><a href="#l54">54</a><td><tr><td><a id="l55"></a><a href="#l55">55</a><td>/** @type {Object} */<tr><td><a id="l56"></a><a href="#l56">56</a><td>var defaultPreferences = null;<tr><td><a id="l57"></a><a href="#l57">57</a><td><tr><td><a id="l58"></a><a href="#l58">58</a><td>/**<tr><td><a id="l59"></a><a href="#l59">59</a><td> * Synchronously loads the default preferences used for the FirefoxDriver.<tr><td><a id="l60"></a><a href="#l60">60</a><td> * @return {!Object} The default preferences JSON object.<tr><td><a id="l61"></a><a href="#l61">61</a><td> */<tr><td><a id="l62"></a><a href="#l62">62</a><td>function getDefaultPreferences() {<tr><td><a id="l63"></a><a href="#l63">63</a><td> if (!defaultPreferences) {<tr><td><a id="l64"></a><a href="#l64">64</a><td> var contents = fs.readFileSync(WEBDRIVER_PREFERENCES_PATH, &#39;utf8&#39;);<tr><td><a id="l65"></a><a href="#l65">65</a><td> defaultPreferences = JSON.parse(contents);<tr><td><a id="l66"></a><a href="#l66">66</a><td> }<tr><td><a id="l67"></a><a href="#l67">67</a><td> return defaultPreferences;<tr><td><a id="l68"></a><a href="#l68">68</a><td>}<tr><td><a id="l69"></a><a href="#l69">69</a><td><tr><td><a id="l70"></a><a href="#l70">70</a><td><tr><td><a id="l71"></a><a href="#l71">71</a><td>/**<tr><td><a id="l72"></a><a href="#l72">72</a><td> * Parses a user.js file in a Firefox profile directory.<tr><td><a id="l73"></a><a href="#l73">73</a><td> * @param {string} f Path to the file to parse.<tr><td><a id="l74"></a><a href="#l74">74</a><td> * @return {!promise.Promise.&lt;!Object&gt;} A promise for the parsed preferences as<tr><td><a id="l75"></a><a href="#l75">75</a><td> * a JSON object. If the file does not exist, an empty object will be<tr><td><a id="l76"></a><a href="#l76">76</a><td> * returned.<tr><td><a id="l77"></a><a href="#l77">77</a><td> */<tr><td><a id="l78"></a><a href="#l78">78</a><td>function loadUserPrefs(f) {<tr><td><a id="l79"></a><a href="#l79">79</a><td> var done = promise.defer();<tr><td><a id="l80"></a><a href="#l80">80</a><td> fs.readFile(f, function(err, contents) {<tr><td><a id="l81"></a><a href="#l81">81</a><td> if (err &amp;&amp; err.code === &#39;ENOENT&#39;) {<tr><td><a id="l82"></a><a href="#l82">82</a><td> done.fulfill({});<tr><td><a id="l83"></a><a href="#l83">83</a><td> return;<tr><td><a id="l84"></a><a href="#l84">84</a><td> }<tr><td><a id="l85"></a><a href="#l85">85</a><td><tr><td><a id="l86"></a><a href="#l86">86</a><td> if (err) {<tr><td><a id="l87"></a><a href="#l87">87</a><td> done.reject(err);<tr><td><a id="l88"></a><a href="#l88">88</a><td> return;<tr><td><a id="l89"></a><a href="#l89">89</a><td> }<tr><td><a id="l90"></a><a href="#l90">90</a><td><tr><td><a id="l91"></a><a href="#l91">91</a><td> var prefs = {};<tr><td><a id="l92"></a><a href="#l92">92</a><td> var context = vm.createContext({<tr><td><a id="l93"></a><a href="#l93">93</a><td> &#39;user_pref&#39;: function(key, value) {<tr><td><a id="l94"></a><a href="#l94">94</a><td> prefs[key] = value;<tr><td><a id="l95"></a><a href="#l95">95</a><td> }<tr><td><a id="l96"></a><a href="#l96">96</a><td> });<tr><td><a id="l97"></a><a href="#l97">97</a><td><tr><td><a id="l98"></a><a href="#l98">98</a><td> vm.runInContext(contents, context, f);<tr><td><a id="l99"></a><a href="#l99">99</a><td> done.fulfill(prefs);<tr><td><a id="l100"></a><a href="#l100">100</a><td> });<tr><td><a id="l101"></a><a href="#l101">101</a><td> return done.promise;<tr><td><a id="l102"></a><a href="#l102">102</a><td>}<tr><td><a id="l103"></a><a href="#l103">103</a><td><tr><td><a id="l104"></a><a href="#l104">104</a><td><tr><td><a id="l105"></a><a href="#l105">105</a><td>/**<tr><td><a id="l106"></a><a href="#l106">106</a><td> * Copies the properties of one object into another.<tr><td><a id="l107"></a><a href="#l107">107</a><td> * @param {!Object} a The destination object.<tr><td><a id="l108"></a><a href="#l108">108</a><td> * @param {!Object} b The source object to apply as a mixin.<tr><td><a id="l109"></a><a href="#l109">109</a><td> */<tr><td><a id="l110"></a><a href="#l110">110</a><td>function mixin(a, b) {<tr><td><a id="l111"></a><a href="#l111">111</a><td> Object.keys(b).forEach(function(key) {<tr><td><a id="l112"></a><a href="#l112">112</a><td> a[key] = b[key];<tr><td><a id="l113"></a><a href="#l113">113</a><td> });<tr><td><a id="l114"></a><a href="#l114">114</a><td>}<tr><td><a id="l115"></a><a href="#l115">115</a><td><tr><td><a id="l116"></a><a href="#l116">116</a><td><tr><td><a id="l117"></a><a href="#l117">117</a><td>/**<tr><td><a id="l118"></a><a href="#l118">118</a><td> * @param {!Object} defaults The default preferences to write. Will be<tr><td><a id="l119"></a><a href="#l119">119</a><td> * overridden by user.js preferences in the template directory and the<tr><td><a id="l120"></a><a href="#l120">120</a><td> * frozen preferences required by WebDriver.<tr><td><a id="l121"></a><a href="#l121">121</a><td> * @param {string} dir Path to the directory write the file to.<tr><td><a id="l122"></a><a href="#l122">122</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the profile directory,<tr><td><a id="l123"></a><a href="#l123">123</a><td> * to be fulfilled when user preferences have been written.<tr><td><a id="l124"></a><a href="#l124">124</a><td> */<tr><td><a id="l125"></a><a href="#l125">125</a><td>function writeUserPrefs(prefs, dir) {<tr><td><a id="l126"></a><a href="#l126">126</a><td> var userPrefs = path.join(dir, &#39;user.js&#39;);<tr><td><a id="l127"></a><a href="#l127">127</a><td> return loadUserPrefs(userPrefs).then(function(overrides) {<tr><td><a id="l128"></a><a href="#l128">128</a><td> mixin(prefs, overrides);<tr><td><a id="l129"></a><a href="#l129">129</a><td> mixin(prefs, getDefaultPreferences()[&#39;frozen&#39;]);<tr><td><a id="l130"></a><a href="#l130">130</a><td><tr><td><a id="l131"></a><a href="#l131">131</a><td> var contents = Object.keys(prefs).map(function(key) {<tr><td><a id="l132"></a><a href="#l132">132</a><td> return &#39;user_pref(&#39; + JSON.stringify(key) + &#39;, &#39; +<tr><td><a id="l133"></a><a href="#l133">133</a><td> JSON.stringify(prefs[key]) + &#39;);&#39;;<tr><td><a id="l134"></a><a href="#l134">134</a><td> }).join(&#39;\n&#39;);<tr><td><a id="l135"></a><a href="#l135">135</a><td><tr><td><a id="l136"></a><a href="#l136">136</a><td> var done = promise.defer();<tr><td><a id="l137"></a><a href="#l137">137</a><td> fs.writeFile(userPrefs, contents, function(err) {<tr><td><a id="l138"></a><a href="#l138">138</a><td> err &amp;&amp; done.reject(err) || done.fulfill(dir);<tr><td><a id="l139"></a><a href="#l139">139</a><td> });<tr><td><a id="l140"></a><a href="#l140">140</a><td> return done.promise;<tr><td><a id="l141"></a><a href="#l141">141</a><td> });<tr><td><a id="l142"></a><a href="#l142">142</a><td>};<tr><td><a id="l143"></a><a href="#l143">143</a><td><tr><td><a id="l144"></a><a href="#l144">144</a><td><tr><td><a id="l145"></a><a href="#l145">145</a><td>/**<tr><td><a id="l146"></a><a href="#l146">146</a><td> * Installs a group of extensions in the given profile directory. If the<tr><td><a id="l147"></a><a href="#l147">147</a><td> * WebDriver extension is not included in this set, the default version<tr><td><a id="l148"></a><a href="#l148">148</a><td> * bundled with this package will be installed.<tr><td><a id="l149"></a><a href="#l149">149</a><td> * @param {!Array.&lt;string&gt;} extensions The extensions to install, as a<tr><td><a id="l150"></a><a href="#l150">150</a><td> * path to an unpacked extension directory or a path to a xpi file.<tr><td><a id="l151"></a><a href="#l151">151</a><td> * @param {string} dir The profile directory to install to.<tr><td><a id="l152"></a><a href="#l152">152</a><td> * @param {boolean=} opt_excludeWebDriverExt Whether to skip installation of<tr><td><a id="l153"></a><a href="#l153">153</a><td> * the default WebDriver extension.<tr><td><a id="l154"></a><a href="#l154">154</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the main profile directory<tr><td><a id="l155"></a><a href="#l155">155</a><td> * once all extensions have been installed.<tr><td><a id="l156"></a><a href="#l156">156</a><td> */<tr><td><a id="l157"></a><a href="#l157">157</a><td>function installExtensions(extensions, dir, opt_excludeWebDriverExt) {<tr><td><a id="l158"></a><a href="#l158">158</a><td> var hasWebDriver = !!opt_excludeWebDriverExt;<tr><td><a id="l159"></a><a href="#l159">159</a><td> var next = 0;<tr><td><a id="l160"></a><a href="#l160">160</a><td> var extensionDir = path.join(dir, &#39;extensions&#39;);<tr><td><a id="l161"></a><a href="#l161">161</a><td> var done = promise.defer();<tr><td><a id="l162"></a><a href="#l162">162</a><td><tr><td><a id="l163"></a><a href="#l163">163</a><td> return io.exists(extensionDir).then(function(exists) {<tr><td><a id="l164"></a><a href="#l164">164</a><td> if (!exists) {<tr><td><a id="l165"></a><a href="#l165">165</a><td> return promise.checkedNodeCall(fs.mkdir, extensionDir);<tr><td><a id="l166"></a><a href="#l166">166</a><td> }<tr><td><a id="l167"></a><a href="#l167">167</a><td> }).then(function() {<tr><td><a id="l168"></a><a href="#l168">168</a><td> installNext();<tr><td><a id="l169"></a><a href="#l169">169</a><td> return done.promise;<tr><td><a id="l170"></a><a href="#l170">170</a><td> });<tr><td><a id="l171"></a><a href="#l171">171</a><td><tr><td><a id="l172"></a><a href="#l172">172</a><td> function installNext() {<tr><td><a id="l173"></a><a href="#l173">173</a><td> if (!done.isPending()) {<tr><td><a id="l174"></a><a href="#l174">174</a><td> return;<tr><td><a id="l175"></a><a href="#l175">175</a><td> }<tr><td><a id="l176"></a><a href="#l176">176</a><td><tr><td><a id="l177"></a><a href="#l177">177</a><td> if (next &gt;= extensions.length) {<tr><td><a id="l178"></a><a href="#l178">178</a><td> if (hasWebDriver) {<tr><td><a id="l179"></a><a href="#l179">179</a><td> done.fulfill(dir);<tr><td><a id="l180"></a><a href="#l180">180</a><td> } else {<tr><td><a id="l181"></a><a href="#l181">181</a><td> install(WEBDRIVER_EXTENSION_PATH);<tr><td><a id="l182"></a><a href="#l182">182</a><td> }<tr><td><a id="l183"></a><a href="#l183">183</a><td> } else {<tr><td><a id="l184"></a><a href="#l184">184</a><td> install(extensions[next++]);<tr><td><a id="l185"></a><a href="#l185">185</a><td> }<tr><td><a id="l186"></a><a href="#l186">186</a><td> }<tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td> function install(ext) {<tr><td><a id="l189"></a><a href="#l189">189</a><td> extension.install(ext, extensionDir).then(function(id) {<tr><td><a id="l190"></a><a href="#l190">190</a><td> hasWebDriver = hasWebDriver || (id === WEBDRIVER_EXTENSION_NAME);<tr><td><a id="l191"></a><a href="#l191">191</a><td> installNext();<tr><td><a id="l192"></a><a href="#l192">192</a><td> }, done.reject);<tr><td><a id="l193"></a><a href="#l193">193</a><td> }<tr><td><a id="l194"></a><a href="#l194">194</a><td>}<tr><td><a id="l195"></a><a href="#l195">195</a><td><tr><td><a id="l196"></a><a href="#l196">196</a><td><tr><td><a id="l197"></a><a href="#l197">197</a><td>/**<tr><td><a id="l198"></a><a href="#l198">198</a><td> * Decodes a base64 encoded profile.<tr><td><a id="l199"></a><a href="#l199">199</a><td> * @param {string} data The base64 encoded string.<tr><td><a id="l200"></a><a href="#l200">200</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the path to the decoded<tr><td><a id="l201"></a><a href="#l201">201</a><td> * profile directory.<tr><td><a id="l202"></a><a href="#l202">202</a><td> */<tr><td><a id="l203"></a><a href="#l203">203</a><td>function decode(data) {<tr><td><a id="l204"></a><a href="#l204">204</a><td> return io.tmpFile().then(function(file) {<tr><td><a id="l205"></a><a href="#l205">205</a><td> var buf = new Buffer(data, &#39;base64&#39;);<tr><td><a id="l206"></a><a href="#l206">206</a><td> return promise.checkedNodeCall(fs.writeFile, file, buf).then(function() {<tr><td><a id="l207"></a><a href="#l207">207</a><td> return io.tmpDir();<tr><td><a id="l208"></a><a href="#l208">208</a><td> }).then(function(dir) {<tr><td><a id="l209"></a><a href="#l209">209</a><td> var zip = new AdmZip(file);<tr><td><a id="l210"></a><a href="#l210">210</a><td> zip.extractAllTo(dir); // Sync only? Why?? :-(<tr><td><a id="l211"></a><a href="#l211">211</a><td> return dir;<tr><td><a id="l212"></a><a href="#l212">212</a><td> });<tr><td><a id="l213"></a><a href="#l213">213</a><td> });<tr><td><a id="l214"></a><a href="#l214">214</a><td>}<tr><td><a id="l215"></a><a href="#l215">215</a><td><tr><td><a id="l216"></a><a href="#l216">216</a><td><tr><td><a id="l217"></a><a href="#l217">217</a><td><tr><td><a id="l218"></a><a href="#l218">218</a><td>/**<tr><td><a id="l219"></a><a href="#l219">219</a><td> * Models a Firefox proifle directory for use with the FirefoxDriver. The<tr><td><a id="l220"></a><a href="#l220">220</a><td> * {@code Proifle} directory uses an in-memory model until {@link #writeToDisk}<tr><td><a id="l221"></a><a href="#l221">221</a><td> * is called.<tr><td><a id="l222"></a><a href="#l222">222</a><td> * @param {string=} opt_dir Path to an existing Firefox profile directory to<tr><td><a id="l223"></a><a href="#l223">223</a><td> * use a template for this profile. If not specified, a blank profile will<tr><td><a id="l224"></a><a href="#l224">224</a><td> * be used.<tr><td><a id="l225"></a><a href="#l225">225</a><td> * @constructor<tr><td><a id="l226"></a><a href="#l226">226</a><td> * @extends {Serializable.&lt;string&gt;}<tr><td><a id="l227"></a><a href="#l227">227</a><td> */<tr><td><a id="l228"></a><a href="#l228">228</a><td>var Profile = function(opt_dir) {<tr><td><a id="l229"></a><a href="#l229">229</a><td> Serializable.call(this);<tr><td><a id="l230"></a><a href="#l230">230</a><td><tr><td><a id="l231"></a><a href="#l231">231</a><td> /** @private {!Object} */<tr><td><a id="l232"></a><a href="#l232">232</a><td> this.preferences_ = {};<tr><td><a id="l233"></a><a href="#l233">233</a><td><tr><td><a id="l234"></a><a href="#l234">234</a><td> mixin(this.preferences_, getDefaultPreferences()[&#39;mutable&#39;]);<tr><td><a id="l235"></a><a href="#l235">235</a><td> mixin(this.preferences_, getDefaultPreferences()[&#39;frozen&#39;]);<tr><td><a id="l236"></a><a href="#l236">236</a><td><tr><td><a id="l237"></a><a href="#l237">237</a><td> /** @private {boolean} */<tr><td><a id="l238"></a><a href="#l238">238</a><td> this.nativeEventsEnabled_ = true;<tr><td><a id="l239"></a><a href="#l239">239</a><td><tr><td><a id="l240"></a><a href="#l240">240</a><td> /** @private {(string|undefined)} */<tr><td><a id="l241"></a><a href="#l241">241</a><td> this.template_ = opt_dir;<tr><td><a id="l242"></a><a href="#l242">242</a><td><tr><td><a id="l243"></a><a href="#l243">243</a><td> /** @private {number} */<tr><td><a id="l244"></a><a href="#l244">244</a><td> this.port_ = 0;<tr><td><a id="l245"></a><a href="#l245">245</a><td><tr><td><a id="l246"></a><a href="#l246">246</a><td> /** @private {!Array.&lt;string&gt;} */<tr><td><a id="l247"></a><a href="#l247">247</a><td> this.extensions_ = [];<tr><td><a id="l248"></a><a href="#l248">248</a><td>};<tr><td><a id="l249"></a><a href="#l249">249</a><td>util.inherits(Profile, Serializable);<tr><td><a id="l250"></a><a href="#l250">250</a><td><tr><td><a id="l251"></a><a href="#l251">251</a><td><tr><td><a id="l252"></a><a href="#l252">252</a><td>/**<tr><td><a id="l253"></a><a href="#l253">253</a><td> * Registers an extension to be included with this profile.<tr><td><a id="l254"></a><a href="#l254">254</a><td> * @param {string} extension Path to the extension to include, as either an<tr><td><a id="l255"></a><a href="#l255">255</a><td> * unpacked extension directory or the path to a xpi file.<tr><td><a id="l256"></a><a href="#l256">256</a><td> */<tr><td><a id="l257"></a><a href="#l257">257</a><td>Profile.prototype.addExtension = function(extension) {<tr><td><a id="l258"></a><a href="#l258">258</a><td> this.extensions_.push(extension);<tr><td><a id="l259"></a><a href="#l259">259</a><td>};<tr><td><a id="l260"></a><a href="#l260">260</a><td><tr><td><a id="l261"></a><a href="#l261">261</a><td><tr><td><a id="l262"></a><a href="#l262">262</a><td>/**<tr><td><a id="l263"></a><a href="#l263">263</a><td> * Sets a desired preference for this profile.<tr><td><a id="l264"></a><a href="#l264">264</a><td> * @param {string} key The preference key.<tr><td><a id="l265"></a><a href="#l265">265</a><td> * @param {(string|number|boolean)} value The preference value.<tr><td><a id="l266"></a><a href="#l266">266</a><td> * @throws {Error} If attempting to set a frozen preference.<tr><td><a id="l267"></a><a href="#l267">267</a><td> */<tr><td><a id="l268"></a><a href="#l268">268</a><td>Profile.prototype.setPreference = function(key, value) {<tr><td><a id="l269"></a><a href="#l269">269</a><td> var frozen = getDefaultPreferences()[&#39;frozen&#39;];<tr><td><a id="l270"></a><a href="#l270">270</a><td> if (frozen.hasOwnProperty(key) &amp;&amp; frozen[key] !== value) {<tr><td><a id="l271"></a><a href="#l271">271</a><td> throw Error(&#39;You may not set &#39; + key + &#39;=&#39; + JSON.stringify(value)<tr><td><a id="l272"></a><a href="#l272">272</a><td> + &#39;; value is frozen for proper WebDriver functionality (&#39;<tr><td><a id="l273"></a><a href="#l273">273</a><td> + key + &#39;=&#39; + JSON.stringify(frozen[key]) + &#39;)&#39;);<tr><td><a id="l274"></a><a href="#l274">274</a><td> }<tr><td><a id="l275"></a><a href="#l275">275</a><td> this.preferences_[key] = value;<tr><td><a id="l276"></a><a href="#l276">276</a><td>};<tr><td><a id="l277"></a><a href="#l277">277</a><td><tr><td><a id="l278"></a><a href="#l278">278</a><td><tr><td><a id="l279"></a><a href="#l279">279</a><td>/**<tr><td><a id="l280"></a><a href="#l280">280</a><td> * Returns the currently configured value of a profile preference. This does<tr><td><a id="l281"></a><a href="#l281">281</a><td> * not include any defaults defined in the profile&#39;s template directory user.js<tr><td><a id="l282"></a><a href="#l282">282</a><td> * file (if a template were specified on construction).<tr><td><a id="l283"></a><a href="#l283">283</a><td> * @param {string} key The desired preference.<tr><td><a id="l284"></a><a href="#l284">284</a><td> * @return {(string|number|boolean|undefined)} The current value of the<tr><td><a id="l285"></a><a href="#l285">285</a><td> * requested preference.<tr><td><a id="l286"></a><a href="#l286">286</a><td> */<tr><td><a id="l287"></a><a href="#l287">287</a><td>Profile.prototype.getPreference = function(key) {<tr><td><a id="l288"></a><a href="#l288">288</a><td> return this.preferences_[key];<tr><td><a id="l289"></a><a href="#l289">289</a><td>};<tr><td><a id="l290"></a><a href="#l290">290</a><td><tr><td><a id="l291"></a><a href="#l291">291</a><td><tr><td><a id="l292"></a><a href="#l292">292</a><td>/**<tr><td><a id="l293"></a><a href="#l293">293</a><td> * @return {number} The port this profile is currently configured to use, or<tr><td><a id="l294"></a><a href="#l294">294</a><td> * 0 if the port will be selected at random when the profile is written<tr><td><a id="l295"></a><a href="#l295">295</a><td> * to disk.<tr><td><a id="l296"></a><a href="#l296">296</a><td> */<tr><td><a id="l297"></a><a href="#l297">297</a><td>Profile.prototype.getPort = function() {<tr><td><a id="l298"></a><a href="#l298">298</a><td> return this.port_;<tr><td><a id="l299"></a><a href="#l299">299</a><td>};<tr><td><a id="l300"></a><a href="#l300">300</a><td><tr><td><a id="l301"></a><a href="#l301">301</a><td><tr><td><a id="l302"></a><a href="#l302">302</a><td>/**<tr><td><a id="l303"></a><a href="#l303">303</a><td> * Sets the port to use for the WebDriver extension loaded by this profile.<tr><td><a id="l304"></a><a href="#l304">304</a><td> * @param {number} port The desired port, or 0 to use any free port.<tr><td><a id="l305"></a><a href="#l305">305</a><td> */<tr><td><a id="l306"></a><a href="#l306">306</a><td>Profile.prototype.setPort = function(port) {<tr><td><a id="l307"></a><a href="#l307">307</a><td> this.port_ = port;<tr><td><a id="l308"></a><a href="#l308">308</a><td>};<tr><td><a id="l309"></a><a href="#l309">309</a><td><tr><td><a id="l310"></a><a href="#l310">310</a><td><tr><td><a id="l311"></a><a href="#l311">311</a><td>/**<tr><td><a id="l312"></a><a href="#l312">312</a><td> * @return {boolean} Whether the FirefoxDriver is configured to automatically<tr><td><a id="l313"></a><a href="#l313">313</a><td> * accept untrusted SSL certificates.<tr><td><a id="l314"></a><a href="#l314">314</a><td> */<tr><td><a id="l315"></a><a href="#l315">315</a><td>Profile.prototype.acceptUntrustedCerts = function() {<tr><td><a id="l316"></a><a href="#l316">316</a><td> return !!this.preferences_[&#39;webdriver_accept_untrusted_certs&#39;];<tr><td><a id="l317"></a><a href="#l317">317</a><td>};<tr><td><a id="l318"></a><a href="#l318">318</a><td><tr><td><a id="l319"></a><a href="#l319">319</a><td><tr><td><a id="l320"></a><a href="#l320">320</a><td>/**<tr><td><a id="l321"></a><a href="#l321">321</a><td> * Sets whether the FirefoxDriver should automatically accept untrusted SSL<tr><td><a id="l322"></a><a href="#l322">322</a><td> * certificates.<tr><td><a id="l323"></a><a href="#l323">323</a><td> * @param {boolean} value .<tr><td><a id="l324"></a><a href="#l324">324</a><td> */<tr><td><a id="l325"></a><a href="#l325">325</a><td>Profile.prototype.setAcceptUntrustedCerts = function(value) {<tr><td><a id="l326"></a><a href="#l326">326</a><td> this.preferences_[&#39;webdriver_accept_untrusted_certs&#39;] = !!value;<tr><td><a id="l327"></a><a href="#l327">327</a><td>};<tr><td><a id="l328"></a><a href="#l328">328</a><td><tr><td><a id="l329"></a><a href="#l329">329</a><td><tr><td><a id="l330"></a><a href="#l330">330</a><td>/**<tr><td><a id="l331"></a><a href="#l331">331</a><td> * Sets whether to assume untrusted certificates come from untrusted issuers.<tr><td><a id="l332"></a><a href="#l332">332</a><td> * @param {boolean} value .<tr><td><a id="l333"></a><a href="#l333">333</a><td> */<tr><td><a id="l334"></a><a href="#l334">334</a><td>Profile.prototype.setAssumeUntrustedCertIssuer = function(value) {<tr><td><a id="l335"></a><a href="#l335">335</a><td> this.preferences_[&#39;webdriver_assume_untrusted_issuer&#39;] = !!value;<tr><td><a id="l336"></a><a href="#l336">336</a><td>};<tr><td><a id="l337"></a><a href="#l337">337</a><td><tr><td><a id="l338"></a><a href="#l338">338</a><td><tr><td><a id="l339"></a><a href="#l339">339</a><td>/**<tr><td><a id="l340"></a><a href="#l340">340</a><td> * @return {boolean} Whether to assume untrusted certs come from untrusted<tr><td><a id="l341"></a><a href="#l341">341</a><td> * issuers.<tr><td><a id="l342"></a><a href="#l342">342</a><td> */<tr><td><a id="l343"></a><a href="#l343">343</a><td>Profile.prototype.assumeUntrustedCertIssuer = function() {<tr><td><a id="l344"></a><a href="#l344">344</a><td> return !!this.preferences_[&#39;webdriver_assume_untrusted_issuer&#39;];<tr><td><a id="l345"></a><a href="#l345">345</a><td>};<tr><td><a id="l346"></a><a href="#l346">346</a><td><tr><td><a id="l347"></a><a href="#l347">347</a><td><tr><td><a id="l348"></a><a href="#l348">348</a><td>/**<tr><td><a id="l349"></a><a href="#l349">349</a><td> * Sets whether to use native events with this profile.<tr><td><a id="l350"></a><a href="#l350">350</a><td> * @param {boolean} enabled .<tr><td><a id="l351"></a><a href="#l351">351</a><td> */<tr><td><a id="l352"></a><a href="#l352">352</a><td>Profile.prototype.setNativeEventsEnabled = function(enabled) {<tr><td><a id="l353"></a><a href="#l353">353</a><td> this.nativeEventsEnabled_ = enabled;<tr><td><a id="l354"></a><a href="#l354">354</a><td>};<tr><td><a id="l355"></a><a href="#l355">355</a><td><tr><td><a id="l356"></a><a href="#l356">356</a><td><tr><td><a id="l357"></a><a href="#l357">357</a><td>/**<tr><td><a id="l358"></a><a href="#l358">358</a><td> * Returns whether native events are enabled in this profile.<tr><td><a id="l359"></a><a href="#l359">359</a><td> * @return {boolean} .<tr><td><a id="l360"></a><a href="#l360">360</a><td> */<tr><td><a id="l361"></a><a href="#l361">361</a><td>Profile.prototype.nativeEventsEnabled = function() {<tr><td><a id="l362"></a><a href="#l362">362</a><td> return this.nativeEventsEnabled_;<tr><td><a id="l363"></a><a href="#l363">363</a><td>};<tr><td><a id="l364"></a><a href="#l364">364</a><td><tr><td><a id="l365"></a><a href="#l365">365</a><td><tr><td><a id="l366"></a><a href="#l366">366</a><td>/**<tr><td><a id="l367"></a><a href="#l367">367</a><td> * Writes this profile to disk.<tr><td><a id="l368"></a><a href="#l368">368</a><td> * @param {boolean=} opt_excludeWebDriverExt Whether to exclude the WebDriver<tr><td><a id="l369"></a><a href="#l369">369</a><td> * extension from the generated profile. Used to reduce the size of an<tr><td><a id="l370"></a><a href="#l370">370</a><td> * {@link #encode() encoded profile} since the server will always install<tr><td><a id="l371"></a><a href="#l371">371</a><td> * the extension itself.<tr><td><a id="l372"></a><a href="#l372">372</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the path to the new<tr><td><a id="l373"></a><a href="#l373">373</a><td> * profile directory.<tr><td><a id="l374"></a><a href="#l374">374</a><td> */<tr><td><a id="l375"></a><a href="#l375">375</a><td>Profile.prototype.writeToDisk = function(opt_excludeWebDriverExt) {<tr><td><a id="l376"></a><a href="#l376">376</a><td> var profileDir = io.tmpDir();<tr><td><a id="l377"></a><a href="#l377">377</a><td> if (this.template_) {<tr><td><a id="l378"></a><a href="#l378">378</a><td> profileDir = profileDir.then(function(dir) {<tr><td><a id="l379"></a><a href="#l379">379</a><td> return io.copyDir(<tr><td><a id="l380"></a><a href="#l380">380</a><td> this.template_, dir, /(parent\.lock|lock|\.parentlock)/);<tr><td><a id="l381"></a><a href="#l381">381</a><td> }.bind(this));<tr><td><a id="l382"></a><a href="#l382">382</a><td> }<tr><td><a id="l383"></a><a href="#l383">383</a><td><tr><td><a id="l384"></a><a href="#l384">384</a><td> // Freeze preferences for async operations.<tr><td><a id="l385"></a><a href="#l385">385</a><td> var prefs = {};<tr><td><a id="l386"></a><a href="#l386">386</a><td> mixin(prefs, this.preferences_);<tr><td><a id="l387"></a><a href="#l387">387</a><td><tr><td><a id="l388"></a><a href="#l388">388</a><td> // Freeze extensions for async operations.<tr><td><a id="l389"></a><a href="#l389">389</a><td> var extensions = this.extensions_.concat();<tr><td><a id="l390"></a><a href="#l390">390</a><td><tr><td><a id="l391"></a><a href="#l391">391</a><td> return profileDir.then(function(dir) {<tr><td><a id="l392"></a><a href="#l392">392</a><td> return writeUserPrefs(prefs, dir);<tr><td><a id="l393"></a><a href="#l393">393</a><td> }).then(function(dir) {<tr><td><a id="l394"></a><a href="#l394">394</a><td> return installExtensions(extensions, dir, !!opt_excludeWebDriverExt);<tr><td><a id="l395"></a><a href="#l395">395</a><td> });<tr><td><a id="l396"></a><a href="#l396">396</a><td>};<tr><td><a id="l397"></a><a href="#l397">397</a><td><tr><td><a id="l398"></a><a href="#l398">398</a><td><tr><td><a id="l399"></a><a href="#l399">399</a><td>/**<tr><td><a id="l400"></a><a href="#l400">400</a><td> * Encodes this profile as a zipped, base64 encoded directory.<tr><td><a id="l401"></a><a href="#l401">401</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the encoded profile.<tr><td><a id="l402"></a><a href="#l402">402</a><td> */<tr><td><a id="l403"></a><a href="#l403">403</a><td>Profile.prototype.encode = function() {<tr><td><a id="l404"></a><a href="#l404">404</a><td> return this.writeToDisk(true).then(function(dir) {<tr><td><a id="l405"></a><a href="#l405">405</a><td> var zip = new AdmZip();<tr><td><a id="l406"></a><a href="#l406">406</a><td> zip.addLocalFolder(dir, &#39;&#39;);<tr><td><a id="l407"></a><a href="#l407">407</a><td> zip.getEntries()[0].header.method = AdmConstants.STORED;<tr><td><a id="l408"></a><a href="#l408">408</a><td> return io.tmpFile().then(function(file) {<tr><td><a id="l409"></a><a href="#l409">409</a><td> zip.writeZip(file); // Sync! Why oh why :-(<tr><td><a id="l410"></a><a href="#l410">410</a><td> return promise.checkedNodeCall(fs.readFile, file);<tr><td><a id="l411"></a><a href="#l411">411</a><td> });<tr><td><a id="l412"></a><a href="#l412">412</a><td> }).then(function(data) {<tr><td><a id="l413"></a><a href="#l413">413</a><td> return new Buffer(data).toString(&#39;base64&#39;);<tr><td><a id="l414"></a><a href="#l414">414</a><td> });<tr><td><a id="l415"></a><a href="#l415">415</a><td>};<tr><td><a id="l416"></a><a href="#l416">416</a><td><tr><td><a id="l417"></a><a href="#l417">417</a><td><tr><td><a id="l418"></a><a href="#l418">418</a><td>/**<tr><td><a id="l419"></a><a href="#l419">419</a><td> * Encodes this profile as a zipped, base64 encoded directory.<tr><td><a id="l420"></a><a href="#l420">420</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise for the encoded profile.<tr><td><a id="l421"></a><a href="#l421">421</a><td> * @override<tr><td><a id="l422"></a><a href="#l422">422</a><td> */<tr><td><a id="l423"></a><a href="#l423">423</a><td>Profile.prototype.serialize = function() {<tr><td><a id="l424"></a><a href="#l424">424</a><td> return this.encode();<tr><td><a id="l425"></a><a href="#l425">425</a><td>};<tr><td><a id="l426"></a><a href="#l426">426</a><td><tr><td><a id="l427"></a><a href="#l427">427</a><td><tr><td><a id="l428"></a><a href="#l428">428</a><td>// PUBLIC API<tr><td><a id="l429"></a><a href="#l429">429</a><td><tr><td><a id="l430"></a><a href="#l430">430</a><td><tr><td><a id="l431"></a><a href="#l431">431</a><td>exports.Profile = Profile;<tr><td><a id="l432"></a><a href="#l432">432</a><td>exports.decode = decode;<tr><td><a id="l433"></a><a href="#l433">433</a><td>exports.loadUserPrefs = loadUserPrefs;</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>http/index.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Defines the {@code webdriver.http.Client} for use with<tr><td><a id="l20"></a><a href="#l20">20</a><td> * NodeJS.<tr><td><a id="l21"></a><a href="#l21">21</a><td> */<tr><td><a id="l22"></a><a href="#l22">22</a><td><tr><td><a id="l23"></a><a href="#l23">23</a><td>var http = require(&#39;http&#39;),<tr><td><a id="l24"></a><a href="#l24">24</a><td> url = require(&#39;url&#39;);<tr><td><a id="l25"></a><a href="#l25">25</a><td><tr><td><a id="l26"></a><a href="#l26">26</a><td>var base = require(&#39;../_base&#39;),<tr><td><a id="l27"></a><a href="#l27">27</a><td> HttpResponse = base.require(&#39;webdriver.http.Response&#39;);<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td>/**<tr><td><a id="l31"></a><a href="#l31">31</a><td> * A {@link webdriver.http.Client} implementation using Node&#39;s built-in http<tr><td><a id="l32"></a><a href="#l32">32</a><td> * module.<tr><td><a id="l33"></a><a href="#l33">33</a><td> * @param {string} serverUrl URL for the WebDriver server to send commands to.<tr><td><a id="l34"></a><a href="#l34">34</a><td> * @param {http.Agent=} opt_agent The agent to use for each request.<tr><td><a id="l35"></a><a href="#l35">35</a><td> * Defaults to {@code http.globalAgent}.<tr><td><a id="l36"></a><a href="#l36">36</a><td> * @param {string=} opt_proxy The proxy to use for the connection to the server.<tr><td><a id="l37"></a><a href="#l37">37</a><td> * Default is to use no proxy.<tr><td><a id="l38"></a><a href="#l38">38</a><td> * @constructor<tr><td><a id="l39"></a><a href="#l39">39</a><td> * @implements {webdriver.http.Client}<tr><td><a id="l40"></a><a href="#l40">40</a><td> */<tr><td><a id="l41"></a><a href="#l41">41</a><td>var HttpClient = function(serverUrl, opt_agent, opt_proxy) {<tr><td><a id="l42"></a><a href="#l42">42</a><td> var parsedUrl = url.parse(serverUrl);<tr><td><a id="l43"></a><a href="#l43">43</a><td> if (!parsedUrl.hostname) {<tr><td><a id="l44"></a><a href="#l44">44</a><td> throw new Error(&#39;Invalid server URL: &#39; + serverUrl);<tr><td><a id="l45"></a><a href="#l45">45</a><td> }<tr><td><a id="l46"></a><a href="#l46">46</a><td><tr><td><a id="l47"></a><a href="#l47">47</a><td> /** @private {http.Agent} */<tr><td><a id="l48"></a><a href="#l48">48</a><td> this.agent_ = opt_agent;<tr><td><a id="l49"></a><a href="#l49">49</a><td><tr><td><a id="l50"></a><a href="#l50">50</a><td> /** @private {string} */<tr><td><a id="l51"></a><a href="#l51">51</a><td> this.proxy_ = opt_proxy;<tr><td><a id="l52"></a><a href="#l52">52</a><td><tr><td><a id="l53"></a><a href="#l53">53</a><td> /**<tr><td><a id="l54"></a><a href="#l54">54</a><td> * Base options for each request.<tr><td><a id="l55"></a><a href="#l55">55</a><td> * @private {!Object}<tr><td><a id="l56"></a><a href="#l56">56</a><td> */<tr><td><a id="l57"></a><a href="#l57">57</a><td> this.options_ = {<tr><td><a id="l58"></a><a href="#l58">58</a><td> auth: parsedUrl.auth,<tr><td><a id="l59"></a><a href="#l59">59</a><td> host: parsedUrl.hostname,<tr><td><a id="l60"></a><a href="#l60">60</a><td> path: parsedUrl.pathname,<tr><td><a id="l61"></a><a href="#l61">61</a><td> port: parsedUrl.port<tr><td><a id="l62"></a><a href="#l62">62</a><td> };<tr><td><a id="l63"></a><a href="#l63">63</a><td>};<tr><td><a id="l64"></a><a href="#l64">64</a><td><tr><td><a id="l65"></a><a href="#l65">65</a><td><tr><td><a id="l66"></a><a href="#l66">66</a><td>/** @override */<tr><td><a id="l67"></a><a href="#l67">67</a><td>HttpClient.prototype.send = function(httpRequest, callback) {<tr><td><a id="l68"></a><a href="#l68">68</a><td> var data;<tr><td><a id="l69"></a><a href="#l69">69</a><td> httpRequest.headers[&#39;Content-Length&#39;] = 0;<tr><td><a id="l70"></a><a href="#l70">70</a><td> if (httpRequest.method == &#39;POST&#39; || httpRequest.method == &#39;PUT&#39;) {<tr><td><a id="l71"></a><a href="#l71">71</a><td> data = JSON.stringify(httpRequest.data);<tr><td><a id="l72"></a><a href="#l72">72</a><td> httpRequest.headers[&#39;Content-Length&#39;] = Buffer.byteLength(data, &#39;utf8&#39;);<tr><td><a id="l73"></a><a href="#l73">73</a><td> httpRequest.headers[&#39;Content-Type&#39;] = &#39;application/json;charset=UTF-8&#39;;<tr><td><a id="l74"></a><a href="#l74">74</a><td> }<tr><td><a id="l75"></a><a href="#l75">75</a><td><tr><td><a id="l76"></a><a href="#l76">76</a><td> var path = this.options_.path;<tr><td><a id="l77"></a><a href="#l77">77</a><td> if (path[path.length - 1] === &#39;/&#39; &amp;&amp; httpRequest.path[0] === &#39;/&#39;) {<tr><td><a id="l78"></a><a href="#l78">78</a><td> path += httpRequest.path.substring(1);<tr><td><a id="l79"></a><a href="#l79">79</a><td> } else {<tr><td><a id="l80"></a><a href="#l80">80</a><td> path += httpRequest.path;<tr><td><a id="l81"></a><a href="#l81">81</a><td> }<tr><td><a id="l82"></a><a href="#l82">82</a><td><tr><td><a id="l83"></a><a href="#l83">83</a><td> var options = {<tr><td><a id="l84"></a><a href="#l84">84</a><td> method: httpRequest.method,<tr><td><a id="l85"></a><a href="#l85">85</a><td> auth: this.options_.auth,<tr><td><a id="l86"></a><a href="#l86">86</a><td> host: this.options_.host,<tr><td><a id="l87"></a><a href="#l87">87</a><td> port: this.options_.port,<tr><td><a id="l88"></a><a href="#l88">88</a><td> path: path,<tr><td><a id="l89"></a><a href="#l89">89</a><td> headers: httpRequest.headers<tr><td><a id="l90"></a><a href="#l90">90</a><td> };<tr><td><a id="l91"></a><a href="#l91">91</a><td><tr><td><a id="l92"></a><a href="#l92">92</a><td> if (this.agent_) {<tr><td><a id="l93"></a><a href="#l93">93</a><td> options.agent = this.agent_;<tr><td><a id="l94"></a><a href="#l94">94</a><td> }<tr><td><a id="l95"></a><a href="#l95">95</a><td><tr><td><a id="l96"></a><a href="#l96">96</a><td> sendRequest(options, callback, data, this.proxy_);<tr><td><a id="l97"></a><a href="#l97">97</a><td>};<tr><td><a id="l98"></a><a href="#l98">98</a><td><tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td>/**<tr><td><a id="l101"></a><a href="#l101">101</a><td> * Sends a single HTTP request.<tr><td><a id="l102"></a><a href="#l102">102</a><td> * @param {!Object} options The request options.<tr><td><a id="l103"></a><a href="#l103">103</a><td> * @param {function(Error, !webdriver.http.Response=)} callback The function to<tr><td><a id="l104"></a><a href="#l104">104</a><td> * invoke with the server&#39;s response.<tr><td><a id="l105"></a><a href="#l105">105</a><td> * @param {string=} opt_data The data to send with the request.<tr><td><a id="l106"></a><a href="#l106">106</a><td> * @param {string=} opt_proxy The proxy server to use for the request.<tr><td><a id="l107"></a><a href="#l107">107</a><td> */<tr><td><a id="l108"></a><a href="#l108">108</a><td>var sendRequest = function(options, callback, opt_data, opt_proxy) {<tr><td><a id="l109"></a><a href="#l109">109</a><td> var host = options.host;<tr><td><a id="l110"></a><a href="#l110">110</a><td> var port = options.port;<tr><td><a id="l111"></a><a href="#l111">111</a><td><tr><td><a id="l112"></a><a href="#l112">112</a><td> if (opt_proxy) {<tr><td><a id="l113"></a><a href="#l113">113</a><td> var proxy = url.parse(opt_proxy);<tr><td><a id="l114"></a><a href="#l114">114</a><td><tr><td><a id="l115"></a><a href="#l115">115</a><td> options.headers[&#39;Host&#39;] = options.host;<tr><td><a id="l116"></a><a href="#l116">116</a><td> options.host = proxy.hostname;<tr><td><a id="l117"></a><a href="#l117">117</a><td> options.port = proxy.port;<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td> if (proxy.auth) {<tr><td><a id="l120"></a><a href="#l120">120</a><td> options.headers[&#39;Proxy-Authorization&#39;] =<tr><td><a id="l121"></a><a href="#l121">121</a><td> &#39;Basic &#39; + new Buffer(proxy.auth).toString(&#39;base64&#39;);<tr><td><a id="l122"></a><a href="#l122">122</a><td> }<tr><td><a id="l123"></a><a href="#l123">123</a><td> }<tr><td><a id="l124"></a><a href="#l124">124</a><td><tr><td><a id="l125"></a><a href="#l125">125</a><td> var request = http.request(options, function(response) {<tr><td><a id="l126"></a><a href="#l126">126</a><td> if (response.statusCode == 302 || response.statusCode == 303) {<tr><td><a id="l127"></a><a href="#l127">127</a><td> try {<tr><td><a id="l128"></a><a href="#l128">128</a><td> var location = url.parse(response.headers[&#39;location&#39;]);<tr><td><a id="l129"></a><a href="#l129">129</a><td> } catch (ex) {<tr><td><a id="l130"></a><a href="#l130">130</a><td> callback(Error(<tr><td><a id="l131"></a><a href="#l131">131</a><td> &#39;Failed to parse &quot;Location&quot; header for server redirect: &#39; +<tr><td><a id="l132"></a><a href="#l132">132</a><td> ex.message + &#39;\nResponse was: \n&#39; +<tr><td><a id="l133"></a><a href="#l133">133</a><td> new HttpResponse(response.statusCode, response.headers, &#39;&#39;)));<tr><td><a id="l134"></a><a href="#l134">134</a><td> return;<tr><td><a id="l135"></a><a href="#l135">135</a><td> }<tr><td><a id="l136"></a><a href="#l136">136</a><td><tr><td><a id="l137"></a><a href="#l137">137</a><td> if (!location.hostname) {<tr><td><a id="l138"></a><a href="#l138">138</a><td> location.hostname = host;<tr><td><a id="l139"></a><a href="#l139">139</a><td> location.port = port;<tr><td><a id="l140"></a><a href="#l140">140</a><td> }<tr><td><a id="l141"></a><a href="#l141">141</a><td><tr><td><a id="l142"></a><a href="#l142">142</a><td> request.abort();<tr><td><a id="l143"></a><a href="#l143">143</a><td> sendRequest({<tr><td><a id="l144"></a><a href="#l144">144</a><td> method: &#39;GET&#39;,<tr><td><a id="l145"></a><a href="#l145">145</a><td> host: location.hostname,<tr><td><a id="l146"></a><a href="#l146">146</a><td> path: location.pathname + (location.search || &#39;&#39;),<tr><td><a id="l147"></a><a href="#l147">147</a><td> port: location.port,<tr><td><a id="l148"></a><a href="#l148">148</a><td> headers: {<tr><td><a id="l149"></a><a href="#l149">149</a><td> &#39;Accept&#39;: &#39;application/json; charset=utf-8&#39;<tr><td><a id="l150"></a><a href="#l150">150</a><td> }<tr><td><a id="l151"></a><a href="#l151">151</a><td> }, callback, undefined, opt_proxy);<tr><td><a id="l152"></a><a href="#l152">152</a><td> return;<tr><td><a id="l153"></a><a href="#l153">153</a><td> }<tr><td><a id="l154"></a><a href="#l154">154</a><td><tr><td><a id="l155"></a><a href="#l155">155</a><td> var body = [];<tr><td><a id="l156"></a><a href="#l156">156</a><td> response.on(&#39;data&#39;, body.push.bind(body));<tr><td><a id="l157"></a><a href="#l157">157</a><td> response.on(&#39;end&#39;, function() {<tr><td><a id="l158"></a><a href="#l158">158</a><td> var resp = new HttpResponse(response.statusCode,<tr><td><a id="l159"></a><a href="#l159">159</a><td> response.headers, body.join(&#39;&#39;).replace(/\0/g, &#39;&#39;));<tr><td><a id="l160"></a><a href="#l160">160</a><td> callback(null, resp);<tr><td><a id="l161"></a><a href="#l161">161</a><td> });<tr><td><a id="l162"></a><a href="#l162">162</a><td> });<tr><td><a id="l163"></a><a href="#l163">163</a><td><tr><td><a id="l164"></a><a href="#l164">164</a><td> request.on(&#39;error&#39;, function(e) {<tr><td><a id="l165"></a><a href="#l165">165</a><td> if (e.code === &#39;ECONNRESET&#39;) {<tr><td><a id="l166"></a><a href="#l166">166</a><td> setTimeout(function() {<tr><td><a id="l167"></a><a href="#l167">167</a><td> sendRequest(options, callback, opt_data, opt_proxy);<tr><td><a id="l168"></a><a href="#l168">168</a><td> }, 15);<tr><td><a id="l169"></a><a href="#l169">169</a><td> } else {<tr><td><a id="l170"></a><a href="#l170">170</a><td> var message = e.message;<tr><td><a id="l171"></a><a href="#l171">171</a><td> if (e.code) {<tr><td><a id="l172"></a><a href="#l172">172</a><td> message = e.code + &#39; &#39; + message;<tr><td><a id="l173"></a><a href="#l173">173</a><td> }<tr><td><a id="l174"></a><a href="#l174">174</a><td> callback(new Error(message));<tr><td><a id="l175"></a><a href="#l175">175</a><td> }<tr><td><a id="l176"></a><a href="#l176">176</a><td> });<tr><td><a id="l177"></a><a href="#l177">177</a><td><tr><td><a id="l178"></a><a href="#l178">178</a><td> if (opt_data) {<tr><td><a id="l179"></a><a href="#l179">179</a><td> request.write(opt_data);<tr><td><a id="l180"></a><a href="#l180">180</a><td> }<tr><td><a id="l181"></a><a href="#l181">181</a><td><tr><td><a id="l182"></a><a href="#l182">182</a><td> request.end();<tr><td><a id="l183"></a><a href="#l183">183</a><td>};<tr><td><a id="l184"></a><a href="#l184">184</a><td><tr><td><a id="l185"></a><a href="#l185">185</a><td><tr><td><a id="l186"></a><a href="#l186">186</a><td>// PUBLIC API<tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td>/** @type {webdriver.http.Executor.} */<tr><td><a id="l189"></a><a href="#l189">189</a><td>exports.Executor = base.require(&#39;webdriver.http.Executor&#39;);<tr><td><a id="l190"></a><a href="#l190">190</a><td><tr><td><a id="l191"></a><a href="#l191">191</a><td>/** @type {webdriver.http.Request.} */<tr><td><a id="l192"></a><a href="#l192">192</a><td>exports.Request = base.require(&#39;webdriver.http.Request&#39;);<tr><td><a id="l193"></a><a href="#l193">193</a><td><tr><td><a id="l194"></a><a href="#l194">194</a><td>/** @type {webdriver.http.Response.} */<tr><td><a id="l195"></a><a href="#l195">195</a><td>exports.Response = base.require(&#39;webdriver.http.Response&#39;);<tr><td><a id="l196"></a><a href="#l196">196</a><td><tr><td><a id="l197"></a><a href="#l197">197</a><td>exports.HttpClient = HttpClient;</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>util.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>http/util.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Various HTTP utilities.<tr><td><a id="l20"></a><a href="#l20">20</a><td> */<tr><td><a id="l21"></a><a href="#l21">21</a><td><tr><td><a id="l22"></a><a href="#l22">22</a><td>var base = require(&#39;../_base&#39;),<tr><td><a id="l23"></a><a href="#l23">23</a><td> HttpClient = require(&#39;./index&#39;).HttpClient,<tr><td><a id="l24"></a><a href="#l24">24</a><td> checkResponse = base.require(&#39;bot.response&#39;).checkResponse,<tr><td><a id="l25"></a><a href="#l25">25</a><td> Executor = base.require(&#39;webdriver.http.Executor&#39;),<tr><td><a id="l26"></a><a href="#l26">26</a><td> HttpRequest = base.require(&#39;webdriver.http.Request&#39;),<tr><td><a id="l27"></a><a href="#l27">27</a><td> Command = base.require(&#39;webdriver.Command&#39;),<tr><td><a id="l28"></a><a href="#l28">28</a><td> CommandName = base.require(&#39;webdriver.CommandName&#39;),<tr><td><a id="l29"></a><a href="#l29">29</a><td> promise = base.require(&#39;webdriver.promise&#39;);<tr><td><a id="l30"></a><a href="#l30">30</a><td><tr><td><a id="l31"></a><a href="#l31">31</a><td><tr><td><a id="l32"></a><a href="#l32">32</a><td><tr><td><a id="l33"></a><a href="#l33">33</a><td>/**<tr><td><a id="l34"></a><a href="#l34">34</a><td> * Queries a WebDriver server for its current status.<tr><td><a id="l35"></a><a href="#l35">35</a><td> * @param {string} url Base URL of the server to query.<tr><td><a id="l36"></a><a href="#l36">36</a><td> * @param {function(Error, *=)} callback The function to call with the<tr><td><a id="l37"></a><a href="#l37">37</a><td> * response.<tr><td><a id="l38"></a><a href="#l38">38</a><td> */<tr><td><a id="l39"></a><a href="#l39">39</a><td>function getStatus(url, callback) {<tr><td><a id="l40"></a><a href="#l40">40</a><td> var client = new HttpClient(url);<tr><td><a id="l41"></a><a href="#l41">41</a><td> var executor = new Executor(client);<tr><td><a id="l42"></a><a href="#l42">42</a><td> var command = new Command(CommandName.GET_SERVER_STATUS);<tr><td><a id="l43"></a><a href="#l43">43</a><td> executor.execute(command, function(err, responseObj) {<tr><td><a id="l44"></a><a href="#l44">44</a><td> if (err) return callback(err);<tr><td><a id="l45"></a><a href="#l45">45</a><td> try {<tr><td><a id="l46"></a><a href="#l46">46</a><td> checkResponse(responseObj);<tr><td><a id="l47"></a><a href="#l47">47</a><td> } catch (ex) {<tr><td><a id="l48"></a><a href="#l48">48</a><td> return callback(ex);<tr><td><a id="l49"></a><a href="#l49">49</a><td> }<tr><td><a id="l50"></a><a href="#l50">50</a><td> callback(null, responseObj[&#39;value&#39;]);<tr><td><a id="l51"></a><a href="#l51">51</a><td> });<tr><td><a id="l52"></a><a href="#l52">52</a><td>}<tr><td><a id="l53"></a><a href="#l53">53</a><td><tr><td><a id="l54"></a><a href="#l54">54</a><td><tr><td><a id="l55"></a><a href="#l55">55</a><td>// PUBLIC API<tr><td><a id="l56"></a><a href="#l56">56</a><td><tr><td><a id="l57"></a><a href="#l57">57</a><td><tr><td><a id="l58"></a><a href="#l58">58</a><td>/**<tr><td><a id="l59"></a><a href="#l59">59</a><td> * Queries a WebDriver server for its current status.<tr><td><a id="l60"></a><a href="#l60">60</a><td> * @param {string} url Base URL of the server to query.<tr><td><a id="l61"></a><a href="#l61">61</a><td> * @return {!webdriver.promise.Promise.&lt;!Object&gt;} A promise that resolves with<tr><td><a id="l62"></a><a href="#l62">62</a><td> * a hash of the server status.<tr><td><a id="l63"></a><a href="#l63">63</a><td> */<tr><td><a id="l64"></a><a href="#l64">64</a><td>exports.getStatus = function(url) {<tr><td><a id="l65"></a><a href="#l65">65</a><td> return promise.checkedNodeCall(getStatus.bind(null, url));<tr><td><a id="l66"></a><a href="#l66">66</a><td>};<tr><td><a id="l67"></a><a href="#l67">67</a><td><tr><td><a id="l68"></a><a href="#l68">68</a><td><tr><td><a id="l69"></a><a href="#l69">69</a><td>/**<tr><td><a id="l70"></a><a href="#l70">70</a><td> * Waits for a WebDriver server to be healthy and accepting requests.<tr><td><a id="l71"></a><a href="#l71">71</a><td> * @param {string} url Base URL of the server to query.<tr><td><a id="l72"></a><a href="#l72">72</a><td> * @param {number} timeout How long to wait for the server.<tr><td><a id="l73"></a><a href="#l73">73</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a id="l74"></a><a href="#l74">74</a><td> * server is ready.<tr><td><a id="l75"></a><a href="#l75">75</a><td> */<tr><td><a id="l76"></a><a href="#l76">76</a><td>exports.waitForServer = function(url, timeout) {<tr><td><a id="l77"></a><a href="#l77">77</a><td> var ready = promise.defer(),<tr><td><a id="l78"></a><a href="#l78">78</a><td> start = Date.now(),<tr><td><a id="l79"></a><a href="#l79">79</a><td> checkServerStatus = getStatus.bind(null, url, onResponse);<tr><td><a id="l80"></a><a href="#l80">80</a><td> checkServerStatus();<tr><td><a id="l81"></a><a href="#l81">81</a><td> return ready.promise;<tr><td><a id="l82"></a><a href="#l82">82</a><td><tr><td><a id="l83"></a><a href="#l83">83</a><td> function onResponse(err) {<tr><td><a id="l84"></a><a href="#l84">84</a><td> if (!ready.isPending()) return;<tr><td><a id="l85"></a><a href="#l85">85</a><td> if (!err) return ready.fulfill();<tr><td><a id="l86"></a><a href="#l86">86</a><td><tr><td><a id="l87"></a><a href="#l87">87</a><td> if (Date.now() - start &gt; timeout) {<tr><td><a id="l88"></a><a href="#l88">88</a><td> ready.reject(<tr><td><a id="l89"></a><a href="#l89">89</a><td> Error(&#39;Timed out waiting for the WebDriver server at &#39; + url));<tr><td><a id="l90"></a><a href="#l90">90</a><td> } else {<tr><td><a id="l91"></a><a href="#l91">91</a><td> setTimeout(function() {<tr><td><a id="l92"></a><a href="#l92">92</a><td> if (ready.isPending()) {<tr><td><a id="l93"></a><a href="#l93">93</a><td> checkServerStatus();<tr><td><a id="l94"></a><a href="#l94">94</a><td> }<tr><td><a id="l95"></a><a href="#l95">95</a><td> }, 50);<tr><td><a id="l96"></a><a href="#l96">96</a><td> }<tr><td><a id="l97"></a><a href="#l97">97</a><td> }<tr><td><a id="l98"></a><a href="#l98">98</a><td>};<tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td><tr><td><a id="l101"></a><a href="#l101">101</a><td>/**<tr><td><a id="l102"></a><a href="#l102">102</a><td> * Polls a URL with GET requests until it returns a 2xx response or the<tr><td><a id="l103"></a><a href="#l103">103</a><td> * timeout expires.<tr><td><a id="l104"></a><a href="#l104">104</a><td> * @param {string} url The URL to poll.<tr><td><a id="l105"></a><a href="#l105">105</a><td> * @param {number} timeout How long to wait, in milliseconds.<tr><td><a id="l106"></a><a href="#l106">106</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a id="l107"></a><a href="#l107">107</a><td> * URL responds with 2xx.<tr><td><a id="l108"></a><a href="#l108">108</a><td> */<tr><td><a id="l109"></a><a href="#l109">109</a><td>exports.waitForUrl = function(url, timeout) {<tr><td><a id="l110"></a><a href="#l110">110</a><td> var client = new HttpClient(url),<tr><td><a id="l111"></a><a href="#l111">111</a><td> request = new HttpRequest(&#39;GET&#39;, &#39;&#39;),<tr><td><a id="l112"></a><a href="#l112">112</a><td> testUrl = client.send.bind(client, request, onResponse),<tr><td><a id="l113"></a><a href="#l113">113</a><td> ready = promise.defer(),<tr><td><a id="l114"></a><a href="#l114">114</a><td> start = Date.now();<tr><td><a id="l115"></a><a href="#l115">115</a><td> testUrl();<tr><td><a id="l116"></a><a href="#l116">116</a><td> return ready.promise;<tr><td><a id="l117"></a><a href="#l117">117</a><td><tr><td><a id="l118"></a><a href="#l118">118</a><td> function onResponse(err, response) {<tr><td><a id="l119"></a><a href="#l119">119</a><td> if (!ready.isPending()) return;<tr><td><a id="l120"></a><a href="#l120">120</a><td> if (!err &amp;&amp; response.status &gt; 199 &amp;&amp; response.status &lt; 300) {<tr><td><a id="l121"></a><a href="#l121">121</a><td> return ready.fulfill();<tr><td><a id="l122"></a><a href="#l122">122</a><td> }<tr><td><a id="l123"></a><a href="#l123">123</a><td><tr><td><a id="l124"></a><a href="#l124">124</a><td> if (Date.now() - start &gt; timeout) {<tr><td><a id="l125"></a><a href="#l125">125</a><td> ready.reject(Error(<tr><td><a id="l126"></a><a href="#l126">126</a><td> &#39;Timed out waiting for the URL to return 2xx: &#39; + url));<tr><td><a id="l127"></a><a href="#l127">127</a><td> } else {<tr><td><a id="l128"></a><a href="#l128">128</a><td> setTimeout(function() {<tr><td><a id="l129"></a><a href="#l129">129</a><td> if (ready.isPending()) {<tr><td><a id="l130"></a><a href="#l130">130</a><td> testUrl();<tr><td><a id="l131"></a><a href="#l131">131</a><td> }<tr><td><a id="l132"></a><a href="#l132">132</a><td> }, 50);<tr><td><a id="l133"></a><a href="#l133">133</a><td> }<tr><td><a id="l134"></a><a href="#l134">134</a><td> }<tr><td><a id="l135"></a><a href="#l135">135</a><td>};</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>ie.js</title><link href="../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>ie.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Defines a {@linkplain Driver WebDriver} client for Microsoft&#39;s<tr><td><a id="l20"></a><a href="#l20">20</a><td> * Internet Explorer. Before using the IEDriver, you must download the latest<tr><td><a id="l21"></a><a href="#l21">21</a><td> * [IEDriverServer](http://selenium-release.storage.googleapis.com/index.html)<tr><td><a id="l22"></a><a href="#l22">22</a><td> * and place it on your<tr><td><a id="l23"></a><a href="#l23">23</a><td> * [PATH](http://en.wikipedia.org/wiki/PATH_%28variable%29). You must also apply<tr><td><a id="l24"></a><a href="#l24">24</a><td> * the system configuration outlined on the Selenium project<tr><td><a id="l25"></a><a href="#l25">25</a><td> * [wiki](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver)<tr><td><a id="l26"></a><a href="#l26">26</a><td> */<tr><td><a id="l27"></a><a href="#l27">27</a><td><tr><td><a id="l28"></a><a href="#l28">28</a><td>&#39;use strict&#39;;<tr><td><a id="l29"></a><a href="#l29">29</a><td><tr><td><a id="l30"></a><a href="#l30">30</a><td>var fs = require(&#39;fs&#39;),<tr><td><a id="l31"></a><a href="#l31">31</a><td> util = require(&#39;util&#39;);<tr><td><a id="l32"></a><a href="#l32">32</a><td><tr><td><a id="l33"></a><a href="#l33">33</a><td>var webdriver = require(&#39;./index&#39;),<tr><td><a id="l34"></a><a href="#l34">34</a><td> executors = require(&#39;./executors&#39;),<tr><td><a id="l35"></a><a href="#l35">35</a><td> io = require(&#39;./io&#39;),<tr><td><a id="l36"></a><a href="#l36">36</a><td> portprober = require(&#39;./net/portprober&#39;),<tr><td><a id="l37"></a><a href="#l37">37</a><td> remote = require(&#39;./remote&#39;);<tr><td><a id="l38"></a><a href="#l38">38</a><td><tr><td><a id="l39"></a><a href="#l39">39</a><td><tr><td><a id="l40"></a><a href="#l40">40</a><td>/**<tr><td><a id="l41"></a><a href="#l41">41</a><td> * @const<tr><td><a id="l42"></a><a href="#l42">42</a><td> * @final<tr><td><a id="l43"></a><a href="#l43">43</a><td> */<tr><td><a id="l44"></a><a href="#l44">44</a><td>var IEDRIVER_EXE = &#39;IEDriverServer.exe&#39;;<tr><td><a id="l45"></a><a href="#l45">45</a><td><tr><td><a id="l46"></a><a href="#l46">46</a><td><tr><td><a id="l47"></a><a href="#l47">47</a><td><tr><td><a id="l48"></a><a href="#l48">48</a><td>/**<tr><td><a id="l49"></a><a href="#l49">49</a><td> * IEDriverServer logging levels.<tr><td><a id="l50"></a><a href="#l50">50</a><td> * @enum {string}<tr><td><a id="l51"></a><a href="#l51">51</a><td> */<tr><td><a id="l52"></a><a href="#l52">52</a><td>var Level = {<tr><td><a id="l53"></a><a href="#l53">53</a><td> FATAL: &#39;FATAL&#39;,<tr><td><a id="l54"></a><a href="#l54">54</a><td> ERROR: &#39;ERROR&#39;,<tr><td><a id="l55"></a><a href="#l55">55</a><td> WARN: &#39;WARN&#39;,<tr><td><a id="l56"></a><a href="#l56">56</a><td> INFO: &#39;INFO&#39;,<tr><td><a id="l57"></a><a href="#l57">57</a><td> DEBUG: &#39;DEBUG&#39;,<tr><td><a id="l58"></a><a href="#l58">58</a><td> TRACE: &#39;TRACE&#39;<tr><td><a id="l59"></a><a href="#l59">59</a><td>};<tr><td><a id="l60"></a><a href="#l60">60</a><td><tr><td><a id="l61"></a><a href="#l61">61</a><td><tr><td><a id="l62"></a><a href="#l62">62</a><td><tr><td><a id="l63"></a><a href="#l63">63</a><td>/**<tr><td><a id="l64"></a><a href="#l64">64</a><td> * Option keys:<tr><td><a id="l65"></a><a href="#l65">65</a><td> * https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities#ie-specific<tr><td><a id="l66"></a><a href="#l66">66</a><td> * @enum {string}<tr><td><a id="l67"></a><a href="#l67">67</a><td> */<tr><td><a id="l68"></a><a href="#l68">68</a><td>var Key = {<tr><td><a id="l69"></a><a href="#l69">69</a><td> IGNORE_PROTECTED_MODE_SETTINGS: &#39;ignoreProtectedModeSettings&#39;,<tr><td><a id="l70"></a><a href="#l70">70</a><td> IGNORE_ZOOM_SETTING: &#39;ignoreZoomSetting&#39;,<tr><td><a id="l71"></a><a href="#l71">71</a><td> INITIAL_BROWSER_URL: &#39;initialBrowserUrl&#39;,<tr><td><a id="l72"></a><a href="#l72">72</a><td> ENABLE_PERSISTENT_HOVER: &#39;enablePersistentHover&#39;,<tr><td><a id="l73"></a><a href="#l73">73</a><td> ENABLE_ELEMENT_CACHE_CLEANUP: &#39;enableElementCacheCleanup&#39;,<tr><td><a id="l74"></a><a href="#l74">74</a><td> REQUIRE_WINDOW_FOCUS: &#39;requireWindowFocus&#39;,<tr><td><a id="l75"></a><a href="#l75">75</a><td> BROWSER_ATTACH_TIMEOUT: &#39;browserAttachTimeout&#39;,<tr><td><a id="l76"></a><a href="#l76">76</a><td> FORCE_CREATE_PROCESS: &#39;ie.forceCreateProcessApi&#39;,<tr><td><a id="l77"></a><a href="#l77">77</a><td> BROWSER_COMMAND_LINE_SWITCHES: &#39;ie.browserCommandLineSwitches&#39;,<tr><td><a id="l78"></a><a href="#l78">78</a><td> USE_PER_PROCESS_PROXY: &#39;ie.usePerProcessProxy&#39;,<tr><td><a id="l79"></a><a href="#l79">79</a><td> ENSURE_CLEAN_SESSION: &#39;ie.ensureCleanSession&#39;,<tr><td><a id="l80"></a><a href="#l80">80</a><td> LOG_FILE: &#39;logFile&#39;,<tr><td><a id="l81"></a><a href="#l81">81</a><td> LOG_LEVEL: &#39;logLevel&#39;,<tr><td><a id="l82"></a><a href="#l82">82</a><td> HOST: &#39;host&#39;,<tr><td><a id="l83"></a><a href="#l83">83</a><td> EXTRACT_PATH: &#39;extractPath&#39;,<tr><td><a id="l84"></a><a href="#l84">84</a><td> SILENT: &#39;silent&#39;<tr><td><a id="l85"></a><a href="#l85">85</a><td>};<tr><td><a id="l86"></a><a href="#l86">86</a><td><tr><td><a id="l87"></a><a href="#l87">87</a><td><tr><td><a id="l88"></a><a href="#l88">88</a><td>/**<tr><td><a id="l89"></a><a href="#l89">89</a><td> * Class for managing IEDriver specific options.<tr><td><a id="l90"></a><a href="#l90">90</a><td> * @constructor<tr><td><a id="l91"></a><a href="#l91">91</a><td> */<tr><td><a id="l92"></a><a href="#l92">92</a><td>var Options = function() {<tr><td><a id="l93"></a><a href="#l93">93</a><td> /** @private {!Object&lt;(boolean|number|string)&gt;} */<tr><td><a id="l94"></a><a href="#l94">94</a><td> this.options_ = {};<tr><td><a id="l95"></a><a href="#l95">95</a><td><tr><td><a id="l96"></a><a href="#l96">96</a><td> /** @private {(webdriver.ProxyConfig|null)} */<tr><td><a id="l97"></a><a href="#l97">97</a><td> this.proxy_ = null;<tr><td><a id="l98"></a><a href="#l98">98</a><td>};<tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td><tr><td><a id="l101"></a><a href="#l101">101</a><td><tr><td><a id="l102"></a><a href="#l102">102</a><td>/**<tr><td><a id="l103"></a><a href="#l103">103</a><td> * Extracts the IEDriver specific options from the given capabilities<tr><td><a id="l104"></a><a href="#l104">104</a><td> * object.<tr><td><a id="l105"></a><a href="#l105">105</a><td> * @param {!webdriver.Capabilities} capabilities The capabilities object.<tr><td><a id="l106"></a><a href="#l106">106</a><td> * @return {!Options} The IEDriver options.<tr><td><a id="l107"></a><a href="#l107">107</a><td> */<tr><td><a id="l108"></a><a href="#l108">108</a><td>Options.fromCapabilities = function(capabilities) {<tr><td><a id="l109"></a><a href="#l109">109</a><td> var options = new Options();<tr><td><a id="l110"></a><a href="#l110">110</a><td> var map = options.options_;<tr><td><a id="l111"></a><a href="#l111">111</a><td><tr><td><a id="l112"></a><a href="#l112">112</a><td> Object.keys(Key).forEach(function(key) {<tr><td><a id="l113"></a><a href="#l113">113</a><td> key = Key[key];<tr><td><a id="l114"></a><a href="#l114">114</a><td> if (capabilities.has(key)) {<tr><td><a id="l115"></a><a href="#l115">115</a><td> map[key] = capabilities.get(key);<tr><td><a id="l116"></a><a href="#l116">116</a><td> }<tr><td><a id="l117"></a><a href="#l117">117</a><td> });<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td> if (capabilities.has(webdriver.Capability.PROXY)) {<tr><td><a id="l120"></a><a href="#l120">120</a><td> options.setProxy(capabilities.get(webdriver.Capability.PROXY));<tr><td><a id="l121"></a><a href="#l121">121</a><td> }<tr><td><a id="l122"></a><a href="#l122">122</a><td><tr><td><a id="l123"></a><a href="#l123">123</a><td> return options;<tr><td><a id="l124"></a><a href="#l124">124</a><td>};<tr><td><a id="l125"></a><a href="#l125">125</a><td><tr><td><a id="l126"></a><a href="#l126">126</a><td><tr><td><a id="l127"></a><a href="#l127">127</a><td>/**<tr><td><a id="l128"></a><a href="#l128">128</a><td> * Whether to disable the protected mode settings check when the session is<tr><td><a id="l129"></a><a href="#l129">129</a><td> * created. Disbling this setting may lead to significant instability as the<tr><td><a id="l130"></a><a href="#l130">130</a><td> * browser may become unresponsive/hang. Only &quot;best effort&quot; support is provided<tr><td><a id="l131"></a><a href="#l131">131</a><td> * when using this capability.<tr><td><a id="l132"></a><a href="#l132">132</a><td> *<tr><td><a id="l133"></a><a href="#l133">133</a><td> * For more information, refer to the IEDriver&#39;s<tr><td><a id="l134"></a><a href="#l134">134</a><td> * [required system configuration](http://goo.gl/eH0Yi3).<tr><td><a id="l135"></a><a href="#l135">135</a><td> *<tr><td><a id="l136"></a><a href="#l136">136</a><td> * @param {boolean} ignoreSettings Whether to ignore protected mode settings.<tr><td><a id="l137"></a><a href="#l137">137</a><td> * @return {!Options} A self reference.<tr><td><a id="l138"></a><a href="#l138">138</a><td> */<tr><td><a id="l139"></a><a href="#l139">139</a><td>Options.prototype.introduceFlakinessByIgnoringProtectedModeSettings =<tr><td><a id="l140"></a><a href="#l140">140</a><td> function(ignoreSettings) {<tr><td><a id="l141"></a><a href="#l141">141</a><td> this.options_[Key.IGNORE_PROTECTED_MODE_SETTINGS] = !!ignoreSettings;<tr><td><a id="l142"></a><a href="#l142">142</a><td> return this;<tr><td><a id="l143"></a><a href="#l143">143</a><td> };<tr><td><a id="l144"></a><a href="#l144">144</a><td><tr><td><a id="l145"></a><a href="#l145">145</a><td><tr><td><a id="l146"></a><a href="#l146">146</a><td>/**<tr><td><a id="l147"></a><a href="#l147">147</a><td> * Indicates whether to skip the check that the browser&#39;s zoom level is set to<tr><td><a id="l148"></a><a href="#l148">148</a><td> * 100%.<tr><td><a id="l149"></a><a href="#l149">149</a><td> *<tr><td><a id="l150"></a><a href="#l150">150</a><td> * @parm {boolean} ignore Whether to ignore the browser&#39;s zoom level settings.<tr><td><a id="l151"></a><a href="#l151">151</a><td> * @return {!Options} A self reference.<tr><td><a id="l152"></a><a href="#l152">152</a><td> */<tr><td><a id="l153"></a><a href="#l153">153</a><td>Options.prototype.ignoreZoomSetting = function(ignore) {<tr><td><a id="l154"></a><a href="#l154">154</a><td> this.options_[Key.IGNORE_ZOOM_SETTING] = !!ignore;<tr><td><a id="l155"></a><a href="#l155">155</a><td> return this;<tr><td><a id="l156"></a><a href="#l156">156</a><td>};<tr><td><a id="l157"></a><a href="#l157">157</a><td><tr><td><a id="l158"></a><a href="#l158">158</a><td><tr><td><a id="l159"></a><a href="#l159">159</a><td>/**<tr><td><a id="l160"></a><a href="#l160">160</a><td> * Sets the initial URL loaded when IE starts. This is intended to be used with<tr><td><a id="l161"></a><a href="#l161">161</a><td> * {@link #ignoreProtectedModeSettings} to allow the user to initialize IE in<tr><td><a id="l162"></a><a href="#l162">162</a><td> * the proper Protected Mode zone. Setting this option may cause browser<tr><td><a id="l163"></a><a href="#l163">163</a><td> * instability or flaky and unresponsive code. Only &quot;best effort&quot; support is<tr><td><a id="l164"></a><a href="#l164">164</a><td> * provided when using this option.<tr><td><a id="l165"></a><a href="#l165">165</a><td> *<tr><td><a id="l166"></a><a href="#l166">166</a><td> * @param {string} url The initial browser URL.<tr><td><a id="l167"></a><a href="#l167">167</a><td> * @return {!Options} A self reference.<tr><td><a id="l168"></a><a href="#l168">168</a><td> */<tr><td><a id="l169"></a><a href="#l169">169</a><td>Options.prototype.initialBrowserUrl = function(url) {<tr><td><a id="l170"></a><a href="#l170">170</a><td> this.options_[Key.INITIAL_BROWSER_URL] = url;<tr><td><a id="l171"></a><a href="#l171">171</a><td> return this;<tr><td><a id="l172"></a><a href="#l172">172</a><td>};<tr><td><a id="l173"></a><a href="#l173">173</a><td><tr><td><a id="l174"></a><a href="#l174">174</a><td><tr><td><a id="l175"></a><a href="#l175">175</a><td>/**<tr><td><a id="l176"></a><a href="#l176">176</a><td> * Configures whether to enable persistent mouse hovering (true by default).<tr><td><a id="l177"></a><a href="#l177">177</a><td> * Persistent hovering is achieved by continuously firing mouse over events at<tr><td><a id="l178"></a><a href="#l178">178</a><td> * the last location the mouse cursor has been moved to.<tr><td><a id="l179"></a><a href="#l179">179</a><td> *<tr><td><a id="l180"></a><a href="#l180">180</a><td> * @param {boolean} enable Whether to enable persistent hovering.<tr><td><a id="l181"></a><a href="#l181">181</a><td> * @return {!Options} A self reference.<tr><td><a id="l182"></a><a href="#l182">182</a><td> */<tr><td><a id="l183"></a><a href="#l183">183</a><td>Options.prototype.enablePersistentHover = function(enable) {<tr><td><a id="l184"></a><a href="#l184">184</a><td> this.options_[Key.ENABLE_PERSISTENT_HOVER] = !!enable;<tr><td><a id="l185"></a><a href="#l185">185</a><td> return this;<tr><td><a id="l186"></a><a href="#l186">186</a><td>};<tr><td><a id="l187"></a><a href="#l187">187</a><td><tr><td><a id="l188"></a><a href="#l188">188</a><td><tr><td><a id="l189"></a><a href="#l189">189</a><td>/**<tr><td><a id="l190"></a><a href="#l190">190</a><td> * Configures whether the driver should attempt to remove obsolete<tr><td><a id="l191"></a><a href="#l191">191</a><td> * {@linkplain webdriver.WebElement WebElements} from its internal cache on<tr><td><a id="l192"></a><a href="#l192">192</a><td> * page navigation (true by default). Disabling this option will cause the<tr><td><a id="l193"></a><a href="#l193">193</a><td> * driver to run with a larger memory footprint.<tr><td><a id="l194"></a><a href="#l194">194</a><td> *<tr><td><a id="l195"></a><a href="#l195">195</a><td> * @param {boolean} enable Whether to enable element reference cleanup.<tr><td><a id="l196"></a><a href="#l196">196</a><td> * @return {!Options} A self reference.<tr><td><a id="l197"></a><a href="#l197">197</a><td> */<tr><td><a id="l198"></a><a href="#l198">198</a><td>Options.prototype.enableElementCacheCleanup = function(enable) {<tr><td><a id="l199"></a><a href="#l199">199</a><td> this.options_[Key.ENABLE_ELEMENT_CACHE_CLEANUP] = !!enable;<tr><td><a id="l200"></a><a href="#l200">200</a><td> return this;<tr><td><a id="l201"></a><a href="#l201">201</a><td>};<tr><td><a id="l202"></a><a href="#l202">202</a><td><tr><td><a id="l203"></a><a href="#l203">203</a><td><tr><td><a id="l204"></a><a href="#l204">204</a><td>/**<tr><td><a id="l205"></a><a href="#l205">205</a><td> * Configures whether to require the IE window to have input focus before<tr><td><a id="l206"></a><a href="#l206">206</a><td> * performing any user interactions (i.e. mouse or keyboard events). This<tr><td><a id="l207"></a><a href="#l207">207</a><td> * option is disabled by default, but delivers much more accurate interaction<tr><td><a id="l208"></a><a href="#l208">208</a><td> * events when enabled.<tr><td><a id="l209"></a><a href="#l209">209</a><td> *<tr><td><a id="l210"></a><a href="#l210">210</a><td> * @param {boolean} require Whether to require window focus.<tr><td><a id="l211"></a><a href="#l211">211</a><td> * @return {!Options} A self reference.<tr><td><a id="l212"></a><a href="#l212">212</a><td> */<tr><td><a id="l213"></a><a href="#l213">213</a><td>Options.prototype.requireWindowFocus = function(require) {<tr><td><a id="l214"></a><a href="#l214">214</a><td> this.options_[Key.REQUIRE_WINDOW_FOCUS] = !!require;<tr><td><a id="l215"></a><a href="#l215">215</a><td> return this;<tr><td><a id="l216"></a><a href="#l216">216</a><td>};<tr><td><a id="l217"></a><a href="#l217">217</a><td><tr><td><a id="l218"></a><a href="#l218">218</a><td><tr><td><a id="l219"></a><a href="#l219">219</a><td>/**<tr><td><a id="l220"></a><a href="#l220">220</a><td> * Configures the timeout, in milliseconds, that the driver will attempt to<tr><td><a id="l221"></a><a href="#l221">221</a><td> * located and attach to a newly opened instance of Internet Explorer. The<tr><td><a id="l222"></a><a href="#l222">222</a><td> * default is zero, which indicates waiting indefinitely.<tr><td><a id="l223"></a><a href="#l223">223</a><td> *<tr><td><a id="l224"></a><a href="#l224">224</a><td> * @param {number} timeout How long to wait for IE.<tr><td><a id="l225"></a><a href="#l225">225</a><td> * @return {!Options} A self reference.<tr><td><a id="l226"></a><a href="#l226">226</a><td> */<tr><td><a id="l227"></a><a href="#l227">227</a><td>Options.prototype.browserAttachTimeout = function(timeout) {<tr><td><a id="l228"></a><a href="#l228">228</a><td> this.options_[Key.BROWSER_ATTACH_TIMEOUT] = Math.max(timeout, 0);<tr><td><a id="l229"></a><a href="#l229">229</a><td> return this;<tr><td><a id="l230"></a><a href="#l230">230</a><td>};<tr><td><a id="l231"></a><a href="#l231">231</a><td><tr><td><a id="l232"></a><a href="#l232">232</a><td><tr><td><a id="l233"></a><a href="#l233">233</a><td>/**<tr><td><a id="l234"></a><a href="#l234">234</a><td> * Configures whether to launch Internet Explorer using the CreateProcess API.<tr><td><a id="l235"></a><a href="#l235">235</a><td> * If this option is not specified, IE is launched using IELaunchURL, if<tr><td><a id="l236"></a><a href="#l236">236</a><td> * available. For IE 8 and above, this option requires the TabProcGrowth<tr><td><a id="l237"></a><a href="#l237">237</a><td> * registry value to be set to 0.<tr><td><a id="l238"></a><a href="#l238">238</a><td> *<tr><td><a id="l239"></a><a href="#l239">239</a><td> * @param {boolean} force Whether to use the CreateProcess API.<tr><td><a id="l240"></a><a href="#l240">240</a><td> * @return {!Options} A self reference.<tr><td><a id="l241"></a><a href="#l241">241</a><td> */<tr><td><a id="l242"></a><a href="#l242">242</a><td>Options.prototype.forceCreateProcessApi = function(force) {<tr><td><a id="l243"></a><a href="#l243">243</a><td> this.options_[Key.FORCE_CREATE_PROCESS] = !!force;<tr><td><a id="l244"></a><a href="#l244">244</a><td> return this;<tr><td><a id="l245"></a><a href="#l245">245</a><td>};<tr><td><a id="l246"></a><a href="#l246">246</a><td><tr><td><a id="l247"></a><a href="#l247">247</a><td><tr><td><a id="l248"></a><a href="#l248">248</a><td>/**<tr><td><a id="l249"></a><a href="#l249">249</a><td> * Specifies command-line switches to use when launching Internet Explorer.<tr><td><a id="l250"></a><a href="#l250">250</a><td> * This is only valid when used with {@link #forceCreateProcessApi}.<tr><td><a id="l251"></a><a href="#l251">251</a><td> *<tr><td><a id="l252"></a><a href="#l252">252</a><td> * @param {...(string|!Array.&lt;string&gt;)} var_args The arguments to add.<tr><td><a id="l253"></a><a href="#l253">253</a><td> * @return {!Options} A self reference.<tr><td><a id="l254"></a><a href="#l254">254</a><td> */<tr><td><a id="l255"></a><a href="#l255">255</a><td>Options.prototype.addArguments = function(var_args) {<tr><td><a id="l256"></a><a href="#l256">256</a><td> var args = this.options_[Key.BROWSER_COMMAND_LINE_SWITCHES] || [];<tr><td><a id="l257"></a><a href="#l257">257</a><td> args = args.concat.apply(args, arguments);<tr><td><a id="l258"></a><a href="#l258">258</a><td> this.options_[Key.BROWSER_COMMAND_LINE_SWITCHES] = args;<tr><td><a id="l259"></a><a href="#l259">259</a><td> return this;<tr><td><a id="l260"></a><a href="#l260">260</a><td>};<tr><td><a id="l261"></a><a href="#l261">261</a><td><tr><td><a id="l262"></a><a href="#l262">262</a><td><tr><td><a id="l263"></a><a href="#l263">263</a><td>/**<tr><td><a id="l264"></a><a href="#l264">264</a><td> * Configures whether proxies should be configured on a per-process basis. If<tr><td><a id="l265"></a><a href="#l265">265</a><td> * not set, setting a {@linkplain #setProxy proxy} will configure the system<tr><td><a id="l266"></a><a href="#l266">266</a><td> * proxy. The default behavior is to use the system proxy.<tr><td><a id="l267"></a><a href="#l267">267</a><td> *<tr><td><a id="l268"></a><a href="#l268">268</a><td> * @param {boolean} enable Whether to enable per-process proxy settings.<tr><td><a id="l269"></a><a href="#l269">269</a><td> * @return {!Options} A self reference.<tr><td><a id="l270"></a><a href="#l270">270</a><td> */<tr><td><a id="l271"></a><a href="#l271">271</a><td>Options.prototype.usePerProcessProxy = function(enable) {<tr><td><a id="l272"></a><a href="#l272">272</a><td> this.options_[Key.USE_PER_PROCESS_PROXY] = !!enable;<tr><td><a id="l273"></a><a href="#l273">273</a><td> return this;<tr><td><a id="l274"></a><a href="#l274">274</a><td>};<tr><td><a id="l275"></a><a href="#l275">275</a><td><tr><td><a id="l276"></a><a href="#l276">276</a><td><tr><td><a id="l277"></a><a href="#l277">277</a><td>/**<tr><td><a id="l278"></a><a href="#l278">278</a><td> * Configures whether to clear the cache, cookies, history, and saved form data<tr><td><a id="l279"></a><a href="#l279">279</a><td> * before starting the browser. _Using this capability will clear session data<tr><td><a id="l280"></a><a href="#l280">280</a><td> * for all running instances of Internet Explorer, including those started<tr><td><a id="l281"></a><a href="#l281">281</a><td> * manually._<tr><td><a id="l282"></a><a href="#l282">282</a><td> *<tr><td><a id="l283"></a><a href="#l283">283</a><td> * @param {boolean} cleanSession Whether to clear all session data on startup.<tr><td><a id="l284"></a><a href="#l284">284</a><td> * @return {!Options} A self reference.<tr><td><a id="l285"></a><a href="#l285">285</a><td> */<tr><td><a id="l286"></a><a href="#l286">286</a><td>Options.prototype.ensureCleanSession = function(cleanSession) {<tr><td><a id="l287"></a><a href="#l287">287</a><td> this.options_[Key.ENSURE_CLEAN_SESSION] = !!cleanSession;<tr><td><a id="l288"></a><a href="#l288">288</a><td> return this;<tr><td><a id="l289"></a><a href="#l289">289</a><td>};<tr><td><a id="l290"></a><a href="#l290">290</a><td><tr><td><a id="l291"></a><a href="#l291">291</a><td><tr><td><a id="l292"></a><a href="#l292">292</a><td>/**<tr><td><a id="l293"></a><a href="#l293">293</a><td> * Sets the path to the log file the driver should log to.<tr><td><a id="l294"></a><a href="#l294">294</a><td> * @param {string} path The log file path.<tr><td><a id="l295"></a><a href="#l295">295</a><td> * @return {!Options} A self reference.<tr><td><a id="l296"></a><a href="#l296">296</a><td> */<tr><td><a id="l297"></a><a href="#l297">297</a><td>Options.prototype.setLogFile = function(file) {<tr><td><a id="l298"></a><a href="#l298">298</a><td> this.options_[Key.LOG_FILE] = file;<tr><td><a id="l299"></a><a href="#l299">299</a><td> return this;<tr><td><a id="l300"></a><a href="#l300">300</a><td>};<tr><td><a id="l301"></a><a href="#l301">301</a><td><tr><td><a id="l302"></a><a href="#l302">302</a><td><tr><td><a id="l303"></a><a href="#l303">303</a><td>/**<tr><td><a id="l304"></a><a href="#l304">304</a><td> * Sets the IEDriverServer&#39;s logging {@linkplain Level level}.<tr><td><a id="l305"></a><a href="#l305">305</a><td> * @param {Level} level The logging level.<tr><td><a id="l306"></a><a href="#l306">306</a><td> * @return {!Options} A self reference.<tr><td><a id="l307"></a><a href="#l307">307</a><td> */<tr><td><a id="l308"></a><a href="#l308">308</a><td>Options.prototype.setLogLevel = function(level) {<tr><td><a id="l309"></a><a href="#l309">309</a><td> this.options_[Key.LOG_LEVEL] = level;<tr><td><a id="l310"></a><a href="#l310">310</a><td> return this;<tr><td><a id="l311"></a><a href="#l311">311</a><td>};<tr><td><a id="l312"></a><a href="#l312">312</a><td><tr><td><a id="l313"></a><a href="#l313">313</a><td><tr><td><a id="l314"></a><a href="#l314">314</a><td>/**<tr><td><a id="l315"></a><a href="#l315">315</a><td> * Sets the IP address of the driver&#39;s host adapter.<tr><td><a id="l316"></a><a href="#l316">316</a><td> * @param {string} host The IP address to use.<tr><td><a id="l317"></a><a href="#l317">317</a><td> * @return {!Options} A self reference.<tr><td><a id="l318"></a><a href="#l318">318</a><td> */<tr><td><a id="l319"></a><a href="#l319">319</a><td>Options.prototype.setHost = function(host) {<tr><td><a id="l320"></a><a href="#l320">320</a><td> this.options_[Key.HOST] = host;<tr><td><a id="l321"></a><a href="#l321">321</a><td> return this;<tr><td><a id="l322"></a><a href="#l322">322</a><td>};<tr><td><a id="l323"></a><a href="#l323">323</a><td><tr><td><a id="l324"></a><a href="#l324">324</a><td><tr><td><a id="l325"></a><a href="#l325">325</a><td>/**<tr><td><a id="l326"></a><a href="#l326">326</a><td> * Sets the path of the temporary data directory to use.<tr><td><a id="l327"></a><a href="#l327">327</a><td> * @param {string} path The log file path.<tr><td><a id="l328"></a><a href="#l328">328</a><td> * @return {!Options} A self reference.<tr><td><a id="l329"></a><a href="#l329">329</a><td> */<tr><td><a id="l330"></a><a href="#l330">330</a><td>Options.prototype.setExtractPath = function(path) {<tr><td><a id="l331"></a><a href="#l331">331</a><td> this.options_[Key.EXTRACT_PATH] = path;<tr><td><a id="l332"></a><a href="#l332">332</a><td> return this;<tr><td><a id="l333"></a><a href="#l333">333</a><td>};<tr><td><a id="l334"></a><a href="#l334">334</a><td><tr><td><a id="l335"></a><a href="#l335">335</a><td><tr><td><a id="l336"></a><a href="#l336">336</a><td>/**<tr><td><a id="l337"></a><a href="#l337">337</a><td> * Sets whether the driver should start in silent mode.<tr><td><a id="l338"></a><a href="#l338">338</a><td> * @param {boolean} silent Whether to run in silent mode.<tr><td><a id="l339"></a><a href="#l339">339</a><td> * @return {!Options} A self reference.<tr><td><a id="l340"></a><a href="#l340">340</a><td> */<tr><td><a id="l341"></a><a href="#l341">341</a><td>Options.prototype.silent = function(silent) {<tr><td><a id="l342"></a><a href="#l342">342</a><td> this.options_[Key.SILENT] = silent;<tr><td><a id="l343"></a><a href="#l343">343</a><td> return this;<tr><td><a id="l344"></a><a href="#l344">344</a><td>};<tr><td><a id="l345"></a><a href="#l345">345</a><td><tr><td><a id="l346"></a><a href="#l346">346</a><td><tr><td><a id="l347"></a><a href="#l347">347</a><td>/**<tr><td><a id="l348"></a><a href="#l348">348</a><td> * Sets the proxy settings for the new session.<tr><td><a id="l349"></a><a href="#l349">349</a><td> * @param {webdriver.ProxyConfig} proxy The proxy configuration to use.<tr><td><a id="l350"></a><a href="#l350">350</a><td> * @return {!Options} A self reference.<tr><td><a id="l351"></a><a href="#l351">351</a><td> */<tr><td><a id="l352"></a><a href="#l352">352</a><td>Options.prototype.setProxy = function(proxy) {<tr><td><a id="l353"></a><a href="#l353">353</a><td> this.proxy_ = proxy;<tr><td><a id="l354"></a><a href="#l354">354</a><td> return this;<tr><td><a id="l355"></a><a href="#l355">355</a><td>};<tr><td><a id="l356"></a><a href="#l356">356</a><td><tr><td><a id="l357"></a><a href="#l357">357</a><td><tr><td><a id="l358"></a><a href="#l358">358</a><td>/**<tr><td><a id="l359"></a><a href="#l359">359</a><td> * Converts this options instance to a {@link webdriver.Capabilities} object.<tr><td><a id="l360"></a><a href="#l360">360</a><td> * @param {webdriver.Capabilities=} opt_capabilities The capabilities to merge<tr><td><a id="l361"></a><a href="#l361">361</a><td> * these options into, if any.<tr><td><a id="l362"></a><a href="#l362">362</a><td> * @return {!webdriver.Capabilities} The capabilities.<tr><td><a id="l363"></a><a href="#l363">363</a><td> */<tr><td><a id="l364"></a><a href="#l364">364</a><td>Options.prototype.toCapabilities = function(opt_capabilities) {<tr><td><a id="l365"></a><a href="#l365">365</a><td> var capabilities = opt_capabilities || webdriver.Capabilities.ie();<tr><td><a id="l366"></a><a href="#l366">366</a><td> if (this.proxy_) {<tr><td><a id="l367"></a><a href="#l367">367</a><td> capabilities.set(webdriver.Capability.PROXY, this.proxy_);<tr><td><a id="l368"></a><a href="#l368">368</a><td> }<tr><td><a id="l369"></a><a href="#l369">369</a><td> Object.keys(this.options_).forEach(function(key) {<tr><td><a id="l370"></a><a href="#l370">370</a><td> capabilities.set(key, this.options_[key]);<tr><td><a id="l371"></a><a href="#l371">371</a><td> }, this);<tr><td><a id="l372"></a><a href="#l372">372</a><td> return capabilities;<tr><td><a id="l373"></a><a href="#l373">373</a><td>};<tr><td><a id="l374"></a><a href="#l374">374</a><td><tr><td><a id="l375"></a><a href="#l375">375</a><td><tr><td><a id="l376"></a><a href="#l376">376</a><td>function createServiceFromCapabilities(capabilities) {<tr><td><a id="l377"></a><a href="#l377">377</a><td> if (process.platform !== &#39;win32&#39;) {<tr><td><a id="l378"></a><a href="#l378">378</a><td> throw Error(<tr><td><a id="l379"></a><a href="#l379">379</a><td> &#39;The IEDriver may only be used on Windows, but you appear to be on &#39; +<tr><td><a id="l380"></a><a href="#l380">380</a><td> process.platform + &#39;. Did you mean to run against a remote &#39; +<tr><td><a id="l381"></a><a href="#l381">381</a><td> &#39;WebDriver server?&#39;);<tr><td><a id="l382"></a><a href="#l382">382</a><td> }<tr><td><a id="l383"></a><a href="#l383">383</a><td><tr><td><a id="l384"></a><a href="#l384">384</a><td> var exe = io.findInPath(IEDRIVER_EXE, true);<tr><td><a id="l385"></a><a href="#l385">385</a><td> if (!fs.existsSync(exe)) {<tr><td><a id="l386"></a><a href="#l386">386</a><td> throw Error(&#39;File does not exist: &#39; + exe);<tr><td><a id="l387"></a><a href="#l387">387</a><td> }<tr><td><a id="l388"></a><a href="#l388">388</a><td> <tr><td><a id="l389"></a><a href="#l389">389</a><td> var args = [];<tr><td><a id="l390"></a><a href="#l390">390</a><td> if (capabilities.has(Key.HOST)) {<tr><td><a id="l391"></a><a href="#l391">391</a><td> args.push(&#39;--host=&#39; + capabilities.get(Key.HOST));<tr><td><a id="l392"></a><a href="#l392">392</a><td> }<tr><td><a id="l393"></a><a href="#l393">393</a><td> if (capabilities.has(Key.LOG_FILE)) {<tr><td><a id="l394"></a><a href="#l394">394</a><td> args.push(&#39;--log-file=&#39; + capabilities.get(Key.LOG_FILE));<tr><td><a id="l395"></a><a href="#l395">395</a><td> }<tr><td><a id="l396"></a><a href="#l396">396</a><td> if (capabilities.has(Key.LOG_LEVEL)) {<tr><td><a id="l397"></a><a href="#l397">397</a><td> args.push(&#39;--log-level=&#39; + capabilities.get(Key.LOG_LEVEL));<tr><td><a id="l398"></a><a href="#l398">398</a><td> }<tr><td><a id="l399"></a><a href="#l399">399</a><td> if (capabilities.has(Key.EXTRACT_PATH)) {<tr><td><a id="l400"></a><a href="#l400">400</a><td> args.push(&#39;--extract-path=&#39; + capabilities.get(Key.EXTRACT_PATH));<tr><td><a id="l401"></a><a href="#l401">401</a><td> }<tr><td><a id="l402"></a><a href="#l402">402</a><td> if (capabilities.get(Key.SILENT)) {<tr><td><a id="l403"></a><a href="#l403">403</a><td> args.push(&#39;--silent&#39;);<tr><td><a id="l404"></a><a href="#l404">404</a><td> }<tr><td><a id="l405"></a><a href="#l405">405</a><td><tr><td><a id="l406"></a><a href="#l406">406</a><td> var port = portprober.findFreePort();<tr><td><a id="l407"></a><a href="#l407">407</a><td> return new remote.DriverService(exe, {<tr><td><a id="l408"></a><a href="#l408">408</a><td> loopback: true,<tr><td><a id="l409"></a><a href="#l409">409</a><td> port: port,<tr><td><a id="l410"></a><a href="#l410">410</a><td> args: port.then(function(port) {<tr><td><a id="l411"></a><a href="#l411">411</a><td> return args.concat(&#39;--port=&#39; + port);<tr><td><a id="l412"></a><a href="#l412">412</a><td> }),<tr><td><a id="l413"></a><a href="#l413">413</a><td> stdio: &#39;ignore&#39;<tr><td><a id="l414"></a><a href="#l414">414</a><td> });<tr><td><a id="l415"></a><a href="#l415">415</a><td>}<tr><td><a id="l416"></a><a href="#l416">416</a><td><tr><td><a id="l417"></a><a href="#l417">417</a><td><tr><td><a id="l418"></a><a href="#l418">418</a><td>/**<tr><td><a id="l419"></a><a href="#l419">419</a><td> * A WebDriver client for Microsoft&#39;s Internet Explorer.<tr><td><a id="l420"></a><a href="#l420">420</a><td> *<tr><td><a id="l421"></a><a href="#l421">421</a><td> * @param {(webdriver.Capabilities|Options)=} opt_config The configuration<tr><td><a id="l422"></a><a href="#l422">422</a><td> * options.<tr><td><a id="l423"></a><a href="#l423">423</a><td> * @param {webdriver.promise.ControlFlow=} opt_flow The control flow to use, or<tr><td><a id="l424"></a><a href="#l424">424</a><td> * {@code null} to use the currently active flow.<tr><td><a id="l425"></a><a href="#l425">425</a><td> * @constructor<tr><td><a id="l426"></a><a href="#l426">426</a><td> * @extends {webdriver.WebDriver}<tr><td><a id="l427"></a><a href="#l427">427</a><td> */<tr><td><a id="l428"></a><a href="#l428">428</a><td>var Driver = function(opt_config, opt_flow) {<tr><td><a id="l429"></a><a href="#l429">429</a><td> var capabilities = opt_config instanceof Options ? <tr><td><a id="l430"></a><a href="#l430">430</a><td> opt_config.toCapabilities() :<tr><td><a id="l431"></a><a href="#l431">431</a><td> (opt_config || webdriver.Capabilities.ie());<tr><td><a id="l432"></a><a href="#l432">432</a><td><tr><td><a id="l433"></a><a href="#l433">433</a><td> var service = createServiceFromCapabilities(capabilities);<tr><td><a id="l434"></a><a href="#l434">434</a><td> var executor = executors.createExecutor(service.start());<tr><td><a id="l435"></a><a href="#l435">435</a><td> var driver = webdriver.WebDriver.createSession(<tr><td><a id="l436"></a><a href="#l436">436</a><td> executor, capabilities, opt_flow);<tr><td><a id="l437"></a><a href="#l437">437</a><td><tr><td><a id="l438"></a><a href="#l438">438</a><td> webdriver.WebDriver.call(<tr><td><a id="l439"></a><a href="#l439">439</a><td> this, driver.getSession(), executor, driver.controlFlow());<tr><td><a id="l440"></a><a href="#l440">440</a><td><tr><td><a id="l441"></a><a href="#l441">441</a><td> var boundQuit = this.quit.bind(this);<tr><td><a id="l442"></a><a href="#l442">442</a><td><tr><td><a id="l443"></a><a href="#l443">443</a><td> /** @override */<tr><td><a id="l444"></a><a href="#l444">444</a><td> this.quit = function() {<tr><td><a id="l445"></a><a href="#l445">445</a><td> return boundQuit().thenFinally(service.kill.bind(service));<tr><td><a id="l446"></a><a href="#l446">446</a><td> };<tr><td><a id="l447"></a><a href="#l447">447</a><td>};<tr><td><a id="l448"></a><a href="#l448">448</a><td>util.inherits(Driver, webdriver.WebDriver);<tr><td><a id="l449"></a><a href="#l449">449</a><td><tr><td><a id="l450"></a><a href="#l450">450</a><td><tr><td><a id="l451"></a><a href="#l451">451</a><td>/**<tr><td><a id="l452"></a><a href="#l452">452</a><td> * This function is a no-op as file detectors are not supported by this<tr><td><a id="l453"></a><a href="#l453">453</a><td> * implementation.<tr><td><a id="l454"></a><a href="#l454">454</a><td> * @override<tr><td><a id="l455"></a><a href="#l455">455</a><td> */<tr><td><a id="l456"></a><a href="#l456">456</a><td>Driver.prototype.setFileDetector = function() {<tr><td><a id="l457"></a><a href="#l457">457</a><td>};<tr><td><a id="l458"></a><a href="#l458">458</a><td><tr><td><a id="l459"></a><a href="#l459">459</a><td><tr><td><a id="l460"></a><a href="#l460">460</a><td>// PUBLIC API<tr><td><a id="l461"></a><a href="#l461">461</a><td><tr><td><a id="l462"></a><a href="#l462">462</a><td><tr><td><a id="l463"></a><a href="#l463">463</a><td>exports.Driver = Driver;<tr><td><a id="l464"></a><a href="#l464">464</a><td>exports.Options = Options;<tr><td><a id="l465"></a><a href="#l465">465</a><td>exports.Level = Level;</table></div></article><nav><h3><a href="../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../types.js"></script><script src="../dossier.js"></script>