 Chromium Code Reviews
 Chromium Code Reviews Issue 213713002:
  Reapply change that makes path-observer more agressive with property lookups.  (Closed) 
  Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
    
  
    Issue 213713002:
  Reapply change that makes path-observer more agressive with property lookups.  (Closed) 
  Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart| OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 library template_binding.test.template_binding_test; | 5 library template_binding.test.template_binding_test; | 
| 6 | 6 | 
| 7 import 'dart:async'; | 7 import 'dart:async'; | 
| 8 import 'dart:html'; | 8 import 'dart:html'; | 
| 9 import 'dart:math' as math; | 9 import 'dart:math' as math; | 
| 10 import 'package:observe/observe.dart'; | 10 import 'package:observe/observe.dart'; | 
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 150 var div = createTestHtml( | 150 var div = createTestHtml( | 
| 151 '<template bind="{{ bound }}" if="{{ predicate }}">' | 151 '<template bind="{{ bound }}" if="{{ predicate }}">' | 
| 152 'value:{{ value }}' | 152 'value:{{ value }}' | 
| 153 '</template>'); | 153 '</template>'); | 
| 154 // Dart note: predicate changed from 0->null because 0 isn't falsey in Dart. | 154 // Dart note: predicate changed from 0->null because 0 isn't falsey in Dart. | 
| 155 // See https://code.google.com/p/dart/issues/detail?id=11956 | 155 // See https://code.google.com/p/dart/issues/detail?id=11956 | 
| 156 // Changed bound from null->1 since null is equivalent to JS undefined, | 156 // Changed bound from null->1 since null is equivalent to JS undefined, | 
| 157 // and would cause the template to not be expanded. | 157 // and would cause the template to not be expanded. | 
| 158 var m = toObservable({ 'predicate': null, 'bound': 1 }); | 158 var m = toObservable({ 'predicate': null, 'bound': 1 }); | 
| 159 var template = div.firstChild; | 159 var template = div.firstChild; | 
| 160 templateBind(template).model = m; | 160 bool errorSeen = false; | 
| 161 runZoned(() { | |
| 162 templateBind(template).model = m; | |
| 163 }, onError: (e, s) { | |
| 164 expect(e, isNoSuchMethodError); | |
| 165 errorSeen = true; | |
| 166 }); | |
| 161 return new Future(() { | 167 return new Future(() { | 
| 162 expect(div.nodes.length, 1); | 168 expect(div.nodes.length, 1); | 
| 163 | 169 | 
| 164 m['predicate'] = 1; | 170 m['predicate'] = 1; | 
| 165 | 171 | 
| 166 }).then(endOfMicrotask).then((_) { | 172 expect(errorSeen, isFalse); | 
| 167 expect(div.nodes.length, 2); | 173 }).then(nextMicrotask).then((_) { | 
| 168 expect(div.lastChild.text, 'value:'); | 174 expect(errorSeen, isTrue); | 
| 175 expect(div.nodes.length, 1); | |
| 169 | 176 | 
| 170 m['bound'] = toObservable({ 'value': 2 }); | 177 m['bound'] = toObservable({ 'value': 2 }); | 
| 171 | 178 | 
| 172 }).then(endOfMicrotask).then((_) { | 179 }).then(endOfMicrotask).then((_) { | 
| 173 expect(div.nodes.length, 2); | 180 expect(div.nodes.length, 2); | 
| 174 expect(div.lastChild.text, 'value:2'); | 181 expect(div.lastChild.text, 'value:2'); | 
| 175 | 182 | 
| 176 m['bound']['value'] = 3; | 183 m['bound']['value'] = 3; | 
| 177 | 184 | 
| 178 }).then(endOfMicrotask).then((_) { | 185 }).then(endOfMicrotask).then((_) { | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 227 test('Bind oneTime-If - predicate true', () { | 234 test('Bind oneTime-If - predicate true', () { | 
| 228 var div = createTestHtml( | 235 var div = createTestHtml( | 
| 229 '<template bind="{{ bound }}" if="[[ predicate ]]">' | 236 '<template bind="{{ bound }}" if="[[ predicate ]]">' | 
| 230 'value:{{ value }}' | 237 'value:{{ value }}' | 
| 231 '</template>'); | 238 '</template>'); | 
| 232 | 239 | 
| 233 // Dart note: changed bound from null->1 since null is equivalent to JS | 240 // Dart note: changed bound from null->1 since null is equivalent to JS | 
| 234 // undefined, and would cause the template to not be expanded. | 241 // undefined, and would cause the template to not be expanded. | 
| 235 var m = toObservable({ 'predicate': 1, 'bound': 1 }); | 242 var m = toObservable({ 'predicate': 1, 'bound': 1 }); | 
| 236 var template = div.firstChild; | 243 var template = div.firstChild; | 
| 237 templateBind(template).model = m; | 244 bool errorSeen = false; | 
| 245 runZoned(() { | |
| 246 templateBind(template).model = m; | |
| 247 }, onError: (e, s) { | |
| 248 expect(e, isNoSuchMethodError); | |
| 249 errorSeen = true; | |
| 250 }); | |
| 238 | 251 | 
| 239 return new Future(() { | 252 return new Future(() { | 
| 240 expect(div.nodes.length, 2); | 253 expect(div.nodes.length, 1); | 
| 241 expect(div.lastChild.text, 'value:'); | |
| 242 | |
| 243 m['bound'] = toObservable({ 'value': 2 }); | 254 m['bound'] = toObservable({ 'value': 2 }); | 
| 244 | 255 expect(errorSeen, isTrue); | 
| 245 }).then(endOfMicrotask).then((_) { | 256 }).then(endOfMicrotask).then((_) { | 
| 246 expect(div.nodes.length, 2); | 257 expect(div.nodes.length, 2); | 
| 247 expect(div.lastChild.text, 'value:2'); | 258 expect(div.lastChild.text, 'value:2'); | 
| 248 | 259 | 
| 249 m['bound']['value'] = 3; | 260 m['bound']['value'] = 3; | 
| 250 | 261 | 
| 251 }).then(endOfMicrotask).then((_) { | 262 }).then(endOfMicrotask).then((_) { | 
| 252 expect(div.nodes.length, 2); | 263 expect(div.nodes.length, 2); | 
| 253 expect(div.lastChild.text, 'value:3'); | 264 expect(div.lastChild.text, 'value:3'); | 
| 254 | 265 | 
| (...skipping 1937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2192 var instance = outer.createInstance(model, new TestBindingSyntax()); | 2203 var instance = outer.createInstance(model, new TestBindingSyntax()); | 
| 2193 expect(outer.content.nodes.first, | 2204 expect(outer.content.nodes.first, | 
| 2194 templateBind(instance.nodes.first).ref); | 2205 templateBind(instance.nodes.first).ref); | 
| 2195 | 2206 | 
| 2196 host.append(instance); | 2207 host.append(instance); | 
| 2197 return new Future(() { | 2208 return new Future(() { | 
| 2198 expect(host.firstChild.nextNode.text, 'bar:replaced'); | 2209 expect(host.firstChild.nextNode.text, 'bar:replaced'); | 
| 2199 }); | 2210 }); | 
| 2200 }); | 2211 }); | 
| 2201 | 2212 | 
| 2213 test('CreateInstance - sync error', () { | |
| 2214 var div = createTestHtml('<template bind="{{}}">{{foo}}</template>'); | |
| 2215 var outer = templateBind(div.nodes.first); | |
| 2216 var model = 1; // model is missing 'foo' should throw. | |
| 2217 expect(() => outer.createInstance(model, new TestBindingSyntax()), | |
| 2218 throwsA(isNoSuchMethodError)); | |
| 2219 }); | |
| 2220 | |
| 2221 test('CreateInstance - async error', () { | |
| 2222 var div = createTestHtml( | |
| 2223 '<template bind="{{a}}">' | |
| 2224 '<template bind="{{b}}">' | |
| 2225 '{{ foo }}:{{ replaceme }}' | |
| 2226 '</template>' | |
| 2227 '</template>'); | |
| 2228 var outer = templateBind(div.nodes.first); | |
| 2229 var model = toObservable({'b': 1}); // missing 'foo' should throw. | |
| 2230 | |
| 2231 bool seen = false; | |
| 2232 runZoned(() => outer.createInstance(model, new TestBindingSyntax()), | |
| 
Siggi Cherem (dart-lang)
2014/03/26 22:36:17
I'm not 100% convinced about having some errors be
 | |
| 2233 onError: (e) { | |
| 2234 expect(e, isNoSuchMethodError); | |
| 2235 seen = true; | |
| 2236 }); | |
| 2237 return new Future(() { expect(seen, isTrue); }); | |
| 2238 }); | |
| 2239 | |
| 2202 test('Repeat - svg', () { | 2240 test('Repeat - svg', () { | 
| 2203 var div = createTestHtml( | 2241 var div = createTestHtml( | 
| 2204 '<svg width="400" height="110">' | 2242 '<svg width="400" height="110">' | 
| 2205 '<template repeat>' | 2243 '<template repeat>' | 
| 2206 '<rect width="{{ width }}" height="{{ height }}" />' | 2244 '<rect width="{{ width }}" height="{{ height }}" />' | 
| 2207 '</template>' | 2245 '</template>' | 
| 2208 '</svg>'); | 2246 '</svg>'); | 
| 2209 | 2247 | 
| 2210 var model = toObservable([{ 'width': 10, 'height': 11 }, | 2248 var model = toObservable([{ 'width': 10, 'height': 11 }, | 
| 2211 { 'width': 20, 'height': 21 }]); | 2249 { 'width': 20, 'height': 21 }]); | 
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2395 } | 2433 } | 
| 2396 } | 2434 } | 
| 2397 | 2435 | 
| 2398 class Issue18Syntax extends BindingDelegate { | 2436 class Issue18Syntax extends BindingDelegate { | 
| 2399 prepareBinding(path, name, node) { | 2437 prepareBinding(path, name, node) { | 
| 2400 if (name != 'class') return null; | 2438 if (name != 'class') return null; | 
| 2401 | 2439 | 
| 2402 return (model, _, oneTime) => new PathObserver(model, path); | 2440 return (model, _, oneTime) => new PathObserver(model, path); | 
| 2403 } | 2441 } | 
| 2404 } | 2442 } | 
| OLD | NEW |