[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);