blob: e931ab530e6e3540ec74d2711d718a3f4a6bb760 [file] [log] [blame]
<!DOCTYPE html><html><head><script src="packages/shadow_dom/shadow_dom.debug.js"></script>
<script src="packages/custom_element/custom-elements.debug.js"></script>
<script src="packages/browser/interop.js"></script>
<title>Dart VM Observatory</title>
<meta charset="utf-8">
<link type="text/css" rel="stylesheet" href="bootstrap_css/css/bootstrap.min.css">
<script src="index_devtools.html_bootstrap.dart.js"></script>
</head>
<body><polymer-element name="observatory-element">
</polymer-element><polymer-element name="breakpoint-list" extends="observatory-element">
<template>
<template if="{{ msg['breakpoints'].isEmpty }}">
<div class="panel panel-warning">
<div class="panel-body">No breakpoints</div>
</div>
</template>
<template if="{{ msg['breakpoints'].isNotEmpty }}">
<ul class="list-group">
<template repeat="{{ bpt in msg['breakpoints'] }}">
<li class="list-group-item">
{{ bpt }}
</li>
</template>
</ul>
</template>
</template>
</polymer-element><polymer-element name="error-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-danger">
<div class="panel-heading">Error</div>
<div class="panel-body">
<template if="{{ (error_obj == null) || (error_obj['type'] != 'LanguageError') }}">
<p>{{ error }}</p>
</template>
<template if="{{ (error_obj != null) &amp;&amp; (error_obj['type'] == 'LanguageError') }}">
<pre>{{ error_obj['error_msg'] }}</pre>
</template>
</div>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="field-ref" extends="observatory-element">
<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']) }}">
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>
<a href="{{ app.locationManager.currentIsolateObjectLink(field['id'])}}">
{{ field['user_name'] }} </a>
</div>
</template> </polymer-element><polymer-element name="instance-ref" extends="observatory-element">
<template>
<div>
<template if="{{ (instance['type'] == 'null') }}">
{{ "null" }}
</template>
<template if="{{ (instance['type'] != 'null') }}">
<a href="{{ app.locationManager.currentIsolateObjectLink(instance['id'])}}">
{{ instance['preview'] }}
</a>
</template>
</div>
</template> </polymer-element><polymer-element name="class-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel-heading">
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>
</template>
<a class="pull-right" href="{{ app.locationManager.currentIsolateObjectLink(cls['library']['id'])}}">
{{ cls['library']['name'] }}
</a>
</div>
<div class="panel-body">
<table class="table table-hover">
<tbody>
<tr>
<td>Abstract</td><td>{{ cls['abstract'] }}</td>
</tr>
<tr>
<td>Const</td><td>{{ cls['const'] }}</td>
</tr>
<tr>
<td>Finalized</td><td>{{ cls['const'] }}</td>
</tr>
<tr>
<td>Implemented</td><td>{{ cls['implemented'] }}</td>
</tr>
<tr>
<td>Patch</td><td>{{ cls['patch'] }}</td>
</tr>
<tr>
<td>VM Name</td><td>{{ cls['name'] }}</td>
</tr>
</tbody>
</table>
<template if="{{ cls['error'] == null }}">
<blockquote><strong>Fields</strong></blockquote>
<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>
</tr>
</tbody>
</table>
<blockquote><strong>Functions</strong></blockquote>
<table class="table table-hover">
<thead>
<tr>
<th>User Name</th>
<th>VM Name</th>
</tr>
</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>
</tr>
</tbody>
</table>
</template>
<template if="{{ cls['error'] != null }}">
<error-view error_obj="{{ cls['error'] }}"></error-view>
</template>
</div>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="disassembly-entry" extends="observatory-element">
<template>
<div class="row">
<template if="{{ instruction['type'] == 'DisassembledInstructionComment' }}">
<div class="col-md-2"></div>
<div class="col-md-2"></div>
<div class="col-md-4"><code>{{ instruction['comment'] }}</code></div>
</template>
<template if="{{ instruction['type'] == 'DisassembledInstruction' }}">
<div class="col-md-2"></div>
<div class="col-md-2">{{ instruction['pc'] }}</div>
<div class="col-md-4">
<code>{{ instruction['hex'] }} {{ instruction['human'] }}</code>
</div>
</template>
</div>
</template>
</polymer-element><polymer-element name="code-view" extends="observatory-element">
<template>
<div class="row">
<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>
</div>
<div class="panel-body">
<div class="row">
<div class="col-md-2"><strong>Samples</strong></div>
<div class="col-md-2"><strong>Address</strong></div>
<div><strong>Instruction</strong></div>
</div>
<template repeat="{{ instruction in code['disassembly'] }}">
<disassembly-entry instruction="{{ instruction }}">
</disassembly-entry>
</template>
</div>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="collapsible-content" extends="observatory-element">
<template>
<div class="well row">
<a on-click="toggleDisplay" class="btn muted unselectable">
Raw message... <i class="{{ iconClass }}"></i>
</a>
<div style="display: {{ displayValue }}" class="well">
<content></content>
</div>
</div>
</template>
</polymer-element><polymer-element name="field-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel-heading">
<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>
</div>
<div class="panel-body">
<template if="{{ field['guard_class'] == 'dynamic'}}">
<div class="alert alert-danger">
Field has been assigned multiple types. If a field is only ever
assigned a single type, performance may improve.
</div>
</template>
<template if="{{ field['guard_class'] != 'dynamic'}}">
<div class="alert alert-success">Field has monomorphic type</div>
<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,
performance may improve.
</div>
</template>
<blockquote>
<a href="{{ app.locationManager.currentIsolateClassLink(field['guard_class']['id'])}}">
{{ field['guard_class']['user_name'] }}
</a>
</blockquote>
</template>
</div>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="function-view" extends="observatory-element">
<template>
<div class="row">
<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>
</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>
</div>
<table class="table table-hover">
<tbody>
<tr>
<td>static</td><td>{{ function['is_static'] }}</td>
</tr>
<tr>
<td>Const</td><td>{{ function['is_const'] }}</td>
</tr>
<tr>
<td>Optimizable</td><td>{{ function['is_optimizable'] }}</td>
</tr>
<tr>
<td>Inlinable</td><td>{{ function['is_inlinable'] }}</td>
</tr>
<tr>
<td>Kind</td><td>{{ function['kind'] }}</td>
</tr>
<tr>
<td>Usage Count</td><td>{{ function['usage_counter'] }}</td>
</tr>
<tr>
<td>Optimized Call Site Count</td><td>{{ function['optimized_call_site_count'] }}</td>
</tr>
<tr>
<td>Deoptimizations</td><td>{{ function['deoptimizations'] }}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="isolate-summary" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-1">
<img src="packages/observatory/src/observatory_elements/img/isolate_icon.png" class="img-polaroid">
</div>
<div class="col-md-1">{{ isolate }}</div>
<div class="col-md-10">{{ name }}</div>
</div>
<div class="row">
<div class="col-md-2"></div>
<div class="col-md-1">
<a href="{{ app.locationManager.relativeLink(isolate, 'stacktrace') }}">Stacktrace</a>
</div>
<div class="col-md-1">
<a href="{{ app.locationManager.relativeLink(isolate, 'library') }}">Library</a>
</div>
<div class="col-md-1">
<a href="{{ app.locationManager.relativeLink(isolate, 'debug/breakpoints') }}">Breakpoints</a>
</div>
<div class="col-md-8"></div>
</div>
</template>
</polymer-element><polymer-element name="isolate-list" extends="observatory-element">
<template>
<ul class="list-group">
<template repeat="{{ isolate in app.isolateManager.isolates.values }}">
<li class="list-group-item">
<isolate-summary app="{{ app }}" isolate="{{ isolate.id }}" name="{{ isolate.name }}"></isolate-summary>
</li>
</template>
</ul>
</template>
</polymer-element><polymer-element name="instance-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-warning">
<div class="panel-heading">
Instance of
<a href="{{ app.locationManager.currentIsolateClassLink(instance['class']['id'])}}">
{{ instance['class']['user_name'] }}
</a>
</div>
<div class="panel-body">
<template if="{{ instance['error'] == null }}">
<table class="table table-hover">
<tbody>
<tr>
<td>Preview</td><td>{{ instance['preview'] }}</td>
</tr>
</tbody>
</table>
<blockquote><strong>Fields</strong></blockquote>
<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>
</tr>
</tbody>
</table>
</template>
<template if="{{ instance['error'] != null }}">
<error-view error_obj="{{ instance['error'] }}"></error-view>
</template>
</div>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="json-view" extends="observatory-element">
<template>
<template bind="" if="{{ valueType == 'Primitive' }}">
<span>{{primitiveString}}</span>
</template>
<template bind="" if="{{ valueType == 'List' }}">
<table class="table table-condensed table-bordered">
<caption class="text-left">List, {{list.length}}</caption>
<tbody>
<tr template="" repeat="{{item in list)}}">
<th>{{counter}}</th>
<td><json-view json="{{item}}"></json-view></td>
</tr>
</tbody>
</table>
</template>
<template if="{{ valueType == 'Map' }}">
<table class="table table-condensed table-bordered">
<caption class="text-left">Map, {{keys.length}}</caption>
<tbody>
<tr template="" repeat="{{key in keys}}">
<th>{{key}}</th>
<td><json-view json="{{value(key)}}"></json-view></td>
</tr>
</tbody>
</table>
</template>
</template>
</polymer-element><polymer-element name="library-view" extends="observatory-element">
<template>
<div class="alert alert-success">Library {{ library['name'] }}</div>
<div class="alert alert-info">Scripts</div>
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ script in library['scripts']}}">
<td>
{{ script['kind'] }}
</td>
<td>
<a href="{{ app.locationManager.currentIsolateScriptLink(script['id'], script['name']) }}">{{ script['name'] }}</a>
</td>
</tr>
</tbody>
</table>
<div class="alert alert-info">Imported Libraries</div>
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ lib in library['libraries'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(lib['id'])}}">
{{ lib['url'] }}
</a>
</td>
</tr>
</tbody>
</table>
<div class="alert alert-info">Variables</div>
<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>
</tr>
</tbody>
</table>
<div class="alert alert-info">Functions</div>
<table class="table table-hover">
<tbody>
<tr template="" repeat="{{ func in library['functions'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateObjectLink(func['id'])}}">
{{ func['user_name'] }}
</a>
</td>
</tr>
</tbody>
</table>
<div class="alert alert-info">Classes</div>
<table class="table table-hover">
<thead>
<tr>
<th>Name</th>
<th>Internal Name</th>
</tr>
</thead>
<tbody>
<tr template="" repeat="{{ cls in library['classes'] }}">
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['user_name'] }}
</a>
</td>
<td>
<a href="{{ app.locationManager.currentIsolateClassLink(cls['id']) }}">
{{ cls['name'] }}
</a>
</td>
</tr>
</tbody>
</table>
</template>
</polymer-element><polymer-element name="source-view" extends="observatory-element">
<template>
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel-heading">{{ source.url }}</div>
<div class="panel-body">
<div class="row">
<div><strong>Source</strong></div>
</div>
<pre> <template repeat="{{ line in source.lines }}">{{line.paddedLine}} {{line.src}}
</template>
</pre>
</div>
</div>
</div>
</template>
</polymer-element><polymer-element name="script-view" extends="observatory-element">
<template>
<source-view app="{{ app }}" source="{{ script['source'] }}"></source-view>
</template>
</polymer-element><polymer-element name="stack-trace" extends="observatory-element">
<template>
<div class="alert alert-info">Stack Trace</div>
<table class="table table-hover">
<thead>
<tr>
<th>Depth</th>
<th>Function</th>
<th>Url</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>{{ frame['line'] }}</td>
</tr>
</tbody>
</table>
</template>
</polymer-element><polymer-element name="message-viewer" extends="observatory-element">
<!--
This is a big switch statement which instantiates the custom element
designated to display the message type.
-->
<template>
<!-- If the message type is an IsolateList -->
<template if="{{ messageType == 'IsolateList' }}">
<isolate-list app="{{ app }}"></isolate-list>
</template>
<!-- If the message type is a StackTrace -->
<template if="{{ messageType == 'StackTrace' }}">
<stack-trace app="{{ app }}" trace="{{ message }}"></stack-trace>
</template>
<template if="{{ messageType == 'BreakpointList' }}">
<breakpoint-list app="{{ app }}" msg="{{ message }}"></breakpoint-list>
</template>
<!-- If the message type is a RequestError -->
<template if="{{ messageType == 'RequestError' }}">
<error-view app="{{ app }}" error="{{ message['error'] }}"></error-view>
</template>
<template if="{{ messageType == 'Library' }}">
<library-view app="{{ app }}" library="{{ message }}"></library-view>
</template>
<template if="{{ messageType == 'Class' }}">
<class-view app="{{ app }}" cls="{{ message }}"></class-view>
</template>
<template if="{{ messageType == 'Field' }}">
<field-view app="{{ app }}" field="{{ message }}"></field-view>
</template>
<template if="{{ messageType == 'Instance' }}">
<instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
</template>
<template if="{{ messageType == 'Array' }}">
<instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
</template>
<template if="{{ messageType == 'GrowableObjectArray' }}">
<instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
</template>
<template if="{{ messageType == 'String' }}">
<instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
</template>
<template if="{{ messageType == 'Bool' }}">
<instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
</template>
<template if="{{ messageType == 'Smi' }}">
<instance-view app="{{ app }}" instance="{{ message }}"></instance-view>
</template>
<template if="{{ messageType == 'Function' }}">
<function-view app="{{ app }}" function="{{ message }}"></function-view>
</template>
<template if="{{ messageType == 'Code' }}">
<code-view app="{{ app }}" code="{{ message }}"></code-view>
</template>
<template if="{{ messageType == 'Script' }}">
<script-view app="{{ app }}" script="{{ message }}"></script-view>
</template>
<!-- Add new views and message types in the future here. -->
</template>
</polymer-element><polymer-element name="navigation-bar" extends="observatory-element">
<template>
<nav class="navbar navbar-default" role="navigation">
<div class="navbar-header">
<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>
</polymer-element><polymer-element name="response-viewer" extends="observatory-element">
<template>
<template repeat="{{ message in app.requestManager.responses }}">
<message-viewer app="{{ app }}" message="{{ message }}"></message-viewer>
<collapsible-content>
<!-- <json-view json="{{ message }}"></json-view> -->
</collapsible-content>
</template>
</template>
</polymer-element><polymer-element name="observatory-application" extends="observatory-element">
<template>
<navigation-bar app="{{ app }}"></navigation-bar>
<response-viewer app="{{ app }}"></response-viewer>
</template>
</polymer-element>
<observatory-application devtools="true"></observatory-application>
</body></html>