sproutcore 1.7.1.beta → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. data/CHANGELOG +44 -0
  2. data/README.rdoc +20 -20
  3. data/VERSION.yml +3 -3
  4. data/lib/Buildfile +1 -1
  5. data/lib/buildtasks/build.rake +5 -0
  6. data/lib/buildtasks/manifest.rake +19 -1
  7. data/lib/frameworks/sproutcore/Buildfile +19 -17
  8. data/lib/frameworks/sproutcore/CHANGELOG.md +163 -29
  9. data/lib/frameworks/sproutcore/README.md +29 -8
  10. data/lib/frameworks/sproutcore/apps/statechart_routing/Buildfile +12 -0
  11. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/login_controller.js +11 -0
  12. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/main_controller.js +7 -0
  13. data/lib/frameworks/sproutcore/apps/statechart_routing/controllers/statechart_controller.js +17 -0
  14. data/lib/frameworks/sproutcore/apps/statechart_routing/core.js +25 -0
  15. data/lib/frameworks/sproutcore/apps/statechart_routing/main.js +15 -0
  16. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/_theme.css +18 -0
  17. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/bar_page.js +14 -0
  18. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/foo_page.js +14 -0
  19. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/loading.rhtml +9 -0
  20. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/login_page.js +61 -0
  21. data/lib/frameworks/sproutcore/apps/statechart_routing/resources/main_page.js +46 -0
  22. data/lib/frameworks/sproutcore/apps/statechart_routing/statechart.js +76 -0
  23. data/lib/frameworks/sproutcore/apps/statechart_routing/theme.js +27 -0
  24. data/lib/frameworks/sproutcore/apps/tests/controllers/targets.js +1 -1
  25. data/lib/frameworks/sproutcore/apps/tests/states/no_targets.js +1 -1
  26. data/lib/frameworks/sproutcore/apps/tests/states/ready_detail.js +1 -1
  27. data/lib/frameworks/sproutcore/apps/tests/states/ready_empty.js +1 -1
  28. data/lib/frameworks/sproutcore/apps/tests/states/ready_list.js +1 -1
  29. data/lib/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +1 -1
  30. data/lib/frameworks/sproutcore/apps/welcome/controllers/targets.js +1 -1
  31. data/lib/frameworks/sproutcore/frameworks/ajax/system/request.js +14 -1
  32. data/lib/frameworks/sproutcore/frameworks/ajax/system/response.js +15 -15
  33. data/lib/frameworks/sproutcore/frameworks/ajax/tests/system/request.js +1 -1
  34. data/lib/frameworks/sproutcore/frameworks/animation/core.js +8 -5
  35. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +302 -70
  36. data/lib/frameworks/sproutcore/frameworks/bootstrap/system/loader.js +19 -14
  37. data/lib/frameworks/sproutcore/frameworks/bootstrap/tests/system/browser.js +471 -149
  38. data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +3 -3
  39. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/object.js +42 -0
  40. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/run_loop.js +3 -2
  41. data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/string.js +7 -0
  42. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +1 -1
  43. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/delegate_support.js +2 -2
  44. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/responder_context.js +3 -3
  45. data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/selection_support.js +1 -1
  46. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/body_overflow.js +63 -0
  47. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/keyboard.js +1 -1
  48. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/layout.js +37 -2
  49. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/main.js +28 -6
  50. data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +10 -3
  51. data/lib/frameworks/sproutcore/frameworks/core_foundation/protocols/sparse_array_delegate.js +2 -2
  52. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/browser.js +66 -2
  53. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/builder.js +1 -1
  54. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/cursor.js +1 -1
  55. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +58 -57
  56. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js +1 -1
  57. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/locale.js.orig +445 -0
  58. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +51 -31
  59. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/ready.js +5 -1
  60. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/render_context.js +53 -69
  61. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/responder.js +1 -1
  62. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +98 -72
  63. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/string.js +37 -3
  64. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/timer.js +7 -4
  65. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/array/array_case.js +21 -0
  66. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/controllers/object/content_destroyed.js +7 -7
  67. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/string.js +23 -1
  68. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/browser.js +66 -0
  69. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/event.js +22 -0
  70. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/locale.js +11 -11
  71. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/end.js +4 -4
  72. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/escape_html.js +41 -0
  73. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_className.js +1 -1
  74. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/helpers_style.js +8 -8
  75. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/render_context/update.js +17 -16
  76. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/system/selection_set/remove.js +1 -1
  77. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/build_children.js +1 -1
  78. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +15 -0
  79. data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/createChildViews.js +5 -5
  80. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +50 -30
  81. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/acceleration.js +46 -0
  82. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/animation.js +1 -43
  83. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +8 -34
  84. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout.js +3 -2
  85. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +10 -1
  86. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/manipulation.js +6 -5
  87. data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/theming.js +22 -2
  88. data/lib/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +2 -2
  89. data/lib/frameworks/sproutcore/frameworks/datastore/mixins/relationship_support.js +1 -1
  90. data/lib/frameworks/sproutcore/frameworks/datastore/models/child_attribute.js +0 -2
  91. data/lib/frameworks/sproutcore/frameworks/datastore/models/children_attribute.js +35 -0
  92. data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +46 -19
  93. data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +23 -9
  94. data/lib/frameworks/sproutcore/frameworks/datastore/models/single_attribute.js +2 -3
  95. data/lib/frameworks/sproutcore/frameworks/datastore/system/many_array.js +1 -1
  96. data/lib/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +2 -2
  97. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +294 -302
  98. data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js.orig +1531 -0
  99. data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +4 -2
  100. data/lib/frameworks/sproutcore/frameworks/datastore/system/store.js +14 -11
  101. data/lib/frameworks/sproutcore/frameworks/datastore/tests/integration/many_array.js +63 -0
  102. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +1 -1
  103. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record.js +4 -4
  104. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array.js +50 -10
  105. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_array_complex.js +4 -4
  106. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/nested_records/nested_record_complex.js +3 -3
  107. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/destroy.js +1 -1
  108. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/refresh.js +1 -1
  109. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +1 -1
  110. data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +114 -67
  111. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +1 -1
  112. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +1 -1
  113. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare.js +54 -1
  114. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +29 -9
  115. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/parse.js +1 -1
  116. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +1 -1
  117. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/flush.js +1 -1
  118. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/cancelRecord.js +1 -1
  119. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitChangesFromNestedStore.js +1 -1
  120. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +37 -45
  121. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/find.js +127 -127
  122. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +16 -0
  123. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushRelationships.js +42 -4
  124. data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/store/readDataHash.js +1 -1
  125. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +13 -7
  126. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +8 -0
  127. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/resources/strings.js +2 -1
  128. data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/localized/system/datetime.js +1 -0
  129. data/lib/frameworks/sproutcore/frameworks/debug/core.js +3 -3
  130. data/lib/frameworks/sproutcore/frameworks/desktop/core.js +1 -1
  131. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +1 -1
  132. data/lib/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +1 -1
  133. data/lib/frameworks/sproutcore/frameworks/desktop/panes/alert.js +1 -4
  134. data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +19 -6
  135. data/lib/frameworks/sproutcore/frameworks/desktop/panes/modal.js +30 -1
  136. data/lib/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
  137. data/lib/frameworks/sproutcore/frameworks/desktop/panes/panel.js +24 -1
  138. data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +121 -28
  139. data/lib/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +15 -15
  140. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drag_data_source.js +1 -1
  141. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +2 -2
  142. data/lib/frameworks/sproutcore/frameworks/desktop/protocols/responder.js +2 -2
  143. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/button.js +39 -15
  144. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/collection.js +3 -3
  145. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/disclosure.js +2 -2
  146. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/image_button.js +2 -2
  147. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/panel.js +14 -6
  148. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/popup_button.js +3 -3
  149. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/progress.js +11 -11
  150. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segment.js +4 -3
  151. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/segmented.js +1 -51
  152. data/lib/frameworks/sproutcore/frameworks/desktop/render_delegates/slider.js +11 -16
  153. data/lib/frameworks/sproutcore/frameworks/desktop/resources/images/icons/sc-icon-error-48.png +0 -0
  154. data/lib/frameworks/sproutcore/frameworks/desktop/resources/slider.css +0 -2
  155. data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +3 -3
  156. data/lib/frameworks/sproutcore/frameworks/desktop/system/undo_manager.js +3 -3
  157. data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +9 -9
  158. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/content.js +11 -11
  159. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +2 -1
  160. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +1 -1
  161. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/date_field/ui.js +107 -81
  162. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +3 -3
  163. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +68 -60
  164. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/radio/methods.js +57 -12
  165. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroll/integration.js +21 -19
  166. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/scroller.js +5 -0
  167. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +2 -2
  168. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/select/ui.js +32 -3
  169. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/split/methods.js +12 -0
  170. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +12 -0
  171. data/lib/frameworks/sproutcore/frameworks/desktop/tests/views/tab/methods.js +0 -8
  172. data/lib/frameworks/sproutcore/frameworks/desktop/views/button.js +77 -132
  173. data/lib/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +5 -6
  174. data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +16 -15
  175. data/lib/frameworks/sproutcore/frameworks/desktop/views/date_field.js +52 -52
  176. data/lib/frameworks/sproutcore/frameworks/desktop/views/disclosure.js +1 -1
  177. data/lib/frameworks/sproutcore/frameworks/desktop/views/grid.js +1 -1
  178. data/lib/frameworks/sproutcore/frameworks/desktop/views/list.js +147 -147
  179. data/lib/frameworks/sproutcore/frameworks/desktop/views/list_item.js +11 -2
  180. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +2 -2
  181. data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_scroll.js +5 -5
  182. data/lib/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +22 -12
  183. data/lib/frameworks/sproutcore/frameworks/desktop/views/radio.js +13 -7
  184. data/lib/frameworks/sproutcore/frameworks/desktop/views/scene.js +2 -2
  185. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +462 -441
  186. data/lib/frameworks/sproutcore/frameworks/desktop/views/scroller.js +48 -62
  187. data/lib/frameworks/sproutcore/frameworks/desktop/views/segment.js +22 -2
  188. data/lib/frameworks/sproutcore/frameworks/desktop/views/segmented.js +150 -32
  189. data/lib/frameworks/sproutcore/frameworks/desktop/views/select.js +104 -45
  190. data/lib/frameworks/sproutcore/frameworks/desktop/views/select_button.js +42 -20
  191. data/lib/frameworks/sproutcore/frameworks/desktop/views/slider.js +24 -24
  192. data/lib/frameworks/sproutcore/frameworks/desktop/views/split.js +148 -154
  193. data/lib/frameworks/sproutcore/frameworks/desktop/views/stacked.js +2 -2
  194. data/lib/frameworks/sproutcore/frameworks/desktop/views/static_content.js +2 -2
  195. data/lib/frameworks/sproutcore/frameworks/desktop/views/tab.js +8 -7
  196. data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +2 -2
  197. data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +2 -0
  198. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/files.js +1 -1
  199. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/library.js +1 -1
  200. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/targets.js +1 -1
  201. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/controllers/view_configs.js +1 -1
  202. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/mixins/drop_down.js +1 -1
  203. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/states/ready.js +1 -1
  204. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/plist_item.js +1 -1
  205. data/lib/frameworks/sproutcore/frameworks/experimental/apps/greenhouse/views/web.js +1 -1
  206. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/controllers/page_design.js +2 -2
  207. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/css/css_style_sheet.js +2 -2
  208. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/object_designer.js +1 -1
  209. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/designers/view_designer.js +2 -2
  210. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/mixins/snap_lines.js +3 -3
  211. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/designer_drop_target.js +1 -1
  212. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/drawing.js +21 -21
  213. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/designer/views/page_item_view.js +1 -1
  214. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/forms/views/form.js +59 -53
  215. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +2 -2
  216. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/polymorphism/tests/models/polymorphism/simple.js +1 -1
  217. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +6 -6
  218. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +2 -2
  219. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +2 -2
  220. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu.js +14 -10
  221. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/ext/menu_item.js +17 -6
  222. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/popup_button.js +38 -14
  223. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/select_view/views/select.js +5 -13
  224. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_child.js +1 -1
  225. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/mixins/split_thumb.js +5 -3
  226. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/children.js +19 -0
  227. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/methods.js +20 -2
  228. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/tests/split_thumb.js +1 -1
  229. data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/split_view/views/split.js +35 -12
  230. data/lib/frameworks/sproutcore/frameworks/formatters/README +6 -0
  231. data/lib/frameworks/sproutcore/frameworks/formatters/english.lproj/strings.js +174 -0
  232. data/lib/frameworks/sproutcore/frameworks/formatters/formatters/date_formatter.js +351 -0
  233. data/lib/frameworks/sproutcore/frameworks/formatters/tests/date_formatter.js +517 -0
  234. data/lib/frameworks/sproutcore/frameworks/foundation/core.js +1 -1
  235. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/auto_resize.js +345 -138
  236. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/button.js +5 -3
  237. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/content_value_support.js +176 -42
  238. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/editable.js +1 -1
  239. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/flowed_layout.js +137 -105
  240. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/gestureable.js +2 -2
  241. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editable.js +2 -2
  242. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/inline_editor.js +16 -1
  243. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +1 -1
  244. data/lib/frameworks/sproutcore/frameworks/foundation/mixins/validatable.js +47 -47
  245. data/lib/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +3 -3
  246. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/helpers/sizing.js +1 -1
  247. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/label.js +28 -6
  248. data/lib/frameworks/sproutcore/frameworks/foundation/render_delegates/render_delegate.js +1 -1
  249. data/lib/frameworks/sproutcore/frameworks/foundation/resources/benchmark.css +0 -5
  250. data/lib/frameworks/sproutcore/frameworks/foundation/resources/bootstrap.rhtml +34 -19
  251. data/lib/frameworks/sproutcore/frameworks/foundation/resources/button_view.css +0 -2
  252. data/lib/frameworks/sproutcore/frameworks/foundation/resources/label.css +1 -5
  253. data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +8 -9
  254. data/lib/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +2 -2
  255. data/lib/frameworks/sproutcore/frameworks/foundation/system/module.js +179 -47
  256. data/lib/frameworks/sproutcore/frameworks/foundation/system/task_queue.js +34 -1
  257. data/lib/frameworks/sproutcore/frameworks/foundation/system/text_selection.js +1 -1
  258. data/lib/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +26 -12
  259. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/misc.js +7 -7
  260. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_measurement.js +12 -4
  261. data/lib/frameworks/sproutcore/frameworks/foundation/system/utils/string_metric_optimization.js +202 -0
  262. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/content_value_support/content.js +77 -8
  263. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/flowed_layout/tests.js +1 -0
  264. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/beginEditing.js +2 -2
  265. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/commitEditing.js +4 -3
  266. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editable/discardEditing.js +4 -2
  267. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/beginEditing.js +2 -2
  268. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/commitEditing.js +4 -2
  269. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_editor/discardEditing.js +4 -2
  270. data/lib/frameworks/sproutcore/frameworks/foundation/tests/system/utils/pointInElement.js +2 -2
  271. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +0 -8
  272. data/lib/frameworks/sproutcore/frameworks/foundation/tests/views/text_field/ui.js +163 -149
  273. data/lib/frameworks/sproutcore/frameworks/foundation/validators/credit_card.js +1 -1
  274. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date.js +1 -1
  275. data/lib/frameworks/sproutcore/frameworks/foundation/validators/date_time.js +1 -1
  276. data/lib/frameworks/sproutcore/frameworks/foundation/validators/password.js +1 -1
  277. data/lib/frameworks/sproutcore/frameworks/foundation/validators/validator.js +3 -3
  278. data/lib/frameworks/sproutcore/frameworks/foundation/views/field.js +16 -43
  279. data/lib/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -3
  280. data/lib/frameworks/sproutcore/frameworks/foundation/views/inline_text_field.js +67 -54
  281. data/lib/frameworks/sproutcore/frameworks/foundation/views/label.js +49 -38
  282. data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +285 -242
  283. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffer.js +13 -13
  284. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-buffered.js +19 -22
  285. data/lib/frameworks/sproutcore/frameworks/jquery/jquery-sc.js +9 -3
  286. data/lib/frameworks/sproutcore/frameworks/jquery/jquery.js +231 -186
  287. data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +145 -143
  288. data/lib/frameworks/sproutcore/frameworks/media/views/video.js +156 -154
  289. data/lib/frameworks/sproutcore/frameworks/qunit/qunit/qunit.js +5 -5
  290. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +3 -3
  291. data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js.orig +540 -0
  292. data/lib/frameworks/sproutcore/frameworks/routing/tests/system/routes.js +2 -2
  293. data/lib/frameworks/sproutcore/frameworks/runtime/core.js +15 -8
  294. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +5 -5
  295. data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +12 -0
  296. data/lib/frameworks/sproutcore/frameworks/runtime/ext/function.js +2 -2
  297. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/array.js +1 -1
  298. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +1 -1
  299. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +7 -7
  300. data/lib/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +98 -32
  301. data/lib/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +7 -2
  302. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +14 -3
  303. data/lib/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +98 -13
  304. data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +8 -14
  305. data/lib/frameworks/sproutcore/frameworks/runtime/system/enumerator.js +1 -1
  306. data/lib/frameworks/sproutcore/frameworks/runtime/system/error.js +2 -2
  307. data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +23 -6
  308. data/lib/frameworks/sproutcore/frameworks/runtime/system/logger.js +69 -18
  309. data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +57 -31
  310. data/lib/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +189 -14
  311. data/lib/frameworks/sproutcore/frameworks/runtime/system/string.js +82 -22
  312. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/chained.js +20 -0
  313. data/lib/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +125 -4
  314. data/lib/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue.js +1 -1
  315. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +2 -2
  316. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +37 -0
  317. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +2 -2
  318. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/logger.js +16 -0
  319. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +75 -4
  320. data/lib/frameworks/sproutcore/frameworks/runtime/tests/system/string.js +41 -0
  321. data/lib/frameworks/sproutcore/frameworks/statechart/mixins/statechart_delegate.js +113 -0
  322. data/lib/frameworks/sproutcore/frameworks/statechart/private/state_path_matcher.js +312 -0
  323. data/lib/frameworks/sproutcore/frameworks/statechart/system/async.js +18 -22
  324. data/lib/frameworks/sproutcore/frameworks/statechart/system/state.js +508 -131
  325. data/lib/frameworks/sproutcore/frameworks/statechart/system/state_route_handler_context.js +78 -0
  326. data/lib/frameworks/sproutcore/frameworks/statechart/system/statechart.js +265 -44
  327. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/basic/with_concurrent_states.js +16 -0
  328. data/lib/frameworks/sproutcore/frameworks/statechart/tests/event_handling/responder/responder_chain.js +11 -3
  329. data/lib/frameworks/sproutcore/frameworks/statechart/tests/private/state_path_matcher.js +116 -0
  330. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/add_substate.js +108 -0
  331. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/with_concurrent.js +179 -0
  332. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/find_first_relative_current_state/without_concurrent.js +74 -0
  333. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_state.js +141 -0
  334. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/get_substate.js +340 -0
  335. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/route_triggered.js +161 -0
  336. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state/methods/try_to_handle_event.js +288 -0
  337. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/history_state/standard/without_concurrent_states/context.js +5 -33
  338. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/with_concurrent_states/basic.js +213 -0
  339. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/routing/without_concurrent_states/basic.js +212 -0
  340. data/lib/frameworks/sproutcore/frameworks/statechart/tests/state_transitioning/standard/without_concurrent_states/core.js +8 -0
  341. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{state/namespacing.js → statechart/methods/get_state.js} +3 -41
  342. data/lib/frameworks/sproutcore/frameworks/statechart/tests/statechart/{invoke_state_method.js → methods/invoke_state_method.js} +1 -1
  343. data/lib/frameworks/sproutcore/frameworks/statechart/tests/{event_handling/advanced → statechart}/respond_to_event.js +1 -1
  344. data/lib/frameworks/sproutcore/frameworks/statechart/tests/system/state_route_handler_context/methods/retry.js +64 -0
  345. data/lib/frameworks/sproutcore/frameworks/table/core.js +2 -0
  346. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/controls/button.js +0 -1
  347. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars.js +29 -5
  348. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/bind.js +4 -3
  349. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/collection.js +0 -0
  350. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/localization.js +0 -0
  351. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/ext/handlebars/view.js +0 -0
  352. data/lib/frameworks/sproutcore/frameworks/{handlebars → template_view}/handlebars.js +493 -357
  353. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/checkbox_support.js +0 -0
  354. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/mixins/template_helpers/text_field_support.js +13 -2
  355. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/panes/template.js +0 -0
  356. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/controls/button.js +0 -0
  357. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/checkbox_support.js +0 -0
  358. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/mixins/template_helpers/text_field_support.js +0 -0
  359. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/panes/template.js +0 -0
  360. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/collection.js +39 -14
  361. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/core.js +0 -0
  362. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/tests/views/template/handlebars.js +57 -6
  363. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/bindable_span.js +21 -6
  364. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template.js +9 -3
  365. data/lib/frameworks/sproutcore/frameworks/{core_foundation → template_view}/views/template_collection.js +55 -26
  366. data/lib/frameworks/sproutcore/frameworks/testing/system/equiv.js +1 -1
  367. data/lib/frameworks/sproutcore/frameworks/testing/system/plan.js +122 -122
  368. data/lib/frameworks/sproutcore/frameworks/testing/system/runner.js +2 -2
  369. data/lib/frameworks/sproutcore/frameworks/testing/system/suite.js +4 -4
  370. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/base.css +1 -1
  371. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/reset.css +0 -1
  372. data/lib/frameworks/sproutcore/frameworks/yuireset/resources/view.css +4 -4
  373. data/lib/frameworks/sproutcore/lib/index.rhtml +55 -32
  374. data/lib/frameworks/sproutcore/license.js +2 -4
  375. data/lib/frameworks/sproutcore/themes/ace/resources/body.css +5 -1
  376. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/18px/button.css +2 -2
  377. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/24px/button.css +21 -13
  378. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/30px/button.css +17 -10
  379. data/lib/frameworks/sproutcore/themes/ace/resources/button/ace/44px/button.css +4 -3
  380. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/24px/button.css +20 -12
  381. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/30px/button.css +16 -8
  382. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/jumbo/button.css +17 -0
  383. data/lib/frameworks/sproutcore/themes/ace/resources/button/dark/small/button.css +17 -0
  384. data/lib/frameworks/sproutcore/themes/ace/resources/disclosure/ace/disclosure.css +2 -2
  385. data/lib/frameworks/sproutcore/themes/ace/resources/master-detail/master-detail.css +2 -2
  386. data/lib/frameworks/sproutcore/themes/ace/resources/picker/popover/popover.css +5 -3
  387. data/lib/frameworks/sproutcore/themes/iphone_theme/english.lproj/core.css +1 -1
  388. data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/toolbar.css +1 -1
  389. data/lib/gen/app/USAGE +17 -4
  390. data/lib/gen/language/Buildfile +4 -4
  391. data/lib/gen/language/USAGE +4 -4
  392. data/lib/gen/page/templates/pages/@target_name@/Buildfile +7 -7
  393. data/lib/gen/{html_app → statechart_app}/Buildfile +0 -0
  394. data/lib/gen/{html_app → statechart_app}/README +0 -0
  395. data/lib/gen/statechart_app/USAGE +21 -0
  396. data/lib/gen/statechart_app/templates/apps/@target_name@/Buildfile +9 -0
  397. data/lib/gen/statechart_app/templates/apps/@target_name@/core.js +24 -0
  398. data/lib/gen/statechart_app/templates/apps/@target_name@/main.js +26 -0
  399. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/_theme.css +18 -0
  400. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/loading.rhtml +9 -0
  401. data/lib/gen/statechart_app/templates/apps/@target_name@/resources/main_page.js +21 -0
  402. data/lib/gen/statechart_app/templates/apps/@target_name@/statechart.js +8 -0
  403. data/lib/gen/statechart_app/templates/apps/@target_name@/states/ready_state.js +12 -0
  404. data/lib/gen/statechart_app/templates/apps/@target_name@/theme.js +24 -0
  405. data/lib/sproutcore/builders.rb +1 -0
  406. data/lib/sproutcore/builders/base.rb +19 -1
  407. data/lib/sproutcore/builders/chance_file.rb +6 -1
  408. data/lib/sproutcore/builders/handlebars.rb +1 -9
  409. data/lib/sproutcore/builders/javascript.rb +1 -10
  410. data/lib/sproutcore/builders/json.rb +25 -0
  411. data/lib/sproutcore/builders/less.rb +1 -1
  412. data/lib/sproutcore/builders/sass.rb +1 -1
  413. data/lib/sproutcore/builders/stylesheet.rb +1 -9
  414. data/lib/sproutcore/helpers/html5_manifest.rb +1 -1
  415. data/lib/sproutcore/helpers/static_helper.rb +42 -0
  416. data/lib/sproutcore/rack/proxy.rb +21 -3
  417. data/lib/sproutcore/rack/service.rb +3 -2
  418. data/lib/sproutcore/tools.rb +18 -25
  419. data/lib/sproutcore/tools/gen.rb +10 -3
  420. data/lib/sproutcore/tools/init.rb +11 -10
  421. data/spec/buildtasks/manifest/prepare_build_tasks/json_spec.rb +62 -0
  422. data/spec/fixtures/builder_tests/apps/handlebars_test/Buildfile +1 -1
  423. data/spec/fixtures/builder_tests/apps/json_test/sc_static.json +2 -0
  424. data/spec/lib/builders/json_spec.rb +53 -0
  425. data/sproutcore.gemspec +2 -2
  426. data/vendor/chance/lib/chance/parser.rb +1 -1
  427. metadata +222 -177
  428. data/lib/frameworks/sproutcore/frameworks/core_foundation/system/datetime.js +0 -0
  429. data/lib/frameworks/sproutcore/frameworks/debug/invoke_once_last_debugging.js +0 -259
  430. data/lib/frameworks/sproutcore/frameworks/documentation/core.js +0 -0
  431. data/lib/frameworks/sproutcore/frameworks/foundation/system/chance.js +0 -69
  432. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/editable/ui.js +0 -44
  433. data/lib/frameworks/sproutcore/frameworks/foundation/tests/mixins/inline_text_field/ui.js +0 -64
  434. data/lib/frameworks/sproutcore/frameworks/mini/license.js +0 -30
  435. data/lib/gen/html_app/USAGE +0 -15
  436. data/lib/gen/html_app/templates/apps/@target_name@/@target_name@.js +0 -11
  437. data/lib/gen/html_app/templates/apps/@target_name@/resources/images/.gitkeep +0 -0
  438. data/lib/gen/html_app/templates/apps/@target_name@/resources/stylesheets/@target_name@.css +0 -6
  439. data/lib/gen/html_app/templates/apps/@target_name@/resources/templates/@target_name@.handlebars +0 -1
  440. data/lib/gen/html_project/Buildfile +0 -45
  441. data/lib/gen/html_project/INIT +0 -3
  442. data/lib/gen/html_project/README +0 -1
  443. data/lib/gen/html_project/USAGE +0 -2
  444. data/lib/gen/html_project/templates/@filename@/Buildfile +0 -5
  445. data/lib/gen/html_project/templates/@filename@/README +0 -4
