closure 1.1.692

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 (1494) hide show
  1. data/.gitignore +6 -0
  2. data/.yardopts +3 -0
  3. data/LICENSE +202 -0
  4. data/README.md +26 -0
  5. data/beanshell/LICENSE +12 -0
  6. data/beanshell/bsh-core-2.0b4.jar +0 -0
  7. data/closure-compiler/COPYING +202 -0
  8. data/closure-compiler/README +278 -0
  9. data/closure-compiler/compiler.jar +0 -0
  10. data/closure-library/AUTHORS +12 -0
  11. data/closure-library/LICENSE +176 -0
  12. data/closure-library/README +6 -0
  13. data/closure-library/all_tests.html +113 -0
  14. data/closure-library/alltests.js +16 -0
  15. data/closure-library/closure/bin/build/closurebuilder.py +257 -0
  16. data/closure-library/closure/bin/build/depstree.py +186 -0
  17. data/closure-library/closure/bin/build/depstree_test.py +127 -0
  18. data/closure-library/closure/bin/build/depswriter.py +197 -0
  19. data/closure-library/closure/bin/build/jscompiler.py +69 -0
  20. data/closure-library/closure/bin/build/source.py +86 -0
  21. data/closure-library/closure/bin/build/source_test.py +57 -0
  22. data/closure-library/closure/bin/build/treescan.py +78 -0
  23. data/closure-library/closure/bin/calcdeps.py +570 -0
  24. data/closure-library/closure/bin/scopify.py +211 -0
  25. data/closure-library/closure/css/inlay/g-base.css +82 -0
  26. data/closure-library/closure/css/inlay/g-fixed.css +158 -0
  27. data/closure-library/closure/css/inlay/g-ratio.css +253 -0
  28. data/closure-library/closure/goog/array/array.js +1300 -0
  29. data/closure-library/closure/goog/array/array_test.html +1524 -0
  30. data/closure-library/closure/goog/asserts/asserts.js +277 -0
  31. data/closure-library/closure/goog/asserts/asserts_test.html +163 -0
  32. data/closure-library/closure/goog/async/conditionaldelay.js +238 -0
  33. data/closure-library/closure/goog/async/conditionaldelay_test.html +227 -0
  34. data/closure-library/closure/goog/async/delay.js +174 -0
  35. data/closure-library/closure/goog/async/delay_test.html +148 -0
  36. data/closure-library/closure/goog/async/throttle.js +189 -0
  37. data/closure-library/closure/goog/async/throttle_test.html +102 -0
  38. data/closure-library/closure/goog/base.js +1471 -0
  39. data/closure-library/closure/goog/base_test.html +1166 -0
  40. data/closure-library/closure/goog/bootstrap/webworkers.js +37 -0
  41. data/closure-library/closure/goog/color/alpha.js +436 -0
  42. data/closure-library/closure/goog/color/alpha_test.html +234 -0
  43. data/closure-library/closure/goog/color/color.js +757 -0
  44. data/closure-library/closure/goog/color/color_test.html +645 -0
  45. data/closure-library/closure/goog/color/names.js +176 -0
  46. data/closure-library/closure/goog/crypt/arc4.js +141 -0
  47. data/closure-library/closure/goog/crypt/arc4_test.html +42 -0
  48. data/closure-library/closure/goog/crypt/base64.js +267 -0
  49. data/closure-library/closure/goog/crypt/base64_test.html +106 -0
  50. data/closure-library/closure/goog/crypt/basen.js +242 -0
  51. data/closure-library/closure/goog/crypt/basen_test.html +167 -0
  52. data/closure-library/closure/goog/crypt/crypt.js +103 -0
  53. data/closure-library/closure/goog/crypt/crypt_test.html +68 -0
  54. data/closure-library/closure/goog/crypt/hash32.js +184 -0
  55. data/closure-library/closure/goog/crypt/hash32_test.html +287 -0
  56. data/closure-library/closure/goog/crypt/sha1.js +238 -0
  57. data/closure-library/closure/goog/crypt/sha1_test.html +47 -0
  58. data/closure-library/closure/goog/css/autocomplete.css +43 -0
  59. data/closure-library/closure/goog/css/bubble.css +84 -0
  60. data/closure-library/closure/goog/css/button.css +38 -0
  61. data/closure-library/closure/goog/css/charpicker.css +201 -0
  62. data/closure-library/closure/goog/css/checkbox.css +38 -0
  63. data/closure-library/closure/goog/css/colormenubutton.css +25 -0
  64. data/closure-library/closure/goog/css/colorpalette.css +54 -0
  65. data/closure-library/closure/goog/css/colorpicker-simplegrid.css +50 -0
  66. data/closure-library/closure/goog/css/combobox.css +57 -0
  67. data/closure-library/closure/goog/css/common.css +41 -0
  68. data/closure-library/closure/goog/css/css3button.css +77 -0
  69. data/closure-library/closure/goog/css/css3menubutton.css +23 -0
  70. data/closure-library/closure/goog/css/custombutton.css +164 -0
  71. data/closure-library/closure/goog/css/datepicker.css +148 -0
  72. data/closure-library/closure/goog/css/dialog.css +72 -0
  73. data/closure-library/closure/goog/css/dimensionpicker.css +47 -0
  74. data/closure-library/closure/goog/css/dragdropdetector.css +48 -0
  75. data/closure-library/closure/goog/css/editor/bubble.css +73 -0
  76. data/closure-library/closure/goog/css/editor/dialog.css +66 -0
  77. data/closure-library/closure/goog/css/editor/linkdialog.css +36 -0
  78. data/closure-library/closure/goog/css/editortoolbar.css +225 -0
  79. data/closure-library/closure/goog/css/filteredmenu.css +30 -0
  80. data/closure-library/closure/goog/css/filterobservingmenuitem.css +25 -0
  81. data/closure-library/closure/goog/css/flatbutton.css +65 -0
  82. data/closure-library/closure/goog/css/flatmenubutton.css +63 -0
  83. data/closure-library/closure/goog/css/hovercard.css +51 -0
  84. data/closure-library/closure/goog/css/hsvapalette.css +231 -0
  85. data/closure-library/closure/goog/css/hsvpalette.css +179 -0
  86. data/closure-library/closure/goog/css/imagelessbutton.css +160 -0
  87. data/closure-library/closure/goog/css/imagelessmenubutton.css +23 -0
  88. data/closure-library/closure/goog/css/inputdatepicker.css +12 -0
  89. data/closure-library/closure/goog/css/linkbutton.css +26 -0
  90. data/closure-library/closure/goog/css/menu.css +27 -0
  91. data/closure-library/closure/goog/css/menubutton.css +169 -0
  92. data/closure-library/closure/goog/css/menuitem.css +96 -0
  93. data/closure-library/closure/goog/css/menuseparator.css +19 -0
  94. data/closure-library/closure/goog/css/multitestrunner.css +121 -0
  95. data/closure-library/closure/goog/css/offline.css +147 -0
  96. data/closure-library/closure/goog/css/palette.css +36 -0
  97. data/closure-library/closure/goog/css/popupdatepicker.css +17 -0
  98. data/closure-library/closure/goog/css/roundedpanel.css +29 -0
  99. data/closure-library/closure/goog/css/roundedtab.css +158 -0
  100. data/closure-library/closure/goog/css/submenu.css +28 -0
  101. data/closure-library/closure/goog/css/tab.css +91 -0
  102. data/closure-library/closure/goog/css/tabbar.css +52 -0
  103. data/closure-library/closure/goog/css/tablesorter.css +14 -0
  104. data/closure-library/closure/goog/css/toolbar.css +400 -0
  105. data/closure-library/closure/goog/css/tooltip.css +14 -0
  106. data/closure-library/closure/goog/css/tree.css +147 -0
  107. data/closure-library/closure/goog/css/tristatemenuitem.css +43 -0
  108. data/closure-library/closure/goog/cssom/cssom.js +447 -0
  109. data/closure-library/closure/goog/cssom/cssom_test.html +343 -0
  110. data/closure-library/closure/goog/cssom/cssom_test_import_1.css +11 -0
  111. data/closure-library/closure/goog/cssom/cssom_test_import_2.css +10 -0
  112. data/closure-library/closure/goog/cssom/cssom_test_link_1.css +10 -0
  113. data/closure-library/closure/goog/cssom/iframe/style.js +1020 -0
  114. data/closure-library/closure/goog/cssom/iframe/style_test.html +391 -0
  115. data/closure-library/closure/goog/cssom/iframe/style_test_import.css +10 -0
  116. data/closure-library/closure/goog/datasource/datamanager.js +566 -0
  117. data/closure-library/closure/goog/datasource/datasource.js +646 -0
  118. data/closure-library/closure/goog/datasource/datasource_test.html +265 -0
  119. data/closure-library/closure/goog/datasource/expr.js +544 -0
  120. data/closure-library/closure/goog/datasource/expr_test.html +97 -0
  121. data/closure-library/closure/goog/datasource/fastdatanode.js +792 -0
  122. data/closure-library/closure/goog/datasource/fastdatanode_test.html +254 -0
  123. data/closure-library/closure/goog/datasource/jsdatasource.js +460 -0
  124. data/closure-library/closure/goog/datasource/jsondatasource.js +146 -0
  125. data/closure-library/closure/goog/datasource/jsxmlhttpdatasource.js +191 -0
  126. data/closure-library/closure/goog/datasource/jsxmlhttpdatasource_test.html +94 -0
  127. data/closure-library/closure/goog/datasource/xmldatasource.js +407 -0
  128. data/closure-library/closure/goog/date/date.js +1642 -0
  129. data/closure-library/closure/goog/date/date_test.html +1293 -0
  130. data/closure-library/closure/goog/date/datelike.js +27 -0
  131. data/closure-library/closure/goog/date/daterange.js +398 -0
  132. data/closure-library/closure/goog/date/daterange_test.html +213 -0
  133. data/closure-library/closure/goog/date/relative.js +425 -0
  134. data/closure-library/closure/goog/date/relative_test.html +124 -0
  135. data/closure-library/closure/goog/date/utcdatetime.js +178 -0
  136. data/closure-library/closure/goog/date/utcdatetime_test.html +119 -0
  137. data/closure-library/closure/goog/debug/console.js +138 -0
  138. data/closure-library/closure/goog/debug/debug.js +452 -0
  139. data/closure-library/closure/goog/debug/debug_test.html +32 -0
  140. data/closure-library/closure/goog/debug/debugwindow.js +582 -0
  141. data/closure-library/closure/goog/debug/devcss/devcss.js +435 -0
  142. data/closure-library/closure/goog/debug/devcss/devcss_test.html +365 -0
  143. data/closure-library/closure/goog/debug/devcss/devcssrunner.js +26 -0
  144. data/closure-library/closure/goog/debug/divconsole.js +141 -0
  145. data/closure-library/closure/goog/debug/enhanceerror_test.html +138 -0
  146. data/closure-library/closure/goog/debug/entrypointregistry.js +111 -0
  147. data/closure-library/closure/goog/debug/entrypointregistry_test.html +63 -0
  148. data/closure-library/closure/goog/debug/error.js +47 -0
  149. data/closure-library/closure/goog/debug/error_test.html +85 -0
  150. data/closure-library/closure/goog/debug/errorhandler.js +234 -0
  151. data/closure-library/closure/goog/debug/errorhandler_async_test.html +112 -0
  152. data/closure-library/closure/goog/debug/errorhandler_test.html +186 -0
  153. data/closure-library/closure/goog/debug/errorhandlerweakdep.js +38 -0
  154. data/closure-library/closure/goog/debug/errorreporter.js +324 -0
  155. data/closure-library/closure/goog/debug/errorreporter_test.html +289 -0
  156. data/closure-library/closure/goog/debug/fancywindow.js +265 -0
  157. data/closure-library/closure/goog/debug/formatter.js +314 -0
  158. data/closure-library/closure/goog/debug/gcdiagnostics.js +143 -0
  159. data/closure-library/closure/goog/debug/logbuffer.js +147 -0
  160. data/closure-library/closure/goog/debug/logbuffer_test.html +105 -0
  161. data/closure-library/closure/goog/debug/logger.js +809 -0
  162. data/closure-library/closure/goog/debug/logger_test.html +208 -0
  163. data/closure-library/closure/goog/debug/logrecord.js +271 -0
  164. data/closure-library/closure/goog/debug/reflect.js +159 -0
  165. data/closure-library/closure/goog/debug/reflect_test.html +81 -0
  166. data/closure-library/closure/goog/debug/relativetimeprovider.js +83 -0
  167. data/closure-library/closure/goog/debug/tracer.js +750 -0
  168. data/closure-library/closure/goog/debug/tracer_test.html +57 -0
  169. data/closure-library/closure/goog/demos/advancedtooltip.html +78 -0
  170. data/closure-library/closure/goog/demos/animationqueue.html +149 -0
  171. data/closure-library/closure/goog/demos/autocomplete-basic.html +56 -0
  172. data/closure-library/closure/goog/demos/autocompleteremote.html +40 -0
  173. data/closure-library/closure/goog/demos/autocompleteremotedata.js +18 -0
  174. data/closure-library/closure/goog/demos/autocompleterichremote.html +137 -0
  175. data/closure-library/closure/goog/demos/autocompleterichremotedata.js +33 -0
  176. data/closure-library/closure/goog/demos/bidiinput.html +72 -0
  177. data/closure-library/closure/goog/demos/bubble.html +250 -0
  178. data/closure-library/closure/goog/demos/button.html +395 -0
  179. data/closure-library/closure/goog/demos/charcounter.html +57 -0
  180. data/closure-library/closure/goog/demos/charpicker.html +64 -0
  181. data/closure-library/closure/goog/demos/checkbox.html +122 -0
  182. data/closure-library/closure/goog/demos/color-contrast.html +60 -0
  183. data/closure-library/closure/goog/demos/colormenubutton.html +213 -0
  184. data/closure-library/closure/goog/demos/colorpicker.html +43 -0
  185. data/closure-library/closure/goog/demos/combobox.html +125 -0
  186. data/closure-library/closure/goog/demos/container.html +670 -0
  187. data/closure-library/closure/goog/demos/control.html +477 -0
  188. data/closure-library/closure/goog/demos/css/demo.css +75 -0
  189. data/closure-library/closure/goog/demos/css/emojipicker.css +36 -0
  190. data/closure-library/closure/goog/demos/css/emojisprite.css +92 -0
  191. data/closure-library/closure/goog/demos/css3button.html +166 -0
  192. data/closure-library/closure/goog/demos/css3menubutton.html +285 -0
  193. data/closure-library/closure/goog/demos/cssspriteanimation.html +80 -0
  194. data/closure-library/closure/goog/demos/datepicker.html +183 -0
  195. data/closure-library/closure/goog/demos/debug.html +119 -0
  196. data/closure-library/closure/goog/demos/depsgraph.html +221 -0
  197. data/closure-library/closure/goog/demos/dialog.html +156 -0
  198. data/closure-library/closure/goog/demos/dimensionpicker.html +108 -0
  199. data/closure-library/closure/goog/demos/dimensionpicker_rtl.html +123 -0
  200. data/closure-library/closure/goog/demos/dom_selection.html +88 -0
  201. data/closure-library/closure/goog/demos/drag.html +191 -0
  202. data/closure-library/closure/goog/demos/dragdrop.html +263 -0
  203. data/closure-library/closure/goog/demos/dragdropdetector.html +46 -0
  204. data/closure-library/closure/goog/demos/dragdropdetector_target.html +17 -0
  205. data/closure-library/closure/goog/demos/dragger.html +83 -0
  206. data/closure-library/closure/goog/demos/draglistgroup.html +261 -0
  207. data/closure-library/closure/goog/demos/drilldownrow.html +78 -0
  208. data/closure-library/closure/goog/demos/editor/deps.js +20 -0
  209. data/closure-library/closure/goog/demos/editor/editor.html +139 -0
  210. data/closure-library/closure/goog/demos/editor/field_basic.html +74 -0
  211. data/closure-library/closure/goog/demos/editor/helloworld.html +91 -0
  212. data/closure-library/closure/goog/demos/editor/helloworld.js +81 -0
  213. data/closure-library/closure/goog/demos/editor/helloworld_test.html +75 -0
  214. data/closure-library/closure/goog/demos/editor/helloworlddialog.js +163 -0
  215. data/closure-library/closure/goog/demos/editor/helloworlddialog_test.html +100 -0
  216. data/closure-library/closure/goog/demos/editor/helloworlddialogplugin.js +110 -0
  217. data/closure-library/closure/goog/demos/editor/helloworlddialogplugin_test.html +198 -0
  218. data/closure-library/closure/goog/demos/editor/seamlessfield.html +106 -0
  219. data/closure-library/closure/goog/demos/effects.html +142 -0
  220. data/closure-library/closure/goog/demos/emoji/200.gif +0 -0
  221. data/closure-library/closure/goog/demos/emoji/201.gif +0 -0
  222. data/closure-library/closure/goog/demos/emoji/202.gif +0 -0
  223. data/closure-library/closure/goog/demos/emoji/203.gif +0 -0
  224. data/closure-library/closure/goog/demos/emoji/204.gif +0 -0
  225. data/closure-library/closure/goog/demos/emoji/205.gif +0 -0
  226. data/closure-library/closure/goog/demos/emoji/206.gif +0 -0
  227. data/closure-library/closure/goog/demos/emoji/2BC.gif +0 -0
  228. data/closure-library/closure/goog/demos/emoji/2BD.gif +0 -0
  229. data/closure-library/closure/goog/demos/emoji/2BE.gif +0 -0
  230. data/closure-library/closure/goog/demos/emoji/2BF.gif +0 -0
  231. data/closure-library/closure/goog/demos/emoji/2C0.gif +0 -0
  232. data/closure-library/closure/goog/demos/emoji/2C1.gif +0 -0
  233. data/closure-library/closure/goog/demos/emoji/2C2.gif +0 -0
  234. data/closure-library/closure/goog/demos/emoji/2C3.gif +0 -0
  235. data/closure-library/closure/goog/demos/emoji/2C4.gif +0 -0
  236. data/closure-library/closure/goog/demos/emoji/2C5.gif +0 -0
  237. data/closure-library/closure/goog/demos/emoji/2C6.gif +0 -0
  238. data/closure-library/closure/goog/demos/emoji/2C7.gif +0 -0
  239. data/closure-library/closure/goog/demos/emoji/2C8.gif +0 -0
  240. data/closure-library/closure/goog/demos/emoji/2C9.gif +0 -0
  241. data/closure-library/closure/goog/demos/emoji/2CA.gif +0 -0
  242. data/closure-library/closure/goog/demos/emoji/2CB.gif +0 -0
  243. data/closure-library/closure/goog/demos/emoji/2CC.gif +0 -0
  244. data/closure-library/closure/goog/demos/emoji/2CD.gif +0 -0
  245. data/closure-library/closure/goog/demos/emoji/2CE.gif +0 -0
  246. data/closure-library/closure/goog/demos/emoji/2CF.gif +0 -0
  247. data/closure-library/closure/goog/demos/emoji/2D0.gif +0 -0
  248. data/closure-library/closure/goog/demos/emoji/2D1.gif +0 -0
  249. data/closure-library/closure/goog/demos/emoji/2D2.gif +0 -0
  250. data/closure-library/closure/goog/demos/emoji/2D3.gif +0 -0
  251. data/closure-library/closure/goog/demos/emoji/2D4.gif +0 -0
  252. data/closure-library/closure/goog/demos/emoji/2D5.gif +0 -0
  253. data/closure-library/closure/goog/demos/emoji/2D6.gif +0 -0
  254. data/closure-library/closure/goog/demos/emoji/2D7.gif +0 -0
  255. data/closure-library/closure/goog/demos/emoji/2D8.gif +0 -0
  256. data/closure-library/closure/goog/demos/emoji/2D9.gif +0 -0
  257. data/closure-library/closure/goog/demos/emoji/2DA.gif +0 -0
  258. data/closure-library/closure/goog/demos/emoji/2DB.gif +0 -0
  259. data/closure-library/closure/goog/demos/emoji/2DC.gif +0 -0
  260. data/closure-library/closure/goog/demos/emoji/2DD.gif +0 -0
  261. data/closure-library/closure/goog/demos/emoji/2DE.gif +0 -0
  262. data/closure-library/closure/goog/demos/emoji/2DF.gif +0 -0
  263. data/closure-library/closure/goog/demos/emoji/2E0.gif +0 -0
  264. data/closure-library/closure/goog/demos/emoji/2E1.gif +0 -0
  265. data/closure-library/closure/goog/demos/emoji/2E2.gif +0 -0
  266. data/closure-library/closure/goog/demos/emoji/2E3.gif +0 -0
  267. data/closure-library/closure/goog/demos/emoji/2E4.gif +0 -0
  268. data/closure-library/closure/goog/demos/emoji/2E5.gif +0 -0
  269. data/closure-library/closure/goog/demos/emoji/2E6.gif +0 -0
  270. data/closure-library/closure/goog/demos/emoji/2E7.gif +0 -0
  271. data/closure-library/closure/goog/demos/emoji/2E8.gif +0 -0
  272. data/closure-library/closure/goog/demos/emoji/2E9.gif +0 -0
  273. data/closure-library/closure/goog/demos/emoji/2EA.gif +0 -0
  274. data/closure-library/closure/goog/demos/emoji/2EB.gif +0 -0
  275. data/closure-library/closure/goog/demos/emoji/2EC.gif +0 -0
  276. data/closure-library/closure/goog/demos/emoji/2ED.gif +0 -0
  277. data/closure-library/closure/goog/demos/emoji/2EE.gif +0 -0
  278. data/closure-library/closure/goog/demos/emoji/2EF.gif +0 -0
  279. data/closure-library/closure/goog/demos/emoji/2F0.gif +0 -0
  280. data/closure-library/closure/goog/demos/emoji/2F1.gif +0 -0
  281. data/closure-library/closure/goog/demos/emoji/2F2.gif +0 -0
  282. data/closure-library/closure/goog/demos/emoji/2F3.gif +0 -0
  283. data/closure-library/closure/goog/demos/emoji/2F4.gif +0 -0
  284. data/closure-library/closure/goog/demos/emoji/2F5.gif +0 -0
  285. data/closure-library/closure/goog/demos/emoji/2F6.gif +0 -0
  286. data/closure-library/closure/goog/demos/emoji/2F7.gif +0 -0
  287. data/closure-library/closure/goog/demos/emoji/2F8.gif +0 -0
  288. data/closure-library/closure/goog/demos/emoji/2F9.gif +0 -0
  289. data/closure-library/closure/goog/demos/emoji/2FA.gif +0 -0
  290. data/closure-library/closure/goog/demos/emoji/2FB.gif +0 -0
  291. data/closure-library/closure/goog/demos/emoji/2FC.gif +0 -0
  292. data/closure-library/closure/goog/demos/emoji/2FD.gif +0 -0
  293. data/closure-library/closure/goog/demos/emoji/2FE.gif +0 -0
  294. data/closure-library/closure/goog/demos/emoji/2FF.gif +0 -0
  295. data/closure-library/closure/goog/demos/emoji/none.gif +0 -0
  296. data/closure-library/closure/goog/demos/emoji/sprite.png +0 -0
  297. data/closure-library/closure/goog/demos/emoji/sprite2.png +0 -0
  298. data/closure-library/closure/goog/demos/emoji/unknown.gif +0 -0
  299. data/closure-library/closure/goog/demos/event-propagation.html +192 -0
  300. data/closure-library/closure/goog/demos/events.html +99 -0
  301. data/closure-library/closure/goog/demos/eventtarget.html +70 -0
  302. data/closure-library/closure/goog/demos/filedrophandler.html +63 -0
  303. data/closure-library/closure/goog/demos/filteredmenu.html +118 -0
  304. data/closure-library/closure/goog/demos/focushandler.html +58 -0
  305. data/closure-library/closure/goog/demos/gauge.html +158 -0
  306. data/closure-library/closure/goog/demos/graphics/advancedcoordinates.html +141 -0
  307. data/closure-library/closure/goog/demos/graphics/advancedcoordinates2.html +130 -0
  308. data/closure-library/closure/goog/demos/graphics/basicelements.html +264 -0
  309. data/closure-library/closure/goog/demos/graphics/events.html +113 -0
  310. data/closure-library/closure/goog/demos/graphics/modifyelements.html +195 -0
  311. data/closure-library/closure/goog/demos/graphics/subpixel.html +80 -0
  312. data/closure-library/closure/goog/demos/graphics/tiger.html +105 -0
  313. data/closure-library/closure/goog/demos/graphics/tigerdata.js +2840 -0
  314. data/closure-library/closure/goog/demos/history1.html +132 -0
  315. data/closure-library/closure/goog/demos/history2.html +100 -0
  316. data/closure-library/closure/goog/demos/history3.html +106 -0
  317. data/closure-library/closure/goog/demos/history3js.html +36 -0
  318. data/closure-library/closure/goog/demos/history_blank.html +25 -0
  319. data/closure-library/closure/goog/demos/hovercard.html +177 -0
  320. data/closure-library/closure/goog/demos/hsvapalette.html +55 -0
  321. data/closure-library/closure/goog/demos/hsvpalette.html +56 -0
  322. data/closure-library/closure/goog/demos/html5history.html +87 -0
  323. data/closure-library/closure/goog/demos/imagelessbutton.html +221 -0
  324. data/closure-library/closure/goog/demos/imagelessmenubutton.html +285 -0
  325. data/closure-library/closure/goog/demos/imagelessroundedcorner.html +231 -0
  326. data/closure-library/closure/goog/demos/index.html +19 -0
  327. data/closure-library/closure/goog/demos/index_nav.html +253 -0
  328. data/closure-library/closure/goog/demos/index_splash.html +22 -0
  329. data/closure-library/closure/goog/demos/inline_block_quirks.html +125 -0
  330. data/closure-library/closure/goog/demos/inline_block_standards.html +126 -0
  331. data/closure-library/closure/goog/demos/inputdatepicker.html +60 -0
  332. data/closure-library/closure/goog/demos/inputhandler.html +72 -0
  333. data/closure-library/closure/goog/demos/jsonprettyprinter.html +80 -0
  334. data/closure-library/closure/goog/demos/keyboardshortcuts.html +112 -0
  335. data/closure-library/closure/goog/demos/keyhandler.html +127 -0
  336. data/closure-library/closure/goog/demos/labelinput.html +42 -0
  337. data/closure-library/closure/goog/demos/menu.html +220 -0
  338. data/closure-library/closure/goog/demos/menubutton.html +318 -0
  339. data/closure-library/closure/goog/demos/mousewheelhandler.html +109 -0
  340. data/closure-library/closure/goog/demos/offline.html +268 -0
  341. data/closure-library/closure/goog/demos/onlinehandler.html +77 -0
  342. data/closure-library/closure/goog/demos/palette.html +302 -0
  343. data/closure-library/closure/goog/demos/pastehandler.html +54 -0
  344. data/closure-library/closure/goog/demos/plaintextspellchecker.html +106 -0
  345. data/closure-library/closure/goog/demos/popup.html +200 -0
  346. data/closure-library/closure/goog/demos/popupcolorpicker.html +49 -0
  347. data/closure-library/closure/goog/demos/popupdatepicker.html +53 -0
  348. data/closure-library/closure/goog/demos/popupemojipicker.html +407 -0
  349. data/closure-library/closure/goog/demos/popupmenu.html +89 -0
  350. data/closure-library/closure/goog/demos/progressbar.html +97 -0
  351. data/closure-library/closure/goog/demos/prompt.html +92 -0
  352. data/closure-library/closure/goog/demos/quadtree.html +107 -0
  353. data/closure-library/closure/goog/demos/ratings.html +120 -0
  354. data/closure-library/closure/goog/demos/richtextspellchecker.html +92 -0
  355. data/closure-library/closure/goog/demos/roundedpanel.html +139 -0
  356. data/closure-library/closure/goog/demos/samplecomponent.html +75 -0
  357. data/closure-library/closure/goog/demos/samplecomponent.js +206 -0
  358. data/closure-library/closure/goog/demos/scrollfloater.html +117 -0
  359. data/closure-library/closure/goog/demos/select.html +324 -0
  360. data/closure-library/closure/goog/demos/selectionmenubutton.html +186 -0
  361. data/closure-library/closure/goog/demos/serverchart.html +122 -0
  362. data/closure-library/closure/goog/demos/silverlightclipboardbutton.html +71 -0
  363. data/closure-library/closure/goog/demos/slider.html +110 -0
  364. data/closure-library/closure/goog/demos/splitbehavior.html +164 -0
  365. data/closure-library/closure/goog/demos/splitpane.html +243 -0
  366. data/closure-library/closure/goog/demos/stopevent.html +171 -0
  367. data/closure-library/closure/goog/demos/submenus.html +130 -0
  368. data/closure-library/closure/goog/demos/submenus2.html +150 -0
  369. data/closure-library/closure/goog/demos/tabbar.html +289 -0
  370. data/closure-library/closure/goog/demos/tablesorter.html +116 -0
  371. data/closure-library/closure/goog/demos/tabpane.html +302 -0
  372. data/closure-library/closure/goog/demos/textarea.html +128 -0
  373. data/closure-library/closure/goog/demos/timers.html +291 -0
  374. data/closure-library/closure/goog/demos/toolbar.html +703 -0
  375. data/closure-library/closure/goog/demos/tooltip.html +91 -0
  376. data/closure-library/closure/goog/demos/tracer.html +92 -0
  377. data/closure-library/closure/goog/demos/tree/demo.html +126 -0
  378. data/closure-library/closure/goog/demos/tree/testdata.js +260 -0
  379. data/closure-library/closure/goog/demos/tweakui.html +121 -0
  380. data/closure-library/closure/goog/demos/twothumbslider.html +121 -0
  381. data/closure-library/closure/goog/demos/useragent.html +173 -0
  382. data/closure-library/closure/goog/demos/viewportsizemonitor.html +71 -0
  383. data/closure-library/closure/goog/demos/xpc/blank.html +7 -0
  384. data/closure-library/closure/goog/demos/xpc/index.html +89 -0
  385. data/closure-library/closure/goog/demos/xpc/inner.html +58 -0
  386. data/closure-library/closure/goog/demos/xpc/minimal/blank.html +7 -0
  387. data/closure-library/closure/goog/demos/xpc/minimal/index.html +105 -0
  388. data/closure-library/closure/goog/demos/xpc/minimal/inner.html +75 -0
  389. data/closure-library/closure/goog/demos/xpc/minimal/relay.html +7 -0
  390. data/closure-library/closure/goog/demos/xpc/relay.html +7 -0
  391. data/closure-library/closure/goog/demos/xpc/xpcdemo.js +304 -0
  392. data/closure-library/closure/goog/demos/zippy.html +127 -0
  393. data/closure-library/closure/goog/deps.js +672 -0
  394. data/closure-library/closure/goog/disposable/disposable.js +167 -0
  395. data/closure-library/closure/goog/disposable/disposable_test.html +202 -0
  396. data/closure-library/closure/goog/dom/a11y.js +438 -0
  397. data/closure-library/closure/goog/dom/a11y_test.html +86 -0
  398. data/closure-library/closure/goog/dom/abstractmultirange.js +77 -0
  399. data/closure-library/closure/goog/dom/abstractrange.js +514 -0
  400. data/closure-library/closure/goog/dom/abstractrange_test.html +73 -0
  401. data/closure-library/closure/goog/dom/annotate.js +352 -0
  402. data/closure-library/closure/goog/dom/annotate_test.html +187 -0
  403. data/closure-library/closure/goog/dom/browserfeature.js +50 -0
  404. data/closure-library/closure/goog/dom/browserrange/abstractrange.js +316 -0
  405. data/closure-library/closure/goog/dom/browserrange/browserrange.js +149 -0
  406. data/closure-library/closure/goog/dom/browserrange/browserrange_test.html +562 -0
  407. data/closure-library/closure/goog/dom/browserrange/geckorange.js +82 -0
  408. data/closure-library/closure/goog/dom/browserrange/ierange.js +970 -0
  409. data/closure-library/closure/goog/dom/browserrange/operarange.js +83 -0
  410. data/closure-library/closure/goog/dom/browserrange/w3crange.js +364 -0
  411. data/closure-library/closure/goog/dom/browserrange/webkitrange.js +112 -0
  412. data/closure-library/closure/goog/dom/classes.js +233 -0
  413. data/closure-library/closure/goog/dom/classes_test.html +228 -0
  414. data/closure-library/closure/goog/dom/controlrange.js +511 -0
  415. data/closure-library/closure/goog/dom/controlrange_test.html +246 -0
  416. data/closure-library/closure/goog/dom/dataset.js +90 -0
  417. data/closure-library/closure/goog/dom/dataset_test.html +104 -0
  418. data/closure-library/closure/goog/dom/dom.js +2424 -0
  419. data/closure-library/closure/goog/dom/dom_quirks_test.html +104 -0
  420. data/closure-library/closure/goog/dom/dom_test.html +103 -0
  421. data/closure-library/closure/goog/dom/dom_test.js +1129 -0
  422. data/closure-library/closure/goog/dom/fontsizemonitor.js +159 -0
  423. data/closure-library/closure/goog/dom/fontsizemonitor_test.html +283 -0
  424. data/closure-library/closure/goog/dom/forms.js +403 -0
  425. data/closure-library/closure/goog/dom/forms_test.html +483 -0
  426. data/closure-library/closure/goog/dom/iframe.js +128 -0
  427. data/closure-library/closure/goog/dom/iframe_test.html +87 -0
  428. data/closure-library/closure/goog/dom/iter.js +127 -0
  429. data/closure-library/closure/goog/dom/iter_test.html +97 -0
  430. data/closure-library/closure/goog/dom/multirange.js +519 -0
  431. data/closure-library/closure/goog/dom/multirange_test.html +67 -0
  432. data/closure-library/closure/goog/dom/nodeiterator.js +85 -0
  433. data/closure-library/closure/goog/dom/nodeiterator_test.html +49 -0
  434. data/closure-library/closure/goog/dom/nodeoffset.js +111 -0
  435. data/closure-library/closure/goog/dom/nodeoffset_test.html +88 -0
  436. data/closure-library/closure/goog/dom/pattern/abstractpattern.js +60 -0
  437. data/closure-library/closure/goog/dom/pattern/allchildren.js +73 -0
  438. data/closure-library/closure/goog/dom/pattern/callback/callback.js +82 -0
  439. data/closure-library/closure/goog/dom/pattern/callback/counter.js +72 -0
  440. data/closure-library/closure/goog/dom/pattern/callback/test.js +77 -0
  441. data/closure-library/closure/goog/dom/pattern/childmatches.js +152 -0
  442. data/closure-library/closure/goog/dom/pattern/endtag.js +53 -0
  443. data/closure-library/closure/goog/dom/pattern/fulltag.js +92 -0
  444. data/closure-library/closure/goog/dom/pattern/matcher.js +150 -0
  445. data/closure-library/closure/goog/dom/pattern/matcher_test.html +204 -0
  446. data/closure-library/closure/goog/dom/pattern/nodetype.js +57 -0
  447. data/closure-library/closure/goog/dom/pattern/pattern.js +93 -0
  448. data/closure-library/closure/goog/dom/pattern/pattern_test.html +614 -0
  449. data/closure-library/closure/goog/dom/pattern/repeat.js +188 -0
  450. data/closure-library/closure/goog/dom/pattern/sequence.js +139 -0
  451. data/closure-library/closure/goog/dom/pattern/starttag.js +53 -0
  452. data/closure-library/closure/goog/dom/pattern/tag.js +149 -0
  453. data/closure-library/closure/goog/dom/pattern/text.js +69 -0
  454. data/closure-library/closure/goog/dom/range.js +220 -0
  455. data/closure-library/closure/goog/dom/range_test.html +702 -0
  456. data/closure-library/closure/goog/dom/rangeendpoint.js +32 -0
  457. data/closure-library/closure/goog/dom/savedcaretrange.js +203 -0
  458. data/closure-library/closure/goog/dom/savedcaretrange_test.html +235 -0
  459. data/closure-library/closure/goog/dom/savedrange.js +74 -0
  460. data/closure-library/closure/goog/dom/savedrange_test.html +61 -0
  461. data/closure-library/closure/goog/dom/selection.js +470 -0
  462. data/closure-library/closure/goog/dom/selection_test.html +329 -0
  463. data/closure-library/closure/goog/dom/tagiterator.js +365 -0
  464. data/closure-library/closure/goog/dom/tagiterator_test.html +589 -0
  465. data/closure-library/closure/goog/dom/tagname.js +121 -0
  466. data/closure-library/closure/goog/dom/tagname_test.html +37 -0
  467. data/closure-library/closure/goog/dom/textrange.js +611 -0
  468. data/closure-library/closure/goog/dom/textrange_test.html +127 -0
  469. data/closure-library/closure/goog/dom/textrangeiterator.js +246 -0
  470. data/closure-library/closure/goog/dom/textrangeiterator_test.html +142 -0
  471. data/closure-library/closure/goog/dom/viewportsizemonitor.js +220 -0
  472. data/closure-library/closure/goog/dom/viewportsizemonitor_test.html +166 -0
  473. data/closure-library/closure/goog/dom/xml.js +187 -0
  474. data/closure-library/closure/goog/dom/xml_test.html +77 -0
  475. data/closure-library/closure/goog/editor/browserfeature.js +251 -0
  476. data/closure-library/closure/goog/editor/browserfeature_test.html +124 -0
  477. data/closure-library/closure/goog/editor/clicktoeditwrapper.js +438 -0
  478. data/closure-library/closure/goog/editor/clicktoeditwrapper_test.html +137 -0
  479. data/closure-library/closure/goog/editor/command.js +74 -0
  480. data/closure-library/closure/goog/editor/defines.js +34 -0
  481. data/closure-library/closure/goog/editor/field.js +2594 -0
  482. data/closure-library/closure/goog/editor/field_test.html +1000 -0
  483. data/closure-library/closure/goog/editor/focus.js +32 -0
  484. data/closure-library/closure/goog/editor/focus_test.html +66 -0
  485. data/closure-library/closure/goog/editor/icontent.js +296 -0
  486. data/closure-library/closure/goog/editor/icontent_test.html +209 -0
  487. data/closure-library/closure/goog/editor/link.js +279 -0
  488. data/closure-library/closure/goog/editor/link_test.html +234 -0
  489. data/closure-library/closure/goog/editor/node.js +435 -0
  490. data/closure-library/closure/goog/editor/node_test.html +590 -0
  491. data/closure-library/closure/goog/editor/plugin.js +444 -0
  492. data/closure-library/closure/goog/editor/plugin_test.html +187 -0
  493. data/closure-library/closure/goog/editor/plugins/abstractbubbleplugin.js +535 -0
  494. data/closure-library/closure/goog/editor/plugins/abstractbubbleplugin_test.html +227 -0
  495. data/closure-library/closure/goog/editor/plugins/abstractdialogplugin.js +336 -0
  496. data/closure-library/closure/goog/editor/plugins/abstractdialogplugin_test.html +399 -0
  497. data/closure-library/closure/goog/editor/plugins/abstracttabhandler.js +78 -0
  498. data/closure-library/closure/goog/editor/plugins/abstracttabhandler_test.html +91 -0
  499. data/closure-library/closure/goog/editor/plugins/basictextformatter.js +1740 -0
  500. data/closure-library/closure/goog/editor/plugins/basictextformatter_test.html +1171 -0
  501. data/closure-library/closure/goog/editor/plugins/blockquote.js +422 -0
  502. data/closure-library/closure/goog/editor/plugins/blockquote_test.html +149 -0
  503. data/closure-library/closure/goog/editor/plugins/emoticons.js +83 -0
  504. data/closure-library/closure/goog/editor/plugins/emoticons_test.html +67 -0
  505. data/closure-library/closure/goog/editor/plugins/enterhandler.js +730 -0
  506. data/closure-library/closure/goog/editor/plugins/enterhandler_test.html +739 -0
  507. data/closure-library/closure/goog/editor/plugins/headerformatter.js +95 -0
  508. data/closure-library/closure/goog/editor/plugins/headerformatter_test.html +100 -0
  509. data/closure-library/closure/goog/editor/plugins/linkbubble.js +458 -0
  510. data/closure-library/closure/goog/editor/plugins/linkbubble_test.html +309 -0
  511. data/closure-library/closure/goog/editor/plugins/linkdialogplugin.js +222 -0
  512. data/closure-library/closure/goog/editor/plugins/linkdialogplugin_test.html +370 -0
  513. data/closure-library/closure/goog/editor/plugins/listtabhandler.js +66 -0
  514. data/closure-library/closure/goog/editor/plugins/listtabhandler_test.html +177 -0
  515. data/closure-library/closure/goog/editor/plugins/loremipsum.js +186 -0
  516. data/closure-library/closure/goog/editor/plugins/loremipsum_test.html +169 -0
  517. data/closure-library/closure/goog/editor/plugins/removeformatting.js +772 -0
  518. data/closure-library/closure/goog/editor/plugins/removeformatting_test.html +920 -0
  519. data/closure-library/closure/goog/editor/plugins/spacestabhandler.js +93 -0
  520. data/closure-library/closure/goog/editor/plugins/spacestabhandler_test.html +186 -0
  521. data/closure-library/closure/goog/editor/plugins/tableeditor.js +496 -0
  522. data/closure-library/closure/goog/editor/plugins/tableeditor_test.html +299 -0
  523. data/closure-library/closure/goog/editor/plugins/tagonenterhandler.js +741 -0
  524. data/closure-library/closure/goog/editor/plugins/tagonenterhandler_test.html +481 -0
  525. data/closure-library/closure/goog/editor/plugins/undoredo.js +1014 -0
  526. data/closure-library/closure/goog/editor/plugins/undoredo_test.html +525 -0
  527. data/closure-library/closure/goog/editor/plugins/undoredomanager.js +337 -0
  528. data/closure-library/closure/goog/editor/plugins/undoredomanager_test.html +394 -0
  529. data/closure-library/closure/goog/editor/plugins/undoredostate.js +84 -0
  530. data/closure-library/closure/goog/editor/plugins/undoredostate_test.html +44 -0
  531. data/closure-library/closure/goog/editor/range.js +602 -0
  532. data/closure-library/closure/goog/editor/range_test.html +880 -0
  533. data/closure-library/closure/goog/editor/seamlessfield.js +720 -0
  534. data/closure-library/closure/goog/editor/seamlessfield_quirks_test.html +30 -0
  535. data/closure-library/closure/goog/editor/seamlessfield_test.html +33 -0
  536. data/closure-library/closure/goog/editor/seamlessfield_test.js +392 -0
  537. data/closure-library/closure/goog/editor/style.js +222 -0
  538. data/closure-library/closure/goog/editor/style_test.html +177 -0
  539. data/closure-library/closure/goog/editor/table.js +566 -0
  540. data/closure-library/closure/goog/editor/table_test.html +522 -0
  541. data/closure-library/closure/goog/events/actioneventwrapper.js +131 -0
  542. data/closure-library/closure/goog/events/actioneventwrapper_test.html +176 -0
  543. data/closure-library/closure/goog/events/actionhandler.js +189 -0
  544. data/closure-library/closure/goog/events/actionhandler_test.html +82 -0
  545. data/closure-library/closure/goog/events/browserevent.js +412 -0
  546. data/closure-library/closure/goog/events/browserevent_test.html +145 -0
  547. data/closure-library/closure/goog/events/browserfeature.js +43 -0
  548. data/closure-library/closure/goog/events/event.js +123 -0
  549. data/closure-library/closure/goog/events/event_test.html +70 -0
  550. data/closure-library/closure/goog/events/eventhandler.js +348 -0
  551. data/closure-library/closure/goog/events/eventhandler_test.html +230 -0
  552. data/closure-library/closure/goog/events/events.js +1101 -0
  553. data/closure-library/closure/goog/events/events_test.html +362 -0
  554. data/closure-library/closure/goog/events/eventtarget.js +197 -0
  555. data/closure-library/closure/goog/events/eventtarget_test.html +423 -0
  556. data/closure-library/closure/goog/events/eventtype.js +107 -0
  557. data/closure-library/closure/goog/events/eventwrapper.js +67 -0
  558. data/closure-library/closure/goog/events/filedrophandler.js +224 -0
  559. data/closure-library/closure/goog/events/filedrophandler_test.html +258 -0
  560. data/closure-library/closure/goog/events/focushandler.js +111 -0
  561. data/closure-library/closure/goog/events/imehandler.js +365 -0
  562. data/closure-library/closure/goog/events/imehandler_test.html +271 -0
  563. data/closure-library/closure/goog/events/inputhandler.js +218 -0
  564. data/closure-library/closure/goog/events/keycodes.js +314 -0
  565. data/closure-library/closure/goog/events/keycodes_test.html +72 -0
  566. data/closure-library/closure/goog/events/keyhandler.js +522 -0
  567. data/closure-library/closure/goog/events/keyhandler_test.html +621 -0
  568. data/closure-library/closure/goog/events/keynames.js +124 -0
  569. data/closure-library/closure/goog/events/listener.js +160 -0
  570. data/closure-library/closure/goog/events/mousewheelhandler.js +280 -0
  571. data/closure-library/closure/goog/events/mousewheelhandler_test.html +331 -0
  572. data/closure-library/closure/goog/events/onlinehandler.js +176 -0
  573. data/closure-library/closure/goog/events/onlinelistener_test.html +214 -0
  574. data/closure-library/closure/goog/events/pastehandler.js +444 -0
  575. data/closure-library/closure/goog/events/pastehandler_test.html +354 -0
  576. data/closure-library/closure/goog/events/pools.js +342 -0
  577. data/closure-library/closure/goog/format/emailaddress.js +329 -0
  578. data/closure-library/closure/goog/format/emailaddress_test.html +179 -0
  579. data/closure-library/closure/goog/format/format.js +451 -0
  580. data/closure-library/closure/goog/format/format_test.html +257 -0
  581. data/closure-library/closure/goog/format/htmlprettyprinter.js +406 -0
  582. data/closure-library/closure/goog/format/htmlprettyprinter_test.html +205 -0
  583. data/closure-library/closure/goog/format/jsonprettyprinter.js +405 -0
  584. data/closure-library/closure/goog/format/jsonprettyprinter_test.html +111 -0
  585. data/closure-library/closure/goog/fs/entry.js +406 -0
  586. data/closure-library/closure/goog/fs/error.js +103 -0
  587. data/closure-library/closure/goog/fs/filesaver.js +214 -0
  588. data/closure-library/closure/goog/fs/filesystem.js +59 -0
  589. data/closure-library/closure/goog/fs/filewriter.js +106 -0
  590. data/closure-library/closure/goog/fs/fs.js +183 -0
  591. data/closure-library/closure/goog/fs/fs_test.html +270 -0
  592. data/closure-library/closure/goog/functions/functions.js +219 -0
  593. data/closure-library/closure/goog/functions/functions_test.html +198 -0
  594. data/closure-library/closure/goog/fx/abstractdragdrop.js +1451 -0
  595. data/closure-library/closure/goog/fx/abstractdragdrop_test.html +430 -0
  596. data/closure-library/closure/goog/fx/animation.js +621 -0
  597. data/closure-library/closure/goog/fx/animationqueue.js +348 -0
  598. data/closure-library/closure/goog/fx/cssspriteanimation.js +112 -0
  599. data/closure-library/closure/goog/fx/cssspriteanimation_test.html +125 -0
  600. data/closure-library/closure/goog/fx/dom.js +610 -0
  601. data/closure-library/closure/goog/fx/dragdrop.js +49 -0
  602. data/closure-library/closure/goog/fx/dragdropgroup.js +107 -0
  603. data/closure-library/closure/goog/fx/dragdropgroup_test.html +234 -0
  604. data/closure-library/closure/goog/fx/dragger.js +731 -0
  605. data/closure-library/closure/goog/fx/dragger_test.html +415 -0
  606. data/closure-library/closure/goog/fx/draglistgroup.js +1159 -0
  607. data/closure-library/closure/goog/fx/draglistgroup_test.html +231 -0
  608. data/closure-library/closure/goog/fx/dragscrollsupport.js +274 -0
  609. data/closure-library/closure/goog/fx/dragscrollsupport_test.html +253 -0
  610. data/closure-library/closure/goog/fx/easing.js +50 -0
  611. data/closure-library/closure/goog/fx/fx.js +30 -0
  612. data/closure-library/closure/goog/fx/fx_test.html +157 -0
  613. data/closure-library/closure/goog/gears/basestore.js +523 -0
  614. data/closure-library/closure/goog/gears/basestore_test.html +247 -0
  615. data/closure-library/closure/goog/gears/database.js +935 -0
  616. data/closure-library/closure/goog/gears/database_test.html +699 -0
  617. data/closure-library/closure/goog/gears/fakeworkerpool.js +252 -0
  618. data/closure-library/closure/goog/gears/fakeworkerpool_test.html +188 -0
  619. data/closure-library/closure/goog/gears/gears.js +228 -0
  620. data/closure-library/closure/goog/gears/gears_test.html +78 -0
  621. data/closure-library/closure/goog/gears/httprequest.js +77 -0
  622. data/closure-library/closure/goog/gears/loggerclient.js +131 -0
  623. data/closure-library/closure/goog/gears/loggerclient_test.html +171 -0
  624. data/closure-library/closure/goog/gears/loggerserver.js +158 -0
  625. data/closure-library/closure/goog/gears/loggerserver_test.html +118 -0
  626. data/closure-library/closure/goog/gears/logstore.js +479 -0
  627. data/closure-library/closure/goog/gears/logstore_test.html +600 -0
  628. data/closure-library/closure/goog/gears/managedresourcestore.js +553 -0
  629. data/closure-library/closure/goog/gears/managedresourcestore_test.html +453 -0
  630. data/closure-library/closure/goog/gears/multipartformdata.js +203 -0
  631. data/closure-library/closure/goog/gears/multipartformdata_test.html +220 -0
  632. data/closure-library/closure/goog/gears/statustype.js +37 -0
  633. data/closure-library/closure/goog/gears/urlcapture.js +370 -0
  634. data/closure-library/closure/goog/gears/urlcapture_test.html +392 -0
  635. data/closure-library/closure/goog/gears/worker.js +201 -0
  636. data/closure-library/closure/goog/gears/workerchannel.js +205 -0
  637. data/closure-library/closure/goog/gears/workerchannel_test.html +207 -0
  638. data/closure-library/closure/goog/gears/workerpool.js +241 -0
  639. data/closure-library/closure/goog/gears/workerpool_test.html +203 -0
  640. data/closure-library/closure/goog/graphics/abstractgraphics.js +439 -0
  641. data/closure-library/closure/goog/graphics/affinetransform.js +497 -0
  642. data/closure-library/closure/goog/graphics/affinetransform_test.html +316 -0
  643. data/closure-library/closure/goog/graphics/canvaselement.js +776 -0
  644. data/closure-library/closure/goog/graphics/canvasgraphics.js +632 -0
  645. data/closure-library/closure/goog/graphics/element.js +145 -0
  646. data/closure-library/closure/goog/graphics/ellipseelement.js +59 -0
  647. data/closure-library/closure/goog/graphics/ext/coordinates.js +158 -0
  648. data/closure-library/closure/goog/graphics/ext/coordinates_test.html +74 -0
  649. data/closure-library/closure/goog/graphics/ext/element.js +970 -0
  650. data/closure-library/closure/goog/graphics/ext/element_test.html +144 -0
  651. data/closure-library/closure/goog/graphics/ext/ellipse.js +58 -0
  652. data/closure-library/closure/goog/graphics/ext/ext.js +29 -0
  653. data/closure-library/closure/goog/graphics/ext/graphics.js +209 -0
  654. data/closure-library/closure/goog/graphics/ext/group.js +213 -0
  655. data/closure-library/closure/goog/graphics/ext/image.js +62 -0
  656. data/closure-library/closure/goog/graphics/ext/path.js +140 -0
  657. data/closure-library/closure/goog/graphics/ext/path_test.html +46 -0
  658. data/closure-library/closure/goog/graphics/ext/rectangle.js +53 -0
  659. data/closure-library/closure/goog/graphics/ext/shape.js +144 -0
  660. data/closure-library/closure/goog/graphics/ext/strokeandfillelement.js +69 -0
  661. data/closure-library/closure/goog/graphics/fill.js +29 -0
  662. data/closure-library/closure/goog/graphics/font.js +59 -0
  663. data/closure-library/closure/goog/graphics/graphics.js +124 -0
  664. data/closure-library/closure/goog/graphics/groupelement.js +54 -0
  665. data/closure-library/closure/goog/graphics/imageelement.js +67 -0
  666. data/closure-library/closure/goog/graphics/lineargradient.js +131 -0
  667. data/closure-library/closure/goog/graphics/path.js +508 -0
  668. data/closure-library/closure/goog/graphics/path_test.html +359 -0
  669. data/closure-library/closure/goog/graphics/pathelement.js +50 -0
  670. data/closure-library/closure/goog/graphics/paths.js +86 -0
  671. data/closure-library/closure/goog/graphics/paths_test.html +97 -0
  672. data/closure-library/closure/goog/graphics/rectelement.js +59 -0
  673. data/closure-library/closure/goog/graphics/solidfill.js +70 -0
  674. data/closure-library/closure/goog/graphics/stroke.js +63 -0
  675. data/closure-library/closure/goog/graphics/strokeandfillelement.js +110 -0
  676. data/closure-library/closure/goog/graphics/svgelement.js +262 -0
  677. data/closure-library/closure/goog/graphics/svggraphics.js +813 -0
  678. data/closure-library/closure/goog/graphics/textelement.js +51 -0
  679. data/closure-library/closure/goog/graphics/vmlelement.js +380 -0
  680. data/closure-library/closure/goog/graphics/vmlgraphics.js +863 -0
  681. data/closure-library/closure/goog/history/event.js +54 -0
  682. data/closure-library/closure/goog/history/eventtype.js +30 -0
  683. data/closure-library/closure/goog/history/history.js +979 -0
  684. data/closure-library/closure/goog/history/html5history.js +303 -0
  685. data/closure-library/closure/goog/history/html5history_test.html +163 -0
  686. data/closure-library/closure/goog/i18n/bidi.js +772 -0
  687. data/closure-library/closure/goog/i18n/bidi_test.html +414 -0
  688. data/closure-library/closure/goog/i18n/bidiformatter.js +488 -0
  689. data/closure-library/closure/goog/i18n/bidiformatter_test.html +343 -0
  690. data/closure-library/closure/goog/i18n/charlistdecompressor.js +157 -0
  691. data/closure-library/closure/goog/i18n/charlistdecompressor_test.html +65 -0
  692. data/closure-library/closure/goog/i18n/charpickerdata.js +3185 -0
  693. data/closure-library/closure/goog/i18n/currency.js +385 -0
  694. data/closure-library/closure/goog/i18n/currency_test.html +202 -0
  695. data/closure-library/closure/goog/i18n/currencycodemap.js +210 -0
  696. data/closure-library/closure/goog/i18n/datetimeformat.js +636 -0
  697. data/closure-library/closure/goog/i18n/datetimeformat_test.html +436 -0
  698. data/closure-library/closure/goog/i18n/datetimeparse.js +1111 -0
  699. data/closure-library/closure/goog/i18n/datetimeparse_test.html +796 -0
  700. data/closure-library/closure/goog/i18n/datetimepatterns.js +1586 -0
  701. data/closure-library/closure/goog/i18n/datetimepatternsext.js +7386 -0
  702. data/closure-library/closure/goog/i18n/datetimesymbols.js +3350 -0
  703. data/closure-library/closure/goog/i18n/datetimesymbolsext.js +12938 -0
  704. data/closure-library/closure/goog/i18n/graphemebreak.js +181 -0
  705. data/closure-library/closure/goog/i18n/graphemebreak_test.html +72 -0
  706. data/closure-library/closure/goog/i18n/messageformat.js +553 -0
  707. data/closure-library/closure/goog/i18n/messageformat_test.html +323 -0
  708. data/closure-library/closure/goog/i18n/mime.js +100 -0
  709. data/closure-library/closure/goog/i18n/mime_test.html +51 -0
  710. data/closure-library/closure/goog/i18n/numberformat.js +763 -0
  711. data/closure-library/closure/goog/i18n/numberformat_test.html +605 -0
  712. data/closure-library/closure/goog/i18n/numberformatsymbols.js +10358 -0
  713. data/closure-library/closure/goog/i18n/pluralrules.js +695 -0
  714. data/closure-library/closure/goog/i18n/timezone.js +341 -0
  715. data/closure-library/closure/goog/i18n/timezone_test.html +163 -0
  716. data/closure-library/closure/goog/i18n/uchar.js +1160 -0
  717. data/closure-library/closure/goog/i18n/uchar_test.html +72 -0
  718. data/closure-library/closure/goog/images/blank.gif +0 -0
  719. data/closure-library/closure/goog/images/bubble_close.jpg +0 -0
  720. data/closure-library/closure/goog/images/bubble_left.gif +0 -0
  721. data/closure-library/closure/goog/images/bubble_right.gif +0 -0
  722. data/closure-library/closure/goog/images/button-bg.gif +0 -0
  723. data/closure-library/closure/goog/images/check-outline.gif +0 -0
  724. data/closure-library/closure/goog/images/check-sprite.gif +0 -0
  725. data/closure-library/closure/goog/images/check.gif +0 -0
  726. data/closure-library/closure/goog/images/close_box.gif +0 -0
  727. data/closure-library/closure/goog/images/color-swatch-tick.gif +0 -0
  728. data/closure-library/closure/goog/images/dialog_close_box.gif +0 -0
  729. data/closure-library/closure/goog/images/dimension-highlighted.png +0 -0
  730. data/closure-library/closure/goog/images/dimension-unhighlighted.png +0 -0
  731. data/closure-library/closure/goog/images/dropdn.gif +0 -0
  732. data/closure-library/closure/goog/images/dropdn_disabled.gif +0 -0
  733. data/closure-library/closure/goog/images/dropdown.gif +0 -0
  734. data/closure-library/closure/goog/images/gears_bluedot.gif +0 -0
  735. data/closure-library/closure/goog/images/gears_offline.gif +0 -0
  736. data/closure-library/closure/goog/images/gears_online.gif +0 -0
  737. data/closure-library/closure/goog/images/gears_paused.gif +0 -0
  738. data/closure-library/closure/goog/images/gears_syncing.gif +0 -0
  739. data/closure-library/closure/goog/images/hsv-sprite-sm.gif +0 -0
  740. data/closure-library/closure/goog/images/hsv-sprite-sm.png +0 -0
  741. data/closure-library/closure/goog/images/hsv-sprite.gif +0 -0
  742. data/closure-library/closure/goog/images/hsv-sprite.png +0 -0
  743. data/closure-library/closure/goog/images/hsva-sprite-sm.gif +0 -0
  744. data/closure-library/closure/goog/images/hsva-sprite-sm.png +0 -0
  745. data/closure-library/closure/goog/images/hsva-sprite.gif +0 -0
  746. data/closure-library/closure/goog/images/hsva-sprite.png +0 -0
  747. data/closure-library/closure/goog/images/left_anchor_bubble_bot.gif +0 -0
  748. data/closure-library/closure/goog/images/left_anchor_bubble_top.gif +0 -0
  749. data/closure-library/closure/goog/images/menu-arrows.gif +0 -0
  750. data/closure-library/closure/goog/images/minus.png +0 -0
  751. data/closure-library/closure/goog/images/no_anchor_bubble_bot.gif +0 -0
  752. data/closure-library/closure/goog/images/no_anchor_bubble_top.gif +0 -0
  753. data/closure-library/closure/goog/images/offlineicons.png +0 -0
  754. data/closure-library/closure/goog/images/plus.png +0 -0
  755. data/closure-library/closure/goog/images/ratingstars.gif +0 -0
  756. data/closure-library/closure/goog/images/right_anchor_bubble_bot.gif +0 -0
  757. data/closure-library/closure/goog/images/right_anchor_bubble_top.gif +0 -0
  758. data/closure-library/closure/goog/images/toolbar-bg.png +0 -0
  759. data/closure-library/closure/goog/images/toolbar-separator.gif +0 -0
  760. data/closure-library/closure/goog/images/toolbar_icons.gif +0 -0
  761. data/closure-library/closure/goog/images/tree/I.png +0 -0
  762. data/closure-library/closure/goog/images/tree/cleardot.gif +0 -0
  763. data/closure-library/closure/goog/images/tree/tree.gif +0 -0
  764. data/closure-library/closure/goog/images/tree/tree.png +0 -0
  765. data/closure-library/closure/goog/images/ui_controls.jpg +0 -0
  766. data/closure-library/closure/goog/iter/iter.js +627 -0
  767. data/closure-library/closure/goog/iter/iter_test.html +443 -0
  768. data/closure-library/closure/goog/json/json.js +302 -0
  769. data/closure-library/closure/goog/json/json_test.html +501 -0
  770. data/closure-library/closure/goog/locale/countries.js +288 -0
  771. data/closure-library/closure/goog/locale/countrylanguagenames_test.html +233 -0
  772. data/closure-library/closure/goog/locale/defaultlocalenameconstants.js +847 -0
  773. data/closure-library/closure/goog/locale/genericfontnames.js +73 -0
  774. data/closure-library/closure/goog/locale/genericfontnames_test.html +97 -0
  775. data/closure-library/closure/goog/locale/genericfontnamesdata.js +328 -0
  776. data/closure-library/closure/goog/locale/locale.js +397 -0
  777. data/closure-library/closure/goog/locale/nativenameconstants.js +1354 -0
  778. data/closure-library/closure/goog/locale/scriptToLanguages.js +482 -0
  779. data/closure-library/closure/goog/locale/timezonedetection.js +117 -0
  780. data/closure-library/closure/goog/locale/timezonedetection_test.html +130 -0
  781. data/closure-library/closure/goog/locale/timezonefingerprint.js +250 -0
  782. data/closure-library/closure/goog/locale/timezonelist.js +129 -0
  783. data/closure-library/closure/goog/locale/timezonelist_test.html +165 -0
  784. data/closure-library/closure/goog/math/bezier.js +244 -0
  785. data/closure-library/closure/goog/math/bezier_test.html +70 -0
  786. data/closure-library/closure/goog/math/box.js +236 -0
  787. data/closure-library/closure/goog/math/box_test.html +139 -0
  788. data/closure-library/closure/goog/math/coordinate.js +136 -0
  789. data/closure-library/closure/goog/math/coordinate3.js +168 -0
  790. data/closure-library/closure/goog/math/coordinate3_test.html +208 -0
  791. data/closure-library/closure/goog/math/coordinate_test.html +92 -0
  792. data/closure-library/closure/goog/math/integer.js +736 -0
  793. data/closure-library/closure/goog/math/integer_test.html +1653 -0
  794. data/closure-library/closure/goog/math/line.js +177 -0
  795. data/closure-library/closure/goog/math/line_test.html +62 -0
  796. data/closure-library/closure/goog/math/long.js +801 -0
  797. data/closure-library/closure/goog/math/long_test.html +1571 -0
  798. data/closure-library/closure/goog/math/math.js +355 -0
  799. data/closure-library/closure/goog/math/math_test.html +254 -0
  800. data/closure-library/closure/goog/math/matrix.js +669 -0
  801. data/closure-library/closure/goog/math/matrix_test.html +427 -0
  802. data/closure-library/closure/goog/math/range.js +146 -0
  803. data/closure-library/closure/goog/math/range_test.html +103 -0
  804. data/closure-library/closure/goog/math/rangeset.js +368 -0
  805. data/closure-library/closure/goog/math/rangeset_test.html +619 -0
  806. data/closure-library/closure/goog/math/rect.js +340 -0
  807. data/closure-library/closure/goog/math/rect_test.html +315 -0
  808. data/closure-library/closure/goog/math/size.js +201 -0
  809. data/closure-library/closure/goog/math/size_test.html +174 -0
  810. data/closure-library/closure/goog/math/vec2.js +255 -0
  811. data/closure-library/closure/goog/math/vec2_test.html +203 -0
  812. data/closure-library/closure/goog/math/vec3.js +327 -0
  813. data/closure-library/closure/goog/math/vec3_test.html +231 -0
  814. data/closure-library/closure/goog/memoize/memoize.js +98 -0
  815. data/closure-library/closure/goog/memoize/memoize_test.html +157 -0
  816. data/closure-library/closure/goog/messaging/abstractchannel.js +209 -0
  817. data/closure-library/closure/goog/messaging/abstractchannel_test.html +90 -0
  818. data/closure-library/closure/goog/messaging/bufferedchannel.js +277 -0
  819. data/closure-library/closure/goog/messaging/bufferedchannel_test.html +205 -0
  820. data/closure-library/closure/goog/messaging/deferredchannel.js +79 -0
  821. data/closure-library/closure/goog/messaging/deferredchannel_test.html +107 -0
  822. data/closure-library/closure/goog/messaging/loggerclient.js +131 -0
  823. data/closure-library/closure/goog/messaging/loggerclient_test.html +102 -0
  824. data/closure-library/closure/goog/messaging/loggerserver.js +94 -0
  825. data/closure-library/closure/goog/messaging/loggerserver_test.html +101 -0
  826. data/closure-library/closure/goog/messaging/messagechannel.js +115 -0
  827. data/closure-library/closure/goog/messaging/messaging.js +34 -0
  828. data/closure-library/closure/goog/messaging/messaging_test.html +42 -0
  829. data/closure-library/closure/goog/messaging/multichannel.js +303 -0
  830. data/closure-library/closure/goog/messaging/multichannel_test.html +122 -0
  831. data/closure-library/closure/goog/messaging/portchannel.js +341 -0
  832. data/closure-library/closure/goog/messaging/portchannel_test.html +359 -0
  833. data/closure-library/closure/goog/messaging/testdata/portchannel_worker.js +37 -0
  834. data/closure-library/closure/goog/module/abstractmoduleloader.js +46 -0
  835. data/closure-library/closure/goog/module/basemodule.js +45 -0
  836. data/closure-library/closure/goog/module/basemoduleloader.js +210 -0
  837. data/closure-library/closure/goog/module/loader.js +269 -0
  838. data/closure-library/closure/goog/module/module.js +166 -0
  839. data/closure-library/closure/goog/module/moduleinfo.js +336 -0
  840. data/closure-library/closure/goog/module/moduleinfo_test.html +109 -0
  841. data/closure-library/closure/goog/module/moduleloadcallback.js +84 -0
  842. data/closure-library/closure/goog/module/moduleloadcallback_test.html +57 -0
  843. data/closure-library/closure/goog/module/moduleloader.js +250 -0
  844. data/closure-library/closure/goog/module/moduleloader_test.html +244 -0
  845. data/closure-library/closure/goog/module/modulemanager.js +1008 -0
  846. data/closure-library/closure/goog/module/modulemanager_test.html +1240 -0
  847. data/closure-library/closure/goog/module/testdata/modA_1.js +22 -0
  848. data/closure-library/closure/goog/module/testdata/modA_2.js +24 -0
  849. data/closure-library/closure/goog/module/testdata/modB_1.js +24 -0
  850. data/closure-library/closure/goog/net/browserchannel.js +2441 -0
  851. data/closure-library/closure/goog/net/browserchannel_test.html +1176 -0
  852. data/closure-library/closure/goog/net/browsertestchannel.js +552 -0
  853. data/closure-library/closure/goog/net/bulkloader.js +174 -0
  854. data/closure-library/closure/goog/net/bulkloader_test.html +232 -0
  855. data/closure-library/closure/goog/net/bulkloaderhelper.js +129 -0
  856. data/closure-library/closure/goog/net/channeldebug.js +288 -0
  857. data/closure-library/closure/goog/net/channelrequest.js +1125 -0
  858. data/closure-library/closure/goog/net/channelrequest_test.html +158 -0
  859. data/closure-library/closure/goog/net/cookies.js +401 -0
  860. data/closure-library/closure/goog/net/cookies_test.html +255 -0
  861. data/closure-library/closure/goog/net/crossdomainrpc.js +848 -0
  862. data/closure-library/closure/goog/net/crossdomainrpc_test.gif +0 -0
  863. data/closure-library/closure/goog/net/crossdomainrpc_test.html +120 -0
  864. data/closure-library/closure/goog/net/crossdomainrpc_test_response.html +59 -0
  865. data/closure-library/closure/goog/net/errorcode.js +130 -0
  866. data/closure-library/closure/goog/net/eventtype.js +37 -0
  867. data/closure-library/closure/goog/net/iframe_xhr_test.html +142 -0
  868. data/closure-library/closure/goog/net/iframe_xhr_test_response.html +17 -0
  869. data/closure-library/closure/goog/net/iframeio.js +1342 -0
  870. data/closure-library/closure/goog/net/iframeio_different_base_test.data +2 -0
  871. data/closure-library/closure/goog/net/iframeio_different_base_test.html +42 -0
  872. data/closure-library/closure/goog/net/iframeio_test.html +368 -0
  873. data/closure-library/closure/goog/net/iframeloadmonitor.js +199 -0
  874. data/closure-library/closure/goog/net/iframeloadmonitor_test.html +113 -0
  875. data/closure-library/closure/goog/net/iframeloadmonitor_test_frame.html +12 -0
  876. data/closure-library/closure/goog/net/iframeloadmonitor_test_frame2.html +12 -0
  877. data/closure-library/closure/goog/net/iframeloadmonitor_test_frame3.html +12 -0
  878. data/closure-library/closure/goog/net/imageloader.js +237 -0
  879. data/closure-library/closure/goog/net/imageloader_test.html +200 -0
  880. data/closure-library/closure/goog/net/imageloader_testimg1.gif +0 -0
  881. data/closure-library/closure/goog/net/imageloader_testimg2.gif +0 -0
  882. data/closure-library/closure/goog/net/imageloader_testimg3.gif +0 -0
  883. data/closure-library/closure/goog/net/jsonp.js +379 -0
  884. data/closure-library/closure/goog/net/jsonp_test.html +328 -0
  885. data/closure-library/closure/goog/net/mockiframeio.js +318 -0
  886. data/closure-library/closure/goog/net/mockxhrlite.js +34 -0
  887. data/closure-library/closure/goog/net/mockxhrlite_test.html +109 -0
  888. data/closure-library/closure/goog/net/multiiframeloadmonitor.js +116 -0
  889. data/closure-library/closure/goog/net/multiiframeloadmonitor_test.html +172 -0
  890. data/closure-library/closure/goog/net/networktester.js +383 -0
  891. data/closure-library/closure/goog/net/networktester_test.html +227 -0
  892. data/closure-library/closure/goog/net/tmpnetwork.js +168 -0
  893. data/closure-library/closure/goog/net/wrapperxmlhttpfactory.js +68 -0
  894. data/closure-library/closure/goog/net/xhrio.js +1093 -0
  895. data/closure-library/closure/goog/net/xhrio_test.html +603 -0
  896. data/closure-library/closure/goog/net/xhriopool.js +87 -0
  897. data/closure-library/closure/goog/net/xhrlite.js +119 -0
  898. data/closure-library/closure/goog/net/xhrlite_test.html +156 -0
  899. data/closure-library/closure/goog/net/xhrlitepool.js +37 -0
  900. data/closure-library/closure/goog/net/xhrmanager.js +763 -0
  901. data/closure-library/closure/goog/net/xhrmonitor.js +254 -0
  902. data/closure-library/closure/goog/net/xhrmonitor_test.html +199 -0
  903. data/closure-library/closure/goog/net/xmlhttp.js +215 -0
  904. data/closure-library/closure/goog/net/xmlhttpfactory.js +64 -0
  905. data/closure-library/closure/goog/net/xpc/crosspagechannel.js +624 -0
  906. data/closure-library/closure/goog/net/xpc/crosspagechannel_test.html +422 -0
  907. data/closure-library/closure/goog/net/xpc/frameelementmethodtransport.js +251 -0
  908. data/closure-library/closure/goog/net/xpc/iframepollingtransport.js +822 -0
  909. data/closure-library/closure/goog/net/xpc/iframerelaytransport.js +288 -0
  910. data/closure-library/closure/goog/net/xpc/nativemessagingtransport.js +280 -0
  911. data/closure-library/closure/goog/net/xpc/nativemessagingtransport_test.html +164 -0
  912. data/closure-library/closure/goog/net/xpc/nixtransport.js +454 -0
  913. data/closure-library/closure/goog/net/xpc/relay.js +72 -0
  914. data/closure-library/closure/goog/net/xpc/testdata/inner_peer.html +106 -0
  915. data/closure-library/closure/goog/net/xpc/transport.js +104 -0
  916. data/closure-library/closure/goog/net/xpc/xpc.js +238 -0
  917. data/closure-library/closure/goog/object/object.js +553 -0
  918. data/closure-library/closure/goog/object/object_test.html +376 -0
  919. data/closure-library/closure/goog/positioning/absoluteposition.js +73 -0
  920. data/closure-library/closure/goog/positioning/abstractposition.js +47 -0
  921. data/closure-library/closure/goog/positioning/anchoredposition.js +78 -0
  922. data/closure-library/closure/goog/positioning/anchoredviewportposition.js +126 -0
  923. data/closure-library/closure/goog/positioning/anchoredviewportposition_test.html +117 -0
  924. data/closure-library/closure/goog/positioning/anchoredviewportposition_test_iframe.html +35 -0
  925. data/closure-library/closure/goog/positioning/clientposition.js +75 -0
  926. data/closure-library/closure/goog/positioning/menuanchoredposition.js +97 -0
  927. data/closure-library/closure/goog/positioning/positioning.js +476 -0
  928. data/closure-library/closure/goog/positioning/positioning_test.html +877 -0
  929. data/closure-library/closure/goog/positioning/positioning_test_iframe1.html +16 -0
  930. data/closure-library/closure/goog/positioning/positioning_test_iframe2.html +13 -0
  931. data/closure-library/closure/goog/positioning/positioning_test_quirk.html +9 -0
  932. data/closure-library/closure/goog/positioning/positioning_test_standard.html +13 -0
  933. data/closure-library/closure/goog/positioning/viewportclientposition.js +102 -0
  934. data/closure-library/closure/goog/positioning/viewportclientposition_test.html +172 -0
  935. data/closure-library/closure/goog/positioning/viewportposition.js +63 -0
  936. data/closure-library/closure/goog/proto/proto.js +43 -0
  937. data/closure-library/closure/goog/proto/serializer.js +68 -0
  938. data/closure-library/closure/goog/proto/serializer_test.html +43 -0
  939. data/closure-library/closure/goog/proto2/descriptor.js +198 -0
  940. data/closure-library/closure/goog/proto2/descriptor_test.html +60 -0
  941. data/closure-library/closure/goog/proto2/fielddescriptor.js +288 -0
  942. data/closure-library/closure/goog/proto2/fielddescriptor_test.html +124 -0
  943. data/closure-library/closure/goog/proto2/lazydeserializer.js +69 -0
  944. data/closure-library/closure/goog/proto2/message.js +726 -0
  945. data/closure-library/closure/goog/proto2/message_test.html +356 -0
  946. data/closure-library/closure/goog/proto2/objectserializer.js +159 -0
  947. data/closure-library/closure/goog/proto2/objectserializer_test.html +423 -0
  948. data/closure-library/closure/goog/proto2/package_test.pb.js +164 -0
  949. data/closure-library/closure/goog/proto2/pbliteserializer.js +150 -0
  950. data/closure-library/closure/goog/proto2/pbliteserializer_test.html +267 -0
  951. data/closure-library/closure/goog/proto2/proto_test.html +693 -0
  952. data/closure-library/closure/goog/proto2/serializer.js +148 -0
  953. data/closure-library/closure/goog/proto2/test.pb.js +2820 -0
  954. data/closure-library/closure/goog/proto2/util.js +54 -0
  955. data/closure-library/closure/goog/pubsub/pubsub.js +326 -0
  956. data/closure-library/closure/goog/pubsub/pubsub_test.html +635 -0
  957. data/closure-library/closure/goog/reflect/reflect.js +50 -0
  958. data/closure-library/closure/goog/spell/spellcheck.js +474 -0
  959. data/closure-library/closure/goog/spell/spellcheck_test.html +112 -0
  960. data/closure-library/closure/goog/string/path.js +100 -0
  961. data/closure-library/closure/goog/string/path_test.html +59 -0
  962. data/closure-library/closure/goog/string/string.js +1207 -0
  963. data/closure-library/closure/goog/string/string_test.html +877 -0
  964. data/closure-library/closure/goog/string/stringbuffer.js +167 -0
  965. data/closure-library/closure/goog/string/stringbuffer_test.html +101 -0
  966. data/closure-library/closure/goog/string/stringformat.js +247 -0
  967. data/closure-library/closure/goog/string/stringformat_test.html +211 -0
  968. data/closure-library/closure/goog/structs/avltree.js +769 -0
  969. data/closure-library/closure/goog/structs/avltree_test.html +241 -0
  970. data/closure-library/closure/goog/structs/circularbuffer.js +219 -0
  971. data/closure-library/closure/goog/structs/circularbuffer_test.html +105 -0
  972. data/closure-library/closure/goog/structs/heap.js +332 -0
  973. data/closure-library/closure/goog/structs/heap_test.html +220 -0
  974. data/closure-library/closure/goog/structs/inversionmap.js +159 -0
  975. data/closure-library/closure/goog/structs/inversionmap_test.html +157 -0
  976. data/closure-library/closure/goog/structs/linkedmap.js +472 -0
  977. data/closure-library/closure/goog/structs/linkedmap_test.html +300 -0
  978. data/closure-library/closure/goog/structs/map.js +446 -0
  979. data/closure-library/closure/goog/structs/map_test.html +430 -0
  980. data/closure-library/closure/goog/structs/node.js +74 -0
  981. data/closure-library/closure/goog/structs/pool.js +344 -0
  982. data/closure-library/closure/goog/structs/pool_test.html +265 -0
  983. data/closure-library/closure/goog/structs/prioritypool.js +147 -0
  984. data/closure-library/closure/goog/structs/prioritypool_test.html +478 -0
  985. data/closure-library/closure/goog/structs/priorityqueue.js +64 -0
  986. data/closure-library/closure/goog/structs/priorityqueue_test.html +179 -0
  987. data/closure-library/closure/goog/structs/quadtree.js +571 -0
  988. data/closure-library/closure/goog/structs/quadtree_test.html +179 -0
  989. data/closure-library/closure/goog/structs/queue.js +157 -0
  990. data/closure-library/closure/goog/structs/queue_test.html +140 -0
  991. data/closure-library/closure/goog/structs/set.js +251 -0
  992. data/closure-library/closure/goog/structs/set_test.html +551 -0
  993. data/closure-library/closure/goog/structs/simplepool.js +203 -0
  994. data/closure-library/closure/goog/structs/stringset.js +404 -0
  995. data/closure-library/closure/goog/structs/stringset_test.html +251 -0
  996. data/closure-library/closure/goog/structs/structs.js +341 -0
  997. data/closure-library/closure/goog/structs/structs_test.html +1050 -0
  998. data/closure-library/closure/goog/structs/treenode.js +312 -0
  999. data/closure-library/closure/goog/structs/treenode_test.html +285 -0
  1000. data/closure-library/closure/goog/structs/trie.js +368 -0
  1001. data/closure-library/closure/goog/structs/trie_test.html +378 -0
  1002. data/closure-library/closure/goog/style/cursor.js +125 -0
  1003. data/closure-library/closure/goog/style/cursor_test.html +131 -0
  1004. data/closure-library/closure/goog/style/style.js +1804 -0
  1005. data/closure-library/closure/goog/style/style_quirks_test.html +1928 -0
  1006. data/closure-library/closure/goog/style/style_test.html +2073 -0
  1007. data/closure-library/closure/goog/style/style_test_iframe_quirk.html +29 -0
  1008. data/closure-library/closure/goog/style/style_test_iframe_standard.html +30 -0
  1009. data/closure-library/closure/goog/style/style_test_quirk.html +9 -0
  1010. data/closure-library/closure/goog/style/style_test_standard.html +11 -0
  1011. data/closure-library/closure/goog/testing/asserts.js +970 -0
  1012. data/closure-library/closure/goog/testing/asserts_test.html +966 -0
  1013. data/closure-library/closure/goog/testing/async/mockcontrol.js +174 -0
  1014. data/closure-library/closure/goog/testing/async/mockcontrol_test.html +224 -0
  1015. data/closure-library/closure/goog/testing/asynctestcase.js +812 -0
  1016. data/closure-library/closure/goog/testing/asynctestcase_async_test.html +102 -0
  1017. data/closure-library/closure/goog/testing/asynctestcase_noasync_test.html +98 -0
  1018. data/closure-library/closure/goog/testing/benchmark.js +87 -0
  1019. data/closure-library/closure/goog/testing/benchmarks/jsbinarysizebutton.js +64 -0
  1020. data/closure-library/closure/goog/testing/benchmarks/jsbinarysizebutton_test.html +58 -0
  1021. data/closure-library/closure/goog/testing/benchmarks/jsbinarysizetoolbar.js +66 -0
  1022. data/closure-library/closure/goog/testing/benchmarks/jsbinarysizetoolbar_test.html +49 -0
  1023. data/closure-library/closure/goog/testing/continuationtestcase.js +682 -0
  1024. data/closure-library/closure/goog/testing/continuationtestcase_test.html +349 -0
  1025. data/closure-library/closure/goog/testing/deferredtestcase.js +157 -0
  1026. data/closure-library/closure/goog/testing/deferredtestcase_test.html +152 -0
  1027. data/closure-library/closure/goog/testing/dom.js +596 -0
  1028. data/closure-library/closure/goog/testing/dom_test.html +438 -0
  1029. data/closure-library/closure/goog/testing/editor/dom.js +293 -0
  1030. data/closure-library/closure/goog/testing/editor/dom_test.html +295 -0
  1031. data/closure-library/closure/goog/testing/editor/fieldmock.js +90 -0
  1032. data/closure-library/closure/goog/testing/editor/testhelper.js +168 -0
  1033. data/closure-library/closure/goog/testing/editor/testhelper_test.html +176 -0
  1034. data/closure-library/closure/goog/testing/events/eventobserver.js +85 -0
  1035. data/closure-library/closure/goog/testing/events/eventobserver_test.html +70 -0
  1036. data/closure-library/closure/goog/testing/events/events.js +540 -0
  1037. data/closure-library/closure/goog/testing/events/events_test.html +434 -0
  1038. data/closure-library/closure/goog/testing/events/matchers.js +41 -0
  1039. data/closure-library/closure/goog/testing/events/matchers_test.html +40 -0
  1040. data/closure-library/closure/goog/testing/expectedfailures.js +236 -0
  1041. data/closure-library/closure/goog/testing/expectedfailures_test.html +122 -0
  1042. data/closure-library/closure/goog/testing/fs/blob.js +74 -0
  1043. data/closure-library/closure/goog/testing/fs/blob_test.html +53 -0
  1044. data/closure-library/closure/goog/testing/fs/directoryentry_test.html +185 -0
  1045. data/closure-library/closure/goog/testing/fs/entry.js +511 -0
  1046. data/closure-library/closure/goog/testing/fs/entry_test.html +153 -0
  1047. data/closure-library/closure/goog/testing/fs/file.js +51 -0
  1048. data/closure-library/closure/goog/testing/fs/fileentry_test.html +54 -0
  1049. data/closure-library/closure/goog/testing/fs/filesystem.js +64 -0
  1050. data/closure-library/closure/goog/testing/fs/filewriter.js +314 -0
  1051. data/closure-library/closure/goog/testing/fs/filewriter_test.html +248 -0
  1052. data/closure-library/closure/goog/testing/fs/fs.js +146 -0
  1053. data/closure-library/closure/goog/testing/fs/fs_test.html +54 -0
  1054. data/closure-library/closure/goog/testing/fs/integration_test.html +219 -0
  1055. data/closure-library/closure/goog/testing/functionmock.js +157 -0
  1056. data/closure-library/closure/goog/testing/functionmock_test.html +357 -0
  1057. data/closure-library/closure/goog/testing/graphics.js +64 -0
  1058. data/closure-library/closure/goog/testing/jsunit.js +144 -0
  1059. data/closure-library/closure/goog/testing/loosemock.js +240 -0
  1060. data/closure-library/closure/goog/testing/loosemock_test.html +343 -0
  1061. data/closure-library/closure/goog/testing/messaging/mockmessagechannel.js +77 -0
  1062. data/closure-library/closure/goog/testing/messaging/mockmessageevent.js +100 -0
  1063. data/closure-library/closure/goog/testing/mock.js +556 -0
  1064. data/closure-library/closure/goog/testing/mock_test.html +208 -0
  1065. data/closure-library/closure/goog/testing/mockclassfactory.js +580 -0
  1066. data/closure-library/closure/goog/testing/mockclassfactory_test.html +241 -0
  1067. data/closure-library/closure/goog/testing/mockclock.js +395 -0
  1068. data/closure-library/closure/goog/testing/mockclock_test.html +413 -0
  1069. data/closure-library/closure/goog/testing/mockcontrol.js +210 -0
  1070. data/closure-library/closure/goog/testing/mockcontrol_test.html +127 -0
  1071. data/closure-library/closure/goog/testing/mockinterface.js +45 -0
  1072. data/closure-library/closure/goog/testing/mockmatchers.js +395 -0
  1073. data/closure-library/closure/goog/testing/mockmatchers_test.html +388 -0
  1074. data/closure-library/closure/goog/testing/mockrandom.js +128 -0
  1075. data/closure-library/closure/goog/testing/mockrandom_test.html +56 -0
  1076. data/closure-library/closure/goog/testing/mockrange.js +65 -0
  1077. data/closure-library/closure/goog/testing/mockrange_test.html +41 -0
  1078. data/closure-library/closure/goog/testing/mockuseragent.js +143 -0
  1079. data/closure-library/closure/goog/testing/mockuseragent_test.html +59 -0
  1080. data/closure-library/closure/goog/testing/multitestrunner.js +1442 -0
  1081. data/closure-library/closure/goog/testing/net/xhrio.js +595 -0
  1082. data/closure-library/closure/goog/testing/net/xhrio_test.html +321 -0
  1083. data/closure-library/closure/goog/testing/objectpropertystring.js +67 -0
  1084. data/closure-library/closure/goog/testing/performancetable.css +46 -0
  1085. data/closure-library/closure/goog/testing/performancetable.js +162 -0
  1086. data/closure-library/closure/goog/testing/performancetimer.js +166 -0
  1087. data/closure-library/closure/goog/testing/performancetimer_test.html +107 -0
  1088. data/closure-library/closure/goog/testing/propertyreplacer.js +243 -0
  1089. data/closure-library/closure/goog/testing/propertyreplacer_test.html +368 -0
  1090. data/closure-library/closure/goog/testing/pseudorandom.js +162 -0
  1091. data/closure-library/closure/goog/testing/pseudorandom_test.html +98 -0
  1092. data/closure-library/closure/goog/testing/recordfunction.js +194 -0
  1093. data/closure-library/closure/goog/testing/recordfunction_test.html +147 -0
  1094. data/closure-library/closure/goog/testing/singleton.js +82 -0
  1095. data/closure-library/closure/goog/testing/singleton_test.html +39 -0
  1096. data/closure-library/closure/goog/testing/stacktrace.js +470 -0
  1097. data/closure-library/closure/goog/testing/stacktrace_test.html +229 -0
  1098. data/closure-library/closure/goog/testing/strictmock.js +124 -0
  1099. data/closure-library/closure/goog/testing/strictmock_test.html +368 -0
  1100. data/closure-library/closure/goog/testing/style/layoutasserts.js +368 -0
  1101. data/closure-library/closure/goog/testing/style/layoutasserts_test.html +269 -0
  1102. data/closure-library/closure/goog/testing/testcase.js +1053 -0
  1103. data/closure-library/closure/goog/testing/testqueue.js +66 -0
  1104. data/closure-library/closure/goog/testing/testrunner.js +391 -0
  1105. data/closure-library/closure/goog/testing/ui/rendererasserts.js +50 -0
  1106. data/closure-library/closure/goog/testing/ui/rendererasserts_test.html +51 -0
  1107. data/closure-library/closure/goog/testing/ui/rendererharness.js +175 -0
  1108. data/closure-library/closure/goog/testing/ui/style.js +137 -0
  1109. data/closure-library/closure/goog/testing/ui/style_reference.html +27 -0
  1110. data/closure-library/closure/goog/testing/ui/style_test.html +130 -0
  1111. data/closure-library/closure/goog/timer/timer.js +285 -0
  1112. data/closure-library/closure/goog/timer/timer_test.html +118 -0
  1113. data/closure-library/closure/goog/tweak/entries.js +990 -0
  1114. data/closure-library/closure/goog/tweak/entries_test.html +94 -0
  1115. data/closure-library/closure/goog/tweak/registry.js +310 -0
  1116. data/closure-library/closure/goog/tweak/registry_test.html +144 -0
  1117. data/closure-library/closure/goog/tweak/testhelpers.js +111 -0
  1118. data/closure-library/closure/goog/tweak/tweak.js +318 -0
  1119. data/closure-library/closure/goog/tweak/tweakui.js +817 -0
  1120. data/closure-library/closure/goog/tweak/tweakui_test.html +280 -0
  1121. data/closure-library/closure/goog/ui/abstractspellchecker.js +1069 -0
  1122. data/closure-library/closure/goog/ui/activitymonitor.js +286 -0
  1123. data/closure-library/closure/goog/ui/activitymonitor_test.html +44 -0
  1124. data/closure-library/closure/goog/ui/advancedtooltip.js +369 -0
  1125. data/closure-library/closure/goog/ui/advancedtooltip_test.html +274 -0
  1126. data/closure-library/closure/goog/ui/animatedzippy.js +190 -0
  1127. data/closure-library/closure/goog/ui/attachablemenu.js +464 -0
  1128. data/closure-library/closure/goog/ui/autocomplete/arraymatcher.js +156 -0
  1129. data/closure-library/closure/goog/ui/autocomplete/arraymatcher_test.html +130 -0
  1130. data/closure-library/closure/goog/ui/autocomplete/autocomplete.js +627 -0
  1131. data/closure-library/closure/goog/ui/autocomplete/autocomplete_test.html +537 -0
  1132. data/closure-library/closure/goog/ui/autocomplete/basic.js +53 -0
  1133. data/closure-library/closure/goog/ui/autocomplete/basic_test.html +204 -0
  1134. data/closure-library/closure/goog/ui/autocomplete/inputhandler.js +1209 -0
  1135. data/closure-library/closure/goog/ui/autocomplete/inputhandler_test.html +555 -0
  1136. data/closure-library/closure/goog/ui/autocomplete/remote.js +117 -0
  1137. data/closure-library/closure/goog/ui/autocomplete/remotearraymatcher.js +273 -0
  1138. data/closure-library/closure/goog/ui/autocomplete/remotearraymatcher_test.html +73 -0
  1139. data/closure-library/closure/goog/ui/autocomplete/renderer.js +852 -0
  1140. data/closure-library/closure/goog/ui/autocomplete/renderer_test.html +386 -0
  1141. data/closure-library/closure/goog/ui/autocomplete/richinputhandler.js +59 -0
  1142. data/closure-library/closure/goog/ui/autocomplete/richremote.js +108 -0
  1143. data/closure-library/closure/goog/ui/autocomplete/richremotearraymatcher.js +126 -0
  1144. data/closure-library/closure/goog/ui/basicmenu.js +930 -0
  1145. data/closure-library/closure/goog/ui/bidiinput.js +164 -0
  1146. data/closure-library/closure/goog/ui/bubble.js +475 -0
  1147. data/closure-library/closure/goog/ui/button.js +208 -0
  1148. data/closure-library/closure/goog/ui/button_test.html +257 -0
  1149. data/closure-library/closure/goog/ui/buttonrenderer.js +205 -0
  1150. data/closure-library/closure/goog/ui/buttonrenderer_test.html +190 -0
  1151. data/closure-library/closure/goog/ui/buttonside.js +40 -0
  1152. data/closure-library/closure/goog/ui/cccbutton.js +281 -0
  1153. data/closure-library/closure/goog/ui/charcounter.js +200 -0
  1154. data/closure-library/closure/goog/ui/charpicker.js +807 -0
  1155. data/closure-library/closure/goog/ui/checkbox.js +303 -0
  1156. data/closure-library/closure/goog/ui/checkbox_test.html +224 -0
  1157. data/closure-library/closure/goog/ui/checkboxmenuitem.js +53 -0
  1158. data/closure-library/closure/goog/ui/colorbutton.js +58 -0
  1159. data/closure-library/closure/goog/ui/colorbutton_test.html +70 -0
  1160. data/closure-library/closure/goog/ui/colorbuttonrenderer.js +72 -0
  1161. data/closure-library/closure/goog/ui/colormenubutton.js +213 -0
  1162. data/closure-library/closure/goog/ui/colormenubuttonrenderer.js +144 -0
  1163. data/closure-library/closure/goog/ui/colormenubuttonrenderer_test.html +88 -0
  1164. data/closure-library/closure/goog/ui/colorpalette.js +162 -0
  1165. data/closure-library/closure/goog/ui/colorpalette_test.html +169 -0
  1166. data/closure-library/closure/goog/ui/colorpicker.js +344 -0
  1167. data/closure-library/closure/goog/ui/colorsplitbehavior.js +61 -0
  1168. data/closure-library/closure/goog/ui/combobox.js +894 -0
  1169. data/closure-library/closure/goog/ui/combobox_test.html +208 -0
  1170. data/closure-library/closure/goog/ui/component.js +1187 -0
  1171. data/closure-library/closure/goog/ui/component_test.html +723 -0
  1172. data/closure-library/closure/goog/ui/container.js +1296 -0
  1173. data/closure-library/closure/goog/ui/container_test.html +450 -0
  1174. data/closure-library/closure/goog/ui/containerrenderer.js +370 -0
  1175. data/closure-library/closure/goog/ui/containerrenderer_test.html +227 -0
  1176. data/closure-library/closure/goog/ui/containerscroller.js +221 -0
  1177. data/closure-library/closure/goog/ui/containerscroller_test.html +213 -0
  1178. data/closure-library/closure/goog/ui/control.js +1348 -0
  1179. data/closure-library/closure/goog/ui/control_test.html +2128 -0
  1180. data/closure-library/closure/goog/ui/controlcontent.js +28 -0
  1181. data/closure-library/closure/goog/ui/controlrenderer.js +808 -0
  1182. data/closure-library/closure/goog/ui/controlrenderer_test.html +840 -0
  1183. data/closure-library/closure/goog/ui/cookieeditor.js +182 -0
  1184. data/closure-library/closure/goog/ui/cookieeditor_test.html +102 -0
  1185. data/closure-library/closure/goog/ui/css3buttonrenderer.js +147 -0
  1186. data/closure-library/closure/goog/ui/css3menubuttonrenderer.js +144 -0
  1187. data/closure-library/closure/goog/ui/cssnames.js +28 -0
  1188. data/closure-library/closure/goog/ui/custombutton.js +58 -0
  1189. data/closure-library/closure/goog/ui/custombuttonrenderer.js +254 -0
  1190. data/closure-library/closure/goog/ui/customcolorpalette.js +137 -0
  1191. data/closure-library/closure/goog/ui/customcolorpalette_test.html +60 -0
  1192. data/closure-library/closure/goog/ui/datepicker.js +1339 -0
  1193. data/closure-library/closure/goog/ui/datepicker_test.html +190 -0
  1194. data/closure-library/closure/goog/ui/decorate.js +37 -0
  1195. data/closure-library/closure/goog/ui/decorate_test.html +113 -0
  1196. data/closure-library/closure/goog/ui/deprecatedbutton.js +381 -0
  1197. data/closure-library/closure/goog/ui/dialog.js +1776 -0
  1198. data/closure-library/closure/goog/ui/dialog_test.html +493 -0
  1199. data/closure-library/closure/goog/ui/dimensionpicker.js +289 -0
  1200. data/closure-library/closure/goog/ui/dimensionpicker_test.html +128 -0
  1201. data/closure-library/closure/goog/ui/dimensionpickerrenderer.js +387 -0
  1202. data/closure-library/closure/goog/ui/dragdropdetector.js +642 -0
  1203. data/closure-library/closure/goog/ui/drilldownrow.js +494 -0
  1204. data/closure-library/closure/goog/ui/editor/abstractdialog.js +443 -0
  1205. data/closure-library/closure/goog/ui/editor/abstractdialog_test.html +467 -0
  1206. data/closure-library/closure/goog/ui/editor/bubble.js +520 -0
  1207. data/closure-library/closure/goog/ui/editor/bubble_test.html +264 -0
  1208. data/closure-library/closure/goog/ui/editor/defaulttoolbar.js +1062 -0
  1209. data/closure-library/closure/goog/ui/editor/linkdialog.js +833 -0
  1210. data/closure-library/closure/goog/ui/editor/linkdialog_test.html +449 -0
  1211. data/closure-library/closure/goog/ui/editor/messages.js +115 -0
  1212. data/closure-library/closure/goog/ui/editor/tabpane.js +183 -0
  1213. data/closure-library/closure/goog/ui/editor/toolbarcontroller.js +293 -0
  1214. data/closure-library/closure/goog/ui/editor/toolbarfactory.js +437 -0
  1215. data/closure-library/closure/goog/ui/editor/toolbarfactory_test.html +73 -0
  1216. data/closure-library/closure/goog/ui/emoji/emoji.js +72 -0
  1217. data/closure-library/closure/goog/ui/emoji/emojipalette.js +298 -0
  1218. data/closure-library/closure/goog/ui/emoji/emojipaletterenderer.js +206 -0
  1219. data/closure-library/closure/goog/ui/emoji/emojipicker.js +797 -0
  1220. data/closure-library/closure/goog/ui/emoji/emojipicker_test.html +840 -0
  1221. data/closure-library/closure/goog/ui/emoji/fast_nonprogressive_emojipicker_test.html +256 -0
  1222. data/closure-library/closure/goog/ui/emoji/fast_progressive_emojipicker_test.html +256 -0
  1223. data/closure-library/closure/goog/ui/emoji/popupemojipicker.js +410 -0
  1224. data/closure-library/closure/goog/ui/emoji/popupemojipicker_test.html +80 -0
  1225. data/closure-library/closure/goog/ui/emoji/progressiveemojipaletterenderer.js +97 -0
  1226. data/closure-library/closure/goog/ui/emoji/spriteinfo.js +212 -0
  1227. data/closure-library/closure/goog/ui/emoji/spriteinfo_test.html +51 -0
  1228. data/closure-library/closure/goog/ui/filteredmenu.js +562 -0
  1229. data/closure-library/closure/goog/ui/filteredmenu_test.html +299 -0
  1230. data/closure-library/closure/goog/ui/filterobservingmenuitem.js +97 -0
  1231. data/closure-library/closure/goog/ui/filterobservingmenuitemrenderer.js +60 -0
  1232. data/closure-library/closure/goog/ui/flatbuttonrenderer.js +138 -0
  1233. data/closure-library/closure/goog/ui/flatmenubuttonrenderer.js +199 -0
  1234. data/closure-library/closure/goog/ui/formpost.js +109 -0
  1235. data/closure-library/closure/goog/ui/formpost_test.html +109 -0
  1236. data/closure-library/closure/goog/ui/gauge.js +999 -0
  1237. data/closure-library/closure/goog/ui/gaugetheme.js +169 -0
  1238. data/closure-library/closure/goog/ui/hovercard.js +447 -0
  1239. data/closure-library/closure/goog/ui/hovercard_test.html +343 -0
  1240. data/closure-library/closure/goog/ui/hsvapalette.js +311 -0
  1241. data/closure-library/closure/goog/ui/hsvapalette_test.html +152 -0
  1242. data/closure-library/closure/goog/ui/hsvpalette.js +470 -0
  1243. data/closure-library/closure/goog/ui/hsvpalette_test.html +202 -0
  1244. data/closure-library/closure/goog/ui/idgenerator.js +57 -0
  1245. data/closure-library/closure/goog/ui/idletimer.js +299 -0
  1246. data/closure-library/closure/goog/ui/idletimer_test.html +100 -0
  1247. data/closure-library/closure/goog/ui/iframemask.js +256 -0
  1248. data/closure-library/closure/goog/ui/iframemask_test.html +230 -0
  1249. data/closure-library/closure/goog/ui/imagelessbuttonrenderer.js +204 -0
  1250. data/closure-library/closure/goog/ui/imagelessmenubuttonrenderer.js +202 -0
  1251. data/closure-library/closure/goog/ui/imagelessroundedcorner.js +971 -0
  1252. data/closure-library/closure/goog/ui/inputdatepicker.js +306 -0
  1253. data/closure-library/closure/goog/ui/inputdatepicker_test.html +109 -0
  1254. data/closure-library/closure/goog/ui/itemevent.js +50 -0
  1255. data/closure-library/closure/goog/ui/keyboardshortcuthandler.js +981 -0
  1256. data/closure-library/closure/goog/ui/keyboardshortcuthandler_test.html +671 -0
  1257. data/closure-library/closure/goog/ui/labelinput.js +439 -0
  1258. data/closure-library/closure/goog/ui/linkbuttonrenderer.js +67 -0
  1259. data/closure-library/closure/goog/ui/media/flashobject.js +629 -0
  1260. data/closure-library/closure/goog/ui/media/flashobject_test.html +236 -0
  1261. data/closure-library/closure/goog/ui/media/flickr.js +309 -0
  1262. data/closure-library/closure/goog/ui/media/flickr_test.html +90 -0
  1263. data/closure-library/closure/goog/ui/media/media.js +284 -0
  1264. data/closure-library/closure/goog/ui/media/media_test.html +161 -0
  1265. data/closure-library/closure/goog/ui/media/mediamodel.js +840 -0
  1266. data/closure-library/closure/goog/ui/media/mp3.js +225 -0
  1267. data/closure-library/closure/goog/ui/media/mp3_test.html +78 -0
  1268. data/closure-library/closure/goog/ui/media/photo.js +139 -0
  1269. data/closure-library/closure/goog/ui/media/photo_test.html +62 -0
  1270. data/closure-library/closure/goog/ui/media/picasa.js +317 -0
  1271. data/closure-library/closure/goog/ui/media/picasa_test.html +131 -0
  1272. data/closure-library/closure/goog/ui/media/vimeo.js +264 -0
  1273. data/closure-library/closure/goog/ui/media/vimeo_test.html +79 -0
  1274. data/closure-library/closure/goog/ui/media/youtube.js +328 -0
  1275. data/closure-library/closure/goog/ui/media/youtube_test.html +185 -0
  1276. data/closure-library/closure/goog/ui/menu.js +435 -0
  1277. data/closure-library/closure/goog/ui/menu_test.html +129 -0
  1278. data/closure-library/closure/goog/ui/menubase.js +191 -0
  1279. data/closure-library/closure/goog/ui/menubutton.js +809 -0
  1280. data/closure-library/closure/goog/ui/menubutton_test.html +440 -0
  1281. data/closure-library/closure/goog/ui/menubutton_test_frame.html +41 -0
  1282. data/closure-library/closure/goog/ui/menubuttonrenderer.js +226 -0
  1283. data/closure-library/closure/goog/ui/menubuttonrenderer_test.html +161 -0
  1284. data/closure-library/closure/goog/ui/menuheader.js +62 -0
  1285. data/closure-library/closure/goog/ui/menuheaderrenderer.js +55 -0
  1286. data/closure-library/closure/goog/ui/menuitem.js +154 -0
  1287. data/closure-library/closure/goog/ui/menuitem_test.html +506 -0
  1288. data/closure-library/closure/goog/ui/menuitemrenderer.js +353 -0
  1289. data/closure-library/closure/goog/ui/menuitemrenderer_test.html +190 -0
  1290. data/closure-library/closure/goog/ui/menurenderer.js +118 -0
  1291. data/closure-library/closure/goog/ui/menuseparator.js +51 -0
  1292. data/closure-library/closure/goog/ui/menuseparatorrenderer.js +102 -0
  1293. data/closure-library/closure/goog/ui/mockactivitymonitor.js +54 -0
  1294. data/closure-library/closure/goog/ui/nativebuttonrenderer.js +205 -0
  1295. data/closure-library/closure/goog/ui/nativebuttonrenderer_test.html +213 -0
  1296. data/closure-library/closure/goog/ui/offlineinstalldialog.js +1086 -0
  1297. data/closure-library/closure/goog/ui/offlinestatuscard.js +580 -0
  1298. data/closure-library/closure/goog/ui/offlinestatuscomponent.js +545 -0
  1299. data/closure-library/closure/goog/ui/option.js +67 -0
  1300. data/closure-library/closure/goog/ui/palette.js +528 -0
  1301. data/closure-library/closure/goog/ui/paletterenderer.js +318 -0
  1302. data/closure-library/closure/goog/ui/plaintextspellchecker.js +668 -0
  1303. data/closure-library/closure/goog/ui/plaintextspellchecker_test.html +240 -0
  1304. data/closure-library/closure/goog/ui/popup.js +410 -0
  1305. data/closure-library/closure/goog/ui/popup_test.html +137 -0
  1306. data/closure-library/closure/goog/ui/popupbase.js +721 -0
  1307. data/closure-library/closure/goog/ui/popupbase_test.html +186 -0
  1308. data/closure-library/closure/goog/ui/popupcolorpicker.js +441 -0
  1309. data/closure-library/closure/goog/ui/popupcolorpicker_test.html +71 -0
  1310. data/closure-library/closure/goog/ui/popupdatepicker.js +273 -0
  1311. data/closure-library/closure/goog/ui/popupmenu.js +539 -0
  1312. data/closure-library/closure/goog/ui/popupmenu_test.html +197 -0
  1313. data/closure-library/closure/goog/ui/progressbar.js +390 -0
  1314. data/closure-library/closure/goog/ui/prompt.js +307 -0
  1315. data/closure-library/closure/goog/ui/prompt_test.html +65 -0
  1316. data/closure-library/closure/goog/ui/rangemodel.js +301 -0
  1317. data/closure-library/closure/goog/ui/rangemodel_test.html +270 -0
  1318. data/closure-library/closure/goog/ui/ratings.js +441 -0
  1319. data/closure-library/closure/goog/ui/registry.js +166 -0
  1320. data/closure-library/closure/goog/ui/registry_test.html +236 -0
  1321. data/closure-library/closure/goog/ui/richtextspellchecker.js +600 -0
  1322. data/closure-library/closure/goog/ui/richtextspellchecker_test.html +224 -0
  1323. data/closure-library/closure/goog/ui/roundedcorners.js +694 -0
  1324. data/closure-library/closure/goog/ui/roundedpanel.js +609 -0
  1325. data/closure-library/closure/goog/ui/roundedpanel_test.html +57 -0
  1326. data/closure-library/closure/goog/ui/roundedtabrenderer.js +196 -0
  1327. data/closure-library/closure/goog/ui/scrollfloater.js +394 -0
  1328. data/closure-library/closure/goog/ui/scrollfloater_test.html +46 -0
  1329. data/closure-library/closure/goog/ui/select.js +397 -0
  1330. data/closure-library/closure/goog/ui/select_test.html +152 -0
  1331. data/closure-library/closure/goog/ui/selectionmenubutton.js +277 -0
  1332. data/closure-library/closure/goog/ui/selectionmenubutton_test.html +237 -0
  1333. data/closure-library/closure/goog/ui/selectionmodel.js +291 -0
  1334. data/closure-library/closure/goog/ui/separator.js +74 -0
  1335. data/closure-library/closure/goog/ui/serverchart.js +1791 -0
  1336. data/closure-library/closure/goog/ui/serverchart_test.html +598 -0
  1337. data/closure-library/closure/goog/ui/slider.js +125 -0
  1338. data/closure-library/closure/goog/ui/sliderbase.js +1087 -0
  1339. data/closure-library/closure/goog/ui/sliderbase_test.html +198 -0
  1340. data/closure-library/closure/goog/ui/splitbehavior.js +348 -0
  1341. data/closure-library/closure/goog/ui/splitbehavior_test.html +161 -0
  1342. data/closure-library/closure/goog/ui/splitpane.js +844 -0
  1343. data/closure-library/closure/goog/ui/splitpane_test.html +143 -0
  1344. data/closure-library/closure/goog/ui/style/app/buttonrenderer.js +204 -0
  1345. data/closure-library/closure/goog/ui/style/app/buttonrenderer_test.html +155 -0
  1346. data/closure-library/closure/goog/ui/style/app/menubuttonrenderer.js +227 -0
  1347. data/closure-library/closure/goog/ui/style/app/menubuttonrenderer_test.html +167 -0
  1348. data/closure-library/closure/goog/ui/style/app/primaryactionbuttonrenderer.js +88 -0
  1349. data/closure-library/closure/goog/ui/style/app/primaryactionbuttonrenderer_test.html +76 -0
  1350. data/closure-library/closure/goog/ui/submenu.js +660 -0
  1351. data/closure-library/closure/goog/ui/submenu_test.html +446 -0
  1352. data/closure-library/closure/goog/ui/submenurenderer.js +188 -0
  1353. data/closure-library/closure/goog/ui/tab.js +102 -0
  1354. data/closure-library/closure/goog/ui/tab_test.html +61 -0
  1355. data/closure-library/closure/goog/ui/tabbar.js +393 -0
  1356. data/closure-library/closure/goog/ui/tabbar_test.html +611 -0
  1357. data/closure-library/closure/goog/ui/tabbarrenderer.js +173 -0
  1358. data/closure-library/closure/goog/ui/tabbarrenderer_test.html +137 -0
  1359. data/closure-library/closure/goog/ui/tablesorter.js +304 -0
  1360. data/closure-library/closure/goog/ui/tablesorter_test.html +127 -0
  1361. data/closure-library/closure/goog/ui/tabpane.js +674 -0
  1362. data/closure-library/closure/goog/ui/tabpane_test.html +107 -0
  1363. data/closure-library/closure/goog/ui/tabrenderer.js +152 -0
  1364. data/closure-library/closure/goog/ui/tabrenderer_test.html +132 -0
  1365. data/closure-library/closure/goog/ui/textarea.js +573 -0
  1366. data/closure-library/closure/goog/ui/textarea_test.html +305 -0
  1367. data/closure-library/closure/goog/ui/textarearenderer.js +167 -0
  1368. data/closure-library/closure/goog/ui/togglebutton.js +58 -0
  1369. data/closure-library/closure/goog/ui/toolbar.js +45 -0
  1370. data/closure-library/closure/goog/ui/toolbarbutton.js +54 -0
  1371. data/closure-library/closure/goog/ui/toolbarbuttonrenderer.js +55 -0
  1372. data/closure-library/closure/goog/ui/toolbarcolormenubutton.js +57 -0
  1373. data/closure-library/closure/goog/ui/toolbarcolormenubuttonrenderer.js +95 -0
  1374. data/closure-library/closure/goog/ui/toolbarcolormenubuttonrenderer_test.html +66 -0
  1375. data/closure-library/closure/goog/ui/toolbarmenubutton.js +56 -0
  1376. data/closure-library/closure/goog/ui/toolbarmenubuttonrenderer.js +55 -0
  1377. data/closure-library/closure/goog/ui/toolbarrenderer.js +95 -0
  1378. data/closure-library/closure/goog/ui/toolbarselect.js +55 -0
  1379. data/closure-library/closure/goog/ui/toolbarseparator.js +51 -0
  1380. data/closure-library/closure/goog/ui/toolbarseparatorrenderer.js +87 -0
  1381. data/closure-library/closure/goog/ui/toolbartogglebutton.js +53 -0
  1382. data/closure-library/closure/goog/ui/tooltip.js +975 -0
  1383. data/closure-library/closure/goog/ui/tooltip_test.html +351 -0
  1384. data/closure-library/closure/goog/ui/tree/basenode.js +1457 -0
  1385. data/closure-library/closure/goog/ui/tree/basenode_test.html +218 -0
  1386. data/closure-library/closure/goog/ui/tree/treecontrol.js +656 -0
  1387. data/closure-library/closure/goog/ui/tree/treecontrol_test.html +113 -0
  1388. data/closure-library/closure/goog/ui/tree/treenode.js +102 -0
  1389. data/closure-library/closure/goog/ui/tree/typeahead.js +332 -0
  1390. data/closure-library/closure/goog/ui/tree/typeahead_test.html +133 -0
  1391. data/closure-library/closure/goog/ui/tristatemenuitem.js +185 -0
  1392. data/closure-library/closure/goog/ui/tristatemenuitemrenderer.js +86 -0
  1393. data/closure-library/closure/goog/ui/twothumbslider.js +134 -0
  1394. data/closure-library/closure/goog/ui/zippy.js +277 -0
  1395. data/closure-library/closure/goog/ui/zippy_test.html +223 -0
  1396. data/closure-library/closure/goog/uri/uri.js +1595 -0
  1397. data/closure-library/closure/goog/uri/uri_test.html +837 -0
  1398. data/closure-library/closure/goog/uri/utils.js +972 -0
  1399. data/closure-library/closure/goog/uri/utils_test.html +521 -0
  1400. data/closure-library/closure/goog/useragent/adobereader.js +90 -0
  1401. data/closure-library/closure/goog/useragent/adobereader_test.html +34 -0
  1402. data/closure-library/closure/goog/useragent/flash.js +113 -0
  1403. data/closure-library/closure/goog/useragent/flash_test.html +34 -0
  1404. data/closure-library/closure/goog/useragent/iphoto.js +86 -0
  1405. data/closure-library/closure/goog/useragent/jscript.js +94 -0
  1406. data/closure-library/closure/goog/useragent/jscript_test.html +65 -0
  1407. data/closure-library/closure/goog/useragent/picasa.js +111 -0
  1408. data/closure-library/closure/goog/useragent/platform.js +70 -0
  1409. data/closure-library/closure/goog/useragent/platform_test.html +108 -0
  1410. data/closure-library/closure/goog/useragent/product.js +253 -0
  1411. data/closure-library/closure/goog/useragent/product_isversion.js +99 -0
  1412. data/closure-library/closure/goog/useragent/product_test.html +322 -0
  1413. data/closure-library/closure/goog/useragent/useragent.js +464 -0
  1414. data/closure-library/closure/goog/useragent/useragent_test.html +290 -0
  1415. data/closure-library/closure/goog/window/window.js +206 -0
  1416. data/closure-library/closure/goog/window/window_test.html +185 -0
  1417. data/closure-library/third_party/closure/goog/base.js +2 -0
  1418. data/closure-library/third_party/closure/goog/caja/string/html/htmlparser.js +611 -0
  1419. data/closure-library/third_party/closure/goog/caja/string/html/htmlsanitizer.js +605 -0
  1420. data/closure-library/third_party/closure/goog/deps.js +26 -0
  1421. data/closure-library/third_party/closure/goog/dojo/dom/query.js +1532 -0
  1422. data/closure-library/third_party/closure/goog/dojo/dom/query_test.html +63 -0
  1423. data/closure-library/third_party/closure/goog/dojo/dom/query_test.js +160 -0
  1424. data/closure-library/third_party/closure/goog/jpeg_encoder/jpeg_encoder_basic.js +751 -0
  1425. data/closure-library/third_party/closure/goog/loremipsum/text/loremipsum.js +712 -0
  1426. data/closure-library/third_party/closure/goog/loremipsum/text/loremipsum_test.html +61 -0
  1427. data/closure-library/third_party/closure/goog/mochikit/async/deferred.js +530 -0
  1428. data/closure-library/third_party/closure/goog/mochikit/async/deferred_test.html +627 -0
  1429. data/closure-library/third_party/closure/goog/mochikit/async/deferredlist.js +199 -0
  1430. data/closure-library/third_party/closure/goog/mochikit/async/deferredlist_test.html +426 -0
  1431. data/closure-library/third_party/closure/goog/osapi/osapi.js +91 -0
  1432. data/closure-library/third_party/closure/goog/silverlight/AppManifest.xml +6 -0
  1433. data/closure-library/third_party/closure/goog/silverlight/AssemblyInfo.cs +35 -0
  1434. data/closure-library/third_party/closure/goog/silverlight/ClipboardButton.xaml +9 -0
  1435. data/closure-library/third_party/closure/goog/silverlight/ClipboardButton.xaml.cs +74 -0
  1436. data/closure-library/third_party/closure/goog/silverlight/ClipboardButtonApp.xaml +8 -0
  1437. data/closure-library/third_party/closure/goog/silverlight/ClipboardButtonApp.xaml.cs +75 -0
  1438. data/closure-library/third_party/closure/goog/silverlight/ClosureClipboardButton.csproj +108 -0
  1439. data/closure-library/third_party/closure/goog/silverlight/ClosureClipboardButton.csproj.user +29 -0
  1440. data/closure-library/third_party/closure/goog/silverlight/clipboardbutton.js +279 -0
  1441. data/closure-library/third_party/closure/goog/silverlight/silverlight.js +758 -0
  1442. data/closure-library/third_party/closure/goog/silverlight/supporteduseragent.js +138 -0
  1443. data/closure-library/third_party/closure/goog/silverlight/xap_files +0 -0
  1444. data/closure-templates/COPYING +202 -0
  1445. data/closure-templates/README +47 -0
  1446. data/closure-templates/SoyToJsSrcCompiler.jar +0 -0
  1447. data/closure-templates/soyutils.js +880 -0
  1448. data/closure-templates/soyutils_usegoog.js +308 -0
  1449. data/closure.gemspec +20 -0
  1450. data/config.ru +40 -0
  1451. data/java_src/ClosureScript.java +89 -0
  1452. data/java_src/make.rb +19 -0
  1453. data/lib/closure/beanshell.rb +80 -0
  1454. data/lib/closure/compiler.rb +184 -0
  1455. data/lib/closure/file_response.rb +90 -0
  1456. data/lib/closure/goog.rb +143 -0
  1457. data/lib/closure/middleware.rb +43 -0
  1458. data/lib/closure/sass.rb +56 -0
  1459. data/lib/closure/script.rb +139 -0
  1460. data/lib/closure/server.rb +83 -0
  1461. data/lib/closure/sources.rb +310 -0
  1462. data/lib/closure/templates.rb +156 -0
  1463. data/lib/closure/version.rb +20 -0
  1464. data/lib/closure.jar +0 -0
  1465. data/lib/closure.rb +134 -0
  1466. data/scripts/demos/compile.js.erb +8 -0
  1467. data/scripts/demos/compile.out +1 -0
  1468. data/scripts/demos/compiler.haml +17 -0
  1469. data/scripts/demos/compiler.js +12 -0
  1470. data/scripts/demos/deps.js.erb +1 -0
  1471. data/scripts/demos/externs.haml +16 -0
  1472. data/scripts/demos/externs.js.erb +8 -0
  1473. data/scripts/demos/externs.out +1 -0
  1474. data/scripts/demos/externs_jquery.externs +849 -0
  1475. data/scripts/demos/externs_jquery.js +167 -0
  1476. data/scripts/demos/externs_jquerytest.js +11 -0
  1477. data/scripts/demos/helloworld.haml +15 -0
  1478. data/scripts/demos/helloworld.js +58 -0
  1479. data/scripts/demos/helloworld.soy +45 -0
  1480. data/scripts/demos/index.haml +21 -0
  1481. data/scripts/demos/rails_ujs.haml +24 -0
  1482. data/scripts/examples/rails/ujs.js +136 -0
  1483. data/scripts/favicon.ico +0 -0
  1484. data/scripts/fixtures/_partial.haml +2 -0
  1485. data/scripts/fixtures/erb.html.erb +8 -0
  1486. data/scripts/fixtures/haml.haml +6 -0
  1487. data/scripts/fixtures/html.html +9 -0
  1488. data/scripts/fixtures/route_js.js.erb +1 -0
  1489. data/scripts/index.haml +14 -0
  1490. data/test/beanshell_test.rb +22 -0
  1491. data/test/server_test.rb +67 -0
  1492. data/test/sources_test.rb +41 -0
  1493. data/test/test_helper.rb +12 -0
  1494. metadata +1577 -0
