sproutcore 1.6.0.1-java → 1.7.1.beta-java
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/CHANGELOG +21 -0
- data/Gemfile +5 -0
- data/Rakefile +26 -13
- data/VERSION.yml +2 -2
- data/lib/Buildfile +43 -4
- data/lib/buildtasks/build.rake +10 -0
- data/lib/buildtasks/helpers/file_rule.rb +22 -0
- data/lib/buildtasks/helpers/file_rule_list.rb +137 -0
- data/lib/buildtasks/manifest.rake +133 -122
- data/lib/frameworks/sproutcore/CHANGELOG.md +69 -2
- data/lib/frameworks/sproutcore/apps/tests/english.lproj/strings.js +1 -0
- data/lib/frameworks/sproutcore/frameworks/bootstrap/system/browser.js +28 -22
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/array.js +9 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controllers/controller.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/controls/button.js +18 -13
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/bind.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/ext/handlebars/collection.js +2 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/action_support.js +80 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/mixins/template_helpers/text_field_support.js +84 -116
- data/lib/frameworks/sproutcore/frameworks/core_foundation/panes/pane.js +8 -5
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/event.js +157 -157
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/platform.js +5 -3
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/root_responder.js +6 -6
- data/lib/frameworks/sproutcore/frameworks/core_foundation/system/sparse_array.js +10 -7
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/mixins/action_support.js +106 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/collection.js +18 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/template/handlebars.js +71 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/attribute_bindings_test.js +38 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/class_name_bindings_test.js +47 -0
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutChildViews.js +18 -18
- data/lib/frameworks/sproutcore/frameworks/core_foundation/tests/views/view/layoutStyle.js +42 -10
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view.js +158 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/keyboard.js +26 -1
- data/lib/frameworks/sproutcore/frameworks/core_foundation/views/view/layout_style.js +14 -8
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record.js +15 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/models/record_attribute.js +108 -108
- data/lib/frameworks/sproutcore/frameworks/datastore/system/query.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datastore/system/record_array.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/record/error_methods.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/models/single_attribute.js +26 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/query/builders.js +7 -0
- data/lib/frameworks/sproutcore/frameworks/datastore/tests/system/record_array/error_methods.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/system/datetime.js +4 -1
- data/lib/frameworks/sproutcore/frameworks/datetime/frameworks/core/tests/system/datetime.js +6 -0
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/menu.js +26 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/panes/picker.js +97 -96
- data/lib/frameworks/sproutcore/frameworks/desktop/system/drag.js +4 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/tests/panes/menu/ui.js +17 -4
- data/lib/frameworks/sproutcore/frameworks/desktop/views/collection.js +7 -7
- data/lib/frameworks/sproutcore/frameworks/desktop/views/menu_item.js +7 -5
- data/lib/frameworks/sproutcore/frameworks/desktop/views/scroll.js +12 -3
- data/lib/frameworks/sproutcore/frameworks/desktop/views/web.js +23 -14
- data/lib/frameworks/sproutcore/frameworks/experimental/Buildfile +5 -1
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/render_delegates/menu_scroller.js +28 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/tests/menu/scroll.js +235 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroll.js +363 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/menu/views/menu/scroller.js +250 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/desktop_scroller.js +92 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/native_scroll.js +25 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/scroll.js +33 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/render_delegates/touch_scroller.js +76 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/integration.js +50 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/methods.js +143 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/tests/scroll/ui.js +258 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroll.js +1164 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/core_scroller.js +332 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroll.js +236 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/desktop/scroller.js +347 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroll.js +15 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/scroller.js +10 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroll.js +804 -0
- data/lib/frameworks/sproutcore/frameworks/experimental/frameworks/scroll_view/views/touch/scroller.js +133 -0
- data/lib/frameworks/sproutcore/frameworks/foundation/resources/text_field.css +3 -3
- data/lib/frameworks/sproutcore/frameworks/foundation/validators/number.js +3 -1
- data/lib/frameworks/sproutcore/frameworks/foundation/views/text_field.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/media/views/audio.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/controls.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/media/views/media_slider.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/mini_controls.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/simple_controls.js +2 -4
- data/lib/frameworks/sproutcore/frameworks/media/views/video.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/routing/system/routes.js +29 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/core.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/debug/test_suites/array/replace.js +1 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/private/property_chain.js +2 -1
- data/lib/frameworks/sproutcore/frameworks/runtime/system/binding.js +3 -3
- data/lib/frameworks/sproutcore/frameworks/runtime/system/index_set.js +2 -2
- data/lib/frameworks/sproutcore/frameworks/runtime/system/object.js +1 -1
- data/lib/frameworks/sproutcore/themes/ace/resources/collection/normal/list_item.css +2 -2
- data/lib/frameworks/sproutcore/themes/legacy_theme/english.lproj/segmented.css +1 -1
- data/lib/gen/app/templates/apps/@target_name@/Buildfile +3 -5
- data/lib/gen/app/templates/apps/@target_name@/resources/_theme.css +18 -0
- data/lib/gen/project/templates/@filename@/Buildfile +2 -2
- data/lib/sproutcore.rb +30 -5
- data/lib/sproutcore/builders.rb +1 -0
- data/lib/sproutcore/builders/chance_file.rb +9 -16
- data/lib/sproutcore/builders/html.rb +2 -1
- data/lib/sproutcore/builders/minify.rb +4 -35
- data/lib/sproutcore/builders/module.rb +38 -1
- data/lib/sproutcore/builders/split.rb +63 -0
- data/lib/sproutcore/builders/strings.rb +7 -1
- data/lib/sproutcore/helpers.rb +1 -1
- data/lib/sproutcore/helpers/css_split.rb +190 -0
- data/lib/sproutcore/helpers/entry_sorter.rb +2 -0
- data/lib/sproutcore/helpers/minifier.rb +40 -16
- data/lib/sproutcore/helpers/static_helper.rb +35 -17
- data/lib/sproutcore/models/manifest.rb +26 -0
- data/lib/sproutcore/models/target.rb +12 -1
- data/lib/sproutcore/rack.rb +1 -0
- data/lib/sproutcore/rack/proxy.rb +244 -225
- data/lib/sproutcore/rack/restrict_ip.rb +67 -0
- data/lib/sproutcore/rack/service.rb +8 -2
- data/lib/sproutcore/tools.rb +102 -46
- data/lib/sproutcore/tools/build.rb +91 -43
- data/lib/sproutcore/tools/gen.rb +2 -3
- data/lib/sproutcore/tools/manifest.rb +22 -16
- data/lib/sproutcore/tools/server.rb +21 -0
- data/spec/buildtasks/helpers/accept_list +22 -0
- data/spec/buildtasks/helpers/accept_list.rb +128 -0
- data/spec/buildtasks/helpers/list.json +11 -0
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_2x_spec.rb +1 -39
- data/spec/buildtasks/manifest/prepare_build_tasks/chance_spec.rb +0 -38
- data/spec/buildtasks/manifest/prepare_build_tasks/combine_spec.rb +4 -4
- data/spec/buildtasks/manifest/prepare_build_tasks/module_spec.rb +2 -2
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_indirect_spec.rb +7 -16
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_2x_spec.rb +7 -17
- data/spec/buildtasks/manifest/prepare_build_tasks/packed_spec.rb +11 -6
- data/spec/fixtures/builder_tests/Buildfile +2 -1
- data/spec/fixtures/builder_tests/apps/module_test/modules/required_module/core.js +0 -0
- data/spec/lib/builders/module_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/sproutcore.gemspec +4 -9
- data/vendor/chance/lib/chance.rb +25 -6
- data/vendor/chance/lib/chance/factory.rb +45 -0
- data/vendor/chance/lib/chance/instance.rb +173 -28
- data/vendor/chance/lib/chance/instance/data_url.rb +0 -29
- data/vendor/chance/lib/chance/instance/slicing.rb +57 -4
- data/vendor/chance/lib/chance/instance/spriting.rb +112 -21
- data/vendor/chance/lib/chance/parser.rb +80 -52
- data/vendor/sproutcore/SCCompiler.jar +0 -0
- data/vendor/sproutcore/lib/args4j-2.0.12.jar +0 -0
- data/vendor/sproutcore/lib/yuicompressor-2.4.2.jar +0 -0
- metadata +84 -25
@@ -279,7 +279,7 @@ SC.Drag = SC.Object.extend(
|
|
279
279
|
// if all else fails, check to see if the source object is a data source.
|
280
280
|
} else {
|
281
281
|
var source = this.get('source') ;
|
282
|
-
if (source && SC.typeOf(source.dragDataForType)
|
282
|
+
if (source && SC.typeOf(source.dragDataForType) === SC.T_FUNCTION) {
|
283
283
|
return source.dragDataForType(this, dataType) ;
|
284
284
|
|
285
285
|
// no data source found. :(
|
@@ -701,7 +701,8 @@ SC.Drag = SC.Object.extend(
|
|
701
701
|
if (!ret) {
|
702
702
|
ret = 1 ;
|
703
703
|
while (x = x.get('parentView')) {
|
704
|
-
if (dropTargets[SC.guidFor(x)] !== undefined) ret
|
704
|
+
if (dropTargets[SC.guidFor(x)] !== undefined) ret = ret+1 ;
|
705
|
+
if(x.isPane && x.isMainPane) ret = ret+10000; // Arbitrary value always have the main pain on top
|
705
706
|
}
|
706
707
|
depth[guid] = ret ;
|
707
708
|
}
|
@@ -902,7 +903,7 @@ SC.Drag = SC.Object.extend(
|
|
902
903
|
ret = ret.sort(function(a,b) {
|
903
904
|
var view = a;
|
904
905
|
while (view = view.get('parentView')) {
|
905
|
-
if (b
|
906
|
+
if (b === view) return -1 ;
|
906
907
|
}
|
907
908
|
return 1;
|
908
909
|
}) ;
|
@@ -17,7 +17,11 @@ var items = [
|
|
17
17
|
{ separator: YES },
|
18
18
|
{ title: 'Selected Menu Item…', isChecked: YES, keyEquivalent: 'ctrl_shift_o' },
|
19
19
|
{ title: 'Item with Submenu', subMenu: [{ title: 'Submenu item 1' }, { title: 'Submenu item 2'}] },
|
20
|
-
{ title: 'Disabled Menu Item', isEnabled: NO }
|
20
|
+
{ title: 'Disabled Menu Item', isEnabled: NO },
|
21
|
+
{ separator: YES },
|
22
|
+
{ title: 'Unique Menu Item Class Per Item', exampleView: SC.MenuItemView.extend({
|
23
|
+
classNames: 'custom-menu-item'.w()
|
24
|
+
}) }
|
21
25
|
// { isSeparator: YES },
|
22
26
|
// { groupTitle: 'Menu Label', items: [{ title: 'Nested Item' }, { title: 'Nested Item' }] }
|
23
27
|
];
|
@@ -166,6 +170,15 @@ test('Custom MenuItemView Class', function() {
|
|
166
170
|
menu2.remove();
|
167
171
|
});
|
168
172
|
|
173
|
+
|
174
|
+
test('Custom MenuItemView Class on an item using itemExampleViewKey', function() {
|
175
|
+
equals(menu.get('exampleView'), SC.MenuItemView, 'SC.MenuPane should generate SC.MenuItemViews by default');
|
176
|
+
menu.popup();
|
177
|
+
ok(menu.$('.custom-menu-item').length === 1, 'SC.MenuPane should generate one instance of a custom class if the item has an exampleView property');
|
178
|
+
ok($($('.sc-menu-item')[11]).hasClass('custom-menu-item'), 'The last menu item should have a custom class');
|
179
|
+
menu.remove();
|
180
|
+
});
|
181
|
+
|
169
182
|
test('Basic Submenus', function() {
|
170
183
|
var smallMenu = SC.MenuPane.create({
|
171
184
|
controlSize: SC.SMALL_CONTROL_SIZE,
|
@@ -227,13 +240,13 @@ test('Automatic Closing', function() {
|
|
227
240
|
|
228
241
|
test('keyEquivalents', function() {
|
229
242
|
var keyEquivalents = menu._keyEquivalents;
|
230
|
-
|
231
|
-
// verify that keyEquivalents were mapped correctly and that multiple
|
243
|
+
|
244
|
+
// verify that keyEquivalents were mapped correctly and that multiple
|
232
245
|
// keyEquivalents work
|
233
246
|
menu.items.forEach(function(item) {
|
234
247
|
var keyEq = item.keyEquivalent, idx, len;
|
235
248
|
if(!keyEq) return;
|
236
|
-
|
249
|
+
|
237
250
|
if(SC.typeOf(keyEq)===SC.T_ARRAY) {
|
238
251
|
for(idx=0,len=keyEq.length;idx<len;idx++) {
|
239
252
|
ok(keyEquivalents[keyEq[idx]], "keyEquivalent should map to " + keyEq[idx]);
|
@@ -2158,13 +2158,6 @@ SC.CollectionView = SC.View.extend(SC.CollectionViewDelegate, SC.CollectionConte
|
|
2158
2158
|
|
2159
2159
|
if(!this.get('isSelectable')) return NO;
|
2160
2160
|
|
2161
|
-
info = this.mouseDownInfo = {
|
2162
|
-
event: ev,
|
2163
|
-
itemView: itemView,
|
2164
|
-
contentIndex: contentIndex,
|
2165
|
-
at: Date.now()
|
2166
|
-
};
|
2167
|
-
|
2168
2161
|
// become first responder if possible.
|
2169
2162
|
this.becomeFirstResponder() ;
|
2170
2163
|
|
@@ -2207,6 +2200,13 @@ SC.CollectionView = SC.View.extend(SC.CollectionViewDelegate, SC.CollectionConte
|
|
2207
2200
|
sel = this.get('selection');
|
2208
2201
|
if (sel) sel = sel.indexSetForSource(content);
|
2209
2202
|
|
2203
|
+
info = this.mouseDownInfo = {
|
2204
|
+
event: ev,
|
2205
|
+
itemView: itemView,
|
2206
|
+
contentIndex: contentIndex,
|
2207
|
+
at: Date.now()
|
2208
|
+
};
|
2209
|
+
|
2210
2210
|
isSelected = sel ? sel.contains(contentIndex) : NO;
|
2211
2211
|
info.modifierKeyPressed = modifierKeyPressed = ev.ctrlKey || ev.metaKey ;
|
2212
2212
|
|
@@ -54,7 +54,7 @@ SC.MenuItemView = SC.View.extend(SC.ContentDisplay,
|
|
54
54
|
@default YES
|
55
55
|
*/
|
56
56
|
acceptsFirstResponder: YES,
|
57
|
-
|
57
|
+
|
58
58
|
/**
|
59
59
|
IE only attribute to block bluring of other controls
|
60
60
|
|
@@ -140,7 +140,8 @@ SC.MenuItemView = SC.View.extend(SC.ContentDisplay,
|
|
140
140
|
isModal: NO,
|
141
141
|
isSubMenu: YES,
|
142
142
|
parentMenu: parentMenu,
|
143
|
-
controlSize: parentMenu.get('controlSize')
|
143
|
+
controlSize: parentMenu.get('controlSize'),
|
144
|
+
exampleView: parentMenu.get('exampleView')
|
144
145
|
});
|
145
146
|
}
|
146
147
|
}
|
@@ -302,7 +303,7 @@ SC.MenuItemView = SC.View.extend(SC.ContentDisplay,
|
|
302
303
|
|
303
304
|
/**
|
304
305
|
The title from the content property.
|
305
|
-
|
306
|
+
|
306
307
|
@field
|
307
308
|
@type String
|
308
309
|
@observes content.title
|
@@ -470,9 +471,10 @@ SC.MenuItemView = SC.View.extend(SC.ContentDisplay,
|
|
470
471
|
}
|
471
472
|
|
472
473
|
if(this.get('hasSubMenu')) {
|
473
|
-
this._subMenuTimer = this.invokeLater(this.showSubMenu,100) ;
|
474
|
+
this._subMenuTimer = this.invokeLater(this.showSubMenu, 100) ;
|
474
475
|
}
|
475
|
-
|
476
|
+
|
477
|
+
return YES;
|
476
478
|
},
|
477
479
|
|
478
480
|
/** @private
|
@@ -1095,7 +1095,16 @@ SC.ScrollView = SC.View.extend({
|
|
1095
1095
|
if (gen !== this.touchGeneration) return;
|
1096
1096
|
|
1097
1097
|
var touch = this.touch, itemView;
|
1098
|
-
|
1098
|
+
|
1099
|
+
// NOTE! On iPad it is possible that the timer set in touchStart() will not have yet fired and that touchEnd() will
|
1100
|
+
// come in in the same Run Loop as the one that started with the call to touchStart(). The bad thing that happens is that
|
1101
|
+
// even though we cleared this.touch, occasionally if touchEnd() comes in right at the end of the Run Loop and
|
1102
|
+
// then the timer expires and starts a new Run Loop to call beginTouchesInContent(), that this.touch will STILL exist
|
1103
|
+
// here. There's no explanation for it, and it's not 100% reproducible, but what happens is that if we try to capture
|
1104
|
+
// the touch that has already ended, assignTouch() in RootResponder will check touch.hasEnded and throw an exception.
|
1105
|
+
|
1106
|
+
// Therefore, don't capture a touch if the touch still exists and hasEnded
|
1107
|
+
if (touch && this.tracking && !this.dragging && !touch.touch.scrollHasEnded && !touch.touch.hasEnded) {
|
1099
1108
|
// try to capture the touch
|
1100
1109
|
touch.touch.captureTouch(this, YES);
|
1101
1110
|
|
@@ -1270,8 +1279,8 @@ SC.ScrollView = SC.View.extend({
|
|
1270
1279
|
positionInContentY = ((this._scroll_verticalScrollOffset||0) + touchYInFrame) / this._scale;
|
1271
1280
|
|
1272
1281
|
// calculate deltas
|
1273
|
-
var deltaX = positionInContentX - touch.
|
1274
|
-
deltaY = positionInContentY - touch.
|
1282
|
+
var deltaX = positionInContentX - touch.startTouchOffsetInContent.x,
|
1283
|
+
deltaY = positionInContentY - touch.startTouchOffsetInContent.y;
|
1275
1284
|
|
1276
1285
|
var isDragging = touch.dragging;
|
1277
1286
|
if (!touch.scrolling.x && Math.abs(deltaX) > touch.scrollTolerance.x && touch.enableScrolling.x) {
|
@@ -7,8 +7,8 @@
|
|
7
7
|
|
8
8
|
/** @class
|
9
9
|
|
10
|
-
Used to display an iframe. The source, (specified by the value property) of
|
11
|
-
the iFrame should be from the same domain. (i.e. the src / value should be
|
10
|
+
Used to display an iframe. The source, (specified by the value property) of
|
11
|
+
the iFrame should be from the same domain. (i.e. the src / value should be
|
12
12
|
from the same domain) if you want to access the contents of the iframe.
|
13
13
|
|
14
14
|
@extends SC.View
|
@@ -17,7 +17,7 @@
|
|
17
17
|
*/
|
18
18
|
SC.WebView = SC.View.extend(SC.Control, {/** @scope SC.WebView.prototype */
|
19
19
|
classNames: 'sc-web-view',
|
20
|
-
|
20
|
+
|
21
21
|
/**
|
22
22
|
@type Array
|
23
23
|
@default ['value', 'shouldAutoResize']
|
@@ -27,7 +27,7 @@ SC.WebView = SC.View.extend(SC.Control, {/** @scope SC.WebView.prototype */
|
|
27
27
|
|
28
28
|
/**
|
29
29
|
The content of the iframe can be bigger than the size specifed when creating
|
30
|
-
the view. If you want the view to be auto-resized to the dimensions of the
|
30
|
+
the view. If you want the view to be auto-resized to the dimensions of the
|
31
31
|
iframe, then set the value of this property to YES.
|
32
32
|
The web view can be auto resized only if the contents are from the same
|
33
33
|
domain as the parent domain.
|
@@ -43,23 +43,23 @@ SC.WebView = SC.View.extend(SC.Control, {/** @scope SC.WebView.prototype */
|
|
43
43
|
*/
|
44
44
|
render: function(context, firstTime) {
|
45
45
|
var src = this.get('value'), iframe;
|
46
|
-
|
46
|
+
|
47
47
|
if (firstTime) {
|
48
|
-
context.push('<iframe src="' + src +
|
48
|
+
context.push('<iframe src="' + src +
|
49
49
|
'" style="position: absolute; width: 100%; height: 100%; border: 0px; margin: 0px; padding: 0px;"></iframe>');
|
50
|
-
}
|
50
|
+
}
|
51
51
|
else if(src!==this._lastSrc) {
|
52
52
|
iframe = this.$('iframe');
|
53
53
|
// clear out the previous src, to force a reload
|
54
54
|
iframe.attr('src', 'javascript:;');
|
55
55
|
iframe.attr('src', src);
|
56
56
|
}
|
57
|
-
|
57
|
+
|
58
58
|
this._lastSrc = src;
|
59
59
|
},
|
60
60
|
|
61
61
|
/**
|
62
|
-
Called when the layer gets created.
|
62
|
+
Called when the layer gets created.
|
63
63
|
*/
|
64
64
|
didCreateLayer: function() {
|
65
65
|
var f = this.$('iframe');
|
@@ -67,16 +67,25 @@ SC.WebView = SC.View.extend(SC.Control, {/** @scope SC.WebView.prototype */
|
|
67
67
|
SC.Event.add(f, 'load', this, this.iframeDidLoad);
|
68
68
|
},
|
69
69
|
|
70
|
+
/**
|
71
|
+
Called before the layer gets destroyed.
|
72
|
+
*/
|
73
|
+
willDestroyLayer: function() {
|
74
|
+
var f = this.$('iframe');
|
75
|
+
// Remove the onload event so that the iframe can be released
|
76
|
+
SC.Event.remove(f, 'load', this, this.iframeDidLoad);
|
77
|
+
},
|
70
78
|
|
71
79
|
/** @private
|
72
80
|
Called when iframe onload event is fired.
|
73
|
-
1. Resizes the view to fit the contents of the iframe using the
|
81
|
+
1. Resizes the view to fit the contents of the iframe using the
|
74
82
|
scroll width and scroll height of the contents of the iframe
|
75
|
-
|
83
|
+
|
76
84
|
The iframe contents can be accessed only when the src is from the same
|
77
85
|
domain as the parent document
|
78
86
|
*/
|
79
87
|
iframeDidLoad: function() {
|
88
|
+
|
80
89
|
//fit the iframe to size of the contents.
|
81
90
|
if (this.get('shouldAutoResize') === YES) {
|
82
91
|
var contentWindow;
|
@@ -85,13 +94,13 @@ SC.WebView = SC.View.extend(SC.Control, {/** @scope SC.WebView.prototype */
|
|
85
94
|
contentWindow = iframeElt.contentWindow;
|
86
95
|
if(contentWindow && contentWindow.document && contentWindow.document.documentElement){
|
87
96
|
var docElement = contentWindow.document.documentElement;
|
88
|
-
// setting the width before the height gives more accurate results..
|
97
|
+
// setting the width before the height gives more accurate results..
|
89
98
|
// atleast for the test iframe content i'm using.
|
90
99
|
//TODO: try out document flows other than top to bottom.
|
91
100
|
if (!SC.browser.isIE) {
|
92
101
|
this.$().width(docElement.scrollWidth);
|
93
|
-
this.$().height(docElement.scrollHeight);
|
94
|
-
}
|
102
|
+
this.$().height(docElement.scrollHeight);
|
103
|
+
}
|
95
104
|
else {
|
96
105
|
this.$().width(docElement.scrollWidth + 12);
|
97
106
|
this.$().height(docElement.scrollHeight + 5);
|
@@ -2,9 +2,13 @@ config :designer, :required => [:runtime, :foundation, :desktop]
|
|
2
2
|
|
3
3
|
config :forms, :required => :desktop
|
4
4
|
|
5
|
+
config :scroll_view, :required => [:runtime, :foundation, :desktop]
|
6
|
+
|
7
|
+
config :menu, :required => [:'experimental/scroll_view']
|
8
|
+
|
5
9
|
config :greenhouse,
|
6
10
|
:required => [:sproutcore, :designer, :statechart],
|
7
11
|
:theme => :ace,
|
8
12
|
:css_theme => 'ace.greenhouse'
|
9
13
|
|
10
|
-
config :polymorphism, :required => :datastore
|
14
|
+
config :polymorphism, :required => :datastore
|
@@ -0,0 +1,28 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SproutCore - JavaScript Application Framework
|
3
|
+
// Copyright: ©2006-2011 Strobe Inc. and contributors.
|
4
|
+
// Portions ©2008-2011 Apple Inc. All rights reserved.
|
5
|
+
// License: Licensed under MIT license (see license.js)
|
6
|
+
// ==========================================================================
|
7
|
+
|
8
|
+
|
9
|
+
SC.BaseTheme.menuScrollerRenderDelegate = SC.RenderDelegate.create({
|
10
|
+
className: 'menu-scroller',
|
11
|
+
|
12
|
+
render: function (dataSource, context) {
|
13
|
+
this.addSizeClassName(dataSource, context);
|
14
|
+
context.addClass({
|
15
|
+
'sc-vertical': YES,
|
16
|
+
disabled: !dataSource.get('isEnabled')
|
17
|
+
});
|
18
|
+
context.push('<span class="scrollArrow ' + (dataSource.get('scrollDown') ? 'arrowDown' : 'arrowUp') + '"> </span>');
|
19
|
+
},
|
20
|
+
|
21
|
+
update: function (dataSource, context) {
|
22
|
+
this.addSizeClassName(dataSource, context);
|
23
|
+
context.addClass({
|
24
|
+
'sc-vertical': YES,
|
25
|
+
disabled: !dataSource.get('isEnabled')
|
26
|
+
});
|
27
|
+
}
|
28
|
+
});
|
@@ -0,0 +1,235 @@
|
|
1
|
+
// ==========================================================================
|
2
|
+
// Project: SC.MenuScrollView Unit Test
|
3
|
+
// Copyright: ©2006-2011 Strobe Inc. and contributors.
|
4
|
+
// License: Licensed under MIT license (see license.js)
|
5
|
+
// ==========================================================================
|
6
|
+
/*globals SC module test ok equals same stop start */
|
7
|
+
|
8
|
+
var view, pane;
|
9
|
+
module("Menu Scroll View", {
|
10
|
+
setup: function () {
|
11
|
+
SC.RunLoop.begin();
|
12
|
+
|
13
|
+
var content = ['Dogfish Head',
|
14
|
+
'Delerium',
|
15
|
+
'Smuttynose',
|
16
|
+
'Harpoon',
|
17
|
+
'Bitburger',
|
18
|
+
'Goose Island',
|
19
|
+
'Old Speckled Hen',
|
20
|
+
'Fuller\'s',
|
21
|
+
'Anchor',
|
22
|
+
'Brooklyn',
|
23
|
+
'Lagunitas',
|
24
|
+
'Coney Island'];
|
25
|
+
|
26
|
+
view = SC.MenuScrollView.create({
|
27
|
+
layout: { top: 100, left: 20, height: 100, width: 100 },
|
28
|
+
contentView: SC.SourceListView.design({
|
29
|
+
content: content
|
30
|
+
})
|
31
|
+
});
|
32
|
+
|
33
|
+
pane = SC.MainPane.create();
|
34
|
+
pane.appendChild(view);
|
35
|
+
pane.append();
|
36
|
+
|
37
|
+
SC.RunLoop.end();
|
38
|
+
},
|
39
|
+
|
40
|
+
teardown: function () {
|
41
|
+
SC.RunLoop.begin();
|
42
|
+
pane.remove();
|
43
|
+
pane.destroy();
|
44
|
+
SC.RunLoop.end();
|
45
|
+
}
|
46
|
+
});
|
47
|
+
|
48
|
+
test("menu scroll views cannot scroll horizontally", function () {
|
49
|
+
ok(!view.get('hasHorizontalScroller'),
|
50
|
+
"the horizontal scroller doesn't exist");
|
51
|
+
ok(!view.get('isHorizontalScrollerVisible'),
|
52
|
+
"the horizontal scroller shouldn't be visible");
|
53
|
+
});
|
54
|
+
|
55
|
+
test("vertical scroll views cannot scroll horizontally", function () {
|
56
|
+
ok(view.get('hasVerticalScroller'),
|
57
|
+
"the vertical scroller should exist");
|
58
|
+
});
|
59
|
+
|
60
|
+
test("menu scrollers not visible when content doesn't fill the container", function () {
|
61
|
+
SC.RunLoop.begin();
|
62
|
+
view.setPath('contentView.content', []);
|
63
|
+
SC.RunLoop.end();
|
64
|
+
|
65
|
+
equals(view.getPath('verticalScrollerView.isVisible'), NO,
|
66
|
+
"the top vertical scroller shouldn't be visible");
|
67
|
+
equals(view.getPath('verticalScrollerView2.isVisible'), NO,
|
68
|
+
"the bottom vertical scroller shouldn't be visible");
|
69
|
+
});
|
70
|
+
|
71
|
+
test("initially, only the bottom menu scroller should be visible", function () {
|
72
|
+
equals(view.getPath('verticalScrollerView.isVisible'), NO,
|
73
|
+
"the top scroller shouldn't be visible");
|
74
|
+
equals(view.getPath('verticalScrollerView2.isVisible'), YES,
|
75
|
+
"the bottom scroller should be visible");
|
76
|
+
});
|
77
|
+
|
78
|
+
// ..........................................................
|
79
|
+
// autohidesVerticalScrollers => YES
|
80
|
+
//
|
81
|
+
|
82
|
+
// Top scroller visibility
|
83
|
+
test("when setting `verticalScrollOffset` to anywhere before the scroller thickness, the top scroller will become invisible", function () {
|
84
|
+
view.scrollTo(0, 50);
|
85
|
+
|
86
|
+
ok(view.getPath('verticalScrollerView.isVisible'),
|
87
|
+
"top scroller should be visible");
|
88
|
+
|
89
|
+
view.scrollTo(0, view.getPath('verticalScrollerView.scrollerThickness'));
|
90
|
+
equals(view.get('verticalScrollOffset'), 0,
|
91
|
+
"view should be at 0px scroll offset");
|
92
|
+
ok(!view.getPath('verticalScrollerView.isVisible'),
|
93
|
+
"top scroller should NOT be visible");
|
94
|
+
|
95
|
+
view.scrollTo(0, 50);
|
96
|
+
ok(view.getPath('verticalScrollerView.isVisible'),
|
97
|
+
"top scroller should be visible");
|
98
|
+
|
99
|
+
view.scrollTo(0, view.getPath('verticalScrollerView.scrollerThickness') + 1);
|
100
|
+
ok(view.getPath('verticalScrollerView.isVisible'),
|
101
|
+
"top scroller should be visible");
|
102
|
+
|
103
|
+
view.scrollTo(0, 50);
|
104
|
+
ok(view.getPath('verticalScrollerView.isVisible'),
|
105
|
+
"top scroller should be visible");
|
106
|
+
|
107
|
+
view.scrollTo(0, view.getPath('verticalScrollerView.scrollerThickness') - 1);
|
108
|
+
ok(!view.getPath('verticalScrollerView.isVisible'),
|
109
|
+
"top scroller should NOT be visible");
|
110
|
+
});
|
111
|
+
|
112
|
+
// Bottom scroller visibility
|
113
|
+
test("when setting `verticalScrollOffset` to anywhere before the scroller thickness, the bottom scroller will become invisible", function () {
|
114
|
+
var max = view.get('maximumVerticalScrollOffset');
|
115
|
+
ok(view.getPath('verticalScrollerView2.isVisible'),
|
116
|
+
"bottom scroller should be visible");
|
117
|
+
|
118
|
+
// @ bottom
|
119
|
+
view.scrollTo(0, max);
|
120
|
+
ok(!view.getPath('verticalScrollerView2.isVisible'),
|
121
|
+
"bottom scroller should NOT be visible");
|
122
|
+
|
123
|
+
view.scrollTo(0, 0);
|
124
|
+
ok(view.getPath('verticalScrollerView2.isVisible'),
|
125
|
+
"bottom scroller should be visible");
|
126
|
+
|
127
|
+
// just enough so bottom is invisible
|
128
|
+
view.scrollTo(0, max - view.getPath('verticalScrollerView2.scrollerThickness') - 1);
|
129
|
+
ok(view.getPath('verticalScrollerView2.isVisible'),
|
130
|
+
"bottom scroller should be visible");
|
131
|
+
|
132
|
+
view.scrollTo(0, 0);
|
133
|
+
ok(view.getPath('verticalScrollerView2.isVisible'),
|
134
|
+
"bottom scroller should be visible");
|
135
|
+
|
136
|
+
// exactly enough for bottom to be invisible
|
137
|
+
view.scrollTo(0, max - view.getPath('verticalScrollerView2.scrollerThickness'));
|
138
|
+
ok(!view.getPath('verticalScrollerView2.isVisible'),
|
139
|
+
"bottom scroller should NOT be visible");
|
140
|
+
|
141
|
+
view.scrollTo(0, 0);
|
142
|
+
ok(view.getPath('verticalScrollerView2.isVisible'),
|
143
|
+
"bottom scroller should be visible");
|
144
|
+
|
145
|
+
// more than enough for bottom to be invisible
|
146
|
+
view.scrollTo(0, max - view.getPath('verticalScrollerView2.scrollerThickness') + 1);
|
147
|
+
ok(!view.getPath('verticalScrollerView2.isVisible'),
|
148
|
+
"bottom scroller should NOT be visible");
|
149
|
+
});
|
150
|
+
|
151
|
+
test("when the top scroller becomes visible, the vertical scroll offset is adjusted by the scroller thickness", function () {
|
152
|
+
view.scrollBy(0, 1);
|
153
|
+
|
154
|
+
var thickness = view.getPath('verticalScrollerView.scrollerThickness');
|
155
|
+
|
156
|
+
// check for adjustment
|
157
|
+
equals(view.get('verticalScrollOffset'),
|
158
|
+
1 + thickness,
|
159
|
+
"the offset should be the scroller thickness + 1");
|
160
|
+
|
161
|
+
// shouldn't adjust this time
|
162
|
+
view.scrollBy(0, 1);
|
163
|
+
equals(view.get('verticalScrollOffset'),
|
164
|
+
2 + thickness,
|
165
|
+
"the offset should be the scroller thickness + 2");
|
166
|
+
|
167
|
+
// shouldn't adjust this time
|
168
|
+
view.scrollBy(0, -1);
|
169
|
+
equals(view.get('verticalScrollOffset'),
|
170
|
+
1 + thickness,
|
171
|
+
"the offset should be the scroller thickness + 1");
|
172
|
+
|
173
|
+
// check for adjustment
|
174
|
+
view.scrollBy(0, -1);
|
175
|
+
equals(view.get('verticalScrollOffset'), 0,
|
176
|
+
"the offset should be 0px");
|
177
|
+
});
|
178
|
+
|
179
|
+
// ..........................................................
|
180
|
+
// autohidesVerticalScrollers => NO
|
181
|
+
//
|
182
|
+
|
183
|
+
test("when `autohidesVerticalScrollers` is NO, it will hide both when the content doesn't fill the container", function () {
|
184
|
+
view.set('autohidesVerticalScrollers', NO);
|
185
|
+
view.tile();
|
186
|
+
|
187
|
+
SC.RunLoop.begin();
|
188
|
+
view.setPath('contentView.content', []);
|
189
|
+
SC.RunLoop.end();
|
190
|
+
|
191
|
+
equals(view.getPath('verticalScrollerView.isVisible'), NO,
|
192
|
+
"the top vertical scroller shouldn't be visible");
|
193
|
+
equals(view.getPath('verticalScrollerView2.isVisible'), NO,
|
194
|
+
"the bottom vertical scroller shouldn't be visible");
|
195
|
+
});
|
196
|
+
|
197
|
+
test("when `autohidesVerticalScrollers` is NO, both scrollers will be shown when the content overflows", function () {
|
198
|
+
view.set('autohidesVerticalScrollers', NO);
|
199
|
+
view.tile();
|
200
|
+
|
201
|
+
equals(view.getPath('verticalScrollerView.isVisible'), YES,
|
202
|
+
"the top vertical scroller shouldn't be visible");
|
203
|
+
equals(view.getPath('verticalScrollerView2.isVisible'), YES,
|
204
|
+
"the bottom vertical scroller shouldn't be visible");
|
205
|
+
});
|
206
|
+
|
207
|
+
// ..........................................................
|
208
|
+
// autohidesVerticalScroller => NO AND
|
209
|
+
// autohidesVerticalScrollers => NO
|
210
|
+
//
|
211
|
+
|
212
|
+
test("when `autohidesVerticalScroller` is NO, it will NOT hide both when the content doesn't fill the container", function () {
|
213
|
+
view.set('autohidesVerticalScroller', NO);
|
214
|
+
view.set('autohidesVerticalScrollers', NO);
|
215
|
+
|
216
|
+
SC.RunLoop.begin();
|
217
|
+
view.setPath('contentView.content', []);
|
218
|
+
SC.RunLoop.end();
|
219
|
+
|
220
|
+
equals(view.getPath('verticalScrollerView.isVisible'), YES,
|
221
|
+
"the top vertical scroller shouldn't be visible");
|
222
|
+
equals(view.getPath('verticalScrollerView2.isVisible'), YES,
|
223
|
+
"the bottom vertical scroller shouldn't be visible");
|
224
|
+
});
|
225
|
+
|
226
|
+
test("when `autohidesVerticalScroller` is NO, both scrollers will be shown when the content overflows", function () {
|
227
|
+
view.set('autohidesVerticalScroller', NO);
|
228
|
+
view.set('autohidesVerticalScrollers', NO);
|
229
|
+
view.tile();
|
230
|
+
|
231
|
+
equals(view.getPath('verticalScrollerView.isVisible'), YES,
|
232
|
+
"the top vertical scroller shouldn't be visible");
|
233
|
+
equals(view.getPath('verticalScrollerView2.isVisible'), YES,
|
234
|
+
"the bottom vertical scroller shouldn't be visible");
|
235
|
+
});
|