@@ -30,22 +30,21 @@ test("invoked with key = * whenever content changes", function() {
30
30
  view.set('content', content);
31
31
  });
32
32
 
33
- test("invoked with key = foo whenever a propery on content is changed", function() {
34
- var isTesting = NO, curKey ;
33
+ test("should not be invoked when arbitrary keys are changed", function() {
34
+ var isTesting = NO, count = 0;
35
35
  view.contentPropertyDidChange = function(target, key) {
36
36
  if (!isTesting) return ; //wait until testing should begin...
37
- ok(target === content, 'should pass content object as target');
38
- equals(key, curKey, 'should pass * as key');
37
+ count++;
39
38
  };
39
+
40
40
  view.set('content', content);
41
41
 
42
42
  isTesting = YES ;
43
43
 
44
- curKey= 'foo';
45
44
  content.set('foo', 'foo');
46
-
47
- curKey = 'bar';
48
45
  content.set('bar', 'bar');
46
+
47
+ equals(count, 0, "method was not invoked");
49
48
  });
50
49
 
51
50
  test("should no longer be invoked when a key is changed on a former content object", function() {
@@ -73,7 +72,7 @@ test("should fire even on a content object set when the object is created", func
73
72
  equals(callCount, 1, 'should call contentPropertyDidChange on init to do initial setup');
74
73
 
75
74
  content.set('foo', 'foo');
76
- equals(callCount, 2, 'should call contentPropertyDidChange when changing content.foo');
75
+ equals(callCount, 1, 'should not call contentPropertyDidChange when changing content.foo');
77
76
  });
78
77
 
79
78
  // ..........................................................
@@ -166,3 +165,73 @@ test("if contentValueKey is not set & displayDelegate not set, does nothing", fu
166
165
  equals(content.get('bar'), 'bar', 'should not change');
167
166
  equals(content.get('foo'), 'foo', 'should not change');
168
167
  });
168
+
169
+ // ..........................................................
170
+ // updateContentWithValueObserver()
171
+ //
172
+ module("SC.ContentValueSupport#contentKeys", {
173
+ setup: function() {
174
+ this.count = 0;
175
+ var self = this;
176
+
177
+ this.obj = SC.Object.create(SC.ContentValueSupport, SC.DelegateSupport, {
178
+ contentKeys: {'contentFooKey': 'foo'},
179
+ contentFooKey: 'foo',
180
+ content: SC.Object.create({foo: 'BAR'}),
181
+ contentPropertyDidChange: function(orig, target, key) {
182
+ equals(target, this.content, "content is target");
183
+ self.count++;
184
+
185
+ return orig(target, key);
186
+ }.enhance()
187
+ });
188
+ },
189
+
190
+ teardown: function() {
191
+ this.obj.destroy();
192
+
193
+ this.obj = null;
194
+ }
195
+ });
196
+
197
+ test("different contentKeys on creation are observed correctly", function() {
198
+ equals(this.count, 1, "observer was called once on init");
199
+
200
+ this.obj.content.set('foo', 'BAR2');
201
+
202
+ equals(this.count, 2, "observer was called again on set");
203
+
204
+ equals(this.obj.get('foo'), 'BAR2', "value is updated correctly");
205
+
206
+ this.obj.content.set('bar', 'ASDF');
207
+
208
+ equals(this.count, 2, "observer was not called again on setting other keys");
209
+ });
210
+
211
+ test("different contentKeys after creation are observed correctly", function() {
212
+ equals(this.count, 1, "observer was called once on init");
213
+
214
+ this.obj.beginPropertyChanges();
215
+ this.obj.set({
216
+ contentKeys: {'contentBarKey': 'bar'},
217
+ contentBarKey: 'bar'
218
+ });
219
+ this.obj.endPropertyChanges();
220
+
221
+ equals(this.count, 2, "observer was called when changing contentKeys");
222
+
223
+ this.obj.content.set('bar', 'BAR2');
224
+
225
+ equals(this.count, 3, "observer was called when changing bar");
226
+
227
+ equals(this.obj.get('bar'), 'BAR2', "value is updated correctly");
228
+
229
+ this.obj.content.set('asdfasf', 'asdfasd');
230
+
231
+ equals(this.count, 3, "observer was not called again on setting other keys");
232
+
233
+ this.obj.content.set('foo', 'asdfasd');
234
+
235
+ equals(this.count, 3, "observer was not called again on setting old observed keys");
236
+ });
237
+
@@ -183,6 +183,7 @@ var checkSteps = [
183
183
  ];
184
184
 
185
185
  function checkPositions(view, positions) {
186
+ view.set('isVisibleInWindow', YES);
186
187
  var context = {
187
188
  position: 0,
188
189
  performNext: function(positions) {
@@ -62,13 +62,13 @@ view = SC.View.create(SC.InlineEditable, {
62
62
  });
63
63
 
64
64
  function reset() {
65
+ if(fakeEditor.isEditing) fakeEditor.discardEditing();
66
+
65
67
  fakeDelegate.shouldBeginCalled = NO;
66
68
  fakeDelegate.acquireEditorCalled = NO;
67
69
  fakeEditor.beginEditingCalled = NO;
68
70
  fakeDelegate.willBeginCalled = NO;
69
71
  fakeDelegate.didBeginCalled = NO;
70
-
71
- if(fakeEditor.isEditing) fakeEditor.discardEditing();
72
72
  };
73
73
 
74
74
  module('SC.InlineEditable.beginEditing');
@@ -32,6 +32,7 @@ fakeDelegate = {
32
32
  inlineEditorDidCommitEditing: function() {
33
33
  this.didCommitCalled = YES;
34
34
  ok(this.willCommitCalled, "willCommit called before didCommit");
35
+ view._endEditing();
35
36
  }
36
37
  };
37
38
 
@@ -58,13 +59,13 @@ view = SC.View.create(SC.InlineEditable, {
58
59
  });
59
60
 
60
61
  function reset() {
62
+ if(fakeEditor.isEditing) fakeEditor.discardEditing();
63
+
61
64
  fakeDelegate.shouldCommitCalled = NO;
62
65
  fakeEditor.commitEditingCalled = NO;
63
66
 
64
67
  fakeDelegate.willCommitCalled = NO;
65
68
  fakeDelegate.didCommitCalled = NO;
66
-
67
- if(fakeEditor.isEditing) fakeEditor.discardEditing();
68
69
  }
69
70
 
70
71
  module('SC.InlineEditable.commitEditing');
@@ -84,7 +85,7 @@ test("commitEditing should ask shouldCommit and then call commitEditing", functi
84
85
  ok(fakeDelegate.shouldCommitCalled, "shouldCommit called");
85
86
  });
86
87
 
87
- test("commitEditing should fail if shouldCommit returns false", function() {
88
+ test("commitEditing should fail if shouldCommit returns NO", function() {
88
89
  reset();
89
90
 
90
91
  fakeDelegate.shouldCommitAllowed = NO;
@@ -32,6 +32,8 @@ fakeDelegate = {
32
32
  inlineEditorDidDiscardEditing: function() {
33
33
  this.didDiscardCalled = YES;
34
34
  ok(this.willDiscardCalled, "willDiscard called before didDiscard");
35
+
36
+ view._endEditing();
35
37
  }
36
38
  };
37
39
 
@@ -58,13 +60,13 @@ view = SC.View.create(SC.InlineEditable, {
58
60
  });
59
61
 
60
62
  function reset() {
63
+ if(fakeEditor.isEditing) fakeEditor.commitEditing();
64
+
61
65
  fakeDelegate.shouldDiscardCalled = NO;
62
66
  fakeEditor.discardEditingCalled = NO;
63
67
 
64
68
  fakeDelegate.willDiscardCalled = NO;
65
69
  fakeDelegate.didDiscardCalled = NO;
66
-
67
- if(fakeEditor.isEditing) fakeEditor.commitEditing();
68
70
  }
69
71
 
70
72
  module('SC.InlineEditable.discardEditing');
@@ -62,13 +62,13 @@ view = SC.View.create(SC.InlineEditable, {
62
62
  });
63
63
 
64
64
  function reset() {
65
+ if(fakeEditor.isEditing) fakeEditor.discardEditing();
66
+
65
67
  fakeDelegate.shouldBeginCalled = NO;
66
68
  fakeDelegate.acquireEditorCalled = NO;
67
69
  fakeEditor.beginEditingCalled = NO;
68
70
  fakeDelegate.willBeginCalled = NO;
69
71
  fakeDelegate.didBeginCalled = NO;
70
-
71
- if(fakeEditor.isEditing) fakeEditor.discardEditing();
72
72
  };
73
73
 
74
74
  module("SC.InlineEditor.beginEditing");
@@ -32,6 +32,8 @@ fakeDelegate = {
32
32
  inlineEditorDidCommitEditing: function() {
33
33
  this.didCommitCalled = YES;
34
34
  ok(this.willCommitCalled, "willCommit called before didCommit");
35
+
36
+ view._endEditing();
35
37
  }
36
38
  };
37
39
 
@@ -58,13 +60,13 @@ view = SC.View.create(SC.InlineEditable, {
58
60
  });
59
61
 
60
62
  function reset() {
63
+ if(fakeEditor.isEditing) fakeEditor.discardEditing();
64
+
61
65
  fakeDelegate.shouldCommitCalled = NO;
62
66
  fakeEditor.commitEditingCalled = NO;
63
67
 
64
68
  fakeDelegate.willCommitCalled = NO;
65
69
  fakeDelegate.didCommitCalled = NO;
66
-
67
- if(fakeEditor.isEditing) fakeEditor.discardEditing();
68
70
  }
69
71
 
70
72
  module('SC.InlineEditable.commitEditing');
@@ -32,6 +32,8 @@ fakeDelegate = {
32
32
  inlineEditorDidDiscardEditing: function() {
33
33
  this.didDiscardCalled = YES;
34
34
  ok(this.willDiscardCalled, "willDiscard called before didDiscard");
35
+
36
+ view._endEditing();
35
37
  }
36
38
  };
37
39
 
@@ -58,13 +60,13 @@ view = SC.View.create(SC.InlineEditable, {
58
60
  });
59
61
 
60
62
  function reset() {
63
+ if(fakeEditor.isEditing) fakeEditor.commitEditing();
64
+
61
65
  fakeDelegate.shouldDiscardCalled = NO;
62
66
  fakeEditor.discardEditingCalled = NO;
63
67
 
64
68
  fakeDelegate.willDiscardCalled = NO;
65
69
  fakeDelegate.didDiscardCalled = NO;
66
-
67
- if(fakeEditor.isEditing) fakeEditor.commitEditing();
68
70
  }
69
71
 
70
72
  module('SC.InlineEditable.discardEditing');
@@ -99,8 +99,8 @@ function runChecks(element, offsetAdjust, values) {
99
99
  top = jqOffset.top;
100
100
 
101
101
  equals(SC.pointInElement({x: left + offsetAdjust, y: top + offsetAdjust}, element, 'padding'), values[0], 'point {left: %@, top: %@} within the element\'s padding'.fmt(offsetAdjust, offsetAdjust));
102
- equals(SC.pointInElement({x: left + offsetAdjust, y: top + offsetAdjust}, element, 'border'), values[1], 'point {left: %@, top: %@} within the element\'s padding'.fmt(offsetAdjust, offsetAdjust));
103
- equals(SC.pointInElement({x: left + offsetAdjust, y: top + offsetAdjust}, element, 'margin'), values[2], 'point {left: %@, top: %@} within the element\'s padding'.fmt(offsetAdjust, offsetAdjust));
102
+ equals(SC.pointInElement({x: left + offsetAdjust, y: top + offsetAdjust}, element, 'border'), values[1], 'point {left: %@, top: %@} within the element\'s border'.fmt(offsetAdjust, offsetAdjust));
103
+ equals(SC.pointInElement({x: left + offsetAdjust, y: top + offsetAdjust}, element, 'margin'), values[2], 'point {left: %@, top: %@} within the element\'s margin'.fmt(offsetAdjust, offsetAdjust));
104
104
  }
105
105
 
106
106
  test("A plain child element", function() {
@@ -152,14 +152,6 @@ test("Check that all labels have the right classes and styles set", function() {
152
152
 
153
153
  });
154
154
 
155
- test("Default styles are set correctly in CSS"
156
- //, function() {
157
- // document.defaultView.getComputedStyle fails when we're running framework-level tests
158
- // var viewElem=pane.view('basic').$();
159
- // ok(viewElem.css('textAlign') === 'left', 'centered should have center textAlign');
160
- // ok(viewElem.css('fontWeight') === 'normal', 'bold view should have bold fontWeight');
161
- //}
162
- );
163
155
 
164
156
  test("Check that the title is set or not and if it is in the appropriate element", function() {
165
157
  var viewElem=pane.view('basic').$();
@@ -8,122 +8,99 @@
8
8
  /*global module test htmlbody ok equals same stop start */
9
9
  (function() {
10
10
  var pane = SC.ControlTestPane.design()
11
- .add("empty", SC.TextFieldView, {
12
- hint: "Full Name",
11
+ .add("empty", SC.TextFieldView, {
12
+ hint: "Full Name",
13
13
  value: ''
14
14
  })
15
-
16
- .add("with value", SC.TextFieldView, {
17
- hint: "Full Name",
15
+
16
+ .add("with value", SC.TextFieldView, {
17
+ hint: "Full Name",
18
18
  value: 'John Doe'
19
19
  })
20
-
20
+
21
21
  .add("password", SC.TextFieldView, {
22
22
  isPassword: YES,
23
23
  value: "I'm so secret"
24
24
  })
25
-
25
+
26
26
  .add("password-hint", SC.TextFieldView, {
27
27
  hint: "Passwerd",
28
28
  isPassword: YES,
29
29
  value: "I'm so secret"
30
30
  })
31
-
32
- .add("disabled - empty", SC.TextFieldView, {
33
- hint: "Full Name",
31
+
32
+ .add("disabled - empty", SC.TextFieldView, {
33
+ hint: "Full Name",
34
34
  value: null,
35
35
  isEnabled: NO,
36
36
  isEditable: NO
37
37
  })
38
-
39
- .add("disabled - with value", SC.TextFieldView, {
40
- hint: "Full Name",
38
+
39
+ .add("disabled - with value", SC.TextFieldView, {
40
+ hint: "Full Name",
41
41
  value: 'John Doe',
42
42
  isEnabled: NO,
43
43
  isEditable: NO
44
44
  })
45
45
 
46
- .add("enabled - not editable - with value", SC.TextFieldView, {
47
- hint: "Full Name",
46
+ .add("enabled - not editable - with value", SC.TextFieldView, {
47
+ hint: "Full Name",
48
48
  value: 'John Doe',
49
49
  isEnabled: YES,
50
50
  isEditable: NO
51
51
  })
52
-
53
- .add("textarea - empty", SC.TextFieldView, {
54
- hint: "Full Name",
52
+
53
+ .add("textarea - empty", SC.TextFieldView, {
54
+ hint: "Full Name",
55
55
  value: '',
56
56
  isTextArea: YES
57
57
  })
58
-
59
- .add("textarea - with value", SC.TextFieldView, {
60
- hint: "Full Name",
58
+
59
+ .add("textarea - with value", SC.TextFieldView, {
60
+ hint: "Full Name",
61
61
  value: 'John Doe',
62
62
  isTextArea: YES
63
63
  })
64
-
65
- .add("textarea - disabled - empty", SC.TextFieldView, {
66
- hint: "Full Name",
64
+
65
+ .add("textarea - disabled - empty", SC.TextFieldView, {
66
+ hint: "Full Name",
67
67
  value: '',
68
68
  isTextArea: YES,
69
69
  isEnabled: NO
70
70
  })
71
-
72
- .add("textarea - disabled - with value", SC.TextFieldView, {
73
- hint: "Full Name",
74
- value: 'John Doe',
75
- isTextArea: YES,
76
- isEnabled: NO
77
- })
78
-
79
- .add("aria-role", SC.TextFieldView, {
80
- hint: "Full Name",
81
- value: 'John Doe',
82
- isTextArea: YES,
83
- isEnabled: YES
84
- })
85
71
 
86
- .add("aria-multiline", SC.TextFieldView, {
87
- hint: "Full Name",
88
- value: 'John Doe',
89
- isTextArea: YES,
90
- isEnabled: YES
91
- })
92
-
93
- .add("aria-disabled", SC.TextFieldView, {
94
- hint: "Full Name",
72
+ .add("textarea - disabled - with value", SC.TextFieldView, {
73
+ hint: "Full Name",
95
74
  value: 'John Doe',
96
75
  isTextArea: YES,
97
76
  isEnabled: NO
98
77
  })
99
78
 
79
+
100
80
  .add("aria-readonly", SC.TextFieldView, {
101
- hint: "Full Name",
81
+ hint: "Full Name",
102
82
  value: 'John Doe',
103
83
  isTextArea: YES,
104
84
  isEnabled: YES,
105
85
  isEditable: NO
106
- })
107
-
108
- .add("aria-invalid", SC.TextFieldView, {
109
- value: SC.Error.create({errorValue:'Error Message'}),
110
- isEnabled: YES
111
86
  });
112
-
87
+
88
+
113
89
  pane.show(); // add a test to show the test pane
114
90
 
115
91
  // ..........................................................
116
92
  // VERIFY STANDARD STATES
117
- //
93
+ //
118
94
  pane.verifyEmpty = function verifyEmpty(view, expectedHint) {
119
95
  var input = view.$('input');
120
96
  var layer = view.$();
121
-
97
+
122
98
  ok(!layer.hasClass('not-empty'), 'layer should not have not-empty class');
123
- if(SC.browser.webkit || parseInt(SC.browser.mozilla) >= 2.0) equals(input.val(), '', 'input should have empty value');
99
+ if(SC.browser.isWebkit || (SC.browser.isMozilla &&
100
+ SC.browser.compare(SC.browser.engineVersion, '2.0') >= 0)) equals(input.val(), '', 'input should have empty value');
124
101
  else equals(input.val(), expectedHint, 'input should have expected hint as value');
125
102
  if (expectedHint) {
126
- var hint = view.$('.sc-hint');
103
+ var hint = view.$('.hint');
127
104
  if (hint.length===1) {
128
105
  hint = hint.text();
129
106
  } else {
@@ -137,12 +114,12 @@ pane.verifyEmpty = function verifyEmpty(view, expectedHint) {
137
114
  pane.verifyNotEmpty = function verifyNotEmpty(view, expectedValue, expectedHint) {
138
115
  var input = view.$('input');
139
116
  var layer = view.$();
140
-
117
+
141
118
  ok(layer.hasClass('not-empty'), 'layer should have not-empty class');
142
119
  equals(input.val(), expectedValue, 'input should have value');
143
-
120
+
144
121
  if (expectedHint) {
145
- var hint = view.$('.sc-hint');
122
+ var hint = view.$('.hint');
146
123
  if (hint.length===1) {
147
124
  hint = hint.text();
148
125
  } else {
@@ -156,7 +133,7 @@ pane.verifyNotEmpty = function verifyNotEmpty(view, expectedValue, expectedHint)
156
133
  pane.verifyDisabled = function verifyDisabled(view, isDisabled) {
157
134
  var layer = view.$();
158
135
  var input = view.$('input');
159
-
136
+
160
137
  if (isDisabled) {
161
138
  ok(layer.hasClass('disabled'), 'layer should have disabled class');
162
139
  ok(input.attr('disabled'), 'input should have disabled attr');
@@ -168,7 +145,7 @@ pane.verifyDisabled = function verifyDisabled(view, isDisabled) {
168
145
 
169
146
  pane.verifyReadOnly = function verifyReadonly(view, isReadOnly) {
170
147
  var input = view.$('input');
171
-
148
+
172
149
  if(isReadOnly) {
173
150
  ok(input.attr('readOnly'), 'input should have readOnly attr');
174
151
  } else {
@@ -178,7 +155,7 @@ pane.verifyReadOnly = function verifyReadonly(view, isReadOnly) {
178
155
 
179
156
  // ..........................................................
180
157
  // TEST INITIAL STATES
181
- //
158
+ //
182
159
 
183
160
  module('SC.TextFieldView ui', pane.standardSetup());
184
161
 
@@ -250,11 +227,11 @@ test("textarea - disabled - with value", function() {
250
227
 
251
228
  // ..........................................................
252
229
  // TEST CHANGING VIEWS
253
- //
230
+ //
254
231
 
255
232
  test("changing value from empty -> value", function() {
256
233
  var view = pane.view('empty');
257
-
234
+
258
235
  // test changing value updates like it should
259
236
  SC.RunLoop.begin();
260
237
  view.set('value', 'John Doe');
@@ -262,9 +239,9 @@ test("changing value from empty -> value", function() {
262
239
  pane.verifyNotEmpty(view, 'John Doe', 'Full Name');
263
240
  });
264
241
 
265
- test("disabling view", function() {
242
+ test("disabling view", function() {
266
243
  var view = pane.view('empty');
267
-
244
+
268
245
  // test changing enabled state updates like it should
269
246
  SC.RunLoop.begin();
270
247
  view.set('isEnabled', NO);
@@ -309,6 +286,38 @@ test("changing isEditable", function() {
309
286
  pane.verifyReadOnly(view, YES);
310
287
  });
311
288
 
289
+ test("changing value from not a textarea to a textarea", function() {
290
+ // test the the SC.Event for 'change' gets wired up properly to the DOM element when it changes from input to textarea
291
+ var view = pane.view('empty');
292
+ SC.RunLoop.begin();
293
+ view.set('value', 'Original');
294
+ view.set('isTextArea', YES);
295
+ SC.RunLoop.end();
296
+
297
+ var $textarea = view.$('textarea');
298
+
299
+ SC.Event.trigger($textarea, 'focus');
300
+
301
+ // simulate typing a letter
302
+ SC.Event.trigger($textarea, 'keydown');
303
+ $textarea.val("My New Value");
304
+ SC.Event.trigger($textarea, 'keyup');
305
+ SC.Event.trigger($textarea, 'change');
306
+ view.fieldValueDidChange();
307
+
308
+ // wait a little bit to let text field propogate changes
309
+ stop();
310
+
311
+ setTimeout(function() {
312
+ start();
313
+ equals(view.get("value"), "My New Value", "SC.Event for change should get wired up properly");
314
+ }, 100);
315
+
316
+ SC.RunLoop.begin();
317
+ SC.RunLoop.end();
318
+ });
319
+
320
+
312
321
  if (!SC.browser.isIE && !SC.platform.input.placeholder) {
313
322
  test("Changing value to null -- password field", function() {
314
323
  var view = pane.view('password-hint'),
@@ -325,13 +334,13 @@ if (!SC.browser.isIE && !SC.platform.input.placeholder) {
325
334
 
326
335
  // ..........................................................
327
336
  // TEST SELECTION SUPPORT
328
- //
337
+ //
329
338
 
330
- test("Setting the selection to a null value should fail", function() {
339
+ test("Setting the selection to a null value should fail", function() {
331
340
  var view = pane.view('with value');
332
341
  var fieldElement = view.$input()[0];
333
342
  fieldElement.size = 10; // Avoid Firefox 3.5 issue
334
-
343
+
335
344
  var thrownException = null;
336
345
  try {
337
346
  view.set('selection', null);
@@ -345,11 +354,11 @@ test("Setting the selection to a null value should fail", function() {
345
354
  }
346
355
  });
347
356
 
348
- test("Setting the selection to a non-SC.TextSelection value should fail", function() {
357
+ test("Setting the selection to a non-SC.TextSelection value should fail", function() {
349
358
  var view = pane.view('with value');
350
359
  var fieldElement = view.$input()[0];
351
360
  fieldElement.size = 10; // Avoid Firefox 3.5 issue
352
-
361
+
353
362
  var thrownException = null;
354
363
  try {
355
364
  view.set('selection', {start: 0, end: 0});
@@ -363,15 +372,15 @@ test("Setting the selection to a non-SC.TextSelection value should fail", functi
363
372
  }
364
373
  });
365
374
 
366
- test("Setting and then getting back the selection", function() {
375
+ test("Setting and then getting back the selection", function() {
367
376
  var view = pane.view('with value');
368
377
  var fieldElement = view.$input()[0];
369
378
  fieldElement.focus();
370
379
  fieldElement.size = 10; // Avoid Firefox 3.5 issue
371
-
380
+
372
381
  var newSelection = SC.TextSelection.create({start:2, end:5});
373
382
  view.set('selection', newSelection);
374
-
383
+
375
384
  var fetchedSelection = view.get('selection');
376
385
  ok(fetchedSelection.get('start') === 2, 'the selection should start at index 2');
377
386
  ok(fetchedSelection.get('end') === 5, 'the selection should end at index 4');
@@ -380,11 +389,11 @@ test("Setting and then getting back the selection", function() {
380
389
 
381
390
  // ..........................................................
382
391
  // TEST ACCESSORY VIEWS
383
- //
392
+ //
384
393
 
385
- test("Adding left accessory view", function() {
394
+ test("Adding left accessory view", function() {
386
395
  var view = pane.view('with value');
387
-
396
+
388
397
  // test adding accessory view adds the view like it should
389
398
  SC.RunLoop.begin();
390
399
  var accessoryView = SC.View.create({
@@ -396,14 +405,14 @@ test("Adding left accessory view", function() {
396
405
  ok(view.get('leftAccessoryView') === accessoryView, 'left accessory view should be set to ' + accessoryView.toString());
397
406
  ok(view.get('childViews').length === 1, 'there should only be one child view');
398
407
  ok(view.get('childViews')[0] === accessoryView, 'first child view should be set to ' + accessoryView.toString());
399
-
400
-
408
+
409
+
401
410
  // The hint and padding elements should automatically have their 'left'
402
411
  // values set to the accessory view's offset + width
403
412
  // (18 = 2 left offset + 16 width)
404
413
  var paddingElement = view.$('.padding')[0];
405
414
  ok(paddingElement.style.left === '18px', 'padding element should get 18px left');
406
-
415
+
407
416
  // Test removing the accessory view.
408
417
  SC.RunLoop.begin();
409
418
  view.set('leftAccessoryView', null);
@@ -412,9 +421,9 @@ test("Adding left accessory view", function() {
412
421
  ok(!paddingElement.style.left, 'after removing the left accessory view the padding element should have no left style');
413
422
  });
414
423
 
415
- test("Adding left accessory view changes style -- using design()", function() {
424
+ test("Adding left accessory view changes style -- using design()", function() {
416
425
  var view = pane.view('with value');
417
-
426
+
418
427
  // test adding accessory view adds the view like it should
419
428
  SC.RunLoop.begin();
420
429
  var accessoryView = SC.View.design({
@@ -428,7 +437,7 @@ test("Adding left accessory view changes style -- using design()", function() {
428
437
  // (18 = 2 left offset + 16 width)
429
438
  var paddingElement = view.$('.padding')[0];
430
439
  ok(paddingElement.style.left === '18px', 'padding element should get 18px left');
431
-
440
+
432
441
  // Test removing the accessory view.
433
442
  SC.RunLoop.begin();
434
443
  view.set('leftAccessoryView', null);
@@ -436,9 +445,9 @@ test("Adding left accessory view changes style -- using design()", function() {
436
445
  ok(!paddingElement.style.left, 'after removing the left accessory view the padding element should have no left style');
437
446
  });
438
447
 
439
- test("Adding right accessory view", function() {
448
+ test("Adding right accessory view", function() {
440
449
  var view = pane.view('with value');
441
-
450
+
442
451
  // test adding accessory view adds the view like it should
443
452
  SC.RunLoop.begin();
444
453
  var accessoryView = SC.View.create({
@@ -450,15 +459,15 @@ test("Adding right accessory view", function() {
450
459
  ok(view.get('rightAccessoryView') === accessoryView, 'right accessory view should be set to ' + accessoryView.toString());
451
460
  ok(view.get('childViews').length === 1, 'there should only be one child view');
452
461
  ok(view.get('childViews')[0] === accessoryView, 'first child view should be set to ' + accessoryView.toString());
453
-
454
-
462
+
463
+
455
464
  // The hint and padding elements should automatically have their 'right'
456
465
  // values set to the accessory view's offset + width
457
466
  // (20 = 3 right offset + 17 width)
458
467
  var paddingElement = view.$('.padding')[0];
459
468
  ok(paddingElement.style.right === '20px', 'padding element should get 20px right');
460
-
461
-
469
+
470
+
462
471
  // If a right accessory view is set with only 'left' (and not 'right')
463
472
  // defined in its layout, 'left' should be cleared out and 'right' should
464
473
  // be set to 0.
@@ -468,11 +477,11 @@ test("Adding right accessory view", function() {
468
477
  });
469
478
  view.set('rightAccessoryView', accessoryView);
470
479
  SC.RunLoop.end();
471
-
480
+
472
481
  ok(view.get('rightAccessoryView').get('layout').left === null, "right accessory view created with 'left' rather than 'right' in layout should have layout.left set to null");
473
482
  ok(view.get('rightAccessoryView').get('layout').right === 0, "right accessory view created with 'left' rather than 'right' in layout should have layout.right set to 0");
474
-
475
-
483
+
484
+
476
485
  // Test removing the accessory view.
477
486
  SC.RunLoop.begin();
478
487
  view.set('rightAccessoryView', null);
@@ -481,9 +490,9 @@ test("Adding right accessory view", function() {
481
490
  ok(!paddingElement.style.right, 'after removing the right accessory view the padding element should have no right style');
482
491
  });
483
492
 
484
- test("Adding right accessory view changes style -- using design()", function() {
493
+ test("Adding right accessory view changes style -- using design()", function() {
485
494
  var view = pane.view('with value');
486
-
495
+
487
496
  // test adding accessory view adds the view like it should
488
497
  SC.RunLoop.begin();
489
498
  var accessoryView = SC.View.design({
@@ -496,8 +505,8 @@ test("Adding right accessory view changes style -- using design()", function() {
496
505
  // values set to the accessory view's offset + width
497
506
  // (20 = 3 right offset + 17 width)
498
507
  var paddingElement = view.$('.padding')[0];
499
- ok(paddingElement.style.right === '20px', 'padding element should get 20px right');
500
-
508
+ ok(paddingElement.style.right === '20px', 'padding element should get 20px right');
509
+
501
510
  // Test removing the accessory view.
502
511
  SC.RunLoop.begin();
503
512
  view.set('rightAccessoryView', null);
@@ -506,9 +515,9 @@ test("Adding right accessory view changes style -- using design()", function() {
506
515
  });
507
516
 
508
517
 
509
- test("Adding both left and right accessory views", function() {
518
+ test("Adding both left and right accessory views", function() {
510
519
  var view = pane.view('with value');
511
-
520
+
512
521
  // test adding accessory view adds the view like it should
513
522
  SC.RunLoop.begin();
514
523
  var leftAccessoryView = SC.View.create({
@@ -522,8 +531,8 @@ test("Adding both left and right accessory views", function() {
522
531
  SC.RunLoop.end();
523
532
 
524
533
  ok(view.get('childViews').length === 2, 'we should have two child views since we added both a left and a right accessory view');
525
-
526
-
534
+
535
+
527
536
  // The hint and padding elements should automatically have their 'left' and
528
537
  // 'right' values set to the accessory views' offset + width
529
538
  // * left: 18 = 2 left offset + 16 width)
@@ -531,8 +540,8 @@ test("Adding both left and right accessory views", function() {
531
540
  var paddingElement = view.$('.padding')[0];
532
541
  ok(paddingElement.style.left === '18px', 'padding element should get 18px left');
533
542
  ok(paddingElement.style.right === '20px', 'padding element should get 20px right');
534
-
535
-
543
+
544
+
536
545
  // Test removing the accessory views.
537
546
  SC.RunLoop.begin();
538
547
  view.set('rightAccessoryView', null);
@@ -546,9 +555,9 @@ test("Adding both left and right accessory views", function() {
546
555
  ok(!paddingElement.style.left, 'after removing the left accessory view the padding element should have no left style');
547
556
  });
548
557
 
549
- test("Adding both left and right accessory views changes style -- using design()", function() {
558
+ test("Adding both left and right accessory views changes style -- using design()", function() {
550
559
  var view = pane.view('with value');
551
-
560
+
552
561
  // test adding accessory view adds the view like it should
553
562
  SC.RunLoop.begin();
554
563
  var leftAccessoryView = SC.View.design({
@@ -559,8 +568,8 @@ test("Adding both left and right accessory views changes style -- using design()
559
568
  layout: { top:1, right:3, width:17, height:16 }
560
569
  });
561
570
  view.set('rightAccessoryView', rightAccessoryView);
562
- SC.RunLoop.end();
563
-
571
+ SC.RunLoop.end();
572
+
564
573
  // The hint and padding elements should automatically have their 'left' and
565
574
  // 'right' values set to the accessory views' offset + width
566
575
  // * left: 18 = 2 left offset + 16 width)
@@ -568,8 +577,8 @@ test("Adding both left and right accessory views changes style -- using design()
568
577
  var paddingElement = view.$('.padding')[0];
569
578
  ok(paddingElement.style.left === '18px', 'padding element should get 18px left');
570
579
  ok(paddingElement.style.right === '20px', 'padding element should get 20px right');
571
-
572
-
580
+
581
+
573
582
  // Test removing the accessory views.
574
583
  SC.RunLoop.begin();
575
584
  view.set('rightAccessoryView', null);
@@ -585,31 +594,31 @@ test("Adding both left and right accessory views changes style -- using design()
585
594
 
586
595
  // ..........................................................
587
596
  // TEST EVENTS
588
- //
597
+ //
589
598
 
590
599
  test("focus and blurring text field", function() {
591
600
  var view = pane.view('empty');
592
601
  var input = view.$('input');
593
-
602
+
594
603
  // attempt to focus...
595
604
  SC.Event.trigger(input, 'focus');
596
-
605
+
597
606
  // verify editing state changed...
598
607
  ok(view.get('isEditing'), 'view.isEditing should be YES');
599
608
  ok(view.$().hasClass('focus'), 'view layer should have focus class');
600
-
609
+
601
610
  // simulate typing a letter
602
611
  SC.Event.trigger(input, 'keydown');
603
612
  SC.Event.trigger(input, 'keyup');
604
613
  input.val('f');
605
614
  SC.Event.trigger(input, 'change');
606
-
607
- // wait a little bit to let text field propograte changes
615
+
616
+ // wait a little bit to let text field propagate changes
608
617
  stop();
609
-
618
+
610
619
  setTimeout(function() {
611
620
  start();
612
-
621
+
613
622
  equals(view.get('value'), 'f', 'view should have new value');
614
623
  ok(view.$().hasClass('not-empty'), 'should have not-empty class');
615
624
 
@@ -619,8 +628,42 @@ test("focus and blurring text field", function() {
619
628
  // verify editing state changed...
620
629
  ok(!view.get('isEditing'), 'view.isEditing should be NO');
621
630
  ok(!view.$().hasClass('focus'), 'view layer should NOT have focus class');
622
- }, 100);
623
-
631
+ }, 100);
632
+
633
+ });
634
+
635
+ test("focus and blur an empty text field", function() {
636
+ var view = pane.view('empty');
637
+ var input = view.$('input');
638
+
639
+ // verify the field is empty and the hint is properly set
640
+ pane.verifyEmpty(view, 'Full Name');
641
+
642
+ // focus and blur the text field
643
+ SC.Event.trigger(input, 'focus');
644
+ SC.Event.trigger(input, 'blur');
645
+
646
+ // field should still be still be empty with hint properly set
647
+ pane.verifyEmpty(view, 'Full Name');
648
+ });
649
+
650
+ test("loosing first responder should blur", function() {
651
+ var view = pane.view('empty');
652
+ var input = view.$('input');
653
+ var testResponder = SC.Responder.create(SC.ResponderContext, {});
654
+
655
+ // preliminary setup
656
+ view.get('pane').becomeKeyPane();
657
+ SC.Event.trigger(input, 'focus');
658
+
659
+ // verify it did receive focus
660
+ ok(view.get('focused'), 'view should have focus');
661
+
662
+ // tell the pane to make our test responder the first responder
663
+ view.get('pane').makeFirstResponder(testResponder);
664
+
665
+ // verify it no longer has focus
666
+ ok(!view.get('focused'), 'view should no longer have focus');
624
667
  });
625
668
 
626
669
  test("editing a field should not change the cursor position", function() {
@@ -636,33 +679,4 @@ test("editing a field should not change the cursor position", function() {
636
679
  ok(selection.get('start') == 2 && selection.get('end') == 3, 'cursor position should be unchanged');
637
680
  });
638
681
 
639
- test("should have role as textbox", function() {
640
- var view = pane.view('aria-role');
641
- var label = view.$();
642
- equals(label.attr('role'), 'textbox', 'role should be textbox');
643
- });
644
-
645
- test("should have aria-multiline as YES", function() {
646
- var view = pane.view('aria-multiline');
647
- var label = view.$();
648
- equals(label.attr('aria-multiline'), 'true', 'aria-multiline should be true');
649
- });
650
-
651
- test("should have aria-disabled as YES", function() {
652
- var view = pane.view('aria-disabled');
653
- var label = view.$();
654
- equals(label.attr('aria-disabled'), 'true', 'aria-disabled should be true');
655
- });
656
-
657
- test("should have aria-readonly as YES", function() {
658
- var view = pane.view('aria-readonly');
659
- var label = view.$();
660
- equals(label.attr('aria-readonly'), 'true', 'aria-readonly should be true');
661
- });
662
-
663
- test("should have aria-invalid as YES", function() {
664
- var view = pane.view('aria-invalid');
665
- var label = view.$();
666
- equals(label.attr('aria-invalid'), 'true', 'aria-invalid should be true');
667
- });
668
682
  })();