| Index: runtime/observatory/lib/src/app/page.dart
|
| diff --git a/runtime/observatory/lib/src/app/page.dart b/runtime/observatory/lib/src/app/page.dart
|
| index 2942905e98bee4e17e776d2fec3193af08c2bd39..c77757950197eee564a47bbcf9d680a987ec71e9 100644
|
| --- a/runtime/observatory/lib/src/app/page.dart
|
| +++ b/runtime/observatory/lib/src/app/page.dart
|
| @@ -26,88 +26,143 @@ abstract class Page extends Observable {
|
| element = null;
|
| }
|
|
|
| - /// Called when the page should update its state based on [url].
|
| + /// Called when the page should update its state based on [uri].
|
| /// NOTE: Only called when the page is installed.
|
| - void visit(String url, Map argsMap) {
|
| + void visit(Uri uri, Map argsMap) {
|
| args = toObservable(argsMap);
|
| - _visit(url);
|
| + _visit(uri);
|
| }
|
|
|
| // Overridden by subclasses.
|
| - void _visit(String url);
|
| + void _visit(Uri uri);
|
|
|
| - /// Called to test whether this page can visit [url].
|
| - bool canVisit(String url);
|
| + /// Called to test whether this page can visit [uri].
|
| + bool canVisit(Uri uri);
|
| }
|
|
|
| -/// A general service object viewer.
|
| -class ServiceObjectPage extends Page {
|
| - ServiceObjectPage(app) : super(app);
|
| +/// A [SimplePage] matches a single uri path and displays a single element.
|
| +class SimplePage extends Page {
|
| + final String path;
|
| + final String elementTagName;
|
| + SimplePage(this.path, this.elementTagName, app) : super(app);
|
|
|
| void onInstall() {
|
| if (element == null) {
|
| - /// Lazily create page.
|
| - element = new Element.tag('service-view');
|
| + element = new Element.tag(elementTagName);
|
| }
|
| }
|
|
|
| - void _visit(String url) {
|
| + void _visit(Uri uri) {
|
| + assert(uri != null);
|
| + assert(canVisit(uri));
|
| + }
|
| +
|
| + Future<Isolate> getIsolate(Uri uri) {
|
| + return app.vm.getIsolate(uri.queryParameters['isolateId']).catchError((e) {
|
| + Logger.root.severe('$path visit error: $e');
|
| + return e;
|
| + });
|
| + }
|
| +
|
| + bool canVisit(Uri uri) => uri.path == path;
|
| +}
|
| +
|
| +/// Error page for unrecognized paths.
|
| +class ErrorPage extends Page {
|
| + ErrorPage(app) : super(app);
|
| +
|
| + void onInstall() {
|
| + if (element == null) {
|
| + // Lazily create page.
|
| + element = new Element.tag('general-error');
|
| + }
|
| + }
|
| +
|
| + void _visit(Uri uri) {
|
| assert(element != null);
|
| - assert(canVisit(url));
|
| - if (url == '') {
|
| + assert(canVisit(uri));
|
| +
|
| + /*
|
| + if (uri.path == '') {
|
| // Nothing requested.
|
| return;
|
| }
|
| - /// Request url from VM and display it.
|
| - app.vm.getDeprecated(url).then((obj) {
|
| - ServiceObjectViewElement serviceElement = element;
|
| - serviceElement.object = obj;
|
| - }).catchError((e) {
|
| - Logger.root.severe('ServiceObjectPage visit error: $e');
|
| - });
|
| + */
|
| +
|
| + if (element != null) {
|
| + GeneralErrorElement serviceElement = element;
|
| + serviceElement.message = "Path '${uri.path}' not found";
|
| + }
|
| }
|
|
|
| /// Catch all.
|
| - bool canVisit(String url) => true;
|
| + bool canVisit(Uri uri) => true;
|
| }
|
|
|
| -class IsolateSuffixPage extends Page {
|
| - final String pagePrefix;
|
| - final String elementTagName;
|
| - String _isolateId;
|
| - String get isolateId => _isolateId;
|
| - IsolateSuffixPage(this.pagePrefix, this.elementTagName, app) : super(app);
|
| +/// Top-level vm info page.
|
| +class VMPage extends SimplePage {
|
| + VMPage(app) : super('vm', 'service-view', app);
|
|
|
| - void onInstall() {
|
| - if (element == null) {
|
| - element = new Element.tag(elementTagName);
|
| - }
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + app.vm.reload().then((vm) {
|
| + if (element != null) {
|
| + ServiceObjectViewElement serviceElement = element;
|
| + serviceElement.object = vm;
|
| + }
|
| + }).catchError((e) {
|
| + Logger.root.severe('VMPage visit error: $e');
|
| + });
|
| }
|
| +}
|
|
|
| - void _visit(String url) {
|
| - assert(url != null);
|
| - assert(canVisit(url));
|
| - _isolateId = url.substring(pagePrefix.length);
|
| +class FlagsPage extends SimplePage {
|
| + FlagsPage(app) : super('flags', 'flag-list', app);
|
| +
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + app.vm.getFlagList().then((flags) {
|
| + if (element != null) {
|
| + FlagListElement serviceElement = element;
|
| + serviceElement.flagList = flags;
|
| + }
|
| + }).catchError((e) {
|
| + Logger.root.severe('FlagsPage visit error: $e');
|
| + });
|
| }
|
| +}
|
|
|
| - Future<Isolate> getIsolate() {
|
| - return app.vm.getIsolate(isolateId).catchError((e) {
|
| - Logger.root.severe('$pagePrefix visit error: $e');
|
| - return e;
|
| +class InspectPage extends SimplePage {
|
| + InspectPage(app) : super('inspect', 'service-view', app);
|
| +
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + getIsolate(uri).then((isolate) {
|
| + var objectId = uri.queryParameters['objectId'];
|
| + if (objectId == null) {
|
| + isolate.reload().then(_visitObject);
|
| + } else {
|
| + isolate.getObject(objectId).then(_visitObject);
|
| + }
|
| });
|
| }
|
|
|
| - bool canVisit(String url) => url.startsWith(pagePrefix);
|
| + void _visitObject(obj) {
|
| + if (element != null) {
|
| + ServiceObjectViewElement serviceElement = element;
|
| + serviceElement.object = obj;
|
| + }
|
| + }
|
| }
|
|
|
|
|
| /// Class tree page.
|
| -class ClassTreePage extends IsolateSuffixPage {
|
| - ClassTreePage(app) : super('class-tree/', 'class-tree', app);
|
| +class ClassTreePage extends SimplePage {
|
| + ClassTreePage(app) : super('class-tree', 'class-tree', app);
|
|
|
| - void _visit(String url) {
|
| - super._visit(url);
|
| - getIsolate().then((isolate) {
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + getIsolate(uri).then((isolate) {
|
| if (element != null) {
|
| /// Update the page.
|
| ClassTreeElement page = element;
|
| @@ -117,12 +172,12 @@ class ClassTreePage extends IsolateSuffixPage {
|
| }
|
| }
|
|
|
| -class DebuggerPage extends IsolateSuffixPage {
|
| - DebuggerPage(app) : super('debugger/', 'debugger-page', app);
|
| +class DebuggerPage extends SimplePage {
|
| + DebuggerPage(app) : super('debugger', 'debugger-page', app);
|
|
|
| - void _visit(String url) {
|
| - super._visit(url);
|
| - getIsolate().then((isolate) {
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + getIsolate(uri).then((isolate) {
|
| if (element != null) {
|
| /// Update the page.
|
| DebuggerPageElement page = element;
|
| @@ -132,12 +187,12 @@ class DebuggerPage extends IsolateSuffixPage {
|
| }
|
| }
|
|
|
| -class CpuProfilerPage extends IsolateSuffixPage {
|
| - CpuProfilerPage(app) : super('profiler/', 'cpu-profile', app);
|
| +class CpuProfilerPage extends SimplePage {
|
| + CpuProfilerPage(app) : super('profiler', 'cpu-profile', app);
|
|
|
| - void _visit(String url) {
|
| - super._visit(url);
|
| - getIsolate().then((isolate) {
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + getIsolate(uri).then((isolate) {
|
| if (element != null) {
|
| /// Update the page.
|
| CpuProfileElement page = element;
|
| @@ -147,13 +202,13 @@ class CpuProfilerPage extends IsolateSuffixPage {
|
| }
|
| }
|
|
|
| -class AllocationProfilerPage extends IsolateSuffixPage {
|
| +class AllocationProfilerPage extends SimplePage {
|
| AllocationProfilerPage(app)
|
| - : super('allocation-profiler/', 'heap-profile', app);
|
| + : super('allocation-profiler', 'heap-profile', app);
|
|
|
| - void _visit(String url) {
|
| - super._visit(url);
|
| - getIsolate().then((isolate) {
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + getIsolate(uri).then((isolate) {
|
| if (element != null) {
|
| /// Update the page.
|
| HeapProfileElement page = element;
|
| @@ -163,12 +218,12 @@ class AllocationProfilerPage extends IsolateSuffixPage {
|
| }
|
| }
|
|
|
| -class HeapMapPage extends IsolateSuffixPage {
|
| - HeapMapPage(app) : super('heap-map/', 'heap-map', app);
|
| +class HeapMapPage extends SimplePage {
|
| + HeapMapPage(app) : super('heap-map', 'heap-map', app);
|
|
|
| - void _visit(String url) {
|
| - super._visit(url);
|
| - getIsolate().then((isolate) {
|
| + void _visit(Uri uri) {
|
| + super._visit(uri);
|
| + getIsolate(uri).then((isolate) {
|
| if (element != null) {
|
| /// Update the page.
|
| HeapMapElement page = element;
|
| @@ -188,13 +243,14 @@ class ErrorViewPage extends Page {
|
| }
|
| }
|
|
|
| - void _visit(String url) {
|
| + void _visit(Uri uri) {
|
| assert(element != null);
|
| - assert(canVisit(url));
|
| + assert(canVisit(uri));
|
| (element as ServiceObjectViewElement).object = app.lastErrorOrException;
|
| }
|
|
|
| - bool canVisit(String url) => url.startsWith('error/');
|
| + // TODO(turnidge): How to test this page?
|
| + bool canVisit(Uri uri) => uri.path.startsWith('error/');
|
| }
|
|
|
| class VMConnectPage extends Page {
|
| @@ -207,18 +263,16 @@ class VMConnectPage extends Page {
|
| assert(element != null);
|
| }
|
|
|
| - void _visit(String url) {
|
| + void _visit(Uri uri) {
|
| assert(element != null);
|
| - assert(canVisit(url));
|
| + assert(canVisit(uri));
|
| }
|
|
|
| - bool canVisit(String url) => url.startsWith('vm-connect/');
|
| + // TODO(turnidge): Update this to not have the trailing slash.
|
| + bool canVisit(Uri uri) => uri.path.startsWith('vm-connect/');
|
| }
|
|
|
| class MetricsPage extends Page {
|
| - static RegExp _matcher = new RegExp(r'isolates/.*/metrics');
|
| - static RegExp _isolateMatcher = new RegExp(r'isolates/.*/');
|
| -
|
| // Page state, retained as long as ObservatoryApplication.
|
| String selectedMetricId;
|
|
|
| @@ -266,20 +320,13 @@ class MetricsPage extends Page {
|
| throw new FallThroughError();
|
| }
|
|
|
| - String _isolateId(String url) {
|
| - // Grab isolate prefix.
|
| - String isolateId = _isolateMatcher.stringMatch(url);
|
| - // Remove the trailing slash.
|
| - return isolateId.substring(0, isolateId.length - 1);
|
| - }
|
| -
|
| - void _visit(String url) {
|
| + void _visit(Uri uri) {
|
| assert(element != null);
|
| - assert(canVisit(url));
|
| - app.vm.getIsolate(_isolateId(url)).then((i) {
|
| + assert(canVisit(uri));
|
| + app.vm.getIsolate(uri.queryParameters['isolateId']).then((i) {
|
| (element as MetricsPageElement).isolate = i;
|
| });
|
| }
|
|
|
| - bool canVisit(String url) => _matcher.hasMatch(url);
|
| + bool canVisit(Uri uri) => uri.path == 'metrics';
|
| }
|
|
|