Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(477)

Side by Side Diff: runtime/observatory/lib/src/elements/helpers/rendering_scheduler.dart

Issue 2968283002: Fixed synchronization problem in FF and Safari for virtual-tree test (Closed)
Patch Set: Clear the RenderScheduler wait list after notification Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 import 'dart:async'; 5 import 'dart:async';
6 6
7 import 'package:observatory/src/elements/helpers/rendering_queue.dart'; 7 import 'package:observatory/src/elements/helpers/rendering_queue.dart';
8 export 'package:observatory/src/elements/helpers/rendering_queue.dart'; 8 export 'package:observatory/src/elements/helpers/rendering_queue.dart';
9 9
10 /// A generic renderable object. 10 /// A generic renderable object.
(...skipping 21 matching lines...) Expand all
32 bool _dirty = false; 32 bool _dirty = false;
33 bool _renderingScheduled = false; 33 bool _renderingScheduled = false;
34 bool _notificationScheduled = false; 34 bool _notificationScheduled = false;
35 35
36 /// Element managed by this scheduler. 36 /// Element managed by this scheduler.
37 final T element; 37 final T element;
38 38
39 /// Queue used for rendering operations. 39 /// Queue used for rendering operations.
40 final RenderingQueue queue; 40 final RenderingQueue queue;
41 41
42 final List<Future> _wait = <Future>[];
43
42 /// Does the element need a new rendering cycle. 44 /// Does the element need a new rendering cycle.
43 bool get isDirty => _dirty; 45 bool get isDirty => _dirty;
44 46
45 /// Is the scheduler enabled. 47 /// Is the scheduler enabled.
46 bool get isEnabled => _enabled; 48 bool get isEnabled => _enabled;
47 49
48 final StreamController<RenderedEvent<T>> _onRendered = 50 final StreamController<RenderedEvent<T>> _onRendered =
49 new StreamController<RenderedEvent<T>>.broadcast(); 51 new StreamController<RenderedEvent<T>>.broadcast();
50 Stream<RenderedEvent<T>> get onRendered => _onRendered.stream; 52 Stream<RenderedEvent<T>> get onRendered => _onRendered.stream;
51 53
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 if (!_enabled) return; 105 if (!_enabled) return;
104 queue.enqueue(this); 106 queue.enqueue(this);
105 _renderingScheduled = true; 107 _renderingScheduled = true;
106 } 108 }
107 109
108 /// Renders the element (if the scheduler is enabled). 110 /// Renders the element (if the scheduler is enabled).
109 /// It will clear the dirty flag. 111 /// It will clear the dirty flag.
110 void render() { 112 void render() {
111 if (!_enabled) return; 113 if (!_enabled) return;
112 _dirty = false; 114 _dirty = false;
115 _wait.clear();
113 element.render(); 116 element.render();
114 _renderingScheduled = false; 117 _renderingScheduled = false;
115 scheduleNotification(); 118 scheduleNotification();
116 if (_dirty) scheduleRendering(); 119 if (_dirty) scheduleRendering();
117 } 120 }
118 121
119 /// Schedules a notification. 122 /// Schedules a notification.
120 void scheduleNotification() { 123 void scheduleNotification() {
121 if (_notificationScheduled) return; 124 if (_notificationScheduled) return;
122 _notify(); 125 _notify();
123 _notificationScheduled = true; 126 _notificationScheduled = true;
124 } 127 }
125 128
129 void waitFor(Iterable<Future> it) {
130 _wait.addAll(it);
131 }
132
126 Future _notify() async { 133 Future _notify() async {
134 await Future.wait(_wait);
135 _wait.clear();
127 _onRendered.add(new RenderedEvent<T>(element, _dirty)); 136 _onRendered.add(new RenderedEvent<T>(element, _dirty));
128 _notificationScheduled = false; 137 _notificationScheduled = false;
129 } 138 }
130 } 139 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698