[observatory] When the VM is forwarding events to the Android or Fuchsia system tracers, link to the document describing how to use them. Change-Id: I940b2d5b47a54661c5d25e6d52e714b8819d79a6 Reviewed-on: https://dart-review.googlesource.com/58601 Reviewed-by: Zach Anderson <zra@google.com> Reviewed-by: Chinmay Garde <chinmaygarde@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
diff --git a/runtime/observatory/lib/src/elements/timeline_page.dart b/runtime/observatory/lib/src/elements/timeline_page.dart index a751329..608a789 100644 --- a/runtime/observatory/lib/src/elements/timeline_page.dart +++ b/runtime/observatory/lib/src/elements/timeline_page.dart
@@ -78,6 +78,9 @@ IFrameElement _frame; DivElement _content; + bool get usingVMRecorder => + _recorder.name != "Fuchsia" && _recorder.name != "Systrace"; + void render() { if (_frame == null) { _frame = new IFrameElement()..src = 'timeline.html'; @@ -125,44 +128,85 @@ ] ]) ]; - if (children.isEmpty) { - children = [ - navBar([ - new NavTopMenuElement(queue: _r.queue), - new NavVMMenuElement(vm, _events, queue: _r.queue), - navMenu('timeline', link: Uris.timeline()), - new NavRefreshElement(queue: _r.queue) - ..onRefresh.listen((e) async { - e.element.disabled = true; - await _refresh(); - e.element.disabled = false; - }), - new NavRefreshElement(label: 'clear', queue: _r.queue) - ..onRefresh.listen((e) async { - e.element.disabled = true; - await _clear(); - e.element.disabled = false; - }), - new NavRefreshElement(label: 'save', queue: _r.queue) - ..onRefresh.listen((e) async { - e.element.disabled = true; - await _save(); - e.element.disabled = false; - }), - new NavRefreshElement(label: 'load', queue: _r.queue) - ..onRefresh.listen((e) async { - e.element.disabled = true; - await _load(); - e.element.disabled = false; - }), - new NavNotifyElement(_notifications, queue: _r.queue) - ]), - _content, - new DivElement() - ..classes = ['iframe'] - ..children = [_frame] - ]; + + children = [ + navBar([ + new NavTopMenuElement(queue: _r.queue), + new NavVMMenuElement(vm, _events, queue: _r.queue), + navMenu('timeline', link: Uris.timeline()), + new NavRefreshElement(queue: _r.queue) + ..onRefresh.listen((e) async { + e.element.disabled = true; + await _refresh(); + e.element.disabled = !usingVMRecorder; + }), + new NavRefreshElement(label: 'clear', queue: _r.queue) + ..onRefresh.listen((e) async { + e.element.disabled = true; + await _clear(); + e.element.disabled = !usingVMRecorder; + }), + new NavRefreshElement(label: 'save', queue: _r.queue) + ..onRefresh.listen((e) async { + e.element.disabled = true; + await _save(); + e.element.disabled = !usingVMRecorder; + }), + new NavRefreshElement(label: 'load', queue: _r.queue) + ..onRefresh.listen((e) async { + e.element.disabled = true; + await _load(); + e.element.disabled = !usingVMRecorder; + }), + new NavNotifyElement(_notifications, queue: _r.queue) + ]), + _content, + _createIFrameOrMessage(), + ]; + } + + HtmlElement _createIFrameOrMessage() { + if (_recorder == null) { + return new DivElement() + ..classes = ['content-centered-big'] + ..text = 'Loading...'; } + + if (_recorder.name == "Fuchsia") { + return new DivElement() + ..classes = ['content-centered-big'] + ..children = [ + new BRElement(), + new SpanElement() + ..text = + "This VM is forwarding timeline events to Fuchsia's system tracing. See the ", + new AnchorElement() + ..text = "Fuchsia Tracing Usage Guide" + ..href = + "https://fuchsia.googlesource.com/garnet/+/master/docs/tracing_usage_guide.md", + new SpanElement()..text = ".", + ]; + } + + if (_recorder.name == "Systrace") { + return new DivElement() + ..classes = ['content-centered-big'] + ..children = [ + new BRElement(), + new SpanElement() + ..text = + "This VM is forwarding timeline events to Android's systrace. See the ", + new AnchorElement() + ..text = "systrace usage guide" + ..href = + "https://developer.android.com/studio/command-line/systrace", + new SpanElement()..text = ".", + ]; + } + + return new DivElement() + ..classes = ['iframe'] + ..children = [_frame]; } List<Element> _createProfileSelect() { @@ -202,6 +246,9 @@ Future _postMessage(String method, [Map<String, dynamic> params = const <String, dynamic>{}]) async { + if (_frame.contentWindow == null) { + return null; + } var message = {'method': method, 'params': params}; _frame.contentWindow .postMessage(json.encode(message), window.location.href);