Refactor VM service IDs:

- IDs are strings which can be concatenated together like paths.
- Isolate ID is now "/isolates/XXX"
- Function, field, class, library, and script IDs are now stable.
- Introduce <type-ref> tags.

R=turnidge@google.com

Review URL: https://codereview.chromium.org//98253009

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@31358 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
johnmccutchan@google.com
2013-12-20 22:35:55 +00:00
parent 383468782e
commit 727d29d6b6
54 changed files with 39393 additions and 34058 deletions
@@ -29,7 +29,15 @@
</template>
</template>
</polymer-element><polymer-element name="error-view" extends="observatory-element">
</polymer-element><polymer-element name="service-ref" extends="observatory-element">
</polymer-element><polymer-element name="class-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element>
<polymer-element name="error-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
@@ -48,34 +56,42 @@
</div>
</template>
</polymer-element><polymer-element name="field-ref" extends="observatory-element">
</polymer-element><polymer-element name="field-ref" extends="service-ref">
<template>
<div>
<template if="{{ field['final'] }}"> final </template>
<template if="{{ field['const'] }}"> const </template>
<template if="{{ (field['declared_type']['name'] == 'dynamic' &amp;&amp; !field['final'] &amp;&amp; !field['const']) }}">
<template if="{{ ref['final'] }}"> final </template>
<template if="{{ ref['const'] }}"> const </template>
<template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
var
</template>
<template if="{{ (field['declared_type']['name'] != 'dynamic') }}">
<a href="{{ app.locationManager.currentIsolateClassLink(field['declared_type']['id']) }}">
{{ field['declared_type']['user_name'] }} </a>
<template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
<class-ref app="{{ app }}" ref="{{ ref['declared_type'] }}"></class-ref>
</template>
<a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">
{{ field['user_name'] }} </a>
<a href="{{ url }}">{{ name }}</a>
</div>
</template> </polymer-element><polymer-element name="instance-ref" extends="observatory-element">
</template> </polymer-element><polymer-element name="function-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="instance-ref" extends="service-ref">
<template>
<div>
<template if="{{ (instance['type'] == 'null') }}">
<template if="{{ (ref['type'] == 'null') }}">
{{ "null" }}
</template>
<template if="{{ (instance['type'] != 'null') }}">
<a href="{{ app.locationManager.currentIsolateObjectLink(instance['id'])}}">
{{ instance['preview'] }}
</a>
<template if="{{ (ref['type'] != 'null') }}">
<a href="{{ url }}">{{ name }} </a>
</template>
</div>
</template> </polymer-element><polymer-element name="class-view" extends="observatory-element">
</template>
</polymer-element><polymer-element name="library-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="class-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
@@ -84,13 +100,9 @@
class <strong>{{ cls['user_name'] }}</strong>
<template if="{{ cls['super']['type'] != 'Null' }}">
extends
<a href="{{ app.locationManager.currentIsolateClassLink(cls['super']['id'])}}">
{{ cls['super']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls['super'] }}"></class-ref>
</template>
<a class="pull-right" href="{{ app.locationManager.currentIsolateObjectLink(cls['library']['id'])}}">
{{ cls['library']['name'] }}
</a>
<library-ref app="{{ app }}" ref="{{ cls['library'] }}"></library-ref>
</div>
<div class="panel-body">
<table class="table table-hover">
@@ -120,8 +132,8 @@
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ field in cls['fields'] }}">
<td><field-ref app="{{ app }}" field="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ field['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -135,8 +147,8 @@
</thead>
<tbody>
<tr template="" repeat="{{ function in cls['functions'] }}">
<td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
<td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
<td><function-ref app="{{ app }}" ref="{{ function }}"></function-ref></td>
<td><function-ref app="{{ app }}" ref="{{ function }}" internal=""></function-ref></td>
</tr>
</tbody>
</table>
@@ -150,6 +162,12 @@
</div>
</template>
</polymer-element>
<polymer-element name="code-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="disassembly-entry" extends="observatory-element">
<template>
<div class="row">
@@ -174,9 +192,7 @@
<div class="col-md-8 col-md-offset-2">
<div class="{{ cssPanelClass }}">
<div class="panel-heading">
<a href="{{ app.locationManager.currentIsolateObjectLink(code['function']['id'])}}">
{{ code['function']['user_name'] }} ({{ code['function']['name'] }})
</a>
<function-ref app="{{ app }}" ref="{{ code['function'] }}"></function-ref>
</div>
<div class="panel-body">
<div class="row">
@@ -215,10 +231,8 @@
<template if="{{ field['static'] }}">static</template>
<template if="{{ field['final'] }}">final</template>
<template if="{{ field['const'] }}">const</template>
{{ field['user_name'] }} ({{ field['name'] }})
<a class="pull-right" href="{{ app.locationManager.currentIsolateClassLink(field['class']['id'])}}">
{{ field['class']['user_name'] }}
</a>
{{ field['user_name'] }} ({{ field['name'] }})
<class-ref app="{{ app }}" ref="{{ field['class'] }}"></class-ref>
</div>
<div class="panel-body">
<template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -227,9 +241,9 @@
assigned a single type, performance may improve.
</div>
</template>
<template if="{{ field['guard_class'] != 'dynamic'}}">
<template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp; (field['guard_class'] != 'unknown') }}">
<div class="alert alert-success">Field has monomorphic type</div>
<template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp;
<template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp;
field['guard_nullable'] }}">
<div class="alert alert-info">
Field has been assigned null. If a field is never assigned null,
@@ -237,9 +251,7 @@
</div>
</template>
<blockquote>
<a href="{{ app.locationManager.currentIsolateClassLink(field['guard_class']['id'])}}">
{{ field['guard_class']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ field['guard_class'] }}"></class-ref>
</blockquote>
</template>
</div>
@@ -254,15 +266,13 @@
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel-heading">
{{ function['user_name'] }} ({{ function['name'] }})
<a class="pull-right" href="{{ app.locationManager.currentIsolateClassLink(function['class']['id'])}}">
{{ function['class']['name'] }}
</a>
{{ function['user_name'] }} ({{ function['name'] }})
<class-ref app="{{ app }}" ref="{{ function['class'] }}"></class-ref>
</div>
<div class="panel-body">
<div>
<a class="btn btn-primary" href="{{ app.locationManager.currentIsolateObjectLink(function['code']['id'])}}">Current Code</a>
<a class="btn btn-info" href="{{ app.locationManager.currentIsolateObjectLink(function['unoptimized_code']['id'])}}">Unoptimized Code</a>
<code-ref app="{{ app }}" ref="{{ function['code'] }}"></code-ref>
<code-ref app="{{ app }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
</div>
<table class="table table-hover">
<tbody>
@@ -337,12 +347,10 @@
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel panel-warning">
<div class="panel-heading">
Instance of
<a href="{{ app.locationManager.currentIsolateClassLink(instance['class']['id'])}}">
{{ instance['class']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ instance['class'] }}"></class-ref>
</div>
<div class="panel-body">
<template if="{{ instance['error'] == null }}">
@@ -357,8 +365,8 @@
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ field in instance['fields'] }}">
<td><field-ref app="{{ app }}" field="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ field['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -372,7 +380,8 @@
</div>
</template>
</polymer-element><polymer-element name="json-view" extends="observatory-element">
</polymer-element>
<polymer-element name="json-view" extends="observatory-element">
<template>
<template bind="" if="{{ valueType == 'Primitive' }}">
<span>{{primitiveString}}</span>
@@ -401,6 +410,12 @@
</template>
</template>
</polymer-element>
<polymer-element name="script-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="library-view" extends="observatory-element">
<template>
<div class="alert alert-success">Library {{ library['name'] }}</div>
@@ -412,7 +427,7 @@
{{ script['kind'] }}
</td>
<td>
<a href="{{ app.locationManager.currentIsolateScriptLink(script['id'], script['name']) }}">{{ script['name'] }}</a>
<script-ref app="{{ app }}" ref="{{ script }}"></script-ref>
</td>
</tr>
</tbody>
@@ -422,9 +437,7 @@
<tbody>
<tr template="" repeat="{{ lib in library['libraries'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(lib['id'])}}">
{{ lib['url'] }}
</a>
<library-ref app="{{ app }}" ref="{{ lib }}"></library-ref>
</td>
</tr>
</tbody>
@@ -433,8 +446,8 @@
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ variable in library['variables'] }}">
<td><field-ref app="{{ app }}" field="{{ variable }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ variable['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ variable }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ variable['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -443,9 +456,7 @@
<tbody>
<tr template="" repeat="{{ func in library['functions'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(func['id'])}}">
{{ func['user_name'] }}
</a>
<function-ref app="{{ app }}" ref="{{ func }}"></function-ref>
</td>
</tr>
</tbody>
@@ -461,14 +472,10 @@
<tbody>
<tr template="" repeat="{{ cls in library['classes'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls }}"></class-ref>
</td>
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls }}" internal=""></class-ref>
</td>
</tr>
</tbody>
@@ -506,15 +513,15 @@
<tr>
<th>Depth</th>
<th>Function</th>
<th>Url</th>
<th>Script</th>
<th>Line</th>
</tr>
</thead>
<tbody>
<tr template="" repeat="{{ frame in trace['members'] }}">
<td>{{$index}}</td>
<td><a href="{{app.locationManager.currentIsolateObjectLink(frame['function']['id'])}}">{{ frame['name'] }}</a></td>
<td>{{ frame['url'] }}</td>
<td><function-ref app="{{ app }}" ref="{{ frame['function'] }}"></function-ref></td>
<td><script-ref app="{{ app }}" ref="{{ frame['script'] }}"></script-ref></td>
<td>{{ frame['line'] }}</td>
</tr>
</tbody>
@@ -588,7 +595,6 @@
<a class="navbar-brand" href="">Observatory</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<input class="span2 pull-right navbar-form" placeholder="VM Address" type="text" value="{{ app.requestManager.prefix }}">
</div>
</nav>
</template>
File diff suppressed because one or more lines are too long
@@ -29,7 +29,15 @@
</template>
</template>
</polymer-element><polymer-element name="error-view" extends="observatory-element">
</polymer-element><polymer-element name="service-ref" extends="observatory-element">
</polymer-element><polymer-element name="class-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element>
<polymer-element name="error-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
@@ -48,34 +56,42 @@
</div>
</template>
</polymer-element><polymer-element name="field-ref" extends="observatory-element">
</polymer-element><polymer-element name="field-ref" extends="service-ref">
<template>
<div>
<template if="{{ field['final'] }}"> final </template>
<template if="{{ field['const'] }}"> const </template>
<template if="{{ (field['declared_type']['name'] == 'dynamic' &amp;&amp; !field['final'] &amp;&amp; !field['const']) }}">
<template if="{{ ref['final'] }}"> final </template>
<template if="{{ ref['const'] }}"> const </template>
<template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
var
</template>
<template if="{{ (field['declared_type']['name'] != 'dynamic') }}">
<a href="{{ app.locationManager.currentIsolateClassLink(field['declared_type']['id']) }}">
{{ field['declared_type']['user_name'] }} </a>
<template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
<class-ref app="{{ app }}" ref="{{ ref['declared_type'] }}"></class-ref>
</template>
<a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">
{{ field['user_name'] }} </a>
<a href="{{ url }}">{{ name }}</a>
</div>
</template> </polymer-element><polymer-element name="instance-ref" extends="observatory-element">
</template> </polymer-element><polymer-element name="function-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="instance-ref" extends="service-ref">
<template>
<div>
<template if="{{ (instance['type'] == 'null') }}">
<template if="{{ (ref['type'] == 'null') }}">
{{ "null" }}
</template>
<template if="{{ (instance['type'] != 'null') }}">
<a href="{{ app.locationManager.currentIsolateObjectLink(instance['id'])}}">
{{ instance['preview'] }}
</a>
<template if="{{ (ref['type'] != 'null') }}">
<a href="{{ url }}">{{ name }} </a>
</template>
</div>
</template> </polymer-element><polymer-element name="class-view" extends="observatory-element">
</template>
</polymer-element><polymer-element name="library-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="class-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
@@ -84,13 +100,9 @@
class <strong>{{ cls['user_name'] }}</strong>
<template if="{{ cls['super']['type'] != 'Null' }}">
extends
<a href="{{ app.locationManager.currentIsolateClassLink(cls['super']['id'])}}">
{{ cls['super']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls['super'] }}"></class-ref>
</template>
<a class="pull-right" href="{{ app.locationManager.currentIsolateObjectLink(cls['library']['id'])}}">
{{ cls['library']['name'] }}
</a>
<library-ref app="{{ app }}" ref="{{ cls['library'] }}"></library-ref>
</div>
<div class="panel-body">
<table class="table table-hover">
@@ -120,8 +132,8 @@
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ field in cls['fields'] }}">
<td><field-ref app="{{ app }}" field="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ field['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -135,8 +147,8 @@
</thead>
<tbody>
<tr template="" repeat="{{ function in cls['functions'] }}">
<td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
<td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
<td><function-ref app="{{ app }}" ref="{{ function }}"></function-ref></td>
<td><function-ref app="{{ app }}" ref="{{ function }}" internal=""></function-ref></td>
</tr>
</tbody>
</table>
@@ -150,6 +162,12 @@
</div>
</template>
</polymer-element>
<polymer-element name="code-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="disassembly-entry" extends="observatory-element">
<template>
<div class="row">
@@ -174,9 +192,7 @@
<div class="col-md-8 col-md-offset-2">
<div class="{{ cssPanelClass }}">
<div class="panel-heading">
<a href="{{ app.locationManager.currentIsolateObjectLink(code['function']['id'])}}">
{{ code['function']['user_name'] }} ({{ code['function']['name'] }})
</a>
<function-ref app="{{ app }}" ref="{{ code['function'] }}"></function-ref>
</div>
<div class="panel-body">
<div class="row">
@@ -215,10 +231,8 @@
<template if="{{ field['static'] }}">static</template>
<template if="{{ field['final'] }}">final</template>
<template if="{{ field['const'] }}">const</template>
{{ field['user_name'] }} ({{ field['name'] }})
<a class="pull-right" href="{{ app.locationManager.currentIsolateClassLink(field['class']['id'])}}">
{{ field['class']['user_name'] }}
</a>
{{ field['user_name'] }} ({{ field['name'] }})
<class-ref app="{{ app }}" ref="{{ field['class'] }}"></class-ref>
</div>
<div class="panel-body">
<template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -227,9 +241,9 @@
assigned a single type, performance may improve.
</div>
</template>
<template if="{{ field['guard_class'] != 'dynamic'}}">
<template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp; (field['guard_class'] != 'unknown') }}">
<div class="alert alert-success">Field has monomorphic type</div>
<template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp;
<template if="{{ (field['guard_class'] != 'dynamic') &amp;&amp;
field['guard_nullable'] }}">
<div class="alert alert-info">
Field has been assigned null. If a field is never assigned null,
@@ -237,9 +251,7 @@
</div>
</template>
<blockquote>
<a href="{{ app.locationManager.currentIsolateClassLink(field['guard_class']['id'])}}">
{{ field['guard_class']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ field['guard_class'] }}"></class-ref>
</blockquote>
</template>
</div>
@@ -254,15 +266,13 @@
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel-heading">
{{ function['user_name'] }} ({{ function['name'] }})
<a class="pull-right" href="{{ app.locationManager.currentIsolateClassLink(function['class']['id'])}}">
{{ function['class']['name'] }}
</a>
{{ function['user_name'] }} ({{ function['name'] }})
<class-ref app="{{ app }}" ref="{{ function['class'] }}"></class-ref>
</div>
<div class="panel-body">
<div>
<a class="btn btn-primary" href="{{ app.locationManager.currentIsolateObjectLink(function['code']['id'])}}">Current Code</a>
<a class="btn btn-info" href="{{ app.locationManager.currentIsolateObjectLink(function['unoptimized_code']['id'])}}">Unoptimized Code</a>
<code-ref app="{{ app }}" ref="{{ function['code'] }}"></code-ref>
<code-ref app="{{ app }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
</div>
<table class="table table-hover">
<tbody>
@@ -337,12 +347,10 @@
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel panel-warning">
<div class="panel-heading">
Instance of
<a href="{{ app.locationManager.currentIsolateClassLink(instance['class']['id'])}}">
{{ instance['class']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ instance['class'] }}"></class-ref>
</div>
<div class="panel-body">
<template if="{{ instance['error'] == null }}">
@@ -357,8 +365,8 @@
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ field in instance['fields'] }}">
<td><field-ref app="{{ app }}" field="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ field['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -372,7 +380,8 @@
</div>
</template>
</polymer-element><polymer-element name="json-view" extends="observatory-element">
</polymer-element>
<polymer-element name="json-view" extends="observatory-element">
<template>
<template bind="" if="{{ valueType == 'Primitive' }}">
<span>{{primitiveString}}</span>
@@ -401,6 +410,12 @@
</template>
</template>
</polymer-element>
<polymer-element name="script-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
</polymer-element><polymer-element name="library-view" extends="observatory-element">
<template>
<div class="alert alert-success">Library {{ library['name'] }}</div>
@@ -412,7 +427,7 @@
{{ script['kind'] }}
</td>
<td>
<a href="{{ app.locationManager.currentIsolateScriptLink(script['id'], script['name']) }}">{{ script['name'] }}</a>
<script-ref app="{{ app }}" ref="{{ script }}"></script-ref>
</td>
</tr>
</tbody>
@@ -422,9 +437,7 @@
<tbody>
<tr template="" repeat="{{ lib in library['libraries'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(lib['id'])}}">
{{ lib['url'] }}
</a>
<library-ref app="{{ app }}" ref="{{ lib }}"></library-ref>
</td>
</tr>
</tbody>
@@ -433,8 +446,8 @@
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ variable in library['variables'] }}">
<td><field-ref app="{{ app }}" field="{{ variable }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ variable['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ variable }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ variable['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -443,9 +456,7 @@
<tbody>
<tr template="" repeat="{{ func in library['functions'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(func['id'])}}">
{{ func['user_name'] }}
</a>
<function-ref app="{{ app }}" ref="{{ func }}"></function-ref>
</td>
</tr>
</tbody>
@@ -461,14 +472,10 @@
<tbody>
<tr template="" repeat="{{ cls in library['classes'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls }}"></class-ref>
</td>
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls }}" internal=""></class-ref>
</td>
</tr>
</tbody>
@@ -506,15 +513,15 @@
<tr>
<th>Depth</th>
<th>Function</th>
<th>Url</th>
<th>Script</th>
<th>Line</th>
</tr>
</thead>
<tbody>
<tr template="" repeat="{{ frame in trace['members'] }}">
<td>{{$index}}</td>
<td><a href="{{app.locationManager.currentIsolateObjectLink(frame['function']['id'])}}">{{ frame['name'] }}</a></td>
<td>{{ frame['url'] }}</td>
<td><function-ref app="{{ app }}" ref="{{ frame['function'] }}"></function-ref></td>
<td><script-ref app="{{ app }}" ref="{{ frame['script'] }}"></script-ref></td>
<td>{{ frame['line'] }}</td>
</tr>
</tbody>
@@ -588,7 +595,6 @@
<a class="navbar-brand" href="">Observatory</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<input class="span2 pull-right navbar-form" placeholder="VM Address" type="text" value="{{ app.requestManager.prefix }}">
</div>
</nav>
</template>
File diff suppressed because one or more lines are too long
@@ -2,24 +2,30 @@ library observatory_elements;
// Export elements.
export 'package:observatory/src/observatory_elements/breakpoint_list.dart';
export 'package:observatory/src/observatory_elements/class_ref.dart';
export 'package:observatory/src/observatory_elements/class_view.dart';
export 'package:observatory/src/observatory_elements/code_ref.dart';
export 'package:observatory/src/observatory_elements/code_view.dart';
export 'package:observatory/src/observatory_elements/collapsible_content.dart';
export 'package:observatory/src/observatory_elements/error_view.dart';
export 'package:observatory/src/observatory_elements/field_ref.dart';
export 'package:observatory/src/observatory_elements/field_view.dart';
export 'package:observatory/src/observatory_elements/function_ref.dart';
export 'package:observatory/src/observatory_elements/function_view.dart';
export 'package:observatory/src/observatory_elements/instance_ref.dart';
export 'package:observatory/src/observatory_elements/instance_view.dart';
export 'package:observatory/src/observatory_elements/isolate_list.dart';
export 'package:observatory/src/observatory_elements/isolate_summary.dart';
export 'package:observatory/src/observatory_elements/json_view.dart';
export 'package:observatory/src/observatory_elements/library_ref.dart';
export 'package:observatory/src/observatory_elements/library_view.dart';
export 'package:observatory/src/observatory_elements/message_viewer.dart';
export 'package:observatory/src/observatory_elements/navigation_bar.dart';
export
'package:observatory/src/observatory_elements/observatory_application.dart';
export 'package:observatory/src/observatory_elements/response_viewer.dart';
export 'package:observatory/src/observatory_elements/script_ref.dart';
export 'package:observatory/src/observatory_elements/script_view.dart';
export 'package:observatory/src/observatory_elements/service_ref.dart';
export 'package:observatory/src/observatory_elements/source_view.dart';
export 'package:observatory/src/observatory_elements/stack_trace.dart';
@@ -2,18 +2,23 @@
<html>
<head>
<link rel="import" href="src/observatory_elements/breakpoint_list.html">
<link rel="import" href="src/observatory_elements/class_ref.html">
<link rel="import" href="src/observatory_elements/class_view.html">
<link rel="import" href="src/observatory_elements/code_ref.html">
<link rel="import" href="src/observatory_elements/code_view.html">
<link rel="import" href="src/observatory_elements/collapsible_content.html">
<link rel="import" href="src/observatory_elements/disassembly_entry.html">
<link rel="import" href="src/observatory_elements/error_view.html">
<link rel="import" href="src/observatory_elements/field_ref.html">
<link rel="import" href="src/observatory_elements/field_view.html">
<link rel="import" href="src/observatory_elements/function_ref.html">
<link rel="import" href="src/observatory_elements/function_view.html">
<link rel="import" href="src/observatory_elements/isolate_list.html">
<link rel="import" href="src/observatory_elements/isolate_summary.html">
<link rel="import" href="src/observatory_elements/instance_ref.html">
<link rel="import" href="src/observatory_elements/instance_view.html">
<link rel="import" href="src/observatory_elements/json_view.html">
<link rel="import" href="src/observatory_elements/library_ref.html">
<link rel="import" href="src/observatory_elements/library_view.html">
<link rel="import" href="src/observatory_elements/message_viewer.html">
<link rel="import" href="src/observatory_elements/navigation_bar.html">
@@ -22,6 +27,8 @@
<link rel="import"
href="src/observatory_elements/observatory_element.html">
<link rel="import" href="src/observatory_elements/response_viewer.html">
<link rel="import" href="src/observatory_elements/service_ref.html">
<link rel="import" href="src/observatory_elements/script_ref.html">
<link rel="import" href="src/observatory_elements/script_view.html">
<link rel="import" href="src/observatory_elements/source_view.html">
<link rel="import" href="src/observatory_elements/stack_trace.html">
@@ -6,7 +6,7 @@ part of observatory;
/// State for a running isolate.
class Isolate extends Observable {
@observable int id;
@observable String id;
@observable String name;
@observable final Map<String, ScriptSource> scripts =
toObservable(new Map<String, ScriptSource>());
@@ -9,8 +9,8 @@ class IsolateManager extends Observable {
ObservatoryApplication _application;
ObservatoryApplication get application => _application;
@observable final Map<int, Isolate> isolates =
toObservable(new Map<int, Isolate>());
@observable final Map<String, Isolate> isolates =
toObservable(new Map<String, Isolate>());
static bool _foundIsolateInMembers(int id, List<Map> members) {
return members.any((E) => E['id'] == id);
@@ -24,7 +24,7 @@ class IsolateManager extends Observable {
});
}
Isolate getIsolate(int id) {
Isolate getIsolate(String id) {
Isolate isolate = isolates[id];
if (isolate == null) {
isolate = new Isolate(id, '');
@@ -10,7 +10,7 @@ part of observatory;
class LocationManager extends Observable {
static const int InvalidIsolateId = 0;
static const String defaultHash = '#/isolates/';
static final RegExp currentIsolateMatcher = new RegExp(r"#/isolates/\d+/");
static final RegExp currentIsolateMatcher = new RegExp(r"#/isolates/\d+");
ObservatoryApplication _application;
ObservatoryApplication get application => _application;
@@ -48,24 +48,15 @@ class LocationManager extends Observable {
return currentIsolateAnchorPrefix() != null;
}
bool get isScriptLink {
String type = currentHashUri.queryParameters['type'];
return type == 'Script';
}
String get scriptName {
return Uri.decodeQueryComponent(currentHashUri.queryParameters['name']);
}
/// Extract the current isolate id as an integer. Returns [InvalidIsolateId]
/// if none is present in window.location.
int currentIsolateId() {
String isolatePrefix = currentIsolateAnchorPrefix();
if (isolatePrefix == null) {
return InvalidIsolateId;
String currentIsolateId() {
var prefix = currentIsolateAnchorPrefix();
if (prefix == null) {
return '';
}
String id = isolatePrefix.split("/")[2];
return int.parse(id);
// Chop off the '/#'.
return prefix.substring(2);
}
/// If no anchor is set, set the default anchor and return true.
@@ -99,59 +90,16 @@ class LocationManager extends Observable {
return relativeLink(isolateId, l);
}
/// Create a request for [objectId] on the current isolate.
/// Create a request for [scriptURL] on the current isolate.
@observable
String currentIsolateObjectLink(int objectId) {
var isolateId = currentIsolateId();
if (isolateId == LocationManager.InvalidIsolateId) {
return defaultHash;
}
return objectLink(isolateId, objectId);
}
/// Create a request for [cid] on the current isolate.
@observable
String currentIsolateClassLink(int cid) {
var isolateId = currentIsolateId();
if (isolateId == LocationManager.InvalidIsolateId) {
return defaultHash;
}
return classLink(isolateId, cid);
}
/// Create a request for the script [objectId] with script [name].
@observable
String currentIsolateScriptLink(int objectId, String name) {
var isolateId = currentIsolateId();
if (isolateId == LocationManager.InvalidIsolateId) {
return defaultHash;
}
return scriptLink(isolateId, objectId, name);
String currentIsolateScriptLink(String scriptURL) {
var encoded = Uri.encodeComponent(scriptURL);
return currentIsolateRelativeLink('scripts/$encoded');
}
/// Create a request for [l] on [isolateId].
@observable
String relativeLink(int isolateId, String l) {
return '#/isolates/$isolateId/$l';
}
/// Create a request for [objectId] on [isolateId].
@observable
String objectLink(int isolateId, int objectId) {
return '#/isolates/$isolateId/objects/$objectId';
}
/// Create a request for [cid] on [isolateId].
@observable
String classLink(int isolateId, int cid) {
return '#/isolates/$isolateId/classes/$cid';
}
@observable
/// Create a request for the script [objectId] with script [url].
String scriptLink(int isolateId, int objectId, String name) {
String encodedName = Uri.encodeQueryComponent(name);
return '#/isolates/$isolateId/objects/$objectId'
'?type=Script&name=$encodedName';
String relativeLink(String isolateId, String l) {
return '#/$isolateId/$l';
}
}
@@ -19,7 +19,12 @@ abstract class RequestManager extends Observable {
/// Parse
void parseResponses(String responseString) {
var r = JSON.decode(responseString);
var r;
try {
r = JSON.decode(responseString);
} catch (e) {
setResponseError(e.message);
}
if (r is Map) {
setResponses([r]);
} else {
@@ -34,7 +39,7 @@ abstract class RequestManager extends Observable {
}
}
void setResponseError(HttpRequest request) {
void setResponseRequestError(HttpRequest request) {
String error = '${request.status} ${request.statusText}';
if (request.status == 0) {
error = 'No service found. Did you run with --enable-vm-service ?';
@@ -45,52 +50,20 @@ abstract class RequestManager extends Observable {
}]);
}
void setResponseError(String message) {
setResponses([{
'type': 'Error',
'text': message
}]);
}
/// Request [requestString] from the VM service. Updates [responses].
/// Will trigger [interceptor] if one is set.
void get(String requestString) {
if (_application.locationManager.isScriptLink) {
// We cache script sources.
String scriptName = _application.locationManager.scriptName;
getScriptSource(scriptName, requestString).then((source) {
if (source != null) {
setResponses([{
'type': 'Script',
'source': source
}]);
} else {
setResponses([{
'type': 'RequestError',
'error': 'Source for $scriptName could not be loaded.'
}]);
}
});
} else {
request(requestString).then((responseString) {
parseResponses(responseString);
}).catchError((e) {
if (e is FormatException) {
setResponseError(e.message);
} else {
setResponseError(e.target);
}
});
}
}
Future<ScriptSource> getScriptSource(String name, String requestString) {
int isolateId = _application.locationManager.currentIsolateId();
Isolate isolate = _application.isolateManager.getIsolate(isolateId);
ScriptSource source = isolate.scripts[name];
if (source != null) {
return new Future.value(source);
}
return request(requestString).then((responseString) {
var r = JSON.decode(responseString);
ScriptSource scriptSource = new ScriptSource(r);
isolate.scripts[name] = scriptSource;
return scriptSource;
request(requestString).then((responseString) {
parseResponses(responseString);
}).catchError((e) {
setResponseError(e.target);
setResponseRequestError(e.target);
return null;
});
}
@@ -0,0 +1,13 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library class_ref_element;
import 'package:polymer/polymer.dart';
import 'service_ref.dart';
@CustomTag('class-ref')
class ClassRefElement extends ServiceRefElement {
ClassRefElement.created() : super.created();
}
@@ -0,0 +1,9 @@
<head>
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="class-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
<script type="application/dart" src="class_ref.dart"></script>
</polymer-element>
@@ -2,7 +2,9 @@
<link rel="import" href="observatory_element.html">
<link rel="import" href="error_view.html">
<link rel="import" href="field_ref.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="library_ref.html">
</head>
<polymer-element name="class-view" extends="observatory-element">
<template>
@@ -13,13 +15,9 @@
class <strong>{{ cls['user_name'] }}</strong>
<template if="{{ cls['super']['type'] != 'Null' }}">
extends
<a href="{{ app.locationManager.currentIsolateClassLink(cls['super']['id'])}}">
{{ cls['super']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls['super'] }}"></class-ref>
</template>
<a class="pull-right" href="{{ app.locationManager.currentIsolateObjectLink(cls['library']['id'])}}">
{{ cls['library']['name'] }}
</a>
<library-ref app="{{ app }}" ref="{{ cls['library'] }}"></library-ref>
</div>
<div class="panel-body">
<table class="table table-hover">
@@ -49,8 +47,8 @@
<table class="table table-hover">
<tbody>
<tr template repeat="{{ field in cls['fields'] }}">
<td><field-ref app="{{ app }}" field="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ field['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -64,8 +62,8 @@
</thead>
<tbody>
<tr template repeat="{{ function in cls['functions'] }}">
<td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['user_name'] }}</a></td>
<td><a href="{{ app.locationManager.currentIsolateObjectLink(function['id'])}}">{{ function['name'] }}</a></td>
<td><function-ref app="{{ app }}" ref="{{ function }}"></function-ref></td>
<td><function-ref app="{{ app }}" ref="{{ function }}" internal></function-ref></td>
</tr>
</tbody>
</table>
@@ -0,0 +1,13 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library code_ref_element;
import 'package:polymer/polymer.dart';
import 'service_ref.dart';
@CustomTag('code-ref')
class CodeRefElement extends ServiceRefElement {
CodeRefElement.created() : super.created();
}
@@ -0,0 +1,9 @@
<head>
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="code-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
<script type="application/dart" src="code_ref.dart"></script>
</polymer-element>
@@ -1,5 +1,6 @@
<head>
<link rel="import" href="disassembly_entry.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="observatory_element.html">
</head>
<polymer-element name="code-view" extends="observatory-element">
@@ -8,9 +9,7 @@
<div class="col-md-8 col-md-offset-2">
<div class="{{ cssPanelClass }}">
<div class="panel-heading">
<a href="{{ app.locationManager.currentIsolateObjectLink(code['function']['id'])}}">
{{ code['function']['user_name'] }} ({{ code['function']['name'] }})
</a>
<function-ref app="{{ app }}" ref="{{ code['function'] }}"></function-ref>
</div>
<div class="panel-body">
<div class="row">
@@ -5,10 +5,9 @@
library field_ref_element;
import 'package:polymer/polymer.dart';
import 'observatory_element.dart';
import 'service_ref.dart';
@CustomTag('field-ref')
class FieldRefElement extends ObservatoryElement {
@published Map field;
class FieldRefElement extends ServiceRefElement {
FieldRefElement.created() : super.created();
}
@@ -1,19 +1,19 @@
<head>
<link rel="import" href="class_ref.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="field-ref" extends="observatory-element">
<polymer-element name="field-ref" extends="service-ref">
<template>
<div>
<template if="{{ field['final'] }}"> final </template>
<template if="{{ field['const'] }}"> const </template>
<template if="{{ (field['declared_type']['name'] == 'dynamic' && !field['final'] && !field['const']) }}">
<template if="{{ ref['final'] }}"> final </template>
<template if="{{ ref['const'] }}"> const </template>
<template if="{{ (ref['declared_type']['name'] == 'dynamic' && !ref['final'] && !ref['const']) }}">
var
</template>
<template if="{{ (field['declared_type']['name'] != 'dynamic') }}">
<a href="{{ app.locationManager.currentIsolateClassLink(field['declared_type']['id']) }}">
{{ field['declared_type']['user_name'] }} </a>
<template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
<class-ref app="{{ app }}" ref="{{ ref['declared_type'] }}"></class-ref>
</template>
<a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">
{{ field['user_name'] }} </a>
<a href="{{ url }}">{{ name }}</a>
</div>
</template> <script type="application/dart" src="field_ref.dart"></script> </polymer-element>
@@ -1,4 +1,5 @@
<head>
<link rel="import" href="class_ref.html">
<link rel="import" href="observatory_element.html">
</head>
<polymer-element name="field-view" extends="observatory-element">
@@ -10,10 +11,8 @@
<template if="{{ field['static'] }}">static</template>
<template if="{{ field['final'] }}">final</template>
<template if="{{ field['const'] }}">const</template>
{{ field['user_name'] }} ({{ field['name'] }})
<a class="pull-right" href="{{ app.locationManager.currentIsolateClassLink(field['class']['id'])}}">
{{ field['class']['user_name'] }}
</a>
{{ field['user_name'] }} ({{ field['name'] }})
<class-ref app="{{ app }}" ref="{{ field['class'] }}"></class-ref>
</div>
<div class="panel-body">
<template if="{{ field['guard_class'] == 'dynamic'}}">
@@ -22,9 +21,9 @@
assigned a single type, performance may improve.
</div>
</template>
<template if="{{ field['guard_class'] != 'dynamic'}}">
<template if="{{ (field['guard_class'] != 'dynamic') && (field['guard_class'] != 'unknown') }}">
<div class="alert alert-success">Field has monomorphic type</div>
<template if="{{ (field['guard_class'] != 'dynamic') &&
<template if="{{ (field['guard_class'] != 'dynamic') &&
field['guard_nullable'] }}">
<div class="alert alert-info">
Field has been assigned null. If a field is never assigned null,
@@ -32,9 +31,7 @@
</div>
</template>
<blockquote>
<a href="{{ app.locationManager.currentIsolateClassLink(field['guard_class']['id'])}}">
{{ field['guard_class']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ field['guard_class'] }}"></class-ref>
</blockquote>
</template>
</div>
@@ -0,0 +1,13 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library function_ref_element;
import 'package:polymer/polymer.dart';
import 'service_ref.dart';
@CustomTag('function-ref')
class FunctionRefElement extends ServiceRefElement {
FunctionRefElement.created() : super.created();
}
@@ -0,0 +1,9 @@
<head>
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="function-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
<script type="application/dart" src="function_ref.dart"></script>
</polymer-element>
@@ -1,4 +1,6 @@
<head>
<link rel="import" href="class_ref.html">
<link rel="import" href="code_ref.html">
<link rel="import" href="observatory_element.html">
</head>
<polymer-element name="function-view" extends="observatory-element">
@@ -7,15 +9,13 @@
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel-heading">
{{ function['user_name'] }} ({{ function['name'] }})
<a class="pull-right" href="{{ app.locationManager.currentIsolateClassLink(function['class']['id'])}}">
{{ function['class']['name'] }}
</a>
{{ function['user_name'] }} ({{ function['name'] }})
<class-ref app="{{ app }}" ref="{{ function['class'] }}"></class-ref>
</div>
<div class="panel-body">
<div>
<a class="btn btn-primary" href="{{ app.locationManager.currentIsolateObjectLink(function['code']['id'])}}">Current Code</a>
<a class="btn btn-info" href="{{ app.locationManager.currentIsolateObjectLink(function['unoptimized_code']['id'])}}">Unoptimized Code</a>
<code-ref app="{{ app }}" ref="{{ function['code'] }}"></code-ref>
<code-ref app="{{ app }}" ref="{{ function['unoptimized_code'] }}"></code-ref>
</div>
<table class="table table-hover">
<tbody>
@@ -5,10 +5,16 @@
library instance_ref_element;
import 'package:polymer/polymer.dart';
import 'observatory_element.dart';
import 'service_ref.dart';
@CustomTag('instance-ref')
class InstanceRefElement extends ObservatoryElement {
@published Map instance;
class InstanceRefElement extends ServiceRefElement {
InstanceRefElement.created() : super.created();
String get name {
if (ref == null) {
return super.name;
}
return ref['preview'];
}
}
@@ -1,16 +1,17 @@
<head>
<link rel="import" href="observatory_element.html">
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="instance-ref" extends="observatory-element">
<polymer-element name="instance-ref" extends="service-ref">
<template>
<div>
<template if="{{ (instance['type'] == 'null') }}">
<template if="{{ (ref['type'] == 'null') }}">
{{ "null" }}
</template>
<template if="{{ (instance['type'] != 'null') }}">
<a href="{{ app.locationManager.currentIsolateObjectLink(instance['id'])}}">
{{ instance['preview'] }}
</a>
<template if="{{ (ref['type'] != 'null') }}">
<a href="{{ url }}">{{ name }} </a>
</template>
</div>
</template> <script type="application/dart" src="instance_ref.dart"></script> </polymer-element>
</template>
<script type="application/dart" src="instance_ref.dart"></script>
</polymer-element>
@@ -1,4 +1,5 @@
<head>
<link rel="import" href="class_ref.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="error_view.html">
<link rel="import" href="field_ref.html">
@@ -8,12 +9,10 @@
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel panel-warning">
<div class="panel-heading">
Instance of
<a href="{{ app.locationManager.currentIsolateClassLink(instance['class']['id'])}}">
{{ instance['class']['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ instance['class'] }}"></class-ref>
</div>
<div class="panel-body">
<template if="{{ instance['error'] == null }}">
@@ -28,8 +27,8 @@
<table class="table table-hover">
<tbody>
<tr template repeat="{{ field in instance['fields'] }}">
<td><field-ref app="{{ app }}" field="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ field['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ field }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ field['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -44,4 +43,3 @@
</template>
<script type="application/dart" src="instance_view.dart"></script>
</polymer-element>
t>
@@ -9,7 +9,7 @@ import 'observatory_element.dart';
@CustomTag('isolate-summary')
class IsolateSummaryElement extends ObservatoryElement {
@published int isolate;
@published String isolate;
@published String name = '';
IsolateSummaryElement.created() : super.created();
@@ -0,0 +1,13 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library library_ref_element;
import 'package:polymer/polymer.dart';
import 'service_ref.dart';
@CustomTag('library-ref')
class LibraryRefElement extends ServiceRefElement {
LibraryRefElement.created() : super.created();
}
@@ -0,0 +1,9 @@
<head>
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="library-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
<script type="application/dart" src="library_ref.dart"></script>
</polymer-element>
@@ -1,7 +1,11 @@
<head>
<link rel="import" href="observatory_element.html">
<link rel="import" href="class_ref.html">
<link rel="import" href="field_ref.html">
<link rel="import" href="function_ref.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="library_ref.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="script_ref.html">
</head>
<polymer-element name="library-view" extends="observatory-element">
<template>
@@ -14,7 +18,7 @@
{{ script['kind'] }}
</td>
<td>
<a href="{{ app.locationManager.currentIsolateScriptLink(script['id'], script['name']) }}">{{ script['name'] }}</a>
<script-ref app="{{ app }}" ref="{{ script }}"></script-ref>
</td>
</tr>
</tbody>
@@ -24,9 +28,7 @@
<tbody>
<tr template repeat="{{ lib in library['libraries'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(lib['id'])}}">
{{ lib['url'] }}
</a>
<library-ref app="{{ app }}" ref="{{ lib }}"></library-ref>
</td>
</tr>
</tbody>
@@ -35,8 +37,8 @@
<table class="table table-hover">
<tbody>
<tr template repeat="{{ variable in library['variables'] }}">
<td><field-ref app="{{ app }}" field="{{ variable }}"></field-ref></td>
<td><instance-ref app="{{ app }}" instance="{{ variable['value'] }}"></instance-ref></td>
<td><field-ref app="{{ app }}" ref="{{ variable }}"></field-ref></td>
<td><instance-ref app="{{ app }}" ref="{{ variable['value'] }}"></instance-ref></td>
</tr>
</tbody>
</table>
@@ -45,9 +47,7 @@
<tbody>
<tr template repeat="{{ func in library['functions'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(func['id'])}}">
{{ func['user_name'] }}
</a>
<function-ref app="{{ app }}" ref="{{ func }}"></function-ref>
</td>
</tr>
</tbody>
@@ -63,14 +63,10 @@
<tbody>
<tr template repeat="{{ cls in library['classes'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['user_name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls }}"></class-ref>
</td>
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['name'] }}
</a>
<class-ref app="{{ app }}" ref="{{ cls }}" internal></class-ref>
</td>
</tr>
</tbody>
@@ -8,10 +8,6 @@
<a class="navbar-brand" href="">Observatory</a>
</div>
<div class="collapse navbar-collapse navbar-ex1-collapse">
<input class="span2 pull-right navbar-form"
placeholder="VM Address"
type="text"
value="{{ app.requestManager.prefix }}">
</div>
</nav>
</template>
@@ -22,6 +22,10 @@ class ObservatoryElement extends PolymerElement {
super.leftView();
}
void attributeChanged(String name, String oldValue, String newValue) {
super.attributeChanged(name, oldValue, newValue);
}
@published ObservatoryApplication app;
bool get applyAuthorStyles => true;
}
@@ -0,0 +1,13 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library script_ref_element;
import 'package:polymer/polymer.dart';
import 'service_ref.dart';
@CustomTag('script-ref')
class ScriptRefElement extends ServiceRefElement {
ScriptRefElement.created() : super.created();
}
@@ -0,0 +1,10 @@
<head>
<link rel="import" href="observatory_element.html">
<link rel="import" href="service_ref.html">
</head>
<polymer-element name="script-ref" extends="service-ref">
<template>
<a href="{{ url }}">{{ name }}</a>
</template>
<script type="application/dart" src="script_ref.dart"></script>
</polymer-element>
@@ -0,0 +1,38 @@
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
library service_ref_element;
import 'package:polymer/polymer.dart';
import 'observatory_element.dart';
@CustomTag('service-ref')
class ServiceRefElement extends ObservatoryElement {
@published Map ref;
@published bool internal = false;
ServiceRefElement.created() : super.created();
void refChanged(oldValue) {
notifyPropertyChange(#url, "", url);
notifyPropertyChange(#name, [], name);
}
String get url {
if ((app != null) && (ref != null)) {
return app.locationManager.currentIsolateRelativeLink(ref['id']);
}
return '';
}
String get name {
if (ref == null) {
return '';
}
String name_key = internal ? 'name' : 'user_name';
if (ref[name_key] != null) {
return ref[name_key];
}
return '';
}
}
@@ -0,0 +1,6 @@
<head>
<link rel="import" href="observatory_element.html">
</head>
<polymer-element name="service-ref" extends="observatory-element">
<script type="application/dart" src="service_ref.dart"></script>
</polymer-element>
@@ -1,5 +1,7 @@
<head>
<link rel="import" href="function_ref.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="script_ref.html">
</head>
<polymer-element name="stack-trace" extends="observatory-element">
<template>
@@ -9,15 +11,15 @@
<tr>
<th>Depth</th>
<th>Function</th>
<th>Url</th>
<th>Script</th>
<th>Line</th>
</tr>
</thead>
<tbody>
<tr template repeat="{{ frame in trace['members'] }}">
<td>{{$index}}</td>
<td><a href="{{app.locationManager.currentIsolateObjectLink(frame['function']['id'])}}">{{ frame['name'] }}</a></td>
<td>{{ frame['url'] }}</td>
<td><function-ref app="{{ app }}" ref="{{ frame['function'] }}"></function-ref></td>
<td><script-ref app="{{ app }}" ref="{{ frame['script'] }}"></script-ref></td>
<td>{{ frame['line'] }}</td>
</tr>
</tbody>
+3 -2
View File
@@ -29,8 +29,9 @@ class RunningIsolates implements MessageRouter {
var result = {};
isolates.forEach((portId, runningIsolate) {
members.add({
'id': portId,
'name': runningIsolate.name
'type': 'Isolate',
'id': 'isolates/$portId',
'name': runningIsolate.name,
});
});
result['type'] = 'IsolateList';