sproutcore 1.8.2.1 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. data/VERSION.yml +2 -2
  2. data/lib/buildtasks/helpers/file_rule_list.rb +3 -3
  3. data/lib/frameworks/sproutcore/Buildfile +1 -1
  4. data/lib/frameworks/sproutcore/CHANGELOG.md +235 -16
  5. data/lib/frameworks/sproutcore/apps/media_examples/Buildfile +13 -0
  6. data/lib/frameworks/sproutcore/apps/media_examples/core.js +35 -0
  7. data/lib/frameworks/sproutcore/apps/media_examples/resources/loading.rhtml +3 -0
  8. data/lib/frameworks/sproutcore/apps/media_examples/resources/main_page.js +53 -0
  9. data/lib/frameworks/sproutcore/apps/media_examples/views/audio_view.js +100 -0
  10. data/lib/frameworks/sproutcore/apps/media_examples/views/camera_view.js +39 -0
  11. data/lib/frameworks/sproutcore/apps/media_examples/views/capabilities_view.js +116 -0
  12. data/lib/frameworks/sproutcore/apps/media_examples/views/microphone_view.js +40 -0
  13. data/lib/frameworks/sproutcore/apps/media_examples/views/video_view.js +107 -0
  14. data/lib/frameworks/sproutcore/apps/showcase/Buildfile +11 -0
  15. data/lib/frameworks/sproutcore/apps/showcase/README +15 -0
  16. data/lib/frameworks/sproutcore/apps/showcase/controllers/source_controller.js +15 -0
  17. data/lib/frameworks/sproutcore/apps/showcase/controllers/source_tree_controller.js +212 -0
  18. data/lib/frameworks/sproutcore/apps/showcase/core.js +170 -0
  19. data/lib/frameworks/sproutcore/apps/showcase/main.js +27 -0
  20. data/lib/frameworks/sproutcore/apps/showcase/resources/_theme.css +18 -0
  21. data/lib/frameworks/sproutcore/apps/showcase/resources/api.css +80 -0
  22. data/lib/frameworks/sproutcore/apps/showcase/resources/favicon.ico +0 -0
  23. data/lib/frameworks/sproutcore/apps/showcase/resources/images/alarm-clock.png +0 -0
  24. data/lib/frameworks/sproutcore/apps/showcase/resources/images/balloon-facebook.png +0 -0
  25. data/lib/frameworks/sproutcore/apps/showcase/resources/images/balloon-twitter.png +0 -0
  26. data/lib/frameworks/sproutcore/apps/showcase/resources/images/balloon.png +0 -0
  27. data/lib/frameworks/sproutcore/apps/showcase/resources/images/bullet.png +0 -0
  28. data/lib/frameworks/sproutcore/apps/showcase/resources/images/calendar-insert.png +0 -0
  29. data/lib/frameworks/sproutcore/apps/showcase/resources/images/cross.png +0 -0
  30. data/lib/frameworks/sproutcore/apps/showcase/resources/images/example-box-bg.png +0 -0
  31. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit-grape.png +0 -0
  32. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit-lime.png +0 -0
  33. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit-orange.png +0 -0
  34. data/lib/frameworks/sproutcore/apps/showcase/resources/images/fruit.png +0 -0
  35. data/lib/frameworks/sproutcore/apps/showcase/resources/images/glow.png +0 -0
  36. data/lib/frameworks/sproutcore/apps/showcase/resources/images/green-dot.png +0 -0
  37. data/lib/frameworks/sproutcore/apps/showcase/resources/images/grey-dot.png +0 -0
  38. data/lib/frameworks/sproutcore/apps/showcase/resources/images/logo.png +0 -0
  39. data/lib/frameworks/sproutcore/apps/showcase/resources/images/pixels.png +0 -0
  40. data/lib/frameworks/sproutcore/apps/showcase/resources/images/red-dot.png +0 -0
  41. data/lib/frameworks/sproutcore/apps/showcase/resources/images/sproutcore-logo.png +0 -0
  42. data/lib/frameworks/sproutcore/apps/showcase/resources/images/sproutcore-startup-landscape.jpg +0 -0
  43. data/lib/frameworks/sproutcore/apps/{test_controls → showcase}/resources/loading.rhtml +1 -1
  44. data/lib/frameworks/sproutcore/apps/showcase/resources/main_page.js +61 -0
  45. data/lib/frameworks/sproutcore/apps/showcase/resources/stylesheet.css +365 -0
  46. data/lib/frameworks/sproutcore/apps/showcase/resources/views_page.js +64 -0
  47. data/lib/frameworks/sproutcore/apps/showcase/system/views_item_content.js +59 -0
  48. data/lib/frameworks/sproutcore/apps/showcase/theme.js +27 -0
  49. data/lib/frameworks/sproutcore/apps/showcase/views/button_views.js +55 -0
  50. data/lib/frameworks/sproutcore/apps/showcase/views/checkbox_views.js +34 -0
  51. data/lib/frameworks/sproutcore/apps/showcase/views/container_views.js +29 -0
  52. data/lib/frameworks/sproutcore/apps/showcase/views/date_field_views.js +30 -0
  53. data/lib/frameworks/sproutcore/apps/showcase/views/disclosure_views.js +22 -0
  54. data/lib/frameworks/sproutcore/apps/showcase/views/grid_views.js +28 -0
  55. data/lib/frameworks/sproutcore/apps/showcase/views/image_button_views.js +22 -0
  56. data/lib/frameworks/sproutcore/apps/showcase/views/image_views.js +51 -0
  57. data/lib/frameworks/sproutcore/apps/showcase/views/label_views.js +53 -0
  58. data/lib/frameworks/sproutcore/apps/showcase/views/list_views.js +31 -0
  59. data/lib/frameworks/sproutcore/apps/showcase/views/popup_button_views.js +24 -0
  60. data/lib/frameworks/sproutcore/apps/showcase/views/progress_views.js +26 -0
  61. data/lib/frameworks/sproutcore/apps/showcase/views/radio_views.js +30 -0
  62. data/lib/frameworks/sproutcore/apps/showcase/views/scroll_views.js +40 -0
  63. data/lib/frameworks/sproutcore/apps/showcase/views/segmented_views.js +90 -0
  64. data/lib/frameworks/sproutcore/apps/showcase/views/select_views.js +64 -0
  65. data/lib/frameworks/sproutcore/apps/showcase/views/slider_views.js +46 -0
  66. data/lib/frameworks/sproutcore/apps/showcase/views/source_list_views.js +23 -0
  67. data/lib/frameworks/sproutcore/apps/showcase/views/split_views.js +22 -0
  68. data/lib/frameworks/sproutcore/apps/showcase/views/stacked_views.js +23 -0
  69. data/lib/frameworks/sproutcore/apps/showcase/views/static_content_views.js +23 -0
  70. data/lib/frameworks/sproutcore/apps/showcase/views/tab_views.js +51 -0
  71. data/lib/frameworks/sproutcore/apps/showcase/views/text_field_views.js +52 -0
  72. data/lib/frameworks/sproutcore/apps/showcase/views/toolbar_views.js +23 -0
  73. data/lib/frameworks/sproutcore/apps/showcase/views/views_item_view.js +91 -0
  74. data/lib/frameworks/sproutcore/apps/showcase/views/views_list_view.js +67 -0
  75. data/lib/frameworks/sproutcore/apps/showcase/views/web_views.js +32 -0
  76. data/lib/frameworks/sproutcore/apps/showcase/views/well_views.js +29 -0
  77. data/lib/frameworks/sproutcore/apps/showcase/views/workspace_views.js +23 -0
  78. data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +2 -1
  79. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +91 -51
  80. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +93 -27
  81. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +196 -15
  82. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +1 -1
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +26 -10
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/object.js +90 -92
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +69 -39
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/color.js +769 -0
  88. data/lib/frameworks/sproutcore/frameworks/{desktop → core_foundation}/system/key_bindings.js +0 -0
  89. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +4 -4
  90. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/req_anim_frame.js +31 -0
  91. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +7 -1
  92. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/utils.js +8 -6
  93. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +49 -0
  94. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/selection_support.js +1 -1
  95. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/ext/object_test.js +106 -0
  96. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/color.js +448 -0
  97. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +8 -1
  98. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/timer/invokeLater.js +24 -24
  99. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/utils/offset.js +5 -5
  100. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/animation.js +90 -30
  101. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +14 -6
  102. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/touch.js +113 -0
  103. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +64 -8
  104. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +20 -4
  105. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +58 -38
  106. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/touch.js +32 -39
  107. data/lib/frameworks/sproutcore/frameworks/core_tools/models/target.js +20 -15
  108. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +19 -15
  109. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_record.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +16 -16
  111. data/lib/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +32 -32
  112. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +53 -38
  113. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +9 -8
  114. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +26 -26
  115. data/lib/frameworks/sproutcore/frameworks/datastore/system/child_array.js +1 -3
  116. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +4 -3
  117. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +0 -4
  118. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +96 -8
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/datetime_recordattribute.js +22 -4
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/data_store.js +24 -24
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +376 -37
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +51 -53
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +108 -66
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +33 -35
  125. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +6 -4
  126. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +33 -3
  127. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +181 -15
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +6 -0
  129. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/border.js +3 -1
  130. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_fast_path.js +2 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +153 -6
  132. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +39 -18
  133. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -1
  134. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +6 -7
  135. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +139 -50
  136. data/lib/frameworks/sproutcore/frameworks/{foundation → desktop}/resources/button_view.css +3 -3
  137. data/lib/frameworks/sproutcore/frameworks/{foundation → desktop}/resources/checkbox_view.css +4 -0
  138. data/lib/frameworks/sproutcore/frameworks/desktop/resources/disclosure.css +2 -2
  139. data/lib/frameworks/sproutcore/frameworks/{foundation → desktop}/resources/radio_view.css +0 -0
  140. data/lib/frameworks/sproutcore/frameworks/desktop/resources/segmented.css +23 -17
  141. data/lib/frameworks/sproutcore/frameworks/desktop/resources/web.css +5 -0
  142. data/lib/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +4 -5
  143. data/lib/frameworks/sproutcore/frameworks/desktop/tests/mixins/border.js +3 -12
  144. data/lib/frameworks/sproutcore/frameworks/desktop/tests/mixins/collection_fast_path.js +58 -0
  145. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +79 -12
  147. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +13 -0
  148. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +2 -2
  149. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/drag_and_drop.js +147 -0
  150. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/grid/methods.js +123 -2
  151. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/drag_and_drop.js +150 -0
  152. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +58 -44
  153. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/methods.js +9 -80
  154. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +54 -130
  155. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/observers.js +78 -0
  156. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +64 -9
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/methods.js +11 -11
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +28 -2
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/methods.js +74 -0
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/slider/ui.js +141 -0
  161. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +4 -1
  162. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +69 -36
  163. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +27 -11
  164. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +41 -25
  165. data/lib/frameworks/sproutcore/frameworks/desktop/views/progress.js +51 -89
  166. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +59 -34
  167. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +59 -49
  168. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +1 -1
  169. data/lib/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +4 -1
  170. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +14 -14
  171. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +8 -8
  172. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +13 -1
  173. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +4 -1
  174. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/colors.js +21 -22
  175. data/lib/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/selection_support.js +26 -0
  176. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/beginEditing.js +4 -5
  177. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/image_queue.js +68 -44
  178. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/user_defaults.js +10 -0
  179. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/methods.js +0 -10
  180. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/container/ui.js +24 -59
  181. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +47 -34
  182. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/methods.js +96 -12
  183. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +38 -0
  184. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +38 -50
  185. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +6 -2
  186. data/lib/frameworks/sproutcore/frameworks/media/media_capabilities.js +211 -0
  187. data/lib/frameworks/sproutcore/frameworks/media/render_delegates/media_slider.js +77 -0
  188. data/lib/frameworks/sproutcore/frameworks/media/resources/playeras3.fla +0 -0
  189. data/lib/frameworks/sproutcore/frameworks/media/resources/video.css +129 -115
  190. data/lib/frameworks/sproutcore/frameworks/media/resources/videoCanvas.swf +0 -0
  191. data/lib/frameworks/sproutcore/frameworks/media/tests/media_capabilities.js +194 -0
  192. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +56 -173
  193. data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +15 -18
  194. data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +63 -219
  195. data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +4 -2
  196. data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +4 -8
  197. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +51 -160
  198. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +138 -102
  199. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +8 -0
  200. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
  201. data/lib/frameworks/sproutcore/frameworks/runtime/ext/array.js +8 -2
  202. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +32 -12
  203. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +28 -24
  204. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +0 -2
  205. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +111 -12
  206. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +9 -7
  207. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +8 -2
  208. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable/enumerable.js +160 -115
  209. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/enhance.js +64 -19
  210. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/object/mixin.js +83 -0
  211. data/lib/frameworks/sproutcore/frameworks/template_view/ext/handlebars/bind.js +3 -0
  212. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/collection.js +13 -0
  213. data/lib/frameworks/sproutcore/frameworks/template_view/tests/views/template/handlebars.js +4 -2
  214. data/lib/frameworks/sproutcore/frameworks/template_view/views/template_collection.js +5 -5
  215. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +5 -1
  216. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +13 -12
  217. data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list.css +9 -2
  218. data/lib/frameworks/sproutcore/themes/ace/resources/progress/ace/progress.css +105 -5
  219. data/lib/frameworks/sproutcore/themes/ace/resources/progress/ace/progress_view_indeterminate_content.png +0 -0
  220. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/18px/segmented.css +19 -15
  221. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented.css +93 -21
  222. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_active.png +0 -0
  223. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_normal.png +0 -0
  224. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_selected.png +0 -0
  225. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/24px/segmented_vertical_selected_active.png +0 -0
  226. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented.css +91 -15
  227. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_active.png +0 -0
  228. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_normal.png +0 -0
  229. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_selected.png +0 -0
  230. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/30px/segmented_vertical_selected_active.png +0 -0
  231. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/44px/segmented.css +21 -17
  232. data/lib/frameworks/sproutcore/themes/ace/resources/segmented/segmented.css +26 -25
  233. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/menu_item_view.css +2 -4
  234. data/lib/sproutcore/helpers/minifier.rb +5 -5
  235. data/lib/sproutcore/tools/build.rb +1 -1
  236. data/sproutcore.gemspec +6 -1
  237. data/vendor/chance/lib/chance/instance/slicing.rb +2 -2
  238. metadata +143 -60
  239. data/lib/frameworks/sproutcore/apps/test_controls/Buildfile +0 -0
  240. data/lib/frameworks/sproutcore/apps/test_controls/controllers/alert.js +0 -39
  241. data/lib/frameworks/sproutcore/apps/test_controls/controllers/buttons.js +0 -21
  242. data/lib/frameworks/sproutcore/apps/test_controls/controllers/categories.js +0 -125
  243. data/lib/frameworks/sproutcore/apps/test_controls/controllers/category.js +0 -36
  244. data/lib/frameworks/sproutcore/apps/test_controls/controllers/select.js +0 -12
  245. data/lib/frameworks/sproutcore/apps/test_controls/controllers/split.js +0 -74
  246. data/lib/frameworks/sproutcore/apps/test_controls/core.js +0 -29
  247. data/lib/frameworks/sproutcore/apps/test_controls/main.js +0 -14
  248. data/lib/frameworks/sproutcore/apps/test_controls/resources/buttons_page.js +0 -158
  249. data/lib/frameworks/sproutcore/apps/test_controls/resources/checkboxes_page.js +0 -53
  250. data/lib/frameworks/sproutcore/apps/test_controls/resources/flow_layout_page.js +0 -85
  251. data/lib/frameworks/sproutcore/apps/test_controls/resources/list_page.js +0 -40
  252. data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.css +0 -60
  253. data/lib/frameworks/sproutcore/apps/test_controls/resources/main_page.js +0 -151
  254. data/lib/frameworks/sproutcore/apps/test_controls/resources/panels_page.js +0 -62
  255. data/lib/frameworks/sproutcore/apps/test_controls/resources/progress_page.js +0 -33
  256. data/lib/frameworks/sproutcore/apps/test_controls/resources/radio_page.js +0 -55
  257. data/lib/frameworks/sproutcore/apps/test_controls/resources/scroll_page.js +0 -77
  258. data/lib/frameworks/sproutcore/apps/test_controls/resources/segmented_page.js +0 -99
  259. data/lib/frameworks/sproutcore/apps/test_controls/resources/select_page.js +0 -75
  260. data/lib/frameworks/sproutcore/apps/test_controls/resources/sliders_page.js +0 -54
  261. data/lib/frameworks/sproutcore/apps/test_controls/resources/split_page.js +0 -141
  262. data/lib/frameworks/sproutcore/apps/test_controls/resources/strings.js +0 -50
  263. data/lib/frameworks/sproutcore/apps/test_controls/resources/tab_page.js +0 -53
  264. data/lib/frameworks/sproutcore/apps/test_controls/resources/text_field_page.js +0 -65
  265. data/lib/frameworks/sproutcore/apps/test_controls/theme.js +0 -34
  266. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/detail.js +0 -15
  267. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/source.js +0 -15
  268. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/target.js +0 -15
  269. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +0 -15
  270. data/lib/frameworks/sproutcore/apps/tests/tests/controllers/tests.js +0 -15
  271. data/lib/frameworks/sproutcore/apps/tests/tests/models/target.js +0 -15
  272. data/lib/frameworks/sproutcore/apps/tests/tests/models/test.js +0 -15
  273. data/lib/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +0 -15
  274. data/lib/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +0 -21
