Index: runtime/observatory/lib/src/elements/helpers/rendering_queue.dart |
diff --git a/runtime/observatory/lib/src/elements/helpers/rendering_queue.dart b/runtime/observatory/lib/src/elements/helpers/rendering_queue.dart |
index 707de2331ad3883bd0fca81ef112073aaacacb20..e2446192a44baaab5d1eb034bbfeecbf26bcb10e 100644 |
--- a/runtime/observatory/lib/src/elements/helpers/rendering_queue.dart |
+++ b/runtime/observatory/lib/src/elements/helpers/rendering_queue.dart |
@@ -56,15 +56,29 @@ class RenderingQueue { |
/// Add a task to the queue. |
/// If the current rendering phase is running it will be executed during this |
/// rendering cycle, otherwise it will be queued for the next one. |
- void enqueue(RenderingTask r) { |
+ void enqueue(RenderingTask r, {bool waitForBarrier: true}) { |
assert(r != null); |
- // If no task are in the queue there is no rendering phase scheduled. |
- if (isEmpty) _render(); |
+ final wasEmpty = _queue.isEmpty; |
_queue.addLast(r); |
+ // If no task are in the queue there is no rendering phase scheduled. |
+ if (wasEmpty) { |
+ if (waitForBarrier) { |
+ _render(); |
+ } else { |
+ // We schedule the _renderLoop as a microtask to allow the |
+ // scheduleRendering method to terminate, due to the fact that it is |
+ // generally invoked from inside a HtmlElement.attached method |
+ scheduleMicrotask(_renderLoop); |
+ } |
+ } |
} |
Future _render() async { |
await _barrier.next; |
+ _renderLoop(); |
+ } |
+ |
+ void _renderLoop() { |
while (_queue.isNotEmpty) { |
_queue.first.render(); |
_queue.removeFirst(); |