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
@@ -248,7 +248,6 @@ SC.RenderContext = SC.Builder.create(
248
248
  @returns {SC.RenderContext} new context
249
249
  */
250
250
  begin: function(tagNameOrElement) {
251
- // console.log('%@.begin(%@) called'.fmt(this, tagNameOrElement));
252
251
  return SC.RenderContext(tagNameOrElement, this);
253
252
  },
254
253
 
@@ -267,7 +266,6 @@ SC.RenderContext = SC.Builder.create(
267
266
  Removes an element with the passed id in the currently managed element.
268
267
  */
269
268
  remove: function(elementId) {
270
- // console.log('remove('+elementId+')');
271
269
  if (!elementId) return ;
272
270
 
273
271
  var el, elem = this._elem ;
@@ -356,7 +354,6 @@ SC.RenderContext = SC.Builder.create(
356
354
  @returns {SC.RenderContext}
357
355
  */
358
356
  end: function() {
359
- // console.log('%@.end() called'.fmt(this));
360
357
  // NOTE: If you modify this method, be careful to consider memory usage
361
358
  // and performance here. This method is called frequently during renders
362
359
  // and we want it to be as fast as possible.
@@ -415,7 +412,6 @@ SC.RenderContext = SC.Builder.create(
415
412
  selfClosing = (this._selfClosing === NO) ? NO : (this.length === 1) ;
416
413
  tag = tag + (selfClosing ? ' />' : '>') ;
417
414
 
418
- // console.log('selfClosing == %@'.fmt(selfClosing));
419
415
  strings[this.offset] = tag;
420
416
 
421
417
  // now generate closing tag if needed...
@@ -1007,9 +1003,13 @@ SC.RenderContext.fn.css = SC.RenderContext.fn.addStyle;
1007
1003
  plain text. You should make sure you pass all user-entered data through
1008
1004
  this method to avoid errors. You can also do this with the text() helper
1009
1005
  method on a render context.
1006
+
1007
+ @param {String|Number} text value to escape
1008
+ @returns {String} string with all HTML values properly escaped
1010
1009
  */
1011
1010
  SC.RenderContext.escapeHTML = function(text) {
1012
1011
  if (!text) return '';
1012
+ if (SC.typeOf(text) === SC.T_NUMBER) { text = text.toString(); }
1013
1013
  return text.replace(_escapeHTMLRegex, _escapeHTMLMethod);
1014
1014
  };
1015
1015
  })();
@@ -0,0 +1,31 @@
1
+ /** @scope window
2
+ Polyfill for cross-browser backwards compatible window.requestAnimationFrame
3
+ support.
4
+
5
+ Via Erik Möller:
6
+ http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
7
+ */
8
+ (function() {
9
+ var lastTime = 0;
10
+ var vendors = ['ms', 'moz', 'webkit', 'o'];
11
+ for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
12
+ window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
13
+ window.cancelRequestAnimationFrame = window[vendors[x]+
14
+ 'CancelRequestAnimationFrame'];
15
+ }
16
+
17
+ if (!window.requestAnimationFrame)
18
+ window.requestAnimationFrame = function(callback, element) {
19
+ var currTime = new Date().getTime();
20
+ var timeToCall = Math.max(0, 16 - (currTime - lastTime));
21
+ var id = window.setTimeout(function() { callback(currTime + timeToCall); },
22
+ timeToCall);
23
+ lastTime = currTime + timeToCall;
24
+ return id;
25
+ };
26
+
27
+ if (!window.cancelAnimationFrame)
28
+ window.cancelAnimationFrame = function(id) {
29
+ clearTimeout(id);
30
+ };
31
+ }())
@@ -368,9 +368,15 @@ SC.SparseArray = SC.Object.extend(SC.Observable, SC.Enumerable, SC.Array,
368
368
  this._length += delta;
369
369
  this.propertyDidChange('length');
370
370
  }
371
-
371
+
372
+ // Both arrayContentDidChange and enumerableContentDidChange will invoke
373
+ // "this.notifyPropertyChange('[]')". To prevent multiple notifications
374
+ // these calls are made as grouped property changes.
375
+ this.beginPropertyChanges();
372
376
  this.arrayContentDidChange(idx, amt, len) ;
373
377
  this.enumerableContentDidChange(idx, amt, delta) ;
378
+ this.endPropertyChanges();
379
+
374
380
  return this ;
375
381
  },
376
382
 
@@ -111,7 +111,7 @@ SC.mixin( /** @scope SC */ {
111
111
  // offset to the results of getBoundingClientRect.
112
112
  //
113
113
  // See http://dev.jquery.it/ticket/6446
114
- if (SC.browser.mobileSafari) {
114
+ if (SC.browser.isMobileSafari) {
115
115
  userAgent = navigator.userAgent;
116
116
  index = userAgent.indexOf('Mobile/');
117
117
  mobileBuildNumber = userAgent.substring(index + 7, index + 9);
@@ -124,7 +124,7 @@ SC.mixin( /** @scope SC */ {
124
124
 
125
125
  // Subtract the scroll offset for viewport coordinates
126
126
  if (relativeToFlag === 'viewport') {
127
-
127
+
128
128
  if(SC.browser.isIE8OrLower){
129
129
  result.left -= $(window).scrollLeft();
130
130
  result.top -= $(window).scrollTop();
@@ -136,13 +136,13 @@ SC.mixin( /** @scope SC */ {
136
136
  }
137
137
 
138
138
  // Translate 'left', 'top' to 'x', 'y'
139
-
139
+
140
140
  try{
141
141
  result.x = result.left;
142
142
  result.y = result.top;
143
143
  } catch (e) {
144
- // We need this for IE, when the element is detached, for some strange
145
- // reason the object returned by element.getBoundingClientRect()
144
+ // We need this for IE, when the element is detached, for some strange
145
+ // reason the object returned by element.getBoundingClientRect()
146
146
  // is read-only
147
147
  result = {x:result.left, y:result.top};
148
148
  }
@@ -162,7 +162,9 @@ SC.mixin( /** @scope SC */ {
162
162
  @returns {Point} A hash with x, y offsets.
163
163
  */
164
164
  viewportOffset: function(el) {
165
- console.warn("SC.viewportOffset() has been deprecated in favor of SC.offset(). Please use SC.offset() from here on.");
165
+ //@if(debug)
166
+ SC.warn("Developer Warning: SC.viewportOffset() has been deprecated in favor of SC.offset(). Please use SC.offset() from here on.");
167
+ //@endif
166
168
  var result = SC.offset(el, 'viewport');
167
169
 
168
170
  return {x: result.left, y: result.top};
@@ -14,6 +14,11 @@ var TestObject = SC.Object.extend({
14
14
  toString: function() { return "TestObject(%@)".fmt(this.get("title")); }
15
15
  });
16
16
 
17
+ var ComplexTestObject = SC.Object.extend({
18
+ firstName: null,
19
+ lastName: null,
20
+ toString: function() { return "TestObject(%@ %@)".fmt(this.get("firstName"), this.get('lastName')); }
21
+ });
17
22
 
18
23
  // ..........................................................
19
24
  // EMPTY
@@ -163,6 +168,50 @@ test("arrangedObjects", function() {
163
168
  equals(controller.get("arrangedObjects"), controller, 'c.arrangedObjects should return receiver');
164
169
  });
165
170
 
171
+ test("array orderBy using String", function(){
172
+ var testController = SC.ArrayController.create({
173
+ content: content,
174
+ orderBy: 'title ASC'
175
+ });
176
+
177
+ equals(testController.get('firstSelectableObject'), content[0], 'first selectable object should be the first object in arrangedObjects');
178
+ equals(testController.get('lastObject'), content[4], 'lastObject should be the last object in content');
179
+
180
+ // Reorder the content
181
+ testController.set('orderBy', 'title DESC');
182
+
183
+ equals(testController.get('firstSelectableObject'), content[4], 'first selectable object should be the first object in arrangedObjects (changed order)');
184
+ equals(testController.get('lastObject'), content[0], 'lastObject should be the first object in content (changed order)');
185
+ });
186
+
187
+
188
+ test("array orderBy using Array", function(){
189
+ var complexContent,
190
+ familyNames = "Keating Zane Alberts Keating Keating".w(),
191
+ givenNames = "Travis Harold Brian Alvin Peter".w(),
192
+ testController;
193
+
194
+ complexContent = familyNames.map(function(x, i) {
195
+ return ComplexTestObject.create({ lastName: x, firstName: givenNames.objectAt(i) });
196
+ });
197
+
198
+ testController = SC.ArrayController.create({
199
+ content: complexContent
200
+ });
201
+
202
+ equals(testController.get('firstSelectableObject'), complexContent[0], 'first selectable object should be the first object in arrangedObjects');
203
+
204
+ // Reorder the content
205
+ testController.set('orderBy', ['lastName', 'firstName']); // Brian Alberts, Alvin Keating, Peter Keating, Travis Keating, Harold Zane
206
+ equals(testController.get('firstSelectableObject'), complexContent[2], 'first selectable object should be the first object in arrangedObjects (changed order)');
207
+ equals(testController.objectAt(1), complexContent[3], 'fourth content object should be the second object in arrangedObjects (changed order)');
208
+
209
+ // Reorder the content
210
+ testController.set('orderBy', ['lastName', 'firstName DESC']); // Brian Alberts, Travis Keating, Peter Keating, Alvin Keating,Harold Zane
211
+ equals(testController.objectAt(3), complexContent[3], 'fourth content object should be the fourth object in arrangedObjects (changed order)');
212
+
213
+ });
214
+
166
215
  test("array orderBy using function", function(){
167
216
  var testFunc = function(a,b){
168
217
  if(a.get('title') > b.get('title')) return -1;
@@ -57,7 +57,7 @@ function() {
57
57
  equals(controller.get('firstSelectableObject'), content[0], 'first selectable object should be the first object in arrangedObjects');
58
58
 
59
59
  // Reorder the content
60
- controller.set('orderBy', 'DESC title');
60
+ controller.set('orderBy', 'title DESC');
61
61
 
62
62
  equals(controller.get('firstSelectableObject'), content[4], 'first selectable object should be the first object in arrangedObjects (changed order)');
63
63
  });
@@ -0,0 +1,106 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+ /*globals module, test, start, stop, expect, ok, equals*/
8
+
9
+
10
+ module("Object:invokeOnce()");
11
+
12
+ test("should invoke function using invokeLater after specified time and pass in extra arguments", function() {
13
+ stop(2000);
14
+
15
+ SC.RunLoop.begin();
16
+ var o = SC.Object.create({
17
+ stopped: YES,
18
+
19
+ method: function(a, b, c) {
20
+ equals(a, 'a', "Argument 'a' passed");
21
+ equals(b, 'b', "Argument 'b' passed");
22
+ equals(c, 'c', "Argument 'c' passed");
23
+
24
+ start();
25
+ }
26
+ });
27
+ o.invokeLater('method', 200, 'a', 'b', 'c');
28
+ SC.RunLoop.end();
29
+ });
30
+
31
+ test("should invoke function once multiple times using invokeLater after specified time", function() {
32
+ stop(2000);
33
+ expect(3);
34
+
35
+ SC.RunLoop.begin();
36
+ var o = SC.Object.create({
37
+ stopped: YES,
38
+
39
+ method: function() {
40
+ ok(true, 'method called');
41
+
42
+ if (this.stopped) {
43
+ this.stopped = NO;
44
+ // Continue on in a short moment. Before the test times out, but after
45
+ // enough time for a second call to method to possibly come in.
46
+ setTimeout(function() {
47
+ start();
48
+ }, 100);
49
+ }
50
+ }
51
+ });
52
+ o.invokeLater('method', 200);
53
+ o.invokeLater('method', 200);
54
+ o.invokeLater('method', 200);
55
+ SC.RunLoop.end();
56
+ });
57
+
58
+
59
+
60
+ module("Object:invokeOnceLater()");
61
+
62
+ test("should invoke function using invokeOnceLater after specified time and pass in extra arguments", function() {
63
+ stop(2000);
64
+
65
+ SC.RunLoop.begin();
66
+ var o = SC.Object.create({
67
+ stopped: YES,
68
+
69
+ method: function(a, b, c) {
70
+ equals(a, 'a', "Argument 'a' passed");
71
+ equals(b, 'b', "Argument 'b' passed");
72
+ equals(c, 'c', "Argument 'c' passed");
73
+
74
+ start();
75
+ }
76
+ });
77
+ o.invokeOnceLater('method', 200, 'a', 'b', 'c');
78
+ SC.RunLoop.end();
79
+ });
80
+
81
+ test("should invoke function once using invokeOnceLater after specified time", function() {
82
+ stop(2000);
83
+ expect(1);
84
+
85
+ SC.RunLoop.begin();
86
+ var o = SC.Object.create({
87
+ stopped: YES,
88
+
89
+ method: function() {
90
+ ok(true, 'method called');
91
+
92
+ if (this.stopped) {
93
+ this.stopped = NO;
94
+ // Continue on in a short moment. Before the test times out, but after
95
+ // enough time for a second call to method to possibly come in.
96
+ setTimeout(function() {
97
+ start();
98
+ }, 100);
99
+ }
100
+ }
101
+ });
102
+ o.invokeOnceLater('method', 200);
103
+ o.invokeOnceLater('method', 200);
104
+ o.invokeOnceLater('method', 200);
105
+ SC.RunLoop.end();
106
+ });
@@ -0,0 +1,448 @@
1
+ // ==========================================================================
2
+ // Project: SproutCore - JavaScript Application Framework
3
+ // Copyright: ©2006-2011 Strobe Inc. and contributors.
4
+ // Portions ©2008-2011 Apple Inc. All rights reserved.
5
+ // License: Licensed under MIT license (see license.js)
6
+ // ==========================================================================
7
+
8
+ // ...............................................
9
+ // SC.Color.from parsing
10
+ //
11
+
12
+ function matches(c, r, g, b, a, msg) {
13
+ var isEqual = c.r === r &&
14
+ c.g === g &&
15
+ c.b === b &&
16
+ c.a === a;
17
+ ok(isEqual, msg + " [rgba(%@, %@, %@) === rgba(%@, %@, %@, %@)]".fmt(r, g, b, a,
18
+ c.r, c.g, c.b, c.a));
19
+ };
20
+
21
+ test("SC.Color.from(rgb)", function () {
22
+ matches(SC.Color.from("rgb(212, 15, 2)"),
23
+ 212, 15, 2, 1,
24
+ "rgb() colors should be parseable");
25
+ matches(SC.Color.from("rgb(10000, 20, 256)"),
26
+ 255, 20, 255, 1,
27
+ "Colors should be clamped to the device gamut");
28
+
29
+ matches(SC.Color.from("rgb(10%, 20%, 30%)"),
30
+ 26, 51, 77, 1,
31
+ "rgb should allow percents as values");
32
+
33
+ matches(SC.Color.from("rgb(140%, 200%, 350%)"),
34
+ 255, 255, 255, 1,
35
+ "rgb percents should be clamped to the device gamut");
36
+
37
+ ok(SC.Color.from("rgb(1,2,3)"), "Whitespace shouldn't matter");
38
+ ok(SC.Color.from("rgb(1 , 2 , 3 )"), "Whitespace shouldn't matter");
39
+ });
40
+
41
+ test("SC.Color.from(rgba)", function () {
42
+ matches(SC.Color.from("rgba(212, 15, 2, .2)"),
43
+ 212, 15, 2, .2,
44
+ "rgba() colors should be parseable");
45
+ matches(SC.Color.from("rgba(260, 255, 20, 1.5)"),
46
+ 255, 255, 20, 1,
47
+ "Alpha should be clamped to 1");
48
+
49
+ matches(SC.Color.from("rgba(10%, 20%, 30%, .5)"),
50
+ 26, 51, 77, .5,
51
+ "rgba should allow percents as values");
52
+
53
+ matches(SC.Color.from("rgba(140%, 200%, 350%, .5)"),
54
+ 255, 255, 255, .5,
55
+ "rgba percents should be clamped to the device gamut");
56
+
57
+ ok(!SC.Color.from("rgba(255, 255, 255, -.2)"),
58
+ "Invalid alpha should make the SC.Color.from return 'NO'");
59
+
60
+ ok(SC.Color.from("rgba(1,2,3,1)"), "Whitespace shouldn't matter");
61
+ ok(SC.Color.from("rgba(1 , 2 , 3 , 1 )"), "Whitespace shouldn't matter");
62
+ });
63
+
64
+ test("SC.Color.from() with invalid rgb colors", function () {
65
+ ok(!SC.Color.from("rgb(0, 0, 0, 0)"), "Too many arguments");
66
+
67
+ ok(!SC.Color.from("rgba(0, 0, 0)"), "Too few arguments");
68
+ ok(!SC.Color.from("rgb(0, 0)"), "Too few arguments");
69
+
70
+ ok(!SC.Color.from("rgb(0.0, 0.0, 0.0)"), "Floats are not allowed");
71
+
72
+ ok(!SC.Color.from("rgb(0, 0, 0"), "Missing parenthesis");
73
+
74
+ ok(!SC.Color.from("rgb(260, -10, 5)"), "Negative numbers");
75
+ });
76
+
77
+ test("SC.Color.from(#rgb)", function () {
78
+ matches(SC.Color.from("#21a"),
79
+ 34, 17, 170, 1,
80
+ "#rgb colors should be parseable");
81
+
82
+ ok(SC.Color.from("#ABC").isEqualTo(
83
+ SC.Color.from("#abc")),
84
+ "Character casing should not matter with hex colors");
85
+ });
86
+
87
+ test("SC.Color.from(#rrggbb)", function () {
88
+ matches(SC.Color.from("#ABCDEF"),
89
+ 171, 205, 239, 1,
90
+ "#rrggbb colors should be parseable");
91
+
92
+ ok(SC.Color.from("#ABCDEF").isEqualTo(
93
+ SC.Color.from("#abcdef")),
94
+ "Character casing should not matter with hex colors");
95
+ });
96
+
97
+ test("SC.Color.from(#aarrggbb)", function () {
98
+ matches(SC.Color.from("#00ABCDEF"),
99
+ 171, 205, 239, 0,
100
+ "#aarrggbb colors should be parseable");
101
+
102
+ ok(SC.Color.from("#BAABCDEF").isEqualTo(
103
+ SC.Color.from("#baabcdef")),
104
+ "Character casing should not matter with hex colors");
105
+ });
106
+
107
+ test("SC.Color.from() with invalid hex colors", function () {
108
+ ok(!SC.Color.from("#GAB"), "Invalid character");
109
+
110
+ ok(!SC.Color.from("#0000"), "Invalid length");
111
+ ok(!SC.Color.from("#00000"), "Invalid length");
112
+ ok(!SC.Color.from("#0000000"), "Invalid length");
113
+ });
114
+
115
+ test("SC.Color.from(hsl)", function () {
116
+ matches(SC.Color.from("hsl(330, 60%, 54%)"),
117
+ 208, 67, 138, 1,
118
+ "hsl() colors should be parseable");
119
+
120
+ matches(SC.Color.from("hsl(-90, 50%, 44%)"),
121
+ 112, 56, 168, 1,
122
+ "negative hues should be allowed");
123
+
124
+ matches(SC.Color.from("hsl(-810, 50%, 44%)"),
125
+ 112, 56, 168, 1,
126
+ "negative hues should be allowed");
127
+
128
+ matches(SC.Color.from("hsl(690, 60%, 54%)"),
129
+ 208, 67, 138, 1,
130
+ "hues above 360 degrees should be valid");
131
+
132
+ matches(SC.Color.from("hsl(1050, 60%, 54%)"),
133
+ 208, 67, 138, 1,
134
+ "hues above 360 degrees should be valid");
135
+
136
+ matches(SC.Color.from("hsl(1050, 150%, 190%)"),
137
+ 255, 255, 255, 1,
138
+ "luminosity and saturation should be clamped between 0 and 100");
139
+
140
+ ok(SC.Color.from("hsl(1,2%,3%)"), "Whitespace shouldn't matter");
141
+ ok(SC.Color.from("hsl(1 , 2% , 3% )"), "Whitespace shouldn't matter");
142
+ });
143
+
144
+ test("SC.Color.from(hsla)", function () {
145
+ matches(SC.Color.from("hsla(210, 87%, 55%, 0.4)"),
146
+ 40, 140, 240, .4,
147
+ "hsla() colors should be parseable");
148
+
149
+ matches(SC.Color.from("hsla(-150, 87%, 55%, 0.4)"),
150
+ 40, 140, 240, .4,
151
+ "negative hues should be allowed");
152
+
153
+ matches(SC.Color.from("hsla(-510, 87%, 55%, 0.4)"),
154
+ 40, 140, 240, .4,
155
+ "negative hues should be allowed");
156
+
157
+ matches(SC.Color.from("hsla(570, 87%, 55%, 0.4)"),
158
+ 40, 140, 240, .4,
159
+ "hues above 360 degrees should be valid");
160
+
161
+ matches(SC.Color.from("hsla(930, 87%, 55%, 0.4)"),
162
+ 40, 140, 240, .4,
163
+ "hues above 360 degrees should be valid");
164
+
165
+ matches(SC.Color.from("hsla(930, 0427%, 200%, 0.4)"),
166
+ 255, 255, 255, .4,
167
+ "luminosity and saturation should be clamped between 0 and 100");
168
+
169
+ ok(SC.Color.from("hsla(1,2%,3%,1)"), "Whitespace shouldn't matter");
170
+ ok(SC.Color.from("hsla(1 , 2% , 3% , 1 )"), "Whitespace shouldn't matter");
171
+ });
172
+
173
+ test("SC.Color.from(transparent)", function () {
174
+ matches(SC.Color.from("transparent"),
175
+ 0, 0, 0, 0,
176
+ "transparent should be black with an alpha of 0");
177
+ });
178
+
179
+ test("SC.Color.from(white, black)", function () {
180
+ matches(SC.Color.from("white"),
181
+ 255, 255, 255, 1,
182
+ "white should convert to rgb(255, 255, 255)");
183
+
184
+ matches(SC.Color.from("black"),
185
+ 0, 0, 0, 1,
186
+ "black should convert to rgb(0, 0, 0)");
187
+ });
188
+
189
+ // ...............................................
190
+ // SC.Color helper functions
191
+ //
192
+
193
+ test("SC.Color.clamp", function () {
194
+ equals(SC.Color.clamp(0, 0, 1), 0);
195
+ equals(SC.Color.clamp(.5, 0, 1), .5);
196
+ equals(SC.Color.clamp(1, 0, 1), 1);
197
+
198
+ equals(SC.Color.clamp(-1, 0, 1), 0);
199
+ equals(SC.Color.clamp(2, 0, 1), 1);
200
+ });
201
+
202
+ test("SC.Color.clampInt", function () {
203
+ equals(SC.Color.clampInt(0, 0, 1), 0);
204
+ equals(SC.Color.clampInt(.5, 0, 1), 1);
205
+ equals(SC.Color.clampInt(1, 0, 1), 1);
206
+
207
+ equals(SC.Color.clampInt(-1, 0, 1), 0);
208
+ equals(SC.Color.clampInt(2, 0, 1), 1);
209
+ });
210
+
211
+ test("SC.Color.clampToDeviceGamut", function () {
212
+ equals(SC.Color.clampToDeviceGamut(250.25), 250);
213
+ equals(SC.Color.clampToDeviceGamut(260), 255);
214
+ equals(SC.Color.clampToDeviceGamut(-20), 0);
215
+ });
216
+
217
+ test("SC.Color.supportsArgb", function () {
218
+ ok(SC.Color.hasOwnProperty('supportsArgb'),
219
+ "supportsARGB should exist on SC.Color");
220
+ });
221
+
222
+ test("SC.Color.supportsRgba", function () {
223
+ ok(SC.Color.hasOwnProperty('supportsRgba'),
224
+ "supportsRGBA should exist on SC.Color");
225
+ });
226
+
227
+ // ...............................................
228
+ // SC.Color color space conversion functions
229
+ //
230
+
231
+ test("SC.Color.hsvToRgb", function () {
232
+ var rgb = SC.Color.hsvToRgb(252, .94, .7843),
233
+ isValid;
234
+
235
+ isValid = rgb[0] === 50 &&
236
+ rgb[1] === 12 &&
237
+ rgb[2] === 200;
238
+ ok(isValid, "[rgb(50, 12, 200) === rgb(" + rgb.join(', ') + ")");
239
+ });
240
+
241
+ test("SC.Color.rgbToHsv", function () {
242
+ var hsv = SC.Color.rgbToHsv(50, 12, 200),
243
+ isValid;
244
+
245
+ hsv[0] = Math.round(hsv[0]);
246
+ hsv[1] = Math.round(hsv[1] * 100);
247
+ hsv[2] = Math.round(hsv[2] * 100);
248
+
249
+ isValid = hsv[0] === 252 &&
250
+ hsv[1] === 94 &&
251
+ hsv[2] === 78;
252
+ ok(isValid, "[rgb(50, 12, 200) === hsv(212, 75%, 49%) === hsv(" + hsv.join(', ') + ")]");
253
+ });
254
+
255
+ test("Converting between color spaces doesn't reduce accuracy", function () {
256
+ var rgb = [20, 145, 42],
257
+ cRgb = SC.Color.hsvToRgb.apply(null, SC.Color.rgbToHsv.apply(null, rgb));
258
+
259
+ ok(rgb[0] === cRgb[0] &&
260
+ rgb[1] === cRgb[1] &&
261
+ rgb[2] === cRgb[2]);
262
+
263
+ cRgb = SC.Color.hslToRgb.apply(null, SC.Color.rgbToHsl.apply(null, rgb));
264
+
265
+ ok(rgb[0] === cRgb[0] &&
266
+ rgb[1] === cRgb[1] &&
267
+ rgb[2] === cRgb[2]);
268
+ });
269
+
270
+ // ...............................................
271
+ // SC.Copyable
272
+ //
273
+
274
+ test("SC.Color.isCopyable", function () {
275
+ ok(SC.Color.create().isCopyable);
276
+ });
277
+
278
+ test("SC.Color copy() creates a clone of the current color", function () {
279
+ var teal = SC.Color.from("teal"),
280
+ cTeal = teal.copy();
281
+
282
+ ok(teal.isEqualTo(cTeal), "the colors should be equivalent");
283
+ teal.incrementProperty('hue', 30);
284
+ ok(!teal.isEqualTo(cTeal), "mutating one color should not affect the other");
285
+ });
286
+
287
+ // ...............................................
288
+ // SC.Color properties
289
+ //
290
+
291
+ test("SC.Color#cssText", function () {
292
+ var color = SC.Color.create({
293
+ r: 255, g: 255, b: 255
294
+ });
295
+ equals(color.get('cssText'), '#ffffff');
296
+
297
+ color.set('r', 0);
298
+ equals(color.get('cssText'), '#00ffff');
299
+
300
+ color.set('g', 128);
301
+ equals(color.get('cssText'), '#0080ff');
302
+
303
+ color.set('b', 128);
304
+ equals(color.get('cssText'), '#008080');
305
+
306
+ color.set('a', 0.5);
307
+ ok(color.get('cssText') !== '#008080');
308
+ });
309
+
310
+ test("SC.Color#hue", function () {
311
+ var color = SC.Color.from("hsl(330, 60%, 54%)"),
312
+ round = Math.round;
313
+
314
+ equals(round(color.get('hue')), 330);
315
+
316
+ color.set('hue', 300);
317
+
318
+ equals(color.get('r'), 208);
319
+ equals(color.get('g'), 67);
320
+ equals(color.get('b'), 208);
321
+
322
+ equals(round(color.get('hue')), 300);
323
+ });
324
+
325
+ test("SC.Color#saturation", function () {
326
+ var color = SC.Color.from("hsl(330, 60%, 54%)"),
327
+ round = Math.round;
328
+
329
+ equals(round(color.get('saturation') * 100), 60);
330
+
331
+ color.set('saturation', .5);
332
+
333
+ equals(color.get('r'), 196);
334
+ equals(color.get('g'), 79);
335
+ equals(color.get('b'), 138);
336
+
337
+ equals(round(color.get('saturation') * 100), 50);
338
+ });
339
+
340
+ test("SC.Color#luminosity", function () {
341
+ var color = SC.Color.from("hsl(330, 60%, 54%)"),
342
+ round = Math.round;
343
+
344
+ equals(round(color.get('luminosity') * 100), 54);
345
+
346
+ color.set('luminosity', .74);
347
+
348
+ equals(color.get('r'), 228);
349
+ equals(color.get('g'), 149);
350
+ equals(color.get('b'), 189);
351
+
352
+ equals(round(color.get('luminosity') * 100), 74);
353
+ });
354
+
355
+ test("SC.Color#isEqualTo", function () {
356
+ var white = SC.Color.from("white"),
357
+ cWhite = SC.Color.create({ r: 255, g: 255, b: 255 });
358
+
359
+ ok(white.isEqualTo(cWhite));
360
+ });
361
+
362
+ test("SC.Color#toRgb", function () {
363
+ equals(SC.Color.create({ r: 50, g: 240, b: 250, a: .4 }).toRgb(),
364
+ "rgb(50,240,250)");
365
+
366
+ equals(SC.Color.create({ r: -50, g: 270, b: 250 }).toRgb(),
367
+ "rgb(0,255,250)",
368
+ "Color clamping should occur");
369
+ });
370
+
371
+ test("SC.Color#toRgba", function () {
372
+ equals(SC.Color.create({ r: 50, g: 240, b: 250, a: .4 }).toRgba(),
373
+ "rgba(50,240,250,0.4)");
374
+
375
+ equals(SC.Color.create({ r: -50, g: 270, b: 250 }).toRgba(),
376
+ "rgba(0,255,250,1)",
377
+ "Color clamping should occur");
378
+ });
379
+
380
+ test("SC.Color#toHex", function () {
381
+ equals(SC.Color.create({ r: 50, g: 240, b: 250, a: .4 }).toHex(),
382
+ "#32f0fa");
383
+
384
+ equals(SC.Color.create({ r: -50, g: 270, b: 250 }).toHex(),
385
+ "#00fffa",
386
+ "Color clamping should occur");
387
+ });
388
+
389
+ test("SC.Color#toArgb", function () {
390
+ equals(SC.Color.create({ r: 50, g: 240, b: 250, a: .4 }).toArgb(),
391
+ "#6632f0fa");
392
+
393
+ equals(SC.Color.create({ r: -50, g: 270, b: 250 }).toArgb(),
394
+ "#ff00fffa",
395
+ "Color clamping should occur");
396
+ });
397
+
398
+ test("SC.Color#toHsl", function () {
399
+ equals(SC.Color.create({ r: 50, g: 240, b: 250, a: .4 }).toHsl(),
400
+ "hsl(183,95%,59%)");
401
+
402
+ equals(SC.Color.create({ r: -50, g: 270, b: 250 }).toHsl(),
403
+ "hsl(179,100%,50%)",
404
+ "Color clamping should occur");
405
+ });
406
+
407
+ test("SC.Color#toHsla", function () {
408
+ equals(SC.Color.create({ r: 50, g: 240, b: 250, a: .4 }).toHsla(),
409
+ "hsla(183,95%,59%,0.4)");
410
+
411
+ equals(SC.Color.create({ r: -50, g: 270, b: 250 }).toHsla(),
412
+ "hsla(179,100%,50%,1)",
413
+ "Color clamping should occur");
414
+ });
415
+
416
+ test("SC.Color#add", function () {
417
+ var white = SC.Color.create({ r: 255, g: 255, b: 255 }),
418
+ red = SC.Color.create({ r: 255, g: 0, b: 25, a: .4 }),
419
+ c;
420
+
421
+ c = white.add(red);
422
+ equals(c.get('r'), 510);
423
+ equals(c.get('g'), 255);
424
+ equals(c.get('b'), 280);
425
+ equals(c.get('a'), 1.4);
426
+ });
427
+
428
+ test("SC.Color#sub", function () {
429
+ var white = SC.Color.create({ r: 255, g: 255, b: 255 }),
430
+ red = SC.Color.create({ r: 255, g: 0, b: 25, a: .4 }),
431
+ c;
432
+
433
+ c = white.sub(red);
434
+ equals(c.get('r'), 0);
435
+ equals(c.get('g'), 255);
436
+ equals(c.get('b'), 230);
437
+ equals(c.get('a'), .6);
438
+ });
439
+
440
+ test("SC.Color#mult", function () {
441
+ var c = SC.Color.create({ r: 10, g: 20, b: 30 });
442
+
443
+ c = c.mult(.5);
444
+ equals(c.get('r'), 5);
445
+ equals(c.get('g'), 10);
446
+ equals(c.get('b'), 15);
447
+ equals(c.get('a'), .5);
448
+ });