@@ -373,7 +373,7 @@ SC.Response = SC.Object.extend(
373
373
  Will notify each listener. Returns true if any of the listeners handle.
374
374
  */
375
375
  _notifyListeners: function(listeners, status) {
376
- var notifiers = listeners[status], params, target, action;
376
+ var notifiers = listeners[status], args, target, action;
377
377
  if (!notifiers) { return NO; }
378
378
 
379
379
  var handled = NO;
@@ -381,14 +381,14 @@ SC.Response = SC.Object.extend(
381
381
 
382
382
  for (var i = 0; i < len; i++) {
383
383
  var notifier = notifiers[i];
384
- params = (notifier.params || []).copy();
385
- params.unshift(this);
384
+ args = (notifier.args || []).copy();
385
+ args.unshift(this);
386
386
 
387
387
  target = notifier.target;
388
388
  action = notifier.action;
389
389
  if (SC.typeOf(action) === SC.T_STRING) { action = target[action]; }
390
390
 
391
- handled = action.apply(target, params);
391
+ handled = action.apply(target, args);
392
392
  }
393
393
 
394
394
  return handled;
@@ -498,24 +498,60 @@ SC.XHRResponse = SC.Response.extend(
498
498
  this.set('rawRequest', null);
499
499
  },
500
500
 
501
+
501
502
  /**
502
503
  Starts the transport of the request
503
504
 
504
505
  @returns {XMLHttpRequest|ActiveXObject}
505
506
  */
506
507
  invokeTransport: function() {
507
- var rawRequest, transport, handleReadyStateChange, async, headers;
508
+ var listener, listeners, listenersForKey,
509
+ rawRequest,
510
+ request = this.get('request'),
511
+ transport, handleReadyStateChange, async, headers;
508
512
 
509
513
  rawRequest = this.createRequest();
510
514
  this.set('rawRequest', rawRequest);
511
515
 
512
- // configure async callback - differs per browser...
513
- async = !!this.getPath('request.isAsynchronous');
516
+ // configure async callback - differs per browser...
517
+ async = !!request.get('isAsynchronous');
514
518
 
515
519
  if (async) {
516
- if (!SC.browser.isIE && !SC.browser.isOpera) {
517
- SC.Event.add(rawRequest, 'readystatechange', this,
518
- this.finishRequest, rawRequest);
520
+ if (window.XMLHttpRequestProgressEvent) {
521
+ // XMLHttpRequest Level 2
522
+
523
+ // Add progress event listeners that were specified on the request.
524
+ listeners = request.get("listeners");
525
+ if (listeners) {
526
+ for (var key in listeners) {
527
+
528
+ // Make sure the key is not an HTTP numeric status code.
529
+ if (isNaN(parseInt(key, 10))) {
530
+ // We still allow multiple notifiers on progress events, but we
531
+ // don't try to optimize this by using a single listener, because
532
+ // it is highly unlikely that the developer will add duplicate
533
+ // progress event notifiers and if they did, it is also unlikely
534
+ // that they would expect them to cascade in the way that the
535
+ // status code notifiers do.
536
+ listenersForKey = listeners[key];
537
+ for (var i = 0, len = listenersForKey.length; i < len; i++) {
538
+ listener = listenersForKey[i];
539
+
540
+ var keyTarget = key.split('.');
541
+ if (SC.none(keyTarget[1])) {
542
+ SC.Event.add(rawRequest, keyTarget[0], listener.target, listener.action, listener.args);
543
+ } else {
544
+ SC.Event.add(rawRequest[keyTarget[0]], keyTarget[1], listener.target, listener.action, listener.args);
545
+ }
546
+ }
547
+ }
548
+ }
549
+ }
550
+
551
+ SC.Event.add(rawRequest, 'loadend', this, this.finishRequest);
552
+ } else if (window.XMLHttpRequest) {
553
+ // XMLHttpRequest Level 1
554
+ SC.Event.add(rawRequest, 'readystatechange', this, this.finishRequest);
519
555
  } else {
520
556
  transport = this;
521
557
  handleReadyStateChange = function() {
@@ -554,21 +590,22 @@ SC.XHRResponse = SC.Response.extend(
554
590
  @returns {XMLHttpRequest|ActiveXObject}
555
591
  */
556
592
  createRequest: function() {
557
- function tryThese() {
558
- for (var i=0; i < arguments.length; i++) {
559
- try {
560
- var item = arguments[i]();
561
- return item;
562
- } catch (e) {}
563
- }
564
- return NO;
593
+ var rawRequest;
594
+
595
+ // check native support first
596
+ if (window.XMLHttpRequest) {
597
+ rawRequest = new XMLHttpRequest();
598
+ } else {
599
+ // There are two relevant Microsoft MSXML object types.
600
+ // See here for more information:
601
+ // http://www.snook.ca/archives/javascript/xmlhttprequest_activex_ie/
602
+ // http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx
603
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/ms763742(v=vs.85).aspx
604
+ try { rawRequest = new ActiveXObject("MSXML2.XMLHTTP.6.0"); } catch(e) {}
605
+ try { if (!rawRequest) rawRequest = new ActiveXObject("MSXML2.XMLHTTP"); } catch(e) {}
565
606
  }
566
607
 
567
- return tryThese(
568
- function() { return new XMLHttpRequest(); },
569
- function() { return new ActiveXObject('Msxml2.XMLHTTP'); },
570
- function() { return new ActiveXObject('Microsoft.XMLHTTP'); }
571
- );
608
+ return rawRequest;
572
609
  },
573
610
 
574
611
  /**
@@ -580,9 +617,11 @@ SC.XHRResponse = SC.Response.extend(
580
617
  @returns {Boolean} YES if completed, NO otherwise
581
618
  */
582
619
  finishRequest: function(evt) {
583
- var rawRequest = this.get('rawRequest'),
584
- readyState = rawRequest.readyState,
585
- error, status, msg;
620
+ var listener, listeners, listenersForKey,
621
+ rawRequest = this.get('rawRequest'),
622
+ readyState = rawRequest.readyState,
623
+ request,
624
+ error, status, msg;
586
625
 
587
626
  if (readyState === 4 && !this.get('timedOut')) {
588
627
  this.receive(function(proceed) {
@@ -614,7 +653,34 @@ SC.XHRResponse = SC.Response.extend(
614
653
  }, this);
615
654
 
616
655
  // Avoid memory leaks
617
- if (!SC.browser.isIE && !SC.browser.isOpera) {
656
+ if (window.XMLHttpRequestProgressEvent) {
657
+ // XMLHttpReqeust Level 2
658
+
659
+ SC.Event.remove(rawRequest, 'loadend', this, this.finishRequest);
660
+
661
+ request = this.get('request');
662
+ listeners = request.get("listeners");
663
+ if (listeners) {
664
+ for (var key in listeners) {
665
+
666
+ // Make sure the key is not an HTTP numeric status code.
667
+ if (isNaN(parseInt(key, 10))) {
668
+ listenersForKey = listeners[key];
669
+ for (var i = 0, len = listenersForKey.length; i < len; i++) {
670
+ listener = listenersForKey[i];
671
+
672
+ var keyTarget = key.split('.');
673
+ if (SC.none(keyTarget[1])) {
674
+ SC.Event.remove(rawRequest, keyTarget[0], listener.target, listener.action, listener.args);
675
+ } else {
676
+ SC.Event.remove(rawRequest[keyTarget[0]], keyTarget[1], listener.target, listener.action, listener.args);
677
+ }
678
+ }
679
+ }
680
+ }
681
+ }
682
+ } else if (window.XMLHttpRequest) {
683
+ // XMLHttpReqeust Level 1
618
684
  SC.Event.remove(rawRequest, 'readystatechange', this, this.finishRequest);
619
685
  } else {
620
686
  rawRequest.onreadystatechange = null;
@@ -7,15 +7,15 @@
7
7
  // ========================================================================
8
8
  // SC.Request Base Tests
9
9
  // ========================================================================
10
- /*globals module test ok isObj equals expects */
10
+ /*globals module, test, ok, isObj, equals, expects */
11
11
 
12
12
  var url, request, contents ;
13
13
 
14
14
  module("SC.Request", {
15
15
 
16
16
  setup: function() {
17
- url = sc_static("file_exists.json"); //"/static/sproutcore/en/desktop/_src/desktop.platform/english.lproj/file_exists.json" ;
18
- request = SC.Request.getUrl(url) ;
17
+ url = sc_static("file_exists.json");
18
+ request = SC.Request.getUrl(url);
19
19
  contents = null ;
20
20
  },
21
21
 
@@ -164,14 +164,12 @@ test("Test Multiple Asynchronous GET Request - two immediate, and two in serial"
164
164
  }, 2000);
165
165
  });
166
166
 
167
- /**
168
- There are two ways to be notified of request changes:
169
167
 
170
- - Implementing a didReceive function on the SC.Request object
171
- - Registering a listener using notify()
168
+ // There are two ways to be notified of request changes:
169
+ // - Implementing a didReceive function on the SC.Request object
170
+ // - Registering a listener using notify()
171
+ // The following two tests test the timeout functionality for each of these.
172
172
 
173
- The following two tests test the timeout functionality for each of these.
174
- */
175
173
  test("Timeouts - SC.Request didReceive callback", function() {
176
174
  var message;
177
175
 
@@ -275,8 +273,6 @@ test("Timeouts - Status listener callback", function() {
275
273
  });
276
274
 
277
275
  test("Test Multiple listeners per single status response", function() {
278
-
279
-
280
276
  var numResponses = 0;
281
277
  var response;
282
278
 
@@ -284,16 +280,16 @@ test("Test Multiple listeners per single status response", function() {
284
280
 
285
281
  request.notify(200, this, function(response) {
286
282
  numResponses++;
287
- ok(true, "Receieved a response");
283
+ ok(true, "Received a response");
288
284
 
289
- if (numResponses === 2) window.start();
285
+ if (numResponses === 2) { window.start(); }
290
286
  });
291
287
 
292
288
  request.notify(200, this, function(response) {
293
289
  numResponses++;
294
- ok(true, "Receieved a response");
290
+ ok(true, "Received a response");
295
291
 
296
- if (numResponses === 2) window.start();
292
+ if (numResponses === 2) { window.start(); }
297
293
  });
298
294
 
299
295
  response = request.send();
@@ -303,3 +299,188 @@ test("Test Multiple listeners per single status response", function() {
303
299
  stop() ; // stops the test runner - wait for response
304
300
  });
305
301
 
302
+
303
+ /**
304
+ There was a short-lived bug where the additional Arguments passed to notify()
305
+ were being dropped because the slice on 'arguments' was happening after they
306
+ had already been adjusted.
307
+ */
308
+ test("Multiple arguments passed to notify()", function() {
309
+ var response;
310
+
311
+ request.notify(this, function(response, a, b, c) {
312
+ equals(a, 'a', "Listener called with argument 'a'");
313
+ equals(b, 'b', "Listener called with argument 'b'");
314
+ equals(c, 'c', "Listener called with argument 'c'");
315
+
316
+ window.start();
317
+ }, 'a', 'b', 'c');
318
+
319
+ request.notify(200, this, function(response, a, b, c) {
320
+ equals(a, 'a', "Listener called with argument 'a'");
321
+ equals(b, 'b', "Listener called with argument 'b'");
322
+ equals(c, 'c', "Listener called with argument 'c'");
323
+
324
+ window.start();
325
+ }, 'a', 'b', 'c');
326
+
327
+ response = request.send();
328
+
329
+ stop() ; // stops the test runner - wait for response
330
+ });
331
+
332
+
333
+ test("Test event listeners on successful request.", function() {
334
+ var abort = false,
335
+ error = false,
336
+ load = false,
337
+ loadend = false,
338
+ loadstart = false,
339
+ progress = false,
340
+ response,
341
+ status,
342
+ timeout = false;
343
+
344
+ request.notify("loadstart", this, function(evt) {
345
+ loadstart = true;
346
+ });
347
+
348
+ request.notify("progress", this, function(evt) {
349
+ progress = true;
350
+ });
351
+
352
+ request.notify("load", this, function(evt) {
353
+ load = true;
354
+ });
355
+
356
+ request.notify("loadend", this, function(evt) {
357
+ loadend = true;
358
+ });
359
+
360
+ request.notify(200, this, function(response) {
361
+ status = response.status;
362
+
363
+ ok(loadstart, "Received a loadstart event.");
364
+ ok(progress, "Received a progress event.");
365
+ ok(load, "Received a load event.");
366
+ ok(loadend, "Received a loadend event.");
367
+ ok(!abort, "Did not receive an abort event.");
368
+ ok(!error, "Did not receive an error event.");
369
+ ok(!timeout, "Did not receive a timeout event.");
370
+ equals(status, 200, "Received a response with status 200.");
371
+
372
+ window.start();
373
+ });
374
+
375
+ response = request.send();
376
+
377
+ stop() ; // stops the test runner - wait for response
378
+ });
379
+
380
+
381
+ test("Test event listeners on aborted request.", function() {
382
+ var abort = false,
383
+ error = false,
384
+ load = false,
385
+ loadend = false,
386
+ loadstart = false,
387
+ progress = false,
388
+ response,
389
+ status,
390
+ timeout = false;
391
+
392
+ request.notify("loadstart", this, function(evt) {
393
+ loadstart = true;
394
+ });
395
+
396
+ request.notify("progress", this, function(evt) {
397
+ progress = true;
398
+
399
+ // Cancel it before it completes.
400
+ response.cancel();
401
+ });
402
+
403
+ request.notify("abort", this, function(evt) {
404
+ abort = true;
405
+ });
406
+
407
+ request.notify("loadend", this, function(evt) {
408
+ loadend = true;
409
+
410
+ ok(loadstart, "Received a loadstart event.");
411
+ ok(progress, "Received a progress event.");
412
+ ok(abort, "Received an abort event.");
413
+ ok(!load, "Did not receive a load event.");
414
+ ok(loadend, "Received a loadend event.");
415
+ ok(!error, "Did not receive an error event.");
416
+ ok(!timeout, "Did not receive a timeout event.");
417
+ equals(status, undefined, "Did not receive a status notification.");
418
+
419
+ window.start();
420
+ });
421
+
422
+ request.notify(this, function(response) {
423
+ status = response.status;
424
+ });
425
+
426
+ response = request.send();
427
+
428
+ stop(); // stops the test runner - wait for response
429
+ });
430
+
431
+ test("Test upload event listeners on successful request.", function() {
432
+ var abort = false,
433
+ body = {},
434
+ error = false,
435
+ load = false,
436
+ loadend = false,
437
+ loadstart = false,
438
+ progress = false,
439
+ response,
440
+ status,
441
+ timeout = false;
442
+
443
+ // Use a POST request
444
+ request = SC.Request.postUrl('/');
445
+
446
+ request.notify("upload.loadstart", this, function(evt) {
447
+ loadstart = true;
448
+ });
449
+
450
+ request.notify("upload.progress", this, function(evt) {
451
+ progress = true;
452
+ });
453
+
454
+ request.notify("upload.load", this, function(evt) {
455
+ load = true;
456
+ });
457
+
458
+ request.notify("upload.loadend", this, function(evt) {
459
+ loadend = true;
460
+ });
461
+
462
+ request.notify(200, this, function(response) {
463
+ status = response.status;
464
+
465
+ ok(loadstart, "Received a loadstart event.");
466
+ ok(progress, "Received a progress event.");
467
+ ok(load, "Received a load event.");
468
+ ok(loadend, "Received a loadend event.");
469
+ ok(!abort, "Did not receive an abort event.");
470
+ ok(!error, "Did not receive an error event.");
471
+ ok(!timeout, "Did not receive a timeout event.");
472
+ equals(status, 200, "Received a response with status 200.");
473
+
474
+ window.start();
475
+ });
476
+
477
+ // Make a significant body object.
478
+ var i;
479
+ for (i = 10000; i >= 0; i--) {
480
+ body['k' + i] = 'v' + i;
481
+ }
482
+
483
+ response = request.send(body);
484
+
485
+ stop() ; // stops the test runner - wait for response
486
+ });
@@ -420,7 +420,7 @@ SC.detectBrowser = function(userAgent, language) {
420
420
  /** @deprecated Since version 1.7. Use browser.name. See SC.BROWSER for possible values.
421
421
  Possible values:
422
422
 
423
- - 'msie'
423
+ - 'ie'
424
424
  - 'mozilla'
425
425
  - 'chrome'
426
426
  - 'safari'
@@ -63,8 +63,14 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
63
63
 
64
64
  If you set this property to a key name, array of key names, or a function,
65
65
  then then ArrayController will automatically reorder your content array
66
- to match the sort order. (If you set a function, the function will be
67
- used to sort).
66
+ to match the sort order. When using key names, you may specify the
67
+ direction of the sort by appending ASC or DESC to the key name. By default
68
+ sorting is done in ascending order.
69
+
70
+ For example,
71
+
72
+ myController.set('orderBy', 'title DESC');
73
+ myController.set('orderBy', ['lastName ASC', 'firstName DESC']);
68
74
 
69
75
  Normally, you should only use this property if you set the content of the
70
76
  controller to an unordered enumerable such as SC.Set or SC.SelectionSet.
@@ -373,18 +379,27 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
373
379
 
374
380
  // generate comparison function if needed - use orderBy
375
381
  func = func || function(a,b) {
376
- var status, key, match, descending;
382
+ var status, key, match, valueA, valueB;
377
383
 
378
384
  for(var i=0, l=orderBy.get('length'); i<l && !status; i++) {
379
385
  key = orderBy.objectAt(i);
380
386
 
381
- match = key.match(/^(ASC )?(DESC )?(.*)$/);
382
- key = match[3]; order = match[2] ? -1 : 1;
383
-
384
- if (a) { a = a.isObservable ? a.get(key) : a[key]; }
385
- if (b) { b = b.isObservable ? b.get(key) : b[key]; }
386
-
387
- status = SC.compare(a, b) * order;
387
+ if (key.search(/(ASC|DESC)/) === 0) {
388
+ //@if(debug)
389
+ SC.warn("Developer Warning: SC.ArrayController's orderBy direction syntax has been changed to match that of SC.Query and MySQL. Please change your String to 'key DESC' or 'key ASC'. Having 'ASC' or 'DESC' precede the key has been deprecated.");
390
+ //@endif
391
+ match = key.match(/^(ASC )?(DESC )?(.*)$/);
392
+ key = match[3];
393
+ } else {
394
+ match = key.match(/^(\S*)\s*(DESC)?(?:ASC)?$/);
395
+ key = match[1];
396
+ }
397
+ order = match[2] ? -1 : 1;
398
+
399
+ if (a) { valueA = a.isObservable ? a.get(key) : a[key]; }
400
+ if (b) { valueB = b.isObservable ? b.get(key) : b[key]; }
401
+
402
+ status = SC.compare(valueA, valueB) * order;
388
403
  }
389
404
 
390
405
  return status ;
@@ -519,6 +534,7 @@ SC.ArrayController = SC.Controller.extend(SC.Array, SC.SelectionSupport,
519
534
  // of knowing which indices changed. Instead, we just
520
535
  // invalidate the whole array.
521
536
  this.arrayContentDidChange(0, oldlen, newlen);
537
+ this.enumerableContentDidChange(0, oldlen - 1);
522
538
  this.endPropertyChanges();
523
539
  this.updateSelectionAfterContentChange();
524
540
  }.observes('orderBy'),