selenium-webdriver 2.47.0 → 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 (529) hide show
  1. package/CHANGES.md +96 -0
  2. package/NOTICE +1 -1
  3. package/README.md +57 -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 +80 -114
  12. package/firefox/extension.js +10 -19
  13. package/firefox/index.js +175 -171
  14. package/firefox/profile.js +221 -239
  15. package/http/index.js +396 -77
  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} +89 -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 +6 -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/promise.js +3093 -0
  34. package/lib/safari/client.js +697 -659
  35. package/lib/session.js +79 -0
  36. package/{test/promise_aplus_test.js → lib/symbols.js} +15 -25
  37. package/lib/test/build.js +4 -4
  38. package/lib/test/data/click_tests/disappearing_element.html +62 -0
  39. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  40. package/lib/test/data/click_tests/overlapping_elements.html +70 -0
  41. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  42. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  43. package/lib/test/data/readOnlyPage.html +3 -1
  44. package/lib/test/data/selectPage.html +18 -2
  45. package/lib/test/data/simpleTest.html +1 -0
  46. package/lib/test/fileserver.js +3 -4
  47. package/lib/test/index.js +13 -4
  48. package/lib/test/resources.js +1 -1
  49. package/lib/until.js +428 -0
  50. package/lib/webdriver.js +2351 -0
  51. package/net/portprober.js +15 -11
  52. package/opera.js +295 -314
  53. package/package.json +6 -5
  54. package/phantomjs.js +135 -140
  55. package/proxy.js +6 -4
  56. package/remote/index.js +234 -219
  57. package/safari.js +319 -310
  58. package/test/chrome/options_test.js +11 -9
  59. package/test/element_finding_test.js +51 -13
  60. package/test/error_test.js +163 -0
  61. package/test/execute_script_test.js +1 -1
  62. package/test/firefox/firefox_test.js +24 -0
  63. package/test/http/http_test.js +354 -43
  64. package/test/http/util_test.js +25 -23
  65. package/test/io_test.js +6 -1
  66. package/test/lib/by_test.js +127 -0
  67. package/test/lib/capabilities_test.js +84 -0
  68. package/test/lib/events_test.js +177 -0
  69. package/test/lib/logging_test.js +272 -0
  70. package/test/lib/promise_aplus_test.js +74 -0
  71. package/test/lib/promise_error_test.js +808 -0
  72. package/test/lib/promise_flow_test.js +2282 -0
  73. package/test/lib/promise_generator_test.js +308 -0
  74. package/test/lib/promise_test.js +996 -0
  75. package/test/lib/testutil.js +90 -0
  76. package/test/lib/until_test.js +436 -0
  77. package/test/lib/webdriver_test.js +2207 -0
  78. package/test/page_loading_test.js +7 -9
  79. package/test/stale_element_test.js +2 -2
  80. package/test/testing/assert_test.js +374 -0
  81. package/test/testing/index_test.js +9 -11
  82. package/testing/assert.js +334 -17
  83. package/testing/index.js +10 -0
  84. package/_base.js +0 -200
  85. package/docs/Changes.html +0 -317
  86. package/docs/class_bot_Error.html +0 -15
  87. package/docs/class_webdriver_ActionSequence.html +0 -115
  88. package/docs/class_webdriver_Alert.html +0 -24
  89. package/docs/class_webdriver_AlertPromise.html +0 -91
  90. package/docs/class_webdriver_Capabilities.html +0 -60
  91. package/docs/class_webdriver_Command.html +0 -15
  92. package/docs/class_webdriver_EventEmitter.html +0 -35
  93. package/docs/class_webdriver_FileDetector.html +0 -21
  94. package/docs/class_webdriver_Locator.html +0 -12
  95. package/docs/class_webdriver_Serializable.html +0 -9
  96. package/docs/class_webdriver_Session.html +0 -13
  97. package/docs/class_webdriver_TouchSequence.html +0 -49
  98. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  99. package/docs/class_webdriver_WebDriver.html +0 -313
  100. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  101. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  102. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  103. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  104. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  105. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  106. package/docs/class_webdriver_WebElement.html +0 -216
  107. package/docs/class_webdriver_WebElementPromise.html +0 -266
  108. package/docs/class_webdriver_http_Executor.html +0 -22
  109. package/docs/class_webdriver_http_Request.html +0 -12
  110. package/docs/class_webdriver_http_Response.html +0 -13
  111. package/docs/class_webdriver_logging_Entry.html +0 -15
  112. package/docs/class_webdriver_logging_Level.html +0 -55
  113. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  114. package/docs/class_webdriver_logging_Logger.html +0 -119
  115. package/docs/class_webdriver_logging_Preferences.html +0 -8
  116. package/docs/class_webdriver_promise_CancellationError.html +0 -18
  117. package/docs/class_webdriver_promise_ControlFlow.html +0 -109
  118. package/docs/class_webdriver_promise_Deferred.html +0 -84
  119. package/docs/class_webdriver_promise_Promise.html +0 -74
  120. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  121. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  122. package/docs/class_webdriver_testing_Assertion.html +0 -99
  123. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  124. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  125. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  126. package/docs/class_webdriver_until_Condition.html +0 -7
  127. package/docs/dossier.css +0 -1
  128. package/docs/dossier.js +0 -86
  129. package/docs/enum_bot_ErrorCode.html +0 -3
  130. package/docs/enum_bot_Error_State.html +0 -2
  131. package/docs/enum_webdriver_Browser.html +0 -2
  132. package/docs/enum_webdriver_Button.html +0 -2
  133. package/docs/enum_webdriver_Capability.html +0 -33
  134. package/docs/enum_webdriver_CommandName.html +0 -3
  135. package/docs/enum_webdriver_Key.html +0 -12
  136. package/docs/enum_webdriver_logging_Type.html +0 -6
  137. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  138. package/docs/index.html +0 -123
  139. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  140. package/docs/interface_webdriver_http_Client.html +0 -10
  141. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  142. package/docs/module_selenium-webdriver.html +0 -23
  143. package/docs/module_selenium-webdriver__base.html +0 -23
  144. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  145. package/docs/module_selenium-webdriver_builder.html +0 -2
  146. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  147. package/docs/module_selenium-webdriver_chrome.html +0 -90
  148. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  149. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  150. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  151. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  152. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  153. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  154. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  155. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  156. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  157. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  158. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  159. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  160. package/docs/module_selenium-webdriver_class_WebElement.html +0 -216
  161. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -266
  162. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  163. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  164. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  165. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  166. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  167. package/docs/module_selenium-webdriver_error.html +0 -4
  168. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  169. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  170. package/docs/module_selenium-webdriver_executors.html +0 -10
  171. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  172. package/docs/module_selenium-webdriver_firefox.html +0 -67
  173. package/docs/module_selenium-webdriver_firefox_binary.html +0 -4
  174. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -21
  175. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -21
  176. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  177. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  178. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  179. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  180. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  181. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  182. package/docs/module_selenium-webdriver_http.html +0 -9
  183. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  184. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  185. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  186. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  187. package/docs/module_selenium-webdriver_http_util.html +0 -17
  188. package/docs/module_selenium-webdriver_ie.html +0 -11
  189. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  190. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  191. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  192. package/docs/module_selenium-webdriver_io.html +0 -37
  193. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  194. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  195. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  196. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  197. package/docs/module_selenium-webdriver_namespace_promise.html +0 -162
  198. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  199. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  200. package/docs/module_selenium-webdriver_net.html +0 -7
  201. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  202. package/docs/module_selenium-webdriver_opera.html +0 -62
  203. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  204. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  205. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  206. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  207. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  208. package/docs/module_selenium-webdriver_proxy.html +0 -28
  209. package/docs/module_selenium-webdriver_remote.html +0 -8
  210. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  211. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  212. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -40
  213. package/docs/module_selenium-webdriver_safari.html +0 -9
  214. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  215. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  216. package/docs/module_selenium-webdriver_testing.html +0 -74
  217. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  218. package/docs/namespace_bot.html +0 -4
  219. package/docs/namespace_bot_json.html +0 -20
  220. package/docs/namespace_bot_response.html +0 -18
  221. package/docs/namespace_bot_userAgent.html +0 -33
  222. package/docs/namespace_webdriver.html +0 -30
  223. package/docs/namespace_webdriver_By.html +0 -56
  224. package/docs/namespace_webdriver_http.html +0 -6
  225. package/docs/namespace_webdriver_logging.html +0 -70
  226. package/docs/namespace_webdriver_promise.html +0 -165
  227. package/docs/namespace_webdriver_stacktrace.html +0 -17
  228. package/docs/namespace_webdriver_testing.html +0 -7
  229. package/docs/namespace_webdriver_testing_assert.html +0 -9
  230. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  231. package/docs/namespace_webdriver_until.html +0 -82
  232. package/docs/source/_base.js.src.html +0 -1
  233. package/docs/source/builder.js.src.html +0 -1
  234. package/docs/source/chrome.js.src.html +0 -1
  235. package/docs/source/error.js.src.html +0 -1
  236. package/docs/source/executors.js.src.html +0 -1
  237. package/docs/source/firefox/binary.js.src.html +0 -1
  238. package/docs/source/firefox/extension.js.src.html +0 -1
  239. package/docs/source/firefox/index.js.src.html +0 -1
  240. package/docs/source/firefox/profile.js.src.html +0 -1
  241. package/docs/source/http/index.js.src.html +0 -1
  242. package/docs/source/http/util.js.src.html +0 -1
  243. package/docs/source/ie.js.src.html +0 -1
  244. package/docs/source/index.js.src.html +0 -1
  245. package/docs/source/io/exec.js.src.html +0 -1
  246. package/docs/source/io/index.js.src.html +0 -1
  247. package/docs/source/lib/atoms/error.js.src.html +0 -1
  248. package/docs/source/lib/atoms/json.js.src.html +0 -1
  249. package/docs/source/lib/atoms/response.js.src.html +0 -1
  250. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  251. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  252. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  253. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  254. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  255. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  256. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  257. package/docs/source/lib/goog/base.js.src.html +0 -1
  258. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  259. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  260. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  261. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  262. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  263. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  264. package/docs/source/lib/goog/deps.js.src.html +0 -1
  265. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  266. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  267. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  268. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  269. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  270. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  271. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  272. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  273. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  274. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  275. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  276. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  277. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  278. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  279. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  280. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  282. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  283. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  284. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  285. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  286. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  287. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  288. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  289. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  290. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  291. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  292. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  293. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  294. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  295. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  296. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  297. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  298. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  299. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  300. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  301. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  302. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  303. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  304. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  305. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  306. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  307. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  308. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  309. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  310. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  311. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  312. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  313. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  314. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  315. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  316. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  317. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  318. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  319. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  320. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  321. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  322. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  323. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  324. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  325. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  326. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  327. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  328. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  329. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  330. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  331. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  332. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  333. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  334. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  335. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  336. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  344. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  345. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  346. package/docs/source/lib/goog/testing/watchers.js.src.html +0 -1
  347. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  348. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  349. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  350. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  351. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  352. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  353. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  354. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  355. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  356. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  357. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  358. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  366. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  367. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  368. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  369. package/docs/source/net/index.js.src.html +0 -1
  370. package/docs/source/net/portprober.js.src.html +0 -1
  371. package/docs/source/opera.js.src.html +0 -1
  372. package/docs/source/phantomjs.js.src.html +0 -1
  373. package/docs/source/proxy.js.src.html +0 -1
  374. package/docs/source/remote/index.js.src.html +0 -1
  375. package/docs/source/safari.js.src.html +0 -1
  376. package/docs/source/testing/assert.js.src.html +0 -1
  377. package/docs/source/testing/index.js.src.html +0 -1
  378. package/docs/types.js +0 -1
  379. package/lib/atoms/error.js +0 -202
  380. package/lib/atoms/json.js +0 -80
  381. package/lib/atoms/response.js +0 -110
  382. package/lib/atoms/userAgent.js +0 -257
  383. package/lib/goog/LICENSE +0 -176
  384. package/lib/goog/array/array.js +0 -1655
  385. package/lib/goog/asserts/asserts.js +0 -365
  386. package/lib/goog/async/freelist.js +0 -88
  387. package/lib/goog/async/nexttick.js +0 -241
  388. package/lib/goog/async/run.js +0 -139
  389. package/lib/goog/async/workqueue.js +0 -139
  390. package/lib/goog/base.js +0 -2547
  391. package/lib/goog/debug/debug.js +0 -653
  392. package/lib/goog/debug/entrypointregistry.js +0 -158
  393. package/lib/goog/debug/error.js +0 -63
  394. package/lib/goog/debug/logbuffer.js +0 -148
  395. package/lib/goog/debug/logger.js +0 -873
  396. package/lib/goog/debug/logrecord.js +0 -242
  397. package/lib/goog/deps.js +0 -151
  398. package/lib/goog/disposable/disposable.js +0 -307
  399. package/lib/goog/disposable/idisposable.js +0 -45
  400. package/lib/goog/dom/browserfeature.js +0 -72
  401. package/lib/goog/dom/dom.js +0 -2995
  402. package/lib/goog/dom/nodetype.js +0 -48
  403. package/lib/goog/dom/safe.js +0 -347
  404. package/lib/goog/dom/tagname.js +0 -160
  405. package/lib/goog/dom/tags.js +0 -42
  406. package/lib/goog/dom/vendor.js +0 -96
  407. package/lib/goog/events/browserevent.js +0 -386
  408. package/lib/goog/events/browserfeature.js +0 -85
  409. package/lib/goog/events/event.js +0 -143
  410. package/lib/goog/events/eventid.js +0 -47
  411. package/lib/goog/events/events.js +0 -984
  412. package/lib/goog/events/eventtarget.js +0 -394
  413. package/lib/goog/events/eventtype.js +0 -233
  414. package/lib/goog/events/keycodes.js +0 -420
  415. package/lib/goog/events/listenable.js +0 -335
  416. package/lib/goog/events/listener.js +0 -131
  417. package/lib/goog/events/listenermap.js +0 -308
  418. package/lib/goog/fs/url.js +0 -105
  419. package/lib/goog/functions/functions.js +0 -332
  420. package/lib/goog/html/safehtml.js +0 -756
  421. package/lib/goog/html/safescript.js +0 -234
  422. package/lib/goog/html/safestyle.js +0 -442
  423. package/lib/goog/html/safestylesheet.js +0 -276
  424. package/lib/goog/html/safeurl.js +0 -431
  425. package/lib/goog/html/trustedresourceurl.js +0 -224
  426. package/lib/goog/html/uncheckedconversions.js +0 -231
  427. package/lib/goog/i18n/bidi.js +0 -908
  428. package/lib/goog/iter/iter.js +0 -1305
  429. package/lib/goog/json/json.js +0 -365
  430. package/lib/goog/labs/testing/assertthat.js +0 -58
  431. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  432. package/lib/goog/labs/testing/matcher.js +0 -80
  433. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  434. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  435. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  436. package/lib/goog/labs/useragent/browser.js +0 -327
  437. package/lib/goog/labs/useragent/engine.js +0 -160
  438. package/lib/goog/labs/useragent/platform.js +0 -160
  439. package/lib/goog/labs/useragent/util.js +0 -148
  440. package/lib/goog/math/box.js +0 -389
  441. package/lib/goog/math/coordinate.js +0 -268
  442. package/lib/goog/math/math.js +0 -451
  443. package/lib/goog/math/rect.js +0 -476
  444. package/lib/goog/math/size.js +0 -227
  445. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  446. package/lib/goog/net/xhrlike.js +0 -124
  447. package/lib/goog/net/xmlhttp.js +0 -246
  448. package/lib/goog/net/xmlhttpfactory.js +0 -67
  449. package/lib/goog/object/object.js +0 -686
  450. package/lib/goog/promise/promise.js +0 -1310
  451. package/lib/goog/promise/resolver.js +0 -48
  452. package/lib/goog/promise/thenable.js +0 -126
  453. package/lib/goog/reflect/reflect.js +0 -78
  454. package/lib/goog/string/const.js +0 -182
  455. package/lib/goog/string/string.js +0 -1565
  456. package/lib/goog/string/typedstring.js +0 -48
  457. package/lib/goog/structs/collection.js +0 -56
  458. package/lib/goog/structs/map.js +0 -456
  459. package/lib/goog/structs/set.js +0 -279
  460. package/lib/goog/structs/structs.js +0 -354
  461. package/lib/goog/style/style.js +0 -2054
  462. package/lib/goog/testing/asserts.js +0 -1265
  463. package/lib/goog/testing/events/events.js +0 -727
  464. package/lib/goog/testing/functionmock.js +0 -176
  465. package/lib/goog/testing/jsunit.js +0 -162
  466. package/lib/goog/testing/loosemock.js +0 -242
  467. package/lib/goog/testing/mock.js +0 -645
  468. package/lib/goog/testing/mockclock.js +0 -617
  469. package/lib/goog/testing/mockcontrol.js +0 -220
  470. package/lib/goog/testing/mockinterface.js +0 -45
  471. package/lib/goog/testing/mockmatchers.js +0 -400
  472. package/lib/goog/testing/objectpropertystring.js +0 -68
  473. package/lib/goog/testing/propertyreplacer.js +0 -245
  474. package/lib/goog/testing/recordfunction.js +0 -215
  475. package/lib/goog/testing/stacktrace.js +0 -594
  476. package/lib/goog/testing/strictmock.js +0 -130
  477. package/lib/goog/testing/testcase.js +0 -1569
  478. package/lib/goog/testing/testrunner.js +0 -440
  479. package/lib/goog/testing/watchers.js +0 -46
  480. package/lib/goog/uri/uri.js +0 -1507
  481. package/lib/goog/uri/utils.js +0 -1116
  482. package/lib/goog/useragent/product.js +0 -175
  483. package/lib/goog/useragent/product_isversion.js +0 -143
  484. package/lib/goog/useragent/useragent.js +0 -538
  485. package/lib/webdriver/actionsequence.js +0 -356
  486. package/lib/webdriver/builder.js +0 -208
  487. package/lib/webdriver/capabilities.js +0 -411
  488. package/lib/webdriver/events.js +0 -179
  489. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  490. package/lib/webdriver/http/corsclient.js +0 -133
  491. package/lib/webdriver/http/http.js +0 -523
  492. package/lib/webdriver/http/xhrclient.js +0 -67
  493. package/lib/webdriver/locators.js +0 -257
  494. package/lib/webdriver/logging.js +0 -347
  495. package/lib/webdriver/promise.js +0 -2609
  496. package/lib/webdriver/serializable.js +0 -41
  497. package/lib/webdriver/session.js +0 -74
  498. package/lib/webdriver/stacktrace.js +0 -619
  499. package/lib/webdriver/test/builder_test.js +0 -53
  500. package/lib/webdriver/test/capabilities_test.js +0 -72
  501. package/lib/webdriver/test/events_test.js +0 -203
  502. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  503. package/lib/webdriver/test/http/http_test.js +0 -428
  504. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  505. package/lib/webdriver/test/locators_test.js +0 -59
  506. package/lib/webdriver/test/logging_test.js +0 -85
  507. package/lib/webdriver/test/promise_error_test.js +0 -719
  508. package/lib/webdriver/test/promise_flow_test.js +0 -1957
  509. package/lib/webdriver/test/promise_generator_test.js +0 -251
  510. package/lib/webdriver/test/promise_test.js +0 -1981
  511. package/lib/webdriver/test/stacktrace_test.js +0 -480
  512. package/lib/webdriver/test/test_bootstrap.js +0 -67
  513. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  514. package/lib/webdriver/test/testing/client_test.js +0 -88
  515. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  516. package/lib/webdriver/test/testutil.js +0 -209
  517. package/lib/webdriver/test/testutil_test.js +0 -104
  518. package/lib/webdriver/test/until_test.js +0 -411
  519. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  520. package/lib/webdriver/test/webdriver_test.js +0 -2369
  521. package/lib/webdriver/testing/asserts.js +0 -487
  522. package/lib/webdriver/testing/client.js +0 -179
  523. package/lib/webdriver/testing/jsunit.js +0 -363
  524. package/lib/webdriver/testing/testcase.js +0 -168
  525. package/lib/webdriver/testing/window.js +0 -244
  526. package/lib/webdriver/touchsequence.js +0 -248
  527. package/lib/webdriver/until.js +0 -412
  528. package/lib/webdriver/webdriver.js +0 -2492
  529. package/test/_base_test.js +0 -129