@@ -0,0 +1,1532 @@
1
+ // Copyright 2005-2009, The Dojo Foundation
2
+ // Modifications Copyright 2008 The Closure Library Authors.
3
+ // All Rights Reserved.
4
+
5
+ /**
6
+ * @license Portions of this code are from the Dojo Toolkit, received by
7
+ * The Closure Library Authors under the BSD license. All other code is
8
+ * Copyright 2005-2009 The Closure Library Authors. All Rights Reserved.
9
+
10
+ The "New" BSD License:
11
+
12
+ Copyright (c) 2005-2009, The Dojo Foundation
13
+ All rights reserved.
14
+
15
+ Redistribution and use in source and binary forms, with or without
16
+ modification, are permitted provided that the following conditions are met:
17
+
18
+ * Redistributions of source code must retain the above copyright notice, this
19
+ list of conditions and the following disclaimer.
20
+ * Redistributions in binary form must reproduce the above copyright notice,
21
+ this list of conditions and the following disclaimer in the documentation
22
+ and/or other materials provided with the distribution.
23
+ * Neither the name of the Dojo Foundation nor the names of its contributors
24
+ may be used to endorse or promote products derived from this software
25
+ without specific prior written permission.
26
+
27
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
28
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
29
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
31
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
33
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
34
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
35
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
+ */
38
+
39
+ /**
40
+ * @fileoverview This code was ported from the Dojo Toolkit
41
+ http://dojotoolkit.org and modified slightly for Closure.
42
+ *
43
+ * goog.dom.query is a relatively full-featured CSS3 query function. It is
44
+ * designed to take any valid CSS3 selector and return the nodes matching
45
+ * the selector. To do this quickly, it processes queries in several
46
+ * steps, applying caching where profitable.
47
+ * The steps (roughly in reverse order of the way they appear in the code):
48
+ * 1.) check to see if we already have a "query dispatcher"
49
+ * - if so, use that with the given parameterization. Skip to step 4.
50
+ * 2.) attempt to determine which branch to dispatch the query to:
51
+ * - JS (optimized DOM iteration)
52
+ * - native (FF3.1, Safari 3.2+, Chrome, some IE 8 doctypes). If native,
53
+ * skip to step 4, using a stub dispatcher for QSA queries.
54
+ * 3.) tokenize and convert to executable "query dispatcher"
55
+ * assembled as a chain of "yes/no" test functions pertaining to
56
+ * a section of a simple query statement (".blah:nth-child(odd)"
57
+ * but not "div div", which is 2 simple statements).
58
+ * 4.) the resulting query dispatcher is called in the passed scope
59
+ * (by default the top-level document)
60
+ * - for DOM queries, this results in a recursive, top-down
61
+ * evaluation of nodes based on each simple query section
62
+ * - querySelectorAll is used instead of DOM where possible. If a query
63
+ * fails in this mode, it is re-run against the DOM evaluator and all
64
+ * future queries using the same selector evaluate against the DOM branch
65
+ * too.
66
+ * 5.) matched nodes are pruned to ensure they are unique
67
+ */
68
+
69
+ goog.provide('goog.dom.query');
70
+
71
+ goog.require('goog.array');
72
+ goog.require('goog.dom');
73
+ goog.require('goog.functions');
74
+ goog.require('goog.string');
75
+ goog.require('goog.userAgent');
76
+
77
+ /**
78
+ * Returns nodes which match the given CSS3 selector, searching the
79
+ * entire document by default but optionally taking a node to scope
80
+ * the search by.
81
+ *
82
+ * dojo.query() is the swiss army knife of DOM node manipulation in
83
+ * Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's
84
+ * "$" function, dojo.query provides robust, high-performance
85
+ * CSS-based node selector support with the option of scoping searches
86
+ * to a particular sub-tree of a document.
87
+ *
88
+ * Supported Selectors:
89
+ * --------------------
90
+ *
91
+ * dojo.query() supports a rich set of CSS3 selectors, including:
92
+ *
93
+ * * class selectors (e.g., `.foo`)
94
+ * * node type selectors like `span`
95
+ * * ` ` descendant selectors
96
+ * * `>` child element selectors
97
+ * * `#foo` style ID selectors
98
+ * * `*` universal selector
99
+ * * `~`, the immediately preceeded-by sibling selector
100
+ * * `+`, the preceeded-by sibling selector
101
+ * * attribute queries:
102
+ * | * `[foo]` attribute presence selector
103
+ * | * `[foo='bar']` attribute value exact match
104
+ * | * `[foo~='bar']` attribute value list item match
105
+ * | * `[foo^='bar']` attribute start match
106
+ * | * `[foo$='bar']` attribute end match
107
+ * | * `[foo*='bar']` attribute substring match
108
+ * * `:first-child`, `:last-child` positional selectors
109
+ * * `:empty` content emtpy selector
110
+ * * `:empty` content emtpy selector
111
+ * * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations
112
+ * * `:nth-child(even)`, `:nth-child(odd)` positional selectors
113
+ * * `:not(...)` negation pseudo selectors
114
+ *
115
+ * Any legal combination of these selectors will work with
116
+ * `dojo.query()`, including compound selectors ("," delimited).
117
+ * Very complex and useful searches can be constructed with this
118
+ * palette of selectors and when combined with functions for
119
+ * maniplation presented by dojo.NodeList, many types of DOM
120
+ * manipulation operations become very straightforward.
121
+ *
122
+ * Unsupported Selectors:
123
+ * ----------------------
124
+ *
125
+ * While dojo.query handles many CSS3 selectors, some fall outside of
126
+ * what's resaonable for a programmatic node querying engine to
127
+ * handle. Currently unsupported selectors include:
128
+ *
129
+ * * namespace-differentiated selectors of any form
130
+ * * all `::` pseduo-element selectors
131
+ * * certain pseudo-selectors which don't get a lot of day-to-day use:
132
+ * | * `:root`, `:lang()`, `:target`, `:focus`
133
+ * * all visual and state selectors:
134
+ * | * `:root`, `:active`, `:hover`, `:visisted`, `:link`,
135
+ * `:enabled`, `:disabled`, `:checked`
136
+ * * `:*-of-type` pseudo selectors
137
+ *
138
+ * dojo.query and XML Documents:
139
+ * -----------------------------
140
+ *
141
+ * `dojo.query` currently only supports searching XML documents
142
+ * whose tags and attributes are 100% lower-case. This is a known
143
+ * limitation and will [be addressed soon]
144
+ * (http://trac.dojotoolkit.org/ticket/3866)
145
+ *
146
+ * Non-selector Queries:
147
+ * ---------------------
148
+ *
149
+ * If something other than a String is passed for the query,
150
+ * `dojo.query` will return a new `dojo.NodeList` constructed from
151
+ * that parameter alone and all further processing will stop. This
152
+ * means that if you have a reference to a node or NodeList, you
153
+ * can quickly construct a new NodeList from the original by
154
+ * calling `dojo.query(node)` or `dojo.query(list)`.
155
+ *
156
+ * example:
157
+ * search the entire document for elements with the class "foo":
158
+ * | dojo.query(".foo");
159
+ * these elements will match:
160
+ * | <span class="foo"></span>
161
+ * | <span class="foo bar"></span>
162
+ * | <p class="thud foo"></p>
163
+ * example:
164
+ * search the entire document for elements with the classes "foo" *and*
165
+ * "bar":
166
+ * | dojo.query(".foo.bar");
167
+ * these elements will match:
168
+ * | <span class="foo bar"></span>
169
+ * while these will not:
170
+ * | <span class="foo"></span>
171
+ * | <p class="thud foo"></p>
172
+ * example:
173
+ * find `<span>` elements which are descendants of paragraphs and
174
+ * which have a "highlighted" class:
175
+ * | dojo.query("p span.highlighted");
176
+ * the innermost span in this fragment matches:
177
+ * | <p class="foo">
178
+ * | <span>...
179
+ * | <span class="highlighted foo bar">...</span>
180
+ * | </span>
181
+ * | </p>
182
+ * example:
183
+ * find all odd table rows inside of the table
184
+ * `#tabular_data`, using the `>` (direct child) selector to avoid
185
+ * affecting any nested tables:
186
+ * | dojo.query("#tabular_data > tbody > tr:nth-child(odd)");
187
+ *
188
+ * @param {string} query The CSS3 expression to match against. For details
189
+ * on the syntax of CSS3 selectors, see
190
+ * http://www.w3.org/TR/css3-selectors/#selectors.
191
+ * @param {(string|Node)=} opt_root A Node (or node id) to scope the search
192
+ * from (optional).
193
+ * @return { {length: number} } The elements that matched the query.
194
+ */
195
+ goog.dom.query = (function() {
196
+ ////////////////////////////////////////////////////////////////////////
197
+ // Global utilities
198
+ ////////////////////////////////////////////////////////////////////////
199
+
200
+ var cssCaseBug = (goog.userAgent.WEBKIT &&
201
+ ((goog.dom.getDocument().compatMode) == 'BackCompat')
202
+ );
203
+
204
+ // On browsers that support the "children" collection we can avoid a lot of
205
+ // iteration on chaff (non-element) nodes.
206
+ var childNodesName = !!goog.dom.getDocument().firstChild['children'] ?
207
+ 'children' :
208
+ 'childNodes';
209
+
210
+ var specials = '>~+';
211
+
212
+ // Global thunk to determine whether we should treat the current query as
213
+ // case sensitive or not. This switch is flipped by the query evaluator based
214
+ // on the document passed as the context to search.
215
+ var caseSensitive = false;
216
+
217
+
218
+ ////////////////////////////////////////////////////////////////////////
219
+ // Tokenizer
220
+ ////////////////////////////////////////////////////////////////////////
221
+
222
+ var getQueryParts = function(query) {
223
+ // summary:
224
+ // state machine for query tokenization
225
+ // description:
226
+ // instead of using a brittle and slow regex-based CSS parser,
227
+ // dojo.query implements an AST-style query representation. This
228
+ // representation is only generated once per query. For example,
229
+ // the same query run multiple times or under different root nodes
230
+ // does not re-parse the selector expression but instead uses the
231
+ // cached data structure. The state machine implemented here
232
+ // terminates on the last " " (space) charachter and returns an
233
+ // ordered array of query component structures (or "parts"). Each
234
+ // part represents an operator or a simple CSS filtering
235
+ // expression. The structure for parts is documented in the code
236
+ // below.
237
+
238
+
239
+ // NOTE:
240
+ // this code is designed to run fast and compress well. Sacrifices
241
+ // to readibility and maintainability have been made.
242
+ if (specials.indexOf(query.slice(-1)) >= 0) {
243
+ // If we end with a ">", "+", or "~", that means we're implicitly
244
+ // searching all children, so make it explicit.
245
+ query += ' * '
246
+ } else {
247
+ // if you have not provided a terminator, one will be provided for
248
+ // you...
249
+ query += ' ';
250
+ }
251
+
252
+ var ts = function(/*Integer*/ s, /*Integer*/ e) {
253
+ // trim and slice.
254
+
255
+ // take an index to start a string slice from and an end position
256
+ // and return a trimmed copy of that sub-string
257
+ return goog.string.trim(query.slice(s, e));
258
+ };
259
+
260
+ // The overall data graph of the full query, as represented by queryPart
261
+ // objects.
262
+ var queryParts = [];
263
+
264
+
265
+ // state keeping vars
266
+ var inBrackets = -1,
267
+ inParens = -1,
268
+ inMatchFor = -1,
269
+ inPseudo = -1,
270
+ inClass = -1,
271
+ inId = -1,
272
+ inTag = -1,
273
+ lc = '',
274
+ cc = '',
275
+ pStart;
276
+
277
+ // iteration vars
278
+ var x = 0, // index in the query
279
+ ql = query.length,
280
+ currentPart = null, // data structure representing the entire clause
281
+ cp = null; // the current pseudo or attr matcher
282
+
283
+ // several temporary variables are assigned to this structure durring a
284
+ // potential sub-expression match:
285
+ // attr:
286
+ // a string representing the current full attribute match in a
287
+ // bracket expression
288
+ // type:
289
+ // if there's an operator in a bracket expression, this is
290
+ // used to keep track of it
291
+ // value:
292
+ // the internals of parenthetical expression for a pseudo. for
293
+ // :nth-child(2n+1), value might be '2n+1'
294
+
295
+ var endTag = function() {
296
+ // called when the tokenizer hits the end of a particular tag name.
297
+ // Re-sets state variables for tag matching and sets up the matcher
298
+ // to handle the next type of token (tag or operator).
299
+ if (inTag >= 0) {
300
+ var tv = (inTag == x) ? null : ts(inTag, x);
301
+ if (specials.indexOf(tv) < 0) {
302
+ currentPart.tag = tv;
303
+ } else {
304
+ currentPart.oper = tv;
305
+ }
306
+ inTag = -1;
307
+ }
308
+ };
309
+
310
+ var endId = function() {
311
+ // Called when the tokenizer might be at the end of an ID portion of a
312
+ // match.
313
+ if (inId >= 0) {
314
+ currentPart.id = ts(inId, x).replace(/\\/g, '');
315
+ inId = -1;
316
+ }
317
+ };
318
+
319
+ var endClass = function() {
320
+ // Called when the tokenizer might be at the end of a class name
321
+ // match. CSS allows for multiple classes, so we augment the
322
+ // current item with another class in its list.
323
+ if (inClass >= 0) {
324
+ currentPart.classes.push(ts(inClass + 1, x).replace(/\\/g, ''));
325
+ inClass = -1;
326
+ }
327
+ };
328
+
329
+ var endAll = function() {
330
+ // at the end of a simple fragment, so wall off the matches
331
+ endId(); endTag(); endClass();
332
+ };
333
+
334
+ var endPart = function() {
335
+ endAll();
336
+ if (inPseudo >= 0) {
337
+ currentPart.pseudos.push({ name: ts(inPseudo + 1, x) });
338
+ }
339
+ // Hint to the selector engine to tell it whether or not it
340
+ // needs to do any iteration. Many simple selectors don't, and
341
+ // we can avoid significant construction-time work by advising
342
+ // the system to skip them.
343
+ currentPart.loops = currentPart.pseudos.length ||
344
+ currentPart.attrs.length ||
345
+ currentPart.classes.length;
346
+
347
+ // save the full expression as a string
348
+ currentPart.oquery = currentPart.query = ts(pStart, x);
349
+
350
+
351
+ // otag/tag are hints to suggest to the system whether or not
352
+ // it's an operator or a tag. We save a copy of otag since the
353
+ // tag name is cast to upper-case in regular HTML matches. The
354
+ // system has a global switch to figure out if the current
355
+ // expression needs to be case sensitive or not and it will use
356
+ // otag or tag accordingly
357
+ currentPart.otag = currentPart.tag = (currentPart.oper) ?
358
+ null :
359
+ (currentPart.tag || '*');
360
+
361
+ if (currentPart.tag) {
362
+ // if we're in a case-insensitive HTML doc, we likely want
363
+ // the toUpperCase when matching on element.tagName. If we
364
+ // do it here, we can skip the string op per node
365
+ // comparison
366
+ currentPart.tag = currentPart.tag.toUpperCase();
367
+ }
368
+
369
+ // add the part to the list
370
+ if (queryParts.length && (queryParts[queryParts.length - 1].oper)) {
371
+ // operators are always infix, so we remove them from the
372
+ // list and attach them to the next match. The evaluator is
373
+ // responsible for sorting out how to handle them.
374
+ currentPart.infixOper = queryParts.pop();
375
+ currentPart.query = currentPart.infixOper.query + ' ' +
376
+ currentPart.query;
377
+ }
378
+ queryParts.push(currentPart);
379
+
380
+ currentPart = null;
381
+ }
382
+
383
+ // iterate over the query, charachter by charachter, building up a
384
+ // list of query part objects
385
+ for (; lc = cc, cc = query.charAt(x), x < ql; x++) {
386
+ // cc: the current character in the match
387
+ // lc: the last charachter (if any)
388
+
389
+ // someone is trying to escape something, so don't try to match any
390
+ // fragments. We assume we're inside a literal.
391
+ if (lc == '\\') {
392
+ continue;
393
+ }
394
+ if (!currentPart) { // a part was just ended or none has yet been created
395
+ // NOTE: I hate all this alloc, but it's shorter than writing tons of
396
+ // if's
397
+ pStart = x;
398
+ // rules describe full CSS sub-expressions, like:
399
+ // #someId
400
+ // .className:first-child
401
+ // but not:
402
+ // thinger > div.howdy[type=thinger]
403
+ // the indidual components of the previous query would be
404
+ // split into 3 parts that would be represented a structure
405
+ // like:
406
+ // [
407
+ // {
408
+ // query: 'thinger',
409
+ // tag: 'thinger',
410
+ // },
411
+ // {
412
+ // query: 'div.howdy[type=thinger]',
413
+ // classes: ['howdy'],
414
+ // infixOper: {
415
+ // query: '>',
416
+ // oper: '>',
417
+ // }
418
+ // },
419
+ // ]
420
+ currentPart = {
421
+ query: null, // the full text of the part's rule
422
+ pseudos: [], // CSS supports multiple pseud-class matches in a single
423
+ // rule
424
+ attrs: [], // CSS supports multi-attribute match, so we need an array
425
+ classes: [], // class matches may be additive,
426
+ // e.g.: .thinger.blah.howdy
427
+ tag: null, // only one tag...
428
+ oper: null, // ...or operator per component. Note that these wind up
429
+ // being exclusive.
430
+ id: null, // the id component of a rule
431
+ getTag: function() {
432
+ return (caseSensitive) ? this.otag : this.tag;
433
+ }
434
+ };
435
+
436
+ // if we don't have a part, we assume we're going to start at
437
+ // the beginning of a match, which should be a tag name. This
438
+ // might fault a little later on, but we detect that and this
439
+ // iteration will still be fine.
440
+ inTag = x;
441
+ }
442
+
443
+ if (inBrackets >= 0) {
444
+ // look for a the close first
445
+ if (cc == ']') { // if we're in a [...] clause and we end, do assignment
446
+ if (!cp.attr) {
447
+ // no attribute match was previously begun, so we
448
+ // assume this is an attribute existance match in the
449
+ // form of [someAttributeName]
450
+ cp.attr = ts(inBrackets + 1, x);
451
+ } else {
452
+ // we had an attribute already, so we know that we're
453
+ // matching some sort of value, as in [attrName=howdy]
454
+ cp.matchFor = ts((inMatchFor || inBrackets + 1), x);
455
+ }
456
+ var cmf = cp.matchFor;
457
+ if (cmf) {
458
+ // try to strip quotes from the matchFor value. We want
459
+ // [attrName=howdy] to match the same
460
+ // as [attrName = 'howdy' ]
461
+ if ((cmf.charAt(0) == '"') || (cmf.charAt(0) == "'")) {
462
+ cp.matchFor = cmf.slice(1, -1);
463
+ }
464
+ }
465
+ // end the attribute by adding it to the list of attributes.
466
+ currentPart.attrs.push(cp);
467
+ cp = null; // necessary?
468
+ inBrackets = inMatchFor = -1;
469
+ } else if (cc == '=') {
470
+ // if the last char was an operator prefix, make sure we
471
+ // record it along with the '=' operator.
472
+ var addToCc = ('|~^$*'.indexOf(lc) >= 0) ? lc : '';
473
+ cp.type = addToCc + cc;
474
+ cp.attr = ts(inBrackets + 1, x - addToCc.length);
475
+ inMatchFor = x + 1;
476
+ }
477
+ // now look for other clause parts
478
+ } else if (inParens >= 0) {
479
+ // if we're in a parenthetical expression, we need to figure
480
+ // out if it's attached to a pseduo-selector rule like
481
+ // :nth-child(1)
482
+ if (cc == ')') {
483
+ if (inPseudo >= 0) {
484
+ cp.value = ts(inParens + 1, x);
485
+ }
486
+ inPseudo = inParens = -1;
487
+ }
488
+ } else if (cc == '#') {
489
+ // start of an ID match
490
+ endAll();
491
+ inId = x + 1;
492
+ } else if (cc == '.') {
493
+ // start of a class match
494
+ endAll();
495
+ inClass = x;
496
+ } else if (cc == ':') {
497
+ // start of a pseudo-selector match
498
+ endAll();
499
+ inPseudo = x;
500
+ } else if (cc == '[') {
501
+ // start of an attribute match.
502
+ endAll();
503
+ inBrackets = x;
504
+ // provide a new structure for the attribute match to fill-in
505
+ cp = {
506
+ /*=====
507
+ attr: null, type: null, matchFor: null
508
+ =====*/
509
+ };
510
+ } else if (cc == '(') {
511
+ // we really only care if we've entered a parenthetical
512
+ // expression if we're already inside a pseudo-selector match
513
+ if (inPseudo >= 0) {
514
+ // provide a new structure for the pseudo match to fill-in
515
+ cp = {
516
+ name: ts(inPseudo + 1, x),
517
+ value: null
518
+ }
519
+ currentPart.pseudos.push(cp);
520
+ }
521
+ inParens = x;
522
+ } else if (
523
+ (cc == ' ') &&
524
+ // if it's a space char and the last char is too, consume the
525
+ // current one without doing more work
526
+ (lc != cc)
527
+ ) {
528
+ endPart();
529
+ }
530
+ }
531
+ return queryParts;
532
+ };
533
+
534
+
535
+ ////////////////////////////////////////////////////////////////////////
536
+ // DOM query infrastructure
537
+ ////////////////////////////////////////////////////////////////////////
538
+
539
+ var agree = function(first, second) {
540
+ // the basic building block of the yes/no chaining system. agree(f1,
541
+ // f2) generates a new function which returns the boolean results of
542
+ // both of the passed functions to a single logical-anded result. If
543
+ // either are not possed, the other is used exclusively.
544
+ if (!first) {
545
+ return second;
546
+ }
547
+ if (!second) {
548
+ return first;
549
+ }
550
+
551
+ return function() {
552
+ return first.apply(window, arguments) && second.apply(window, arguments);
553
+ }
554
+ };
555
+
556
+ /**
557
+ * @param {Array=} opt_arr
558
+ */
559
+ function getArr(i, opt_arr) {
560
+ // helps us avoid array alloc when we don't need it
561
+ var r = opt_arr || [];
562
+ if (i) {
563
+ r.push(i);
564
+ }
565
+ return r;
566
+ };
567
+
568
+ var isElement = function(n) {
569
+ return (1 == n.nodeType);
570
+ };
571
+
572
+ // FIXME: need to coalesce getAttr with defaultGetter
573
+ var blank = '';
574
+ var getAttr = function(elem, attr) {
575
+ if (!elem) {
576
+ return blank;
577
+ }
578
+ if (attr == 'class') {
579
+ return elem.className || blank;
580
+ }
581
+ if (attr == 'for') {
582
+ return elem.htmlFor || blank;
583
+ }
584
+ if (attr == 'style') {
585
+ return elem.style.cssText || blank;
586
+ }
587
+ return (caseSensitive ? elem.getAttribute(attr) :
588
+ elem.getAttribute(attr, 2)) || blank;
589
+ };
590
+
591
+ var attrs = {
592
+ '*=': function(attr, value) {
593
+ return function(elem) {
594
+ // E[foo*="bar"]
595
+ // an E element whose "foo" attribute value contains
596
+ // the substring "bar"
597
+ return (getAttr(elem, attr).indexOf(value) >= 0);
598
+ }
599
+ },
600
+ '^=': function(attr, value) {
601
+ // E[foo^="bar"]
602
+ // an E element whose "foo" attribute value begins exactly
603
+ // with the string "bar"
604
+ return function(elem) {
605
+ return (getAttr(elem, attr).indexOf(value) == 0);
606
+ }
607
+ },
608
+ '$=': function(attr, value) {
609
+ // E[foo$="bar"]
610
+ // an E element whose "foo" attribute value ends exactly
611
+ // with the string "bar"
612
+ var tval = ' ' + value;
613
+ return function(elem) {
614
+ var ea = ' ' + getAttr(elem, attr);
615
+ return (ea.lastIndexOf(value) == (ea.length - value.length));
616
+ }
617
+ },
618
+ '~=': function(attr, value) {
619
+ // E[foo~="bar"]
620
+ // an E element whose "foo" attribute value is a list of
621
+ // space-separated values, one of which is exactly equal
622
+ // to "bar"
623
+
624
+ var tval = ' ' + value + ' ';
625
+ return function(elem) {
626
+ var ea = ' ' + getAttr(elem, attr) + ' ';
627
+ return (ea.indexOf(tval) >= 0);
628
+ }
629
+ },
630
+ '|=': function(attr, value) {
631
+ // E[hreflang|="en"]
632
+ // an E element whose "hreflang" attribute has a
633
+ // hyphen-separated list of values beginning (from the
634
+ // left) with "en"
635
+ value = ' ' + value;
636
+ return function(elem) {
637
+ var ea = ' ' + getAttr(elem, attr);
638
+ return (
639
+ (ea == value) ||
640
+ (ea.indexOf(value + '-') == 0)
641
+ );
642
+ }
643
+ },
644
+ '=': function(attr, value) {
645
+ return function(elem) {
646
+ return (getAttr(elem, attr) == value);
647
+ }
648
+ }
649
+ };
650
+
651
+ // avoid testing for node type if we can. Defining this in the negative
652
+ // here to avoid negation in the fast path.
653
+ var noNextElementSibling = (
654
+ typeof goog.dom.getDocument().firstChild.nextElementSibling == 'undefined'
655
+ );
656
+ var nSibling = !noNextElementSibling ? 'nextElementSibling' : 'nextSibling';
657
+ var pSibling = !noNextElementSibling ?
658
+ 'previousElementSibling' :
659
+ 'previousSibling';
660
+ var simpleNodeTest = (noNextElementSibling ? isElement : goog.functions.TRUE);
661
+
662
+ var _lookLeft = function(node) {
663
+ while (node = node[pSibling]) {
664
+ if (simpleNodeTest(node)) {
665
+ return false;
666
+ }
667
+ }
668
+ return true;
669
+ };
670
+
671
+ var _lookRight = function(node) {
672
+ while (node = node[nSibling]) {
673
+ if (simpleNodeTest(node)) {
674
+ return false;
675
+ }
676
+ }
677
+ return true;
678
+ };
679
+
680
+ var getNodeIndex = function(node) {
681
+ var root = node.parentNode;
682
+ var i = 0,
683
+ tret = root[childNodesName],
684
+ ci = (node['_i'] || -1),
685
+ cl = (root['_l'] || -1);
686
+
687
+ if (!tret) {
688
+ return -1;
689
+ }
690
+ var l = tret.length;
691
+
692
+ // we calcuate the parent length as a cheap way to invalidate the
693
+ // cache. It's not 100% accurate, but it's much more honest than what
694
+ // other libraries do
695
+ if (cl == l && ci >= 0 && cl >= 0) {
696
+ // if it's legit, tag and release
697
+ return ci;
698
+ }
699
+
700
+ // else re-key things
701
+ root['_l'] = l;
702
+ ci = -1;
703
+ var te = root['firstElementChild'] || root['firstChild'];
704
+ for (; te; te = te[nSibling]) {
705
+ if (simpleNodeTest(te)) {
706
+ te['_i'] = ++i;
707
+ if (node === te) {
708
+ // NOTE:
709
+ // shortcuting the return at this step in indexing works
710
+ // very well for benchmarking but we avoid it here since
711
+ // it leads to potential O(n^2) behavior in sequential
712
+ // getNodexIndex operations on a previously un-indexed
713
+ // parent. We may revisit this at a later time, but for
714
+ // now we just want to get the right answer more often
715
+ // than not.
716
+ ci = i;
717
+ }
718
+ }
719
+ }
720
+ return ci;
721
+ };
722
+
723
+ var isEven = function(elem) {
724
+ return !((getNodeIndex(elem)) % 2);
725
+ };
726
+
727
+ var isOdd = function(elem) {
728
+ return (getNodeIndex(elem)) % 2;
729
+ };
730
+
731
+ var pseudos = {
732
+ 'checked': function(name, condition) {
733
+ return function(elem) {
734
+ return elem.checked || elem.attributes['checked'];
735
+ }
736
+ },
737
+ 'first-child': function() {
738
+ return _lookLeft;
739
+ },
740
+ 'last-child': function() {
741
+ return _lookRight;
742
+ },
743
+ 'only-child': function(name, condition) {
744
+ return function(node) {
745
+ if (!_lookLeft(node)) {
746
+ return false;
747
+ }
748
+ if (!_lookRight(node)) {
749
+ return false;
750
+ }
751
+ return true;
752
+ };
753
+ },
754
+ 'empty': function(name, condition) {
755
+ return function(elem) {
756
+ // DomQuery and jQuery get this wrong, oddly enough.
757
+ // The CSS 3 selectors spec is pretty explicit about it, too.
758
+ var cn = elem.childNodes;
759
+ var cnl = elem.childNodes.length;
760
+ // if(!cnl) { return true; }
761
+ for (var x = cnl - 1; x >= 0; x--) {
762
+ var nt = cn[x].nodeType;
763
+ if ((nt === 1) || (nt == 3)) {
764
+ return false;
765
+ }
766
+ }
767
+ return true;
768
+ }
769
+ },
770
+ 'contains': function(name, condition) {
771
+ var cz = condition.charAt(0);
772
+ if (cz == '"' || cz == "'") { // Remove quotes.
773
+ condition = condition.slice(1, -1);
774
+ }
775
+ return function(elem) {
776
+ return (elem.innerHTML.indexOf(condition) >= 0);
777
+ }
778
+ },
779
+ 'not': function(name, condition) {
780
+ var p = getQueryParts(condition)[0];
781
+ var ignores = { el: 1 };
782
+ if (p.tag != '*') {
783
+ ignores.tag = 1;
784
+ }
785
+ if (!p.classes.length) {
786
+ ignores.classes = 1;
787
+ }
788
+ var ntf = getSimpleFilterFunc(p, ignores);
789
+ return function(elem) {
790
+ return !ntf(elem);
791
+ }
792
+ },
793
+ 'nth-child': function(name, condition) {
794
+ function pi(n) {
795
+ return parseInt(n, 10);
796
+ }
797
+ // avoid re-defining function objects if we can
798
+ if (condition == 'odd') {
799
+ return isOdd;
800
+ } else if (condition == 'even') {
801
+ return isEven;
802
+ }
803
+ // FIXME: can we shorten this?
804
+ if (condition.indexOf('n') != -1) {
805
+ var tparts = condition.split('n', 2);
806
+ var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1;
807
+ var idx = tparts[1] ? pi(tparts[1]) : 0;
808
+ var lb = 0, ub = -1;
809
+ if (pred > 0) {
810
+ if (idx < 0) {
811
+ idx = (idx % pred) && (pred + (idx % pred));
812
+ } else if (idx > 0) {
813
+ if (idx >= pred) {
814
+ lb = idx - idx % pred;
815
+ }
816
+ idx = idx % pred;
817
+ }
818
+ } else if (pred < 0) {
819
+ pred *= -1;
820
+ // idx has to be greater than 0 when pred is negative;
821
+ // shall we throw an error here?
822
+ if (idx > 0) {
823
+ ub = idx;
824
+ idx = idx % pred;
825
+ }
826
+ }
827
+ if (pred > 0) {
828
+ return function(elem) {
829
+ var i = getNodeIndex(elem);
830
+ return (i >= lb) && (ub < 0 || i <= ub) && ((i % pred) == idx);
831
+ }
832
+ } else {
833
+ condition = idx;
834
+ }
835
+ }
836
+ var ncount = pi(condition);
837
+ return function(elem) {
838
+ return (getNodeIndex(elem) == ncount);
839
+ }
840
+ }
841
+ };
842
+
843
+ var defaultGetter = (goog.userAgent.IE) ? function(cond) {
844
+ var clc = cond.toLowerCase();
845
+ if (clc == 'class') {
846
+ cond = 'className';
847
+ }
848
+ return function(elem) {
849
+ return caseSensitive ? elem.getAttribute(cond) : elem[cond] || elem[clc];
850
+ }
851
+ } : function(cond) {
852
+ return function(elem) {
853
+ return elem && elem.getAttribute && elem.hasAttribute(cond);
854
+ }
855
+ };
856
+
857
+ var getSimpleFilterFunc = function(query, ignores) {
858
+ // Generates a node tester function based on the passed query part. The
859
+ // query part is one of the structures generatd by the query parser when it
860
+ // creates the query AST. The 'ignores' object specifies which (if any)
861
+ // tests to skip, allowing the system to avoid duplicating work where it
862
+ // may have already been taken into account by other factors such as how
863
+ // the nodes to test were fetched in the first place.
864
+ if (!query) {
865
+ return goog.functions.TRUE;
866
+ }
867
+ ignores = ignores || {};
868
+
869
+ var ff = null;
870
+
871
+ if (!ignores.el) {
872
+ ff = agree(ff, isElement);
873
+ }
874
+
875
+ if (!ignores.tag) {
876
+ if (query.tag != '*') {
877
+ ff = agree(ff, function(elem) {
878
+ return (elem && (elem.tagName == query.getTag()));
879
+ });
880
+ }
881
+ }
882
+
883
+ if (!ignores.classes) {
884
+ goog.array.forEach(query.classes, function(cname, idx, arr) {
885
+ // Get the class name.
886
+ var re = new RegExp('(?:^|\\s)' + cname + '(?:\\s|$)');
887
+ ff = agree(ff, function(elem) {
888
+ return re.test(elem.className);
889
+ });
890
+ ff.count = idx;
891
+ });
892
+ }
893
+
894
+ if (!ignores.pseudos) {
895
+ goog.array.forEach(query.pseudos, function(pseudo) {
896
+ var pn = pseudo.name;
897
+ if (pseudos[pn]) {
898
+ ff = agree(ff, pseudos[pn](pn, pseudo.value));
899
+ }
900
+ });
901
+ }
902
+
903
+ if (!ignores.attrs) {
904
+ goog.array.forEach(query.attrs, function(attr) {
905
+ var matcher;
906
+ var a = attr.attr;
907
+ // type, attr, matchFor
908
+ if (attr.type && attrs[attr.type]) {
909
+ matcher = attrs[attr.type](a, attr.matchFor);
910
+ } else if (a.length) {
911
+ matcher = defaultGetter(a);
912
+ }
913
+ if (matcher) {
914
+ ff = agree(ff, matcher);
915
+ }
916
+ });
917
+ }
918
+
919
+ if (!ignores.id) {
920
+ if (query.id) {
921
+ ff = agree(ff, function(elem) {
922
+ return (!!elem && (elem.id == query.id));
923
+ });
924
+ }
925
+ }
926
+
927
+ if (!ff) {
928
+ if (!('default' in ignores)) {
929
+ ff = goog.functions.TRUE;
930
+ }
931
+ }
932
+ return ff;
933
+ };
934
+
935
+ var nextSiblingIterator = function(filterFunc) {
936
+ return function(node, ret, bag) {
937
+ while (node = node[nSibling]) {
938
+ if (noNextElementSibling && (!isElement(node))) {
939
+ continue;
940
+ }
941
+ if (
942
+ (!bag || _isUnique(node, bag)) &&
943
+ filterFunc(node)
944
+ ) {
945
+ ret.push(node);
946
+ }
947
+ break;
948
+ }
949
+ return ret;
950
+ };
951
+ };
952
+
953
+ var nextSiblingsIterator = function(filterFunc) {
954
+ return function(root, ret, bag) {
955
+ var te = root[nSibling];
956
+ while (te) {
957
+ if (simpleNodeTest(te)) {
958
+ if (bag && !_isUnique(te, bag)) {
959
+ break;
960
+ }
961
+ if (filterFunc(te)) {
962
+ ret.push(te);
963
+ }
964
+ }
965
+ te = te[nSibling];
966
+ }
967
+ return ret;
968
+ };
969
+ };
970
+
971
+ // Get an array of child *elements*, skipping text and comment nodes
972
+ var _childElements = function(filterFunc) {
973
+ filterFunc = filterFunc || goog.functions.TRUE;
974
+ return function(root, ret, bag) {
975
+ var te, x = 0, tret = root[childNodesName];
976
+ while (te = tret[x++]) {
977
+ if (
978
+ simpleNodeTest(te) &&
979
+ (!bag || _isUnique(te, bag)) &&
980
+ (filterFunc(te, x))
981
+ ) {
982
+ ret.push(te);
983
+ }
984
+ }
985
+ return ret;
986
+ };
987
+ };
988
+
989
+ // test to see if node is below root
990
+ var _isDescendant = function(node, root) {
991
+ var pn = node.parentNode;
992
+ while (pn) {
993
+ if (pn == root) {
994
+ break;
995
+ }
996
+ pn = pn.parentNode;
997
+ }
998
+ return !!pn;
999
+ };
1000
+
1001
+ var _getElementsFuncCache = {};
1002
+
1003
+ var getElementsFunc = function(query) {
1004
+ var retFunc = _getElementsFuncCache[query.query];
1005
+ // If we've got a cached dispatcher, just use that.
1006
+ if (retFunc) {
1007
+ return retFunc;
1008
+ }
1009
+ // Else, generate a new one.
1010
+
1011
+ // NOTE:
1012
+ // This function returns a function that searches for nodes and
1013
+ // filters them. The search may be specialized by infix operators
1014
+ // (">", "~", or "+") else it will default to searching all
1015
+ // descendants (the " " selector). Once a group of children is
1016
+ // founde, a test function is applied to weed out the ones we
1017
+ // don't want. Many common cases can be fast-pathed. We spend a
1018
+ // lot of cycles to create a dispatcher that doesn't do more work
1019
+ // than necessary at any point since, unlike this function, the
1020
+ // dispatchers will be called every time. The logic of generating
1021
+ // efficient dispatchers looks like this in pseudo code:
1022
+ //
1023
+ // # if it's a purely descendant query (no ">", "+", or "~" modifiers)
1024
+ // if infixOperator == " ":
1025
+ // if only(id):
1026
+ // return def(root):
1027
+ // return d.byId(id, root);
1028
+ //
1029
+ // elif id:
1030
+ // return def(root):
1031
+ // return filter(d.byId(id, root));
1032
+ //
1033
+ // elif cssClass && getElementsByClassName:
1034
+ // return def(root):
1035
+ // return filter(root.getElementsByClassName(cssClass));
1036
+ //
1037
+ // elif only(tag):
1038
+ // return def(root):
1039
+ // return root.getElementsByTagName(tagName);
1040
+ //
1041
+ // else:
1042
+ // # search by tag name, then filter
1043
+ // return def(root):
1044
+ // return filter(root.getElementsByTagName(tagName||"*"));
1045
+ //
1046
+ // elif infixOperator == ">":
1047
+ // # search direct children
1048
+ // return def(root):
1049
+ // return filter(root.children);
1050
+ //
1051
+ // elif infixOperator == "+":
1052
+ // # search next sibling
1053
+ // return def(root):
1054
+ // return filter(root.nextElementSibling);
1055
+ //
1056
+ // elif infixOperator == "~":
1057
+ // # search rightward siblings
1058
+ // return def(root):
1059
+ // return filter(nextSiblings(root));
1060
+
1061
+ var io = query.infixOper;
1062
+ var oper = (io ? io.oper : '');
1063
+ // The default filter func which tests for all conditions in the query
1064
+ // part. This is potentially inefficient, so some optimized paths may
1065
+ // re-define it to test fewer things.
1066
+ var filterFunc = getSimpleFilterFunc(query, { el: 1 });
1067
+ var qt = query.tag;
1068
+ var wildcardTag = ('*' == qt);
1069
+ var ecs = goog.dom.getDocument()['getElementsByClassName'];
1070
+
1071
+ if (!oper) {
1072
+ // If there's no infix operator, then it's a descendant query. ID
1073
+ // and "elements by class name" variants can be accelerated so we
1074
+ // call them out explicitly:
1075
+ if (query.id) {
1076
+ // Testing shows that the overhead of goog.functions.TRUE() is
1077
+ // acceptable and can save us some bytes vs. re-defining the function
1078
+ // everywhere.
1079
+ filterFunc = (!query.loops && wildcardTag) ?
1080
+ goog.functions.TRUE :
1081
+ getSimpleFilterFunc(query, { el: 1, id: 1 });
1082
+
1083
+ retFunc = function(root, arr) {
1084
+ var te = goog.dom.getDomHelper(root).getElement(query.id);
1085
+ if (!te || !filterFunc(te)) {
1086
+ return;
1087
+ }
1088
+ if (9 == root.nodeType) { // If root's a doc, we just return directly.
1089
+ return getArr(te, arr);
1090
+ } else { // otherwise check ancestry
1091
+ if (_isDescendant(te, root)) {
1092
+ return getArr(te, arr);
1093
+ }
1094
+ }
1095
+ }
1096
+ } else if (
1097
+ ecs &&
1098
+ // isAlien check. Workaround for Prototype.js being totally evil/dumb.
1099
+ /\{\s*\[native code\]\s*\}/.test(String(ecs)) &&
1100
+ query.classes.length &&
1101
+ // WebKit bug where quirks-mode docs select by class w/o case
1102
+ // sensitivity.
1103
+ !cssCaseBug
1104
+ ) {
1105
+ // it's a class-based query and we've got a fast way to run it.
1106
+
1107
+ // ignore class and ID filters since we will have handled both
1108
+ filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 });
1109
+ var classesString = query.classes.join(' ');
1110
+ retFunc = function(root, arr) {
1111
+ var ret = getArr(0, arr), te, x = 0;
1112
+ var tret = root.getElementsByClassName(classesString);
1113
+ while ((te = tret[x++])) {
1114
+ if (filterFunc(te, root)) {
1115
+ ret.push(te);
1116
+ }
1117
+ }
1118
+ return ret;
1119
+ };
1120
+
1121
+ } else if (!wildcardTag && !query.loops) {
1122
+ // it's tag only. Fast-path it.
1123
+ retFunc = function(root, arr) {
1124
+ var ret = getArr(0, arr), te, x = 0;
1125
+ var tret = root.getElementsByTagName(query.getTag());
1126
+ while ((te = tret[x++])) {
1127
+ ret.push(te);
1128
+ }
1129
+ return ret;
1130
+ };
1131
+ } else {
1132
+ // the common case:
1133
+ // a descendant selector without a fast path. By now it's got
1134
+ // to have a tag selector, even if it's just "*" so we query
1135
+ // by that and filter
1136
+ filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 });
1137
+ retFunc = function(root, arr) {
1138
+ var ret = getArr(0, arr), te, x = 0;
1139
+ // we use getTag() to avoid case sensitivity issues
1140
+ var tret = root.getElementsByTagName(query.getTag());
1141
+ while (te = tret[x++]) {
1142
+ if (filterFunc(te, root)) {
1143
+ ret.push(te);
1144
+ }
1145
+ }
1146
+ return ret;
1147
+ };
1148
+ }
1149
+ } else {
1150
+ // the query is scoped in some way. Instead of querying by tag we
1151
+ // use some other collection to find candidate nodes
1152
+ var skipFilters = { el: 1 };
1153
+ if (wildcardTag) {
1154
+ skipFilters.tag = 1;
1155
+ }
1156
+ filterFunc = getSimpleFilterFunc(query, skipFilters);
1157
+ if ('+' == oper) {
1158
+ retFunc = nextSiblingIterator(filterFunc);
1159
+ } else if ('~' == oper) {
1160
+ retFunc = nextSiblingsIterator(filterFunc);
1161
+ } else if ('>' == oper) {
1162
+ retFunc = _childElements(filterFunc);
1163
+ }
1164
+ }
1165
+ // cache it and return
1166
+ return _getElementsFuncCache[query.query] = retFunc;
1167
+ };
1168
+
1169
+ var filterDown = function(root, queryParts) {
1170
+ // NOTE:
1171
+ // this is the guts of the DOM query system. It takes a list of
1172
+ // parsed query parts and a root and finds children which match
1173
+ // the selector represented by the parts
1174
+ var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret;
1175
+
1176
+ for (var i = 0; i < qpl; i++) {
1177
+ ret = [];
1178
+ qp = queryParts[i];
1179
+ x = candidates.length - 1;
1180
+ if (x > 0) {
1181
+ // if we have more than one root at this level, provide a new
1182
+ // hash to use for checking group membership but tell the
1183
+ // system not to post-filter us since we will already have been
1184
+ // gauranteed to be unique
1185
+ bag = {};
1186
+ ret.nozip = true;
1187
+ }
1188
+ var gef = getElementsFunc(qp);
1189
+ for (var j = 0; te = candidates[j]; j++) {
1190
+ // for every root, get the elements that match the descendant
1191
+ // selector, adding them to the 'ret' array and filtering them
1192
+ // via membership in this level's bag. If there are more query
1193
+ // parts, then this level's return will be used as the next
1194
+ // level's candidates
1195
+ gef(te, ret, bag);
1196
+ }
1197
+ if (!ret.length) { break; }
1198
+ candidates = ret;
1199
+ }
1200
+ return ret;
1201
+ };
1202
+
1203
+ ////////////////////////////////////////////////////////////////////////
1204
+ // the query runner
1205
+ ////////////////////////////////////////////////////////////////////////
1206
+
1207
+ // these are the primary caches for full-query results. The query
1208
+ // dispatcher functions are generated then stored here for hash lookup in
1209
+ // the future
1210
+ var _queryFuncCacheDOM = {},
1211
+ _queryFuncCacheQSA = {};
1212
+
1213
+ // this is the second level of spliting, from full-length queries (e.g.,
1214
+ // 'div.foo .bar') into simple query expressions (e.g., ['div.foo',
1215
+ // '.bar'])
1216
+ var getStepQueryFunc = function(query) {
1217
+ var qparts = getQueryParts(goog.string.trim(query));
1218
+
1219
+ // if it's trivial, avoid iteration and zipping costs
1220
+ if (qparts.length == 1) {
1221
+ // We optimize this case here to prevent dispatch further down the
1222
+ // chain, potentially slowing things down. We could more elegantly
1223
+ // handle this in filterDown(), but it's slower for simple things
1224
+ // that need to be fast (e.g., '#someId').
1225
+ var tef = getElementsFunc(qparts[0]);
1226
+ return function(root) {
1227
+ var r = tef(root, []);
1228
+ if (r) { r.nozip = true; }
1229
+ return r;
1230
+ }
1231
+ }
1232
+
1233
+ // otherwise, break it up and return a runner that iterates over the parts
1234
+ // recursively
1235
+ return function(root) {
1236
+ return filterDown(root, qparts);
1237
+ }
1238
+ };
1239
+
1240
+ // NOTES:
1241
+ // * we can't trust QSA for anything but document-rooted queries, so
1242
+ // caching is split into DOM query evaluators and QSA query evaluators
1243
+ // * caching query results is dirty and leak-prone (or, at a minimum,
1244
+ // prone to unbounded growth). Other toolkits may go this route, but
1245
+ // they totally destroy their own ability to manage their memory
1246
+ // footprint. If we implement it, it should only ever be with a fixed
1247
+ // total element reference # limit and an LRU-style algorithm since JS
1248
+ // has no weakref support. Caching compiled query evaluators is also
1249
+ // potentially problematic, but even on large documents the size of the
1250
+ // query evaluators is often < 100 function objects per evaluator (and
1251
+ // LRU can be applied if it's ever shown to be an issue).
1252
+ // * since IE's QSA support is currently only for HTML documents and even
1253
+ // then only in IE 8's 'standards mode', we have to detect our dispatch
1254
+ // route at query time and keep 2 separate caches. Ugg.
1255
+
1256
+ var qsa = 'querySelectorAll';
1257
+
1258
+ // some versions of Safari provided QSA, but it was buggy and crash-prone.
1259
+ // We need te detect the right 'internal' webkit version to make this work.
1260
+ var qsaAvail = (
1261
+ !!goog.dom.getDocument()[qsa] &&
1262
+ // see #5832
1263
+ (!goog.userAgent.WEBKIT || goog.userAgent.isVersion('526'))
1264
+ );
1265
+
1266
+ /** @param {boolean=} opt_forceDOM */
1267
+ var getQueryFunc = function(query, opt_forceDOM) {
1268
+
1269
+ if (qsaAvail) {
1270
+ // if we've got a cached variant and we think we can do it, run it!
1271
+ var qsaCached = _queryFuncCacheQSA[query];
1272
+ if (qsaCached && !opt_forceDOM) {
1273
+ return qsaCached;
1274
+ }
1275
+ }
1276
+
1277
+ // else if we've got a DOM cached variant, assume that we already know
1278
+ // all we need to and use it
1279
+ var domCached = _queryFuncCacheDOM[query];
1280
+ if (domCached) {
1281
+ return domCached;
1282
+ }
1283
+
1284
+ // TODO:
1285
+ // today we're caching DOM and QSA branches separately so we
1286
+ // recalc useQSA every time. If we had a way to tag root+query
1287
+ // efficiently, we'd be in good shape to do a global cache.
1288
+
1289
+ var qcz = query.charAt(0);
1290
+ var nospace = (-1 == query.indexOf(' '));
1291
+
1292
+ // byId searches are wicked fast compared to QSA, even when filtering
1293
+ // is required
1294
+ if ((query.indexOf('#') >= 0) && (nospace)) {
1295
+ opt_forceDOM = true;
1296
+ }
1297
+
1298
+ var useQSA = (
1299
+ qsaAvail && (!opt_forceDOM) &&
1300
+ // as per CSS 3, we can't currently start w/ combinator:
1301
+ // http://www.w3.org/TR/css3-selectors/#w3cselgrammar
1302
+ (specials.indexOf(qcz) == -1) &&
1303
+ // IE's QSA impl sucks on pseudos
1304
+ (!goog.userAgent.IE || (query.indexOf(':') == -1)) &&
1305
+
1306
+ (!(cssCaseBug && (query.indexOf('.') >= 0))) &&
1307
+
1308
+ // FIXME:
1309
+ // need to tighten up browser rules on ':contains' and '|=' to
1310
+ // figure out which aren't good
1311
+ (query.indexOf(':contains') == -1) &&
1312
+ (query.indexOf('|=') == -1)
1313
+ );
1314
+
1315
+ // TODO:
1316
+ // if we've got a descendant query (e.g., '> .thinger' instead of
1317
+ // just '.thinger') in a QSA-able doc, but are passed a child as a
1318
+ // root, it should be possible to give the item a synthetic ID and
1319
+ // trivially rewrite the query to the form '#synid > .thinger' to
1320
+ // use the QSA branch
1321
+
1322
+
1323
+ if (useQSA) {
1324
+ var tq = (specials.indexOf(query.charAt(query.length - 1)) >= 0) ?
1325
+ (query + ' *') : query;
1326
+ return _queryFuncCacheQSA[query] = function(root) {
1327
+ try {
1328
+ // the QSA system contains an egregious spec bug which
1329
+ // limits us, effectively, to only running QSA queries over
1330
+ // entire documents. See:
1331
+ // http://ejohn.org/blog/thoughts-on-queryselectorall/
1332
+ // despite this, we can also handle QSA runs on simple
1333
+ // selectors, but we don't want detection to be expensive
1334
+ // so we're just checking for the presence of a space char
1335
+ // right now. Not elegant, but it's cheaper than running
1336
+ // the query parser when we might not need to
1337
+ if (!((9 == root.nodeType) || nospace)) {
1338
+ throw '';
1339
+ }
1340
+ var r = root[qsa](tq);
1341
+ // IE QSA queries may incorrectly include comment nodes, so we throw
1342
+ // the zipping function into 'remove' comments mode instead of the
1343
+ // normal 'skip it' which every other QSA-clued browser enjoys
1344
+ // skip expensive duplication checks and just wrap in a NodeList
1345
+ if (goog.userAgent.IE) {
1346
+ r.commentStrip = true;
1347
+ } else {
1348
+ r.nozip = true;
1349
+ }
1350
+ return r;
1351
+ } catch (e) {
1352
+ // else run the DOM branch on this query, ensuring that we
1353
+ // default that way in the future
1354
+ return getQueryFunc(query, true)(root);
1355
+ }
1356
+ }
1357
+ } else {
1358
+ // DOM branch
1359
+ var parts = query.split(/\s*,\s*/);
1360
+ return _queryFuncCacheDOM[query] = ((parts.length < 2) ?
1361
+ // if not a compound query (e.g., '.foo, .bar'), cache and return a
1362
+ // dispatcher
1363
+ getStepQueryFunc(query) :
1364
+ // if it *is* a complex query, break it up into its
1365
+ // constituent parts and return a dispatcher that will
1366
+ // merge the parts when run
1367
+ function(root) {
1368
+ var pindex = 0, // avoid array alloc for every invocation
1369
+ ret = [],
1370
+ tp;
1371
+ while (tp = parts[pindex++]) {
1372
+ ret = ret.concat(getStepQueryFunc(tp)(root));
1373
+ }
1374
+ return ret;
1375
+ }
1376
+ );
1377
+ }
1378
+ };
1379
+
1380
+ var _zipIdx = 0;
1381
+
1382
+ // NOTE:
1383
+ // this function is Moo inspired, but our own impl to deal correctly
1384
+ // with XML in IE
1385
+ var _nodeUID = goog.userAgent.IE ? function(node) {
1386
+ if (caseSensitive) {
1387
+ // XML docs don't have uniqueID on their nodes
1388
+ return node.getAttribute('_uid') ||
1389
+ node.setAttribute('_uid', ++_zipIdx) || _zipIdx;
1390
+
1391
+ } else {
1392
+ return node.uniqueID;
1393
+ }
1394
+ } :
1395
+ function(node) {
1396
+ return (node['_uid'] || (node['_uid'] = ++_zipIdx));
1397
+ };
1398
+
1399
+ // determine if a node in is unique in a 'bag'. In this case we don't want
1400
+ // to flatten a list of unique items, but rather just tell if the item in
1401
+ // question is already in the bag. Normally we'd just use hash lookup to do
1402
+ // this for us but IE's DOM is busted so we can't really count on that. On
1403
+ // the upside, it gives us a built in unique ID function.
1404
+ var _isUnique = function(node, bag) {
1405
+ if (!bag) {
1406
+ return 1;
1407
+ }
1408
+ var id = _nodeUID(node);
1409
+ if (!bag[id]) {
1410
+ return bag[id] = 1;
1411
+ }
1412
+ return 0;
1413
+ };
1414
+
1415
+ // attempt to efficiently determine if an item in a list is a dupe,
1416
+ // returning a list of 'uniques', hopefully in doucment order
1417
+ var _zipIdxName = '_zipIdx';
1418
+ var _zip = function(arr) {
1419
+ if (arr && arr.nozip) {
1420
+ return arr;
1421
+ }
1422
+ var ret = [];
1423
+ if (!arr || !arr.length) {
1424
+ return ret;
1425
+ }
1426
+ if (arr[0]) {
1427
+ ret.push(arr[0]);
1428
+ }
1429
+ if (arr.length < 2) {
1430
+ return ret;
1431
+ }
1432
+
1433
+ _zipIdx++;
1434
+
1435
+ // we have to fork here for IE and XML docs because we can't set
1436
+ // expandos on their nodes (apparently). *sigh*
1437
+ if (goog.userAgent.IE && caseSensitive) {
1438
+ var szidx = _zipIdx + '';
1439
+ arr[0].setAttribute(_zipIdxName, szidx);
1440
+ for (var x = 1, te; te = arr[x]; x++) {
1441
+ if (arr[x].getAttribute(_zipIdxName) != szidx) {
1442
+ ret.push(te);
1443
+ }
1444
+ te.setAttribute(_zipIdxName, szidx);
1445
+ }
1446
+ } else if (goog.userAgent.IE && arr.commentStrip) {
1447
+ try {
1448
+ for (var x = 1, te; te = arr[x]; x++) {
1449
+ if (isElement(te)) {
1450
+ ret.push(te);
1451
+ }
1452
+ }
1453
+ } catch (e) { /* squelch */ }
1454
+ } else {
1455
+ if (arr[0]) {
1456
+ arr[0][_zipIdxName] = _zipIdx;
1457
+ }
1458
+ for (var x = 1, te; te = arr[x]; x++) {
1459
+ if (arr[x][_zipIdxName] != _zipIdx) {
1460
+ ret.push(te);
1461
+ }
1462
+ te[_zipIdxName] = _zipIdx;
1463
+ }
1464
+ }
1465
+ return ret;
1466
+ };
1467
+
1468
+ // the main executor
1469
+ var query = function(query, root) {
1470
+ // NOTE: elementsById is not currently supported
1471
+ // NOTE: ignores xpath-ish queries for now
1472
+
1473
+ //Set list constructor to desired value. This can change
1474
+ //between calls, so always re-assign here.
1475
+
1476
+ if (!query) {
1477
+ return [];
1478
+ }
1479
+
1480
+ if (query.constructor == Array) {
1481
+ return query;
1482
+ }
1483
+
1484
+ if (!goog.isString(query)) {
1485
+ return [query];
1486
+ }
1487
+
1488
+ if (goog.isString(root)) {
1489
+ root = goog.dom.getElement(root);
1490
+ if (!root) {
1491
+ return [];
1492
+ }
1493
+ }
1494
+
1495
+ root = root || goog.dom.getDocument();
1496
+ var od = root.ownerDocument || root.documentElement;
1497
+
1498
+ // throw the big case sensitivity switch
1499
+
1500
+ // NOTE:
1501
+ // Opera in XHTML mode doesn't detect case-sensitivity correctly
1502
+ // and it's not clear that there's any way to test for it
1503
+ caseSensitive =
1504
+ root.contentType && root.contentType == 'application/xml' ||
1505
+ goog.userAgent.OPERA &&
1506
+ (root.doctype || od.toString() == '[object XMLDocument]') ||
1507
+ !!od &&
1508
+ (goog.userAgent.IE ? od.xml : (root.xmlVersion || od.xmlVersion));
1509
+
1510
+ // NOTE:
1511
+ // adding 'true' as the 2nd argument to getQueryFunc is useful for
1512
+ // testing the DOM branch without worrying about the
1513
+ // behavior/performance of the QSA branch.
1514
+ var r = getQueryFunc(query)(root);
1515
+
1516
+ // FIXME(slightlyoff):
1517
+ // need to investigate this branch WRT dojo:#8074 and dojo:#8075
1518
+ if (r && r.nozip) {
1519
+ return r;
1520
+ }
1521
+ return _zip(r); // dojo.NodeList
1522
+ }
1523
+
1524
+ // FIXME: need to add infrastructure for post-filtering pseudos, ala :last
1525
+ query.pseudos = pseudos;
1526
+
1527
+ return query;
1528
+ })();
1529
+
1530
+ // TODO(user): Please don't export here since it clobbers dead code elimination.
1531
+ goog.exportSymbol('goog.dom.query', goog.dom.query);
1532
+ goog.exportSymbol('goog.dom.query.pseudos', goog.dom.query.pseudos);