sproutit-sproutcore 1.0.0.20090416161445 → 1.0.0.20090720093355
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.
- data/Buildfile +4 -2
- data/frameworks/sproutcore/Buildfile +3 -2
- data/frameworks/sproutcore/README +2 -1
- data/frameworks/sproutcore/apps/docs/core.js +27 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/data.plist +14378 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image10.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image11.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image13.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image14.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image8.png +0 -0
- data/frameworks/sproutcore/apps/docs/design/Doc Viewer.graffle/image9.tiff +0 -0
- data/frameworks/sproutcore/apps/docs/english.lproj/loading.rhtml +9 -0
- data/frameworks/sproutcore/apps/docs/english.lproj/main_page.js +22 -0
- data/frameworks/sproutcore/apps/{sc_jsdoc → docs}/english.lproj/strings.js +7 -7
- data/frameworks/sproutcore/apps/docs/main.js +30 -0
- data/frameworks/sproutcore/apps/tests/controllers/detail.js +16 -0
- data/frameworks/sproutcore/apps/tests/controllers/source.js +29 -0
- data/frameworks/sproutcore/apps/tests/controllers/target.js +26 -0
- data/frameworks/sproutcore/apps/tests/controllers/targets.js +65 -26
- data/frameworks/sproutcore/apps/tests/controllers/tests.js +14 -19
- data/frameworks/sproutcore/apps/tests/core.js +114 -16
- data/frameworks/sproutcore/apps/tests/data_source.js +96 -0
- data/frameworks/sproutcore/apps/tests/english.lproj/main_page.css +22 -2
- data/frameworks/sproutcore/apps/tests/english.lproj/main_page.js +168 -22
- data/frameworks/sproutcore/apps/tests/english.lproj/strings.js +14 -5
- data/frameworks/sproutcore/apps/tests/fixtures/target.js +81 -37
- data/frameworks/sproutcore/apps/tests/fixtures/test.js +38 -37
- data/frameworks/sproutcore/apps/tests/main.js +9 -20
- data/frameworks/sproutcore/apps/tests/models/target.js +74 -31
- data/frameworks/sproutcore/apps/tests/models/test.js +30 -2
- data/frameworks/sproutcore/{frameworks/desktop/mixins/collection_item.js → apps/tests/states/no_targets.js} +16 -12
- data/frameworks/sproutcore/apps/tests/states/ready.js +56 -0
- data/frameworks/sproutcore/apps/tests/states/ready_detail.js +41 -0
- data/frameworks/sproutcore/apps/tests/states/ready_empty.js +48 -0
- data/frameworks/sproutcore/apps/tests/states/ready_list.js +41 -0
- data/frameworks/sproutcore/apps/tests/states/ready_loading.js +44 -0
- data/frameworks/sproutcore/apps/tests/states/ready_no_tests.js +31 -0
- data/frameworks/sproutcore/apps/tests/states/start.js +39 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/{test.js → detail.js} +3 -3
- data/frameworks/sproutcore/apps/tests/tests/controllers/source.js +15 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/target.js +15 -0
- data/frameworks/sproutcore/apps/tests/tests/controllers/targets.js +3 -3
- data/frameworks/sproutcore/apps/tests/tests/views/offset_checkbox.js +15 -0
- data/frameworks/sproutcore/apps/tests/views/offset_checkbox.js +26 -0
- data/frameworks/sproutcore/design/CollectionView State Charts.graffle +4848 -0
- data/frameworks/sproutcore/design/Design Charts.graffle +8788 -6375
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/data.plist +1452 -0
- data/frameworks/sproutcore/design/SproutCore Design Template.graffle/image8.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Preview.pdf +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/QuickLook/Thumbnail.tiff +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/data.plist +24187 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image10.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image11.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image13.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image15.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image16.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image17.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image18.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image19.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image22.tiff +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image23.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image24.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image25.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image30.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image31.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image8.png +0 -0
- data/frameworks/sproutcore/design/TestRunner Design.graffle/image9.png +0 -0
- data/frameworks/sproutcore/frameworks/datastore/data_sources/cascade.js +2 -2
- data/frameworks/sproutcore/frameworks/datastore/data_sources/data_source.js +66 -49
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures.js +146 -31
- data/frameworks/sproutcore/frameworks/datastore/data_sources/fixtures_with_queries.js +238 -0
- data/frameworks/sproutcore/frameworks/datastore/models/many_attribute.js +27 -11
- data/frameworks/sproutcore/frameworks/datastore/models/record.js +163 -32
- data/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +67 -5
- data/frameworks/sproutcore/frameworks/datastore/system/many_array.js +157 -0
- data/frameworks/sproutcore/frameworks/datastore/system/nested_store.js +202 -19
- data/frameworks/sproutcore/frameworks/datastore/system/query.js +929 -78
- data/frameworks/sproutcore/frameworks/datastore/system/record_array.js +143 -5
- data/frameworks/sproutcore/frameworks/datastore/system/store.js +443 -125
- data/frameworks/sproutcore/frameworks/datastore/tests/data_sources/fixtures.js +38 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/models/many_attribute.js +94 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/core_methods.js +30 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record/normalize.js +238 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/models/record_attribute.js +105 -16
- data/frameworks/sproutcore/frameworks/datastore/tests/system/many_array/core_methods.js +178 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/chain.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChanges.js +9 -8
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/commitChangesFromNestedStore.js +6 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/dataHashDidChange.js +6 -6
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/discardChanges.js +3 -3
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/readEditableDataHash.js +4 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/removeDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/nested_store/writeDataHash.js +7 -7
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/compare_records.js +126 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation.js +165 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/evaluation_of_records.js +82 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/find_all.js +362 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/parsing.js +170 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/record_type_is.js +43 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_comparisons.js +60 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/query/registered_query_extensions.js +67 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/core_methods.js +2 -13
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/commitRecord.js +3 -4
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/core_methods.js +73 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/createRecord.js +15 -0
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/dataSourceCallbacks.js +4 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/destroyRecord.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/pushChanges.js +2 -2
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/recordDidChange.js +1 -1
- data/frameworks/sproutcore/frameworks/datastore/tests/system/store/retrieveRecord.js +2 -2
- data/frameworks/sproutcore/frameworks/debug/core.js +60 -0
- data/frameworks/sproutcore/frameworks/deprecated/core.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/server/server.js +0 -1
- data/frameworks/sproutcore/frameworks/deprecated/system/browser.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/classic_responder.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/event.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/misc.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/object.js +0 -2
- data/frameworks/sproutcore/frameworks/deprecated/system/path_module.js +0 -1
- data/frameworks/sproutcore/frameworks/deprecated/system/string.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/coders/design.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/coders/localization.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/coders/object.js +1 -1
- data/frameworks/sproutcore/frameworks/designer/controllers/page_design.js +1 -1
- data/frameworks/sproutcore/frameworks/designer/ext/page.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/ext/view.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/views/controls/button.js +2 -3
- data/frameworks/sproutcore/frameworks/designer/views/designer.js +24 -8
- data/frameworks/sproutcore/frameworks/designer/views/label.js +1 -2
- data/frameworks/sproutcore/frameworks/designer/views/mixins/button.js +0 -2
- data/frameworks/sproutcore/frameworks/designer/views/tab.js +1 -2
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/alert.css +2 -2
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/drag.css +6 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/list_item.css +63 -10
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu_item_view.css +5 -4
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/modal.css +5 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/panel.css +1 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/slider.css +5 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/split_divider.css +1 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/tab.css +1 -1
- data/frameworks/sproutcore/frameworks/desktop/mixins/collection_row_delegate.js +61 -0
- data/frameworks/sproutcore/frameworks/desktop/mixins/collection_view_delegate.js +136 -79
- data/frameworks/sproutcore/frameworks/desktop/panes/alert.js +55 -24
- data/frameworks/sproutcore/frameworks/desktop/panes/menu.js +295 -147
- data/frameworks/sproutcore/frameworks/desktop/panes/palette.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/panes/panel.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/panes/picker.js +18 -20
- data/frameworks/sproutcore/frameworks/desktop/panes/sheet.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/protocols/drop_target.js +4 -4
- data/frameworks/sproutcore/frameworks/desktop/system/drag.js +337 -231
- data/frameworks/sproutcore/frameworks/desktop/system/root_responder.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/tests/integration/dialog.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/alert/ui.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/methods.js +46 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +4 -2
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/palette/ui.js +5 -6
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/panel/ui.js +11 -11
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/picker/ui.js +11 -7
- data/frameworks/sproutcore/frameworks/desktop/tests/panes/sheet/ui.js +9 -9
- data/frameworks/sproutcore/frameworks/desktop/tests/views/button/ui.js +19 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/checkbox/methods.js +0 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/content.js +249 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deleteSelection.js +82 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/deselect.js +199 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/itemViewForContentIndex.js +288 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/layerIdFor.js +65 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/length.js +88 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/mouse.js +165 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/nowShowing.js +121 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/reload.js +177 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/select.js +240 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectNextItem.js +191 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selectPreviousItem.js +197 -39
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/selection.js +141 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/ui_diagram.js +182 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowDelegate.js +183 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowHeightForContentIndex.js +133 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/rowOffsetForContentIndex.js +132 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_outline.js +56 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_row_heights.js +167 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui_simple.js +127 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list_item.js +30 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/menu_item/ui.js +8 -8
- data/frameworks/sproutcore/frameworks/desktop/tests/views/progress/ui.js +9 -9
- data/frameworks/sproutcore/frameworks/desktop/tests/views/scroller/methods.js +45 -6
- data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/methods.js +2 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/segmented/ui.js +17 -1
- data/frameworks/sproutcore/frameworks/desktop/tests/views/select_field/ui.js +44 -29
- data/frameworks/sproutcore/frameworks/desktop/tests/views/stacked/ui_comments.js +231 -0
- data/frameworks/sproutcore/frameworks/desktop/tests/views/web/ui.js +1 -1
- data/frameworks/sproutcore/frameworks/desktop/views/button.js +15 -4
- data/frameworks/sproutcore/frameworks/desktop/views/checkbox.js +8 -1
- data/frameworks/sproutcore/frameworks/desktop/views/collection.js +1739 -1123
- data/frameworks/sproutcore/frameworks/desktop/views/form.js +0 -1
- data/frameworks/sproutcore/frameworks/desktop/views/grid.js +13 -11
- data/frameworks/sproutcore/frameworks/desktop/views/list.js +405 -571
- data/frameworks/sproutcore/frameworks/desktop/views/list_item.js +211 -74
- data/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +319 -169
- data/frameworks/sproutcore/frameworks/desktop/views/popup_button.js +57 -51
- data/frameworks/sproutcore/frameworks/desktop/views/progress.js +2 -2
- data/frameworks/sproutcore/frameworks/desktop/views/scene.js +150 -2
- data/frameworks/sproutcore/frameworks/desktop/views/scroll.js +92 -50
- data/frameworks/sproutcore/frameworks/desktop/views/scroller.js +86 -63
- data/frameworks/sproutcore/frameworks/desktop/views/segmented.js +38 -22
- data/frameworks/sproutcore/frameworks/desktop/views/select_field.js +51 -12
- data/frameworks/sproutcore/frameworks/desktop/views/slider.js +2 -0
- data/frameworks/sproutcore/frameworks/desktop/views/source_list.js +17 -1087
- data/frameworks/sproutcore/frameworks/desktop/views/source_list_group.js +3 -3
- data/frameworks/sproutcore/frameworks/desktop/views/split.js +35 -9
- data/frameworks/sproutcore/frameworks/desktop/views/stacked.js +101 -0
- data/frameworks/sproutcore/frameworks/desktop/views/tab.js +23 -22
- data/frameworks/sproutcore/frameworks/desktop/views/toolbar.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/controllers/array.js +382 -363
- data/frameworks/sproutcore/frameworks/foundation/controllers/controller.js +7 -279
- data/frameworks/sproutcore/frameworks/foundation/controllers/object.js +212 -310
- data/frameworks/sproutcore/frameworks/foundation/controllers/tree.js +109 -0
- data/frameworks/sproutcore/frameworks/foundation/core.js +25 -0
- data/frameworks/sproutcore/frameworks/foundation/debug/control_test_pane.js +30 -8
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/bootstrap.rhtml +19 -4
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/core.css +219 -3
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/debug/control-test-pane.css +1 -0
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/label.css +30 -0
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/strings.js +15 -0
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/english.lproj/text_field.css +19 -3
- data/frameworks/sproutcore/frameworks/foundation/english.lproj/view.css +6 -1
- data/frameworks/sproutcore/frameworks/foundation/license.js +19 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/button.js +15 -7
- data/frameworks/sproutcore/frameworks/foundation/mixins/collection_content.js +171 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/control.js +5 -5
- data/frameworks/sproutcore/frameworks/foundation/mixins/inline_text_field.js +462 -0
- data/frameworks/sproutcore/frameworks/foundation/mixins/selection_support.js +162 -84
- data/frameworks/sproutcore/frameworks/foundation/mixins/static_layout.js +33 -2
- data/frameworks/sproutcore/frameworks/foundation/mixins/string.js +17 -3
- data/frameworks/sproutcore/frameworks/foundation/mixins/tree_item_content.js +159 -0
- data/frameworks/sproutcore/frameworks/foundation/panes/pane.js +49 -20
- data/frameworks/sproutcore/frameworks/foundation/private/tree_item_observer.js +887 -0
- data/frameworks/sproutcore/frameworks/foundation/system/application.js +36 -0
- data/frameworks/sproutcore/frameworks/foundation/system/benchmark.js +310 -62
- data/frameworks/sproutcore/frameworks/foundation/system/datetime.js +729 -0
- data/frameworks/sproutcore/frameworks/foundation/system/event.js +57 -21
- data/frameworks/sproutcore/frameworks/foundation/system/ready.js +11 -5
- data/frameworks/sproutcore/frameworks/foundation/system/render_context.js +55 -16
- data/frameworks/sproutcore/frameworks/foundation/system/request.js +152 -27
- data/frameworks/sproutcore/frameworks/foundation/system/responder.js +120 -0
- data/frameworks/sproutcore/frameworks/foundation/system/responder_context.js +243 -0
- data/frameworks/sproutcore/frameworks/foundation/system/root_responder.js +29 -6
- data/frameworks/sproutcore/frameworks/foundation/system/routes.js +143 -102
- data/frameworks/sproutcore/frameworks/foundation/system/user_defaults.js +9 -2
- data/frameworks/sproutcore/frameworks/foundation/system/utils.js +104 -9
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/array_case.js +182 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/enum_case.js +193 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/null_case.js +64 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array/single_case.js +136 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/empty_case.js +82 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/multiple_case.js +111 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_case.js +193 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object/single_enumerable_case.js +179 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/tree/outline_case.js +108 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/button/keyEquivalents.js +35 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/staticLayout.js +128 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/mixins/string.js +17 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/flat_case.js +325 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/group_case.js +718 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/private/tree_item_observer/outline_case.js +484 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_core.js +28 -28
- data/frameworks/sproutcore/frameworks/foundation/tests/system/core_query/jquery_selector.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/datetime.js +151 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/get.js +2 -2
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_attr.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_basic.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_className.js +12 -12
- data/frameworks/sproutcore/frameworks/foundation/tests/system/render_context/helpers_style.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/system/request.js +52 -14
- data/frameworks/sproutcore/frameworks/foundation/tests/system/root_responder/root_responder.js +27 -23
- data/frameworks/sproutcore/frameworks/foundation/tests/system/timer/schedule.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/validators/date.js +12 -10
- data/frameworks/sproutcore/frameworks/foundation/tests/views/label/ui.js +148 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/pane/append_remove.js +1 -1
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/methods.js +0 -0
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/tests/views/text_field/ui.js +53 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/clippingFrame.js +1 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/convertFrames.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/createChildViews.js +35 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/findLayerInParentLayer.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisible.js +51 -0
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/isVisibleInWindow.js +12 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/layoutStyle.js +83 -3
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/prepareContext.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/tests/views/view/updateLayer.js +4 -0
- data/frameworks/sproutcore/frameworks/foundation/views/container.js +1 -1
- data/frameworks/sproutcore/frameworks/foundation/views/field.js +27 -16
- data/frameworks/sproutcore/frameworks/foundation/views/image.js +4 -1
- data/frameworks/sproutcore/frameworks/foundation/views/label.js +16 -6
- data/frameworks/sproutcore/frameworks/{desktop → foundation}/views/text_field.js +39 -15
- data/frameworks/sproutcore/frameworks/foundation/views/view.js +328 -83
- data/frameworks/sproutcore/frameworks/runtime/README +1 -0
- data/frameworks/sproutcore/frameworks/runtime/core.js +110 -31
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/base.js +238 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/indexOf.js +33 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/insertAt.js +121 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/objectAt.js +34 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/popObject.js +50 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/pushObject.js +46 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/rangeObserver.js +371 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeAt.js +100 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/removeObject.js +49 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +94 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/shiftObject.js +50 -0
- data/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/unshiftObject.js +47 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/array.js +320 -110
- data/frameworks/sproutcore/frameworks/runtime/mixins/copyable.js +64 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/delegate_support.js +44 -6
- data/frameworks/sproutcore/frameworks/runtime/mixins/enumerable.js +142 -77
- data/frameworks/sproutcore/frameworks/runtime/mixins/freezable.js +104 -0
- data/frameworks/sproutcore/frameworks/runtime/mixins/observable.js +298 -142
- data/frameworks/sproutcore/frameworks/runtime/private/chain_observer.js +17 -11
- data/frameworks/sproutcore/frameworks/runtime/private/observer_queue.js +55 -15
- data/frameworks/sproutcore/frameworks/runtime/private/observer_set.js +29 -5
- data/frameworks/sproutcore/frameworks/runtime/protocols/observable_protocol.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/system/binding.js +39 -15
- data/frameworks/sproutcore/frameworks/runtime/system/index_set.js +1166 -0
- data/frameworks/sproutcore/frameworks/runtime/system/object.js +33 -15
- data/frameworks/sproutcore/frameworks/runtime/system/range_observer.js +201 -35
- data/frameworks/sproutcore/frameworks/runtime/system/run_loop.js +42 -15
- data/frameworks/sproutcore/frameworks/runtime/system/selection_set.js +649 -0
- data/frameworks/sproutcore/frameworks/runtime/system/set.js +183 -54
- data/frameworks/sproutcore/frameworks/runtime/system/sparse_array.js +20 -11
- data/frameworks/sproutcore/frameworks/runtime/tests/core/clone.js +2 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/core/compare.js +44 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/core/console.js +16 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/core/keys.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/core/makeArray.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/core/objectForPropertyPath.js +5 -5
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/array.js +57 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/enumerable.js +21 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/observable.js +249 -129
- data/frameworks/sproutcore/frameworks/runtime/tests/mixins/observable/propertyChanges.js +11 -2
- data/frameworks/sproutcore/frameworks/runtime/tests/private/observer_queue/isObservingSuspended.js +55 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/binding.js +81 -6
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/add.js +195 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/clone.js +43 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/contains.js +74 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/create.js +42 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexAfter.js +38 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/indexBefore.js +38 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/intersects.js +74 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/max.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/min.js +40 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/rangeStartForIndex.js +36 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/remove.js +189 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/index_set/without.js +89 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/object/base.js +1 -1
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/create.js +59 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/destroy.js +75 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/objectPropertyDidChange.js +117 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/rangeDidChange.js +110 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/range_observer/update.js +65 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/run_loop.js +3 -3
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/add.js +92 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/copy.js +17 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/indexSetForSource.js +85 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/isEqual.js +60 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/selection_set/remove.js +87 -0
- data/frameworks/sproutcore/frameworks/runtime/tests/system/set.js +4 -25
- data/frameworks/sproutcore/frameworks/runtime/tests/system/sparse_array.js +39 -1
- data/frameworks/sproutcore/frameworks/testing/core.js +183 -0
- data/frameworks/sproutcore/frameworks/testing/english.lproj/runner.css +126 -0
- data/frameworks/sproutcore/frameworks/testing/extras.js +0 -26
- data/frameworks/sproutcore/frameworks/testing/qunit.js +33 -25
- data/frameworks/sproutcore/frameworks/testing/system/dump.js +205 -0
- data/frameworks/sproutcore/frameworks/testing/system/equiv.js +201 -0
- data/frameworks/sproutcore/frameworks/testing/system/plan.js +691 -0
- data/frameworks/sproutcore/frameworks/testing/system/runner.js +209 -0
- data/frameworks/sproutcore/frameworks/testing/system/suite.js +228 -0
- data/frameworks/sproutcore/frameworks/testing/utils.js +8 -1
- data/frameworks/sproutcore/lib/index.rhtml +4 -1
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/16/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/24/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/100.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/102.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/110.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/120.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/127.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/24.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/26.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/27.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/28.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/29.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/30.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/31.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/33.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/37.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/41.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/32/99.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/10.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/18.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/19.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/icons/48/2.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x-2.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-repeat-x.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-sprite.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sc-theme-ysprite.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/shared-icons.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sproutcore-logo.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/Source/sticky-note.psd +0 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/button.css +191 -193
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/checkbox.css +11 -10
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/collection.css +85 -4
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/core.css +15 -2
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/images/sc-theme-repeat-x.png +0 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/label.css +0 -26
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/list_item.css +30 -0
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/progress.css +9 -6
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/radio.css +20 -11
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/segmented.css +192 -54
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/slider.css +56 -24
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/tab.css +13 -7
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/text_field.css +1 -4
- data/frameworks/sproutcore/themes/standard_theme/english.lproj/toolbar.css +4 -1
- data/lib/sproutcore/builders/minify.rb +2 -2
- data/lib/sproutcore/builders/test.rb +1 -1
- data/lib/sproutcore/buildfile.rb +1 -0
- data/lib/sproutcore/rack/dev.rb +1 -1
- data/lib/sproutcore/rack/filesystem.rb +265 -0
- data/lib/sproutcore/rack/proxy.rb +11 -3
- data/lib/sproutcore/rack/service.rb +11 -1
- data/lib/sproutcore/tools.rb +11 -1
- data/lib/sproutcore/tools/server.rb +6 -4
- data/vendor/jsdoc/README.txt +151 -0
- data/vendor/jsdoc/changes.txt +47 -0
- metadata +263 -308
- data/frameworks/sproutcore/apps/sc_jsdoc/controllers/docs.js +0 -149
- data/frameworks/sproutcore/apps/sc_jsdoc/core.js +0 -16
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.css +0 -17
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/body.js +0 -99
- data/frameworks/sproutcore/apps/sc_jsdoc/english.lproj/images/sproutcore-logo.png +0 -0
- data/frameworks/sproutcore/apps/sc_jsdoc/main.js +0 -27
- data/frameworks/sproutcore/apps/sc_jsdoc/models/doc.js +0 -21
- data/frameworks/sproutcore/apps/sc_qunit/controllers/runner.js +0 -209
- data/frameworks/sproutcore/apps/sc_qunit/core.js +0 -16
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.css +0 -17
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/body.js +0 -107
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/images/sproutcore-logo.png +0 -0
- data/frameworks/sproutcore/apps/sc_qunit/english.lproj/strings.js +0 -15
- data/frameworks/sproutcore/apps/sc_qunit/main.js +0 -18
- data/frameworks/sproutcore/apps/sc_qunit/models/test.js +0 -24
- data/frameworks/sproutcore/apps/sc_qunit/views/test_iframe.js +0 -52
- data/frameworks/sproutcore/apps/tests/controllers/test.js +0 -20
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/images/blank.gif +0 -0
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/menu.css +0 -83
- data/frameworks/sproutcore/frameworks/desktop/english.lproj/palette.css +0 -3
- data/frameworks/sproutcore/frameworks/desktop/tests/views/collection/methods.js +0 -10
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/methods.js +0 -10
- data/frameworks/sproutcore/frameworks/desktop/tests/views/list/ui.js +0 -110
- data/frameworks/sproutcore/frameworks/foundation/mixins/responder.js +0 -156
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/array.js +0 -118
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/controller.js +0 -268
- data/frameworks/sproutcore/frameworks/foundation/tests/controllers/object.js +0 -433
- data/frameworks/sproutcore/frameworks/runtime/tests/system/array.js +0 -263
- data/frameworks/sproutcore/frameworks/testing/tests/debug/qunit.js +0 -25
- data/spec/buildtasks/manifest/spec_helper.rb +0 -35
- data/spec/buildtasks/target_spec.rb +0 -214
- data/spec/fixtures/builder_tests/Buildfile +0 -15
- data/spec/fixtures/builder_tests/apps/combine_test/a.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/b.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/c.js +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/a.css +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/b.css +0 -1
- data/spec/fixtures/builder_tests/apps/combine_test/english.lproj/c.css +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/bar1_sample.rhtml +0 -2
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/erb_sample.html.erb +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/icons/image.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/image.jpg +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/rhtml_sample.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/apps/html_test/english.lproj/style.css +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/french-icons/fr.png +0 -0
- data/spec/fixtures/builder_tests/apps/html_test/french.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/apps/html_test/lib/layout_template.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/html_test/scripts.js +0 -0
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_static.js +0 -15
- data/spec/fixtures/builder_tests/apps/javascript_test/sc_super.js +0 -4
- data/spec/fixtures/builder_tests/apps/javascript_test/strings.js +0 -7
- data/spec/fixtures/builder_tests/apps/sass_test/sample.sass +0 -3
- data/spec/fixtures/builder_tests/apps/strings_test/lproj/strings.js +0 -8
- data/spec/fixtures/builder_tests/apps/stylesheet_test/build_directives.css +0 -9
- data/spec/fixtures/builder_tests/apps/stylesheet_test/sc_static.css +0 -12
- data/spec/fixtures/builder_tests/apps/test_test/lib/alt_layout.rhtml +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/lib/test_layout.rhtml +0 -3
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test.js +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/tests/qunit_test2.js +0 -1
- data/spec/fixtures/builder_tests/apps/test_test/tests/rhtml_test.rhtml +0 -4
- data/spec/fixtures/builder_tests/frameworks/debug/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/debug/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/core.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/qunit/english.lproj/dummy.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/req_style_1.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/strings.js +0 -4
- data/spec/fixtures/builder_tests/frameworks/req_target_1/english.lproj/test.rhtml +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_1/req_js_1.js +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/req_style_2.css +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/english.lproj/test.rhtml +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_2/javascript.js +0 -1
- data/spec/fixtures/builder_tests/frameworks/req_target_2/lib/alt_layout.rhtml +0 -0
- data/spec/fixtures/builder_tests/frameworks/req_target_2/req_js_2.js +0 -0
- data/spec/fixtures/builder_tests/themes/sample_theme/Buildfile +0 -1
- data/spec/fixtures/buildfiles/basic/Buildfile +0 -16
- data/spec/fixtures/buildfiles/basic/task_module.rake +0 -6
- data/spec/fixtures/buildfiles/installed/Buildfile +0 -7
- data/spec/fixtures/buildfiles/installed/Buildfile2 +0 -5
- data/spec/fixtures/buildfiles/project_test/Buildfile +0 -4
- data/spec/fixtures/buildfiles/project_test/not_project/Buildfile +0 -2
- data/spec/fixtures/buildfiles/project_test/not_project/child/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/Buildfile +0 -1
- data/spec/fixtures/entry_for_project/apps/test_app/frameworks/nested/PLACEHOLDER +0 -0
- data/spec/fixtures/entry_for_project/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/Buildfile +0 -8
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/bars/bar1/foos/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/Buildfile +0 -5
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/custom_foodir/foo2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/custom_foos/foos/not_foo1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/custom/foos/foo1/bars/bar2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/nested/Buildfile +0 -8
- data/spec/fixtures/find_targets/nested/apps/app1/Buildfile +0 -1
- data/spec/fixtures/find_targets/nested/apps/app1/apps/nested_app/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/Apps/app1/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/clients/client1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework1/frameworks/framework1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/frameworks/framework2/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme1/PLACEHOLDER +0 -0
- data/spec/fixtures/find_targets/standard/themes/theme2/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/English.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/FreNCH.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/caps_long_names/UnknOWN.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/english.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/french.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/german.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/italian.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/japanese.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/spanish.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/long_names/unknown.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/no_names/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/de.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-CA.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-GB.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en-US.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/en.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/es.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/foo.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/fr.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/it.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/languages/apps/short_names/ja.lproj/PLACEHOLDER +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/1.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/B.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/a/b.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/b/a.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/c.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/core.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/B.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/a/b.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/b/a.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/english.lproj/c.css +0 -0
- data/spec/fixtures/ordered_entries/apps/no_requires/lproj/strings.js +0 -1
- data/spec/fixtures/ordered_entries/apps/no_requires/utils.js +0 -1
- data/spec/fixtures/ordered_entries/apps/with_requires/a.js +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/b.js +0 -3
- data/spec/fixtures/ordered_entries/apps/with_requires/c.js +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/a.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/b.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/c.css +0 -2
- data/spec/fixtures/ordered_entries/apps/with_requires/english.lproj/d.js +0 -1
- data/spec/fixtures/real_world/Buildfile +0 -12
- data/spec/fixtures/real_world/apps/account/README +0 -1
- data/spec/fixtures/real_world/apps/calendar/README +0 -1
- data/spec/fixtures/real_world/apps/contacts/README_BEFORE_EDITING +0 -1
- data/spec/fixtures/real_world/apps/files/README +0 -1
- data/spec/fixtures/real_world/apps/mail/README +0 -1
- data/spec/fixtures/real_world/apps/mobile_photos/README +0 -1
- data/spec/fixtures/real_world/apps/photos/README +0 -1
- data/spec/fixtures/real_world/apps/uploader/README +0 -1
- data/spec/fixtures/real_world/frameworks/core_files/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/core_photos/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/shared/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/Buildfile +0 -26
- data/spec/fixtures/real_world/frameworks/sproutcore/README +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/docs/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/apps/test_runner/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/debug-resource.html +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/debug/sample_debug.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/demo2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/debug/sample_debug-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.css +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo.html +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/demo2.sass +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.haml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.html.erb +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/file_extension_test.rhtml +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/fixtures/sample_fixtures-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/has_require.css +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_require.css +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/no_sc_resource.rhtml +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/protocols/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.css +0 -6
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/sc_resource.rhtml +0 -3
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/strings.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/english.lproj/tests/sample-loc.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample-json-fixture.json +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/fixtures/sample_fixtures.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/application/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/costello/core.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/data_store/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/debug/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/desktop/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/empty_theme/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/foundation/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/mobile/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/qunit/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/frameworks/uploader/PLACEHOLDER +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/french-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/french.lproj/strings.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/german-resource.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/german.lproj/strings.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/has_require.js +0 -4
- data/spec/fixtures/real_world/frameworks/sproutcore/lib/index.html +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/no_require.js +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/protocols/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/sc_resource.js +0 -6
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample1.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/nested/sample2.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.js +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/tests/sample.rhtml +0 -1
- data/spec/fixtures/real_world/frameworks/sproutcore/themes/standard_theme/README +0 -0
- data/spec/fixtures/real_world/frameworks/sproutcore/views/view.js +0 -1
- data/spec/fixtures/real_world/generators/sample_custom/Buildfile +0 -0
- data/spec/fixtures/real_world/generators/sample_custom/templates/{filename}.js +0 -1
- data/spec/fixtures/recursive_project/Buildfile +0 -8
- data/spec/fixtures/recursive_project/frameworks/sproutcore/frameworks/costello/PLACEHOLDER +0 -0
- data/spec/lib/builders/combine_spec.rb +0 -67
- data/spec/lib/builders/html_spec.rb +0 -577
- data/spec/lib/builders/javascript_spec.rb +0 -81
- data/spec/lib/builders/sass_spec.rb +0 -43
- data/spec/lib/builders/spec_helper.rb +0 -30
- data/spec/lib/builders/strings_spec.rb +0 -52
- data/spec/lib/builders/stylesheet_spec.rb +0 -63
- data/spec/lib/builders/test_index_spec.rb +0 -44
- data/spec/lib/builders/test_spec.rb +0 -135
- data/spec/lib/buildfile/config_for_spec.rb +0 -81
- data/spec/lib/buildfile/define_spec.rb +0 -59
- data/spec/lib/buildfile/dup_spec.rb +0 -65
- data/spec/lib/buildfile/invoke_spec.rb +0 -130
- data/spec/lib/buildfile/load_spec.rb +0 -49
- data/spec/lib/buildfile/task/dup_spec.rb +0 -55
- data/spec/lib/buildfile/task_defined_spec.rb +0 -17
- data/spec/lib/buildfile_commands/build_task_spec.rb +0 -19
- data/spec/lib/buildfile_commands/config_spec.rb +0 -97
- data/spec/lib/buildfile_commands/import_spec.rb +0 -17
- data/spec/lib/buildfile_commands/namespace_spec.rb +0 -18
- data/spec/lib/buildfile_commands/proxies_spec.rb +0 -38
- data/spec/lib/buildfile_commands/replace_task_spec.rb +0 -29
- data/spec/lib/buildfile_commands/task_spec.rb +0 -36
- data/spec/lib/helpers/packing_optimizer/optimize_spec.rb +0 -26
- data/spec/lib/models/hash_struct/deep_clone_spec.rb +0 -27
- data/spec/lib/models/hash_struct/has_options_spec.rb +0 -32
- data/spec/lib/models/hash_struct/hash_spec.rb +0 -64
- data/spec/lib/models/hash_struct/merge_spec.rb +0 -26
- data/spec/lib/models/hash_struct/method_missing.rb +0 -41
- data/spec/lib/models/manifest/add_entry_spec.rb +0 -36
- data/spec/lib/models/manifest/add_transform_spec.rb +0 -90
- data/spec/lib/models/manifest/build_spec.rb +0 -78
- data/spec/lib/models/manifest/entry_for_spec.rb +0 -94
- data/spec/lib/models/manifest/find_entry.rb +0 -84
- data/spec/lib/models/manifest/prepare_spec.rb +0 -62
- data/spec/lib/models/manifest_entry/cacheable_url_spec.rb +0 -31
- data/spec/lib/models/manifest_entry/prepare_spec.rb +0 -54
- data/spec/lib/models/project/add_target_spec.rb +0 -44
- data/spec/lib/models/project/buildfile_spec.rb +0 -35
- data/spec/lib/models/project/find_targets_for_spec.rb +0 -77
- data/spec/lib/models/project/load_nearest_project_spec.rb +0 -23
- data/spec/lib/models/project/target_for_spec.rb +0 -33
- data/spec/lib/models/project/targets_spec.rb +0 -62
- data/spec/lib/models/target/compute_build_number_spec.rb +0 -125
- data/spec/lib/models/target/config_spec.rb +0 -30
- data/spec/lib/models/target/expand_required_targets_spec.rb +0 -48
- data/spec/lib/models/target/installed_languages_spec.rb +0 -47
- data/spec/lib/models/target/lproj_for_spec.rb +0 -38
- data/spec/lib/models/target/manifest_for_spec.rb +0 -42
- data/spec/lib/models/target/parent_target_spec.rb +0 -21
- data/spec/lib/models/target/prepare_spec.rb +0 -53
- data/spec/lib/models/target/required_targets_spec.rb +0 -119
- data/spec/lib/models/target/target_for_spec.rb +0 -56
- data/spec/lib/tools/build_number_spec.rb +0 -28
- data/spec/lib/tools/gen_spec.rb +0 -207
- data/spec/lib/tools/tools_spec.rb +0 -78
- data/spec/spec_helper.rb +0 -138
- data/vendor/github_gem_lint.rb +0 -22
- data/vendor/yui-compressor/yuicompressor-2.4.2.jar +0 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore Costello - Property Observing Library
|
3
|
+
// Copyright: ©2006-2009 Sprout Systems, Inc. and contributors.
|
4
|
+
// Portions ©2008-2009 Apple, Inc. All rights reserved.
|
5
|
+
// License: Licened under MIT license (see license.js)
|
6
|
+
// ==========================================================================
|
7
|
+
|
8
|
+
|
9
|
+
/**
|
10
|
+
Standard Error that should be raised when you try to modify a frozen object.
|
11
|
+
*/
|
12
|
+
SC.FROZEN_ERROR = new Error("Cannot modify a frozen object");
|
13
|
+
|
14
|
+
/**
|
15
|
+
@namespace
|
16
|
+
|
17
|
+
The SC.Freezable mixin implements some basic methods for marking an object
|
18
|
+
as frozen. Once an object is frozen it should be read only. No changes
|
19
|
+
may be made the internal state of the object.
|
20
|
+
|
21
|
+
h2. Enforcement
|
22
|
+
|
23
|
+
To fully support freezing in your subclass, you must include this mixin and
|
24
|
+
override any method that might alter any property on the object to instead
|
25
|
+
raise an exception. You can check the state of an object by checking the
|
26
|
+
isFrozen property.
|
27
|
+
|
28
|
+
Although future versions of JavaScript may support language-level freezing
|
29
|
+
object objects, that is not the case today. Even if an object is freezable,
|
30
|
+
it is still technically possible to modify the object, even though it could
|
31
|
+
break other parts of your application that do not expect a frozen object to
|
32
|
+
change. It is, therefore, very important that you always respect the
|
33
|
+
isFrozen property on all freezable objects.
|
34
|
+
|
35
|
+
h2. Example
|
36
|
+
|
37
|
+
The example below shows a simple object that implement the SC.Freezable
|
38
|
+
protocol.
|
39
|
+
|
40
|
+
{{{
|
41
|
+
Contact = SC.Object.extend(SC.Freezable, {
|
42
|
+
|
43
|
+
firstName: null,
|
44
|
+
|
45
|
+
lastName: null,
|
46
|
+
|
47
|
+
// swaps the names
|
48
|
+
swapNames: function() {
|
49
|
+
if (this.get('isFrozen')) throw SC.FROZEN_ERROR;
|
50
|
+
var tmp = this.get('firstName');
|
51
|
+
this.set('firstName', this.get('lastName'));
|
52
|
+
this.set('lastName', tmp);
|
53
|
+
return this;
|
54
|
+
}
|
55
|
+
|
56
|
+
});
|
57
|
+
|
58
|
+
c = Context.create({ firstName: "John", lastName: "Doe" });
|
59
|
+
c.swapNames(); => returns c
|
60
|
+
c.freeze();
|
61
|
+
c.swapNames(); => EXCEPTION
|
62
|
+
|
63
|
+
}}}
|
64
|
+
|
65
|
+
h2. Copying
|
66
|
+
|
67
|
+
Usually the SC.Freezable protocol is implemented in cooperation with the
|
68
|
+
SC.Copyable protocol, which defines a frozenCopy() method that will return
|
69
|
+
a frozen object, if the object implements this method as well.
|
70
|
+
|
71
|
+
*/
|
72
|
+
SC.Freezable = {
|
73
|
+
|
74
|
+
/**
|
75
|
+
Walk like a duck.
|
76
|
+
*/
|
77
|
+
isFreezable: YES,
|
78
|
+
|
79
|
+
/**
|
80
|
+
Set to YES when the object is frozen. Use this property to detect whether
|
81
|
+
your object is frozen or not.
|
82
|
+
*/
|
83
|
+
isFrozen: NO,
|
84
|
+
|
85
|
+
/**
|
86
|
+
Freezes the object. Once this method has been called the object should
|
87
|
+
no longer allow any properties to be edited.
|
88
|
+
|
89
|
+
@returns {Object} reciever
|
90
|
+
*/
|
91
|
+
freeze: function() {
|
92
|
+
// NOTE: Once someone actually implements Object.freeze() in the browser,
|
93
|
+
// add a call to that here also.
|
94
|
+
|
95
|
+
if (this.set) this.set('isFrozen', YES);
|
96
|
+
else this.isFrozen = YES;
|
97
|
+
return this;
|
98
|
+
}
|
99
|
+
|
100
|
+
};
|
101
|
+
|
102
|
+
|
103
|
+
// Add to Array
|
104
|
+
SC.mixin(Array.prototype, SC.Freezable);
|
@@ -9,6 +9,8 @@ require('private/observer_set') ;
|
|
9
9
|
|
10
10
|
/*globals logChange */
|
11
11
|
|
12
|
+
SC.LOG_OBSERVERS = NO ;
|
13
|
+
|
12
14
|
/**
|
13
15
|
@namespace
|
14
16
|
|
@@ -135,6 +137,9 @@ require('private/observer_set') ;
|
|
135
137
|
*/
|
136
138
|
SC.Observable = {
|
137
139
|
|
140
|
+
/** walk like that ol' duck */
|
141
|
+
isObservable: YES,
|
142
|
+
|
138
143
|
/**
|
139
144
|
Determines whether observers should be automatically notified of changes
|
140
145
|
to a key.
|
@@ -254,10 +259,31 @@ SC.Observable = {
|
|
254
259
|
@returns {this}
|
255
260
|
*/
|
256
261
|
set: function(key, value) {
|
257
|
-
var func
|
258
|
-
|
259
|
-
|
260
|
-
|
262
|
+
var func = this[key],
|
263
|
+
notify = this.automaticallyNotifiesObserversFor(key),
|
264
|
+
ret = value,
|
265
|
+
cachedep, cache, idx, dfunc ;
|
266
|
+
|
267
|
+
// if there are any dependent keys and they use caching, then clear the
|
268
|
+
// cache.
|
269
|
+
if (this._kvo_cacheable && (cache = this._kvo_cache)) {
|
270
|
+
// lookup the cached dependents for this key. if undefined, compute.
|
271
|
+
// note that if cachdep is set to null is means we figure out it has no
|
272
|
+
// cached dependencies already. this is different from undefined.
|
273
|
+
cachedep = this._kvo_cachedep;
|
274
|
+
if (!cachedep || (cachedep = cachedep[key])===undefined) {
|
275
|
+
cachedep = this._kvo_computeCachedDependentsFor(key);
|
276
|
+
}
|
277
|
+
|
278
|
+
if (cachedep) {
|
279
|
+
idx = cachedep.length;
|
280
|
+
while(--idx>=0) {
|
281
|
+
dfunc = cachedep[idx];
|
282
|
+
cache[dfunc.cacheKey] = cache[dfunc.lastSetValueKey] = undefined;
|
283
|
+
}
|
284
|
+
}
|
285
|
+
}
|
286
|
+
|
261
287
|
// set the value.
|
262
288
|
if (func && func.isProperty) {
|
263
289
|
cache = this._kvo_cache;
|
@@ -285,22 +311,7 @@ SC.Observable = {
|
|
285
311
|
if (notify) this.propertyDidChange(key, ret) ;
|
286
312
|
}
|
287
313
|
}
|
288
|
-
|
289
|
-
// if there are any dependent keys and they use caching, then clear the
|
290
|
-
// cache.
|
291
|
-
if (dependents = this._kvo_cachedDependents) {
|
292
|
-
dependents = this._kvo_cachedDependents[key] ;
|
293
|
-
if (dependents && dependents.length > 0) {
|
294
|
-
idx = dependents.length ;
|
295
|
-
if (cache = this._kvo_cache) {
|
296
|
-
while(--idx>=0) {
|
297
|
-
func = dependents[idx];
|
298
|
-
cache[func.cacheKey] = cache[func.lastSetValueKey] = undefined;
|
299
|
-
}
|
300
|
-
}
|
301
|
-
}
|
302
|
-
}
|
303
|
-
|
314
|
+
|
304
315
|
return this ;
|
305
316
|
},
|
306
317
|
|
@@ -351,8 +362,8 @@ SC.Observable = {
|
|
351
362
|
*/
|
352
363
|
endPropertyChanges: function() {
|
353
364
|
this._kvo_changeLevel = (this._kvo_changeLevel || 1) - 1 ;
|
354
|
-
var level = this._kvo_changeLevel;
|
355
|
-
if ((level<=0) &&
|
365
|
+
var level = this._kvo_changeLevel, changes = this._kvo_changes;
|
366
|
+
if ((level<=0) && changes && (changes.length>0) && !SC.Observers.isObservingSuspended) {
|
356
367
|
this._notifyPropertyObservers() ;
|
357
368
|
}
|
358
369
|
return this ;
|
@@ -398,24 +409,47 @@ SC.Observable = {
|
|
398
409
|
propertyDidChange: function(key,value, _keepCache) {
|
399
410
|
|
400
411
|
this._kvo_revision = (this._kvo_revision || 0) + 1;
|
401
|
-
var level = this._kvo_changeLevel || 0
|
412
|
+
var level = this._kvo_changeLevel || 0,
|
413
|
+
cachedep, idx, dfunc, cache, func,
|
414
|
+
log = SC.LOG_OBSERVERS && !(this.LOG_OBSERVING===NO);
|
415
|
+
|
416
|
+
if (this._kvo_cacheable && (cache = this._kvo_cache)) {
|
417
|
+
|
418
|
+
// clear any cached value
|
419
|
+
if (!_keepCache) {
|
420
|
+
func = this[key] ;
|
421
|
+
if (func && (func instanceof Function)) {
|
422
|
+
cache[func.cacheKey] = cache[func.lastSetValueKey] = undefined ;
|
423
|
+
}
|
424
|
+
}
|
402
425
|
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
if (
|
407
|
-
|
426
|
+
// if there are any dependent keys and they use caching, then clear the
|
427
|
+
// cache. This is the same code as is in set. It is inlined for perf.
|
428
|
+
cachedep = this._kvo_cachedep;
|
429
|
+
if (!cachedep || (cachedep = cachedep[key])===undefined) {
|
430
|
+
cachedep = this._kvo_computeCachedDependentsFor(key);
|
431
|
+
}
|
432
|
+
|
433
|
+
if (cachedep) {
|
434
|
+
idx = cachedep.length;
|
435
|
+
while(--idx>=0) {
|
436
|
+
dfunc = cachedep[idx];
|
437
|
+
cache[dfunc.cacheKey] = cache[dfunc.lastSetValueKey] = undefined;
|
438
|
+
}
|
408
439
|
}
|
409
440
|
}
|
410
|
-
|
441
|
+
|
411
442
|
// save in the change set if queuing changes
|
412
|
-
var suspended ;
|
413
|
-
if ((level > 0) ||
|
443
|
+
var suspended = SC.Observers.isObservingSuspended;
|
444
|
+
if ((level > 0) || suspended) {
|
414
445
|
var changes = this._kvo_changes ;
|
415
|
-
if (!changes) changes = this._kvo_changes = SC.
|
446
|
+
if (!changes) changes = this._kvo_changes = SC.CoreSet.create() ;
|
416
447
|
changes.add(key) ;
|
417
448
|
|
418
|
-
if (suspended)
|
449
|
+
if (suspended) {
|
450
|
+
if (log) console.log("%@%@: will not notify observers because observing is suspended".fmt(SC.KVO_SPACES,this));
|
451
|
+
SC.Observers.objectHasPendingChanges(this) ;
|
452
|
+
}
|
419
453
|
|
420
454
|
// otherwise notify property observers immediately
|
421
455
|
} else this._notifyPropertyObservers(key) ;
|
@@ -429,7 +463,9 @@ SC.Observable = {
|
|
429
463
|
|
430
464
|
/**
|
431
465
|
Use this to indicate that one key changes if other keys it depends on
|
432
|
-
change.
|
466
|
+
change. Pass the key that is dependent and additional keys it depends
|
467
|
+
upon. You can either pass the additional keys inline as arguments or
|
468
|
+
in a single array.
|
433
469
|
|
434
470
|
You generally do not call this method, but instead pass dependent keys to
|
435
471
|
your property() method when you declare a computed property.
|
@@ -437,68 +473,106 @@ SC.Observable = {
|
|
437
473
|
You can call this method during your init to register the keys that should
|
438
474
|
trigger a change notification for your computed properties.
|
439
475
|
|
440
|
-
@param
|
476
|
+
@param {String} key the dependent key
|
477
|
+
@param {Array|String} dependentKeys one or more dependent keys
|
441
478
|
@returns {Object} this
|
442
479
|
*/
|
443
|
-
registerDependentKey: function(key) {
|
444
|
-
var
|
445
|
-
|
480
|
+
registerDependentKey: function(key, dependentKeys) {
|
481
|
+
var dependents = this._kvo_dependents,
|
482
|
+
func = this[key],
|
483
|
+
keys, idx, lim, dep, queue;
|
484
|
+
|
485
|
+
// normalize input.
|
486
|
+
if (SC.typeOf(dependentKeys) === SC.T_ARRAY) {
|
487
|
+
keys = dependentKeys;
|
488
|
+
lim = 0;
|
489
|
+
} else {
|
490
|
+
keys = arguments;
|
491
|
+
lim = 1;
|
492
|
+
}
|
493
|
+
idx = keys.length;
|
494
|
+
|
495
|
+
// define dependents if not defined already.
|
446
496
|
if (!dependents) this._kvo_dependents = dependents = {} ;
|
447
497
|
|
448
|
-
// the cached dependents hash contains computed properties that are
|
449
|
-
// dependent and cached. It is important not to define
|
450
|
-
// _kvo_cachedDependents until this feature is actually used for perf
|
451
|
-
// reasons.
|
452
|
-
var cached = this._kvo_cachedDependents ;
|
453
|
-
var dep, func, array, arrayIdx, queue;
|
454
|
-
|
455
|
-
// note that we store dependents as simple arrays instead of using set.
|
456
|
-
// we assume that in general you won't call registerDependentKey() more
|
457
|
-
// than once for a particular base key. Even if you do, the added cost
|
458
|
-
// of having dups is minor.
|
459
|
-
|
460
498
|
// for each key, build array of dependents, add this key...
|
461
499
|
// note that we ignore the first argument since it is the key...
|
462
|
-
while(--idx >=
|
463
|
-
dep =
|
464
|
-
|
465
|
-
//
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
500
|
+
while(--idx >= lim) {
|
501
|
+
dep = keys[idx] ;
|
502
|
+
|
503
|
+
// add dependent key to dependents array of key it depends on
|
504
|
+
queue = dependents[dep] ;
|
505
|
+
if (!queue) queue = dependents[dep] = [] ;
|
506
|
+
queue.push(key) ;
|
507
|
+
}
|
508
|
+
},
|
509
|
+
|
510
|
+
/** @private
|
511
|
+
|
512
|
+
Helper method used by computeCachedDependents. Just loops over the
|
513
|
+
array of dependent keys. If the passed function is cacheable, it will
|
514
|
+
be added to the queue. Also, recursively call on each keys dependent
|
515
|
+
keys.
|
516
|
+
|
517
|
+
@param {Array} queue the queue to add functions to
|
518
|
+
@param {Array} keys the array of dependent keys for this key
|
519
|
+
@param {Hash} dependents the _kvo_dependents cache
|
520
|
+
@param {SC.Set} seen already seen keys
|
521
|
+
@returns {void}
|
522
|
+
*/
|
523
|
+
_kvo_addCachedDependents: function(queue, keys, dependents, seen) {
|
524
|
+
var idx = keys.length,
|
525
|
+
func, key, deps ;
|
485
526
|
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
if (func
|
495
|
-
|
496
|
-
queue
|
497
|
-
if (!queue) queue = cached[dep] = [] ;
|
498
|
-
queue.push(func) ;
|
527
|
+
while(--idx >= 0) {
|
528
|
+
key = keys[idx];
|
529
|
+
seen.add(key);
|
530
|
+
|
531
|
+
// if the value for this key is a computed property, then add it to the
|
532
|
+
// set if it is cacheable, and process any of its dependent keys also.
|
533
|
+
func = this[key];
|
534
|
+
if (func && (func instanceof Function) && func.isProperty) {
|
535
|
+
if (func.isCacheable) queue.push(func); // handle this func
|
536
|
+
if ((deps = dependents[key]) && deps.length>0) { // and any dependents
|
537
|
+
this._kvo_addCachedDependents(queue, deps, dependents, seen);
|
499
538
|
}
|
500
|
-
}
|
539
|
+
}
|
501
540
|
}
|
541
|
+
|
542
|
+
},
|
543
|
+
|
544
|
+
/** @private
|
545
|
+
|
546
|
+
Called by set() whenever it needs to determine which cached dependent
|
547
|
+
keys to clear. Recursively searches dependent keys to determine all
|
548
|
+
cached property direcly or indirectly affected.
|
549
|
+
|
550
|
+
The return value is also saved for future reference
|
551
|
+
|
552
|
+
@param {String} key the key to compute
|
553
|
+
@returns {Array}
|
554
|
+
*/
|
555
|
+
_kvo_computeCachedDependentsFor: function(key) {
|
556
|
+
var cached = this._kvo_cachedep,
|
557
|
+
dependents = this._kvo_dependents,
|
558
|
+
keys = dependents ? dependents[key] : null,
|
559
|
+
queue, seen ;
|
560
|
+
if (!cached) cached = this._kvo_cachedep = {};
|
561
|
+
|
562
|
+
// if there are no dependent keys, then just set and return null to avoid
|
563
|
+
// this mess again.
|
564
|
+
if (!keys || keys.length===0) return cached[key] = null;
|
565
|
+
|
566
|
+
// there are dependent keys, so we need to do the work to find out if
|
567
|
+
// any of them or their dependent keys are cached.
|
568
|
+
queue = cached[key] = [];
|
569
|
+
seen = SC._TMP_SEEN_SET = (SC._TMP_SEEN_SET || SC.CoreSet.create());
|
570
|
+
seen.add(key);
|
571
|
+
this._kvo_addCachedDependents(queue, keys, dependents, seen);
|
572
|
+
seen.clear(); // reset
|
573
|
+
|
574
|
+
if (queue.length === 0) queue = cached[key] = null ; // turns out nothing
|
575
|
+
return queue ;
|
502
576
|
},
|
503
577
|
|
504
578
|
// ..........................................
|
@@ -517,9 +591,9 @@ SC.Observable = {
|
|
517
591
|
this._kvo_cloned[kvoKey] = YES ;
|
518
592
|
|
519
593
|
// if item does exist but has not been cloned, then clone it. Note
|
520
|
-
// that all types must implement
|
594
|
+
// that all types must implement copy().0
|
521
595
|
} else if (!this._kvo_cloned[kvoKey]) {
|
522
|
-
ret = this[kvoKey] = ret.
|
596
|
+
ret = this[kvoKey] = ret.copy();
|
523
597
|
this._kvo_cloned[kvoKey] = YES;
|
524
598
|
}
|
525
599
|
|
@@ -536,12 +610,45 @@ SC.Observable = {
|
|
536
610
|
value is set, regardless of whether it has actually changed. Your
|
537
611
|
observer should be prepared to handle that.
|
538
612
|
|
613
|
+
You can also pass an optional context parameter to this method. The
|
614
|
+
context will be passed to your observer method whenever it is triggered.
|
615
|
+
Note that if you add the same target/method pair on a key multiple times
|
616
|
+
with different context parameters, your observer will only be called once
|
617
|
+
with the last context you passed.
|
618
|
+
|
619
|
+
h2. Observer Methods
|
620
|
+
|
621
|
+
Observer methods you pass should generally have the following signature if
|
622
|
+
you do not pass a "context" parameter:
|
623
|
+
|
624
|
+
{{{
|
625
|
+
fooDidChange: function(sender, key, value, rev);
|
626
|
+
}}}
|
627
|
+
|
628
|
+
The sender is the object that changed. The key is the property that
|
629
|
+
changes. The value property is currently reserved and unused. The rev
|
630
|
+
is the last property revision of the object when it changed, which you can
|
631
|
+
use to detect if the key value has really changed or not.
|
632
|
+
|
633
|
+
If you pass a "context" parameter, the context will be passed before the
|
634
|
+
revision like so:
|
635
|
+
|
636
|
+
{{{
|
637
|
+
fooDidChange: function(sender, key, value, context, rev);
|
638
|
+
}}}
|
639
|
+
|
640
|
+
Usually you will not need the value, context or revision parameters at
|
641
|
+
the end. In this case, it is common to write observer methods that take
|
642
|
+
only a sender and key value as parameters or, if you aren't interested in
|
643
|
+
any of these values, to write an observer that has no parameters at all.
|
644
|
+
|
539
645
|
@param key {String} the key to observer
|
540
646
|
@param target {Object} the target object to invoke
|
541
647
|
@param method {String|Function} the method to invoke.
|
648
|
+
@param context {Object} optional context
|
542
649
|
@returns {SC.Object} self
|
543
650
|
*/
|
544
|
-
addObserver: function(key,target,method) {
|
651
|
+
addObserver: function(key, target, method, context) {
|
545
652
|
|
546
653
|
var kvoKey, chain, chains, observers;
|
547
654
|
|
@@ -559,8 +666,9 @@ SC.Observable = {
|
|
559
666
|
|
560
667
|
// create the chain and save it for later so we can tear it down if
|
561
668
|
// needed.
|
562
|
-
chain = SC._ChainObserver.createChain(this, key, target, method);
|
563
|
-
chain.masterTarget = target;
|
669
|
+
chain = SC._ChainObserver.createChain(this, key, target, method, context);
|
670
|
+
chain.masterTarget = target;
|
671
|
+
chain.masterMethod = method ;
|
564
672
|
|
565
673
|
// Save in set for chain observers.
|
566
674
|
this._kvo_for(SC.keyFor('_kvo_chains', key)).push(chain);
|
@@ -577,13 +685,21 @@ SC.Observable = {
|
|
577
685
|
|
578
686
|
if (target === this) target = null ; // use null for observers only.
|
579
687
|
kvoKey = SC.keyFor('_kvo_observers', key);
|
580
|
-
this._kvo_for(kvoKey, SC._ObserverSet).add(target, method);
|
581
|
-
this._kvo_for('_kvo_observed_keys', SC.
|
688
|
+
this._kvo_for(kvoKey, SC._ObserverSet).add(target, method, context);
|
689
|
+
this._kvo_for('_kvo_observed_keys', SC.CoreSet).add(key) ;
|
582
690
|
}
|
583
|
-
|
691
|
+
|
692
|
+
if (this.didAddObserver) this.didAddObserver(key, target, method);
|
584
693
|
return this;
|
585
694
|
},
|
586
695
|
|
696
|
+
/**
|
697
|
+
Remove an observer you have previously registered on this object. Pass
|
698
|
+
the same key, target, and method you passed to addObserver() and your
|
699
|
+
target will no longer receive notifications.
|
700
|
+
|
701
|
+
@returns {SC.Observable} reciever
|
702
|
+
*/
|
587
703
|
removeObserver: function(key, target, method) {
|
588
704
|
|
589
705
|
var kvoKey, chains, chain, observers, idx ;
|
@@ -626,14 +742,35 @@ SC.Observable = {
|
|
626
742
|
observers = this._kvo_for(kvoKey) ;
|
627
743
|
observers.remove(target, method) ;
|
628
744
|
if (observers.targets <= 0) {
|
629
|
-
this._kvo_for('_kvo_observed_keys', SC.
|
745
|
+
this._kvo_for('_kvo_observed_keys', SC.CoreSet).remove(key);
|
630
746
|
}
|
631
747
|
}
|
632
748
|
}
|
633
|
-
|
749
|
+
|
750
|
+
if (this.didRemoveObserver) this.didRemoveObserver(key, target, method);
|
634
751
|
return this;
|
635
752
|
},
|
636
753
|
|
754
|
+
/**
|
755
|
+
Returns YES if the object currently has observers registered for a
|
756
|
+
particular key. You can use this method to potentially defer performing
|
757
|
+
an expensive action until someone begins observing a particular property
|
758
|
+
on the object.
|
759
|
+
|
760
|
+
@param {String} key key to check
|
761
|
+
@returns {Boolean}
|
762
|
+
*/
|
763
|
+
hasObserverFor: function(key) {
|
764
|
+
SC.Observers.flush(this) ; // hookup as many observers as possible.
|
765
|
+
|
766
|
+
var observers = this[SC.keyFor('_kvo_observers', key)],
|
767
|
+
locals = this[SC.keyFor('_kvo_local', key)],
|
768
|
+
members ;
|
769
|
+
|
770
|
+
if (locals && locals.length>0) return YES ;
|
771
|
+
if (observers && observers.getMembers().length>0) return YES ;
|
772
|
+
return NO ;
|
773
|
+
},
|
637
774
|
|
638
775
|
/**
|
639
776
|
This method will register any observers and computed properties saved on
|
@@ -716,11 +853,16 @@ SC.Observable = {
|
|
716
853
|
// Add Properties
|
717
854
|
if (keys = this._properties) {
|
718
855
|
for(loc=0;loc<keys.length;loc++) {
|
719
|
-
key = keys[loc]
|
720
|
-
if (value
|
721
|
-
|
722
|
-
|
723
|
-
|
856
|
+
key = keys[loc];
|
857
|
+
if (value = this[key]) {
|
858
|
+
|
859
|
+
// activate cacheable only if needed for perf reasons
|
860
|
+
if (value.isCacheable) this._kvo_cacheable = YES;
|
861
|
+
|
862
|
+
// register dependent keys
|
863
|
+
if (value.dependentKeys && (value.dependentKeys.length>0)) {
|
864
|
+
this.registerDependentKey(key, value.dependentKeys) ;
|
865
|
+
}
|
724
866
|
}
|
725
867
|
}
|
726
868
|
}
|
@@ -750,11 +892,18 @@ SC.Observable = {
|
|
750
892
|
|
751
893
|
if (!this._observableInited) this.initObservable() ;
|
752
894
|
|
753
|
-
SC.Observers.flush() ; // hookup as many observers as possible.
|
895
|
+
SC.Observers.flush(this) ; // hookup as many observers as possible.
|
754
896
|
|
897
|
+
var log = SC.LOG_OBSERVERS && !(this.LOG_OBSERVING===NO) ;
|
755
898
|
var observers, changes, dependents, starObservers, idx, keys, rev ;
|
756
899
|
var members, membersLength, member, memberLoc, target, method, loc, func ;
|
900
|
+
var context, spaces, cache ;
|
757
901
|
|
902
|
+
if (log) {
|
903
|
+
spaces = SC.KVO_SPACES = (SC.KVO_SPACES || '') + ' ';
|
904
|
+
console.log('%@%@: notifying observers after change to key "%@"'.fmt(spaces, this, key));
|
905
|
+
}
|
906
|
+
|
758
907
|
// Get any starObservers -- they will be notified of all changes.
|
759
908
|
starObservers = this['_kvo_observers_*'] ;
|
760
909
|
|
@@ -765,20 +914,19 @@ SC.Observable = {
|
|
765
914
|
while(((changes = this._kvo_changes) && (changes.length > 0)) || key) {
|
766
915
|
|
767
916
|
// increment revision
|
768
|
-
rev = this.propertyRevision
|
917
|
+
rev = ++this.propertyRevision ;
|
769
918
|
|
770
919
|
// save the current set of changes and swap out the kvo_changes so that
|
771
920
|
// any set() calls by observers will be saved in a new set.
|
772
|
-
if (!changes) changes = SC.
|
773
|
-
this._kvo_changes =
|
774
|
-
this._kvo_altChanges = null ;
|
921
|
+
if (!changes) changes = SC.CoreSet.create() ;
|
922
|
+
this._kvo_changes = null ;
|
775
923
|
|
776
924
|
// Add the passed key to the changes set. If a '*' was passed, then
|
777
925
|
// add all keys in the observers to the set...
|
778
926
|
// once finished, clear the key so the loop will end.
|
779
927
|
if (key === '*') {
|
780
928
|
changes.add('*') ;
|
781
|
-
changes.addEach(this._kvo_for('_kvo_observed_keys', SC.
|
929
|
+
changes.addEach(this._kvo_for('_kvo_observed_keys', SC.CoreSet));
|
782
930
|
|
783
931
|
} else if (key) changes.add(key) ;
|
784
932
|
|
@@ -794,10 +942,16 @@ SC.Observable = {
|
|
794
942
|
// for each dependent key, add to set of changes. Also, if key
|
795
943
|
// value is a cacheable property, clear the cached value...
|
796
944
|
if (keys && (loc = keys.length)) {
|
945
|
+
if (log) {
|
946
|
+
console.log("%@...including dependent keys for %@: %@".fmt(spaces, key, keys));
|
947
|
+
}
|
948
|
+
cache = this._kvo_cache;
|
949
|
+
if (!cache) cache = this._kvo_cache = {};
|
797
950
|
while(--loc >= 0) {
|
798
951
|
changes.add(key = keys[loc]);
|
799
|
-
if (
|
952
|
+
if (func = this[key]) {
|
800
953
|
this[func.cacheKey] = undefined;
|
954
|
+
cache[func.cacheKey] = cache[func.lastSetValueKey] = undefined;
|
801
955
|
} // if (func=)
|
802
956
|
} // while (--loc)
|
803
957
|
} // if (keys &&
|
@@ -815,9 +969,19 @@ SC.Observable = {
|
|
815
969
|
membersLength = members.length ;
|
816
970
|
for(memberLoc=0;memberLoc < membersLength; memberLoc++) {
|
817
971
|
member = members[memberLoc] ;
|
818
|
-
if (member[
|
819
|
-
|
820
|
-
|
972
|
+
if (member[3] === rev) continue ; // skip notified items.
|
973
|
+
|
974
|
+
target = member[0] || this;
|
975
|
+
method = member[1] ;
|
976
|
+
context = member[2];
|
977
|
+
member[3] = rev;
|
978
|
+
|
979
|
+
if (log) console.log('%@...firing observer on %@ for key "%@"'.fmt(spaces, target, key));
|
980
|
+
if (context !== undefined) {
|
981
|
+
method.call(target, this, key, null, context, rev);
|
982
|
+
} else {
|
983
|
+
method.call(target, this, key, null, rev) ;
|
984
|
+
}
|
821
985
|
}
|
822
986
|
}
|
823
987
|
|
@@ -830,7 +994,10 @@ SC.Observable = {
|
|
830
994
|
for(memberLoc=0;memberLoc<membersLength;memberLoc++) {
|
831
995
|
member = members[memberLoc];
|
832
996
|
method = this[member] ; // try to find observer function
|
833
|
-
if (method)
|
997
|
+
if (method) {
|
998
|
+
if (log) console.log('%@...firing local observer %@.%@ for key "%@"'.fmt(spaces, this, member, key));
|
999
|
+
method.call(this, this, key, null, rev);
|
1000
|
+
}
|
834
1001
|
}
|
835
1002
|
}
|
836
1003
|
|
@@ -840,19 +1007,28 @@ SC.Observable = {
|
|
840
1007
|
membersLength = members.length ;
|
841
1008
|
for(memberLoc=0;memberLoc < membersLength; memberLoc++) {
|
842
1009
|
member = members[memberLoc] ;
|
843
|
-
target = member[0] || this;
|
844
|
-
method
|
1010
|
+
target = member[0] || this;
|
1011
|
+
method = member[1] ;
|
1012
|
+
context = member[2] ;
|
1013
|
+
|
1014
|
+
if (log) console.log('%@...firing * observer on %@ for key "%@"'.fmt(spaces, target, key));
|
1015
|
+
if (context !== undefined) {
|
1016
|
+
method.call(target, this, key, null, context, rev);
|
1017
|
+
} else {
|
1018
|
+
method.call(target, this, key, null, rev) ;
|
1019
|
+
}
|
845
1020
|
}
|
846
1021
|
}
|
847
1022
|
|
848
1023
|
// if there is a default property observer, call that also
|
849
1024
|
if (this.propertyObserver) {
|
1025
|
+
if (log) console.log('%@...firing %@.propertyObserver for key "%@"'.fmt(spaces, this, key));
|
850
1026
|
this.propertyObserver(this, key, null, rev);
|
851
1027
|
}
|
852
1028
|
} // while(changes.length>0)
|
853
1029
|
|
854
|
-
// changes set should be empty.
|
855
|
-
|
1030
|
+
// changes set should be empty. release it for reuse
|
1031
|
+
if (changes) changes.destroy() ;
|
856
1032
|
|
857
1033
|
// key is no longer needed; clear it to avoid infinite loops
|
858
1034
|
key = null ;
|
@@ -861,6 +1037,9 @@ SC.Observable = {
|
|
861
1037
|
|
862
1038
|
// done with loop, reduce change level so that future sets can resume
|
863
1039
|
this._kvo_changeLevel = (this._kvo_changeLevel || 1) - 1;
|
1040
|
+
|
1041
|
+
if (log) SC.KVO_SPACES = spaces.slice(0, -2);
|
1042
|
+
|
864
1043
|
return YES ; // finished successfully
|
865
1044
|
},
|
866
1045
|
|
@@ -979,7 +1158,7 @@ SC.Observable = {
|
|
979
1158
|
setPath: function(path, value) {
|
980
1159
|
if (path.indexOf('.') >= 0) {
|
981
1160
|
var tuple = SC.tupleForPropertyPath(path, this) ;
|
982
|
-
if (!tuple[0]) return null ;
|
1161
|
+
if (!tuple || !tuple[0]) return null ;
|
983
1162
|
tuple[0].set(tuple[1], value) ;
|
984
1163
|
} else this.set(path, value) ; // shortcut
|
985
1164
|
return this;
|
@@ -997,7 +1176,7 @@ SC.Observable = {
|
|
997
1176
|
setPathIfChanged: function(path, value) {
|
998
1177
|
if (path.indexOf('.') >= 0) {
|
999
1178
|
var tuple = SC.tupleForPropertyPath(path, this) ;
|
1000
|
-
if (!tuple[0]) return null ;
|
1179
|
+
if (!tuple || !tuple[0]) return null ;
|
1001
1180
|
if (tuple[0].get(tuple[1]) !== value) {
|
1002
1181
|
tuple[0].set(tuple[1], value) ;
|
1003
1182
|
}
|
@@ -1061,29 +1240,6 @@ SC.Observable = {
|
|
1061
1240
|
return this.get(key) ;
|
1062
1241
|
},
|
1063
1242
|
|
1064
|
-
/**
|
1065
|
-
Generic property observer called whenever a property on the receiver
|
1066
|
-
changes.
|
1067
|
-
|
1068
|
-
If you need to observe a large number of properties on your object, it
|
1069
|
-
is sometimes more efficient to implement this observer only and then to
|
1070
|
-
handle requests yourself. Although this observer will be triggered
|
1071
|
-
more often than an observer registered on a specific property, it also
|
1072
|
-
does not need to be registered which can make it faster to setup your
|
1073
|
-
object instance.
|
1074
|
-
|
1075
|
-
You will often implement this observer using a switch statement on the
|
1076
|
-
key parameter, taking appropriate action.
|
1077
|
-
|
1078
|
-
@param observer {null} no longer used; usually null
|
1079
|
-
@param target {Object} the target of the change. usually this
|
1080
|
-
@param key {String} the name of the property that changed
|
1081
|
-
@param value {Object} the new value of the property.
|
1082
|
-
@param revision {Number} a revision you can use to quickly detect changes.
|
1083
|
-
@returns {void}
|
1084
|
-
*/
|
1085
|
-
propertyObserver: function(observer,target,key,value, revision) {},
|
1086
|
-
|
1087
1243
|
/**
|
1088
1244
|
Convenience method to call propertyWillChange/propertyDidChange.
|
1089
1245
|
|