OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 | |
5 /** | |
6 * *Warning*: this library is **internal**, and APIs are subject to change. | |
7 * | |
8 * Tracks observable objects for dirty checking and testing purposes. | |
9 * | |
10 * It can collect all observed objects, which can be used to trigger predictable | |
11 * delivery of all pending changes in a test, including objects allocated | |
12 * internally to another library, such as those in `package:mdv`. | |
13 */ | |
14 library observe.src.watcher; | |
15 | |
16 import 'package:observe/observe.dart' show Observable; | |
17 | |
18 /** The number of active observables in the system. */ | |
19 int get allObservablesCount => _allObservablesCount; | |
Siggi Cherem (dart-lang)
2013/07/22 21:47:22
could we simply use _allObservables.length here or
Jennifer Messerly
2013/07/22 21:55:11
I think that's the idea, yeah. Keeps it consistent
| |
20 | |
21 int _allObservablesCount = 0; | |
22 | |
23 List<Observable> _allObservables = null; | |
24 | |
25 bool _delivering = false; | |
26 | |
27 void registerObservable(Observable obj) { | |
28 if (_allObservables == null) _allObservables = <Observable>[]; | |
29 _allObservables.add(obj); | |
30 _allObservablesCount++; | |
31 } | |
32 | |
33 /** | |
34 * Synchronously deliver all change records for known observables. | |
35 * | |
36 * This will execute [Observable.deliverChanges] on objects that inherit from | |
37 * [ObservableMixin]. | |
38 */ | |
39 // Note: this is called performMicrotaskCheckpoint in change_summary.js. | |
40 void dirtyCheckObservables() { | |
41 if (_delivering) return; | |
42 if (_allObservables == null) return; | |
43 | |
44 _delivering = true; | |
45 | |
46 int cycles = 0; | |
47 bool anyChanged = false; | |
48 do { | |
49 cycles++; | |
50 var toCheck = _allObservables; | |
51 _allObservables = <Observable>[]; | |
52 anyChanged = false; | |
53 | |
54 for (final observer in toCheck) { | |
55 if (observer.hasObservers) { | |
56 anyChanged = anyChanged || observer.deliverChanges(); | |
Siggi Cherem (dart-lang)
2013/07/22 21:47:22
I thought you were going to deliverChanges regardl
Jennifer Messerly
2013/07/22 22:38:39
gooooood catch! Totally messed that up when refact
| |
57 _allObservables.add(observer); | |
58 } | |
59 } | |
60 } while (cycles < _MAX_DIRTY_CHECK_CYCLES && anyChanged); | |
61 | |
62 // TODO(jmesserly): warn if limit is reached? | |
Siggi Cherem (dart-lang)
2013/07/22 21:47:22
+1, might be worth adding a simple print for now.
Jennifer Messerly
2013/07/22 21:55:11
or logging? :)
Siggi Cherem (dart-lang)
2013/07/22 21:57:25
sure =)
Jennifer Messerly
2013/07/22 22:38:39
added logging. also it prints object index and toS
| |
63 | |
64 _allObservablesCount = _allObservables.length; | |
65 _delivering = false; | |
66 } | |
67 | |
68 var _MAX_DIRTY_CHECK_CYCLES = 1000; | |
OLD | NEW |