selenium-webdriver 2.48.2 → 2.53.3

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 (534) hide show
  1. package/CHANGES.md +116 -0
  2. package/NOTICE +1 -1
  3. package/README.md +59 -9
  4. package/builder.js +375 -358
  5. package/chrome.js +549 -586
  6. package/edge.js +378 -0
  7. package/error.js +9 -6
  8. package/example/google_search.js +1 -1
  9. package/example/google_search_generator.js +2 -4
  10. package/example/logging.js +6 -2
  11. package/example/sample.js +21 -0
  12. package/executors.js +11 -27
  13. package/firefox/binary.js +149 -98
  14. package/firefox/extension.js +15 -19
  15. package/firefox/index.js +256 -163
  16. package/firefox/profile.js +223 -243
  17. package/http/index.js +487 -81
  18. package/http/util.js +40 -36
  19. package/ie.js +288 -309
  20. package/index.js +34 -125
  21. package/io/exec.js +58 -39
  22. package/io/index.js +72 -60
  23. package/lib/README +4 -0
  24. package/lib/actions.js +596 -0
  25. package/lib/by.js +277 -0
  26. package/lib/capabilities.js +450 -0
  27. package/lib/{webdriver/command.js → command.js} +91 -72
  28. package/lib/{webdriver/button.js → devmode.js} +13 -8
  29. package/lib/error.js +690 -0
  30. package/lib/events.js +212 -0
  31. package/lib/firefox/amd64/libnoblur64.so +0 -0
  32. package/lib/firefox/i386/libnoblur.so +0 -0
  33. package/lib/firefox/webdriver.json +5 -1
  34. package/lib/firefox/webdriver.xpi +0 -0
  35. package/lib/{webdriver/key.js → input.js} +84 -2
  36. package/lib/logging.js +670 -0
  37. package/lib/{webdriver/promise.js → promise.js} +817 -644
  38. package/lib/safari/client.js +266 -214
  39. package/lib/session.js +80 -0
  40. package/lib/{webdriver/serializable.js → symbols.js} +16 -19
  41. package/lib/test/build.js +4 -4
  42. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  43. package/lib/test/data/click_tests/overlapping_elements.html +15 -4
  44. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  45. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  46. package/lib/test/data/hidden_partially.html +45 -0
  47. package/lib/test/data/readOnlyPage.html +1 -1
  48. package/lib/test/data/selectPage.html +18 -2
  49. package/lib/test/fileserver.js +3 -4
  50. package/lib/test/index.js +7 -3
  51. package/lib/test/resources.js +1 -1
  52. package/lib/until.js +376 -0
  53. package/lib/webdriver.js +2440 -0
  54. package/net/index.js +4 -0
  55. package/net/portprober.js +16 -12
  56. package/opera.js +295 -314
  57. package/package.json +6 -5
  58. package/phantomjs.js +144 -147
  59. package/proxy.js +10 -6
  60. package/remote/index.js +289 -238
  61. package/safari.js +326 -311
  62. package/test/chrome/options_test.js +11 -9
  63. package/test/element_finding_test.js +51 -13
  64. package/test/execute_script_test.js +17 -3
  65. package/test/firefox/firefox_test.js +0 -32
  66. package/test/http/http_test.js +671 -61
  67. package/test/http/util_test.js +25 -23
  68. package/test/io_test.js +67 -1
  69. package/test/lib/by_test.js +139 -0
  70. package/test/lib/capabilities_test.js +111 -0
  71. package/test/lib/error_test.js +325 -0
  72. package/test/lib/events_test.js +177 -0
  73. package/test/lib/logging_test.js +272 -0
  74. package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
  75. package/test/lib/promise_error_test.js +808 -0
  76. package/test/lib/promise_flow_test.js +2282 -0
  77. package/test/lib/promise_generator_test.js +308 -0
  78. package/test/lib/promise_test.js +996 -0
  79. package/test/lib/testutil.js +90 -0
  80. package/test/lib/until_test.js +400 -0
  81. package/test/lib/webdriver_test.js +2157 -0
  82. package/test/page_loading_test.js +7 -9
  83. package/test/remote_test.js +50 -3
  84. package/test/session_test.js +53 -0
  85. package/test/stale_element_test.js +2 -2
  86. package/test/testing/assert_test.js +374 -0
  87. package/test/testing/index_test.js +9 -11
  88. package/testing/assert.js +334 -17
  89. package/testing/index.js +12 -2
  90. package/_base.js +0 -200
  91. package/docs/Changes.html +0 -356
  92. package/docs/class_bot_Error.html +0 -15
  93. package/docs/class_webdriver_ActionSequence.html +0 -115
  94. package/docs/class_webdriver_Alert.html +0 -24
  95. package/docs/class_webdriver_AlertPromise.html +0 -92
  96. package/docs/class_webdriver_Capabilities.html +0 -60
  97. package/docs/class_webdriver_Command.html +0 -15
  98. package/docs/class_webdriver_EventEmitter.html +0 -35
  99. package/docs/class_webdriver_FileDetector.html +0 -21
  100. package/docs/class_webdriver_Locator.html +0 -12
  101. package/docs/class_webdriver_Serializable.html +0 -9
  102. package/docs/class_webdriver_Session.html +0 -13
  103. package/docs/class_webdriver_TouchSequence.html +0 -49
  104. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  105. package/docs/class_webdriver_WebDriver.html +0 -313
  106. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  107. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  108. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  109. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  110. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  111. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  112. package/docs/class_webdriver_WebElement.html +0 -223
  113. package/docs/class_webdriver_WebElementPromise.html +0 -274
  114. package/docs/class_webdriver_http_Executor.html +0 -22
  115. package/docs/class_webdriver_http_Request.html +0 -12
  116. package/docs/class_webdriver_http_Response.html +0 -13
  117. package/docs/class_webdriver_logging_Entry.html +0 -15
  118. package/docs/class_webdriver_logging_Level.html +0 -55
  119. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  120. package/docs/class_webdriver_logging_Logger.html +0 -119
  121. package/docs/class_webdriver_logging_Preferences.html +0 -8
  122. package/docs/class_webdriver_promise_CancellationError.html +0 -17
  123. package/docs/class_webdriver_promise_ControlFlow.html +0 -153
  124. package/docs/class_webdriver_promise_Deferred.html +0 -84
  125. package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
  126. package/docs/class_webdriver_promise_Promise.html +0 -75
  127. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  128. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  129. package/docs/class_webdriver_testing_Assertion.html +0 -99
  130. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  131. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  132. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  133. package/docs/class_webdriver_until_Condition.html +0 -7
  134. package/docs/dossier.css +0 -1
  135. package/docs/dossier.js +0 -86
  136. package/docs/enum_bot_ErrorCode.html +0 -3
  137. package/docs/enum_bot_Error_State.html +0 -2
  138. package/docs/enum_webdriver_Browser.html +0 -2
  139. package/docs/enum_webdriver_Button.html +0 -2
  140. package/docs/enum_webdriver_Capability.html +0 -33
  141. package/docs/enum_webdriver_CommandName.html +0 -3
  142. package/docs/enum_webdriver_Key.html +0 -12
  143. package/docs/enum_webdriver_logging_Type.html +0 -6
  144. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  145. package/docs/index.html +0 -125
  146. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  147. package/docs/interface_webdriver_http_Client.html +0 -10
  148. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  149. package/docs/module_selenium-webdriver.html +0 -23
  150. package/docs/module_selenium-webdriver__base.html +0 -23
  151. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  152. package/docs/module_selenium-webdriver_builder.html +0 -2
  153. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  154. package/docs/module_selenium-webdriver_chrome.html +0 -90
  155. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  156. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  157. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  158. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  159. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  160. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  161. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  162. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  163. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  164. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  165. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  166. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  167. package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
  168. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
  169. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  170. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  171. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  172. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  173. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  174. package/docs/module_selenium-webdriver_error.html +0 -4
  175. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  176. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  177. package/docs/module_selenium-webdriver_executors.html +0 -10
  178. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  179. package/docs/module_selenium-webdriver_firefox.html +0 -68
  180. package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
  181. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
  182. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
  183. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  184. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  185. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  186. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  187. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  188. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  189. package/docs/module_selenium-webdriver_http.html +0 -9
  190. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  191. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  192. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  193. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  194. package/docs/module_selenium-webdriver_http_util.html +0 -17
  195. package/docs/module_selenium-webdriver_ie.html +0 -11
  196. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  197. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  198. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  199. package/docs/module_selenium-webdriver_io.html +0 -37
  200. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  201. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  202. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  203. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  204. package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
  205. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  206. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  207. package/docs/module_selenium-webdriver_net.html +0 -7
  208. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  209. package/docs/module_selenium-webdriver_opera.html +0 -62
  210. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  211. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  212. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  213. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  214. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  215. package/docs/module_selenium-webdriver_proxy.html +0 -28
  216. package/docs/module_selenium-webdriver_remote.html +0 -8
  217. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  218. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  219. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
  220. package/docs/module_selenium-webdriver_safari.html +0 -9
  221. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  222. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  223. package/docs/module_selenium-webdriver_testing.html +0 -74
  224. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  225. package/docs/namespace_bot.html +0 -4
  226. package/docs/namespace_bot_json.html +0 -20
  227. package/docs/namespace_bot_response.html +0 -18
  228. package/docs/namespace_bot_userAgent.html +0 -33
  229. package/docs/namespace_webdriver.html +0 -30
  230. package/docs/namespace_webdriver_By.html +0 -56
  231. package/docs/namespace_webdriver_http.html +0 -6
  232. package/docs/namespace_webdriver_logging.html +0 -70
  233. package/docs/namespace_webdriver_promise.html +0 -688
  234. package/docs/namespace_webdriver_stacktrace.html +0 -17
  235. package/docs/namespace_webdriver_testing.html +0 -7
  236. package/docs/namespace_webdriver_testing_assert.html +0 -9
  237. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  238. package/docs/namespace_webdriver_until.html +0 -82
  239. package/docs/source/_base.js.src.html +0 -1
  240. package/docs/source/builder.js.src.html +0 -1
  241. package/docs/source/chrome.js.src.html +0 -1
  242. package/docs/source/error.js.src.html +0 -1
  243. package/docs/source/executors.js.src.html +0 -1
  244. package/docs/source/firefox/binary.js.src.html +0 -1
  245. package/docs/source/firefox/extension.js.src.html +0 -1
  246. package/docs/source/firefox/index.js.src.html +0 -1
  247. package/docs/source/firefox/profile.js.src.html +0 -1
  248. package/docs/source/http/index.js.src.html +0 -1
  249. package/docs/source/http/util.js.src.html +0 -1
  250. package/docs/source/ie.js.src.html +0 -1
  251. package/docs/source/index.js.src.html +0 -1
  252. package/docs/source/io/exec.js.src.html +0 -1
  253. package/docs/source/io/index.js.src.html +0 -1
  254. package/docs/source/lib/atoms/error.js.src.html +0 -1
  255. package/docs/source/lib/atoms/json.js.src.html +0 -1
  256. package/docs/source/lib/atoms/response.js.src.html +0 -1
  257. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  258. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  259. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  260. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  261. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  262. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  263. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  264. package/docs/source/lib/goog/base.js.src.html +0 -1
  265. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  266. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  267. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  268. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  269. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  270. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  271. package/docs/source/lib/goog/deps.js.src.html +0 -1
  272. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  273. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  274. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  275. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  276. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  277. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  278. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  279. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  280. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  282. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  283. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  284. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  285. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  286. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  287. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  288. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  289. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  290. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  291. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  292. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  293. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  294. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  295. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  296. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  297. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  298. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  299. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  300. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  301. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  302. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  303. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  304. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  305. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  306. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  307. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  308. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  309. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  310. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  311. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  312. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  313. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  314. package/docs/source/lib/goog/log/log.js.src.html +0 -1
  315. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  316. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  317. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  318. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  319. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  320. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  321. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  322. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  323. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  324. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  325. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  326. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  327. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  328. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  329. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  330. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  331. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  332. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  333. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  334. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  335. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  336. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  344. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  345. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  346. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  347. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  348. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  349. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  350. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  351. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  352. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  353. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  354. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  355. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  356. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  357. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  358. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  366. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  367. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  368. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  369. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  370. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  371. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  372. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  373. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  374. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  375. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  376. package/docs/source/net/index.js.src.html +0 -1
  377. package/docs/source/net/portprober.js.src.html +0 -1
  378. package/docs/source/opera.js.src.html +0 -1
  379. package/docs/source/phantomjs.js.src.html +0 -1
  380. package/docs/source/proxy.js.src.html +0 -1
  381. package/docs/source/remote/index.js.src.html +0 -1
  382. package/docs/source/safari.js.src.html +0 -1
  383. package/docs/source/testing/assert.js.src.html +0 -1
  384. package/docs/source/testing/index.js.src.html +0 -1
  385. package/docs/types.js +0 -1
  386. package/lib/atoms/error.js +0 -202
  387. package/lib/atoms/json.js +0 -80
  388. package/lib/atoms/response.js +0 -110
  389. package/lib/atoms/userAgent.js +0 -257
  390. package/lib/goog/LICENSE +0 -176
  391. package/lib/goog/array/array.js +0 -1654
  392. package/lib/goog/asserts/asserts.js +0 -365
  393. package/lib/goog/async/freelist.js +0 -88
  394. package/lib/goog/async/nexttick.js +0 -241
  395. package/lib/goog/async/run.js +0 -133
  396. package/lib/goog/async/workqueue.js +0 -139
  397. package/lib/goog/base.js +0 -2548
  398. package/lib/goog/debug/debug.js +0 -653
  399. package/lib/goog/debug/entrypointregistry.js +0 -158
  400. package/lib/goog/debug/error.js +0 -63
  401. package/lib/goog/debug/logbuffer.js +0 -148
  402. package/lib/goog/debug/logger.js +0 -873
  403. package/lib/goog/debug/logrecord.js +0 -242
  404. package/lib/goog/deps.js +0 -151
  405. package/lib/goog/disposable/disposable.js +0 -307
  406. package/lib/goog/disposable/idisposable.js +0 -45
  407. package/lib/goog/dom/browserfeature.js +0 -72
  408. package/lib/goog/dom/dom.js +0 -2991
  409. package/lib/goog/dom/nodetype.js +0 -48
  410. package/lib/goog/dom/safe.js +0 -347
  411. package/lib/goog/dom/tagname.js +0 -160
  412. package/lib/goog/dom/tags.js +0 -41
  413. package/lib/goog/dom/vendor.js +0 -96
  414. package/lib/goog/events/browserevent.js +0 -400
  415. package/lib/goog/events/browserfeature.js +0 -85
  416. package/lib/goog/events/event.js +0 -143
  417. package/lib/goog/events/eventid.js +0 -47
  418. package/lib/goog/events/events.js +0 -984
  419. package/lib/goog/events/eventtarget.js +0 -394
  420. package/lib/goog/events/eventtype.js +0 -237
  421. package/lib/goog/events/keycodes.js +0 -427
  422. package/lib/goog/events/listenable.js +0 -335
  423. package/lib/goog/events/listener.js +0 -131
  424. package/lib/goog/events/listenermap.js +0 -308
  425. package/lib/goog/fs/url.js +0 -109
  426. package/lib/goog/functions/functions.js +0 -442
  427. package/lib/goog/html/safehtml.js +0 -757
  428. package/lib/goog/html/safescript.js +0 -234
  429. package/lib/goog/html/safestyle.js +0 -442
  430. package/lib/goog/html/safestylesheet.js +0 -276
  431. package/lib/goog/html/safeurl.js +0 -398
  432. package/lib/goog/html/trustedresourceurl.js +0 -224
  433. package/lib/goog/html/uncheckedconversions.js +0 -232
  434. package/lib/goog/i18n/bidi.js +0 -908
  435. package/lib/goog/iter/iter.js +0 -1302
  436. package/lib/goog/json/json.js +0 -363
  437. package/lib/goog/labs/testing/assertthat.js +0 -58
  438. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  439. package/lib/goog/labs/testing/matcher.js +0 -80
  440. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  441. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  442. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  443. package/lib/goog/labs/useragent/browser.js +0 -341
  444. package/lib/goog/labs/useragent/engine.js +0 -160
  445. package/lib/goog/labs/useragent/platform.js +0 -160
  446. package/lib/goog/labs/useragent/util.js +0 -148
  447. package/lib/goog/log/log.js +0 -197
  448. package/lib/goog/math/box.js +0 -398
  449. package/lib/goog/math/coordinate.js +0 -268
  450. package/lib/goog/math/math.js +0 -451
  451. package/lib/goog/math/rect.js +0 -476
  452. package/lib/goog/math/size.js +0 -227
  453. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  454. package/lib/goog/net/xhrlike.js +0 -124
  455. package/lib/goog/net/xmlhttp.js +0 -246
  456. package/lib/goog/net/xmlhttpfactory.js +0 -67
  457. package/lib/goog/object/object.js +0 -686
  458. package/lib/goog/promise/promise.js +0 -1350
  459. package/lib/goog/promise/resolver.js +0 -48
  460. package/lib/goog/promise/thenable.js +0 -126
  461. package/lib/goog/reflect/reflect.js +0 -77
  462. package/lib/goog/string/const.js +0 -182
  463. package/lib/goog/string/string.js +0 -1599
  464. package/lib/goog/string/typedstring.js +0 -48
  465. package/lib/goog/structs/collection.js +0 -56
  466. package/lib/goog/structs/map.js +0 -457
  467. package/lib/goog/structs/set.js +0 -279
  468. package/lib/goog/structs/structs.js +0 -354
  469. package/lib/goog/style/style.js +0 -2037
  470. package/lib/goog/testing/asserts.js +0 -1278
  471. package/lib/goog/testing/events/events.js +0 -767
  472. package/lib/goog/testing/functionmock.js +0 -175
  473. package/lib/goog/testing/jsunit.js +0 -162
  474. package/lib/goog/testing/loosemock.js +0 -242
  475. package/lib/goog/testing/mock.js +0 -645
  476. package/lib/goog/testing/mockclock.js +0 -606
  477. package/lib/goog/testing/mockcontrol.js +0 -220
  478. package/lib/goog/testing/mockinterface.js +0 -45
  479. package/lib/goog/testing/mockmatchers.js +0 -400
  480. package/lib/goog/testing/objectpropertystring.js +0 -68
  481. package/lib/goog/testing/propertyreplacer.js +0 -262
  482. package/lib/goog/testing/recordfunction.js +0 -215
  483. package/lib/goog/testing/stacktrace.js +0 -594
  484. package/lib/goog/testing/strictmock.js +0 -130
  485. package/lib/goog/testing/testcase.js +0 -1629
  486. package/lib/goog/testing/testrunner.js +0 -440
  487. package/lib/goog/uri/uri.js +0 -1524
  488. package/lib/goog/uri/utils.js +0 -1064
  489. package/lib/goog/useragent/product.js +0 -183
  490. package/lib/goog/useragent/product_isversion.js +0 -144
  491. package/lib/goog/useragent/useragent.js +0 -572
  492. package/lib/webdriver/actionsequence.js +0 -356
  493. package/lib/webdriver/builder.js +0 -207
  494. package/lib/webdriver/capabilities.js +0 -412
  495. package/lib/webdriver/events.js +0 -179
  496. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  497. package/lib/webdriver/http/corsclient.js +0 -133
  498. package/lib/webdriver/http/http.js +0 -525
  499. package/lib/webdriver/http/xhrclient.js +0 -67
  500. package/lib/webdriver/locators.js +0 -257
  501. package/lib/webdriver/logging.js +0 -347
  502. package/lib/webdriver/session.js +0 -74
  503. package/lib/webdriver/stacktrace.js +0 -619
  504. package/lib/webdriver/test/builder_test.js +0 -53
  505. package/lib/webdriver/test/capabilities_test.js +0 -72
  506. package/lib/webdriver/test/events_test.js +0 -203
  507. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  508. package/lib/webdriver/test/http/http_test.js +0 -428
  509. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  510. package/lib/webdriver/test/locators_test.js +0 -59
  511. package/lib/webdriver/test/logging_test.js +0 -85
  512. package/lib/webdriver/test/promise_error_test.js +0 -892
  513. package/lib/webdriver/test/promise_flow_test.js +0 -2365
  514. package/lib/webdriver/test/promise_generator_test.js +0 -323
  515. package/lib/webdriver/test/promise_test.js +0 -2012
  516. package/lib/webdriver/test/stacktrace_test.js +0 -480
  517. package/lib/webdriver/test/test_bootstrap.js +0 -67
  518. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  519. package/lib/webdriver/test/testing/client_test.js +0 -88
  520. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  521. package/lib/webdriver/test/testutil.js +0 -209
  522. package/lib/webdriver/test/testutil_test.js +0 -104
  523. package/lib/webdriver/test/until_test.js +0 -411
  524. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  525. package/lib/webdriver/test/webdriver_test.js +0 -2369
  526. package/lib/webdriver/testing/asserts.js +0 -487
  527. package/lib/webdriver/testing/client.js +0 -179
  528. package/lib/webdriver/testing/jsunit.js +0 -363
  529. package/lib/webdriver/testing/testcase.js +0 -168
  530. package/lib/webdriver/testing/window.js +0 -244
  531. package/lib/webdriver/touchsequence.js +0 -248
  532. package/lib/webdriver/until.js +0 -412
  533. package/lib/webdriver/webdriver.js +0 -2511
  534. package/test/_base_test.js +0 -129
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>base.js</title><link href="../../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>lib/goog/base.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Copyright 2006 The Closure Library Authors. All Rights Reserved.<tr><td><a id="l2"></a><a href="#l2">2</a><td>//<tr><td><a id="l3"></a><a href="#l3">3</a><td>// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<tr><td><a id="l4"></a><a href="#l4">4</a><td>// you may not use this file except in compliance with the License.<tr><td><a id="l5"></a><a href="#l5">5</a><td>// You may obtain a copy of the License at<tr><td><a id="l6"></a><a href="#l6">6</a><td>//<tr><td><a id="l7"></a><a href="#l7">7</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// Unless required by applicable law or agreed to in writing, software<tr><td><a id="l10"></a><a href="#l10">10</a><td>// distributed under the License is distributed on an &quot;AS-IS&quot; BASIS,<tr><td><a id="l11"></a><a href="#l11">11</a><td>// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<tr><td><a id="l12"></a><a href="#l12">12</a><td>// See the License for the specific language governing permissions and<tr><td><a id="l13"></a><a href="#l13">13</a><td>// limitations under the License.<tr><td><a id="l14"></a><a href="#l14">14</a><td><tr><td><a id="l15"></a><a href="#l15">15</a><td>/**<tr><td><a id="l16"></a><a href="#l16">16</a><td> * @fileoverview Bootstrap for the Google JS Library (Closure).<tr><td><a id="l17"></a><a href="#l17">17</a><td> *<tr><td><a id="l18"></a><a href="#l18">18</a><td> * In uncompiled mode base.js will write out Closure&#39;s deps file, unless the<tr><td><a id="l19"></a><a href="#l19">19</a><td> * global &lt;code&gt;CLOSURE_NO_DEPS&lt;/code&gt; is set to true. This allows projects to<tr><td><a id="l20"></a><a href="#l20">20</a><td> * include their own deps file(s) from different locations.<tr><td><a id="l21"></a><a href="#l21">21</a><td> *<tr><td><a id="l22"></a><a href="#l22">22</a><td> * @author arv@google.com (Erik Arvidsson)<tr><td><a id="l23"></a><a href="#l23">23</a><td> *<tr><td><a id="l24"></a><a href="#l24">24</a><td> * @provideGoog<tr><td><a id="l25"></a><a href="#l25">25</a><td> */<tr><td><a id="l26"></a><a href="#l26">26</a><td><tr><td><a id="l27"></a><a href="#l27">27</a><td><tr><td><a id="l28"></a><a href="#l28">28</a><td>/**<tr><td><a id="l29"></a><a href="#l29">29</a><td> * @define {boolean} Overridden to true by the compiler when<tr><td><a id="l30"></a><a href="#l30">30</a><td> * --process_closure_primitives is specified.<tr><td><a id="l31"></a><a href="#l31">31</a><td> */<tr><td><a id="l32"></a><a href="#l32">32</a><td>var COMPILED = false;<tr><td><a id="l33"></a><a href="#l33">33</a><td><tr><td><a id="l34"></a><a href="#l34">34</a><td><tr><td><a id="l35"></a><a href="#l35">35</a><td>/**<tr><td><a id="l36"></a><a href="#l36">36</a><td> * Base namespace for the Closure library. Checks to see goog is already<tr><td><a id="l37"></a><a href="#l37">37</a><td> * defined in the current scope before assigning to prevent clobbering if<tr><td><a id="l38"></a><a href="#l38">38</a><td> * base.js is loaded more than once.<tr><td><a id="l39"></a><a href="#l39">39</a><td> *<tr><td><a id="l40"></a><a href="#l40">40</a><td> * @const<tr><td><a id="l41"></a><a href="#l41">41</a><td> */<tr><td><a id="l42"></a><a href="#l42">42</a><td>var goog = goog || {};<tr><td><a id="l43"></a><a href="#l43">43</a><td><tr><td><a id="l44"></a><a href="#l44">44</a><td><tr><td><a id="l45"></a><a href="#l45">45</a><td>/**<tr><td><a id="l46"></a><a href="#l46">46</a><td> * Reference to the global context. In most cases this will be &#39;window&#39;.<tr><td><a id="l47"></a><a href="#l47">47</a><td> */<tr><td><a id="l48"></a><a href="#l48">48</a><td>goog.global = this;<tr><td><a id="l49"></a><a href="#l49">49</a><td><tr><td><a id="l50"></a><a href="#l50">50</a><td><tr><td><a id="l51"></a><a href="#l51">51</a><td>/**<tr><td><a id="l52"></a><a href="#l52">52</a><td> * A hook for overriding the define values in uncompiled mode.<tr><td><a id="l53"></a><a href="#l53">53</a><td> *<tr><td><a id="l54"></a><a href="#l54">54</a><td> * In uncompiled mode, {@code CLOSURE_UNCOMPILED_DEFINES} may be defined before<tr><td><a id="l55"></a><a href="#l55">55</a><td> * loading base.js. If a key is defined in {@code CLOSURE_UNCOMPILED_DEFINES},<tr><td><a id="l56"></a><a href="#l56">56</a><td> * {@code goog.define} will use the value instead of the default value. This<tr><td><a id="l57"></a><a href="#l57">57</a><td> * allows flags to be overwritten without compilation (this is normally<tr><td><a id="l58"></a><a href="#l58">58</a><td> * accomplished with the compiler&#39;s &quot;define&quot; flag).<tr><td><a id="l59"></a><a href="#l59">59</a><td> *<tr><td><a id="l60"></a><a href="#l60">60</a><td> * Example:<tr><td><a id="l61"></a><a href="#l61">61</a><td> * &lt;pre&gt;<tr><td><a id="l62"></a><a href="#l62">62</a><td> * var CLOSURE_UNCOMPILED_DEFINES = {&#39;goog.DEBUG&#39;: false};<tr><td><a id="l63"></a><a href="#l63">63</a><td> * &lt;/pre&gt;<tr><td><a id="l64"></a><a href="#l64">64</a><td> *<tr><td><a id="l65"></a><a href="#l65">65</a><td> * @type {Object&lt;string, (string|number|boolean)&gt;|undefined}<tr><td><a id="l66"></a><a href="#l66">66</a><td> */<tr><td><a id="l67"></a><a href="#l67">67</a><td>goog.global.CLOSURE_UNCOMPILED_DEFINES;<tr><td><a id="l68"></a><a href="#l68">68</a><td><tr><td><a id="l69"></a><a href="#l69">69</a><td><tr><td><a id="l70"></a><a href="#l70">70</a><td>/**<tr><td><a id="l71"></a><a href="#l71">71</a><td> * A hook for overriding the define values in uncompiled or compiled mode,<tr><td><a id="l72"></a><a href="#l72">72</a><td> * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code. In<tr><td><a id="l73"></a><a href="#l73">73</a><td> * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence.<tr><td><a id="l74"></a><a href="#l74">74</a><td> *<tr><td><a id="l75"></a><a href="#l75">75</a><td> * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or<tr><td><a id="l76"></a><a href="#l76">76</a><td> * string literals or the compiler will emit an error.<tr><td><a id="l77"></a><a href="#l77">77</a><td> *<tr><td><a id="l78"></a><a href="#l78">78</a><td> * While any @define value may be set, only those set with goog.define will be<tr><td><a id="l79"></a><a href="#l79">79</a><td> * effective for uncompiled code.<tr><td><a id="l80"></a><a href="#l80">80</a><td> *<tr><td><a id="l81"></a><a href="#l81">81</a><td> * Example:<tr><td><a id="l82"></a><a href="#l82">82</a><td> * &lt;pre&gt;<tr><td><a id="l83"></a><a href="#l83">83</a><td> * var CLOSURE_DEFINES = {&#39;goog.DEBUG&#39;: false} ;<tr><td><a id="l84"></a><a href="#l84">84</a><td> * &lt;/pre&gt;<tr><td><a id="l85"></a><a href="#l85">85</a><td> *<tr><td><a id="l86"></a><a href="#l86">86</a><td> * @type {Object&lt;string, (string|number|boolean)&gt;|undefined}<tr><td><a id="l87"></a><a href="#l87">87</a><td> */<tr><td><a id="l88"></a><a href="#l88">88</a><td>goog.global.CLOSURE_DEFINES;<tr><td><a id="l89"></a><a href="#l89">89</a><td><tr><td><a id="l90"></a><a href="#l90">90</a><td><tr><td><a id="l91"></a><a href="#l91">91</a><td>/**<tr><td><a id="l92"></a><a href="#l92">92</a><td> * Returns true if the specified value is not undefined.<tr><td><a id="l93"></a><a href="#l93">93</a><td> * WARNING: Do not use this to test if an object has a property. Use the in<tr><td><a id="l94"></a><a href="#l94">94</a><td> * operator instead.<tr><td><a id="l95"></a><a href="#l95">95</a><td> *<tr><td><a id="l96"></a><a href="#l96">96</a><td> * @param {?} val Variable to test.<tr><td><a id="l97"></a><a href="#l97">97</a><td> * @return {boolean} Whether variable is defined.<tr><td><a id="l98"></a><a href="#l98">98</a><td> */<tr><td><a id="l99"></a><a href="#l99">99</a><td>goog.isDef = function(val) {<tr><td><a id="l100"></a><a href="#l100">100</a><td> // void 0 always evaluates to undefined and hence we do not need to depend on<tr><td><a id="l101"></a><a href="#l101">101</a><td> // the definition of the global variable named &#39;undefined&#39;.<tr><td><a id="l102"></a><a href="#l102">102</a><td> return val !== void 0;<tr><td><a id="l103"></a><a href="#l103">103</a><td>};<tr><td><a id="l104"></a><a href="#l104">104</a><td><tr><td><a id="l105"></a><a href="#l105">105</a><td><tr><td><a id="l106"></a><a href="#l106">106</a><td>/**<tr><td><a id="l107"></a><a href="#l107">107</a><td> * Builds an object structure for the provided namespace path, ensuring that<tr><td><a id="l108"></a><a href="#l108">108</a><td> * names that already exist are not overwritten. For example:<tr><td><a id="l109"></a><a href="#l109">109</a><td> * &quot;a.b.c&quot; -&gt; a = {};a.b={};a.b.c={};<tr><td><a id="l110"></a><a href="#l110">110</a><td> * Used by goog.provide and goog.exportSymbol.<tr><td><a id="l111"></a><a href="#l111">111</a><td> * @param {string} name name of the object that this file defines.<tr><td><a id="l112"></a><a href="#l112">112</a><td> * @param {*=} opt_object the object to expose at the end of the path.<tr><td><a id="l113"></a><a href="#l113">113</a><td> * @param {Object=} opt_objectToExportTo The object to add the path to; default<tr><td><a id="l114"></a><a href="#l114">114</a><td> * is |goog.global|.<tr><td><a id="l115"></a><a href="#l115">115</a><td> * @private<tr><td><a id="l116"></a><a href="#l116">116</a><td> */<tr><td><a id="l117"></a><a href="#l117">117</a><td>goog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {<tr><td><a id="l118"></a><a href="#l118">118</a><td> var parts = name.split(&#39;.&#39;);<tr><td><a id="l119"></a><a href="#l119">119</a><td> var cur = opt_objectToExportTo || goog.global;<tr><td><a id="l120"></a><a href="#l120">120</a><td><tr><td><a id="l121"></a><a href="#l121">121</a><td> // Internet Explorer exhibits strange behavior when throwing errors from<tr><td><a id="l122"></a><a href="#l122">122</a><td> // methods externed in this manner. See the testExportSymbolExceptions in<tr><td><a id="l123"></a><a href="#l123">123</a><td> // base_test.html for an example.<tr><td><a id="l124"></a><a href="#l124">124</a><td> if (!(parts[0] in cur) &amp;&amp; cur.execScript) {<tr><td><a id="l125"></a><a href="#l125">125</a><td> cur.execScript(&#39;var &#39; + parts[0]);<tr><td><a id="l126"></a><a href="#l126">126</a><td> }<tr><td><a id="l127"></a><a href="#l127">127</a><td><tr><td><a id="l128"></a><a href="#l128">128</a><td> // Certain browsers cannot parse code in the form for((a in b); c;);<tr><td><a id="l129"></a><a href="#l129">129</a><td> // This pattern is produced by the JSCompiler when it collapses the<tr><td><a id="l130"></a><a href="#l130">130</a><td> // statement above into the conditional loop below. To prevent this from<tr><td><a id="l131"></a><a href="#l131">131</a><td> // happening, use a for-loop and reserve the init logic as below.<tr><td><a id="l132"></a><a href="#l132">132</a><td><tr><td><a id="l133"></a><a href="#l133">133</a><td> // Parentheses added to eliminate strict JS warning in Firefox.<tr><td><a id="l134"></a><a href="#l134">134</a><td> for (var part; parts.length &amp;&amp; (part = parts.shift());) {<tr><td><a id="l135"></a><a href="#l135">135</a><td> if (!parts.length &amp;&amp; goog.isDef(opt_object)) {<tr><td><a id="l136"></a><a href="#l136">136</a><td> // last part and we have an object; use it<tr><td><a id="l137"></a><a href="#l137">137</a><td> cur[part] = opt_object;<tr><td><a id="l138"></a><a href="#l138">138</a><td> } else if (cur[part]) {<tr><td><a id="l139"></a><a href="#l139">139</a><td> cur = cur[part];<tr><td><a id="l140"></a><a href="#l140">140</a><td> } else {<tr><td><a id="l141"></a><a href="#l141">141</a><td> cur = cur[part] = {};<tr><td><a id="l142"></a><a href="#l142">142</a><td> }<tr><td><a id="l143"></a><a href="#l143">143</a><td> }<tr><td><a id="l144"></a><a href="#l144">144</a><td>};<tr><td><a id="l145"></a><a href="#l145">145</a><td><tr><td><a id="l146"></a><a href="#l146">146</a><td><tr><td><a id="l147"></a><a href="#l147">147</a><td>/**<tr><td><a id="l148"></a><a href="#l148">148</a><td> * Defines a named value. In uncompiled mode, the value is retrieved from<tr><td><a id="l149"></a><a href="#l149">149</a><td> * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and<tr><td><a id="l150"></a><a href="#l150">150</a><td> * has the property specified, and otherwise used the defined defaultValue.<tr><td><a id="l151"></a><a href="#l151">151</a><td> * When compiled the default can be overridden using the compiler<tr><td><a id="l152"></a><a href="#l152">152</a><td> * options or the value set in the CLOSURE_DEFINES object.<tr><td><a id="l153"></a><a href="#l153">153</a><td> *<tr><td><a id="l154"></a><a href="#l154">154</a><td> * @param {string} name The distinguished name to provide.<tr><td><a id="l155"></a><a href="#l155">155</a><td> * @param {string|number|boolean} defaultValue<tr><td><a id="l156"></a><a href="#l156">156</a><td> */<tr><td><a id="l157"></a><a href="#l157">157</a><td>goog.define = function(name, defaultValue) {<tr><td><a id="l158"></a><a href="#l158">158</a><td> var value = defaultValue;<tr><td><a id="l159"></a><a href="#l159">159</a><td> if (!COMPILED) {<tr><td><a id="l160"></a><a href="#l160">160</a><td> if (goog.global.CLOSURE_UNCOMPILED_DEFINES &amp;&amp;<tr><td><a id="l161"></a><a href="#l161">161</a><td> Object.prototype.hasOwnProperty.call(<tr><td><a id="l162"></a><a href="#l162">162</a><td> goog.global.CLOSURE_UNCOMPILED_DEFINES, name)) {<tr><td><a id="l163"></a><a href="#l163">163</a><td> value = goog.global.CLOSURE_UNCOMPILED_DEFINES[name];<tr><td><a id="l164"></a><a href="#l164">164</a><td> } else if (goog.global.CLOSURE_DEFINES &amp;&amp;<tr><td><a id="l165"></a><a href="#l165">165</a><td> Object.prototype.hasOwnProperty.call(<tr><td><a id="l166"></a><a href="#l166">166</a><td> goog.global.CLOSURE_DEFINES, name)) {<tr><td><a id="l167"></a><a href="#l167">167</a><td> value = goog.global.CLOSURE_DEFINES[name];<tr><td><a id="l168"></a><a href="#l168">168</a><td> }<tr><td><a id="l169"></a><a href="#l169">169</a><td> }<tr><td><a id="l170"></a><a href="#l170">170</a><td> goog.exportPath_(name, value);<tr><td><a id="l171"></a><a href="#l171">171</a><td>};<tr><td><a id="l172"></a><a href="#l172">172</a><td><tr><td><a id="l173"></a><a href="#l173">173</a><td><tr><td><a id="l174"></a><a href="#l174">174</a><td>/**<tr><td><a id="l175"></a><a href="#l175">175</a><td> * @define {boolean} DEBUG is provided as a convenience so that debugging code<tr><td><a id="l176"></a><a href="#l176">176</a><td> * that should not be included in a production js_binary can be easily stripped<tr><td><a id="l177"></a><a href="#l177">177</a><td> * by specifying --define goog.DEBUG=false to the JSCompiler. For example, most<tr><td><a id="l178"></a><a href="#l178">178</a><td> * toString() methods should be declared inside an &quot;if (goog.DEBUG)&quot; conditional<tr><td><a id="l179"></a><a href="#l179">179</a><td> * because they are generally used for debugging purposes and it is difficult<tr><td><a id="l180"></a><a href="#l180">180</a><td> * for the JSCompiler to statically determine whether they are used.<tr><td><a id="l181"></a><a href="#l181">181</a><td> */<tr><td><a id="l182"></a><a href="#l182">182</a><td>goog.define(&#39;goog.DEBUG&#39;, true);<tr><td><a id="l183"></a><a href="#l183">183</a><td><tr><td><a id="l184"></a><a href="#l184">184</a><td><tr><td><a id="l185"></a><a href="#l185">185</a><td>/**<tr><td><a id="l186"></a><a href="#l186">186</a><td> * @define {string} LOCALE defines the locale being used for compilation. It is<tr><td><a id="l187"></a><a href="#l187">187</a><td> * used to select locale specific data to be compiled in js binary. BUILD rule<tr><td><a id="l188"></a><a href="#l188">188</a><td> * can specify this value by &quot;--define goog.LOCALE=&lt;locale_name&gt;&quot; as JSCompiler<tr><td><a id="l189"></a><a href="#l189">189</a><td> * option.<tr><td><a id="l190"></a><a href="#l190">190</a><td> *<tr><td><a id="l191"></a><a href="#l191">191</a><td> * Take into account that the locale code format is important. You should use<tr><td><a id="l192"></a><a href="#l192">192</a><td> * the canonical Unicode format with hyphen as a delimiter. Language must be<tr><td><a id="l193"></a><a href="#l193">193</a><td> * lowercase, Language Script - Capitalized, Region - UPPERCASE.<tr><td><a id="l194"></a><a href="#l194">194</a><td> * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN.<tr><td><a id="l195"></a><a href="#l195">195</a><td> *<tr><td><a id="l196"></a><a href="#l196">196</a><td> * See more info about locale codes here:<tr><td><a id="l197"></a><a href="#l197">197</a><td> * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers<tr><td><a id="l198"></a><a href="#l198">198</a><td> *<tr><td><a id="l199"></a><a href="#l199">199</a><td> * For language codes you should use values defined by ISO 693-1. See it here<tr><td><a id="l200"></a><a href="#l200">200</a><td> * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from<tr><td><a id="l201"></a><a href="#l201">201</a><td> * this rule: the Hebrew language. For legacy reasons the old code (iw) should<tr><td><a id="l202"></a><a href="#l202">202</a><td> * be used instead of the new code (he), see http://wiki/Main/IIISynonyms.<tr><td><a id="l203"></a><a href="#l203">203</a><td> */<tr><td><a id="l204"></a><a href="#l204">204</a><td>goog.define(&#39;goog.LOCALE&#39;, &#39;en&#39;); // default to en<tr><td><a id="l205"></a><a href="#l205">205</a><td><tr><td><a id="l206"></a><a href="#l206">206</a><td><tr><td><a id="l207"></a><a href="#l207">207</a><td>/**<tr><td><a id="l208"></a><a href="#l208">208</a><td> * @define {boolean} Whether this code is running on trusted sites.<tr><td><a id="l209"></a><a href="#l209">209</a><td> *<tr><td><a id="l210"></a><a href="#l210">210</a><td> * On untrusted sites, several native functions can be defined or overridden by<tr><td><a id="l211"></a><a href="#l211">211</a><td> * external libraries like Prototype, Datejs, and JQuery and setting this flag<tr><td><a id="l212"></a><a href="#l212">212</a><td> * to false forces closure to use its own implementations when possible.<tr><td><a id="l213"></a><a href="#l213">213</a><td> *<tr><td><a id="l214"></a><a href="#l214">214</a><td> * If your JavaScript can be loaded by a third party site and you are wary about<tr><td><a id="l215"></a><a href="#l215">215</a><td> * relying on non-standard implementations, specify<tr><td><a id="l216"></a><a href="#l216">216</a><td> * &quot;--define goog.TRUSTED_SITE=false&quot; to the JSCompiler.<tr><td><a id="l217"></a><a href="#l217">217</a><td> */<tr><td><a id="l218"></a><a href="#l218">218</a><td>goog.define(&#39;goog.TRUSTED_SITE&#39;, true);<tr><td><a id="l219"></a><a href="#l219">219</a><td><tr><td><a id="l220"></a><a href="#l220">220</a><td><tr><td><a id="l221"></a><a href="#l221">221</a><td>/**<tr><td><a id="l222"></a><a href="#l222">222</a><td> * @define {boolean} Whether a project is expected to be running in strict mode.<tr><td><a id="l223"></a><a href="#l223">223</a><td> *<tr><td><a id="l224"></a><a href="#l224">224</a><td> * This define can be used to trigger alternate implementations compatible with<tr><td><a id="l225"></a><a href="#l225">225</a><td> * running in EcmaScript Strict mode or warn about unavailable functionality.<tr><td><a id="l226"></a><a href="#l226">226</a><td> * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode<tr><td><a id="l227"></a><a href="#l227">227</a><td> *<tr><td><a id="l228"></a><a href="#l228">228</a><td> */<tr><td><a id="l229"></a><a href="#l229">229</a><td>goog.define(&#39;goog.STRICT_MODE_COMPATIBLE&#39;, false);<tr><td><a id="l230"></a><a href="#l230">230</a><td><tr><td><a id="l231"></a><a href="#l231">231</a><td><tr><td><a id="l232"></a><a href="#l232">232</a><td>/**<tr><td><a id="l233"></a><a href="#l233">233</a><td> * @define {boolean} Whether code that calls {@link goog.setTestOnly} should<tr><td><a id="l234"></a><a href="#l234">234</a><td> * be disallowed in the compilation unit.<tr><td><a id="l235"></a><a href="#l235">235</a><td> */<tr><td><a id="l236"></a><a href="#l236">236</a><td>goog.define(&#39;goog.DISALLOW_TEST_ONLY_CODE&#39;, COMPILED &amp;&amp; !goog.DEBUG);<tr><td><a id="l237"></a><a href="#l237">237</a><td><tr><td><a id="l238"></a><a href="#l238">238</a><td><tr><td><a id="l239"></a><a href="#l239">239</a><td>/**<tr><td><a id="l240"></a><a href="#l240">240</a><td> * @define {boolean} Whether to use a Chrome app CSP-compliant method for<tr><td><a id="l241"></a><a href="#l241">241</a><td> * loading scripts via goog.require. @see appendScriptSrcNode_.<tr><td><a id="l242"></a><a href="#l242">242</a><td> */<tr><td><a id="l243"></a><a href="#l243">243</a><td>goog.define(&#39;goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING&#39;, false);<tr><td><a id="l244"></a><a href="#l244">244</a><td><tr><td><a id="l245"></a><a href="#l245">245</a><td><tr><td><a id="l246"></a><a href="#l246">246</a><td>/**<tr><td><a id="l247"></a><a href="#l247">247</a><td> * Defines a namespace in Closure.<tr><td><a id="l248"></a><a href="#l248">248</a><td> *<tr><td><a id="l249"></a><a href="#l249">249</a><td> * A namespace may only be defined once in a codebase. It may be defined using<tr><td><a id="l250"></a><a href="#l250">250</a><td> * goog.provide() or goog.module().<tr><td><a id="l251"></a><a href="#l251">251</a><td> *<tr><td><a id="l252"></a><a href="#l252">252</a><td> * The presence of one or more goog.provide() calls in a file indicates<tr><td><a id="l253"></a><a href="#l253">253</a><td> * that the file defines the given objects/namespaces.<tr><td><a id="l254"></a><a href="#l254">254</a><td> * Provided symbols must not be null or undefined.<tr><td><a id="l255"></a><a href="#l255">255</a><td> *<tr><td><a id="l256"></a><a href="#l256">256</a><td> * In addition, goog.provide() creates the object stubs for a namespace<tr><td><a id="l257"></a><a href="#l257">257</a><td> * (for example, goog.provide(&quot;goog.foo.bar&quot;) will create the object<tr><td><a id="l258"></a><a href="#l258">258</a><td> * goog.foo.bar if it does not already exist).<tr><td><a id="l259"></a><a href="#l259">259</a><td> *<tr><td><a id="l260"></a><a href="#l260">260</a><td> * Build tools also scan for provide/require/module statements<tr><td><a id="l261"></a><a href="#l261">261</a><td> * to discern dependencies, build dependency files (see deps.js), etc.<tr><td><a id="l262"></a><a href="#l262">262</a><td> *<tr><td><a id="l263"></a><a href="#l263">263</a><td> * @see goog.require<tr><td><a id="l264"></a><a href="#l264">264</a><td> * @see goog.module<tr><td><a id="l265"></a><a href="#l265">265</a><td> * @param {string} name Namespace provided by this file in the form<tr><td><a id="l266"></a><a href="#l266">266</a><td> * &quot;goog.package.part&quot;.<tr><td><a id="l267"></a><a href="#l267">267</a><td> */<tr><td><a id="l268"></a><a href="#l268">268</a><td>goog.provide = function(name) {<tr><td><a id="l269"></a><a href="#l269">269</a><td> if (!COMPILED) {<tr><td><a id="l270"></a><a href="#l270">270</a><td> // Ensure that the same namespace isn&#39;t provided twice.<tr><td><a id="l271"></a><a href="#l271">271</a><td> // A goog.module/goog.provide maps a goog.require to a specific file<tr><td><a id="l272"></a><a href="#l272">272</a><td> if (goog.isProvided_(name)) {<tr><td><a id="l273"></a><a href="#l273">273</a><td> throw Error(&#39;Namespace &quot;&#39; + name + &#39;&quot; already declared.&#39;);<tr><td><a id="l274"></a><a href="#l274">274</a><td> }<tr><td><a id="l275"></a><a href="#l275">275</a><td> }<tr><td><a id="l276"></a><a href="#l276">276</a><td><tr><td><a id="l277"></a><a href="#l277">277</a><td> goog.constructNamespace_(name);<tr><td><a id="l278"></a><a href="#l278">278</a><td>};<tr><td><a id="l279"></a><a href="#l279">279</a><td><tr><td><a id="l280"></a><a href="#l280">280</a><td><tr><td><a id="l281"></a><a href="#l281">281</a><td>/**<tr><td><a id="l282"></a><a href="#l282">282</a><td> * @param {string} name Namespace provided by this file in the form<tr><td><a id="l283"></a><a href="#l283">283</a><td> * &quot;goog.package.part&quot;.<tr><td><a id="l284"></a><a href="#l284">284</a><td> * @param {Object=} opt_obj The object to embed in the namespace.<tr><td><a id="l285"></a><a href="#l285">285</a><td> * @private<tr><td><a id="l286"></a><a href="#l286">286</a><td> */<tr><td><a id="l287"></a><a href="#l287">287</a><td>goog.constructNamespace_ = function(name, opt_obj) {<tr><td><a id="l288"></a><a href="#l288">288</a><td> if (!COMPILED) {<tr><td><a id="l289"></a><a href="#l289">289</a><td> delete goog.implicitNamespaces_[name];<tr><td><a id="l290"></a><a href="#l290">290</a><td><tr><td><a id="l291"></a><a href="#l291">291</a><td> var namespace = name;<tr><td><a id="l292"></a><a href="#l292">292</a><td> while ((namespace = namespace.substring(0, namespace.lastIndexOf(&#39;.&#39;)))) {<tr><td><a id="l293"></a><a href="#l293">293</a><td> if (goog.getObjectByName(namespace)) {<tr><td><a id="l294"></a><a href="#l294">294</a><td> break;<tr><td><a id="l295"></a><a href="#l295">295</a><td> }<tr><td><a id="l296"></a><a href="#l296">296</a><td> goog.implicitNamespaces_[namespace] = true;<tr><td><a id="l297"></a><a href="#l297">297</a><td> }<tr><td><a id="l298"></a><a href="#l298">298</a><td> }<tr><td><a id="l299"></a><a href="#l299">299</a><td><tr><td><a id="l300"></a><a href="#l300">300</a><td> goog.exportPath_(name, opt_obj);<tr><td><a id="l301"></a><a href="#l301">301</a><td>};<tr><td><a id="l302"></a><a href="#l302">302</a><td><tr><td><a id="l303"></a><a href="#l303">303</a><td><tr><td><a id="l304"></a><a href="#l304">304</a><td>/**<tr><td><a id="l305"></a><a href="#l305">305</a><td> * Module identifier validation regexp.<tr><td><a id="l306"></a><a href="#l306">306</a><td> * Note: This is a conservative check, it is very possible to be more lenient,<tr><td><a id="l307"></a><a href="#l307">307</a><td> * the primary exclusion here is &quot;/&quot; and &quot;\&quot; and a leading &quot;.&quot;, these<tr><td><a id="l308"></a><a href="#l308">308</a><td> * restrictions are intended to leave the door open for using goog.require<tr><td><a id="l309"></a><a href="#l309">309</a><td> * with relative file paths rather than module identifiers.<tr><td><a id="l310"></a><a href="#l310">310</a><td> * @private<tr><td><a id="l311"></a><a href="#l311">311</a><td> */<tr><td><a id="l312"></a><a href="#l312">312</a><td>goog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;<tr><td><a id="l313"></a><a href="#l313">313</a><td><tr><td><a id="l314"></a><a href="#l314">314</a><td><tr><td><a id="l315"></a><a href="#l315">315</a><td>/**<tr><td><a id="l316"></a><a href="#l316">316</a><td> * Defines a module in Closure.<tr><td><a id="l317"></a><a href="#l317">317</a><td> *<tr><td><a id="l318"></a><a href="#l318">318</a><td> * Marks that this file must be loaded as a module and claims the namespace.<tr><td><a id="l319"></a><a href="#l319">319</a><td> *<tr><td><a id="l320"></a><a href="#l320">320</a><td> * A namespace may only be defined once in a codebase. It may be defined using<tr><td><a id="l321"></a><a href="#l321">321</a><td> * goog.provide() or goog.module().<tr><td><a id="l322"></a><a href="#l322">322</a><td> *<tr><td><a id="l323"></a><a href="#l323">323</a><td> * goog.module() has three requirements:<tr><td><a id="l324"></a><a href="#l324">324</a><td> * - goog.module may not be used in the same file as goog.provide.<tr><td><a id="l325"></a><a href="#l325">325</a><td> * - goog.module must be the first statement in the file.<tr><td><a id="l326"></a><a href="#l326">326</a><td> * - only one goog.module is allowed per file.<tr><td><a id="l327"></a><a href="#l327">327</a><td> *<tr><td><a id="l328"></a><a href="#l328">328</a><td> * When a goog.module annotated file is loaded, it is enclosed in<tr><td><a id="l329"></a><a href="#l329">329</a><td> * a strict function closure. This means that:<tr><td><a id="l330"></a><a href="#l330">330</a><td> * - any variables declared in a goog.module file are private to the file<tr><td><a id="l331"></a><a href="#l331">331</a><td> * (not global), though the compiler is expected to inline the module.<tr><td><a id="l332"></a><a href="#l332">332</a><td> * - The code must obey all the rules of &quot;strict&quot; JavaScript.<tr><td><a id="l333"></a><a href="#l333">333</a><td> * - the file will be marked as &quot;use strict&quot;<tr><td><a id="l334"></a><a href="#l334">334</a><td> *<tr><td><a id="l335"></a><a href="#l335">335</a><td> * NOTE: unlike goog.provide, goog.module does not declare any symbols by<tr><td><a id="l336"></a><a href="#l336">336</a><td> * itself. If declared symbols are desired, use<tr><td><a id="l337"></a><a href="#l337">337</a><td> * goog.module.declareLegacyNamespace().<tr><td><a id="l338"></a><a href="#l338">338</a><td> *<tr><td><a id="l339"></a><a href="#l339">339</a><td> *<tr><td><a id="l340"></a><a href="#l340">340</a><td> * See the public goog.module proposal: http://goo.gl/Va1hin<tr><td><a id="l341"></a><a href="#l341">341</a><td> *<tr><td><a id="l342"></a><a href="#l342">342</a><td> * @param {string} name Namespace provided by this file in the form<tr><td><a id="l343"></a><a href="#l343">343</a><td> * &quot;goog.package.part&quot;, is expected but not required.<tr><td><a id="l344"></a><a href="#l344">344</a><td> */<tr><td><a id="l345"></a><a href="#l345">345</a><td>goog.module = function(name) {<tr><td><a id="l346"></a><a href="#l346">346</a><td> if (!goog.isString(name) ||<tr><td><a id="l347"></a><a href="#l347">347</a><td> !name ||<tr><td><a id="l348"></a><a href="#l348">348</a><td> name.search(goog.VALID_MODULE_RE_) == -1) {<tr><td><a id="l349"></a><a href="#l349">349</a><td> throw Error(&#39;Invalid module identifier&#39;);<tr><td><a id="l350"></a><a href="#l350">350</a><td> }<tr><td><a id="l351"></a><a href="#l351">351</a><td> if (!goog.isInModuleLoader_()) {<tr><td><a id="l352"></a><a href="#l352">352</a><td> throw Error(&#39;Module &#39; + name + &#39; has been loaded incorrectly.&#39;);<tr><td><a id="l353"></a><a href="#l353">353</a><td> }<tr><td><a id="l354"></a><a href="#l354">354</a><td> if (goog.moduleLoaderState_.moduleName) {<tr><td><a id="l355"></a><a href="#l355">355</a><td> throw Error(&#39;goog.module may only be called once per module.&#39;);<tr><td><a id="l356"></a><a href="#l356">356</a><td> }<tr><td><a id="l357"></a><a href="#l357">357</a><td><tr><td><a id="l358"></a><a href="#l358">358</a><td> // Store the module name for the loader.<tr><td><a id="l359"></a><a href="#l359">359</a><td> goog.moduleLoaderState_.moduleName = name;<tr><td><a id="l360"></a><a href="#l360">360</a><td> if (!COMPILED) {<tr><td><a id="l361"></a><a href="#l361">361</a><td> // Ensure that the same namespace isn&#39;t provided twice.<tr><td><a id="l362"></a><a href="#l362">362</a><td> // A goog.module/goog.provide maps a goog.require to a specific file<tr><td><a id="l363"></a><a href="#l363">363</a><td> if (goog.isProvided_(name)) {<tr><td><a id="l364"></a><a href="#l364">364</a><td> throw Error(&#39;Namespace &quot;&#39; + name + &#39;&quot; already declared.&#39;);<tr><td><a id="l365"></a><a href="#l365">365</a><td> }<tr><td><a id="l366"></a><a href="#l366">366</a><td> delete goog.implicitNamespaces_[name];<tr><td><a id="l367"></a><a href="#l367">367</a><td> }<tr><td><a id="l368"></a><a href="#l368">368</a><td>};<tr><td><a id="l369"></a><a href="#l369">369</a><td><tr><td><a id="l370"></a><a href="#l370">370</a><td><tr><td><a id="l371"></a><a href="#l371">371</a><td>/**<tr><td><a id="l372"></a><a href="#l372">372</a><td> * @param {string} name The module identifier.<tr><td><a id="l373"></a><a href="#l373">373</a><td> * @return {?} The module exports for an already loaded module or null.<tr><td><a id="l374"></a><a href="#l374">374</a><td> *<tr><td><a id="l375"></a><a href="#l375">375</a><td> * Note: This is not an alternative to goog.require, it does not<tr><td><a id="l376"></a><a href="#l376">376</a><td> * indicate a hard dependency, instead it is used to indicate<tr><td><a id="l377"></a><a href="#l377">377</a><td> * an optional dependency or to access the exports of a module<tr><td><a id="l378"></a><a href="#l378">378</a><td> * that has already been loaded.<tr><td><a id="l379"></a><a href="#l379">379</a><td> * @suppress {missingProvide}<tr><td><a id="l380"></a><a href="#l380">380</a><td> */<tr><td><a id="l381"></a><a href="#l381">381</a><td>goog.module.get = function(name) {<tr><td><a id="l382"></a><a href="#l382">382</a><td> return goog.module.getInternal_(name);<tr><td><a id="l383"></a><a href="#l383">383</a><td>};<tr><td><a id="l384"></a><a href="#l384">384</a><td><tr><td><a id="l385"></a><a href="#l385">385</a><td><tr><td><a id="l386"></a><a href="#l386">386</a><td>/**<tr><td><a id="l387"></a><a href="#l387">387</a><td> * @param {string} name The module identifier.<tr><td><a id="l388"></a><a href="#l388">388</a><td> * @return {?} The module exports for an already loaded module or null.<tr><td><a id="l389"></a><a href="#l389">389</a><td> * @private<tr><td><a id="l390"></a><a href="#l390">390</a><td> */<tr><td><a id="l391"></a><a href="#l391">391</a><td>goog.module.getInternal_ = function(name) {<tr><td><a id="l392"></a><a href="#l392">392</a><td> if (!COMPILED) {<tr><td><a id="l393"></a><a href="#l393">393</a><td> if (goog.isProvided_(name)) {<tr><td><a id="l394"></a><a href="#l394">394</a><td> // goog.require only return a value with-in goog.module files.<tr><td><a id="l395"></a><a href="#l395">395</a><td> return name in goog.loadedModules_ ?<tr><td><a id="l396"></a><a href="#l396">396</a><td> goog.loadedModules_[name] :<tr><td><a id="l397"></a><a href="#l397">397</a><td> goog.getObjectByName(name);<tr><td><a id="l398"></a><a href="#l398">398</a><td> } else {<tr><td><a id="l399"></a><a href="#l399">399</a><td> return null;<tr><td><a id="l400"></a><a href="#l400">400</a><td> }<tr><td><a id="l401"></a><a href="#l401">401</a><td> }<tr><td><a id="l402"></a><a href="#l402">402</a><td>};<tr><td><a id="l403"></a><a href="#l403">403</a><td><tr><td><a id="l404"></a><a href="#l404">404</a><td><tr><td><a id="l405"></a><a href="#l405">405</a><td>/**<tr><td><a id="l406"></a><a href="#l406">406</a><td> * @private {?{moduleName: (string|undefined), declareLegacyNamespace:boolean}}<tr><td><a id="l407"></a><a href="#l407">407</a><td> */<tr><td><a id="l408"></a><a href="#l408">408</a><td>goog.moduleLoaderState_ = null;<tr><td><a id="l409"></a><a href="#l409">409</a><td><tr><td><a id="l410"></a><a href="#l410">410</a><td><tr><td><a id="l411"></a><a href="#l411">411</a><td>/**<tr><td><a id="l412"></a><a href="#l412">412</a><td> * @private<tr><td><a id="l413"></a><a href="#l413">413</a><td> * @return {boolean} Whether a goog.module is currently being initialized.<tr><td><a id="l414"></a><a href="#l414">414</a><td> */<tr><td><a id="l415"></a><a href="#l415">415</a><td>goog.isInModuleLoader_ = function() {<tr><td><a id="l416"></a><a href="#l416">416</a><td> return goog.moduleLoaderState_ != null;<tr><td><a id="l417"></a><a href="#l417">417</a><td>};<tr><td><a id="l418"></a><a href="#l418">418</a><td><tr><td><a id="l419"></a><a href="#l419">419</a><td><tr><td><a id="l420"></a><a href="#l420">420</a><td>/**<tr><td><a id="l421"></a><a href="#l421">421</a><td> * Provide the module&#39;s exports as a globally accessible object under the<tr><td><a id="l422"></a><a href="#l422">422</a><td> * module&#39;s declared name. This is intended to ease migration to goog.module<tr><td><a id="l423"></a><a href="#l423">423</a><td> * for files that have existing usages.<tr><td><a id="l424"></a><a href="#l424">424</a><td> * @suppress {missingProvide}<tr><td><a id="l425"></a><a href="#l425">425</a><td> */<tr><td><a id="l426"></a><a href="#l426">426</a><td>goog.module.declareLegacyNamespace = function() {<tr><td><a id="l427"></a><a href="#l427">427</a><td> if (!COMPILED &amp;&amp; !goog.isInModuleLoader_()) {<tr><td><a id="l428"></a><a href="#l428">428</a><td> throw new Error(&#39;goog.module.declareLegacyNamespace must be called from &#39; +<tr><td><a id="l429"></a><a href="#l429">429</a><td> &#39;within a goog.module&#39;);<tr><td><a id="l430"></a><a href="#l430">430</a><td> }<tr><td><a id="l431"></a><a href="#l431">431</a><td> if (!COMPILED &amp;&amp; !goog.moduleLoaderState_.moduleName) {<tr><td><a id="l432"></a><a href="#l432">432</a><td> throw Error(&#39;goog.module must be called prior to &#39; +<tr><td><a id="l433"></a><a href="#l433">433</a><td> &#39;goog.module.declareLegacyNamespace.&#39;);<tr><td><a id="l434"></a><a href="#l434">434</a><td> }<tr><td><a id="l435"></a><a href="#l435">435</a><td> goog.moduleLoaderState_.declareLegacyNamespace = true;<tr><td><a id="l436"></a><a href="#l436">436</a><td>};<tr><td><a id="l437"></a><a href="#l437">437</a><td><tr><td><a id="l438"></a><a href="#l438">438</a><td><tr><td><a id="l439"></a><a href="#l439">439</a><td>/**<tr><td><a id="l440"></a><a href="#l440">440</a><td> * Marks that the current file should only be used for testing, and never for<tr><td><a id="l441"></a><a href="#l441">441</a><td> * live code in production.<tr><td><a id="l442"></a><a href="#l442">442</a><td> *<tr><td><a id="l443"></a><a href="#l443">443</a><td> * In the case of unit tests, the message may optionally be an exact namespace<tr><td><a id="l444"></a><a href="#l444">444</a><td> * for the test (e.g. &#39;goog.stringTest&#39;). The linter will then ignore the extra<tr><td><a id="l445"></a><a href="#l445">445</a><td> * provide (if not explicitly defined in the code).<tr><td><a id="l446"></a><a href="#l446">446</a><td> *<tr><td><a id="l447"></a><a href="#l447">447</a><td> * @param {string=} opt_message Optional message to add to the error that&#39;s<tr><td><a id="l448"></a><a href="#l448">448</a><td> * raised when used in production code.<tr><td><a id="l449"></a><a href="#l449">449</a><td> */<tr><td><a id="l450"></a><a href="#l450">450</a><td>goog.setTestOnly = function(opt_message) {<tr><td><a id="l451"></a><a href="#l451">451</a><td> if (goog.DISALLOW_TEST_ONLY_CODE) {<tr><td><a id="l452"></a><a href="#l452">452</a><td> opt_message = opt_message || &#39;&#39;;<tr><td><a id="l453"></a><a href="#l453">453</a><td> throw Error(&#39;Importing test-only code into non-debug environment&#39; +<tr><td><a id="l454"></a><a href="#l454">454</a><td> (opt_message ? &#39;: &#39; + opt_message : &#39;.&#39;));<tr><td><a id="l455"></a><a href="#l455">455</a><td> }<tr><td><a id="l456"></a><a href="#l456">456</a><td>};<tr><td><a id="l457"></a><a href="#l457">457</a><td><tr><td><a id="l458"></a><a href="#l458">458</a><td><tr><td><a id="l459"></a><a href="#l459">459</a><td>/**<tr><td><a id="l460"></a><a href="#l460">460</a><td> * Forward declares a symbol. This is an indication to the compiler that the<tr><td><a id="l461"></a><a href="#l461">461</a><td> * symbol may be used in the source yet is not required and may not be provided<tr><td><a id="l462"></a><a href="#l462">462</a><td> * in compilation.<tr><td><a id="l463"></a><a href="#l463">463</a><td> *<tr><td><a id="l464"></a><a href="#l464">464</a><td> * The most common usage of forward declaration is code that takes a type as a<tr><td><a id="l465"></a><a href="#l465">465</a><td> * function parameter but does not need to require it. By forward declaring<tr><td><a id="l466"></a><a href="#l466">466</a><td> * instead of requiring, no hard dependency is made, and (if not required<tr><td><a id="l467"></a><a href="#l467">467</a><td> * elsewhere) the namespace may never be required and thus, not be pulled<tr><td><a id="l468"></a><a href="#l468">468</a><td> * into the JavaScript binary. If it is required elsewhere, it will be type<tr><td><a id="l469"></a><a href="#l469">469</a><td> * checked as normal.<tr><td><a id="l470"></a><a href="#l470">470</a><td> *<tr><td><a id="l471"></a><a href="#l471">471</a><td> *<tr><td><a id="l472"></a><a href="#l472">472</a><td> * @param {string} name The namespace to forward declare in the form of<tr><td><a id="l473"></a><a href="#l473">473</a><td> * &quot;goog.package.part&quot;.<tr><td><a id="l474"></a><a href="#l474">474</a><td> */<tr><td><a id="l475"></a><a href="#l475">475</a><td>goog.forwardDeclare = function(name) {};<tr><td><a id="l476"></a><a href="#l476">476</a><td><tr><td><a id="l477"></a><a href="#l477">477</a><td><tr><td><a id="l478"></a><a href="#l478">478</a><td>/**<tr><td><a id="l479"></a><a href="#l479">479</a><td> * Forward declare type information. Used to assign types to goog.global<tr><td><a id="l480"></a><a href="#l480">480</a><td> * referenced object that would otherwise result in unknown type references<tr><td><a id="l481"></a><a href="#l481">481</a><td> * and thus block property disambiguation.<tr><td><a id="l482"></a><a href="#l482">482</a><td> */<tr><td><a id="l483"></a><a href="#l483">483</a><td>goog.forwardDeclare(&#39;Document&#39;);<tr><td><a id="l484"></a><a href="#l484">484</a><td>goog.forwardDeclare(&#39;HTMLScriptElement&#39;);<tr><td><a id="l485"></a><a href="#l485">485</a><td>goog.forwardDeclare(&#39;XMLHttpRequest&#39;);<tr><td><a id="l486"></a><a href="#l486">486</a><td><tr><td><a id="l487"></a><a href="#l487">487</a><td><tr><td><a id="l488"></a><a href="#l488">488</a><td>if (!COMPILED) {<tr><td><a id="l489"></a><a href="#l489">489</a><td><tr><td><a id="l490"></a><a href="#l490">490</a><td> /**<tr><td><a id="l491"></a><a href="#l491">491</a><td> * Check if the given name has been goog.provided. This will return false for<tr><td><a id="l492"></a><a href="#l492">492</a><td> * names that are available only as implicit namespaces.<tr><td><a id="l493"></a><a href="#l493">493</a><td> * @param {string} name name of the object to look for.<tr><td><a id="l494"></a><a href="#l494">494</a><td> * @return {boolean} Whether the name has been provided.<tr><td><a id="l495"></a><a href="#l495">495</a><td> * @private<tr><td><a id="l496"></a><a href="#l496">496</a><td> */<tr><td><a id="l497"></a><a href="#l497">497</a><td> goog.isProvided_ = function(name) {<tr><td><a id="l498"></a><a href="#l498">498</a><td> return (name in goog.loadedModules_) ||<tr><td><a id="l499"></a><a href="#l499">499</a><td> (!goog.implicitNamespaces_[name] &amp;&amp;<tr><td><a id="l500"></a><a href="#l500">500</a><td> goog.isDefAndNotNull(goog.getObjectByName(name)));<tr><td><a id="l501"></a><a href="#l501">501</a><td> };<tr><td><a id="l502"></a><a href="#l502">502</a><td><tr><td><a id="l503"></a><a href="#l503">503</a><td> /**<tr><td><a id="l504"></a><a href="#l504">504</a><td> * Namespaces implicitly defined by goog.provide. For example,<tr><td><a id="l505"></a><a href="#l505">505</a><td> * goog.provide(&#39;goog.events.Event&#39;) implicitly declares that &#39;goog&#39; and<tr><td><a id="l506"></a><a href="#l506">506</a><td> * &#39;goog.events&#39; must be namespaces.<tr><td><a id="l507"></a><a href="#l507">507</a><td> *<tr><td><a id="l508"></a><a href="#l508">508</a><td> * @type {!Object&lt;string, (boolean|undefined)&gt;}<tr><td><a id="l509"></a><a href="#l509">509</a><td> * @private<tr><td><a id="l510"></a><a href="#l510">510</a><td> */<tr><td><a id="l511"></a><a href="#l511">511</a><td> goog.implicitNamespaces_ = {&#39;goog.module&#39;: true};<tr><td><a id="l512"></a><a href="#l512">512</a><td><tr><td><a id="l513"></a><a href="#l513">513</a><td> // NOTE: We add goog.module as an implicit namespace as goog.module is defined<tr><td><a id="l514"></a><a href="#l514">514</a><td> // here and because the existing module package has not been moved yet out of<tr><td><a id="l515"></a><a href="#l515">515</a><td> // the goog.module namespace. This satisifies both the debug loader and<tr><td><a id="l516"></a><a href="#l516">516</a><td> // ahead-of-time dependency management.<tr><td><a id="l517"></a><a href="#l517">517</a><td>}<tr><td><a id="l518"></a><a href="#l518">518</a><td><tr><td><a id="l519"></a><a href="#l519">519</a><td><tr><td><a id="l520"></a><a href="#l520">520</a><td>/**<tr><td><a id="l521"></a><a href="#l521">521</a><td> * Returns an object based on its fully qualified external name. The object<tr><td><a id="l522"></a><a href="#l522">522</a><td> * is not found if null or undefined. If you are using a compilation pass that<tr><td><a id="l523"></a><a href="#l523">523</a><td> * renames property names beware that using this function will not find renamed<tr><td><a id="l524"></a><a href="#l524">524</a><td> * properties.<tr><td><a id="l525"></a><a href="#l525">525</a><td> *<tr><td><a id="l526"></a><a href="#l526">526</a><td> * @param {string} name The fully qualified name.<tr><td><a id="l527"></a><a href="#l527">527</a><td> * @param {Object=} opt_obj The object within which to look; default is<tr><td><a id="l528"></a><a href="#l528">528</a><td> * |goog.global|.<tr><td><a id="l529"></a><a href="#l529">529</a><td> * @return {?} The value (object or primitive) or, if not found, null.<tr><td><a id="l530"></a><a href="#l530">530</a><td> */<tr><td><a id="l531"></a><a href="#l531">531</a><td>goog.getObjectByName = function(name, opt_obj) {<tr><td><a id="l532"></a><a href="#l532">532</a><td> var parts = name.split(&#39;.&#39;);<tr><td><a id="l533"></a><a href="#l533">533</a><td> var cur = opt_obj || goog.global;<tr><td><a id="l534"></a><a href="#l534">534</a><td> for (var part; part = parts.shift(); ) {<tr><td><a id="l535"></a><a href="#l535">535</a><td> if (goog.isDefAndNotNull(cur[part])) {<tr><td><a id="l536"></a><a href="#l536">536</a><td> cur = cur[part];<tr><td><a id="l537"></a><a href="#l537">537</a><td> } else {<tr><td><a id="l538"></a><a href="#l538">538</a><td> return null;<tr><td><a id="l539"></a><a href="#l539">539</a><td> }<tr><td><a id="l540"></a><a href="#l540">540</a><td> }<tr><td><a id="l541"></a><a href="#l541">541</a><td> return cur;<tr><td><a id="l542"></a><a href="#l542">542</a><td>};<tr><td><a id="l543"></a><a href="#l543">543</a><td><tr><td><a id="l544"></a><a href="#l544">544</a><td><tr><td><a id="l545"></a><a href="#l545">545</a><td>/**<tr><td><a id="l546"></a><a href="#l546">546</a><td> * Globalizes a whole namespace, such as goog or goog.lang.<tr><td><a id="l547"></a><a href="#l547">547</a><td> *<tr><td><a id="l548"></a><a href="#l548">548</a><td> * @param {!Object} obj The namespace to globalize.<tr><td><a id="l549"></a><a href="#l549">549</a><td> * @param {Object=} opt_global The object to add the properties to.<tr><td><a id="l550"></a><a href="#l550">550</a><td> * @deprecated Properties may be explicitly exported to the global scope, but<tr><td><a id="l551"></a><a href="#l551">551</a><td> * this should no longer be done in bulk.<tr><td><a id="l552"></a><a href="#l552">552</a><td> */<tr><td><a id="l553"></a><a href="#l553">553</a><td>goog.globalize = function(obj, opt_global) {<tr><td><a id="l554"></a><a href="#l554">554</a><td> var global = opt_global || goog.global;<tr><td><a id="l555"></a><a href="#l555">555</a><td> for (var x in obj) {<tr><td><a id="l556"></a><a href="#l556">556</a><td> global[x] = obj[x];<tr><td><a id="l557"></a><a href="#l557">557</a><td> }<tr><td><a id="l558"></a><a href="#l558">558</a><td>};<tr><td><a id="l559"></a><a href="#l559">559</a><td><tr><td><a id="l560"></a><a href="#l560">560</a><td><tr><td><a id="l561"></a><a href="#l561">561</a><td>/**<tr><td><a id="l562"></a><a href="#l562">562</a><td> * Adds a dependency from a file to the files it requires.<tr><td><a id="l563"></a><a href="#l563">563</a><td> * @param {string} relPath The path to the js file.<tr><td><a id="l564"></a><a href="#l564">564</a><td> * @param {!Array&lt;string&gt;} provides An array of strings with<tr><td><a id="l565"></a><a href="#l565">565</a><td> * the names of the objects this file provides.<tr><td><a id="l566"></a><a href="#l566">566</a><td> * @param {!Array&lt;string&gt;} requires An array of strings with<tr><td><a id="l567"></a><a href="#l567">567</a><td> * the names of the objects this file requires.<tr><td><a id="l568"></a><a href="#l568">568</a><td> * @param {boolean=} opt_isModule Whether this dependency must be loaded as<tr><td><a id="l569"></a><a href="#l569">569</a><td> * a module as declared by goog.module.<tr><td><a id="l570"></a><a href="#l570">570</a><td> */<tr><td><a id="l571"></a><a href="#l571">571</a><td>goog.addDependency = function(relPath, provides, requires, opt_isModule) {<tr><td><a id="l572"></a><a href="#l572">572</a><td> if (goog.DEPENDENCIES_ENABLED) {<tr><td><a id="l573"></a><a href="#l573">573</a><td> var provide, require;<tr><td><a id="l574"></a><a href="#l574">574</a><td> var path = relPath.replace(/\\/g, &#39;/&#39;);<tr><td><a id="l575"></a><a href="#l575">575</a><td> var deps = goog.dependencies_;<tr><td><a id="l576"></a><a href="#l576">576</a><td> for (var i = 0; provide = provides[i]; i++) {<tr><td><a id="l577"></a><a href="#l577">577</a><td> deps.nameToPath[provide] = path;<tr><td><a id="l578"></a><a href="#l578">578</a><td> deps.pathIsModule[path] = !!opt_isModule;<tr><td><a id="l579"></a><a href="#l579">579</a><td> }<tr><td><a id="l580"></a><a href="#l580">580</a><td> for (var j = 0; require = requires[j]; j++) {<tr><td><a id="l581"></a><a href="#l581">581</a><td> if (!(path in deps.requires)) {<tr><td><a id="l582"></a><a href="#l582">582</a><td> deps.requires[path] = {};<tr><td><a id="l583"></a><a href="#l583">583</a><td> }<tr><td><a id="l584"></a><a href="#l584">584</a><td> deps.requires[path][require] = true;<tr><td><a id="l585"></a><a href="#l585">585</a><td> }<tr><td><a id="l586"></a><a href="#l586">586</a><td> }<tr><td><a id="l587"></a><a href="#l587">587</a><td>};<tr><td><a id="l588"></a><a href="#l588">588</a><td><tr><td><a id="l589"></a><a href="#l589">589</a><td><tr><td><a id="l590"></a><a href="#l590">590</a><td><tr><td><a id="l591"></a><a href="#l591">591</a><td><tr><td><a id="l592"></a><a href="#l592">592</a><td>// NOTE(nnaze): The debug DOM loader was included in base.js as an original way<tr><td><a id="l593"></a><a href="#l593">593</a><td>// to do &quot;debug-mode&quot; development. The dependency system can sometimes be<tr><td><a id="l594"></a><a href="#l594">594</a><td>// confusing, as can the debug DOM loader&#39;s asynchronous nature.<tr><td><a id="l595"></a><a href="#l595">595</a><td>//<tr><td><a id="l596"></a><a href="#l596">596</a><td>// With the DOM loader, a call to goog.require() is not blocking -- the script<tr><td><a id="l597"></a><a href="#l597">597</a><td>// will not load until some point after the current script. If a namespace is<tr><td><a id="l598"></a><a href="#l598">598</a><td>// needed at runtime, it needs to be defined in a previous script, or loaded via<tr><td><a id="l599"></a><a href="#l599">599</a><td>// require() with its registered dependencies.<tr><td><a id="l600"></a><a href="#l600">600</a><td>// User-defined namespaces may need their own deps file. See http://go/js_deps,<tr><td><a id="l601"></a><a href="#l601">601</a><td>// http://go/genjsdeps, or, externally, DepsWriter.<tr><td><a id="l602"></a><a href="#l602">602</a><td>// https://developers.google.com/closure/library/docs/depswriter<tr><td><a id="l603"></a><a href="#l603">603</a><td>//<tr><td><a id="l604"></a><a href="#l604">604</a><td>// Because of legacy clients, the DOM loader can&#39;t be easily removed from<tr><td><a id="l605"></a><a href="#l605">605</a><td>// base.js. Work is being done to make it disableable or replaceable for<tr><td><a id="l606"></a><a href="#l606">606</a><td>// different environments (DOM-less JavaScript interpreters like Rhino or V8,<tr><td><a id="l607"></a><a href="#l607">607</a><td>// for example). See bootstrap/ for more information.<tr><td><a id="l608"></a><a href="#l608">608</a><td><tr><td><a id="l609"></a><a href="#l609">609</a><td><tr><td><a id="l610"></a><a href="#l610">610</a><td>/**<tr><td><a id="l611"></a><a href="#l611">611</a><td> * @define {boolean} Whether to enable the debug loader.<tr><td><a id="l612"></a><a href="#l612">612</a><td> *<tr><td><a id="l613"></a><a href="#l613">613</a><td> * If enabled, a call to goog.require() will attempt to load the namespace by<tr><td><a id="l614"></a><a href="#l614">614</a><td> * appending a script tag to the DOM (if the namespace has been registered).<tr><td><a id="l615"></a><a href="#l615">615</a><td> *<tr><td><a id="l616"></a><a href="#l616">616</a><td> * If disabled, goog.require() will simply assert that the namespace has been<tr><td><a id="l617"></a><a href="#l617">617</a><td> * provided (and depend on the fact that some outside tool correctly ordered<tr><td><a id="l618"></a><a href="#l618">618</a><td> * the script).<tr><td><a id="l619"></a><a href="#l619">619</a><td> */<tr><td><a id="l620"></a><a href="#l620">620</a><td>goog.define(&#39;goog.ENABLE_DEBUG_LOADER&#39;, true);<tr><td><a id="l621"></a><a href="#l621">621</a><td><tr><td><a id="l622"></a><a href="#l622">622</a><td><tr><td><a id="l623"></a><a href="#l623">623</a><td>/**<tr><td><a id="l624"></a><a href="#l624">624</a><td> * @param {string} msg<tr><td><a id="l625"></a><a href="#l625">625</a><td> * @private<tr><td><a id="l626"></a><a href="#l626">626</a><td> */<tr><td><a id="l627"></a><a href="#l627">627</a><td>goog.logToConsole_ = function(msg) {<tr><td><a id="l628"></a><a href="#l628">628</a><td> if (goog.global.console) {<tr><td><a id="l629"></a><a href="#l629">629</a><td> goog.global.console[&#39;error&#39;](msg);<tr><td><a id="l630"></a><a href="#l630">630</a><td> }<tr><td><a id="l631"></a><a href="#l631">631</a><td>};<tr><td><a id="l632"></a><a href="#l632">632</a><td><tr><td><a id="l633"></a><a href="#l633">633</a><td><tr><td><a id="l634"></a><a href="#l634">634</a><td>/**<tr><td><a id="l635"></a><a href="#l635">635</a><td> * Implements a system for the dynamic resolution of dependencies that works in<tr><td><a id="l636"></a><a href="#l636">636</a><td> * parallel with the BUILD system. Note that all calls to goog.require will be<tr><td><a id="l637"></a><a href="#l637">637</a><td> * stripped by the JSCompiler when the --process_closure_primitives option is<tr><td><a id="l638"></a><a href="#l638">638</a><td> * used.<tr><td><a id="l639"></a><a href="#l639">639</a><td> * @see goog.provide<tr><td><a id="l640"></a><a href="#l640">640</a><td> * @param {string} name Namespace to include (as was given in goog.provide()) in<tr><td><a id="l641"></a><a href="#l641">641</a><td> * the form &quot;goog.package.part&quot;.<tr><td><a id="l642"></a><a href="#l642">642</a><td> * @return {?} If called within a goog.module file, the associated namespace or<tr><td><a id="l643"></a><a href="#l643">643</a><td> * module otherwise null.<tr><td><a id="l644"></a><a href="#l644">644</a><td> */<tr><td><a id="l645"></a><a href="#l645">645</a><td>goog.require = function(name) {<tr><td><a id="l646"></a><a href="#l646">646</a><td> // If the object already exists we do not need do do anything.<tr><td><a id="l647"></a><a href="#l647">647</a><td> if (!COMPILED) {<tr><td><a id="l648"></a><a href="#l648">648</a><td> if (goog.ENABLE_DEBUG_LOADER &amp;&amp; goog.IS_OLD_IE_) {<tr><td><a id="l649"></a><a href="#l649">649</a><td> goog.maybeProcessDeferredDep_(name);<tr><td><a id="l650"></a><a href="#l650">650</a><td> }<tr><td><a id="l651"></a><a href="#l651">651</a><td><tr><td><a id="l652"></a><a href="#l652">652</a><td> if (goog.isProvided_(name)) {<tr><td><a id="l653"></a><a href="#l653">653</a><td> if (goog.isInModuleLoader_()) {<tr><td><a id="l654"></a><a href="#l654">654</a><td> return goog.module.getInternal_(name);<tr><td><a id="l655"></a><a href="#l655">655</a><td> } else {<tr><td><a id="l656"></a><a href="#l656">656</a><td> return null;<tr><td><a id="l657"></a><a href="#l657">657</a><td> }<tr><td><a id="l658"></a><a href="#l658">658</a><td> }<tr><td><a id="l659"></a><a href="#l659">659</a><td><tr><td><a id="l660"></a><a href="#l660">660</a><td> if (goog.ENABLE_DEBUG_LOADER) {<tr><td><a id="l661"></a><a href="#l661">661</a><td> var path = goog.getPathFromDeps_(name);<tr><td><a id="l662"></a><a href="#l662">662</a><td> if (path) {<tr><td><a id="l663"></a><a href="#l663">663</a><td> goog.writeScripts_(path);<tr><td><a id="l664"></a><a href="#l664">664</a><td> return null;<tr><td><a id="l665"></a><a href="#l665">665</a><td> }<tr><td><a id="l666"></a><a href="#l666">666</a><td> }<tr><td><a id="l667"></a><a href="#l667">667</a><td><tr><td><a id="l668"></a><a href="#l668">668</a><td> var errorMessage = &#39;goog.require could not find: &#39; + name;<tr><td><a id="l669"></a><a href="#l669">669</a><td> goog.logToConsole_(errorMessage);<tr><td><a id="l670"></a><a href="#l670">670</a><td><tr><td><a id="l671"></a><a href="#l671">671</a><td> throw Error(errorMessage);<tr><td><a id="l672"></a><a href="#l672">672</a><td> }<tr><td><a id="l673"></a><a href="#l673">673</a><td>};<tr><td><a id="l674"></a><a href="#l674">674</a><td><tr><td><a id="l675"></a><a href="#l675">675</a><td><tr><td><a id="l676"></a><a href="#l676">676</a><td>/**<tr><td><a id="l677"></a><a href="#l677">677</a><td> * Path for included scripts.<tr><td><a id="l678"></a><a href="#l678">678</a><td> * @type {string}<tr><td><a id="l679"></a><a href="#l679">679</a><td> */<tr><td><a id="l680"></a><a href="#l680">680</a><td>goog.basePath = &#39;&#39;;<tr><td><a id="l681"></a><a href="#l681">681</a><td><tr><td><a id="l682"></a><a href="#l682">682</a><td><tr><td><a id="l683"></a><a href="#l683">683</a><td>/**<tr><td><a id="l684"></a><a href="#l684">684</a><td> * A hook for overriding the base path.<tr><td><a id="l685"></a><a href="#l685">685</a><td> * @type {string|undefined}<tr><td><a id="l686"></a><a href="#l686">686</a><td> */<tr><td><a id="l687"></a><a href="#l687">687</a><td>goog.global.CLOSURE_BASE_PATH;<tr><td><a id="l688"></a><a href="#l688">688</a><td><tr><td><a id="l689"></a><a href="#l689">689</a><td><tr><td><a id="l690"></a><a href="#l690">690</a><td>/**<tr><td><a id="l691"></a><a href="#l691">691</a><td> * Whether to write out Closure&#39;s deps file. By default, the deps are written.<tr><td><a id="l692"></a><a href="#l692">692</a><td> * @type {boolean|undefined}<tr><td><a id="l693"></a><a href="#l693">693</a><td> */<tr><td><a id="l694"></a><a href="#l694">694</a><td>goog.global.CLOSURE_NO_DEPS;<tr><td><a id="l695"></a><a href="#l695">695</a><td><tr><td><a id="l696"></a><a href="#l696">696</a><td><tr><td><a id="l697"></a><a href="#l697">697</a><td>/**<tr><td><a id="l698"></a><a href="#l698">698</a><td> * A function to import a single script. This is meant to be overridden when<tr><td><a id="l699"></a><a href="#l699">699</a><td> * Closure is being run in non-HTML contexts, such as web workers. It&#39;s defined<tr><td><a id="l700"></a><a href="#l700">700</a><td> * in the global scope so that it can be set before base.js is loaded, which<tr><td><a id="l701"></a><a href="#l701">701</a><td> * allows deps.js to be imported properly.<tr><td><a id="l702"></a><a href="#l702">702</a><td> *<tr><td><a id="l703"></a><a href="#l703">703</a><td> * The function is passed the script source, which is a relative URI. It should<tr><td><a id="l704"></a><a href="#l704">704</a><td> * return true if the script was imported, false otherwise.<tr><td><a id="l705"></a><a href="#l705">705</a><td> * @type {(function(string): boolean)|undefined}<tr><td><a id="l706"></a><a href="#l706">706</a><td> */<tr><td><a id="l707"></a><a href="#l707">707</a><td>goog.global.CLOSURE_IMPORT_SCRIPT;<tr><td><a id="l708"></a><a href="#l708">708</a><td><tr><td><a id="l709"></a><a href="#l709">709</a><td><tr><td><a id="l710"></a><a href="#l710">710</a><td>/**<tr><td><a id="l711"></a><a href="#l711">711</a><td> * Null function used for default values of callbacks, etc.<tr><td><a id="l712"></a><a href="#l712">712</a><td> * @return {void} Nothing.<tr><td><a id="l713"></a><a href="#l713">713</a><td> */<tr><td><a id="l714"></a><a href="#l714">714</a><td>goog.nullFunction = function() {};<tr><td><a id="l715"></a><a href="#l715">715</a><td><tr><td><a id="l716"></a><a href="#l716">716</a><td><tr><td><a id="l717"></a><a href="#l717">717</a><td>/**<tr><td><a id="l718"></a><a href="#l718">718</a><td> * When defining a class Foo with an abstract method bar(), you can do:<tr><td><a id="l719"></a><a href="#l719">719</a><td> * Foo.prototype.bar = goog.abstractMethod<tr><td><a id="l720"></a><a href="#l720">720</a><td> *<tr><td><a id="l721"></a><a href="#l721">721</a><td> * Now if a subclass of Foo fails to override bar(), an error will be thrown<tr><td><a id="l722"></a><a href="#l722">722</a><td> * when bar() is invoked.<tr><td><a id="l723"></a><a href="#l723">723</a><td> *<tr><td><a id="l724"></a><a href="#l724">724</a><td> * Note: This does not take the name of the function to override as an argument<tr><td><a id="l725"></a><a href="#l725">725</a><td> * because that would make it more difficult to obfuscate our JavaScript code.<tr><td><a id="l726"></a><a href="#l726">726</a><td> *<tr><td><a id="l727"></a><a href="#l727">727</a><td> * @type {!Function}<tr><td><a id="l728"></a><a href="#l728">728</a><td> * @throws {Error} when invoked to indicate the method should be overridden.<tr><td><a id="l729"></a><a href="#l729">729</a><td> */<tr><td><a id="l730"></a><a href="#l730">730</a><td>goog.abstractMethod = function() {<tr><td><a id="l731"></a><a href="#l731">731</a><td> throw Error(&#39;unimplemented abstract method&#39;);<tr><td><a id="l732"></a><a href="#l732">732</a><td>};<tr><td><a id="l733"></a><a href="#l733">733</a><td><tr><td><a id="l734"></a><a href="#l734">734</a><td><tr><td><a id="l735"></a><a href="#l735">735</a><td>/**<tr><td><a id="l736"></a><a href="#l736">736</a><td> * Adds a {@code getInstance} static method that always returns the same<tr><td><a id="l737"></a><a href="#l737">737</a><td> * instance object.<tr><td><a id="l738"></a><a href="#l738">738</a><td> * @param {!Function} ctor The constructor for the class to add the static<tr><td><a id="l739"></a><a href="#l739">739</a><td> * method to.<tr><td><a id="l740"></a><a href="#l740">740</a><td> */<tr><td><a id="l741"></a><a href="#l741">741</a><td>goog.addSingletonGetter = function(ctor) {<tr><td><a id="l742"></a><a href="#l742">742</a><td> ctor.getInstance = function() {<tr><td><a id="l743"></a><a href="#l743">743</a><td> if (ctor.instance_) {<tr><td><a id="l744"></a><a href="#l744">744</a><td> return ctor.instance_;<tr><td><a id="l745"></a><a href="#l745">745</a><td> }<tr><td><a id="l746"></a><a href="#l746">746</a><td> if (goog.DEBUG) {<tr><td><a id="l747"></a><a href="#l747">747</a><td> // NOTE: JSCompiler can&#39;t optimize away Array#push.<tr><td><a id="l748"></a><a href="#l748">748</a><td> goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor;<tr><td><a id="l749"></a><a href="#l749">749</a><td> }<tr><td><a id="l750"></a><a href="#l750">750</a><td> return ctor.instance_ = new ctor;<tr><td><a id="l751"></a><a href="#l751">751</a><td> };<tr><td><a id="l752"></a><a href="#l752">752</a><td>};<tr><td><a id="l753"></a><a href="#l753">753</a><td><tr><td><a id="l754"></a><a href="#l754">754</a><td><tr><td><a id="l755"></a><a href="#l755">755</a><td>/**<tr><td><a id="l756"></a><a href="#l756">756</a><td> * All singleton classes that have been instantiated, for testing. Don&#39;t read<tr><td><a id="l757"></a><a href="#l757">757</a><td> * it directly, use the {@code goog.testing.singleton} module. The compiler<tr><td><a id="l758"></a><a href="#l758">758</a><td> * removes this variable if unused.<tr><td><a id="l759"></a><a href="#l759">759</a><td> * @type {!Array&lt;!Function&gt;}<tr><td><a id="l760"></a><a href="#l760">760</a><td> * @private<tr><td><a id="l761"></a><a href="#l761">761</a><td> */<tr><td><a id="l762"></a><a href="#l762">762</a><td>goog.instantiatedSingletons_ = [];<tr><td><a id="l763"></a><a href="#l763">763</a><td><tr><td><a id="l764"></a><a href="#l764">764</a><td><tr><td><a id="l765"></a><a href="#l765">765</a><td>/**<tr><td><a id="l766"></a><a href="#l766">766</a><td> * @define {boolean} Whether to load goog.modules using {@code eval} when using<tr><td><a id="l767"></a><a href="#l767">767</a><td> * the debug loader. This provides a better debugging experience as the<tr><td><a id="l768"></a><a href="#l768">768</a><td> * source is unmodified and can be edited using Chrome Workspaces or similar.<tr><td><a id="l769"></a><a href="#l769">769</a><td> * However in some environments the use of {@code eval} is banned<tr><td><a id="l770"></a><a href="#l770">770</a><td> * so we provide an alternative.<tr><td><a id="l771"></a><a href="#l771">771</a><td> */<tr><td><a id="l772"></a><a href="#l772">772</a><td>goog.define(&#39;goog.LOAD_MODULE_USING_EVAL&#39;, true);<tr><td><a id="l773"></a><a href="#l773">773</a><td><tr><td><a id="l774"></a><a href="#l774">774</a><td><tr><td><a id="l775"></a><a href="#l775">775</a><td>/**<tr><td><a id="l776"></a><a href="#l776">776</a><td> * @define {boolean} Whether the exports of goog.modules should be sealed when<tr><td><a id="l777"></a><a href="#l777">777</a><td> * possible.<tr><td><a id="l778"></a><a href="#l778">778</a><td> */<tr><td><a id="l779"></a><a href="#l779">779</a><td>goog.define(&#39;goog.SEAL_MODULE_EXPORTS&#39;, goog.DEBUG);<tr><td><a id="l780"></a><a href="#l780">780</a><td><tr><td><a id="l781"></a><a href="#l781">781</a><td><tr><td><a id="l782"></a><a href="#l782">782</a><td>/**<tr><td><a id="l783"></a><a href="#l783">783</a><td> * The registry of initialized modules:<tr><td><a id="l784"></a><a href="#l784">784</a><td> * the module identifier to module exports map.<tr><td><a id="l785"></a><a href="#l785">785</a><td> * @private @const {!Object&lt;string, ?&gt;}<tr><td><a id="l786"></a><a href="#l786">786</a><td> */<tr><td><a id="l787"></a><a href="#l787">787</a><td>goog.loadedModules_ = {};<tr><td><a id="l788"></a><a href="#l788">788</a><td><tr><td><a id="l789"></a><a href="#l789">789</a><td><tr><td><a id="l790"></a><a href="#l790">790</a><td>/**<tr><td><a id="l791"></a><a href="#l791">791</a><td> * True if goog.dependencies_ is available.<tr><td><a id="l792"></a><a href="#l792">792</a><td> * @const {boolean}<tr><td><a id="l793"></a><a href="#l793">793</a><td> */<tr><td><a id="l794"></a><a href="#l794">794</a><td>goog.DEPENDENCIES_ENABLED = !COMPILED &amp;&amp; goog.ENABLE_DEBUG_LOADER;<tr><td><a id="l795"></a><a href="#l795">795</a><td><tr><td><a id="l796"></a><a href="#l796">796</a><td><tr><td><a id="l797"></a><a href="#l797">797</a><td>if (goog.DEPENDENCIES_ENABLED) {<tr><td><a id="l798"></a><a href="#l798">798</a><td><tr><td><a id="l799"></a><a href="#l799">799</a><td> /**<tr><td><a id="l800"></a><a href="#l800">800</a><td> * This object is used to keep track of dependencies and other data that is<tr><td><a id="l801"></a><a href="#l801">801</a><td> * used for loading scripts.<tr><td><a id="l802"></a><a href="#l802">802</a><td> * @private<tr><td><a id="l803"></a><a href="#l803">803</a><td> * @type {{<tr><td><a id="l804"></a><a href="#l804">804</a><td> * pathIsModule: !Object&lt;string, boolean&gt;,<tr><td><a id="l805"></a><a href="#l805">805</a><td> * nameToPath: !Object&lt;string, string&gt;,<tr><td><a id="l806"></a><a href="#l806">806</a><td> * requires: !Object&lt;string, !Object&lt;string, boolean&gt;&gt;,<tr><td><a id="l807"></a><a href="#l807">807</a><td> * visited: !Object&lt;string, boolean&gt;,<tr><td><a id="l808"></a><a href="#l808">808</a><td> * written: !Object&lt;string, boolean&gt;,<tr><td><a id="l809"></a><a href="#l809">809</a><td> * deferred: !Object&lt;string, string&gt;<tr><td><a id="l810"></a><a href="#l810">810</a><td> * }}<tr><td><a id="l811"></a><a href="#l811">811</a><td> */<tr><td><a id="l812"></a><a href="#l812">812</a><td> goog.dependencies_ = {<tr><td><a id="l813"></a><a href="#l813">813</a><td> pathIsModule: {}, // 1 to 1<tr><td><a id="l814"></a><a href="#l814">814</a><td><tr><td><a id="l815"></a><a href="#l815">815</a><td> nameToPath: {}, // 1 to 1<tr><td><a id="l816"></a><a href="#l816">816</a><td><tr><td><a id="l817"></a><a href="#l817">817</a><td> requires: {}, // 1 to many<tr><td><a id="l818"></a><a href="#l818">818</a><td><tr><td><a id="l819"></a><a href="#l819">819</a><td> // Used when resolving dependencies to prevent us from visiting file twice.<tr><td><a id="l820"></a><a href="#l820">820</a><td> visited: {},<tr><td><a id="l821"></a><a href="#l821">821</a><td><tr><td><a id="l822"></a><a href="#l822">822</a><td> written: {}, // Used to keep track of script files we have written.<tr><td><a id="l823"></a><a href="#l823">823</a><td><tr><td><a id="l824"></a><a href="#l824">824</a><td> deferred: {} // Used to track deferred module evaluations in old IEs<tr><td><a id="l825"></a><a href="#l825">825</a><td> };<tr><td><a id="l826"></a><a href="#l826">826</a><td><tr><td><a id="l827"></a><a href="#l827">827</a><td><tr><td><a id="l828"></a><a href="#l828">828</a><td> /**<tr><td><a id="l829"></a><a href="#l829">829</a><td> * Tries to detect whether is in the context of an HTML document.<tr><td><a id="l830"></a><a href="#l830">830</a><td> * @return {boolean} True if it looks like HTML document.<tr><td><a id="l831"></a><a href="#l831">831</a><td> * @private<tr><td><a id="l832"></a><a href="#l832">832</a><td> */<tr><td><a id="l833"></a><a href="#l833">833</a><td> goog.inHtmlDocument_ = function() {<tr><td><a id="l834"></a><a href="#l834">834</a><td> /** @type {Document} */<tr><td><a id="l835"></a><a href="#l835">835</a><td> var doc = goog.global.document;<tr><td><a id="l836"></a><a href="#l836">836</a><td> return doc != null &amp;&amp; &#39;write&#39; in doc; // XULDocument misses write.<tr><td><a id="l837"></a><a href="#l837">837</a><td> };<tr><td><a id="l838"></a><a href="#l838">838</a><td><tr><td><a id="l839"></a><a href="#l839">839</a><td><tr><td><a id="l840"></a><a href="#l840">840</a><td> /**<tr><td><a id="l841"></a><a href="#l841">841</a><td> * Tries to detect the base path of base.js script that bootstraps Closure.<tr><td><a id="l842"></a><a href="#l842">842</a><td> * @private<tr><td><a id="l843"></a><a href="#l843">843</a><td> */<tr><td><a id="l844"></a><a href="#l844">844</a><td> goog.findBasePath_ = function() {<tr><td><a id="l845"></a><a href="#l845">845</a><td> if (goog.isDef(goog.global.CLOSURE_BASE_PATH)) {<tr><td><a id="l846"></a><a href="#l846">846</a><td> goog.basePath = goog.global.CLOSURE_BASE_PATH;<tr><td><a id="l847"></a><a href="#l847">847</a><td> return;<tr><td><a id="l848"></a><a href="#l848">848</a><td> } else if (!goog.inHtmlDocument_()) {<tr><td><a id="l849"></a><a href="#l849">849</a><td> return;<tr><td><a id="l850"></a><a href="#l850">850</a><td> }<tr><td><a id="l851"></a><a href="#l851">851</a><td> /** @type {Document} */<tr><td><a id="l852"></a><a href="#l852">852</a><td> var doc = goog.global.document;<tr><td><a id="l853"></a><a href="#l853">853</a><td> var scripts = doc.getElementsByTagName(&#39;SCRIPT&#39;);<tr><td><a id="l854"></a><a href="#l854">854</a><td> // Search backwards since the current script is in almost all cases the one<tr><td><a id="l855"></a><a href="#l855">855</a><td> // that has base.js.<tr><td><a id="l856"></a><a href="#l856">856</a><td> for (var i = scripts.length - 1; i &gt;= 0; --i) {<tr><td><a id="l857"></a><a href="#l857">857</a><td> var script = /** @type {!HTMLScriptElement} */ (scripts[i]);<tr><td><a id="l858"></a><a href="#l858">858</a><td> var src = script.src;<tr><td><a id="l859"></a><a href="#l859">859</a><td> var qmark = src.lastIndexOf(&#39;?&#39;);<tr><td><a id="l860"></a><a href="#l860">860</a><td> var l = qmark == -1 ? src.length : qmark;<tr><td><a id="l861"></a><a href="#l861">861</a><td> if (src.substr(l - 7, 7) == &#39;base.js&#39;) {<tr><td><a id="l862"></a><a href="#l862">862</a><td> goog.basePath = src.substr(0, l - 7);<tr><td><a id="l863"></a><a href="#l863">863</a><td> return;<tr><td><a id="l864"></a><a href="#l864">864</a><td> }<tr><td><a id="l865"></a><a href="#l865">865</a><td> }<tr><td><a id="l866"></a><a href="#l866">866</a><td> };<tr><td><a id="l867"></a><a href="#l867">867</a><td><tr><td><a id="l868"></a><a href="#l868">868</a><td><tr><td><a id="l869"></a><a href="#l869">869</a><td> /**<tr><td><a id="l870"></a><a href="#l870">870</a><td> * Imports a script if, and only if, that script hasn&#39;t already been imported.<tr><td><a id="l871"></a><a href="#l871">871</a><td> * (Must be called at execution time)<tr><td><a id="l872"></a><a href="#l872">872</a><td> * @param {string} src Script source.<tr><td><a id="l873"></a><a href="#l873">873</a><td> * @param {string=} opt_sourceText The optionally source text to evaluate<tr><td><a id="l874"></a><a href="#l874">874</a><td> * @private<tr><td><a id="l875"></a><a href="#l875">875</a><td> */<tr><td><a id="l876"></a><a href="#l876">876</a><td> goog.importScript_ = function(src, opt_sourceText) {<tr><td><a id="l877"></a><a href="#l877">877</a><td> var importScript = goog.global.CLOSURE_IMPORT_SCRIPT ||<tr><td><a id="l878"></a><a href="#l878">878</a><td> goog.writeScriptTag_;<tr><td><a id="l879"></a><a href="#l879">879</a><td> if (importScript(src, opt_sourceText)) {<tr><td><a id="l880"></a><a href="#l880">880</a><td> goog.dependencies_.written[src] = true;<tr><td><a id="l881"></a><a href="#l881">881</a><td> }<tr><td><a id="l882"></a><a href="#l882">882</a><td> };<tr><td><a id="l883"></a><a href="#l883">883</a><td><tr><td><a id="l884"></a><a href="#l884">884</a><td><tr><td><a id="l885"></a><a href="#l885">885</a><td> /** @const @private {boolean} */<tr><td><a id="l886"></a><a href="#l886">886</a><td> goog.IS_OLD_IE_ = !!(!goog.global.atob &amp;&amp; goog.global.document &amp;&amp;<tr><td><a id="l887"></a><a href="#l887">887</a><td> goog.global.document.all);<tr><td><a id="l888"></a><a href="#l888">888</a><td><tr><td><a id="l889"></a><a href="#l889">889</a><td><tr><td><a id="l890"></a><a href="#l890">890</a><td> /**<tr><td><a id="l891"></a><a href="#l891">891</a><td> * Given a URL initiate retrieval and execution of the module.<tr><td><a id="l892"></a><a href="#l892">892</a><td> * @param {string} src Script source URL.<tr><td><a id="l893"></a><a href="#l893">893</a><td> * @private<tr><td><a id="l894"></a><a href="#l894">894</a><td> */<tr><td><a id="l895"></a><a href="#l895">895</a><td> goog.importModule_ = function(src) {<tr><td><a id="l896"></a><a href="#l896">896</a><td> // In an attempt to keep browsers from timing out loading scripts using<tr><td><a id="l897"></a><a href="#l897">897</a><td> // synchronous XHRs, put each load in its own script block.<tr><td><a id="l898"></a><a href="#l898">898</a><td> var bootstrap = &#39;goog.retrieveAndExecModule_(&quot;&#39; + src + &#39;&quot;);&#39;;<tr><td><a id="l899"></a><a href="#l899">899</a><td><tr><td><a id="l900"></a><a href="#l900">900</a><td> if (goog.importScript_(&#39;&#39;, bootstrap)) {<tr><td><a id="l901"></a><a href="#l901">901</a><td> goog.dependencies_.written[src] = true;<tr><td><a id="l902"></a><a href="#l902">902</a><td> }<tr><td><a id="l903"></a><a href="#l903">903</a><td> };<tr><td><a id="l904"></a><a href="#l904">904</a><td><tr><td><a id="l905"></a><a href="#l905">905</a><td><tr><td><a id="l906"></a><a href="#l906">906</a><td> /** @private {!Array&lt;string&gt;} */<tr><td><a id="l907"></a><a href="#l907">907</a><td> goog.queuedModules_ = [];<tr><td><a id="l908"></a><a href="#l908">908</a><td><tr><td><a id="l909"></a><a href="#l909">909</a><td><tr><td><a id="l910"></a><a href="#l910">910</a><td> /**<tr><td><a id="l911"></a><a href="#l911">911</a><td> * Return an appropriate module text. Suitable to insert into<tr><td><a id="l912"></a><a href="#l912">912</a><td> * a script tag (that is unescaped).<tr><td><a id="l913"></a><a href="#l913">913</a><td> * @param {string} srcUrl<tr><td><a id="l914"></a><a href="#l914">914</a><td> * @param {string} scriptText<tr><td><a id="l915"></a><a href="#l915">915</a><td> * @return {string}<tr><td><a id="l916"></a><a href="#l916">916</a><td> * @private<tr><td><a id="l917"></a><a href="#l917">917</a><td> */<tr><td><a id="l918"></a><a href="#l918">918</a><td> goog.wrapModule_ = function(srcUrl, scriptText) {<tr><td><a id="l919"></a><a href="#l919">919</a><td> if (!goog.LOAD_MODULE_USING_EVAL || !goog.isDef(goog.global.JSON)) {<tr><td><a id="l920"></a><a href="#l920">920</a><td> return &#39;&#39; +<tr><td><a id="l921"></a><a href="#l921">921</a><td> &#39;goog.loadModule(function(exports) {&#39; +<tr><td><a id="l922"></a><a href="#l922">922</a><td> &#39;&quot;use strict&quot;;&#39; +<tr><td><a id="l923"></a><a href="#l923">923</a><td> scriptText +<tr><td><a id="l924"></a><a href="#l924">924</a><td> &#39;\n&#39; + // terminate any trailing single line comment.<tr><td><a id="l925"></a><a href="#l925">925</a><td> &#39;;return exports&#39; +<tr><td><a id="l926"></a><a href="#l926">926</a><td> &#39;});&#39; +<tr><td><a id="l927"></a><a href="#l927">927</a><td> &#39;\n//# sourceURL=&#39; + srcUrl + &#39;\n&#39;;<tr><td><a id="l928"></a><a href="#l928">928</a><td> } else {<tr><td><a id="l929"></a><a href="#l929">929</a><td> return &#39;&#39; +<tr><td><a id="l930"></a><a href="#l930">930</a><td> &#39;goog.loadModule(&#39; +<tr><td><a id="l931"></a><a href="#l931">931</a><td> goog.global.JSON.stringify(<tr><td><a id="l932"></a><a href="#l932">932</a><td> scriptText + &#39;\n//# sourceURL=&#39; + srcUrl + &#39;\n&#39;) +<tr><td><a id="l933"></a><a href="#l933">933</a><td> &#39;);&#39;;<tr><td><a id="l934"></a><a href="#l934">934</a><td> }<tr><td><a id="l935"></a><a href="#l935">935</a><td> };<tr><td><a id="l936"></a><a href="#l936">936</a><td><tr><td><a id="l937"></a><a href="#l937">937</a><td> // On IE9 and earlier, it is necessary to handle<tr><td><a id="l938"></a><a href="#l938">938</a><td> // deferred module loads. In later browsers, the<tr><td><a id="l939"></a><a href="#l939">939</a><td> // code to be evaluated is simply inserted as a script<tr><td><a id="l940"></a><a href="#l940">940</a><td> // block in the correct order. To eval deferred<tr><td><a id="l941"></a><a href="#l941">941</a><td> // code at the right time, we piggy back on goog.require to call<tr><td><a id="l942"></a><a href="#l942">942</a><td> // goog.maybeProcessDeferredDep_.<tr><td><a id="l943"></a><a href="#l943">943</a><td> //<tr><td><a id="l944"></a><a href="#l944">944</a><td> // The goog.requires are used both to bootstrap<tr><td><a id="l945"></a><a href="#l945">945</a><td> // the loading process (when no deps are available) and<tr><td><a id="l946"></a><a href="#l946">946</a><td> // declare that they should be available.<tr><td><a id="l947"></a><a href="#l947">947</a><td> //<tr><td><a id="l948"></a><a href="#l948">948</a><td> // Here we eval the sources, if all the deps are available<tr><td><a id="l949"></a><a href="#l949">949</a><td> // either already eval&#39;d or goog.require&#39;d. This will<tr><td><a id="l950"></a><a href="#l950">950</a><td> // be the case when all the dependencies have already<tr><td><a id="l951"></a><a href="#l951">951</a><td> // been loaded, and the dependent module is loaded.<tr><td><a id="l952"></a><a href="#l952">952</a><td> //<tr><td><a id="l953"></a><a href="#l953">953</a><td> // But this alone isn&#39;t sufficient because it is also<tr><td><a id="l954"></a><a href="#l954">954</a><td> // necessary to handle the case where there is no root<tr><td><a id="l955"></a><a href="#l955">955</a><td> // that is not deferred. For that there we register for an event<tr><td><a id="l956"></a><a href="#l956">956</a><td> // and trigger goog.loadQueuedModules_ handle any remaining deferred<tr><td><a id="l957"></a><a href="#l957">957</a><td> // evaluations.<tr><td><a id="l958"></a><a href="#l958">958</a><td><tr><td><a id="l959"></a><a href="#l959">959</a><td> /**<tr><td><a id="l960"></a><a href="#l960">960</a><td> * Handle any remaining deferred goog.module evals.<tr><td><a id="l961"></a><a href="#l961">961</a><td> * @private<tr><td><a id="l962"></a><a href="#l962">962</a><td> */<tr><td><a id="l963"></a><a href="#l963">963</a><td> goog.loadQueuedModules_ = function() {<tr><td><a id="l964"></a><a href="#l964">964</a><td> var count = goog.queuedModules_.length;<tr><td><a id="l965"></a><a href="#l965">965</a><td> if (count &gt; 0) {<tr><td><a id="l966"></a><a href="#l966">966</a><td> var queue = goog.queuedModules_;<tr><td><a id="l967"></a><a href="#l967">967</a><td> goog.queuedModules_ = [];<tr><td><a id="l968"></a><a href="#l968">968</a><td> for (var i = 0; i &lt; count; i++) {<tr><td><a id="l969"></a><a href="#l969">969</a><td> var path = queue[i];<tr><td><a id="l970"></a><a href="#l970">970</a><td> goog.maybeProcessDeferredPath_(path);<tr><td><a id="l971"></a><a href="#l971">971</a><td> }<tr><td><a id="l972"></a><a href="#l972">972</a><td> }<tr><td><a id="l973"></a><a href="#l973">973</a><td> };<tr><td><a id="l974"></a><a href="#l974">974</a><td><tr><td><a id="l975"></a><a href="#l975">975</a><td><tr><td><a id="l976"></a><a href="#l976">976</a><td> /**<tr><td><a id="l977"></a><a href="#l977">977</a><td> * Eval the named module if its dependencies are<tr><td><a id="l978"></a><a href="#l978">978</a><td> * available.<tr><td><a id="l979"></a><a href="#l979">979</a><td> * @param {string} name The module to load.<tr><td><a id="l980"></a><a href="#l980">980</a><td> * @private<tr><td><a id="l981"></a><a href="#l981">981</a><td> */<tr><td><a id="l982"></a><a href="#l982">982</a><td> goog.maybeProcessDeferredDep_ = function(name) {<tr><td><a id="l983"></a><a href="#l983">983</a><td> if (goog.isDeferredModule_(name) &amp;&amp;<tr><td><a id="l984"></a><a href="#l984">984</a><td> goog.allDepsAreAvailable_(name)) {<tr><td><a id="l985"></a><a href="#l985">985</a><td> var path = goog.getPathFromDeps_(name);<tr><td><a id="l986"></a><a href="#l986">986</a><td> goog.maybeProcessDeferredPath_(goog.basePath + path);<tr><td><a id="l987"></a><a href="#l987">987</a><td> }<tr><td><a id="l988"></a><a href="#l988">988</a><td> };<tr><td><a id="l989"></a><a href="#l989">989</a><td><tr><td><a id="l990"></a><a href="#l990">990</a><td> /**<tr><td><a id="l991"></a><a href="#l991">991</a><td> * @param {string} name The module to check.<tr><td><a id="l992"></a><a href="#l992">992</a><td> * @return {boolean} Whether the name represents a<tr><td><a id="l993"></a><a href="#l993">993</a><td> * module whose evaluation has been deferred.<tr><td><a id="l994"></a><a href="#l994">994</a><td> * @private<tr><td><a id="l995"></a><a href="#l995">995</a><td> */<tr><td><a id="l996"></a><a href="#l996">996</a><td> goog.isDeferredModule_ = function(name) {<tr><td><a id="l997"></a><a href="#l997">997</a><td> var path = goog.getPathFromDeps_(name);<tr><td><a id="l998"></a><a href="#l998">998</a><td> if (path &amp;&amp; goog.dependencies_.pathIsModule[path]) {<tr><td><a id="l999"></a><a href="#l999">999</a><td> var abspath = goog.basePath + path;<tr><td><a id="l1000"></a><a href="#l1000">1000</a><td> return (abspath) in goog.dependencies_.deferred;<tr><td><a id="l1001"></a><a href="#l1001">1001</a><td> }<tr><td><a id="l1002"></a><a href="#l1002">1002</a><td> return false;<tr><td><a id="l1003"></a><a href="#l1003">1003</a><td> };<tr><td><a id="l1004"></a><a href="#l1004">1004</a><td><tr><td><a id="l1005"></a><a href="#l1005">1005</a><td> /**<tr><td><a id="l1006"></a><a href="#l1006">1006</a><td> * @param {string} name The module to check.<tr><td><a id="l1007"></a><a href="#l1007">1007</a><td> * @return {boolean} Whether the name represents a<tr><td><a id="l1008"></a><a href="#l1008">1008</a><td> * module whose declared dependencies have all been loaded<tr><td><a id="l1009"></a><a href="#l1009">1009</a><td> * (eval&#39;d or a deferred module load)<tr><td><a id="l1010"></a><a href="#l1010">1010</a><td> * @private<tr><td><a id="l1011"></a><a href="#l1011">1011</a><td> */<tr><td><a id="l1012"></a><a href="#l1012">1012</a><td> goog.allDepsAreAvailable_ = function(name) {<tr><td><a id="l1013"></a><a href="#l1013">1013</a><td> var path = goog.getPathFromDeps_(name);<tr><td><a id="l1014"></a><a href="#l1014">1014</a><td> if (path &amp;&amp; (path in goog.dependencies_.requires)) {<tr><td><a id="l1015"></a><a href="#l1015">1015</a><td> for (var requireName in goog.dependencies_.requires[path]) {<tr><td><a id="l1016"></a><a href="#l1016">1016</a><td> if (!goog.isProvided_(requireName) &amp;&amp;<tr><td><a id="l1017"></a><a href="#l1017">1017</a><td> !goog.isDeferredModule_(requireName)) {<tr><td><a id="l1018"></a><a href="#l1018">1018</a><td> return false;<tr><td><a id="l1019"></a><a href="#l1019">1019</a><td> }<tr><td><a id="l1020"></a><a href="#l1020">1020</a><td> }<tr><td><a id="l1021"></a><a href="#l1021">1021</a><td> }<tr><td><a id="l1022"></a><a href="#l1022">1022</a><td> return true;<tr><td><a id="l1023"></a><a href="#l1023">1023</a><td> };<tr><td><a id="l1024"></a><a href="#l1024">1024</a><td><tr><td><a id="l1025"></a><a href="#l1025">1025</a><td><tr><td><a id="l1026"></a><a href="#l1026">1026</a><td> /**<tr><td><a id="l1027"></a><a href="#l1027">1027</a><td> * @param {string} abspath<tr><td><a id="l1028"></a><a href="#l1028">1028</a><td> * @private<tr><td><a id="l1029"></a><a href="#l1029">1029</a><td> */<tr><td><a id="l1030"></a><a href="#l1030">1030</a><td> goog.maybeProcessDeferredPath_ = function(abspath) {<tr><td><a id="l1031"></a><a href="#l1031">1031</a><td> if (abspath in goog.dependencies_.deferred) {<tr><td><a id="l1032"></a><a href="#l1032">1032</a><td> var src = goog.dependencies_.deferred[abspath];<tr><td><a id="l1033"></a><a href="#l1033">1033</a><td> delete goog.dependencies_.deferred[abspath];<tr><td><a id="l1034"></a><a href="#l1034">1034</a><td> goog.globalEval(src);<tr><td><a id="l1035"></a><a href="#l1035">1035</a><td> }<tr><td><a id="l1036"></a><a href="#l1036">1036</a><td> };<tr><td><a id="l1037"></a><a href="#l1037">1037</a><td><tr><td><a id="l1038"></a><a href="#l1038">1038</a><td><tr><td><a id="l1039"></a><a href="#l1039">1039</a><td> /**<tr><td><a id="l1040"></a><a href="#l1040">1040</a><td> * Load a goog.module from the provided URL. This is not a general purpose<tr><td><a id="l1041"></a><a href="#l1041">1041</a><td> * code loader and does not support late loading code, that is it should only<tr><td><a id="l1042"></a><a href="#l1042">1042</a><td> * be used during page load. This method exists to support unit tests and<tr><td><a id="l1043"></a><a href="#l1043">1043</a><td> * &quot;debug&quot; loaders that would otherwise have inserted script tags. Under the<tr><td><a id="l1044"></a><a href="#l1044">1044</a><td> * hood this needs to use a synchronous XHR and is not recommeneded for<tr><td><a id="l1045"></a><a href="#l1045">1045</a><td> * production code.<tr><td><a id="l1046"></a><a href="#l1046">1046</a><td> *<tr><td><a id="l1047"></a><a href="#l1047">1047</a><td> * The module&#39;s goog.requires must have already been satisified; an exception<tr><td><a id="l1048"></a><a href="#l1048">1048</a><td> * will be thrown if this is not the case. This assumption is that no<tr><td><a id="l1049"></a><a href="#l1049">1049</a><td> * &quot;deps.js&quot; file exists, so there is no way to discover and locate the<tr><td><a id="l1050"></a><a href="#l1050">1050</a><td> * module-to-be-loaded&#39;s dependencies and no attempt is made to do so.<tr><td><a id="l1051"></a><a href="#l1051">1051</a><td> *<tr><td><a id="l1052"></a><a href="#l1052">1052</a><td> * There should only be one attempt to load a module. If<tr><td><a id="l1053"></a><a href="#l1053">1053</a><td> * &quot;goog.loadModuleFromUrl&quot; is called for an already loaded module, an<tr><td><a id="l1054"></a><a href="#l1054">1054</a><td> * exception will be throw.<tr><td><a id="l1055"></a><a href="#l1055">1055</a><td> *<tr><td><a id="l1056"></a><a href="#l1056">1056</a><td> * @param {string} url The URL from which to attempt to load the goog.module.<tr><td><a id="l1057"></a><a href="#l1057">1057</a><td> */<tr><td><a id="l1058"></a><a href="#l1058">1058</a><td> goog.loadModuleFromUrl = function(url) {<tr><td><a id="l1059"></a><a href="#l1059">1059</a><td> // Because this executes synchronously, we don&#39;t need to do any additional<tr><td><a id="l1060"></a><a href="#l1060">1060</a><td> // bookkeeping. When &quot;goog.loadModule&quot; the namespace will be marked as<tr><td><a id="l1061"></a><a href="#l1061">1061</a><td> // having been provided which is sufficient.<tr><td><a id="l1062"></a><a href="#l1062">1062</a><td> goog.retrieveAndExecModule_(url);<tr><td><a id="l1063"></a><a href="#l1063">1063</a><td> };<tr><td><a id="l1064"></a><a href="#l1064">1064</a><td><tr><td><a id="l1065"></a><a href="#l1065">1065</a><td><tr><td><a id="l1066"></a><a href="#l1066">1066</a><td> /**<tr><td><a id="l1067"></a><a href="#l1067">1067</a><td> * @param {function(?):?|string} moduleDef The module definition.<tr><td><a id="l1068"></a><a href="#l1068">1068</a><td> */<tr><td><a id="l1069"></a><a href="#l1069">1069</a><td> goog.loadModule = function(moduleDef) {<tr><td><a id="l1070"></a><a href="#l1070">1070</a><td> // NOTE: we allow function definitions to be either in the from<tr><td><a id="l1071"></a><a href="#l1071">1071</a><td> // of a string to eval (which keeps the original source intact) or<tr><td><a id="l1072"></a><a href="#l1072">1072</a><td> // in a eval forbidden environment (CSP) we allow a function definition<tr><td><a id="l1073"></a><a href="#l1073">1073</a><td> // which in its body must call {@code goog.module}, and return the exports<tr><td><a id="l1074"></a><a href="#l1074">1074</a><td> // of the module.<tr><td><a id="l1075"></a><a href="#l1075">1075</a><td> var previousState = goog.moduleLoaderState_;<tr><td><a id="l1076"></a><a href="#l1076">1076</a><td> try {<tr><td><a id="l1077"></a><a href="#l1077">1077</a><td> goog.moduleLoaderState_ = {<tr><td><a id="l1078"></a><a href="#l1078">1078</a><td> moduleName: undefined,<tr><td><a id="l1079"></a><a href="#l1079">1079</a><td> declareLegacyNamespace: false<tr><td><a id="l1080"></a><a href="#l1080">1080</a><td> };<tr><td><a id="l1081"></a><a href="#l1081">1081</a><td> var exports;<tr><td><a id="l1082"></a><a href="#l1082">1082</a><td> if (goog.isFunction(moduleDef)) {<tr><td><a id="l1083"></a><a href="#l1083">1083</a><td> exports = moduleDef.call(goog.global, {});<tr><td><a id="l1084"></a><a href="#l1084">1084</a><td> } else if (goog.isString(moduleDef)) {<tr><td><a id="l1085"></a><a href="#l1085">1085</a><td> exports = goog.loadModuleFromSource_.call(goog.global, moduleDef);<tr><td><a id="l1086"></a><a href="#l1086">1086</a><td> } else {<tr><td><a id="l1087"></a><a href="#l1087">1087</a><td> throw Error(&#39;Invalid module definition&#39;);<tr><td><a id="l1088"></a><a href="#l1088">1088</a><td> }<tr><td><a id="l1089"></a><a href="#l1089">1089</a><td><tr><td><a id="l1090"></a><a href="#l1090">1090</a><td> var moduleName = goog.moduleLoaderState_.moduleName;<tr><td><a id="l1091"></a><a href="#l1091">1091</a><td> if (!goog.isString(moduleName) || !moduleName) {<tr><td><a id="l1092"></a><a href="#l1092">1092</a><td> throw Error(&#39;Invalid module name \&quot;&#39; + moduleName + &#39;\&quot;&#39;);<tr><td><a id="l1093"></a><a href="#l1093">1093</a><td> }<tr><td><a id="l1094"></a><a href="#l1094">1094</a><td><tr><td><a id="l1095"></a><a href="#l1095">1095</a><td> // Don&#39;t seal legacy namespaces as they may be uses as a parent of<tr><td><a id="l1096"></a><a href="#l1096">1096</a><td> // another namespace<tr><td><a id="l1097"></a><a href="#l1097">1097</a><td> if (goog.moduleLoaderState_.declareLegacyNamespace) {<tr><td><a id="l1098"></a><a href="#l1098">1098</a><td> goog.constructNamespace_(moduleName, exports);<tr><td><a id="l1099"></a><a href="#l1099">1099</a><td> } else if (goog.SEAL_MODULE_EXPORTS &amp;&amp; Object.seal) {<tr><td><a id="l1100"></a><a href="#l1100">1100</a><td> Object.seal(exports);<tr><td><a id="l1101"></a><a href="#l1101">1101</a><td> }<tr><td><a id="l1102"></a><a href="#l1102">1102</a><td><tr><td><a id="l1103"></a><a href="#l1103">1103</a><td> goog.loadedModules_[moduleName] = exports;<tr><td><a id="l1104"></a><a href="#l1104">1104</a><td> } finally {<tr><td><a id="l1105"></a><a href="#l1105">1105</a><td> goog.moduleLoaderState_ = previousState;<tr><td><a id="l1106"></a><a href="#l1106">1106</a><td> }<tr><td><a id="l1107"></a><a href="#l1107">1107</a><td> };<tr><td><a id="l1108"></a><a href="#l1108">1108</a><td><tr><td><a id="l1109"></a><a href="#l1109">1109</a><td><tr><td><a id="l1110"></a><a href="#l1110">1110</a><td> /**<tr><td><a id="l1111"></a><a href="#l1111">1111</a><td> * @private @const {function(string):?}<tr><td><a id="l1112"></a><a href="#l1112">1112</a><td> *<tr><td><a id="l1113"></a><a href="#l1113">1113</a><td> * The new type inference warns because this function has no formal<tr><td><a id="l1114"></a><a href="#l1114">1114</a><td> * parameters, but its jsdoc says that it takes one argument.<tr><td><a id="l1115"></a><a href="#l1115">1115</a><td> * (The argument is used via arguments[0], but NTI does not detect this.)<tr><td><a id="l1116"></a><a href="#l1116">1116</a><td> * @suppress {newCheckTypes}<tr><td><a id="l1117"></a><a href="#l1117">1117</a><td> */<tr><td><a id="l1118"></a><a href="#l1118">1118</a><td> goog.loadModuleFromSource_ = function() {<tr><td><a id="l1119"></a><a href="#l1119">1119</a><td> // NOTE: we avoid declaring parameters or local variables here to avoid<tr><td><a id="l1120"></a><a href="#l1120">1120</a><td> // masking globals or leaking values into the module definition.<tr><td><a id="l1121"></a><a href="#l1121">1121</a><td> &#39;use strict&#39;;<tr><td><a id="l1122"></a><a href="#l1122">1122</a><td> var exports = {};<tr><td><a id="l1123"></a><a href="#l1123">1123</a><td> eval(arguments[0]);<tr><td><a id="l1124"></a><a href="#l1124">1124</a><td> return exports;<tr><td><a id="l1125"></a><a href="#l1125">1125</a><td> };<tr><td><a id="l1126"></a><a href="#l1126">1126</a><td><tr><td><a id="l1127"></a><a href="#l1127">1127</a><td><tr><td><a id="l1128"></a><a href="#l1128">1128</a><td> /**<tr><td><a id="l1129"></a><a href="#l1129">1129</a><td> * Writes a new script pointing to {@code src} directly into the DOM.<tr><td><a id="l1130"></a><a href="#l1130">1130</a><td> *<tr><td><a id="l1131"></a><a href="#l1131">1131</a><td> * NOTE: This method is not CSP-compliant. @see goog.appendScriptSrcNode_ for<tr><td><a id="l1132"></a><a href="#l1132">1132</a><td> * the fallback mechanism.<tr><td><a id="l1133"></a><a href="#l1133">1133</a><td> *<tr><td><a id="l1134"></a><a href="#l1134">1134</a><td> * @param {string} src The script URL.<tr><td><a id="l1135"></a><a href="#l1135">1135</a><td> * @private<tr><td><a id="l1136"></a><a href="#l1136">1136</a><td> */<tr><td><a id="l1137"></a><a href="#l1137">1137</a><td> goog.writeScriptSrcNode_ = function(src) {<tr><td><a id="l1138"></a><a href="#l1138">1138</a><td> goog.global.document.write(<tr><td><a id="l1139"></a><a href="#l1139">1139</a><td> &#39;&lt;script type=&quot;text/javascript&quot; src=&quot;&#39; + src + &#39;&quot;&gt;&lt;/&#39; + &#39;script&gt;&#39;);<tr><td><a id="l1140"></a><a href="#l1140">1140</a><td> };<tr><td><a id="l1141"></a><a href="#l1141">1141</a><td><tr><td><a id="l1142"></a><a href="#l1142">1142</a><td><tr><td><a id="l1143"></a><a href="#l1143">1143</a><td> /**<tr><td><a id="l1144"></a><a href="#l1144">1144</a><td> * Appends a new script node to the DOM using a CSP-compliant mechanism. This<tr><td><a id="l1145"></a><a href="#l1145">1145</a><td> * method exists as a fallback for document.write (which is not allowed in a<tr><td><a id="l1146"></a><a href="#l1146">1146</a><td> * strict CSP context, e.g., Chrome apps).<tr><td><a id="l1147"></a><a href="#l1147">1147</a><td> *<tr><td><a id="l1148"></a><a href="#l1148">1148</a><td> * NOTE: This method is not analogous to using document.write to insert a<tr><td><a id="l1149"></a><a href="#l1149">1149</a><td> * &lt;script&gt; tag; specifically, the user agent will execute a script added by<tr><td><a id="l1150"></a><a href="#l1150">1150</a><td> * document.write immediately after the current script block finishes<tr><td><a id="l1151"></a><a href="#l1151">1151</a><td> * executing, whereas the DOM-appended script node will not be executed until<tr><td><a id="l1152"></a><a href="#l1152">1152</a><td> * the entire document is parsed and executed. That is to say, this script is<tr><td><a id="l1153"></a><a href="#l1153">1153</a><td> * added to the end of the script execution queue.<tr><td><a id="l1154"></a><a href="#l1154">1154</a><td> *<tr><td><a id="l1155"></a><a href="#l1155">1155</a><td> * The page must not attempt to call goog.required entities until after the<tr><td><a id="l1156"></a><a href="#l1156">1156</a><td> * document has loaded, e.g., in or after the window.onload callback.<tr><td><a id="l1157"></a><a href="#l1157">1157</a><td> *<tr><td><a id="l1158"></a><a href="#l1158">1158</a><td> * @param {string} src The script URL.<tr><td><a id="l1159"></a><a href="#l1159">1159</a><td> * @private<tr><td><a id="l1160"></a><a href="#l1160">1160</a><td> */<tr><td><a id="l1161"></a><a href="#l1161">1161</a><td> goog.appendScriptSrcNode_ = function(src) {<tr><td><a id="l1162"></a><a href="#l1162">1162</a><td> /** @type {Document} */<tr><td><a id="l1163"></a><a href="#l1163">1163</a><td> var doc = goog.global.document;<tr><td><a id="l1164"></a><a href="#l1164">1164</a><td> var scriptEl = /** @type {HTMLScriptElement} */ (<tr><td><a id="l1165"></a><a href="#l1165">1165</a><td> doc.createElement(&#39;script&#39;));<tr><td><a id="l1166"></a><a href="#l1166">1166</a><td> scriptEl.type = &#39;text/javascript&#39;;<tr><td><a id="l1167"></a><a href="#l1167">1167</a><td> scriptEl.src = src;<tr><td><a id="l1168"></a><a href="#l1168">1168</a><td> scriptEl.defer = false;<tr><td><a id="l1169"></a><a href="#l1169">1169</a><td> scriptEl.async = false;<tr><td><a id="l1170"></a><a href="#l1170">1170</a><td> doc.head.appendChild(scriptEl);<tr><td><a id="l1171"></a><a href="#l1171">1171</a><td> };<tr><td><a id="l1172"></a><a href="#l1172">1172</a><td><tr><td><a id="l1173"></a><a href="#l1173">1173</a><td><tr><td><a id="l1174"></a><a href="#l1174">1174</a><td> /**<tr><td><a id="l1175"></a><a href="#l1175">1175</a><td> * The default implementation of the import function. Writes a script tag to<tr><td><a id="l1176"></a><a href="#l1176">1176</a><td> * import the script.<tr><td><a id="l1177"></a><a href="#l1177">1177</a><td> *<tr><td><a id="l1178"></a><a href="#l1178">1178</a><td> * @param {string} src The script url.<tr><td><a id="l1179"></a><a href="#l1179">1179</a><td> * @param {string=} opt_sourceText The optionally source text to evaluate<tr><td><a id="l1180"></a><a href="#l1180">1180</a><td> * @return {boolean} True if the script was imported, false otherwise.<tr><td><a id="l1181"></a><a href="#l1181">1181</a><td> * @private<tr><td><a id="l1182"></a><a href="#l1182">1182</a><td> */<tr><td><a id="l1183"></a><a href="#l1183">1183</a><td> goog.writeScriptTag_ = function(src, opt_sourceText) {<tr><td><a id="l1184"></a><a href="#l1184">1184</a><td> if (goog.inHtmlDocument_()) {<tr><td><a id="l1185"></a><a href="#l1185">1185</a><td> /** @type {Document} */<tr><td><a id="l1186"></a><a href="#l1186">1186</a><td> var doc = goog.global.document;<tr><td><a id="l1187"></a><a href="#l1187">1187</a><td><tr><td><a id="l1188"></a><a href="#l1188">1188</a><td> // If the user tries to require a new symbol after document load,<tr><td><a id="l1189"></a><a href="#l1189">1189</a><td> // something has gone terribly wrong. Doing a document.write would<tr><td><a id="l1190"></a><a href="#l1190">1190</a><td> // wipe out the page. This does not apply to the CSP-compliant method<tr><td><a id="l1191"></a><a href="#l1191">1191</a><td> // of writing script tags.<tr><td><a id="l1192"></a><a href="#l1192">1192</a><td> if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING &amp;&amp;<tr><td><a id="l1193"></a><a href="#l1193">1193</a><td> doc.readyState == &#39;complete&#39;) {<tr><td><a id="l1194"></a><a href="#l1194">1194</a><td> // Certain test frameworks load base.js multiple times, which tries<tr><td><a id="l1195"></a><a href="#l1195">1195</a><td> // to write deps.js each time. If that happens, just fail silently.<tr><td><a id="l1196"></a><a href="#l1196">1196</a><td> // These frameworks wipe the page between each load of base.js, so this<tr><td><a id="l1197"></a><a href="#l1197">1197</a><td> // is OK.<tr><td><a id="l1198"></a><a href="#l1198">1198</a><td> var isDeps = /\bdeps.js$/.test(src);<tr><td><a id="l1199"></a><a href="#l1199">1199</a><td> if (isDeps) {<tr><td><a id="l1200"></a><a href="#l1200">1200</a><td> return false;<tr><td><a id="l1201"></a><a href="#l1201">1201</a><td> } else {<tr><td><a id="l1202"></a><a href="#l1202">1202</a><td> throw Error(&#39;Cannot write &quot;&#39; + src + &#39;&quot; after document load&#39;);<tr><td><a id="l1203"></a><a href="#l1203">1203</a><td> }<tr><td><a id="l1204"></a><a href="#l1204">1204</a><td> }<tr><td><a id="l1205"></a><a href="#l1205">1205</a><td><tr><td><a id="l1206"></a><a href="#l1206">1206</a><td> var isOldIE = goog.IS_OLD_IE_;<tr><td><a id="l1207"></a><a href="#l1207">1207</a><td><tr><td><a id="l1208"></a><a href="#l1208">1208</a><td> if (opt_sourceText === undefined) {<tr><td><a id="l1209"></a><a href="#l1209">1209</a><td> if (!isOldIE) {<tr><td><a id="l1210"></a><a href="#l1210">1210</a><td> if (goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) {<tr><td><a id="l1211"></a><a href="#l1211">1211</a><td> goog.appendScriptSrcNode_(src);<tr><td><a id="l1212"></a><a href="#l1212">1212</a><td> } else {<tr><td><a id="l1213"></a><a href="#l1213">1213</a><td> goog.writeScriptSrcNode_(src);<tr><td><a id="l1214"></a><a href="#l1214">1214</a><td> }<tr><td><a id="l1215"></a><a href="#l1215">1215</a><td> } else {<tr><td><a id="l1216"></a><a href="#l1216">1216</a><td> var state = &quot; onreadystatechange=&#39;goog.onScriptLoad_(this, &quot; +<tr><td><a id="l1217"></a><a href="#l1217">1217</a><td> ++goog.lastNonModuleScriptIndex_ + &quot;)&#39; &quot;;<tr><td><a id="l1218"></a><a href="#l1218">1218</a><td> doc.write(<tr><td><a id="l1219"></a><a href="#l1219">1219</a><td> &#39;&lt;script type=&quot;text/javascript&quot; src=&quot;&#39; +<tr><td><a id="l1220"></a><a href="#l1220">1220</a><td> src + &#39;&quot;&#39; + state + &#39;&gt;&lt;/&#39; + &#39;script&gt;&#39;);<tr><td><a id="l1221"></a><a href="#l1221">1221</a><td> }<tr><td><a id="l1222"></a><a href="#l1222">1222</a><td> } else {<tr><td><a id="l1223"></a><a href="#l1223">1223</a><td> doc.write(<tr><td><a id="l1224"></a><a href="#l1224">1224</a><td> &#39;&lt;script type=&quot;text/javascript&quot;&gt;&#39; +<tr><td><a id="l1225"></a><a href="#l1225">1225</a><td> opt_sourceText +<tr><td><a id="l1226"></a><a href="#l1226">1226</a><td> &#39;&lt;/&#39; + &#39;script&gt;&#39;);<tr><td><a id="l1227"></a><a href="#l1227">1227</a><td> }<tr><td><a id="l1228"></a><a href="#l1228">1228</a><td> return true;<tr><td><a id="l1229"></a><a href="#l1229">1229</a><td> } else {<tr><td><a id="l1230"></a><a href="#l1230">1230</a><td> return false;<tr><td><a id="l1231"></a><a href="#l1231">1231</a><td> }<tr><td><a id="l1232"></a><a href="#l1232">1232</a><td> };<tr><td><a id="l1233"></a><a href="#l1233">1233</a><td><tr><td><a id="l1234"></a><a href="#l1234">1234</a><td><tr><td><a id="l1235"></a><a href="#l1235">1235</a><td> /** @private {number} */<tr><td><a id="l1236"></a><a href="#l1236">1236</a><td> goog.lastNonModuleScriptIndex_ = 0;<tr><td><a id="l1237"></a><a href="#l1237">1237</a><td><tr><td><a id="l1238"></a><a href="#l1238">1238</a><td><tr><td><a id="l1239"></a><a href="#l1239">1239</a><td> /**<tr><td><a id="l1240"></a><a href="#l1240">1240</a><td> * A readystatechange handler for legacy IE<tr><td><a id="l1241"></a><a href="#l1241">1241</a><td> * @param {!HTMLScriptElement} script<tr><td><a id="l1242"></a><a href="#l1242">1242</a><td> * @param {number} scriptIndex<tr><td><a id="l1243"></a><a href="#l1243">1243</a><td> * @return {boolean}<tr><td><a id="l1244"></a><a href="#l1244">1244</a><td> * @private<tr><td><a id="l1245"></a><a href="#l1245">1245</a><td> */<tr><td><a id="l1246"></a><a href="#l1246">1246</a><td> goog.onScriptLoad_ = function(script, scriptIndex) {<tr><td><a id="l1247"></a><a href="#l1247">1247</a><td> // for now load the modules when we reach the last script,<tr><td><a id="l1248"></a><a href="#l1248">1248</a><td> // later allow more inter-mingling.<tr><td><a id="l1249"></a><a href="#l1249">1249</a><td> if (script.readyState == &#39;complete&#39; &amp;&amp;<tr><td><a id="l1250"></a><a href="#l1250">1250</a><td> goog.lastNonModuleScriptIndex_ == scriptIndex) {<tr><td><a id="l1251"></a><a href="#l1251">1251</a><td> goog.loadQueuedModules_();<tr><td><a id="l1252"></a><a href="#l1252">1252</a><td> }<tr><td><a id="l1253"></a><a href="#l1253">1253</a><td> return true;<tr><td><a id="l1254"></a><a href="#l1254">1254</a><td> };<tr><td><a id="l1255"></a><a href="#l1255">1255</a><td><tr><td><a id="l1256"></a><a href="#l1256">1256</a><td> /**<tr><td><a id="l1257"></a><a href="#l1257">1257</a><td> * Resolves dependencies based on the dependencies added using addDependency<tr><td><a id="l1258"></a><a href="#l1258">1258</a><td> * and calls importScript_ in the correct order.<tr><td><a id="l1259"></a><a href="#l1259">1259</a><td> * @param {string} pathToLoad The path from which to start discovering<tr><td><a id="l1260"></a><a href="#l1260">1260</a><td> * dependencies.<tr><td><a id="l1261"></a><a href="#l1261">1261</a><td> * @private<tr><td><a id="l1262"></a><a href="#l1262">1262</a><td> */<tr><td><a id="l1263"></a><a href="#l1263">1263</a><td> goog.writeScripts_ = function(pathToLoad) {<tr><td><a id="l1264"></a><a href="#l1264">1264</a><td> /** @type {!Array&lt;string&gt;} The scripts we need to write this time. */<tr><td><a id="l1265"></a><a href="#l1265">1265</a><td> var scripts = [];<tr><td><a id="l1266"></a><a href="#l1266">1266</a><td> var seenScript = {};<tr><td><a id="l1267"></a><a href="#l1267">1267</a><td> var deps = goog.dependencies_;<tr><td><a id="l1268"></a><a href="#l1268">1268</a><td><tr><td><a id="l1269"></a><a href="#l1269">1269</a><td> /** @param {string} path */<tr><td><a id="l1270"></a><a href="#l1270">1270</a><td> function visitNode(path) {<tr><td><a id="l1271"></a><a href="#l1271">1271</a><td> if (path in deps.written) {<tr><td><a id="l1272"></a><a href="#l1272">1272</a><td> return;<tr><td><a id="l1273"></a><a href="#l1273">1273</a><td> }<tr><td><a id="l1274"></a><a href="#l1274">1274</a><td><tr><td><a id="l1275"></a><a href="#l1275">1275</a><td> // We have already visited this one. We can get here if we have cyclic<tr><td><a id="l1276"></a><a href="#l1276">1276</a><td> // dependencies.<tr><td><a id="l1277"></a><a href="#l1277">1277</a><td> if (path in deps.visited) {<tr><td><a id="l1278"></a><a href="#l1278">1278</a><td> return;<tr><td><a id="l1279"></a><a href="#l1279">1279</a><td> }<tr><td><a id="l1280"></a><a href="#l1280">1280</a><td><tr><td><a id="l1281"></a><a href="#l1281">1281</a><td> deps.visited[path] = true;<tr><td><a id="l1282"></a><a href="#l1282">1282</a><td><tr><td><a id="l1283"></a><a href="#l1283">1283</a><td> if (path in deps.requires) {<tr><td><a id="l1284"></a><a href="#l1284">1284</a><td> for (var requireName in deps.requires[path]) {<tr><td><a id="l1285"></a><a href="#l1285">1285</a><td> // If the required name is defined, we assume that it was already<tr><td><a id="l1286"></a><a href="#l1286">1286</a><td> // bootstrapped by other means.<tr><td><a id="l1287"></a><a href="#l1287">1287</a><td> if (!goog.isProvided_(requireName)) {<tr><td><a id="l1288"></a><a href="#l1288">1288</a><td> if (requireName in deps.nameToPath) {<tr><td><a id="l1289"></a><a href="#l1289">1289</a><td> visitNode(deps.nameToPath[requireName]);<tr><td><a id="l1290"></a><a href="#l1290">1290</a><td> } else {<tr><td><a id="l1291"></a><a href="#l1291">1291</a><td> throw Error(&#39;Undefined nameToPath for &#39; + requireName);<tr><td><a id="l1292"></a><a href="#l1292">1292</a><td> }<tr><td><a id="l1293"></a><a href="#l1293">1293</a><td> }<tr><td><a id="l1294"></a><a href="#l1294">1294</a><td> }<tr><td><a id="l1295"></a><a href="#l1295">1295</a><td> }<tr><td><a id="l1296"></a><a href="#l1296">1296</a><td><tr><td><a id="l1297"></a><a href="#l1297">1297</a><td> if (!(path in seenScript)) {<tr><td><a id="l1298"></a><a href="#l1298">1298</a><td> seenScript[path] = true;<tr><td><a id="l1299"></a><a href="#l1299">1299</a><td> scripts.push(path);<tr><td><a id="l1300"></a><a href="#l1300">1300</a><td> }<tr><td><a id="l1301"></a><a href="#l1301">1301</a><td> }<tr><td><a id="l1302"></a><a href="#l1302">1302</a><td><tr><td><a id="l1303"></a><a href="#l1303">1303</a><td> visitNode(pathToLoad);<tr><td><a id="l1304"></a><a href="#l1304">1304</a><td><tr><td><a id="l1305"></a><a href="#l1305">1305</a><td> // record that we are going to load all these scripts.<tr><td><a id="l1306"></a><a href="#l1306">1306</a><td> for (var i = 0; i &lt; scripts.length; i++) {<tr><td><a id="l1307"></a><a href="#l1307">1307</a><td> var path = scripts[i];<tr><td><a id="l1308"></a><a href="#l1308">1308</a><td> goog.dependencies_.written[path] = true;<tr><td><a id="l1309"></a><a href="#l1309">1309</a><td> }<tr><td><a id="l1310"></a><a href="#l1310">1310</a><td><tr><td><a id="l1311"></a><a href="#l1311">1311</a><td> // If a module is loaded synchronously then we need to<tr><td><a id="l1312"></a><a href="#l1312">1312</a><td> // clear the current inModuleLoader value, and restore it when we are<tr><td><a id="l1313"></a><a href="#l1313">1313</a><td> // done loading the current &quot;requires&quot;.<tr><td><a id="l1314"></a><a href="#l1314">1314</a><td> var moduleState = goog.moduleLoaderState_;<tr><td><a id="l1315"></a><a href="#l1315">1315</a><td> goog.moduleLoaderState_ = null;<tr><td><a id="l1316"></a><a href="#l1316">1316</a><td><tr><td><a id="l1317"></a><a href="#l1317">1317</a><td> for (var i = 0; i &lt; scripts.length; i++) {<tr><td><a id="l1318"></a><a href="#l1318">1318</a><td> var path = scripts[i];<tr><td><a id="l1319"></a><a href="#l1319">1319</a><td> if (path) {<tr><td><a id="l1320"></a><a href="#l1320">1320</a><td> if (!deps.pathIsModule[path]) {<tr><td><a id="l1321"></a><a href="#l1321">1321</a><td> goog.importScript_(goog.basePath + path);<tr><td><a id="l1322"></a><a href="#l1322">1322</a><td> } else {<tr><td><a id="l1323"></a><a href="#l1323">1323</a><td> goog.importModule_(goog.basePath + path);<tr><td><a id="l1324"></a><a href="#l1324">1324</a><td> }<tr><td><a id="l1325"></a><a href="#l1325">1325</a><td> } else {<tr><td><a id="l1326"></a><a href="#l1326">1326</a><td> goog.moduleLoaderState_ = moduleState;<tr><td><a id="l1327"></a><a href="#l1327">1327</a><td> throw Error(&#39;Undefined script input&#39;);<tr><td><a id="l1328"></a><a href="#l1328">1328</a><td> }<tr><td><a id="l1329"></a><a href="#l1329">1329</a><td> }<tr><td><a id="l1330"></a><a href="#l1330">1330</a><td><tr><td><a id="l1331"></a><a href="#l1331">1331</a><td> // restore the current &quot;module loading state&quot;<tr><td><a id="l1332"></a><a href="#l1332">1332</a><td> goog.moduleLoaderState_ = moduleState;<tr><td><a id="l1333"></a><a href="#l1333">1333</a><td> };<tr><td><a id="l1334"></a><a href="#l1334">1334</a><td><tr><td><a id="l1335"></a><a href="#l1335">1335</a><td><tr><td><a id="l1336"></a><a href="#l1336">1336</a><td> /**<tr><td><a id="l1337"></a><a href="#l1337">1337</a><td> * Looks at the dependency rules and tries to determine the script file that<tr><td><a id="l1338"></a><a href="#l1338">1338</a><td> * fulfills a particular rule.<tr><td><a id="l1339"></a><a href="#l1339">1339</a><td> * @param {string} rule In the form goog.namespace.Class or project.script.<tr><td><a id="l1340"></a><a href="#l1340">1340</a><td> * @return {?string} Url corresponding to the rule, or null.<tr><td><a id="l1341"></a><a href="#l1341">1341</a><td> * @private<tr><td><a id="l1342"></a><a href="#l1342">1342</a><td> */<tr><td><a id="l1343"></a><a href="#l1343">1343</a><td> goog.getPathFromDeps_ = function(rule) {<tr><td><a id="l1344"></a><a href="#l1344">1344</a><td> if (rule in goog.dependencies_.nameToPath) {<tr><td><a id="l1345"></a><a href="#l1345">1345</a><td> return goog.dependencies_.nameToPath[rule];<tr><td><a id="l1346"></a><a href="#l1346">1346</a><td> } else {<tr><td><a id="l1347"></a><a href="#l1347">1347</a><td> return null;<tr><td><a id="l1348"></a><a href="#l1348">1348</a><td> }<tr><td><a id="l1349"></a><a href="#l1349">1349</a><td> };<tr><td><a id="l1350"></a><a href="#l1350">1350</a><td><tr><td><a id="l1351"></a><a href="#l1351">1351</a><td> goog.findBasePath_();<tr><td><a id="l1352"></a><a href="#l1352">1352</a><td><tr><td><a id="l1353"></a><a href="#l1353">1353</a><td> // Allow projects to manage the deps files themselves.<tr><td><a id="l1354"></a><a href="#l1354">1354</a><td> if (!goog.global.CLOSURE_NO_DEPS) {<tr><td><a id="l1355"></a><a href="#l1355">1355</a><td> goog.importScript_(goog.basePath + &#39;deps.js&#39;);<tr><td><a id="l1356"></a><a href="#l1356">1356</a><td> }<tr><td><a id="l1357"></a><a href="#l1357">1357</a><td>}<tr><td><a id="l1358"></a><a href="#l1358">1358</a><td><tr><td><a id="l1359"></a><a href="#l1359">1359</a><td><tr><td><a id="l1360"></a><a href="#l1360">1360</a><td>/**<tr><td><a id="l1361"></a><a href="#l1361">1361</a><td> * Normalize a file path by removing redundant &quot;..&quot; and extraneous &quot;.&quot; file<tr><td><a id="l1362"></a><a href="#l1362">1362</a><td> * path components.<tr><td><a id="l1363"></a><a href="#l1363">1363</a><td> * @param {string} path<tr><td><a id="l1364"></a><a href="#l1364">1364</a><td> * @return {string}<tr><td><a id="l1365"></a><a href="#l1365">1365</a><td> * @private<tr><td><a id="l1366"></a><a href="#l1366">1366</a><td> */<tr><td><a id="l1367"></a><a href="#l1367">1367</a><td>goog.normalizePath_ = function(path) {<tr><td><a id="l1368"></a><a href="#l1368">1368</a><td> var components = path.split(&#39;/&#39;);<tr><td><a id="l1369"></a><a href="#l1369">1369</a><td> var i = 0;<tr><td><a id="l1370"></a><a href="#l1370">1370</a><td> while (i &lt; components.length) {<tr><td><a id="l1371"></a><a href="#l1371">1371</a><td> if (components[i] == &#39;.&#39;) {<tr><td><a id="l1372"></a><a href="#l1372">1372</a><td> components.splice(i, 1);<tr><td><a id="l1373"></a><a href="#l1373">1373</a><td> } else if (i &amp;&amp; components[i] == &#39;..&#39; &amp;&amp;<tr><td><a id="l1374"></a><a href="#l1374">1374</a><td> components[i - 1] &amp;&amp; components[i - 1] != &#39;..&#39;) {<tr><td><a id="l1375"></a><a href="#l1375">1375</a><td> components.splice(--i, 2);<tr><td><a id="l1376"></a><a href="#l1376">1376</a><td> } else {<tr><td><a id="l1377"></a><a href="#l1377">1377</a><td> i++;<tr><td><a id="l1378"></a><a href="#l1378">1378</a><td> }<tr><td><a id="l1379"></a><a href="#l1379">1379</a><td> }<tr><td><a id="l1380"></a><a href="#l1380">1380</a><td> return components.join(&#39;/&#39;);<tr><td><a id="l1381"></a><a href="#l1381">1381</a><td>};<tr><td><a id="l1382"></a><a href="#l1382">1382</a><td><tr><td><a id="l1383"></a><a href="#l1383">1383</a><td><tr><td><a id="l1384"></a><a href="#l1384">1384</a><td>/**<tr><td><a id="l1385"></a><a href="#l1385">1385</a><td> * Loads file by synchronous XHR. Should not be used in production environments.<tr><td><a id="l1386"></a><a href="#l1386">1386</a><td> * @param {string} src Source URL.<tr><td><a id="l1387"></a><a href="#l1387">1387</a><td> * @return {string} File contents.<tr><td><a id="l1388"></a><a href="#l1388">1388</a><td> * @private<tr><td><a id="l1389"></a><a href="#l1389">1389</a><td> */<tr><td><a id="l1390"></a><a href="#l1390">1390</a><td>goog.loadFileSync_ = function(src) {<tr><td><a id="l1391"></a><a href="#l1391">1391</a><td> if (goog.global.CLOSURE_LOAD_FILE_SYNC) {<tr><td><a id="l1392"></a><a href="#l1392">1392</a><td> return goog.global.CLOSURE_LOAD_FILE_SYNC(src);<tr><td><a id="l1393"></a><a href="#l1393">1393</a><td> } else {<tr><td><a id="l1394"></a><a href="#l1394">1394</a><td> /** @type {XMLHttpRequest} */<tr><td><a id="l1395"></a><a href="#l1395">1395</a><td> var xhr = new goog.global[&#39;XMLHttpRequest&#39;]();<tr><td><a id="l1396"></a><a href="#l1396">1396</a><td> xhr.open(&#39;get&#39;, src, false);<tr><td><a id="l1397"></a><a href="#l1397">1397</a><td> xhr.send();<tr><td><a id="l1398"></a><a href="#l1398">1398</a><td> return xhr.responseText;<tr><td><a id="l1399"></a><a href="#l1399">1399</a><td> }<tr><td><a id="l1400"></a><a href="#l1400">1400</a><td>};<tr><td><a id="l1401"></a><a href="#l1401">1401</a><td><tr><td><a id="l1402"></a><a href="#l1402">1402</a><td><tr><td><a id="l1403"></a><a href="#l1403">1403</a><td>/**<tr><td><a id="l1404"></a><a href="#l1404">1404</a><td> * Retrieve and execute a module.<tr><td><a id="l1405"></a><a href="#l1405">1405</a><td> * @param {string} src Script source URL.<tr><td><a id="l1406"></a><a href="#l1406">1406</a><td> * @private<tr><td><a id="l1407"></a><a href="#l1407">1407</a><td> */<tr><td><a id="l1408"></a><a href="#l1408">1408</a><td>goog.retrieveAndExecModule_ = function(src) {<tr><td><a id="l1409"></a><a href="#l1409">1409</a><td> if (!COMPILED) {<tr><td><a id="l1410"></a><a href="#l1410">1410</a><td> // The full but non-canonicalized URL for later use.<tr><td><a id="l1411"></a><a href="#l1411">1411</a><td> var originalPath = src;<tr><td><a id="l1412"></a><a href="#l1412">1412</a><td> // Canonicalize the path, removing any /./ or /../ since Chrome&#39;s debugging<tr><td><a id="l1413"></a><a href="#l1413">1413</a><td> // console doesn&#39;t auto-canonicalize XHR loads as it does &lt;script&gt; srcs.<tr><td><a id="l1414"></a><a href="#l1414">1414</a><td> src = goog.normalizePath_(src);<tr><td><a id="l1415"></a><a href="#l1415">1415</a><td><tr><td><a id="l1416"></a><a href="#l1416">1416</a><td> var importScript = goog.global.CLOSURE_IMPORT_SCRIPT ||<tr><td><a id="l1417"></a><a href="#l1417">1417</a><td> goog.writeScriptTag_;<tr><td><a id="l1418"></a><a href="#l1418">1418</a><td><tr><td><a id="l1419"></a><a href="#l1419">1419</a><td> var scriptText = goog.loadFileSync_(src);<tr><td><a id="l1420"></a><a href="#l1420">1420</a><td><tr><td><a id="l1421"></a><a href="#l1421">1421</a><td> if (scriptText != null) {<tr><td><a id="l1422"></a><a href="#l1422">1422</a><td> var execModuleScript = goog.wrapModule_(src, scriptText);<tr><td><a id="l1423"></a><a href="#l1423">1423</a><td> var isOldIE = goog.IS_OLD_IE_;<tr><td><a id="l1424"></a><a href="#l1424">1424</a><td> if (isOldIE) {<tr><td><a id="l1425"></a><a href="#l1425">1425</a><td> goog.dependencies_.deferred[originalPath] = execModuleScript;<tr><td><a id="l1426"></a><a href="#l1426">1426</a><td> goog.queuedModules_.push(originalPath);<tr><td><a id="l1427"></a><a href="#l1427">1427</a><td> } else {<tr><td><a id="l1428"></a><a href="#l1428">1428</a><td> importScript(src, execModuleScript);<tr><td><a id="l1429"></a><a href="#l1429">1429</a><td> }<tr><td><a id="l1430"></a><a href="#l1430">1430</a><td> } else {<tr><td><a id="l1431"></a><a href="#l1431">1431</a><td> throw new Error(&#39;load of &#39; + src + &#39;failed&#39;);<tr><td><a id="l1432"></a><a href="#l1432">1432</a><td> }<tr><td><a id="l1433"></a><a href="#l1433">1433</a><td> }<tr><td><a id="l1434"></a><a href="#l1434">1434</a><td>};<tr><td><a id="l1435"></a><a href="#l1435">1435</a><td><tr><td><a id="l1436"></a><a href="#l1436">1436</a><td><tr><td><a id="l1437"></a><a href="#l1437">1437</a><td>//==============================================================================<tr><td><a id="l1438"></a><a href="#l1438">1438</a><td>// Language Enhancements<tr><td><a id="l1439"></a><a href="#l1439">1439</a><td>//==============================================================================<tr><td><a id="l1440"></a><a href="#l1440">1440</a><td><tr><td><a id="l1441"></a><a href="#l1441">1441</a><td><tr><td><a id="l1442"></a><a href="#l1442">1442</a><td>/**<tr><td><a id="l1443"></a><a href="#l1443">1443</a><td> * This is a &quot;fixed&quot; version of the typeof operator. It differs from the typeof<tr><td><a id="l1444"></a><a href="#l1444">1444</a><td> * operator in such a way that null returns &#39;null&#39; and arrays return &#39;array&#39;.<tr><td><a id="l1445"></a><a href="#l1445">1445</a><td> * @param {?} value The value to get the type of.<tr><td><a id="l1446"></a><a href="#l1446">1446</a><td> * @return {string} The name of the type.<tr><td><a id="l1447"></a><a href="#l1447">1447</a><td> */<tr><td><a id="l1448"></a><a href="#l1448">1448</a><td>goog.typeOf = function(value) {<tr><td><a id="l1449"></a><a href="#l1449">1449</a><td> var s = typeof value;<tr><td><a id="l1450"></a><a href="#l1450">1450</a><td> if (s == &#39;object&#39;) {<tr><td><a id="l1451"></a><a href="#l1451">1451</a><td> if (value) {<tr><td><a id="l1452"></a><a href="#l1452">1452</a><td> // Check these first, so we can avoid calling Object.prototype.toString if<tr><td><a id="l1453"></a><a href="#l1453">1453</a><td> // possible.<tr><td><a id="l1454"></a><a href="#l1454">1454</a><td> //<tr><td><a id="l1455"></a><a href="#l1455">1455</a><td> // IE improperly marshals tyepof across execution contexts, but a<tr><td><a id="l1456"></a><a href="#l1456">1456</a><td> // cross-context object will still return false for &quot;instanceof Object&quot;.<tr><td><a id="l1457"></a><a href="#l1457">1457</a><td> if (value instanceof Array) {<tr><td><a id="l1458"></a><a href="#l1458">1458</a><td> return &#39;array&#39;;<tr><td><a id="l1459"></a><a href="#l1459">1459</a><td> } else if (value instanceof Object) {<tr><td><a id="l1460"></a><a href="#l1460">1460</a><td> return s;<tr><td><a id="l1461"></a><a href="#l1461">1461</a><td> }<tr><td><a id="l1462"></a><a href="#l1462">1462</a><td><tr><td><a id="l1463"></a><a href="#l1463">1463</a><td> // HACK: In order to use an Object prototype method on the arbitrary<tr><td><a id="l1464"></a><a href="#l1464">1464</a><td> // value, the compiler requires the value be cast to type Object,<tr><td><a id="l1465"></a><a href="#l1465">1465</a><td> // even though the ECMA spec explicitly allows it.<tr><td><a id="l1466"></a><a href="#l1466">1466</a><td> var className = Object.prototype.toString.call(<tr><td><a id="l1467"></a><a href="#l1467">1467</a><td> /** @type {!Object} */ (value));<tr><td><a id="l1468"></a><a href="#l1468">1468</a><td> // In Firefox 3.6, attempting to access iframe window objects&#39; length<tr><td><a id="l1469"></a><a href="#l1469">1469</a><td> // property throws an NS_ERROR_FAILURE, so we need to special-case it<tr><td><a id="l1470"></a><a href="#l1470">1470</a><td> // here.<tr><td><a id="l1471"></a><a href="#l1471">1471</a><td> if (className == &#39;[object Window]&#39;) {<tr><td><a id="l1472"></a><a href="#l1472">1472</a><td> return &#39;object&#39;;<tr><td><a id="l1473"></a><a href="#l1473">1473</a><td> }<tr><td><a id="l1474"></a><a href="#l1474">1474</a><td><tr><td><a id="l1475"></a><a href="#l1475">1475</a><td> // We cannot always use constructor == Array or instanceof Array because<tr><td><a id="l1476"></a><a href="#l1476">1476</a><td> // different frames have different Array objects. In IE6, if the iframe<tr><td><a id="l1477"></a><a href="#l1477">1477</a><td> // where the array was created is destroyed, the array loses its<tr><td><a id="l1478"></a><a href="#l1478">1478</a><td> // prototype. Then dereferencing val.splice here throws an exception, so<tr><td><a id="l1479"></a><a href="#l1479">1479</a><td> // we can&#39;t use goog.isFunction. Calling typeof directly returns &#39;unknown&#39;<tr><td><a id="l1480"></a><a href="#l1480">1480</a><td> // so that will work. In this case, this function will return false and<tr><td><a id="l1481"></a><a href="#l1481">1481</a><td> // most array functions will still work because the array is still<tr><td><a id="l1482"></a><a href="#l1482">1482</a><td> // array-like (supports length and []) even though it has lost its<tr><td><a id="l1483"></a><a href="#l1483">1483</a><td> // prototype.<tr><td><a id="l1484"></a><a href="#l1484">1484</a><td> // Mark Miller noticed that Object.prototype.toString<tr><td><a id="l1485"></a><a href="#l1485">1485</a><td> // allows access to the unforgeable [[Class]] property.<tr><td><a id="l1486"></a><a href="#l1486">1486</a><td> // 15.2.4.2 Object.prototype.toString ( )<tr><td><a id="l1487"></a><a href="#l1487">1487</a><td> // When the toString method is called, the following steps are taken:<tr><td><a id="l1488"></a><a href="#l1488">1488</a><td> // 1. Get the [[Class]] property of this object.<tr><td><a id="l1489"></a><a href="#l1489">1489</a><td> // 2. Compute a string value by concatenating the three strings<tr><td><a id="l1490"></a><a href="#l1490">1490</a><td> // &quot;[object &quot;, Result(1), and &quot;]&quot;.<tr><td><a id="l1491"></a><a href="#l1491">1491</a><td> // 3. Return Result(2).<tr><td><a id="l1492"></a><a href="#l1492">1492</a><td> // and this behavior survives the destruction of the execution context.<tr><td><a id="l1493"></a><a href="#l1493">1493</a><td> if ((className == &#39;[object Array]&#39; ||<tr><td><a id="l1494"></a><a href="#l1494">1494</a><td> // In IE all non value types are wrapped as objects across window<tr><td><a id="l1495"></a><a href="#l1495">1495</a><td> // boundaries (not iframe though) so we have to do object detection<tr><td><a id="l1496"></a><a href="#l1496">1496</a><td> // for this edge case.<tr><td><a id="l1497"></a><a href="#l1497">1497</a><td> typeof value.length == &#39;number&#39; &amp;&amp;<tr><td><a id="l1498"></a><a href="#l1498">1498</a><td> typeof value.splice != &#39;undefined&#39; &amp;&amp;<tr><td><a id="l1499"></a><a href="#l1499">1499</a><td> typeof value.propertyIsEnumerable != &#39;undefined&#39; &amp;&amp;<tr><td><a id="l1500"></a><a href="#l1500">1500</a><td> !value.propertyIsEnumerable(&#39;splice&#39;)<tr><td><a id="l1501"></a><a href="#l1501">1501</a><td><tr><td><a id="l1502"></a><a href="#l1502">1502</a><td> )) {<tr><td><a id="l1503"></a><a href="#l1503">1503</a><td> return &#39;array&#39;;<tr><td><a id="l1504"></a><a href="#l1504">1504</a><td> }<tr><td><a id="l1505"></a><a href="#l1505">1505</a><td> // HACK: There is still an array case that fails.<tr><td><a id="l1506"></a><a href="#l1506">1506</a><td> // function ArrayImpostor() {}<tr><td><a id="l1507"></a><a href="#l1507">1507</a><td> // ArrayImpostor.prototype = [];<tr><td><a id="l1508"></a><a href="#l1508">1508</a><td> // var impostor = new ArrayImpostor;<tr><td><a id="l1509"></a><a href="#l1509">1509</a><td> // this can be fixed by getting rid of the fast path<tr><td><a id="l1510"></a><a href="#l1510">1510</a><td> // (value instanceof Array) and solely relying on<tr><td><a id="l1511"></a><a href="#l1511">1511</a><td> // (value &amp;&amp; Object.prototype.toString.vall(value) === &#39;[object Array]&#39;)<tr><td><a id="l1512"></a><a href="#l1512">1512</a><td> // but that would require many more function calls and is not warranted<tr><td><a id="l1513"></a><a href="#l1513">1513</a><td> // unless closure code is receiving objects from untrusted sources.<tr><td><a id="l1514"></a><a href="#l1514">1514</a><td><tr><td><a id="l1515"></a><a href="#l1515">1515</a><td> // IE in cross-window calls does not correctly marshal the function type<tr><td><a id="l1516"></a><a href="#l1516">1516</a><td> // (it appears just as an object) so we cannot use just typeof val ==<tr><td><a id="l1517"></a><a href="#l1517">1517</a><td> // &#39;function&#39;. However, if the object has a call property, it is a<tr><td><a id="l1518"></a><a href="#l1518">1518</a><td> // function.<tr><td><a id="l1519"></a><a href="#l1519">1519</a><td> if ((className == &#39;[object Function]&#39; ||<tr><td><a id="l1520"></a><a href="#l1520">1520</a><td> typeof value.call != &#39;undefined&#39; &amp;&amp;<tr><td><a id="l1521"></a><a href="#l1521">1521</a><td> typeof value.propertyIsEnumerable != &#39;undefined&#39; &amp;&amp;<tr><td><a id="l1522"></a><a href="#l1522">1522</a><td> !value.propertyIsEnumerable(&#39;call&#39;))) {<tr><td><a id="l1523"></a><a href="#l1523">1523</a><td> return &#39;function&#39;;<tr><td><a id="l1524"></a><a href="#l1524">1524</a><td> }<tr><td><a id="l1525"></a><a href="#l1525">1525</a><td><tr><td><a id="l1526"></a><a href="#l1526">1526</a><td> } else {<tr><td><a id="l1527"></a><a href="#l1527">1527</a><td> return &#39;null&#39;;<tr><td><a id="l1528"></a><a href="#l1528">1528</a><td> }<tr><td><a id="l1529"></a><a href="#l1529">1529</a><td><tr><td><a id="l1530"></a><a href="#l1530">1530</a><td> } else if (s == &#39;function&#39; &amp;&amp; typeof value.call == &#39;undefined&#39;) {<tr><td><a id="l1531"></a><a href="#l1531">1531</a><td> // In Safari typeof nodeList returns &#39;function&#39;, and on Firefox typeof<tr><td><a id="l1532"></a><a href="#l1532">1532</a><td> // behaves similarly for HTML{Applet,Embed,Object}, Elements and RegExps. We<tr><td><a id="l1533"></a><a href="#l1533">1533</a><td> // would like to return object for those and we can detect an invalid<tr><td><a id="l1534"></a><a href="#l1534">1534</a><td> // function by making sure that the function object has a call method.<tr><td><a id="l1535"></a><a href="#l1535">1535</a><td> return &#39;object&#39;;<tr><td><a id="l1536"></a><a href="#l1536">1536</a><td> }<tr><td><a id="l1537"></a><a href="#l1537">1537</a><td> return s;<tr><td><a id="l1538"></a><a href="#l1538">1538</a><td>};<tr><td><a id="l1539"></a><a href="#l1539">1539</a><td><tr><td><a id="l1540"></a><a href="#l1540">1540</a><td><tr><td><a id="l1541"></a><a href="#l1541">1541</a><td>/**<tr><td><a id="l1542"></a><a href="#l1542">1542</a><td> * Returns true if the specified value is null.<tr><td><a id="l1543"></a><a href="#l1543">1543</a><td> * @param {?} val Variable to test.<tr><td><a id="l1544"></a><a href="#l1544">1544</a><td> * @return {boolean} Whether variable is null.<tr><td><a id="l1545"></a><a href="#l1545">1545</a><td> */<tr><td><a id="l1546"></a><a href="#l1546">1546</a><td>goog.isNull = function(val) {<tr><td><a id="l1547"></a><a href="#l1547">1547</a><td> return val === null;<tr><td><a id="l1548"></a><a href="#l1548">1548</a><td>};<tr><td><a id="l1549"></a><a href="#l1549">1549</a><td><tr><td><a id="l1550"></a><a href="#l1550">1550</a><td><tr><td><a id="l1551"></a><a href="#l1551">1551</a><td>/**<tr><td><a id="l1552"></a><a href="#l1552">1552</a><td> * Returns true if the specified value is defined and not null.<tr><td><a id="l1553"></a><a href="#l1553">1553</a><td> * @param {?} val Variable to test.<tr><td><a id="l1554"></a><a href="#l1554">1554</a><td> * @return {boolean} Whether variable is defined and not null.<tr><td><a id="l1555"></a><a href="#l1555">1555</a><td> */<tr><td><a id="l1556"></a><a href="#l1556">1556</a><td>goog.isDefAndNotNull = function(val) {<tr><td><a id="l1557"></a><a href="#l1557">1557</a><td> // Note that undefined == null.<tr><td><a id="l1558"></a><a href="#l1558">1558</a><td> return val != null;<tr><td><a id="l1559"></a><a href="#l1559">1559</a><td>};<tr><td><a id="l1560"></a><a href="#l1560">1560</a><td><tr><td><a id="l1561"></a><a href="#l1561">1561</a><td><tr><td><a id="l1562"></a><a href="#l1562">1562</a><td>/**<tr><td><a id="l1563"></a><a href="#l1563">1563</a><td> * Returns true if the specified value is an array.<tr><td><a id="l1564"></a><a href="#l1564">1564</a><td> * @param {?} val Variable to test.<tr><td><a id="l1565"></a><a href="#l1565">1565</a><td> * @return {boolean} Whether variable is an array.<tr><td><a id="l1566"></a><a href="#l1566">1566</a><td> */<tr><td><a id="l1567"></a><a href="#l1567">1567</a><td>goog.isArray = function(val) {<tr><td><a id="l1568"></a><a href="#l1568">1568</a><td> return goog.typeOf(val) == &#39;array&#39;;<tr><td><a id="l1569"></a><a href="#l1569">1569</a><td>};<tr><td><a id="l1570"></a><a href="#l1570">1570</a><td><tr><td><a id="l1571"></a><a href="#l1571">1571</a><td><tr><td><a id="l1572"></a><a href="#l1572">1572</a><td>/**<tr><td><a id="l1573"></a><a href="#l1573">1573</a><td> * Returns true if the object looks like an array. To qualify as array like<tr><td><a id="l1574"></a><a href="#l1574">1574</a><td> * the value needs to be either a NodeList or an object with a Number length<tr><td><a id="l1575"></a><a href="#l1575">1575</a><td> * property. As a special case, a function value is not array like, because its<tr><td><a id="l1576"></a><a href="#l1576">1576</a><td> * length property is fixed to correspond to the number of expected arguments.<tr><td><a id="l1577"></a><a href="#l1577">1577</a><td> * @param {?} val Variable to test.<tr><td><a id="l1578"></a><a href="#l1578">1578</a><td> * @return {boolean} Whether variable is an array.<tr><td><a id="l1579"></a><a href="#l1579">1579</a><td> */<tr><td><a id="l1580"></a><a href="#l1580">1580</a><td>goog.isArrayLike = function(val) {<tr><td><a id="l1581"></a><a href="#l1581">1581</a><td> var type = goog.typeOf(val);<tr><td><a id="l1582"></a><a href="#l1582">1582</a><td> // We do not use goog.isObject here in order to exclude function values.<tr><td><a id="l1583"></a><a href="#l1583">1583</a><td> return type == &#39;array&#39; || type == &#39;object&#39; &amp;&amp; typeof val.length == &#39;number&#39;;<tr><td><a id="l1584"></a><a href="#l1584">1584</a><td>};<tr><td><a id="l1585"></a><a href="#l1585">1585</a><td><tr><td><a id="l1586"></a><a href="#l1586">1586</a><td><tr><td><a id="l1587"></a><a href="#l1587">1587</a><td>/**<tr><td><a id="l1588"></a><a href="#l1588">1588</a><td> * Returns true if the object looks like a Date. To qualify as Date-like the<tr><td><a id="l1589"></a><a href="#l1589">1589</a><td> * value needs to be an object and have a getFullYear() function.<tr><td><a id="l1590"></a><a href="#l1590">1590</a><td> * @param {?} val Variable to test.<tr><td><a id="l1591"></a><a href="#l1591">1591</a><td> * @return {boolean} Whether variable is a like a Date.<tr><td><a id="l1592"></a><a href="#l1592">1592</a><td> */<tr><td><a id="l1593"></a><a href="#l1593">1593</a><td>goog.isDateLike = function(val) {<tr><td><a id="l1594"></a><a href="#l1594">1594</a><td> return goog.isObject(val) &amp;&amp; typeof val.getFullYear == &#39;function&#39;;<tr><td><a id="l1595"></a><a href="#l1595">1595</a><td>};<tr><td><a id="l1596"></a><a href="#l1596">1596</a><td><tr><td><a id="l1597"></a><a href="#l1597">1597</a><td><tr><td><a id="l1598"></a><a href="#l1598">1598</a><td>/**<tr><td><a id="l1599"></a><a href="#l1599">1599</a><td> * Returns true if the specified value is a string.<tr><td><a id="l1600"></a><a href="#l1600">1600</a><td> * @param {?} val Variable to test.<tr><td><a id="l1601"></a><a href="#l1601">1601</a><td> * @return {boolean} Whether variable is a string.<tr><td><a id="l1602"></a><a href="#l1602">1602</a><td> */<tr><td><a id="l1603"></a><a href="#l1603">1603</a><td>goog.isString = function(val) {<tr><td><a id="l1604"></a><a href="#l1604">1604</a><td> return typeof val == &#39;string&#39;;<tr><td><a id="l1605"></a><a href="#l1605">1605</a><td>};<tr><td><a id="l1606"></a><a href="#l1606">1606</a><td><tr><td><a id="l1607"></a><a href="#l1607">1607</a><td><tr><td><a id="l1608"></a><a href="#l1608">1608</a><td>/**<tr><td><a id="l1609"></a><a href="#l1609">1609</a><td> * Returns true if the specified value is a boolean.<tr><td><a id="l1610"></a><a href="#l1610">1610</a><td> * @param {?} val Variable to test.<tr><td><a id="l1611"></a><a href="#l1611">1611</a><td> * @return {boolean} Whether variable is boolean.<tr><td><a id="l1612"></a><a href="#l1612">1612</a><td> */<tr><td><a id="l1613"></a><a href="#l1613">1613</a><td>goog.isBoolean = function(val) {<tr><td><a id="l1614"></a><a href="#l1614">1614</a><td> return typeof val == &#39;boolean&#39;;<tr><td><a id="l1615"></a><a href="#l1615">1615</a><td>};<tr><td><a id="l1616"></a><a href="#l1616">1616</a><td><tr><td><a id="l1617"></a><a href="#l1617">1617</a><td><tr><td><a id="l1618"></a><a href="#l1618">1618</a><td>/**<tr><td><a id="l1619"></a><a href="#l1619">1619</a><td> * Returns true if the specified value is a number.<tr><td><a id="l1620"></a><a href="#l1620">1620</a><td> * @param {?} val Variable to test.<tr><td><a id="l1621"></a><a href="#l1621">1621</a><td> * @return {boolean} Whether variable is a number.<tr><td><a id="l1622"></a><a href="#l1622">1622</a><td> */<tr><td><a id="l1623"></a><a href="#l1623">1623</a><td>goog.isNumber = function(val) {<tr><td><a id="l1624"></a><a href="#l1624">1624</a><td> return typeof val == &#39;number&#39;;<tr><td><a id="l1625"></a><a href="#l1625">1625</a><td>};<tr><td><a id="l1626"></a><a href="#l1626">1626</a><td><tr><td><a id="l1627"></a><a href="#l1627">1627</a><td><tr><td><a id="l1628"></a><a href="#l1628">1628</a><td>/**<tr><td><a id="l1629"></a><a href="#l1629">1629</a><td> * Returns true if the specified value is a function.<tr><td><a id="l1630"></a><a href="#l1630">1630</a><td> * @param {?} val Variable to test.<tr><td><a id="l1631"></a><a href="#l1631">1631</a><td> * @return {boolean} Whether variable is a function.<tr><td><a id="l1632"></a><a href="#l1632">1632</a><td> */<tr><td><a id="l1633"></a><a href="#l1633">1633</a><td>goog.isFunction = function(val) {<tr><td><a id="l1634"></a><a href="#l1634">1634</a><td> return goog.typeOf(val) == &#39;function&#39;;<tr><td><a id="l1635"></a><a href="#l1635">1635</a><td>};<tr><td><a id="l1636"></a><a href="#l1636">1636</a><td><tr><td><a id="l1637"></a><a href="#l1637">1637</a><td><tr><td><a id="l1638"></a><a href="#l1638">1638</a><td>/**<tr><td><a id="l1639"></a><a href="#l1639">1639</a><td> * Returns true if the specified value is an object. This includes arrays and<tr><td><a id="l1640"></a><a href="#l1640">1640</a><td> * functions.<tr><td><a id="l1641"></a><a href="#l1641">1641</a><td> * @param {?} val Variable to test.<tr><td><a id="l1642"></a><a href="#l1642">1642</a><td> * @return {boolean} Whether variable is an object.<tr><td><a id="l1643"></a><a href="#l1643">1643</a><td> */<tr><td><a id="l1644"></a><a href="#l1644">1644</a><td>goog.isObject = function(val) {<tr><td><a id="l1645"></a><a href="#l1645">1645</a><td> var type = typeof val;<tr><td><a id="l1646"></a><a href="#l1646">1646</a><td> return type == &#39;object&#39; &amp;&amp; val != null || type == &#39;function&#39;;<tr><td><a id="l1647"></a><a href="#l1647">1647</a><td> // return Object(val) === val also works, but is slower, especially if val is<tr><td><a id="l1648"></a><a href="#l1648">1648</a><td> // not an object.<tr><td><a id="l1649"></a><a href="#l1649">1649</a><td>};<tr><td><a id="l1650"></a><a href="#l1650">1650</a><td><tr><td><a id="l1651"></a><a href="#l1651">1651</a><td><tr><td><a id="l1652"></a><a href="#l1652">1652</a><td>/**<tr><td><a id="l1653"></a><a href="#l1653">1653</a><td> * Gets a unique ID for an object. This mutates the object so that further calls<tr><td><a id="l1654"></a><a href="#l1654">1654</a><td> * with the same object as a parameter returns the same value. The unique ID is<tr><td><a id="l1655"></a><a href="#l1655">1655</a><td> * guaranteed to be unique across the current session amongst objects that are<tr><td><a id="l1656"></a><a href="#l1656">1656</a><td> * passed into {@code getUid}. There is no guarantee that the ID is unique or<tr><td><a id="l1657"></a><a href="#l1657">1657</a><td> * consistent across sessions. It is unsafe to generate unique ID for function<tr><td><a id="l1658"></a><a href="#l1658">1658</a><td> * prototypes.<tr><td><a id="l1659"></a><a href="#l1659">1659</a><td> *<tr><td><a id="l1660"></a><a href="#l1660">1660</a><td> * @param {Object} obj The object to get the unique ID for.<tr><td><a id="l1661"></a><a href="#l1661">1661</a><td> * @return {number} The unique ID for the object.<tr><td><a id="l1662"></a><a href="#l1662">1662</a><td> */<tr><td><a id="l1663"></a><a href="#l1663">1663</a><td>goog.getUid = function(obj) {<tr><td><a id="l1664"></a><a href="#l1664">1664</a><td> // TODO(arv): Make the type stricter, do not accept null.<tr><td><a id="l1665"></a><a href="#l1665">1665</a><td><tr><td><a id="l1666"></a><a href="#l1666">1666</a><td> // In Opera window.hasOwnProperty exists but always returns false so we avoid<tr><td><a id="l1667"></a><a href="#l1667">1667</a><td> // using it. As a consequence the unique ID generated for BaseClass.prototype<tr><td><a id="l1668"></a><a href="#l1668">1668</a><td> // and SubClass.prototype will be the same.<tr><td><a id="l1669"></a><a href="#l1669">1669</a><td> return obj[goog.UID_PROPERTY_] ||<tr><td><a id="l1670"></a><a href="#l1670">1670</a><td> (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);<tr><td><a id="l1671"></a><a href="#l1671">1671</a><td>};<tr><td><a id="l1672"></a><a href="#l1672">1672</a><td><tr><td><a id="l1673"></a><a href="#l1673">1673</a><td><tr><td><a id="l1674"></a><a href="#l1674">1674</a><td>/**<tr><td><a id="l1675"></a><a href="#l1675">1675</a><td> * Whether the given object is already assigned a unique ID.<tr><td><a id="l1676"></a><a href="#l1676">1676</a><td> *<tr><td><a id="l1677"></a><a href="#l1677">1677</a><td> * This does not modify the object.<tr><td><a id="l1678"></a><a href="#l1678">1678</a><td> *<tr><td><a id="l1679"></a><a href="#l1679">1679</a><td> * @param {!Object} obj The object to check.<tr><td><a id="l1680"></a><a href="#l1680">1680</a><td> * @return {boolean} Whether there is an assigned unique id for the object.<tr><td><a id="l1681"></a><a href="#l1681">1681</a><td> */<tr><td><a id="l1682"></a><a href="#l1682">1682</a><td>goog.hasUid = function(obj) {<tr><td><a id="l1683"></a><a href="#l1683">1683</a><td> return !!obj[goog.UID_PROPERTY_];<tr><td><a id="l1684"></a><a href="#l1684">1684</a><td>};<tr><td><a id="l1685"></a><a href="#l1685">1685</a><td><tr><td><a id="l1686"></a><a href="#l1686">1686</a><td><tr><td><a id="l1687"></a><a href="#l1687">1687</a><td>/**<tr><td><a id="l1688"></a><a href="#l1688">1688</a><td> * Removes the unique ID from an object. This is useful if the object was<tr><td><a id="l1689"></a><a href="#l1689">1689</a><td> * previously mutated using {@code goog.getUid} in which case the mutation is<tr><td><a id="l1690"></a><a href="#l1690">1690</a><td> * undone.<tr><td><a id="l1691"></a><a href="#l1691">1691</a><td> * @param {Object} obj The object to remove the unique ID field from.<tr><td><a id="l1692"></a><a href="#l1692">1692</a><td> */<tr><td><a id="l1693"></a><a href="#l1693">1693</a><td>goog.removeUid = function(obj) {<tr><td><a id="l1694"></a><a href="#l1694">1694</a><td> // TODO(arv): Make the type stricter, do not accept null.<tr><td><a id="l1695"></a><a href="#l1695">1695</a><td><tr><td><a id="l1696"></a><a href="#l1696">1696</a><td> // In IE, DOM nodes are not instances of Object and throw an exception if we<tr><td><a id="l1697"></a><a href="#l1697">1697</a><td> // try to delete. Instead we try to use removeAttribute.<tr><td><a id="l1698"></a><a href="#l1698">1698</a><td> if (&#39;removeAttribute&#39; in /** @type {!Object} */ (obj)) {<tr><td><a id="l1699"></a><a href="#l1699">1699</a><td> obj.removeAttribute(goog.UID_PROPERTY_);<tr><td><a id="l1700"></a><a href="#l1700">1700</a><td> }<tr><td><a id="l1701"></a><a href="#l1701">1701</a><td> /** @preserveTry */<tr><td><a id="l1702"></a><a href="#l1702">1702</a><td> try {<tr><td><a id="l1703"></a><a href="#l1703">1703</a><td> delete obj[goog.UID_PROPERTY_];<tr><td><a id="l1704"></a><a href="#l1704">1704</a><td> } catch (ex) {<tr><td><a id="l1705"></a><a href="#l1705">1705</a><td> }<tr><td><a id="l1706"></a><a href="#l1706">1706</a><td>};<tr><td><a id="l1707"></a><a href="#l1707">1707</a><td><tr><td><a id="l1708"></a><a href="#l1708">1708</a><td><tr><td><a id="l1709"></a><a href="#l1709">1709</a><td>/**<tr><td><a id="l1710"></a><a href="#l1710">1710</a><td> * Name for unique ID property. Initialized in a way to help avoid collisions<tr><td><a id="l1711"></a><a href="#l1711">1711</a><td> * with other closure JavaScript on the same page.<tr><td><a id="l1712"></a><a href="#l1712">1712</a><td> * @type {string}<tr><td><a id="l1713"></a><a href="#l1713">1713</a><td> * @private<tr><td><a id="l1714"></a><a href="#l1714">1714</a><td> */<tr><td><a id="l1715"></a><a href="#l1715">1715</a><td>goog.UID_PROPERTY_ = &#39;closure_uid_&#39; + ((Math.random() * 1e9) &gt;&gt;&gt; 0);<tr><td><a id="l1716"></a><a href="#l1716">1716</a><td><tr><td><a id="l1717"></a><a href="#l1717">1717</a><td><tr><td><a id="l1718"></a><a href="#l1718">1718</a><td>/**<tr><td><a id="l1719"></a><a href="#l1719">1719</a><td> * Counter for UID.<tr><td><a id="l1720"></a><a href="#l1720">1720</a><td> * @type {number}<tr><td><a id="l1721"></a><a href="#l1721">1721</a><td> * @private<tr><td><a id="l1722"></a><a href="#l1722">1722</a><td> */<tr><td><a id="l1723"></a><a href="#l1723">1723</a><td>goog.uidCounter_ = 0;<tr><td><a id="l1724"></a><a href="#l1724">1724</a><td><tr><td><a id="l1725"></a><a href="#l1725">1725</a><td><tr><td><a id="l1726"></a><a href="#l1726">1726</a><td>/**<tr><td><a id="l1727"></a><a href="#l1727">1727</a><td> * Adds a hash code field to an object. The hash code is unique for the<tr><td><a id="l1728"></a><a href="#l1728">1728</a><td> * given object.<tr><td><a id="l1729"></a><a href="#l1729">1729</a><td> * @param {Object} obj The object to get the hash code for.<tr><td><a id="l1730"></a><a href="#l1730">1730</a><td> * @return {number} The hash code for the object.<tr><td><a id="l1731"></a><a href="#l1731">1731</a><td> * @deprecated Use goog.getUid instead.<tr><td><a id="l1732"></a><a href="#l1732">1732</a><td> */<tr><td><a id="l1733"></a><a href="#l1733">1733</a><td>goog.getHashCode = goog.getUid;<tr><td><a id="l1734"></a><a href="#l1734">1734</a><td><tr><td><a id="l1735"></a><a href="#l1735">1735</a><td><tr><td><a id="l1736"></a><a href="#l1736">1736</a><td>/**<tr><td><a id="l1737"></a><a href="#l1737">1737</a><td> * Removes the hash code field from an object.<tr><td><a id="l1738"></a><a href="#l1738">1738</a><td> * @param {Object} obj The object to remove the field from.<tr><td><a id="l1739"></a><a href="#l1739">1739</a><td> * @deprecated Use goog.removeUid instead.<tr><td><a id="l1740"></a><a href="#l1740">1740</a><td> */<tr><td><a id="l1741"></a><a href="#l1741">1741</a><td>goog.removeHashCode = goog.removeUid;<tr><td><a id="l1742"></a><a href="#l1742">1742</a><td><tr><td><a id="l1743"></a><a href="#l1743">1743</a><td><tr><td><a id="l1744"></a><a href="#l1744">1744</a><td>/**<tr><td><a id="l1745"></a><a href="#l1745">1745</a><td> * Clones a value. The input may be an Object, Array, or basic type. Objects and<tr><td><a id="l1746"></a><a href="#l1746">1746</a><td> * arrays will be cloned recursively.<tr><td><a id="l1747"></a><a href="#l1747">1747</a><td> *<tr><td><a id="l1748"></a><a href="#l1748">1748</a><td> * WARNINGS:<tr><td><a id="l1749"></a><a href="#l1749">1749</a><td> * &lt;code&gt;goog.cloneObject&lt;/code&gt; does not detect reference loops. Objects that<tr><td><a id="l1750"></a><a href="#l1750">1750</a><td> * refer to themselves will cause infinite recursion.<tr><td><a id="l1751"></a><a href="#l1751">1751</a><td> *<tr><td><a id="l1752"></a><a href="#l1752">1752</a><td> * &lt;code&gt;goog.cloneObject&lt;/code&gt; is unaware of unique identifiers, and copies<tr><td><a id="l1753"></a><a href="#l1753">1753</a><td> * UIDs created by &lt;code&gt;getUid&lt;/code&gt; into cloned results.<tr><td><a id="l1754"></a><a href="#l1754">1754</a><td> *<tr><td><a id="l1755"></a><a href="#l1755">1755</a><td> * @param {*} obj The value to clone.<tr><td><a id="l1756"></a><a href="#l1756">1756</a><td> * @return {*} A clone of the input value.<tr><td><a id="l1757"></a><a href="#l1757">1757</a><td> * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods.<tr><td><a id="l1758"></a><a href="#l1758">1758</a><td> */<tr><td><a id="l1759"></a><a href="#l1759">1759</a><td>goog.cloneObject = function(obj) {<tr><td><a id="l1760"></a><a href="#l1760">1760</a><td> var type = goog.typeOf(obj);<tr><td><a id="l1761"></a><a href="#l1761">1761</a><td> if (type == &#39;object&#39; || type == &#39;array&#39;) {<tr><td><a id="l1762"></a><a href="#l1762">1762</a><td> if (obj.clone) {<tr><td><a id="l1763"></a><a href="#l1763">1763</a><td> return obj.clone();<tr><td><a id="l1764"></a><a href="#l1764">1764</a><td> }<tr><td><a id="l1765"></a><a href="#l1765">1765</a><td> var clone = type == &#39;array&#39; ? [] : {};<tr><td><a id="l1766"></a><a href="#l1766">1766</a><td> for (var key in obj) {<tr><td><a id="l1767"></a><a href="#l1767">1767</a><td> clone[key] = goog.cloneObject(obj[key]);<tr><td><a id="l1768"></a><a href="#l1768">1768</a><td> }<tr><td><a id="l1769"></a><a href="#l1769">1769</a><td> return clone;<tr><td><a id="l1770"></a><a href="#l1770">1770</a><td> }<tr><td><a id="l1771"></a><a href="#l1771">1771</a><td><tr><td><a id="l1772"></a><a href="#l1772">1772</a><td> return obj;<tr><td><a id="l1773"></a><a href="#l1773">1773</a><td>};<tr><td><a id="l1774"></a><a href="#l1774">1774</a><td><tr><td><a id="l1775"></a><a href="#l1775">1775</a><td><tr><td><a id="l1776"></a><a href="#l1776">1776</a><td>/**<tr><td><a id="l1777"></a><a href="#l1777">1777</a><td> * A native implementation of goog.bind.<tr><td><a id="l1778"></a><a href="#l1778">1778</a><td> * @param {Function} fn A function to partially apply.<tr><td><a id="l1779"></a><a href="#l1779">1779</a><td> * @param {Object|undefined} selfObj Specifies the object which this should<tr><td><a id="l1780"></a><a href="#l1780">1780</a><td> * point to when the function is run.<tr><td><a id="l1781"></a><a href="#l1781">1781</a><td> * @param {...*} var_args Additional arguments that are partially applied to the<tr><td><a id="l1782"></a><a href="#l1782">1782</a><td> * function.<tr><td><a id="l1783"></a><a href="#l1783">1783</a><td> * @return {!Function} A partially-applied form of the function bind() was<tr><td><a id="l1784"></a><a href="#l1784">1784</a><td> * invoked as a method of.<tr><td><a id="l1785"></a><a href="#l1785">1785</a><td> * @private<tr><td><a id="l1786"></a><a href="#l1786">1786</a><td> * @suppress {deprecated} The compiler thinks that Function.prototype.bind is<tr><td><a id="l1787"></a><a href="#l1787">1787</a><td> * deprecated because some people have declared a pure-JS version.<tr><td><a id="l1788"></a><a href="#l1788">1788</a><td> * Only the pure-JS version is truly deprecated.<tr><td><a id="l1789"></a><a href="#l1789">1789</a><td> */<tr><td><a id="l1790"></a><a href="#l1790">1790</a><td>goog.bindNative_ = function(fn, selfObj, var_args) {<tr><td><a id="l1791"></a><a href="#l1791">1791</a><td> return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));<tr><td><a id="l1792"></a><a href="#l1792">1792</a><td>};<tr><td><a id="l1793"></a><a href="#l1793">1793</a><td><tr><td><a id="l1794"></a><a href="#l1794">1794</a><td><tr><td><a id="l1795"></a><a href="#l1795">1795</a><td>/**<tr><td><a id="l1796"></a><a href="#l1796">1796</a><td> * A pure-JS implementation of goog.bind.<tr><td><a id="l1797"></a><a href="#l1797">1797</a><td> * @param {Function} fn A function to partially apply.<tr><td><a id="l1798"></a><a href="#l1798">1798</a><td> * @param {Object|undefined} selfObj Specifies the object which this should<tr><td><a id="l1799"></a><a href="#l1799">1799</a><td> * point to when the function is run.<tr><td><a id="l1800"></a><a href="#l1800">1800</a><td> * @param {...*} var_args Additional arguments that are partially applied to the<tr><td><a id="l1801"></a><a href="#l1801">1801</a><td> * function.<tr><td><a id="l1802"></a><a href="#l1802">1802</a><td> * @return {!Function} A partially-applied form of the function bind() was<tr><td><a id="l1803"></a><a href="#l1803">1803</a><td> * invoked as a method of.<tr><td><a id="l1804"></a><a href="#l1804">1804</a><td> * @private<tr><td><a id="l1805"></a><a href="#l1805">1805</a><td> */<tr><td><a id="l1806"></a><a href="#l1806">1806</a><td>goog.bindJs_ = function(fn, selfObj, var_args) {<tr><td><a id="l1807"></a><a href="#l1807">1807</a><td> if (!fn) {<tr><td><a id="l1808"></a><a href="#l1808">1808</a><td> throw new Error();<tr><td><a id="l1809"></a><a href="#l1809">1809</a><td> }<tr><td><a id="l1810"></a><a href="#l1810">1810</a><td><tr><td><a id="l1811"></a><a href="#l1811">1811</a><td> if (arguments.length &gt; 2) {<tr><td><a id="l1812"></a><a href="#l1812">1812</a><td> var boundArgs = Array.prototype.slice.call(arguments, 2);<tr><td><a id="l1813"></a><a href="#l1813">1813</a><td> return function() {<tr><td><a id="l1814"></a><a href="#l1814">1814</a><td> // Prepend the bound arguments to the current arguments.<tr><td><a id="l1815"></a><a href="#l1815">1815</a><td> var newArgs = Array.prototype.slice.call(arguments);<tr><td><a id="l1816"></a><a href="#l1816">1816</a><td> Array.prototype.unshift.apply(newArgs, boundArgs);<tr><td><a id="l1817"></a><a href="#l1817">1817</a><td> return fn.apply(selfObj, newArgs);<tr><td><a id="l1818"></a><a href="#l1818">1818</a><td> };<tr><td><a id="l1819"></a><a href="#l1819">1819</a><td><tr><td><a id="l1820"></a><a href="#l1820">1820</a><td> } else {<tr><td><a id="l1821"></a><a href="#l1821">1821</a><td> return function() {<tr><td><a id="l1822"></a><a href="#l1822">1822</a><td> return fn.apply(selfObj, arguments);<tr><td><a id="l1823"></a><a href="#l1823">1823</a><td> };<tr><td><a id="l1824"></a><a href="#l1824">1824</a><td> }<tr><td><a id="l1825"></a><a href="#l1825">1825</a><td>};<tr><td><a id="l1826"></a><a href="#l1826">1826</a><td><tr><td><a id="l1827"></a><a href="#l1827">1827</a><td><tr><td><a id="l1828"></a><a href="#l1828">1828</a><td>/**<tr><td><a id="l1829"></a><a href="#l1829">1829</a><td> * Partially applies this function to a particular &#39;this object&#39; and zero or<tr><td><a id="l1830"></a><a href="#l1830">1830</a><td> * more arguments. The result is a new function with some arguments of the first<tr><td><a id="l1831"></a><a href="#l1831">1831</a><td> * function pre-filled and the value of this &#39;pre-specified&#39;.<tr><td><a id="l1832"></a><a href="#l1832">1832</a><td> *<tr><td><a id="l1833"></a><a href="#l1833">1833</a><td> * Remaining arguments specified at call-time are appended to the pre-specified<tr><td><a id="l1834"></a><a href="#l1834">1834</a><td> * ones.<tr><td><a id="l1835"></a><a href="#l1835">1835</a><td> *<tr><td><a id="l1836"></a><a href="#l1836">1836</a><td> * Also see: {@link #partial}.<tr><td><a id="l1837"></a><a href="#l1837">1837</a><td> *<tr><td><a id="l1838"></a><a href="#l1838">1838</a><td> * Usage:<tr><td><a id="l1839"></a><a href="#l1839">1839</a><td> * &lt;pre&gt;var barMethBound = goog.bind(myFunction, myObj, &#39;arg1&#39;, &#39;arg2&#39;);<tr><td><a id="l1840"></a><a href="#l1840">1840</a><td> * barMethBound(&#39;arg3&#39;, &#39;arg4&#39;);&lt;/pre&gt;<tr><td><a id="l1841"></a><a href="#l1841">1841</a><td> *<tr><td><a id="l1842"></a><a href="#l1842">1842</a><td> * @param {?function(this:T, ...)} fn A function to partially apply.<tr><td><a id="l1843"></a><a href="#l1843">1843</a><td> * @param {T} selfObj Specifies the object which this should point to when the<tr><td><a id="l1844"></a><a href="#l1844">1844</a><td> * function is run.<tr><td><a id="l1845"></a><a href="#l1845">1845</a><td> * @param {...*} var_args Additional arguments that are partially applied to the<tr><td><a id="l1846"></a><a href="#l1846">1846</a><td> * function.<tr><td><a id="l1847"></a><a href="#l1847">1847</a><td> * @return {!Function} A partially-applied form of the function goog.bind() was<tr><td><a id="l1848"></a><a href="#l1848">1848</a><td> * invoked as a method of.<tr><td><a id="l1849"></a><a href="#l1849">1849</a><td> * @template T<tr><td><a id="l1850"></a><a href="#l1850">1850</a><td> * @suppress {deprecated} See above.<tr><td><a id="l1851"></a><a href="#l1851">1851</a><td> */<tr><td><a id="l1852"></a><a href="#l1852">1852</a><td>goog.bind = function(fn, selfObj, var_args) {<tr><td><a id="l1853"></a><a href="#l1853">1853</a><td> // TODO(nicksantos): narrow the type signature.<tr><td><a id="l1854"></a><a href="#l1854">1854</a><td> if (Function.prototype.bind &amp;&amp;<tr><td><a id="l1855"></a><a href="#l1855">1855</a><td> // NOTE(nicksantos): Somebody pulled base.js into the default Chrome<tr><td><a id="l1856"></a><a href="#l1856">1856</a><td> // extension environment. This means that for Chrome extensions, they get<tr><td><a id="l1857"></a><a href="#l1857">1857</a><td> // the implementation of Function.prototype.bind that calls goog.bind<tr><td><a id="l1858"></a><a href="#l1858">1858</a><td> // instead of the native one. Even worse, we don&#39;t want to introduce a<tr><td><a id="l1859"></a><a href="#l1859">1859</a><td> // circular dependency between goog.bind and Function.prototype.bind, so<tr><td><a id="l1860"></a><a href="#l1860">1860</a><td> // we have to hack this to make sure it works correctly.<tr><td><a id="l1861"></a><a href="#l1861">1861</a><td> Function.prototype.bind.toString().indexOf(&#39;native code&#39;) != -1) {<tr><td><a id="l1862"></a><a href="#l1862">1862</a><td> goog.bind = goog.bindNative_;<tr><td><a id="l1863"></a><a href="#l1863">1863</a><td> } else {<tr><td><a id="l1864"></a><a href="#l1864">1864</a><td> goog.bind = goog.bindJs_;<tr><td><a id="l1865"></a><a href="#l1865">1865</a><td> }<tr><td><a id="l1866"></a><a href="#l1866">1866</a><td> return goog.bind.apply(null, arguments);<tr><td><a id="l1867"></a><a href="#l1867">1867</a><td>};<tr><td><a id="l1868"></a><a href="#l1868">1868</a><td><tr><td><a id="l1869"></a><a href="#l1869">1869</a><td><tr><td><a id="l1870"></a><a href="#l1870">1870</a><td>/**<tr><td><a id="l1871"></a><a href="#l1871">1871</a><td> * Like goog.bind(), except that a &#39;this object&#39; is not required. Useful when<tr><td><a id="l1872"></a><a href="#l1872">1872</a><td> * the target function is already bound.<tr><td><a id="l1873"></a><a href="#l1873">1873</a><td> *<tr><td><a id="l1874"></a><a href="#l1874">1874</a><td> * Usage:<tr><td><a id="l1875"></a><a href="#l1875">1875</a><td> * var g = goog.partial(f, arg1, arg2);<tr><td><a id="l1876"></a><a href="#l1876">1876</a><td> * g(arg3, arg4);<tr><td><a id="l1877"></a><a href="#l1877">1877</a><td> *<tr><td><a id="l1878"></a><a href="#l1878">1878</a><td> * @param {Function} fn A function to partially apply.<tr><td><a id="l1879"></a><a href="#l1879">1879</a><td> * @param {...*} var_args Additional arguments that are partially applied to fn.<tr><td><a id="l1880"></a><a href="#l1880">1880</a><td> * @return {!Function} A partially-applied form of the function goog.partial()<tr><td><a id="l1881"></a><a href="#l1881">1881</a><td> * was invoked as a method of.<tr><td><a id="l1882"></a><a href="#l1882">1882</a><td> */<tr><td><a id="l1883"></a><a href="#l1883">1883</a><td>goog.partial = function(fn, var_args) {<tr><td><a id="l1884"></a><a href="#l1884">1884</a><td> var args = Array.prototype.slice.call(arguments, 1);<tr><td><a id="l1885"></a><a href="#l1885">1885</a><td> return function() {<tr><td><a id="l1886"></a><a href="#l1886">1886</a><td> // Clone the array (with slice()) and append additional arguments<tr><td><a id="l1887"></a><a href="#l1887">1887</a><td> // to the existing arguments.<tr><td><a id="l1888"></a><a href="#l1888">1888</a><td> var newArgs = args.slice();<tr><td><a id="l1889"></a><a href="#l1889">1889</a><td> newArgs.push.apply(newArgs, arguments);<tr><td><a id="l1890"></a><a href="#l1890">1890</a><td> return fn.apply(this, newArgs);<tr><td><a id="l1891"></a><a href="#l1891">1891</a><td> };<tr><td><a id="l1892"></a><a href="#l1892">1892</a><td>};<tr><td><a id="l1893"></a><a href="#l1893">1893</a><td><tr><td><a id="l1894"></a><a href="#l1894">1894</a><td><tr><td><a id="l1895"></a><a href="#l1895">1895</a><td>/**<tr><td><a id="l1896"></a><a href="#l1896">1896</a><td> * Copies all the members of a source object to a target object. This method<tr><td><a id="l1897"></a><a href="#l1897">1897</a><td> * does not work on all browsers for all objects that contain keys such as<tr><td><a id="l1898"></a><a href="#l1898">1898</a><td> * toString or hasOwnProperty. Use goog.object.extend for this purpose.<tr><td><a id="l1899"></a><a href="#l1899">1899</a><td> * @param {Object} target Target.<tr><td><a id="l1900"></a><a href="#l1900">1900</a><td> * @param {Object} source Source.<tr><td><a id="l1901"></a><a href="#l1901">1901</a><td> */<tr><td><a id="l1902"></a><a href="#l1902">1902</a><td>goog.mixin = function(target, source) {<tr><td><a id="l1903"></a><a href="#l1903">1903</a><td> for (var x in source) {<tr><td><a id="l1904"></a><a href="#l1904">1904</a><td> target[x] = source[x];<tr><td><a id="l1905"></a><a href="#l1905">1905</a><td> }<tr><td><a id="l1906"></a><a href="#l1906">1906</a><td><tr><td><a id="l1907"></a><a href="#l1907">1907</a><td> // For IE7 or lower, the for-in-loop does not contain any properties that are<tr><td><a id="l1908"></a><a href="#l1908">1908</a><td> // not enumerable on the prototype object (for example, isPrototypeOf from<tr><td><a id="l1909"></a><a href="#l1909">1909</a><td> // Object.prototype) but also it will not include &#39;replace&#39; on objects that<tr><td><a id="l1910"></a><a href="#l1910">1910</a><td> // extend String and change &#39;replace&#39; (not that it is common for anyone to<tr><td><a id="l1911"></a><a href="#l1911">1911</a><td> // extend anything except Object).<tr><td><a id="l1912"></a><a href="#l1912">1912</a><td>};<tr><td><a id="l1913"></a><a href="#l1913">1913</a><td><tr><td><a id="l1914"></a><a href="#l1914">1914</a><td><tr><td><a id="l1915"></a><a href="#l1915">1915</a><td>/**<tr><td><a id="l1916"></a><a href="#l1916">1916</a><td> * @return {number} An integer value representing the number of milliseconds<tr><td><a id="l1917"></a><a href="#l1917">1917</a><td> * between midnight, January 1, 1970 and the current time.<tr><td><a id="l1918"></a><a href="#l1918">1918</a><td> */<tr><td><a id="l1919"></a><a href="#l1919">1919</a><td>goog.now = (goog.TRUSTED_SITE &amp;&amp; Date.now) || (function() {<tr><td><a id="l1920"></a><a href="#l1920">1920</a><td> // Unary plus operator converts its operand to a number which in the case of<tr><td><a id="l1921"></a><a href="#l1921">1921</a><td> // a date is done by calling getTime().<tr><td><a id="l1922"></a><a href="#l1922">1922</a><td> return +new Date();<tr><td><a id="l1923"></a><a href="#l1923">1923</a><td>});<tr><td><a id="l1924"></a><a href="#l1924">1924</a><td><tr><td><a id="l1925"></a><a href="#l1925">1925</a><td><tr><td><a id="l1926"></a><a href="#l1926">1926</a><td>/**<tr><td><a id="l1927"></a><a href="#l1927">1927</a><td> * Evals JavaScript in the global scope. In IE this uses execScript, other<tr><td><a id="l1928"></a><a href="#l1928">1928</a><td> * browsers use goog.global.eval. If goog.global.eval does not evaluate in the<tr><td><a id="l1929"></a><a href="#l1929">1929</a><td> * global scope (for example, in Safari), appends a script tag instead.<tr><td><a id="l1930"></a><a href="#l1930">1930</a><td> * Throws an exception if neither execScript or eval is defined.<tr><td><a id="l1931"></a><a href="#l1931">1931</a><td> * @param {string} script JavaScript string.<tr><td><a id="l1932"></a><a href="#l1932">1932</a><td> */<tr><td><a id="l1933"></a><a href="#l1933">1933</a><td>goog.globalEval = function(script) {<tr><td><a id="l1934"></a><a href="#l1934">1934</a><td> if (goog.global.execScript) {<tr><td><a id="l1935"></a><a href="#l1935">1935</a><td> goog.global.execScript(script, &#39;JavaScript&#39;);<tr><td><a id="l1936"></a><a href="#l1936">1936</a><td> } else if (goog.global.eval) {<tr><td><a id="l1937"></a><a href="#l1937">1937</a><td> // Test to see if eval works<tr><td><a id="l1938"></a><a href="#l1938">1938</a><td> if (goog.evalWorksForGlobals_ == null) {<tr><td><a id="l1939"></a><a href="#l1939">1939</a><td> goog.global.eval(&#39;var _evalTest_ = 1;&#39;);<tr><td><a id="l1940"></a><a href="#l1940">1940</a><td> if (typeof goog.global[&#39;_evalTest_&#39;] != &#39;undefined&#39;) {<tr><td><a id="l1941"></a><a href="#l1941">1941</a><td> try {<tr><td><a id="l1942"></a><a href="#l1942">1942</a><td> delete goog.global[&#39;_evalTest_&#39;];<tr><td><a id="l1943"></a><a href="#l1943">1943</a><td> } catch (ignore) {<tr><td><a id="l1944"></a><a href="#l1944">1944</a><td> // Microsoft edge fails the deletion above in strict mode.<tr><td><a id="l1945"></a><a href="#l1945">1945</a><td> }<tr><td><a id="l1946"></a><a href="#l1946">1946</a><td> goog.evalWorksForGlobals_ = true;<tr><td><a id="l1947"></a><a href="#l1947">1947</a><td> } else {<tr><td><a id="l1948"></a><a href="#l1948">1948</a><td> goog.evalWorksForGlobals_ = false;<tr><td><a id="l1949"></a><a href="#l1949">1949</a><td> }<tr><td><a id="l1950"></a><a href="#l1950">1950</a><td> }<tr><td><a id="l1951"></a><a href="#l1951">1951</a><td><tr><td><a id="l1952"></a><a href="#l1952">1952</a><td> if (goog.evalWorksForGlobals_) {<tr><td><a id="l1953"></a><a href="#l1953">1953</a><td> goog.global.eval(script);<tr><td><a id="l1954"></a><a href="#l1954">1954</a><td> } else {<tr><td><a id="l1955"></a><a href="#l1955">1955</a><td> /** @type {Document} */<tr><td><a id="l1956"></a><a href="#l1956">1956</a><td> var doc = goog.global.document;<tr><td><a id="l1957"></a><a href="#l1957">1957</a><td> var scriptElt = /** @type {!HTMLScriptElement} */ (<tr><td><a id="l1958"></a><a href="#l1958">1958</a><td> doc.createElement(&#39;SCRIPT&#39;));<tr><td><a id="l1959"></a><a href="#l1959">1959</a><td> scriptElt.type = &#39;text/javascript&#39;;<tr><td><a id="l1960"></a><a href="#l1960">1960</a><td> scriptElt.defer = false;<tr><td><a id="l1961"></a><a href="#l1961">1961</a><td> // Note(user): can&#39;t use .innerHTML since &quot;t(&#39;&lt;test&gt;&#39;)&quot; will fail and<tr><td><a id="l1962"></a><a href="#l1962">1962</a><td> // .text doesn&#39;t work in Safari 2. Therefore we append a text node.<tr><td><a id="l1963"></a><a href="#l1963">1963</a><td> scriptElt.appendChild(doc.createTextNode(script));<tr><td><a id="l1964"></a><a href="#l1964">1964</a><td> doc.body.appendChild(scriptElt);<tr><td><a id="l1965"></a><a href="#l1965">1965</a><td> doc.body.removeChild(scriptElt);<tr><td><a id="l1966"></a><a href="#l1966">1966</a><td> }<tr><td><a id="l1967"></a><a href="#l1967">1967</a><td> } else {<tr><td><a id="l1968"></a><a href="#l1968">1968</a><td> throw Error(&#39;goog.globalEval not available&#39;);<tr><td><a id="l1969"></a><a href="#l1969">1969</a><td> }<tr><td><a id="l1970"></a><a href="#l1970">1970</a><td>};<tr><td><a id="l1971"></a><a href="#l1971">1971</a><td><tr><td><a id="l1972"></a><a href="#l1972">1972</a><td><tr><td><a id="l1973"></a><a href="#l1973">1973</a><td>/**<tr><td><a id="l1974"></a><a href="#l1974">1974</a><td> * Indicates whether or not we can call &#39;eval&#39; directly to eval code in the<tr><td><a id="l1975"></a><a href="#l1975">1975</a><td> * global scope. Set to a Boolean by the first call to goog.globalEval (which<tr><td><a id="l1976"></a><a href="#l1976">1976</a><td> * empirically tests whether eval works for globals). @see goog.globalEval<tr><td><a id="l1977"></a><a href="#l1977">1977</a><td> * @type {?boolean}<tr><td><a id="l1978"></a><a href="#l1978">1978</a><td> * @private<tr><td><a id="l1979"></a><a href="#l1979">1979</a><td> */<tr><td><a id="l1980"></a><a href="#l1980">1980</a><td>goog.evalWorksForGlobals_ = null;<tr><td><a id="l1981"></a><a href="#l1981">1981</a><td><tr><td><a id="l1982"></a><a href="#l1982">1982</a><td><tr><td><a id="l1983"></a><a href="#l1983">1983</a><td>/**<tr><td><a id="l1984"></a><a href="#l1984">1984</a><td> * Optional map of CSS class names to obfuscated names used with<tr><td><a id="l1985"></a><a href="#l1985">1985</a><td> * goog.getCssName().<tr><td><a id="l1986"></a><a href="#l1986">1986</a><td> * @private {!Object&lt;string, string&gt;|undefined}<tr><td><a id="l1987"></a><a href="#l1987">1987</a><td> * @see goog.setCssNameMapping<tr><td><a id="l1988"></a><a href="#l1988">1988</a><td> */<tr><td><a id="l1989"></a><a href="#l1989">1989</a><td>goog.cssNameMapping_;<tr><td><a id="l1990"></a><a href="#l1990">1990</a><td><tr><td><a id="l1991"></a><a href="#l1991">1991</a><td><tr><td><a id="l1992"></a><a href="#l1992">1992</a><td>/**<tr><td><a id="l1993"></a><a href="#l1993">1993</a><td> * Optional obfuscation style for CSS class names. Should be set to either<tr><td><a id="l1994"></a><a href="#l1994">1994</a><td> * &#39;BY_WHOLE&#39; or &#39;BY_PART&#39; if defined.<tr><td><a id="l1995"></a><a href="#l1995">1995</a><td> * @type {string|undefined}<tr><td><a id="l1996"></a><a href="#l1996">1996</a><td> * @private<tr><td><a id="l1997"></a><a href="#l1997">1997</a><td> * @see goog.setCssNameMapping<tr><td><a id="l1998"></a><a href="#l1998">1998</a><td> */<tr><td><a id="l1999"></a><a href="#l1999">1999</a><td>goog.cssNameMappingStyle_;<tr><td><a id="l2000"></a><a href="#l2000">2000</a><td><tr><td><a id="l2001"></a><a href="#l2001">2001</a><td><tr><td><a id="l2002"></a><a href="#l2002">2002</a><td>/**<tr><td><a id="l2003"></a><a href="#l2003">2003</a><td> * Handles strings that are intended to be used as CSS class names.<tr><td><a id="l2004"></a><a href="#l2004">2004</a><td> *<tr><td><a id="l2005"></a><a href="#l2005">2005</a><td> * This function works in tandem with @see goog.setCssNameMapping.<tr><td><a id="l2006"></a><a href="#l2006">2006</a><td> *<tr><td><a id="l2007"></a><a href="#l2007">2007</a><td> * Without any mapping set, the arguments are simple joined with a hyphen and<tr><td><a id="l2008"></a><a href="#l2008">2008</a><td> * passed through unaltered.<tr><td><a id="l2009"></a><a href="#l2009">2009</a><td> *<tr><td><a id="l2010"></a><a href="#l2010">2010</a><td> * When there is a mapping, there are two possible styles in which these<tr><td><a id="l2011"></a><a href="#l2011">2011</a><td> * mappings are used. In the BY_PART style, each part (i.e. in between hyphens)<tr><td><a id="l2012"></a><a href="#l2012">2012</a><td> * of the passed in css name is rewritten according to the map. In the BY_WHOLE<tr><td><a id="l2013"></a><a href="#l2013">2013</a><td> * style, the full css name is looked up in the map directly. If a rewrite is<tr><td><a id="l2014"></a><a href="#l2014">2014</a><td> * not specified by the map, the compiler will output a warning.<tr><td><a id="l2015"></a><a href="#l2015">2015</a><td> *<tr><td><a id="l2016"></a><a href="#l2016">2016</a><td> * When the mapping is passed to the compiler, it will replace calls to<tr><td><a id="l2017"></a><a href="#l2017">2017</a><td> * goog.getCssName with the strings from the mapping, e.g.<tr><td><a id="l2018"></a><a href="#l2018">2018</a><td> * var x = goog.getCssName(&#39;foo&#39;);<tr><td><a id="l2019"></a><a href="#l2019">2019</a><td> * var y = goog.getCssName(this.baseClass, &#39;active&#39;);<tr><td><a id="l2020"></a><a href="#l2020">2020</a><td> * becomes:<tr><td><a id="l2021"></a><a href="#l2021">2021</a><td> * var x = &#39;foo&#39;;<tr><td><a id="l2022"></a><a href="#l2022">2022</a><td> * var y = this.baseClass + &#39;-active&#39;;<tr><td><a id="l2023"></a><a href="#l2023">2023</a><td> *<tr><td><a id="l2024"></a><a href="#l2024">2024</a><td> * If one argument is passed it will be processed, if two are passed only the<tr><td><a id="l2025"></a><a href="#l2025">2025</a><td> * modifier will be processed, as it is assumed the first argument was generated<tr><td><a id="l2026"></a><a href="#l2026">2026</a><td> * as a result of calling goog.getCssName.<tr><td><a id="l2027"></a><a href="#l2027">2027</a><td> *<tr><td><a id="l2028"></a><a href="#l2028">2028</a><td> * @param {string} className The class name.<tr><td><a id="l2029"></a><a href="#l2029">2029</a><td> * @param {string=} opt_modifier A modifier to be appended to the class name.<tr><td><a id="l2030"></a><a href="#l2030">2030</a><td> * @return {string} The class name or the concatenation of the class name and<tr><td><a id="l2031"></a><a href="#l2031">2031</a><td> * the modifier.<tr><td><a id="l2032"></a><a href="#l2032">2032</a><td> */<tr><td><a id="l2033"></a><a href="#l2033">2033</a><td>goog.getCssName = function(className, opt_modifier) {<tr><td><a id="l2034"></a><a href="#l2034">2034</a><td> var getMapping = function(cssName) {<tr><td><a id="l2035"></a><a href="#l2035">2035</a><td> return goog.cssNameMapping_[cssName] || cssName;<tr><td><a id="l2036"></a><a href="#l2036">2036</a><td> };<tr><td><a id="l2037"></a><a href="#l2037">2037</a><td><tr><td><a id="l2038"></a><a href="#l2038">2038</a><td> var renameByParts = function(cssName) {<tr><td><a id="l2039"></a><a href="#l2039">2039</a><td> // Remap all the parts individually.<tr><td><a id="l2040"></a><a href="#l2040">2040</a><td> var parts = cssName.split(&#39;-&#39;);<tr><td><a id="l2041"></a><a href="#l2041">2041</a><td> var mapped = [];<tr><td><a id="l2042"></a><a href="#l2042">2042</a><td> for (var i = 0; i &lt; parts.length; i++) {<tr><td><a id="l2043"></a><a href="#l2043">2043</a><td> mapped.push(getMapping(parts[i]));<tr><td><a id="l2044"></a><a href="#l2044">2044</a><td> }<tr><td><a id="l2045"></a><a href="#l2045">2045</a><td> return mapped.join(&#39;-&#39;);<tr><td><a id="l2046"></a><a href="#l2046">2046</a><td> };<tr><td><a id="l2047"></a><a href="#l2047">2047</a><td><tr><td><a id="l2048"></a><a href="#l2048">2048</a><td> var rename;<tr><td><a id="l2049"></a><a href="#l2049">2049</a><td> if (goog.cssNameMapping_) {<tr><td><a id="l2050"></a><a href="#l2050">2050</a><td> rename = goog.cssNameMappingStyle_ == &#39;BY_WHOLE&#39; ?<tr><td><a id="l2051"></a><a href="#l2051">2051</a><td> getMapping : renameByParts;<tr><td><a id="l2052"></a><a href="#l2052">2052</a><td> } else {<tr><td><a id="l2053"></a><a href="#l2053">2053</a><td> rename = function(a) {<tr><td><a id="l2054"></a><a href="#l2054">2054</a><td> return a;<tr><td><a id="l2055"></a><a href="#l2055">2055</a><td> };<tr><td><a id="l2056"></a><a href="#l2056">2056</a><td> }<tr><td><a id="l2057"></a><a href="#l2057">2057</a><td><tr><td><a id="l2058"></a><a href="#l2058">2058</a><td> if (opt_modifier) {<tr><td><a id="l2059"></a><a href="#l2059">2059</a><td> return className + &#39;-&#39; + rename(opt_modifier);<tr><td><a id="l2060"></a><a href="#l2060">2060</a><td> } else {<tr><td><a id="l2061"></a><a href="#l2061">2061</a><td> return rename(className);<tr><td><a id="l2062"></a><a href="#l2062">2062</a><td> }<tr><td><a id="l2063"></a><a href="#l2063">2063</a><td>};<tr><td><a id="l2064"></a><a href="#l2064">2064</a><td><tr><td><a id="l2065"></a><a href="#l2065">2065</a><td><tr><td><a id="l2066"></a><a href="#l2066">2066</a><td>/**<tr><td><a id="l2067"></a><a href="#l2067">2067</a><td> * Sets the map to check when returning a value from goog.getCssName(). Example:<tr><td><a id="l2068"></a><a href="#l2068">2068</a><td> * &lt;pre&gt;<tr><td><a id="l2069"></a><a href="#l2069">2069</a><td> * goog.setCssNameMapping({<tr><td><a id="l2070"></a><a href="#l2070">2070</a><td> * &quot;goog&quot;: &quot;a&quot;,<tr><td><a id="l2071"></a><a href="#l2071">2071</a><td> * &quot;disabled&quot;: &quot;b&quot;,<tr><td><a id="l2072"></a><a href="#l2072">2072</a><td> * });<tr><td><a id="l2073"></a><a href="#l2073">2073</a><td> *<tr><td><a id="l2074"></a><a href="#l2074">2074</a><td> * var x = goog.getCssName(&#39;goog&#39;);<tr><td><a id="l2075"></a><a href="#l2075">2075</a><td> * // The following evaluates to: &quot;a a-b&quot;.<tr><td><a id="l2076"></a><a href="#l2076">2076</a><td> * goog.getCssName(&#39;goog&#39;) + &#39; &#39; + goog.getCssName(x, &#39;disabled&#39;)<tr><td><a id="l2077"></a><a href="#l2077">2077</a><td> * &lt;/pre&gt;<tr><td><a id="l2078"></a><a href="#l2078">2078</a><td> * When declared as a map of string literals to string literals, the JSCompiler<tr><td><a id="l2079"></a><a href="#l2079">2079</a><td> * will replace all calls to goog.getCssName() using the supplied map if the<tr><td><a id="l2080"></a><a href="#l2080">2080</a><td> * --process_closure_primitives flag is set.<tr><td><a id="l2081"></a><a href="#l2081">2081</a><td> *<tr><td><a id="l2082"></a><a href="#l2082">2082</a><td> * @param {!Object} mapping A map of strings to strings where keys are possible<tr><td><a id="l2083"></a><a href="#l2083">2083</a><td> * arguments to goog.getCssName() and values are the corresponding values<tr><td><a id="l2084"></a><a href="#l2084">2084</a><td> * that should be returned.<tr><td><a id="l2085"></a><a href="#l2085">2085</a><td> * @param {string=} opt_style The style of css name mapping. There are two valid<tr><td><a id="l2086"></a><a href="#l2086">2086</a><td> * options: &#39;BY_PART&#39;, and &#39;BY_WHOLE&#39;.<tr><td><a id="l2087"></a><a href="#l2087">2087</a><td> * @see goog.getCssName for a description.<tr><td><a id="l2088"></a><a href="#l2088">2088</a><td> */<tr><td><a id="l2089"></a><a href="#l2089">2089</a><td>goog.setCssNameMapping = function(mapping, opt_style) {<tr><td><a id="l2090"></a><a href="#l2090">2090</a><td> goog.cssNameMapping_ = mapping;<tr><td><a id="l2091"></a><a href="#l2091">2091</a><td> goog.cssNameMappingStyle_ = opt_style;<tr><td><a id="l2092"></a><a href="#l2092">2092</a><td>};<tr><td><a id="l2093"></a><a href="#l2093">2093</a><td><tr><td><a id="l2094"></a><a href="#l2094">2094</a><td><tr><td><a id="l2095"></a><a href="#l2095">2095</a><td>/**<tr><td><a id="l2096"></a><a href="#l2096">2096</a><td> * To use CSS renaming in compiled mode, one of the input files should have a<tr><td><a id="l2097"></a><a href="#l2097">2097</a><td> * call to goog.setCssNameMapping() with an object literal that the JSCompiler<tr><td><a id="l2098"></a><a href="#l2098">2098</a><td> * can extract and use to replace all calls to goog.getCssName(). In uncompiled<tr><td><a id="l2099"></a><a href="#l2099">2099</a><td> * mode, JavaScript code should be loaded before this base.js file that declares<tr><td><a id="l2100"></a><a href="#l2100">2100</a><td> * a global variable, CLOSURE_CSS_NAME_MAPPING, which is used below. This is<tr><td><a id="l2101"></a><a href="#l2101">2101</a><td> * to ensure that the mapping is loaded before any calls to goog.getCssName()<tr><td><a id="l2102"></a><a href="#l2102">2102</a><td> * are made in uncompiled mode.<tr><td><a id="l2103"></a><a href="#l2103">2103</a><td> *<tr><td><a id="l2104"></a><a href="#l2104">2104</a><td> * A hook for overriding the CSS name mapping.<tr><td><a id="l2105"></a><a href="#l2105">2105</a><td> * @type {!Object&lt;string, string&gt;|undefined}<tr><td><a id="l2106"></a><a href="#l2106">2106</a><td> */<tr><td><a id="l2107"></a><a href="#l2107">2107</a><td>goog.global.CLOSURE_CSS_NAME_MAPPING;<tr><td><a id="l2108"></a><a href="#l2108">2108</a><td><tr><td><a id="l2109"></a><a href="#l2109">2109</a><td><tr><td><a id="l2110"></a><a href="#l2110">2110</a><td>if (!COMPILED &amp;&amp; goog.global.CLOSURE_CSS_NAME_MAPPING) {<tr><td><a id="l2111"></a><a href="#l2111">2111</a><td> // This does not call goog.setCssNameMapping() because the JSCompiler<tr><td><a id="l2112"></a><a href="#l2112">2112</a><td> // requires that goog.setCssNameMapping() be called with an object literal.<tr><td><a id="l2113"></a><a href="#l2113">2113</a><td> goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING;<tr><td><a id="l2114"></a><a href="#l2114">2114</a><td>}<tr><td><a id="l2115"></a><a href="#l2115">2115</a><td><tr><td><a id="l2116"></a><a href="#l2116">2116</a><td><tr><td><a id="l2117"></a><a href="#l2117">2117</a><td>/**<tr><td><a id="l2118"></a><a href="#l2118">2118</a><td> * Gets a localized message.<tr><td><a id="l2119"></a><a href="#l2119">2119</a><td> *<tr><td><a id="l2120"></a><a href="#l2120">2120</a><td> * This function is a compiler primitive. If you give the compiler a localized<tr><td><a id="l2121"></a><a href="#l2121">2121</a><td> * message bundle, it will replace the string at compile-time with a localized<tr><td><a id="l2122"></a><a href="#l2122">2122</a><td> * version, and expand goog.getMsg call to a concatenated string.<tr><td><a id="l2123"></a><a href="#l2123">2123</a><td> *<tr><td><a id="l2124"></a><a href="#l2124">2124</a><td> * Messages must be initialized in the form:<tr><td><a id="l2125"></a><a href="#l2125">2125</a><td> * &lt;code&gt;<tr><td><a id="l2126"></a><a href="#l2126">2126</a><td> * var MSG_NAME = goog.getMsg(&#39;Hello {$placeholder}&#39;, {&#39;placeholder&#39;: &#39;world&#39;});<tr><td><a id="l2127"></a><a href="#l2127">2127</a><td> * &lt;/code&gt;<tr><td><a id="l2128"></a><a href="#l2128">2128</a><td> *<tr><td><a id="l2129"></a><a href="#l2129">2129</a><td> * @param {string} str Translatable string, places holders in the form {$foo}.<tr><td><a id="l2130"></a><a href="#l2130">2130</a><td> * @param {Object&lt;string, string&gt;=} opt_values Maps place holder name to value.<tr><td><a id="l2131"></a><a href="#l2131">2131</a><td> * @return {string} message with placeholders filled.<tr><td><a id="l2132"></a><a href="#l2132">2132</a><td> */<tr><td><a id="l2133"></a><a href="#l2133">2133</a><td>goog.getMsg = function(str, opt_values) {<tr><td><a id="l2134"></a><a href="#l2134">2134</a><td> if (opt_values) {<tr><td><a id="l2135"></a><a href="#l2135">2135</a><td> str = str.replace(/\{\$([^}]+)}/g, function(match, key) {<tr><td><a id="l2136"></a><a href="#l2136">2136</a><td> return (opt_values != null &amp;&amp; key in opt_values) ?<tr><td><a id="l2137"></a><a href="#l2137">2137</a><td> opt_values[key] : match;<tr><td><a id="l2138"></a><a href="#l2138">2138</a><td> });<tr><td><a id="l2139"></a><a href="#l2139">2139</a><td> }<tr><td><a id="l2140"></a><a href="#l2140">2140</a><td> return str;<tr><td><a id="l2141"></a><a href="#l2141">2141</a><td>};<tr><td><a id="l2142"></a><a href="#l2142">2142</a><td><tr><td><a id="l2143"></a><a href="#l2143">2143</a><td><tr><td><a id="l2144"></a><a href="#l2144">2144</a><td>/**<tr><td><a id="l2145"></a><a href="#l2145">2145</a><td> * Gets a localized message. If the message does not have a translation, gives a<tr><td><a id="l2146"></a><a href="#l2146">2146</a><td> * fallback message.<tr><td><a id="l2147"></a><a href="#l2147">2147</a><td> *<tr><td><a id="l2148"></a><a href="#l2148">2148</a><td> * This is useful when introducing a new message that has not yet been<tr><td><a id="l2149"></a><a href="#l2149">2149</a><td> * translated into all languages.<tr><td><a id="l2150"></a><a href="#l2150">2150</a><td> *<tr><td><a id="l2151"></a><a href="#l2151">2151</a><td> * This function is a compiler primitive. Must be used in the form:<tr><td><a id="l2152"></a><a href="#l2152">2152</a><td> * &lt;code&gt;var x = goog.getMsgWithFallback(MSG_A, MSG_B);&lt;/code&gt;<tr><td><a id="l2153"></a><a href="#l2153">2153</a><td> * where MSG_A and MSG_B were initialized with goog.getMsg.<tr><td><a id="l2154"></a><a href="#l2154">2154</a><td> *<tr><td><a id="l2155"></a><a href="#l2155">2155</a><td> * @param {string} a The preferred message.<tr><td><a id="l2156"></a><a href="#l2156">2156</a><td> * @param {string} b The fallback message.<tr><td><a id="l2157"></a><a href="#l2157">2157</a><td> * @return {string} The best translated message.<tr><td><a id="l2158"></a><a href="#l2158">2158</a><td> */<tr><td><a id="l2159"></a><a href="#l2159">2159</a><td>goog.getMsgWithFallback = function(a, b) {<tr><td><a id="l2160"></a><a href="#l2160">2160</a><td> return a;<tr><td><a id="l2161"></a><a href="#l2161">2161</a><td>};<tr><td><a id="l2162"></a><a href="#l2162">2162</a><td><tr><td><a id="l2163"></a><a href="#l2163">2163</a><td><tr><td><a id="l2164"></a><a href="#l2164">2164</a><td>/**<tr><td><a id="l2165"></a><a href="#l2165">2165</a><td> * Exposes an unobfuscated global namespace path for the given object.<tr><td><a id="l2166"></a><a href="#l2166">2166</a><td> * Note that fields of the exported object *will* be obfuscated, unless they are<tr><td><a id="l2167"></a><a href="#l2167">2167</a><td> * exported in turn via this function or goog.exportProperty.<tr><td><a id="l2168"></a><a href="#l2168">2168</a><td> *<tr><td><a id="l2169"></a><a href="#l2169">2169</a><td> * Also handy for making public items that are defined in anonymous closures.<tr><td><a id="l2170"></a><a href="#l2170">2170</a><td> *<tr><td><a id="l2171"></a><a href="#l2171">2171</a><td> * ex. goog.exportSymbol(&#39;public.path.Foo&#39;, Foo);<tr><td><a id="l2172"></a><a href="#l2172">2172</a><td> *<tr><td><a id="l2173"></a><a href="#l2173">2173</a><td> * ex. goog.exportSymbol(&#39;public.path.Foo.staticFunction&#39;, Foo.staticFunction);<tr><td><a id="l2174"></a><a href="#l2174">2174</a><td> * public.path.Foo.staticFunction();<tr><td><a id="l2175"></a><a href="#l2175">2175</a><td> *<tr><td><a id="l2176"></a><a href="#l2176">2176</a><td> * ex. goog.exportSymbol(&#39;public.path.Foo.prototype.myMethod&#39;,<tr><td><a id="l2177"></a><a href="#l2177">2177</a><td> * Foo.prototype.myMethod);<tr><td><a id="l2178"></a><a href="#l2178">2178</a><td> * new public.path.Foo().myMethod();<tr><td><a id="l2179"></a><a href="#l2179">2179</a><td> *<tr><td><a id="l2180"></a><a href="#l2180">2180</a><td> * @param {string} publicPath Unobfuscated name to export.<tr><td><a id="l2181"></a><a href="#l2181">2181</a><td> * @param {*} object Object the name should point to.<tr><td><a id="l2182"></a><a href="#l2182">2182</a><td> * @param {Object=} opt_objectToExportTo The object to add the path to; default<tr><td><a id="l2183"></a><a href="#l2183">2183</a><td> * is goog.global.<tr><td><a id="l2184"></a><a href="#l2184">2184</a><td> */<tr><td><a id="l2185"></a><a href="#l2185">2185</a><td>goog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {<tr><td><a id="l2186"></a><a href="#l2186">2186</a><td> goog.exportPath_(publicPath, object, opt_objectToExportTo);<tr><td><a id="l2187"></a><a href="#l2187">2187</a><td>};<tr><td><a id="l2188"></a><a href="#l2188">2188</a><td><tr><td><a id="l2189"></a><a href="#l2189">2189</a><td><tr><td><a id="l2190"></a><a href="#l2190">2190</a><td>/**<tr><td><a id="l2191"></a><a href="#l2191">2191</a><td> * Exports a property unobfuscated into the object&#39;s namespace.<tr><td><a id="l2192"></a><a href="#l2192">2192</a><td> * ex. goog.exportProperty(Foo, &#39;staticFunction&#39;, Foo.staticFunction);<tr><td><a id="l2193"></a><a href="#l2193">2193</a><td> * ex. goog.exportProperty(Foo.prototype, &#39;myMethod&#39;, Foo.prototype.myMethod);<tr><td><a id="l2194"></a><a href="#l2194">2194</a><td> * @param {Object} object Object whose static property is being exported.<tr><td><a id="l2195"></a><a href="#l2195">2195</a><td> * @param {string} publicName Unobfuscated name to export.<tr><td><a id="l2196"></a><a href="#l2196">2196</a><td> * @param {*} symbol Object the name should point to.<tr><td><a id="l2197"></a><a href="#l2197">2197</a><td> */<tr><td><a id="l2198"></a><a href="#l2198">2198</a><td>goog.exportProperty = function(object, publicName, symbol) {<tr><td><a id="l2199"></a><a href="#l2199">2199</a><td> object[publicName] = symbol;<tr><td><a id="l2200"></a><a href="#l2200">2200</a><td>};<tr><td><a id="l2201"></a><a href="#l2201">2201</a><td><tr><td><a id="l2202"></a><a href="#l2202">2202</a><td><tr><td><a id="l2203"></a><a href="#l2203">2203</a><td>/**<tr><td><a id="l2204"></a><a href="#l2204">2204</a><td> * Inherit the prototype methods from one constructor into another.<tr><td><a id="l2205"></a><a href="#l2205">2205</a><td> *<tr><td><a id="l2206"></a><a href="#l2206">2206</a><td> * Usage:<tr><td><a id="l2207"></a><a href="#l2207">2207</a><td> * &lt;pre&gt;<tr><td><a id="l2208"></a><a href="#l2208">2208</a><td> * function ParentClass(a, b) { }<tr><td><a id="l2209"></a><a href="#l2209">2209</a><td> * ParentClass.prototype.foo = function(a) { };<tr><td><a id="l2210"></a><a href="#l2210">2210</a><td> *<tr><td><a id="l2211"></a><a href="#l2211">2211</a><td> * function ChildClass(a, b, c) {<tr><td><a id="l2212"></a><a href="#l2212">2212</a><td> * ChildClass.base(this, &#39;constructor&#39;, a, b);<tr><td><a id="l2213"></a><a href="#l2213">2213</a><td> * }<tr><td><a id="l2214"></a><a href="#l2214">2214</a><td> * goog.inherits(ChildClass, ParentClass);<tr><td><a id="l2215"></a><a href="#l2215">2215</a><td> *<tr><td><a id="l2216"></a><a href="#l2216">2216</a><td> * var child = new ChildClass(&#39;a&#39;, &#39;b&#39;, &#39;see&#39;);<tr><td><a id="l2217"></a><a href="#l2217">2217</a><td> * child.foo(); // This works.<tr><td><a id="l2218"></a><a href="#l2218">2218</a><td> * &lt;/pre&gt;<tr><td><a id="l2219"></a><a href="#l2219">2219</a><td> *<tr><td><a id="l2220"></a><a href="#l2220">2220</a><td> * @param {!Function} childCtor Child class.<tr><td><a id="l2221"></a><a href="#l2221">2221</a><td> * @param {!Function} parentCtor Parent class.<tr><td><a id="l2222"></a><a href="#l2222">2222</a><td> */<tr><td><a id="l2223"></a><a href="#l2223">2223</a><td>goog.inherits = function(childCtor, parentCtor) {<tr><td><a id="l2224"></a><a href="#l2224">2224</a><td> /** @constructor */<tr><td><a id="l2225"></a><a href="#l2225">2225</a><td> function tempCtor() {};<tr><td><a id="l2226"></a><a href="#l2226">2226</a><td> tempCtor.prototype = parentCtor.prototype;<tr><td><a id="l2227"></a><a href="#l2227">2227</a><td> childCtor.superClass_ = parentCtor.prototype;<tr><td><a id="l2228"></a><a href="#l2228">2228</a><td> childCtor.prototype = new tempCtor();<tr><td><a id="l2229"></a><a href="#l2229">2229</a><td> /** @override */<tr><td><a id="l2230"></a><a href="#l2230">2230</a><td> childCtor.prototype.constructor = childCtor;<tr><td><a id="l2231"></a><a href="#l2231">2231</a><td><tr><td><a id="l2232"></a><a href="#l2232">2232</a><td> /**<tr><td><a id="l2233"></a><a href="#l2233">2233</a><td> * Calls superclass constructor/method.<tr><td><a id="l2234"></a><a href="#l2234">2234</a><td> *<tr><td><a id="l2235"></a><a href="#l2235">2235</a><td> * This function is only available if you use goog.inherits to<tr><td><a id="l2236"></a><a href="#l2236">2236</a><td> * express inheritance relationships between classes.<tr><td><a id="l2237"></a><a href="#l2237">2237</a><td> *<tr><td><a id="l2238"></a><a href="#l2238">2238</a><td> * NOTE: This is a replacement for goog.base and for superClass_<tr><td><a id="l2239"></a><a href="#l2239">2239</a><td> * property defined in childCtor.<tr><td><a id="l2240"></a><a href="#l2240">2240</a><td> *<tr><td><a id="l2241"></a><a href="#l2241">2241</a><td> * @param {!Object} me Should always be &quot;this&quot;.<tr><td><a id="l2242"></a><a href="#l2242">2242</a><td> * @param {string} methodName The method name to call. Calling<tr><td><a id="l2243"></a><a href="#l2243">2243</a><td> * superclass constructor can be done with the special string<tr><td><a id="l2244"></a><a href="#l2244">2244</a><td> * &#39;constructor&#39;.<tr><td><a id="l2245"></a><a href="#l2245">2245</a><td> * @param {...*} var_args The arguments to pass to superclass<tr><td><a id="l2246"></a><a href="#l2246">2246</a><td> * method/constructor.<tr><td><a id="l2247"></a><a href="#l2247">2247</a><td> * @return {*} The return value of the superclass method/constructor.<tr><td><a id="l2248"></a><a href="#l2248">2248</a><td> */<tr><td><a id="l2249"></a><a href="#l2249">2249</a><td> childCtor.base = function(me, methodName, var_args) {<tr><td><a id="l2250"></a><a href="#l2250">2250</a><td> // Copying using loop to avoid deop due to passing arguments object to<tr><td><a id="l2251"></a><a href="#l2251">2251</a><td> // function. This is faster in many JS engines as of late 2014.<tr><td><a id="l2252"></a><a href="#l2252">2252</a><td> var args = new Array(arguments.length - 2);<tr><td><a id="l2253"></a><a href="#l2253">2253</a><td> for (var i = 2; i &lt; arguments.length; i++) {<tr><td><a id="l2254"></a><a href="#l2254">2254</a><td> args[i - 2] = arguments[i];<tr><td><a id="l2255"></a><a href="#l2255">2255</a><td> }<tr><td><a id="l2256"></a><a href="#l2256">2256</a><td> return parentCtor.prototype[methodName].apply(me, args);<tr><td><a id="l2257"></a><a href="#l2257">2257</a><td> };<tr><td><a id="l2258"></a><a href="#l2258">2258</a><td>};<tr><td><a id="l2259"></a><a href="#l2259">2259</a><td><tr><td><a id="l2260"></a><a href="#l2260">2260</a><td><tr><td><a id="l2261"></a><a href="#l2261">2261</a><td>/**<tr><td><a id="l2262"></a><a href="#l2262">2262</a><td> * Call up to the superclass.<tr><td><a id="l2263"></a><a href="#l2263">2263</a><td> *<tr><td><a id="l2264"></a><a href="#l2264">2264</a><td> * If this is called from a constructor, then this calls the superclass<tr><td><a id="l2265"></a><a href="#l2265">2265</a><td> * constructor with arguments 1-N.<tr><td><a id="l2266"></a><a href="#l2266">2266</a><td> *<tr><td><a id="l2267"></a><a href="#l2267">2267</a><td> * If this is called from a prototype method, then you must pass the name of the<tr><td><a id="l2268"></a><a href="#l2268">2268</a><td> * method as the second argument to this function. If you do not, you will get a<tr><td><a id="l2269"></a><a href="#l2269">2269</a><td> * runtime error. This calls the superclass&#39; method with arguments 2-N.<tr><td><a id="l2270"></a><a href="#l2270">2270</a><td> *<tr><td><a id="l2271"></a><a href="#l2271">2271</a><td> * This function only works if you use goog.inherits to express inheritance<tr><td><a id="l2272"></a><a href="#l2272">2272</a><td> * relationships between your classes.<tr><td><a id="l2273"></a><a href="#l2273">2273</a><td> *<tr><td><a id="l2274"></a><a href="#l2274">2274</a><td> * This function is a compiler primitive. At compile-time, the compiler will do<tr><td><a id="l2275"></a><a href="#l2275">2275</a><td> * macro expansion to remove a lot of the extra overhead that this function<tr><td><a id="l2276"></a><a href="#l2276">2276</a><td> * introduces. The compiler will also enforce a lot of the assumptions that this<tr><td><a id="l2277"></a><a href="#l2277">2277</a><td> * function makes, and treat it as a compiler error if you break them.<tr><td><a id="l2278"></a><a href="#l2278">2278</a><td> *<tr><td><a id="l2279"></a><a href="#l2279">2279</a><td> * @param {!Object} me Should always be &quot;this&quot;.<tr><td><a id="l2280"></a><a href="#l2280">2280</a><td> * @param {*=} opt_methodName The method name if calling a super method.<tr><td><a id="l2281"></a><a href="#l2281">2281</a><td> * @param {...*} var_args The rest of the arguments.<tr><td><a id="l2282"></a><a href="#l2282">2282</a><td> * @return {*} The return value of the superclass method.<tr><td><a id="l2283"></a><a href="#l2283">2283</a><td> * @suppress {es5Strict} This method can not be used in strict mode, but<tr><td><a id="l2284"></a><a href="#l2284">2284</a><td> * all Closure Library consumers must depend on this file.<tr><td><a id="l2285"></a><a href="#l2285">2285</a><td> */<tr><td><a id="l2286"></a><a href="#l2286">2286</a><td>goog.base = function(me, opt_methodName, var_args) {<tr><td><a id="l2287"></a><a href="#l2287">2287</a><td> var caller = arguments.callee.caller;<tr><td><a id="l2288"></a><a href="#l2288">2288</a><td><tr><td><a id="l2289"></a><a href="#l2289">2289</a><td> if (goog.STRICT_MODE_COMPATIBLE || (goog.DEBUG &amp;&amp; !caller)) {<tr><td><a id="l2290"></a><a href="#l2290">2290</a><td> throw Error(&#39;arguments.caller not defined. goog.base() cannot be used &#39; +<tr><td><a id="l2291"></a><a href="#l2291">2291</a><td> &#39;with strict mode code. See &#39; +<tr><td><a id="l2292"></a><a href="#l2292">2292</a><td> &#39;http://www.ecma-international.org/ecma-262/5.1/#sec-C&#39;);<tr><td><a id="l2293"></a><a href="#l2293">2293</a><td> }<tr><td><a id="l2294"></a><a href="#l2294">2294</a><td><tr><td><a id="l2295"></a><a href="#l2295">2295</a><td> if (caller.superClass_) {<tr><td><a id="l2296"></a><a href="#l2296">2296</a><td> // Copying using loop to avoid deop due to passing arguments object to<tr><td><a id="l2297"></a><a href="#l2297">2297</a><td> // function. This is faster in many JS engines as of late 2014.<tr><td><a id="l2298"></a><a href="#l2298">2298</a><td> var ctorArgs = new Array(arguments.length - 1);<tr><td><a id="l2299"></a><a href="#l2299">2299</a><td> for (var i = 1; i &lt; arguments.length; i++) {<tr><td><a id="l2300"></a><a href="#l2300">2300</a><td> ctorArgs[i - 1] = arguments[i];<tr><td><a id="l2301"></a><a href="#l2301">2301</a><td> }<tr><td><a id="l2302"></a><a href="#l2302">2302</a><td> // This is a constructor. Call the superclass constructor.<tr><td><a id="l2303"></a><a href="#l2303">2303</a><td> return caller.superClass_.constructor.apply(me, ctorArgs);<tr><td><a id="l2304"></a><a href="#l2304">2304</a><td> }<tr><td><a id="l2305"></a><a href="#l2305">2305</a><td><tr><td><a id="l2306"></a><a href="#l2306">2306</a><td> // Copying using loop to avoid deop due to passing arguments object to<tr><td><a id="l2307"></a><a href="#l2307">2307</a><td> // function. This is faster in many JS engines as of late 2014.<tr><td><a id="l2308"></a><a href="#l2308">2308</a><td> var args = new Array(arguments.length - 2);<tr><td><a id="l2309"></a><a href="#l2309">2309</a><td> for (var i = 2; i &lt; arguments.length; i++) {<tr><td><a id="l2310"></a><a href="#l2310">2310</a><td> args[i - 2] = arguments[i];<tr><td><a id="l2311"></a><a href="#l2311">2311</a><td> }<tr><td><a id="l2312"></a><a href="#l2312">2312</a><td> var foundCaller = false;<tr><td><a id="l2313"></a><a href="#l2313">2313</a><td> for (var ctor = me.constructor;<tr><td><a id="l2314"></a><a href="#l2314">2314</a><td> ctor; ctor = ctor.superClass_ &amp;&amp; ctor.superClass_.constructor) {<tr><td><a id="l2315"></a><a href="#l2315">2315</a><td> if (ctor.prototype[opt_methodName] === caller) {<tr><td><a id="l2316"></a><a href="#l2316">2316</a><td> foundCaller = true;<tr><td><a id="l2317"></a><a href="#l2317">2317</a><td> } else if (foundCaller) {<tr><td><a id="l2318"></a><a href="#l2318">2318</a><td> return ctor.prototype[opt_methodName].apply(me, args);<tr><td><a id="l2319"></a><a href="#l2319">2319</a><td> }<tr><td><a id="l2320"></a><a href="#l2320">2320</a><td> }<tr><td><a id="l2321"></a><a href="#l2321">2321</a><td><tr><td><a id="l2322"></a><a href="#l2322">2322</a><td> // If we did not find the caller in the prototype chain, then one of two<tr><td><a id="l2323"></a><a href="#l2323">2323</a><td> // things happened:<tr><td><a id="l2324"></a><a href="#l2324">2324</a><td> // 1) The caller is an instance method.<tr><td><a id="l2325"></a><a href="#l2325">2325</a><td> // 2) This method was not called by the right caller.<tr><td><a id="l2326"></a><a href="#l2326">2326</a><td> if (me[opt_methodName] === caller) {<tr><td><a id="l2327"></a><a href="#l2327">2327</a><td> return me.constructor.prototype[opt_methodName].apply(me, args);<tr><td><a id="l2328"></a><a href="#l2328">2328</a><td> } else {<tr><td><a id="l2329"></a><a href="#l2329">2329</a><td> throw Error(<tr><td><a id="l2330"></a><a href="#l2330">2330</a><td> &#39;goog.base called from a method of one name &#39; +<tr><td><a id="l2331"></a><a href="#l2331">2331</a><td> &#39;to a method of a different name&#39;);<tr><td><a id="l2332"></a><a href="#l2332">2332</a><td> }<tr><td><a id="l2333"></a><a href="#l2333">2333</a><td>};<tr><td><a id="l2334"></a><a href="#l2334">2334</a><td><tr><td><a id="l2335"></a><a href="#l2335">2335</a><td><tr><td><a id="l2336"></a><a href="#l2336">2336</a><td>/**<tr><td><a id="l2337"></a><a href="#l2337">2337</a><td> * Allow for aliasing within scope functions. This function exists for<tr><td><a id="l2338"></a><a href="#l2338">2338</a><td> * uncompiled code - in compiled code the calls will be inlined and the aliases<tr><td><a id="l2339"></a><a href="#l2339">2339</a><td> * applied. In uncompiled code the function is simply run since the aliases as<tr><td><a id="l2340"></a><a href="#l2340">2340</a><td> * written are valid JavaScript.<tr><td><a id="l2341"></a><a href="#l2341">2341</a><td> *<tr><td><a id="l2342"></a><a href="#l2342">2342</a><td> *<tr><td><a id="l2343"></a><a href="#l2343">2343</a><td> * @param {function()} fn Function to call. This function can contain aliases<tr><td><a id="l2344"></a><a href="#l2344">2344</a><td> * to namespaces (e.g. &quot;var dom = goog.dom&quot;) or classes<tr><td><a id="l2345"></a><a href="#l2345">2345</a><td> * (e.g. &quot;var Timer = goog.Timer&quot;).<tr><td><a id="l2346"></a><a href="#l2346">2346</a><td> */<tr><td><a id="l2347"></a><a href="#l2347">2347</a><td>goog.scope = function(fn) {<tr><td><a id="l2348"></a><a href="#l2348">2348</a><td> fn.call(goog.global);<tr><td><a id="l2349"></a><a href="#l2349">2349</a><td>};<tr><td><a id="l2350"></a><a href="#l2350">2350</a><td><tr><td><a id="l2351"></a><a href="#l2351">2351</a><td><tr><td><a id="l2352"></a><a href="#l2352">2352</a><td>/*<tr><td><a id="l2353"></a><a href="#l2353">2353</a><td> * To support uncompiled, strict mode bundles that use eval to divide source<tr><td><a id="l2354"></a><a href="#l2354">2354</a><td> * like so:<tr><td><a id="l2355"></a><a href="#l2355">2355</a><td> * eval(&#39;someSource;//# sourceUrl sourcefile.js&#39;);<tr><td><a id="l2356"></a><a href="#l2356">2356</a><td> * We need to export the globally defined symbols &quot;goog&quot; and &quot;COMPILED&quot;.<tr><td><a id="l2357"></a><a href="#l2357">2357</a><td> * Exporting &quot;goog&quot; breaks the compiler optimizations, so we required that<tr><td><a id="l2358"></a><a href="#l2358">2358</a><td> * be defined externally.<tr><td><a id="l2359"></a><a href="#l2359">2359</a><td> * NOTE: We don&#39;t use goog.exportSymbol here because we don&#39;t want to trigger<tr><td><a id="l2360"></a><a href="#l2360">2360</a><td> * extern generation when that compiler option is enabled.<tr><td><a id="l2361"></a><a href="#l2361">2361</a><td> */<tr><td><a id="l2362"></a><a href="#l2362">2362</a><td>if (!COMPILED) {<tr><td><a id="l2363"></a><a href="#l2363">2363</a><td> goog.global[&#39;COMPILED&#39;] = COMPILED;<tr><td><a id="l2364"></a><a href="#l2364">2364</a><td>}<tr><td><a id="l2365"></a><a href="#l2365">2365</a><td><tr><td><a id="l2366"></a><a href="#l2366">2366</a><td><tr><td><a id="l2367"></a><a href="#l2367">2367</a><td>//==============================================================================<tr><td><a id="l2368"></a><a href="#l2368">2368</a><td>// goog.defineClass implementation<tr><td><a id="l2369"></a><a href="#l2369">2369</a><td>//==============================================================================<tr><td><a id="l2370"></a><a href="#l2370">2370</a><td><tr><td><a id="l2371"></a><a href="#l2371">2371</a><td><tr><td><a id="l2372"></a><a href="#l2372">2372</a><td>/**<tr><td><a id="l2373"></a><a href="#l2373">2373</a><td> * Creates a restricted form of a Closure &quot;class&quot;:<tr><td><a id="l2374"></a><a href="#l2374">2374</a><td> * - from the compiler&#39;s perspective, the instance returned from the<tr><td><a id="l2375"></a><a href="#l2375">2375</a><td> * constructor is sealed (no new properties may be added). This enables<tr><td><a id="l2376"></a><a href="#l2376">2376</a><td> * better checks.<tr><td><a id="l2377"></a><a href="#l2377">2377</a><td> * - the compiler will rewrite this definition to a form that is optimal<tr><td><a id="l2378"></a><a href="#l2378">2378</a><td> * for type checking and optimization (initially this will be a more<tr><td><a id="l2379"></a><a href="#l2379">2379</a><td> * traditional form).<tr><td><a id="l2380"></a><a href="#l2380">2380</a><td> *<tr><td><a id="l2381"></a><a href="#l2381">2381</a><td> * @param {Function} superClass The superclass, Object or null.<tr><td><a id="l2382"></a><a href="#l2382">2382</a><td> * @param {goog.defineClass.ClassDescriptor} def<tr><td><a id="l2383"></a><a href="#l2383">2383</a><td> * An object literal describing<tr><td><a id="l2384"></a><a href="#l2384">2384</a><td> * the class. It may have the following properties:<tr><td><a id="l2385"></a><a href="#l2385">2385</a><td> * &quot;constructor&quot;: the constructor function<tr><td><a id="l2386"></a><a href="#l2386">2386</a><td> * &quot;statics&quot;: an object literal containing methods to add to the constructor<tr><td><a id="l2387"></a><a href="#l2387">2387</a><td> * as &quot;static&quot; methods or a function that will receive the constructor<tr><td><a id="l2388"></a><a href="#l2388">2388</a><td> * function as its only parameter to which static properties can<tr><td><a id="l2389"></a><a href="#l2389">2389</a><td> * be added.<tr><td><a id="l2390"></a><a href="#l2390">2390</a><td> * all other properties are added to the prototype.<tr><td><a id="l2391"></a><a href="#l2391">2391</a><td> * @return {!Function} The class constructor.<tr><td><a id="l2392"></a><a href="#l2392">2392</a><td> */<tr><td><a id="l2393"></a><a href="#l2393">2393</a><td>goog.defineClass = function(superClass, def) {<tr><td><a id="l2394"></a><a href="#l2394">2394</a><td> // TODO(johnlenz): consider making the superClass an optional parameter.<tr><td><a id="l2395"></a><a href="#l2395">2395</a><td> var constructor = def.constructor;<tr><td><a id="l2396"></a><a href="#l2396">2396</a><td> var statics = def.statics;<tr><td><a id="l2397"></a><a href="#l2397">2397</a><td> // Wrap the constructor prior to setting up the prototype and static methods.<tr><td><a id="l2398"></a><a href="#l2398">2398</a><td> if (!constructor || constructor == Object.prototype.constructor) {<tr><td><a id="l2399"></a><a href="#l2399">2399</a><td> constructor = function() {<tr><td><a id="l2400"></a><a href="#l2400">2400</a><td> throw Error(&#39;cannot instantiate an interface (no constructor defined).&#39;);<tr><td><a id="l2401"></a><a href="#l2401">2401</a><td> };<tr><td><a id="l2402"></a><a href="#l2402">2402</a><td> }<tr><td><a id="l2403"></a><a href="#l2403">2403</a><td><tr><td><a id="l2404"></a><a href="#l2404">2404</a><td> var cls = goog.defineClass.createSealingConstructor_(constructor, superClass);<tr><td><a id="l2405"></a><a href="#l2405">2405</a><td> if (superClass) {<tr><td><a id="l2406"></a><a href="#l2406">2406</a><td> goog.inherits(cls, superClass);<tr><td><a id="l2407"></a><a href="#l2407">2407</a><td> }<tr><td><a id="l2408"></a><a href="#l2408">2408</a><td><tr><td><a id="l2409"></a><a href="#l2409">2409</a><td> // Remove all the properties that should not be copied to the prototype.<tr><td><a id="l2410"></a><a href="#l2410">2410</a><td> delete def.constructor;<tr><td><a id="l2411"></a><a href="#l2411">2411</a><td> delete def.statics;<tr><td><a id="l2412"></a><a href="#l2412">2412</a><td><tr><td><a id="l2413"></a><a href="#l2413">2413</a><td> goog.defineClass.applyProperties_(cls.prototype, def);<tr><td><a id="l2414"></a><a href="#l2414">2414</a><td> if (statics != null) {<tr><td><a id="l2415"></a><a href="#l2415">2415</a><td> if (statics instanceof Function) {<tr><td><a id="l2416"></a><a href="#l2416">2416</a><td> statics(cls);<tr><td><a id="l2417"></a><a href="#l2417">2417</a><td> } else {<tr><td><a id="l2418"></a><a href="#l2418">2418</a><td> goog.defineClass.applyProperties_(cls, statics);<tr><td><a id="l2419"></a><a href="#l2419">2419</a><td> }<tr><td><a id="l2420"></a><a href="#l2420">2420</a><td> }<tr><td><a id="l2421"></a><a href="#l2421">2421</a><td><tr><td><a id="l2422"></a><a href="#l2422">2422</a><td> return cls;<tr><td><a id="l2423"></a><a href="#l2423">2423</a><td>};<tr><td><a id="l2424"></a><a href="#l2424">2424</a><td><tr><td><a id="l2425"></a><a href="#l2425">2425</a><td><tr><td><a id="l2426"></a><a href="#l2426">2426</a><td>/**<tr><td><a id="l2427"></a><a href="#l2427">2427</a><td> * @typedef {<tr><td><a id="l2428"></a><a href="#l2428">2428</a><td> * !Object|<tr><td><a id="l2429"></a><a href="#l2429">2429</a><td> * {constructor:!Function}|<tr><td><a id="l2430"></a><a href="#l2430">2430</a><td> * {constructor:!Function, statics:(Object|function(Function):void)}}<tr><td><a id="l2431"></a><a href="#l2431">2431</a><td> * @suppress {missingProvide}<tr><td><a id="l2432"></a><a href="#l2432">2432</a><td> */<tr><td><a id="l2433"></a><a href="#l2433">2433</a><td>goog.defineClass.ClassDescriptor;<tr><td><a id="l2434"></a><a href="#l2434">2434</a><td><tr><td><a id="l2435"></a><a href="#l2435">2435</a><td><tr><td><a id="l2436"></a><a href="#l2436">2436</a><td>/**<tr><td><a id="l2437"></a><a href="#l2437">2437</a><td> * @define {boolean} Whether the instances returned by<tr><td><a id="l2438"></a><a href="#l2438">2438</a><td> * goog.defineClass should be sealed when possible.<tr><td><a id="l2439"></a><a href="#l2439">2439</a><td> */<tr><td><a id="l2440"></a><a href="#l2440">2440</a><td>goog.define(&#39;goog.defineClass.SEAL_CLASS_INSTANCES&#39;, goog.DEBUG);<tr><td><a id="l2441"></a><a href="#l2441">2441</a><td><tr><td><a id="l2442"></a><a href="#l2442">2442</a><td><tr><td><a id="l2443"></a><a href="#l2443">2443</a><td>/**<tr><td><a id="l2444"></a><a href="#l2444">2444</a><td> * If goog.defineClass.SEAL_CLASS_INSTANCES is enabled and Object.seal is<tr><td><a id="l2445"></a><a href="#l2445">2445</a><td> * defined, this function will wrap the constructor in a function that seals the<tr><td><a id="l2446"></a><a href="#l2446">2446</a><td> * results of the provided constructor function.<tr><td><a id="l2447"></a><a href="#l2447">2447</a><td> *<tr><td><a id="l2448"></a><a href="#l2448">2448</a><td> * @param {!Function} ctr The constructor whose results maybe be sealed.<tr><td><a id="l2449"></a><a href="#l2449">2449</a><td> * @param {Function} superClass The superclass constructor.<tr><td><a id="l2450"></a><a href="#l2450">2450</a><td> * @return {!Function} The replacement constructor.<tr><td><a id="l2451"></a><a href="#l2451">2451</a><td> * @private<tr><td><a id="l2452"></a><a href="#l2452">2452</a><td> */<tr><td><a id="l2453"></a><a href="#l2453">2453</a><td>goog.defineClass.createSealingConstructor_ = function(ctr, superClass) {<tr><td><a id="l2454"></a><a href="#l2454">2454</a><td> if (goog.defineClass.SEAL_CLASS_INSTANCES &amp;&amp;<tr><td><a id="l2455"></a><a href="#l2455">2455</a><td> Object.seal instanceof Function) {<tr><td><a id="l2456"></a><a href="#l2456">2456</a><td> // Don&#39;t seal subclasses of unsealable-tagged legacy classes.<tr><td><a id="l2457"></a><a href="#l2457">2457</a><td> if (superClass &amp;&amp; superClass.prototype &amp;&amp;<tr><td><a id="l2458"></a><a href="#l2458">2458</a><td> superClass.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_]) {<tr><td><a id="l2459"></a><a href="#l2459">2459</a><td> return ctr;<tr><td><a id="l2460"></a><a href="#l2460">2460</a><td> }<tr><td><a id="l2461"></a><a href="#l2461">2461</a><td> /**<tr><td><a id="l2462"></a><a href="#l2462">2462</a><td> * @this {Object}<tr><td><a id="l2463"></a><a href="#l2463">2463</a><td> * @return {?}<tr><td><a id="l2464"></a><a href="#l2464">2464</a><td> */<tr><td><a id="l2465"></a><a href="#l2465">2465</a><td> var wrappedCtr = function() {<tr><td><a id="l2466"></a><a href="#l2466">2466</a><td> // Don&#39;t seal an instance of a subclass when it calls the constructor of<tr><td><a id="l2467"></a><a href="#l2467">2467</a><td> // its super class as there is most likely still setup to do.<tr><td><a id="l2468"></a><a href="#l2468">2468</a><td> var instance = ctr.apply(this, arguments) || this;<tr><td><a id="l2469"></a><a href="#l2469">2469</a><td> instance[goog.UID_PROPERTY_] = instance[goog.UID_PROPERTY_];<tr><td><a id="l2470"></a><a href="#l2470">2470</a><td> if (this.constructor === wrappedCtr) {<tr><td><a id="l2471"></a><a href="#l2471">2471</a><td> Object.seal(instance);<tr><td><a id="l2472"></a><a href="#l2472">2472</a><td> }<tr><td><a id="l2473"></a><a href="#l2473">2473</a><td> return instance;<tr><td><a id="l2474"></a><a href="#l2474">2474</a><td> };<tr><td><a id="l2475"></a><a href="#l2475">2475</a><td> return wrappedCtr;<tr><td><a id="l2476"></a><a href="#l2476">2476</a><td> }<tr><td><a id="l2477"></a><a href="#l2477">2477</a><td> return ctr;<tr><td><a id="l2478"></a><a href="#l2478">2478</a><td>};<tr><td><a id="l2479"></a><a href="#l2479">2479</a><td><tr><td><a id="l2480"></a><a href="#l2480">2480</a><td><tr><td><a id="l2481"></a><a href="#l2481">2481</a><td>// TODO(johnlenz): share these values with the goog.object<tr><td><a id="l2482"></a><a href="#l2482">2482</a><td>/**<tr><td><a id="l2483"></a><a href="#l2483">2483</a><td> * The names of the fields that are defined on Object.prototype.<tr><td><a id="l2484"></a><a href="#l2484">2484</a><td> * @type {!Array&lt;string&gt;}<tr><td><a id="l2485"></a><a href="#l2485">2485</a><td> * @private<tr><td><a id="l2486"></a><a href="#l2486">2486</a><td> * @const<tr><td><a id="l2487"></a><a href="#l2487">2487</a><td> */<tr><td><a id="l2488"></a><a href="#l2488">2488</a><td>goog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = [<tr><td><a id="l2489"></a><a href="#l2489">2489</a><td> &#39;constructor&#39;,<tr><td><a id="l2490"></a><a href="#l2490">2490</a><td> &#39;hasOwnProperty&#39;,<tr><td><a id="l2491"></a><a href="#l2491">2491</a><td> &#39;isPrototypeOf&#39;,<tr><td><a id="l2492"></a><a href="#l2492">2492</a><td> &#39;propertyIsEnumerable&#39;,<tr><td><a id="l2493"></a><a href="#l2493">2493</a><td> &#39;toLocaleString&#39;,<tr><td><a id="l2494"></a><a href="#l2494">2494</a><td> &#39;toString&#39;,<tr><td><a id="l2495"></a><a href="#l2495">2495</a><td> &#39;valueOf&#39;<tr><td><a id="l2496"></a><a href="#l2496">2496</a><td>];<tr><td><a id="l2497"></a><a href="#l2497">2497</a><td><tr><td><a id="l2498"></a><a href="#l2498">2498</a><td><tr><td><a id="l2499"></a><a href="#l2499">2499</a><td>// TODO(johnlenz): share this function with the goog.object<tr><td><a id="l2500"></a><a href="#l2500">2500</a><td>/**<tr><td><a id="l2501"></a><a href="#l2501">2501</a><td> * @param {!Object} target The object to add properties to.<tr><td><a id="l2502"></a><a href="#l2502">2502</a><td> * @param {!Object} source The object to copy properties from.<tr><td><a id="l2503"></a><a href="#l2503">2503</a><td> * @private<tr><td><a id="l2504"></a><a href="#l2504">2504</a><td> */<tr><td><a id="l2505"></a><a href="#l2505">2505</a><td>goog.defineClass.applyProperties_ = function(target, source) {<tr><td><a id="l2506"></a><a href="#l2506">2506</a><td> // TODO(johnlenz): update this to support ES5 getters/setters<tr><td><a id="l2507"></a><a href="#l2507">2507</a><td><tr><td><a id="l2508"></a><a href="#l2508">2508</a><td> var key;<tr><td><a id="l2509"></a><a href="#l2509">2509</a><td> for (key in source) {<tr><td><a id="l2510"></a><a href="#l2510">2510</a><td> if (Object.prototype.hasOwnProperty.call(source, key)) {<tr><td><a id="l2511"></a><a href="#l2511">2511</a><td> target[key] = source[key];<tr><td><a id="l2512"></a><a href="#l2512">2512</a><td> }<tr><td><a id="l2513"></a><a href="#l2513">2513</a><td> }<tr><td><a id="l2514"></a><a href="#l2514">2514</a><td><tr><td><a id="l2515"></a><a href="#l2515">2515</a><td> // For IE the for-in-loop does not contain any properties that are not<tr><td><a id="l2516"></a><a href="#l2516">2516</a><td> // enumerable on the prototype object (for example isPrototypeOf from<tr><td><a id="l2517"></a><a href="#l2517">2517</a><td> // Object.prototype) and it will also not include &#39;replace&#39; on objects that<tr><td><a id="l2518"></a><a href="#l2518">2518</a><td> // extend String and change &#39;replace&#39; (not that it is common for anyone to<tr><td><a id="l2519"></a><a href="#l2519">2519</a><td> // extend anything except Object).<tr><td><a id="l2520"></a><a href="#l2520">2520</a><td> for (var i = 0; i &lt; goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; i++) {<tr><td><a id="l2521"></a><a href="#l2521">2521</a><td> key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i];<tr><td><a id="l2522"></a><a href="#l2522">2522</a><td> if (Object.prototype.hasOwnProperty.call(source, key)) {<tr><td><a id="l2523"></a><a href="#l2523">2523</a><td> target[key] = source[key];<tr><td><a id="l2524"></a><a href="#l2524">2524</a><td> }<tr><td><a id="l2525"></a><a href="#l2525">2525</a><td> }<tr><td><a id="l2526"></a><a href="#l2526">2526</a><td>};<tr><td><a id="l2527"></a><a href="#l2527">2527</a><td><tr><td><a id="l2528"></a><a href="#l2528">2528</a><td><tr><td><a id="l2529"></a><a href="#l2529">2529</a><td>/**<tr><td><a id="l2530"></a><a href="#l2530">2530</a><td> * Sealing classes breaks the older idiom of assigning properties on the<tr><td><a id="l2531"></a><a href="#l2531">2531</a><td> * prototype rather than in the constructor. As such, goog.defineClass<tr><td><a id="l2532"></a><a href="#l2532">2532</a><td> * must not seal subclasses of these old-style classes until they are fixed.<tr><td><a id="l2533"></a><a href="#l2533">2533</a><td> * Until then, this marks a class as &quot;broken&quot;, instructing defineClass<tr><td><a id="l2534"></a><a href="#l2534">2534</a><td> * not to seal subclasses.<tr><td><a id="l2535"></a><a href="#l2535">2535</a><td> * @param {!Function} ctr The legacy constructor to tag as unsealable.<tr><td><a id="l2536"></a><a href="#l2536">2536</a><td> */<tr><td><a id="l2537"></a><a href="#l2537">2537</a><td>goog.tagUnsealableClass = function(ctr) {<tr><td><a id="l2538"></a><a href="#l2538">2538</a><td> if (!COMPILED &amp;&amp; goog.defineClass.SEAL_CLASS_INSTANCES) {<tr><td><a id="l2539"></a><a href="#l2539">2539</a><td> ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_] = true;<tr><td><a id="l2540"></a><a href="#l2540">2540</a><td> }<tr><td><a id="l2541"></a><a href="#l2541">2541</a><td>};<tr><td><a id="l2542"></a><a href="#l2542">2542</a><td><tr><td><a id="l2543"></a><a href="#l2543">2543</a><td><tr><td><a id="l2544"></a><a href="#l2544">2544</a><td>/**<tr><td><a id="l2545"></a><a href="#l2545">2545</a><td> * Name for unsealable tag property.<tr><td><a id="l2546"></a><a href="#l2546">2546</a><td> * @const @private {string}<tr><td><a id="l2547"></a><a href="#l2547">2547</a><td> */<tr><td><a id="l2548"></a><a href="#l2548">2548</a><td>goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = &#39;goog_defineClass_legacy_unsealable&#39;;</table></div></article><nav><h3><a href="../../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../../types.js"></script><script src="../../../dossier.js"></script>