@@ -1,1655 +0,0 @@
1
- // Copyright 2006 The Closure Library Authors. All Rights Reserved.
2
- //
3
- // Licensed under the Apache License, Version 2.0 (the "License");
4
- // you may not use this file except in compliance with the License.
5
- // You may obtain a copy of the License at
6
- //
7
- // http://www.apache.org/licenses/LICENSE-2.0
8
- //
9
- // Unless required by applicable law or agreed to in writing, software
10
- // distributed under the License is distributed on an "AS-IS" BASIS,
11
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- // See the License for the specific language governing permissions and
13
- // limitations under the License.
14
-
15
- /**
16
- * @fileoverview Utilities for manipulating arrays.
17
- *
18
- * @author arv@google.com (Erik Arvidsson)
19
- */
20
-
21
-
22
- goog.provide('goog.array');
23
- goog.provide('goog.array.ArrayLike');
24
-
25
- goog.require('goog.asserts');
26
-
27
-
28
- /**
29
- * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should
30
- * rely on Array.prototype functions, if available.
31
- *
32
- * The Array.prototype functions can be defined by external libraries like
33
- * Prototype and setting this flag to false forces closure to use its own
34
- * goog.array implementation.
35
- *
36
- * If your javascript can be loaded by a third party site and you are wary about
37
- * relying on the prototype functions, specify
38
- * "--define goog.NATIVE_ARRAY_PROTOTYPES=false" to the JSCompiler.
39
- *
40
- * Setting goog.TRUSTED_SITE to false will automatically set
41
- * NATIVE_ARRAY_PROTOTYPES to false.
42
- */
43
- goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE);
44
-
45
-
46
- /**
47
- * @define {boolean} If true, JSCompiler will use the native implementation of
48
- * array functions where appropriate (e.g., {@code Array#filter}) and remove the
49
- * unused pure JS implementation.
50
- */
51
- goog.define('goog.array.ASSUME_NATIVE_FUNCTIONS', false);
52
-
53
-
54
- /**
55
- * @typedef {Array|NodeList|Arguments|{length: number}}
56
- */
57
- goog.array.ArrayLike;
58
-
59
-
60
- /**
61
- * Returns the last element in an array without removing it.
62
- * Same as goog.array.last.
63
- * @param {Array<T>|goog.array.ArrayLike} array The array.
64
- * @return {T} Last item in array.
65
- * @template T
66
- */
67
- goog.array.peek = function(array) {
68
- return array[array.length - 1];
69
- };
70
-
71
-
72
- /**
73
- * Returns the last element in an array without removing it.
74
- * Same as goog.array.peek.
75
- * @param {Array<T>|goog.array.ArrayLike} array The array.
76
- * @return {T} Last item in array.
77
- * @template T
78
- */
79
- goog.array.last = goog.array.peek;
80
-
81
-
82
- /**
83
- * Reference to the original {@code Array.prototype}.
84
- * @private
85
- */
86
- goog.array.ARRAY_PROTOTYPE_ = Array.prototype;
87
-
88
-
89
- // NOTE(arv): Since most of the array functions are generic it allows you to
90
- // pass an array-like object. Strings have a length and are considered array-
91
- // like. However, the 'in' operator does not work on strings so we cannot just
92
- // use the array path even if the browser supports indexing into strings. We
93
- // therefore end up splitting the string.
94
-
95
-
96
- /**
97
- * Returns the index of the first element of an array with a specified value, or
98
- * -1 if the element is not present in the array.
99
- *
100
- * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof}
101
- *
102
- * @param {Array<T>|goog.array.ArrayLike} arr The array to be searched.
103
- * @param {T} obj The object for which we are searching.
104
- * @param {number=} opt_fromIndex The index at which to start the search. If
105
- * omitted the search starts at index 0.
106
- * @return {number} The index of the first matching array element.
107
- * @template T
108
- */
109
- goog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES &&
110
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
111
- goog.array.ARRAY_PROTOTYPE_.indexOf) ?
112
- function(arr, obj, opt_fromIndex) {
113
- goog.asserts.assert(arr.length != null);
114
-
115
- return goog.array.ARRAY_PROTOTYPE_.indexOf.call(arr, obj, opt_fromIndex);
116
- } :
117
- function(arr, obj, opt_fromIndex) {
118
- var fromIndex = opt_fromIndex == null ?
119
- 0 : (opt_fromIndex < 0 ?
120
- Math.max(0, arr.length + opt_fromIndex) : opt_fromIndex);
121
-
122
- if (goog.isString(arr)) {
123
- // Array.prototype.indexOf uses === so only strings should be found.
124
- if (!goog.isString(obj) || obj.length != 1) {
125
- return -1;
126
- }
127
- return arr.indexOf(obj, fromIndex);
128
- }
129
-
130
- for (var i = fromIndex; i < arr.length; i++) {
131
- if (i in arr && arr[i] === obj)
132
- return i;
133
- }
134
- return -1;
135
- };
136
-
137
-
138
- /**
139
- * Returns the index of the last element of an array with a specified value, or
140
- * -1 if the element is not present in the array.
141
- *
142
- * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof}
143
- *
144
- * @param {!Array<T>|!goog.array.ArrayLike} arr The array to be searched.
145
- * @param {T} obj The object for which we are searching.
146
- * @param {?number=} opt_fromIndex The index at which to start the search. If
147
- * omitted the search starts at the end of the array.
148
- * @return {number} The index of the last matching array element.
149
- * @template T
150
- */
151
- goog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES &&
152
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
153
- goog.array.ARRAY_PROTOTYPE_.lastIndexOf) ?
154
- function(arr, obj, opt_fromIndex) {
155
- goog.asserts.assert(arr.length != null);
156
-
157
- // Firefox treats undefined and null as 0 in the fromIndex argument which
158
- // leads it to always return -1
159
- var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;
160
- return goog.array.ARRAY_PROTOTYPE_.lastIndexOf.call(arr, obj, fromIndex);
161
- } :
162
- function(arr, obj, opt_fromIndex) {
163
- var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;
164
-
165
- if (fromIndex < 0) {
166
- fromIndex = Math.max(0, arr.length + fromIndex);
167
- }
168
-
169
- if (goog.isString(arr)) {
170
- // Array.prototype.lastIndexOf uses === so only strings should be found.
171
- if (!goog.isString(obj) || obj.length != 1) {
172
- return -1;
173
- }
174
- return arr.lastIndexOf(obj, fromIndex);
175
- }
176
-
177
- for (var i = fromIndex; i >= 0; i--) {
178
- if (i in arr && arr[i] === obj)
179
- return i;
180
- }
181
- return -1;
182
- };
183
-
184
-
185
- /**
186
- * Calls a function for each element in an array. Skips holes in the array.
187
- * See {@link http://tinyurl.com/developer-mozilla-org-array-foreach}
188
- *
189
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array like object over
190
- * which to iterate.
191
- * @param {?function(this: S, T, number, ?): ?} f The function to call for every
192
- * element. This function takes 3 arguments (the element, the index and the
193
- * array). The return value is ignored.
194
- * @param {S=} opt_obj The object to be used as the value of 'this' within f.
195
- * @template T,S
196
- */
197
- goog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES &&
198
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
199
- goog.array.ARRAY_PROTOTYPE_.forEach) ?
200
- function(arr, f, opt_obj) {
201
- goog.asserts.assert(arr.length != null);
202
-
203
- goog.array.ARRAY_PROTOTYPE_.forEach.call(arr, f, opt_obj);
204
- } :
205
- function(arr, f, opt_obj) {
206
- var l = arr.length; // must be fixed during loop... see docs
207
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
208
- for (var i = 0; i < l; i++) {
209
- if (i in arr2) {
210
- f.call(opt_obj, arr2[i], i, arr);
211
- }
212
- }
213
- };
214
-
215
-
216
- /**
217
- * Calls a function for each element in an array, starting from the last
218
- * element rather than the first.
219
- *
220
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
221
- * like object over which to iterate.
222
- * @param {?function(this: S, T, number, ?): ?} f The function to call for every
223
- * element. This function
224
- * takes 3 arguments (the element, the index and the array). The return
225
- * value is ignored.
226
- * @param {S=} opt_obj The object to be used as the value of 'this'
227
- * within f.
228
- * @template T,S
229
- */
230
- goog.array.forEachRight = function(arr, f, opt_obj) {
231
- var l = arr.length; // must be fixed during loop... see docs
232
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
233
- for (var i = l - 1; i >= 0; --i) {
234
- if (i in arr2) {
235
- f.call(opt_obj, arr2[i], i, arr);
236
- }
237
- }
238
- };
239
-
240
-
241
- /**
242
- * Calls a function for each element in an array, and if the function returns
243
- * true adds the element to a new array.
244
- *
245
- * See {@link http://tinyurl.com/developer-mozilla-org-array-filter}
246
- *
247
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
248
- * like object over which to iterate.
249
- * @param {?function(this:S, T, number, ?):boolean} f The function to call for
250
- * every element. This function
251
- * takes 3 arguments (the element, the index and the array) and must
252
- * return a Boolean. If the return value is true the element is added to the
253
- * result array. If it is false the element is not included.
254
- * @param {S=} opt_obj The object to be used as the value of 'this'
255
- * within f.
256
- * @return {!Array<T>} a new array in which only elements that passed the test
257
- * are present.
258
- * @template T,S
259
- */
260
- goog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES &&
261
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
262
- goog.array.ARRAY_PROTOTYPE_.filter) ?
263
- function(arr, f, opt_obj) {
264
- goog.asserts.assert(arr.length != null);
265
-
266
- return goog.array.ARRAY_PROTOTYPE_.filter.call(arr, f, opt_obj);
267
- } :
268
- function(arr, f, opt_obj) {
269
- var l = arr.length; // must be fixed during loop... see docs
270
- var res = [];
271
- var resLength = 0;
272
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
273
- for (var i = 0; i < l; i++) {
274
- if (i in arr2) {
275
- var val = arr2[i]; // in case f mutates arr2
276
- if (f.call(opt_obj, val, i, arr)) {
277
- res[resLength++] = val;
278
- }
279
- }
280
- }
281
- return res;
282
- };
283
-
284
-
285
- /**
286
- * Calls a function for each element in an array and inserts the result into a
287
- * new array.
288
- *
289
- * See {@link http://tinyurl.com/developer-mozilla-org-array-map}
290
- *
291
- * @param {Array<VALUE>|goog.array.ArrayLike} arr Array or array like object
292
- * over which to iterate.
293
- * @param {function(this:THIS, VALUE, number, ?): RESULT} f The function to call
294
- * for every element. This function takes 3 arguments (the element,
295
- * the index and the array) and should return something. The result will be
296
- * inserted into a new array.
297
- * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.
298
- * @return {!Array<RESULT>} a new array with the results from f.
299
- * @template THIS, VALUE, RESULT
300
- */
301
- goog.array.map = goog.NATIVE_ARRAY_PROTOTYPES &&
302
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
303
- goog.array.ARRAY_PROTOTYPE_.map) ?
304
- function(arr, f, opt_obj) {
305
- goog.asserts.assert(arr.length != null);
306
-
307
- return goog.array.ARRAY_PROTOTYPE_.map.call(arr, f, opt_obj);
308
- } :
309
- function(arr, f, opt_obj) {
310
- var l = arr.length; // must be fixed during loop... see docs
311
- var res = new Array(l);
312
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
313
- for (var i = 0; i < l; i++) {
314
- if (i in arr2) {
315
- res[i] = f.call(opt_obj, arr2[i], i, arr);
316
- }
317
- }
318
- return res;
319
- };
320
-
321
-
322
- /**
323
- * Passes every element of an array into a function and accumulates the result.
324
- *
325
- * See {@link http://tinyurl.com/developer-mozilla-org-array-reduce}
326
- *
327
- * For example:
328
- * var a = [1, 2, 3, 4];
329
- * goog.array.reduce(a, function(r, v, i, arr) {return r + v;}, 0);
330
- * returns 10
331
- *
332
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
333
- * like object over which to iterate.
334
- * @param {function(this:S, R, T, number, ?) : R} f The function to call for
335
- * every element. This function
336
- * takes 4 arguments (the function's previous result or the initial value,
337
- * the value of the current array element, the current array index, and the
338
- * array itself)
339
- * function(previousValue, currentValue, index, array).
340
- * @param {?} val The initial value to pass into the function on the first call.
341
- * @param {S=} opt_obj The object to be used as the value of 'this'
342
- * within f.
343
- * @return {R} Result of evaluating f repeatedly across the values of the array.
344
- * @template T,S,R
345
- */
346
- goog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES &&
347
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
348
- goog.array.ARRAY_PROTOTYPE_.reduce) ?
349
- function(arr, f, val, opt_obj) {
350
- goog.asserts.assert(arr.length != null);
351
- if (opt_obj) {
352
- f = goog.bind(f, opt_obj);
353
- }
354
- return goog.array.ARRAY_PROTOTYPE_.reduce.call(arr, f, val);
355
- } :
356
- function(arr, f, val, opt_obj) {
357
- var rval = val;
358
- goog.array.forEach(arr, function(val, index) {
359
- rval = f.call(opt_obj, rval, val, index, arr);
360
- });
361
- return rval;
362
- };
363
-
364
-
365
- /**
366
- * Passes every element of an array into a function and accumulates the result,
367
- * starting from the last element and working towards the first.
368
- *
369
- * See {@link http://tinyurl.com/developer-mozilla-org-array-reduceright}
370
- *
371
- * For example:
372
- * var a = ['a', 'b', 'c'];
373
- * goog.array.reduceRight(a, function(r, v, i, arr) {return r + v;}, '');
374
- * returns 'cba'
375
- *
376
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
377
- * like object over which to iterate.
378
- * @param {?function(this:S, R, T, number, ?) : R} f The function to call for
379
- * every element. This function
380
- * takes 4 arguments (the function's previous result or the initial value,
381
- * the value of the current array element, the current array index, and the
382
- * array itself)
383
- * function(previousValue, currentValue, index, array).
384
- * @param {?} val The initial value to pass into the function on the first call.
385
- * @param {S=} opt_obj The object to be used as the value of 'this'
386
- * within f.
387
- * @return {R} Object returned as a result of evaluating f repeatedly across the
388
- * values of the array.
389
- * @template T,S,R
390
- */
391
- goog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES &&
392
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
393
- goog.array.ARRAY_PROTOTYPE_.reduceRight) ?
394
- function(arr, f, val, opt_obj) {
395
- goog.asserts.assert(arr.length != null);
396
- if (opt_obj) {
397
- f = goog.bind(f, opt_obj);
398
- }
399
- return goog.array.ARRAY_PROTOTYPE_.reduceRight.call(arr, f, val);
400
- } :
401
- function(arr, f, val, opt_obj) {
402
- var rval = val;
403
- goog.array.forEachRight(arr, function(val, index) {
404
- rval = f.call(opt_obj, rval, val, index, arr);
405
- });
406
- return rval;
407
- };
408
-
409
-
410
- /**
411
- * Calls f for each element of an array. If any call returns true, some()
412
- * returns true (without checking the remaining elements). If all calls
413
- * return false, some() returns false.
414
- *
415
- * See {@link http://tinyurl.com/developer-mozilla-org-array-some}
416
- *
417
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
418
- * like object over which to iterate.
419
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
420
- * for every element. This function takes 3 arguments (the element, the
421
- * index and the array) and should return a boolean.
422
- * @param {S=} opt_obj The object to be used as the value of 'this'
423
- * within f.
424
- * @return {boolean} true if any element passes the test.
425
- * @template T,S
426
- */
427
- goog.array.some = goog.NATIVE_ARRAY_PROTOTYPES &&
428
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
429
- goog.array.ARRAY_PROTOTYPE_.some) ?
430
- function(arr, f, opt_obj) {
431
- goog.asserts.assert(arr.length != null);
432
-
433
- return goog.array.ARRAY_PROTOTYPE_.some.call(arr, f, opt_obj);
434
- } :
435
- function(arr, f, opt_obj) {
436
- var l = arr.length; // must be fixed during loop... see docs
437
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
438
- for (var i = 0; i < l; i++) {
439
- if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
440
- return true;
441
- }
442
- }
443
- return false;
444
- };
445
-
446
-
447
- /**
448
- * Call f for each element of an array. If all calls return true, every()
449
- * returns true. If any call returns false, every() returns false and
450
- * does not continue to check the remaining elements.
451
- *
452
- * See {@link http://tinyurl.com/developer-mozilla-org-array-every}
453
- *
454
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
455
- * like object over which to iterate.
456
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
457
- * for every element. This function takes 3 arguments (the element, the
458
- * index and the array) and should return a boolean.
459
- * @param {S=} opt_obj The object to be used as the value of 'this'
460
- * within f.
461
- * @return {boolean} false if any element fails the test.
462
- * @template T,S
463
- */
464
- goog.array.every = goog.NATIVE_ARRAY_PROTOTYPES &&
465
- (goog.array.ASSUME_NATIVE_FUNCTIONS ||
466
- goog.array.ARRAY_PROTOTYPE_.every) ?
467
- function(arr, f, opt_obj) {
468
- goog.asserts.assert(arr.length != null);
469
-
470
- return goog.array.ARRAY_PROTOTYPE_.every.call(arr, f, opt_obj);
471
- } :
472
- function(arr, f, opt_obj) {
473
- var l = arr.length; // must be fixed during loop... see docs
474
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
475
- for (var i = 0; i < l; i++) {
476
- if (i in arr2 && !f.call(opt_obj, arr2[i], i, arr)) {
477
- return false;
478
- }
479
- }
480
- return true;
481
- };
482
-
483
-
484
- /**
485
- * Counts the array elements that fulfill the predicate, i.e. for which the
486
- * callback function returns true. Skips holes in the array.
487
- *
488
- * @param {!(Array<T>|goog.array.ArrayLike)} arr Array or array like object
489
- * over which to iterate.
490
- * @param {function(this: S, T, number, ?): boolean} f The function to call for
491
- * every element. Takes 3 arguments (the element, the index and the array).
492
- * @param {S=} opt_obj The object to be used as the value of 'this' within f.
493
- * @return {number} The number of the matching elements.
494
- * @template T,S
495
- */
496
- goog.array.count = function(arr, f, opt_obj) {
497
- var count = 0;
498
- goog.array.forEach(arr, function(element, index, arr) {
499
- if (f.call(opt_obj, element, index, arr)) {
500
- ++count;
501
- }
502
- }, opt_obj);
503
- return count;
504
- };
505
-
506
-
507
- /**
508
- * Search an array for the first element that satisfies a given condition and
509
- * return that element.
510
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
511
- * like object over which to iterate.
512
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call
513
- * for every element. This function takes 3 arguments (the element, the
514
- * index and the array) and should return a boolean.
515
- * @param {S=} opt_obj An optional "this" context for the function.
516
- * @return {T|null} The first array element that passes the test, or null if no
517
- * element is found.
518
- * @template T,S
519
- */
520
- goog.array.find = function(arr, f, opt_obj) {
521
- var i = goog.array.findIndex(arr, f, opt_obj);
522
- return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
523
- };
524
-
525
-
526
- /**
527
- * Search an array for the first element that satisfies a given condition and
528
- * return its index.
529
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
530
- * like object over which to iterate.
531
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call for
532
- * every element. This function
533
- * takes 3 arguments (the element, the index and the array) and should
534
- * return a boolean.
535
- * @param {S=} opt_obj An optional "this" context for the function.
536
- * @return {number} The index of the first array element that passes the test,
537
- * or -1 if no element is found.
538
- * @template T,S
539
- */
540
- goog.array.findIndex = function(arr, f, opt_obj) {
541
- var l = arr.length; // must be fixed during loop... see docs
542
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
543
- for (var i = 0; i < l; i++) {
544
- if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
545
- return i;
546
- }
547
- }
548
- return -1;
549
- };
550
-
551
-
552
- /**
553
- * Search an array (in reverse order) for the last element that satisfies a
554
- * given condition and return that element.
555
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
556
- * like object over which to iterate.
557
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call
558
- * for every element. This function
559
- * takes 3 arguments (the element, the index and the array) and should
560
- * return a boolean.
561
- * @param {S=} opt_obj An optional "this" context for the function.
562
- * @return {T|null} The last array element that passes the test, or null if no
563
- * element is found.
564
- * @template T,S
565
- */
566
- goog.array.findRight = function(arr, f, opt_obj) {
567
- var i = goog.array.findIndexRight(arr, f, opt_obj);
568
- return i < 0 ? null : goog.isString(arr) ? arr.charAt(i) : arr[i];
569
- };
570
-
571
-
572
- /**
573
- * Search an array (in reverse order) for the last element that satisfies a
574
- * given condition and return its index.
575
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
576
- * like object over which to iterate.
577
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call
578
- * for every element. This function
579
- * takes 3 arguments (the element, the index and the array) and should
580
- * return a boolean.
581
- * @param {S=} opt_obj An optional "this" context for the function.
582
- * @return {number} The index of the last array element that passes the test,
583
- * or -1 if no element is found.
584
- * @template T,S
585
- */
586
- goog.array.findIndexRight = function(arr, f, opt_obj) {
587
- var l = arr.length; // must be fixed during loop... see docs
588
- var arr2 = goog.isString(arr) ? arr.split('') : arr;
589
- for (var i = l - 1; i >= 0; i--) {
590
- if (i in arr2 && f.call(opt_obj, arr2[i], i, arr)) {
591
- return i;
592
- }
593
- }
594
- return -1;
595
- };
596
-
597
-
598
- /**
599
- * Whether the array contains the given object.
600
- * @param {goog.array.ArrayLike} arr The array to test for the presence of the
601
- * element.
602
- * @param {*} obj The object for which to test.
603
- * @return {boolean} true if obj is present.
604
- */
605
- goog.array.contains = function(arr, obj) {
606
- return goog.array.indexOf(arr, obj) >= 0;
607
- };
608
-
609
-
610
- /**
611
- * Whether the array is empty.
612
- * @param {goog.array.ArrayLike} arr The array to test.
613
- * @return {boolean} true if empty.
614
- */
615
- goog.array.isEmpty = function(arr) {
616
- return arr.length == 0;
617
- };
618
-
619
-
620
- /**
621
- * Clears the array.
622
- * @param {goog.array.ArrayLike} arr Array or array like object to clear.
623
- */
624
- goog.array.clear = function(arr) {
625
- // For non real arrays we don't have the magic length so we delete the
626
- // indices.
627
- if (!goog.isArray(arr)) {
628
- for (var i = arr.length - 1; i >= 0; i--) {
629
- delete arr[i];
630
- }
631
- }
632
- arr.length = 0;
633
- };
634
-
635
-
636
- /**
637
- * Pushes an item into an array, if it's not already in the array.
638
- * @param {Array<T>} arr Array into which to insert the item.
639
- * @param {T} obj Value to add.
640
- * @template T
641
- */
642
- goog.array.insert = function(arr, obj) {
643
- if (!goog.array.contains(arr, obj)) {
644
- arr.push(obj);
645
- }
646
- };
647
-
648
-
649
- /**
650
- * Inserts an object at the given index of the array.
651
- * @param {goog.array.ArrayLike} arr The array to modify.
652
- * @param {*} obj The object to insert.
653
- * @param {number=} opt_i The index at which to insert the object. If omitted,
654
- * treated as 0. A negative index is counted from the end of the array.
655
- */
656
- goog.array.insertAt = function(arr, obj, opt_i) {
657
- goog.array.splice(arr, opt_i, 0, obj);
658
- };
659
-
660
-
661
- /**
662
- * Inserts at the given index of the array, all elements of another array.
663
- * @param {goog.array.ArrayLike} arr The array to modify.
664
- * @param {goog.array.ArrayLike} elementsToAdd The array of elements to add.
665
- * @param {number=} opt_i The index at which to insert the object. If omitted,
666
- * treated as 0. A negative index is counted from the end of the array.
667
- */
668
- goog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) {
669
- goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd);
670
- };
671
-
672
-
673
- /**
674
- * Inserts an object into an array before a specified object.
675
- * @param {Array<T>} arr The array to modify.
676
- * @param {T} obj The object to insert.
677
- * @param {T=} opt_obj2 The object before which obj should be inserted. If obj2
678
- * is omitted or not found, obj is inserted at the end of the array.
679
- * @template T
680
- */
681
- goog.array.insertBefore = function(arr, obj, opt_obj2) {
682
- var i;
683
- if (arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) {
684
- arr.push(obj);
685
- } else {
686
- goog.array.insertAt(arr, obj, i);
687
- }
688
- };
689
-
690
-
691
- /**
692
- * Removes the first occurrence of a particular value from an array.
693
- * @param {Array<T>|goog.array.ArrayLike} arr Array from which to remove
694
- * value.
695
- * @param {T} obj Object to remove.
696
- * @return {boolean} True if an element was removed.
697
- * @template T
698
- */
699
- goog.array.remove = function(arr, obj) {
700
- var i = goog.array.indexOf(arr, obj);
701
- var rv;
702
- if ((rv = i >= 0)) {
703
- goog.array.removeAt(arr, i);
704
- }
705
- return rv;
706
- };
707
-
708
-
709
- /**
710
- * Removes from an array the element at index i
711
- * @param {goog.array.ArrayLike} arr Array or array like object from which to
712
- * remove value.
713
- * @param {number} i The index to remove.
714
- * @return {boolean} True if an element was removed.
715
- */
716
- goog.array.removeAt = function(arr, i) {
717
- goog.asserts.assert(arr.length != null);
718
-
719
- // use generic form of splice
720
- // splice returns the removed items and if successful the length of that
721
- // will be 1
722
- return goog.array.ARRAY_PROTOTYPE_.splice.call(arr, i, 1).length == 1;
723
- };
724
-
725
-
726
- /**
727
- * Removes the first value that satisfies the given condition.
728
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
729
- * like object over which to iterate.
730
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call
731
- * for every element. This function
732
- * takes 3 arguments (the element, the index and the array) and should
733
- * return a boolean.
734
- * @param {S=} opt_obj An optional "this" context for the function.
735
- * @return {boolean} True if an element was removed.
736
- * @template T,S
737
- */
738
- goog.array.removeIf = function(arr, f, opt_obj) {
739
- var i = goog.array.findIndex(arr, f, opt_obj);
740
- if (i >= 0) {
741
- goog.array.removeAt(arr, i);
742
- return true;
743
- }
744
- return false;
745
- };
746
-
747
-
748
- /**
749
- * Removes all values that satisfy the given condition.
750
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array
751
- * like object over which to iterate.
752
- * @param {?function(this:S, T, number, ?) : boolean} f The function to call
753
- * for every element. This function
754
- * takes 3 arguments (the element, the index and the array) and should
755
- * return a boolean.
756
- * @param {S=} opt_obj An optional "this" context for the function.
757
- * @return {number} The number of items removed
758
- * @template T,S
759
- */
760
- goog.array.removeAllIf = function(arr, f, opt_obj) {
761
- var removedCount = 0;
762
- goog.array.forEachRight(arr, function(val, index) {
763
- if (f.call(opt_obj, val, index, arr)) {
764
- if (goog.array.removeAt(arr, index)) {
765
- removedCount++;
766
- }
767
- }
768
- });
769
- return removedCount;
770
- };
771
-
772
-
773
- /**
774
- * Returns a new array that is the result of joining the arguments. If arrays
775
- * are passed then their items are added, however, if non-arrays are passed they
776
- * will be added to the return array as is.
777
- *
778
- * Note that ArrayLike objects will be added as is, rather than having their
779
- * items added.
780
- *
781
- * goog.array.concat([1, 2], [3, 4]) -> [1, 2, 3, 4]
782
- * goog.array.concat(0, [1, 2]) -> [0, 1, 2]
783
- * goog.array.concat([1, 2], null) -> [1, 2, null]
784
- *
785
- * There is bug in all current versions of IE (6, 7 and 8) where arrays created
786
- * in an iframe become corrupted soon (not immediately) after the iframe is
787
- * destroyed. This is common if loading data via goog.net.IframeIo, for example.
788
- * This corruption only affects the concat method which will start throwing
789
- * Catastrophic Errors (#-2147418113).
790
- *
791
- * See http://endoflow.com/scratch/corrupted-arrays.html for a test case.
792
- *
793
- * Internally goog.array should use this, so that all methods will continue to
794
- * work on these broken array objects.
795
- *
796
- * @param {...*} var_args Items to concatenate. Arrays will have each item
797
- * added, while primitives and objects will be added as is.
798
- * @return {!Array<?>} The new resultant array.
799
- */
800
- goog.array.concat = function(var_args) {
801
- return goog.array.ARRAY_PROTOTYPE_.concat.apply(
802
- goog.array.ARRAY_PROTOTYPE_, arguments);
803
- };
804
-
805
-
806
- /**
807
- * Returns a new array that contains the contents of all the arrays passed.
808
- * @param {...!Array<T>} var_args
809
- * @return {!Array<T>}
810
- * @template T
811
- */
812
- goog.array.join = function(var_args) {
813
- return goog.array.ARRAY_PROTOTYPE_.concat.apply(
814
- goog.array.ARRAY_PROTOTYPE_, arguments);
815
- };
816
-
817
-
818
- /**
819
- * Converts an object to an array.
820
- * @param {Array<T>|goog.array.ArrayLike} object The object to convert to an
821
- * array.
822
- * @return {!Array<T>} The object converted into an array. If object has a
823
- * length property, every property indexed with a non-negative number
824
- * less than length will be included in the result. If object does not
825
- * have a length property, an empty array will be returned.
826
- * @template T
827
- */
828
- goog.array.toArray = function(object) {
829
- var length = object.length;
830
-
831
- // If length is not a number the following it false. This case is kept for
832
- // backwards compatibility since there are callers that pass objects that are
833
- // not array like.
834
- if (length > 0) {
835
- var rv = new Array(length);
836
- for (var i = 0; i < length; i++) {
837
- rv[i] = object[i];
838
- }
839
- return rv;
840
- }
841
- return [];
842
- };
843
-
844
-
845
- /**
846
- * Does a shallow copy of an array.
847
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array-like object to
848
- * clone.
849
- * @return {!Array<T>} Clone of the input array.
850
- * @template T
851
- */
852
- goog.array.clone = goog.array.toArray;
853
-
854
-
855
- /**
856
- * Extends an array with another array, element, or "array like" object.
857
- * This function operates 'in-place', it does not create a new Array.
858
- *
859
- * Example:
860
- * var a = [];
861
- * goog.array.extend(a, [0, 1]);
862
- * a; // [0, 1]
863
- * goog.array.extend(a, 2);
864
- * a; // [0, 1, 2]
865
- *
866
- * @param {Array<VALUE>} arr1 The array to modify.
867
- * @param {...(Array<VALUE>|VALUE)} var_args The elements or arrays of elements
868
- * to add to arr1.
869
- * @template VALUE
870
- */
871
- goog.array.extend = function(arr1, var_args) {
872
- for (var i = 1; i < arguments.length; i++) {
873
- var arr2 = arguments[i];
874
- if (goog.isArrayLike(arr2)) {
875
- var len1 = arr1.length || 0;
876
- var len2 = arr2.length || 0;
877
- arr1.length = len1 + len2;
878
- for (var j = 0; j < len2; j++) {
879
- arr1[len1 + j] = arr2[j];
880
- }
881
- } else {
882
- arr1.push(arr2);
883
- }
884
- }
885
- };
886
-
887
-
888
- /**
889
- * Adds or removes elements from an array. This is a generic version of Array
890
- * splice. This means that it might work on other objects similar to arrays,
891
- * such as the arguments object.
892
- *
893
- * @param {Array<T>|goog.array.ArrayLike} arr The array to modify.
894
- * @param {number|undefined} index The index at which to start changing the
895
- * array. If not defined, treated as 0.
896
- * @param {number} howMany How many elements to remove (0 means no removal. A
897
- * value below 0 is treated as zero and so is any other non number. Numbers
898
- * are floored).
899
- * @param {...T} var_args Optional, additional elements to insert into the
900
- * array.
901
- * @return {!Array<T>} the removed elements.
902
- * @template T
903
- */
904
- goog.array.splice = function(arr, index, howMany, var_args) {
905
- goog.asserts.assert(arr.length != null);
906
-
907
- return goog.array.ARRAY_PROTOTYPE_.splice.apply(
908
- arr, goog.array.slice(arguments, 1));
909
- };
910
-
911
-
912
- /**
913
- * Returns a new array from a segment of an array. This is a generic version of
914
- * Array slice. This means that it might work on other objects similar to
915
- * arrays, such as the arguments object.
916
- *
917
- * @param {Array<T>|goog.array.ArrayLike} arr The array from
918
- * which to copy a segment.
919
- * @param {number} start The index of the first element to copy.
920
- * @param {number=} opt_end The index after the last element to copy.
921
- * @return {!Array<T>} A new array containing the specified segment of the
922
- * original array.
923
- * @template T
924
- */
925
- goog.array.slice = function(arr, start, opt_end) {
926
- goog.asserts.assert(arr.length != null);
927
-
928
- // passing 1 arg to slice is not the same as passing 2 where the second is
929
- // null or undefined (in that case the second argument is treated as 0).
930
- // we could use slice on the arguments object and then use apply instead of
931
- // testing the length
932
- if (arguments.length <= 2) {
933
- return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start);
934
- } else {
935
- return goog.array.ARRAY_PROTOTYPE_.slice.call(arr, start, opt_end);
936
- }
937
- };
938
-
939
-
940
- /**
941
- * Removes all duplicates from an array (retaining only the first
942
- * occurrence of each array element). This function modifies the
943
- * array in place and doesn't change the order of the non-duplicate items.
944
- *
945
- * For objects, duplicates are identified as having the same unique ID as
946
- * defined by {@link goog.getUid}.
947
- *
948
- * Alternatively you can specify a custom hash function that returns a unique
949
- * value for each item in the array it should consider unique.
950
- *
951
- * Runtime: N,
952
- * Worstcase space: 2N (no dupes)
953
- *
954
- * @param {Array<T>|goog.array.ArrayLike} arr The array from which to remove
955
- * duplicates.
956
- * @param {Array=} opt_rv An optional array in which to return the results,
957
- * instead of performing the removal inplace. If specified, the original
958
- * array will remain unchanged.
959
- * @param {function(T):string=} opt_hashFn An optional function to use to
960
- * apply to every item in the array. This function should return a unique
961
- * value for each item in the array it should consider unique.
962
- * @template T
963
- */
964
- goog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) {
965
- var returnArray = opt_rv || arr;
966
- var defaultHashFn = function(item) {
967
- // Prefix each type with a single character representing the type to
968
- // prevent conflicting keys (e.g. true and 'true').
969
- return goog.isObject(current) ? 'o' + goog.getUid(current) :
970
- (typeof current).charAt(0) + current;
971
- };
972
- var hashFn = opt_hashFn || defaultHashFn;
973
-
974
- var seen = {}, cursorInsert = 0, cursorRead = 0;
975
- while (cursorRead < arr.length) {
976
- var current = arr[cursorRead++];
977
- var key = hashFn(current);
978
- if (!Object.prototype.hasOwnProperty.call(seen, key)) {
979
- seen[key] = true;
980
- returnArray[cursorInsert++] = current;
981
- }
982
- }
983
- returnArray.length = cursorInsert;
984
- };
985
-
986
-
987
- /**
988
- * Searches the specified array for the specified target using the binary
989
- * search algorithm. If no opt_compareFn is specified, elements are compared
990
- * using <code>goog.array.defaultCompare</code>, which compares the elements
991
- * using the built in < and > operators. This will produce the expected
992
- * behavior for homogeneous arrays of String(s) and Number(s). The array
993
- * specified <b>must</b> be sorted in ascending order (as defined by the
994
- * comparison function). If the array is not sorted, results are undefined.
995
- * If the array contains multiple instances of the specified target value, any
996
- * of these instances may be found.
997
- *
998
- * Runtime: O(log n)
999
- *
1000
- * @param {Array<VALUE>|goog.array.ArrayLike} arr The array to be searched.
1001
- * @param {TARGET} target The sought value.
1002
- * @param {function(TARGET, VALUE): number=} opt_compareFn Optional comparison
1003
- * function by which the array is ordered. Should take 2 arguments to
1004
- * compare, and return a negative number, zero, or a positive number
1005
- * depending on whether the first argument is less than, equal to, or
1006
- * greater than the second.
1007
- * @return {number} Lowest index of the target value if found, otherwise
1008
- * (-(insertion point) - 1). The insertion point is where the value should
1009
- * be inserted into arr to preserve the sorted property. Return value >= 0
1010
- * iff target is found.
1011
- * @template TARGET, VALUE
1012
- */
1013
- goog.array.binarySearch = function(arr, target, opt_compareFn) {
1014
- return goog.array.binarySearch_(arr,
1015
- opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,
1016
- target);
1017
- };
1018
-
1019
-
1020
- /**
1021
- * Selects an index in the specified array using the binary search algorithm.
1022
- * The evaluator receives an element and determines whether the desired index
1023
- * is before, at, or after it. The evaluator must be consistent (formally,
1024
- * goog.array.map(goog.array.map(arr, evaluator, opt_obj), goog.math.sign)
1025
- * must be monotonically non-increasing).
1026
- *
1027
- * Runtime: O(log n)
1028
- *
1029
- * @param {Array<VALUE>|goog.array.ArrayLike} arr The array to be searched.
1030
- * @param {function(this:THIS, VALUE, number, ?): number} evaluator
1031
- * Evaluator function that receives 3 arguments (the element, the index and
1032
- * the array). Should return a negative number, zero, or a positive number
1033
- * depending on whether the desired index is before, at, or after the
1034
- * element passed to it.
1035
- * @param {THIS=} opt_obj The object to be used as the value of 'this'
1036
- * within evaluator.
1037
- * @return {number} Index of the leftmost element matched by the evaluator, if
1038
- * such exists; otherwise (-(insertion point) - 1). The insertion point is
1039
- * the index of the first element for which the evaluator returns negative,
1040
- * or arr.length if no such element exists. The return value is non-negative
1041
- * iff a match is found.
1042
- * @template THIS, VALUE
1043
- */
1044
- goog.array.binarySelect = function(arr, evaluator, opt_obj) {
1045
- return goog.array.binarySearch_(arr, evaluator, true /* isEvaluator */,
1046
- undefined /* opt_target */, opt_obj);
1047
- };
1048
-
1049
-
1050
- /**
1051
- * Implementation of a binary search algorithm which knows how to use both
1052
- * comparison functions and evaluators. If an evaluator is provided, will call
1053
- * the evaluator with the given optional data object, conforming to the
1054
- * interface defined in binarySelect. Otherwise, if a comparison function is
1055
- * provided, will call the comparison function against the given data object.
1056
- *
1057
- * This implementation purposefully does not use goog.bind or goog.partial for
1058
- * performance reasons.
1059
- *
1060
- * Runtime: O(log n)
1061
- *
1062
- * @param {Array<VALUE>|goog.array.ArrayLike} arr The array to be searched.
1063
- * @param {function(TARGET, VALUE): number|
1064
- * function(this:THIS, VALUE, number, ?): number} compareFn Either an
1065
- * evaluator or a comparison function, as defined by binarySearch
1066
- * and binarySelect above.
1067
- * @param {boolean} isEvaluator Whether the function is an evaluator or a
1068
- * comparison function.
1069
- * @param {TARGET=} opt_target If the function is a comparison function, then
1070
- * this is the target to binary search for.
1071
- * @param {THIS=} opt_selfObj If the function is an evaluator, this is an
1072
- * optional this object for the evaluator.
1073
- * @return {number} Lowest index of the target value if found, otherwise
1074
- * (-(insertion point) - 1). The insertion point is where the value should
1075
- * be inserted into arr to preserve the sorted property. Return value >= 0
1076
- * iff target is found.
1077
- * @template THIS, VALUE, TARGET
1078
- * @private
1079
- */
1080
- goog.array.binarySearch_ = function(arr, compareFn, isEvaluator, opt_target,
1081
- opt_selfObj) {
1082
- var left = 0; // inclusive
1083
- var right = arr.length; // exclusive
1084
- var found;
1085
- while (left < right) {
1086
- var middle = (left + right) >> 1;
1087
- var compareResult;
1088
- if (isEvaluator) {
1089
- compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);
1090
- } else {
1091
- compareResult = compareFn(opt_target, arr[middle]);
1092
- }
1093
- if (compareResult > 0) {
1094
- left = middle + 1;
1095
- } else {
1096
- right = middle;
1097
- // We are looking for the lowest index so we can't return immediately.
1098
- found = !compareResult;
1099
- }
1100
- }
1101
- // left is the index if found, or the insertion point otherwise.
1102
- // ~left is a shorthand for -left - 1.
1103
- return found ? left : ~left;
1104
- };
1105
-
1106
-
1107
- /**
1108
- * Sorts the specified array into ascending order. If no opt_compareFn is
1109
- * specified, elements are compared using
1110
- * <code>goog.array.defaultCompare</code>, which compares the elements using
1111
- * the built in < and > operators. This will produce the expected behavior
1112
- * for homogeneous arrays of String(s) and Number(s), unlike the native sort,
1113
- * but will give unpredictable results for heterogenous lists of strings and
1114
- * numbers with different numbers of digits.
1115
- *
1116
- * This sort is not guaranteed to be stable.
1117
- *
1118
- * Runtime: Same as <code>Array.prototype.sort</code>
1119
- *
1120
- * @param {Array<T>} arr The array to be sorted.
1121
- * @param {?function(T,T):number=} opt_compareFn Optional comparison
1122
- * function by which the
1123
- * array is to be ordered. Should take 2 arguments to compare, and return a
1124
- * negative number, zero, or a positive number depending on whether the
1125
- * first argument is less than, equal to, or greater than the second.
1126
- * @template T
1127
- */
1128
- goog.array.sort = function(arr, opt_compareFn) {
1129
- // TODO(arv): Update type annotation since null is not accepted.
1130
- arr.sort(opt_compareFn || goog.array.defaultCompare);
1131
- };
1132
-
1133
-
1134
- /**
1135
- * Sorts the specified array into ascending order in a stable way. If no
1136
- * opt_compareFn is specified, elements are compared using
1137
- * <code>goog.array.defaultCompare</code>, which compares the elements using
1138
- * the built in < and > operators. This will produce the expected behavior
1139
- * for homogeneous arrays of String(s) and Number(s).
1140
- *
1141
- * Runtime: Same as <code>Array.prototype.sort</code>, plus an additional
1142
- * O(n) overhead of copying the array twice.
1143
- *
1144
- * @param {Array<T>} arr The array to be sorted.
1145
- * @param {?function(T, T): number=} opt_compareFn Optional comparison function
1146
- * by which the array is to be ordered. Should take 2 arguments to compare,
1147
- * and return a negative number, zero, or a positive number depending on
1148
- * whether the first argument is less than, equal to, or greater than the
1149
- * second.
1150
- * @template T
1151
- */
1152
- goog.array.stableSort = function(arr, opt_compareFn) {
1153
- for (var i = 0; i < arr.length; i++) {
1154
- arr[i] = {index: i, value: arr[i]};
1155
- }
1156
- var valueCompareFn = opt_compareFn || goog.array.defaultCompare;
1157
- function stableCompareFn(obj1, obj2) {
1158
- return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;
1159
- };
1160
- goog.array.sort(arr, stableCompareFn);
1161
- for (var i = 0; i < arr.length; i++) {
1162
- arr[i] = arr[i].value;
1163
- }
1164
- };
1165
-
1166
-
1167
- /**
1168
- * Sort the specified array into ascending order based on item keys
1169
- * returned by the specified key function.
1170
- * If no opt_compareFn is specified, the keys are compared in ascending order
1171
- * using <code>goog.array.defaultCompare</code>.
1172
- *
1173
- * Runtime: O(S(f(n)), where S is runtime of <code>goog.array.sort</code>
1174
- * and f(n) is runtime of the key function.
1175
- *
1176
- * @param {Array<T>} arr The array to be sorted.
1177
- * @param {function(T): K} keyFn Function taking array element and returning
1178
- * a key used for sorting this element.
1179
- * @param {?function(K, K): number=} opt_compareFn Optional comparison function
1180
- * by which the keys are to be ordered. Should take 2 arguments to compare,
1181
- * and return a negative number, zero, or a positive number depending on
1182
- * whether the first argument is less than, equal to, or greater than the
1183
- * second.
1184
- * @template T
1185
- * @template K
1186
- */
1187
- goog.array.sortByKey = function(arr, keyFn, opt_compareFn) {
1188
- var keyCompareFn = opt_compareFn || goog.array.defaultCompare;
1189
- goog.array.sort(arr, function(a, b) {
1190
- return keyCompareFn(keyFn(a), keyFn(b));
1191
- });
1192
- };
1193
-
1194
-
1195
- /**
1196
- * Sorts an array of objects by the specified object key and compare
1197
- * function. If no compare function is provided, the key values are
1198
- * compared in ascending order using <code>goog.array.defaultCompare</code>.
1199
- * This won't work for keys that get renamed by the compiler. So use
1200
- * {'foo': 1, 'bar': 2} rather than {foo: 1, bar: 2}.
1201
- * @param {Array<Object>} arr An array of objects to sort.
1202
- * @param {string} key The object key to sort by.
1203
- * @param {Function=} opt_compareFn The function to use to compare key
1204
- * values.
1205
- */
1206
- goog.array.sortObjectsByKey = function(arr, key, opt_compareFn) {
1207
- goog.array.sortByKey(arr,
1208
- function(obj) { return obj[key]; },
1209
- opt_compareFn);
1210
- };
1211
-
1212
-
1213
- /**
1214
- * Tells if the array is sorted.
1215
- * @param {!Array<T>} arr The array.
1216
- * @param {?function(T,T):number=} opt_compareFn Function to compare the
1217
- * array elements.
1218
- * Should take 2 arguments to compare, and return a negative number, zero,
1219
- * or a positive number depending on whether the first argument is less
1220
- * than, equal to, or greater than the second.
1221
- * @param {boolean=} opt_strict If true no equal elements are allowed.
1222
- * @return {boolean} Whether the array is sorted.
1223
- * @template T
1224
- */
1225
- goog.array.isSorted = function(arr, opt_compareFn, opt_strict) {
1226
- var compare = opt_compareFn || goog.array.defaultCompare;
1227
- for (var i = 1; i < arr.length; i++) {
1228
- var compareResult = compare(arr[i - 1], arr[i]);
1229
- if (compareResult > 0 || compareResult == 0 && opt_strict) {
1230
- return false;
1231
- }
1232
- }
1233
- return true;
1234
- };
1235
-
1236
-
1237
- /**
1238
- * Compares two arrays for equality. Two arrays are considered equal if they
1239
- * have the same length and their corresponding elements are equal according to
1240
- * the comparison function.
1241
- *
1242
- * @param {goog.array.ArrayLike} arr1 The first array to compare.
1243
- * @param {goog.array.ArrayLike} arr2 The second array to compare.
1244
- * @param {Function=} opt_equalsFn Optional comparison function.
1245
- * Should take 2 arguments to compare, and return true if the arguments
1246
- * are equal. Defaults to {@link goog.array.defaultCompareEquality} which
1247
- * compares the elements using the built-in '===' operator.
1248
- * @return {boolean} Whether the two arrays are equal.
1249
- */
1250
- goog.array.equals = function(arr1, arr2, opt_equalsFn) {
1251
- if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) ||
1252
- arr1.length != arr2.length) {
1253
- return false;
1254
- }
1255
- var l = arr1.length;
1256
- var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;
1257
- for (var i = 0; i < l; i++) {
1258
- if (!equalsFn(arr1[i], arr2[i])) {
1259
- return false;
1260
- }
1261
- }
1262
- return true;
1263
- };
1264
-
1265
-
1266
- /**
1267
- * 3-way array compare function.
1268
- * @param {!Array<VALUE>|!goog.array.ArrayLike} arr1 The first array to
1269
- * compare.
1270
- * @param {!Array<VALUE>|!goog.array.ArrayLike} arr2 The second array to
1271
- * compare.
1272
- * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
1273
- * function by which the array is to be ordered. Should take 2 arguments to
1274
- * compare, and return a negative number, zero, or a positive number
1275
- * depending on whether the first argument is less than, equal to, or
1276
- * greater than the second.
1277
- * @return {number} Negative number, zero, or a positive number depending on
1278
- * whether the first argument is less than, equal to, or greater than the
1279
- * second.
1280
- * @template VALUE
1281
- */
1282
- goog.array.compare3 = function(arr1, arr2, opt_compareFn) {
1283
- var compare = opt_compareFn || goog.array.defaultCompare;
1284
- var l = Math.min(arr1.length, arr2.length);
1285
- for (var i = 0; i < l; i++) {
1286
- var result = compare(arr1[i], arr2[i]);
1287
- if (result != 0) {
1288
- return result;
1289
- }
1290
- }
1291
- return goog.array.defaultCompare(arr1.length, arr2.length);
1292
- };
1293
-
1294
-
1295
- /**
1296
- * Compares its two arguments for order, using the built in < and >
1297
- * operators.
1298
- * @param {VALUE} a The first object to be compared.
1299
- * @param {VALUE} b The second object to be compared.
1300
- * @return {number} A negative number, zero, or a positive number as the first
1301
- * argument is less than, equal to, or greater than the second,
1302
- * respectively.
1303
- * @template VALUE
1304
- */
1305
- goog.array.defaultCompare = function(a, b) {
1306
- return a > b ? 1 : a < b ? -1 : 0;
1307
- };
1308
-
1309
-
1310
- /**
1311
- * Compares its two arguments for inverse order, using the built in < and >
1312
- * operators.
1313
- * @param {VALUE} a The first object to be compared.
1314
- * @param {VALUE} b The second object to be compared.
1315
- * @return {number} A negative number, zero, or a positive number as the first
1316
- * argument is greater than, equal to, or less than the second,
1317
- * respectively.
1318
- * @template VALUE
1319
- */
1320
- goog.array.inverseDefaultCompare = function(a, b) {
1321
- return -goog.array.defaultCompare(a, b);
1322
- };
1323
-
1324
-
1325
- /**
1326
- * Compares its two arguments for equality, using the built in === operator.
1327
- * @param {*} a The first object to compare.
1328
- * @param {*} b The second object to compare.
1329
- * @return {boolean} True if the two arguments are equal, false otherwise.
1330
- */
1331
- goog.array.defaultCompareEquality = function(a, b) {
1332
- return a === b;
1333
- };
1334
-
1335
-
1336
- /**
1337
- * Inserts a value into a sorted array. The array is not modified if the
1338
- * value is already present.
1339
- * @param {Array<VALUE>|goog.array.ArrayLike} array The array to modify.
1340
- * @param {VALUE} value The object to insert.
1341
- * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
1342
- * function by which the array is ordered. Should take 2 arguments to
1343
- * compare, and return a negative number, zero, or a positive number
1344
- * depending on whether the first argument is less than, equal to, or
1345
- * greater than the second.
1346
- * @return {boolean} True if an element was inserted.
1347
- * @template VALUE
1348
- */
1349
- goog.array.binaryInsert = function(array, value, opt_compareFn) {
1350
- var index = goog.array.binarySearch(array, value, opt_compareFn);
1351
- if (index < 0) {
1352
- goog.array.insertAt(array, value, -(index + 1));
1353
- return true;
1354
- }
1355
- return false;
1356
- };
1357
-
1358
-
1359
- /**
1360
- * Removes a value from a sorted array.
1361
- * @param {!Array<VALUE>|!goog.array.ArrayLike} array The array to modify.
1362
- * @param {VALUE} value The object to remove.
1363
- * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison
1364
- * function by which the array is ordered. Should take 2 arguments to
1365
- * compare, and return a negative number, zero, or a positive number
1366
- * depending on whether the first argument is less than, equal to, or
1367
- * greater than the second.
1368
- * @return {boolean} True if an element was removed.
1369
- * @template VALUE
1370
- */
1371
- goog.array.binaryRemove = function(array, value, opt_compareFn) {
1372
- var index = goog.array.binarySearch(array, value, opt_compareFn);
1373
- return (index >= 0) ? goog.array.removeAt(array, index) : false;
1374
- };
1375
-
1376
-
1377
- /**
1378
- * Splits an array into disjoint buckets according to a splitting function.
1379
- * @param {Array<T>} array The array.
1380
- * @param {function(this:S, T,number,Array<T>):?} sorter Function to call for
1381
- * every element. This takes 3 arguments (the element, the index and the
1382
- * array) and must return a valid object key (a string, number, etc), or
1383
- * undefined, if that object should not be placed in a bucket.
1384
- * @param {S=} opt_obj The object to be used as the value of 'this' within
1385
- * sorter.
1386
- * @return {!Object} An object, with keys being all of the unique return values
1387
- * of sorter, and values being arrays containing the items for
1388
- * which the splitter returned that key.
1389
- * @template T,S
1390
- */
1391
- goog.array.bucket = function(array, sorter, opt_obj) {
1392
- var buckets = {};
1393
-
1394
- for (var i = 0; i < array.length; i++) {
1395
- var value = array[i];
1396
- var key = sorter.call(opt_obj, value, i, array);
1397
- if (goog.isDef(key)) {
1398
- // Push the value to the right bucket, creating it if necessary.
1399
- var bucket = buckets[key] || (buckets[key] = []);
1400
- bucket.push(value);
1401
- }
1402
- }
1403
-
1404
- return buckets;
1405
- };
1406
-
1407
-
1408
- /**
1409
- * Creates a new object built from the provided array and the key-generation
1410
- * function.
1411
- * @param {Array<T>|goog.array.ArrayLike} arr Array or array like object over
1412
- * which to iterate whose elements will be the values in the new object.
1413
- * @param {?function(this:S, T, number, ?) : string} keyFunc The function to
1414
- * call for every element. This function takes 3 arguments (the element, the
1415
- * index and the array) and should return a string that will be used as the
1416
- * key for the element in the new object. If the function returns the same
1417
- * key for more than one element, the value for that key is
1418
- * implementation-defined.
1419
- * @param {S=} opt_obj The object to be used as the value of 'this'
1420
- * within keyFunc.
1421
- * @return {!Object<T>} The new object.
1422
- * @template T,S
1423
- */
1424
- goog.array.toObject = function(arr, keyFunc, opt_obj) {
1425
- var ret = {};
1426
- goog.array.forEach(arr, function(element, index) {
1427
- ret[keyFunc.call(opt_obj, element, index, arr)] = element;
1428
- });
1429
- return ret;
1430
- };
1431
-
1432
-
1433
- /**
1434
- * Creates a range of numbers in an arithmetic progression.
1435
- *
1436
- * Range takes 1, 2, or 3 arguments:
1437
- * <pre>
1438
- * range(5) is the same as range(0, 5, 1) and produces [0, 1, 2, 3, 4]
1439
- * range(2, 5) is the same as range(2, 5, 1) and produces [2, 3, 4]
1440
- * range(-2, -5, -1) produces [-2, -3, -4]
1441
- * range(-2, -5, 1) produces [], since stepping by 1 wouldn't ever reach -5.
1442
- * </pre>
1443
- *
1444
- * @param {number} startOrEnd The starting value of the range if an end argument
1445
- * is provided. Otherwise, the start value is 0, and this is the end value.
1446
- * @param {number=} opt_end The optional end value of the range.
1447
- * @param {number=} opt_step The step size between range values. Defaults to 1
1448
- * if opt_step is undefined or 0.
1449
- * @return {!Array<number>} An array of numbers for the requested range. May be
1450
- * an empty array if adding the step would not converge toward the end
1451
- * value.
1452
- */
1453
- goog.array.range = function(startOrEnd, opt_end, opt_step) {
1454
- var array = [];
1455
- var start = 0;
1456
- var end = startOrEnd;
1457
- var step = opt_step || 1;
1458
- if (opt_end !== undefined) {
1459
- start = startOrEnd;
1460
- end = opt_end;
1461
- }
1462
-
1463
- if (step * (end - start) < 0) {
1464
- // Sign mismatch: start + step will never reach the end value.
1465
- return [];
1466
- }
1467
-
1468
- if (step > 0) {
1469
- for (var i = start; i < end; i += step) {
1470
- array.push(i);
1471
- }
1472
- } else {
1473
- for (var i = start; i > end; i += step) {
1474
- array.push(i);
1475
- }
1476
- }
1477
- return array;
1478
- };
1479
-
1480
-
1481
- /**
1482
- * Returns an array consisting of the given value repeated N times.
1483
- *
1484
- * @param {VALUE} value The value to repeat.
1485
- * @param {number} n The repeat count.
1486
- * @return {!Array<VALUE>} An array with the repeated value.
1487
- * @template VALUE
1488
- */
1489
- goog.array.repeat = function(value, n) {
1490
- var array = [];
1491
- for (var i = 0; i < n; i++) {
1492
- array[i] = value;
1493
- }
1494
- return array;
1495
- };
1496
-
1497
-
1498
- /**
1499
- * Returns an array consisting of every argument with all arrays
1500
- * expanded in-place recursively.
1501
- *
1502
- * @param {...*} var_args The values to flatten.
1503
- * @return {!Array<?>} An array containing the flattened values.
1504
- */
1505
- goog.array.flatten = function(var_args) {
1506
- var CHUNK_SIZE = 8192;
1507
-
1508
- var result = [];
1509
- for (var i = 0; i < arguments.length; i++) {
1510
- var element = arguments[i];
1511
- if (goog.isArray(element)) {
1512
- for (var c = 0; c < element.length; c += CHUNK_SIZE) {
1513
- var chunk = goog.array.slice(element, c, c + CHUNK_SIZE);
1514
- var recurseResult = goog.array.flatten.apply(null, chunk);
1515
- for (var r = 0; r < recurseResult.length; r++) {
1516
- result.push(recurseResult[r]);
1517
- }
1518
- }
1519
- } else {
1520
- result.push(element);
1521
- }
1522
- }
1523
- return result;
1524
- };
1525
-
1526
-
1527
- /**
1528
- * Rotates an array in-place. After calling this method, the element at
1529
- * index i will be the element previously at index (i - n) %
1530
- * array.length, for all values of i between 0 and array.length - 1,
1531
- * inclusive.
1532
- *
1533
- * For example, suppose list comprises [t, a, n, k, s]. After invoking
1534
- * rotate(array, 1) (or rotate(array, -4)), array will comprise [s, t, a, n, k].
1535
- *
1536
- * @param {!Array<T>} array The array to rotate.
1537
- * @param {number} n The amount to rotate.
1538
- * @return {!Array<T>} The array.
1539
- * @template T
1540
- */
1541
- goog.array.rotate = function(array, n) {
1542
- goog.asserts.assert(array.length != null);
1543
-
1544
- if (array.length) {
1545
- n %= array.length;
1546
- if (n > 0) {
1547
- goog.array.ARRAY_PROTOTYPE_.unshift.apply(array, array.splice(-n, n));
1548
- } else if (n < 0) {
1549
- goog.array.ARRAY_PROTOTYPE_.push.apply(array, array.splice(0, -n));
1550
- }
1551
- }
1552
- return array;
1553
- };
1554
-
1555
-
1556
- /**
1557
- * Moves one item of an array to a new position keeping the order of the rest
1558
- * of the items. Example use case: keeping a list of JavaScript objects
1559
- * synchronized with the corresponding list of DOM elements after one of the
1560
- * elements has been dragged to a new position.
1561
- * @param {!(Array|Arguments|{length:number})} arr The array to modify.
1562
- * @param {number} fromIndex Index of the item to move between 0 and
1563
- * {@code arr.length - 1}.
1564
- * @param {number} toIndex Target index between 0 and {@code arr.length - 1}.
1565
- */
1566
- goog.array.moveItem = function(arr, fromIndex, toIndex) {
1567
- goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length);
1568
- goog.asserts.assert(toIndex >= 0 && toIndex < arr.length);
1569
- // Remove 1 item at fromIndex.
1570
- var removedItems = goog.array.ARRAY_PROTOTYPE_.splice.call(arr, fromIndex, 1);
1571
- // Insert the removed item at toIndex.
1572
- goog.array.ARRAY_PROTOTYPE_.splice.call(arr, toIndex, 0, removedItems[0]);
1573
- // We don't use goog.array.insertAt and goog.array.removeAt, because they're
1574
- // significantly slower than splice.
1575
- };
1576
-
1577
-
1578
- /**
1579
- * Creates a new array for which the element at position i is an array of the
1580
- * ith element of the provided arrays. The returned array will only be as long
1581
- * as the shortest array provided; additional values are ignored. For example,
1582
- * the result of zipping [1, 2] and [3, 4, 5] is [[1,3], [2, 4]].
1583
- *
1584
- * This is similar to the zip() function in Python. See {@link
1585
- * http://docs.python.org/library/functions.html#zip}
1586
- *
1587
- * @param {...!goog.array.ArrayLike} var_args Arrays to be combined.
1588
- * @return {!Array<!Array<?>>} A new array of arrays created from
1589
- * provided arrays.
1590
- */
1591
- goog.array.zip = function(var_args) {
1592
- if (!arguments.length) {
1593
- return [];
1594
- }
1595
- var result = [];
1596
- for (var i = 0; true; i++) {
1597
- var value = [];
1598
- for (var j = 0; j < arguments.length; j++) {
1599
- var arr = arguments[j];
1600
- // If i is larger than the array length, this is the shortest array.
1601
- if (i >= arr.length) {
1602
- return result;
1603
- }
1604
- value.push(arr[i]);
1605
- }
1606
- result.push(value);
1607
- }
1608
- };
1609
-
1610
-
1611
- /**
1612
- * Shuffles the values in the specified array using the Fisher-Yates in-place
1613
- * shuffle (also known as the Knuth Shuffle). By default, calls Math.random()
1614
- * and so resets the state of that random number generator. Similarly, may reset
1615
- * the state of the any other specified random number generator.
1616
- *
1617
- * Runtime: O(n)
1618
- *
1619
- * @param {!Array<?>} arr The array to be shuffled.
1620
- * @param {function():number=} opt_randFn Optional random function to use for
1621
- * shuffling.
1622
- * Takes no arguments, and returns a random number on the interval [0, 1).
1623
- * Defaults to Math.random() using JavaScript's built-in Math library.
1624
- */
1625
- goog.array.shuffle = function(arr, opt_randFn) {
1626
- var randFn = opt_randFn || Math.random;
1627
-
1628
- for (var i = arr.length - 1; i > 0; i--) {
1629
- // Choose a random array index in [0, i] (inclusive with i).
1630
- var j = Math.floor(randFn() * (i + 1));
1631
-
1632
- var tmp = arr[i];
1633
- arr[i] = arr[j];
1634
- arr[j] = tmp;
1635
- }
1636
- };
1637
-
1638
-
1639
- /**
1640
- * Returns a new array of elements from arr, based on the indexes of elements
1641
- * provided by index_arr. For example, the result of index copying
1642
- * ['a', 'b', 'c'] with index_arr [1,0,0,2] is ['b', 'a', 'a', 'c'].
1643
- *
1644
- * @param {!Array<T>} arr The array to get a indexed copy from.
1645
- * @param {!Array<number>} index_arr An array of indexes to get from arr.
1646
- * @return {!Array<T>} A new array of elements from arr in index_arr order.
1647
- * @template T
1648
- */
1649
- goog.array.copyByIndex = function(arr, index_arr) {
1650
- var result = [];
1651
- goog.array.forEach(index_arr, function(index) {
1652
- result.push(arr[index]);
1653
- });
1654
- return result;
1655
- };