Give instances their own model class; move DartErrors out of instance-ref into their own error-ref.

BUG=
R=johnmccutchan@google.com

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

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@39682 260f80e4-7a28-3924-810f-c04153c831b5
This commit is contained in:
rmacnak@google.com 2014-08-28 21:56:20 +00:00
parent 40dd4b7607
commit b418a04289
41 changed files with 4294 additions and 3257 deletions

View file

@ -921,50 +921,36 @@ hr {
}
</style>
<span>
<template if="{{ isError(ref) }}">
<pre class="errorBox">{{ ref.message }}</pre>
<template if="{{ ref.isSentinel }}">
<div title="{{ hoverText }}">{{ ref.valueAsString }}</div>
</template>
<template if="{{ isUnexpected(ref) }}">
unexpected reference type &lt;{{ ref.serviceType }}&gt;
<template if="{{ ref.isString || ref.isBool || ref.isInt || ref.isDouble || ref.isNull }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.valueAsString }}</a>
</template>
<template if="{{ isSentinel(ref) }}">
<div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
<template if="{{ ref.isType }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
</template>
<template if="{{ (isString(ref) ||
isBool(ref) ||
isNull(ref) ||
isInt(ref)) ||
isDouble(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['valueAsString'] }}</a>
</template>
<template if="{{ (isType(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['user_name'] }}</a>
</template>
<template if="{{ isInstance(ref) &amp;&amp;
ref['closureFunc'] != null}}">
<template if="{{ ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}">
<!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc'].name }}
{{ ref.closureFunc.name }}
</a>
</template>
<template if="{{ isInstance(ref) &amp;&amp;
ref['closureFunc'] == null}}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
<template if="{{ ref.isInstance &amp;&amp; !ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em></a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ field in ref['fields'] }}">
<template repeat="{{ field in ref.fields }}">
<div class="memberItem">
<div class="memberName">
{{ field['decl']['user_name'] }}
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -972,16 +958,16 @@ hr {
</curly-block>
</template>
<template if="{{ isList(ref) }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
<template if="{{ ref.isList }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em> ({{ ref.length }})</a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ element in ref['elements'] }}">
<template repeat="{{ element in ref.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}"></instance-ref>
</div>
<any-service-ref ref="{{ element['value'] }}">
</any-service-ref></div>
</div>
</template>
</div>
@ -2556,6 +2542,286 @@ hr {
<polymer-element name="error-ref" extends="service-ref">
<template>
<style>
/* Global styles */
* {
margin: 0;
padding: 0;
font: 400 14px 'Montserrat', sans-serif;
color: #333;
box-sizing: border-box;
}
.content {
padding-left: 10%;
font: 400 14px 'Montserrat', sans-serif;
}
.content-centered {
padding-left: 10%;
padding-right: 10%;
font: 400 14px 'Montserrat', sans-serif;
}
.content-centered-big {
padding-left: 5%;
padding-right: 5%;
font: 400 14px 'Montserrat', sans-serif;
}
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
.memberList {
display: table;
}
.memberItem {
display: table-row;
}
.memberName, .memberValue {
display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 14px 'Montserrat', sans-serif;
}
.memberSmall {
display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 12px 'Montserrat', sans-serif;
}
.monospace {
font-family: consolas, courier, monospace;
font-size: 1em;
line-height: 1.2em;
white-space: nowrap;
}
a {
color: #0489c3;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
em {
color: inherit;
font-style: italic;
}
b {
color: inherit;
font-weight: bold;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
height: 0;
box-sizing: content-box;
}
.list-group {
padding-left: 0;
margin-bottom: 20px;
}
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
}
.list-group-item:first-child {
/* rounded top corners */
border-top-right-radius:4px;
border-top-left-radius:4px;
}
.list-group-item:last-child {
margin-bottom: 0;
/* rounded bottom corners */
border-bottom-right-radius: 4px;
border-bottom-left-radius:4px;
}
/* Flex row container */
.flex-row {
display: flex;
flex-direction: row;
}
/* Flex column container */
.flex-column {
display: flex;
flex-direction: column;
}
.flex-item-fit {
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
}
.flex-item-no-shrink {
flex-grow: 0;
flex-shrink: 0;
flex-basis: auto;
}
.flex-item-fill {
flex-grow: 0;
flex-shrink: 1; /* shrink when pressured */
flex-basis: 100%; /* try and take 100% */
}
.flex-item-fixed-1-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 8.3%;
}
.flex-item-fixed-2-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 16.6%;
}
.flex-item-fixed-4-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 33.3333%;
}
.flex-item-fixed-6-12, .flex-item-50-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 50%;
}
.flex-item-fixed-8-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 66.6666%;
}
.flex-item-fixed-9-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 75%;
}
.flex-item-fixed-12-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 100%;
}
.flex-item-10-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 10%;
}
.flex-item-15-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 15%;
}
.flex-item-20-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 20%;
}
.flex-item-30-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 30%;
}
.flex-item-40-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 40%;
}
.flex-item-50-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 50%;
}
.flex-item-60-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 60%;
}
.flex-item-70-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 70%;
}
.flex-item-80-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 80%;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
}
.break-wrap {
word-wrap: break-word;
}
</style>
<style>
.errorBox {
background-color: #f5f5f5;
border: 1px solid #ccc;
padding: 10px;
font-family: consolas, courier, monospace;
font-size: 1em;
line-height: 1.2em;
white-space: pre;
}
</style>
<span>
<pre class="errorBox">{{ ref.kind }}: {{ ref.message }}</pre>
</span>
</template>
</polymer-element>
<polymer-element name="eval-box" extends="observatory-element">
<template>
<style>
@ -2626,7 +2892,7 @@ hr {
<div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
</template>
<template if="{{ result['value'] != null }}">
<instance-ref ref="{{ result['value'] }}"></instance-ref>
<any-service-ref ref="{{ result['value'] }}"></any-service-ref>
</template>
</td>
</tr>
@ -2639,6 +2905,7 @@ hr {
<polymer-element name="eval-link">
<template>
<style>
@ -2659,7 +2926,7 @@ hr {
<span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
</template>
<template if="{{ result != null }}">
= <instance-ref ref="{{ result }}"></instance-ref>
= <any-service-ref ref="{{ result }}"></any-service-ref>
</template>
</template>
</polymer-element>
@ -4235,9 +4502,8 @@ hr {
</div>
<template if="{{ cls.error != null }}">
<!-- TODO(turnidge): Don't use instance-ref for error display here -->
<instance-ref ref="{{ cls.error }}"></instance-ref>
</template>
<error-ref ref="{{ cls.error }}">
</error-ref></template>
<hr>
@ -4253,7 +4519,7 @@ hr {
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>
@ -4296,7 +4562,7 @@ hr {
</template>
<template if="{{ instances != null }}">
sample
<instance-ref ref="{{ instances['sample'] }}"></instance-ref>
<any-service-ref ref="{{ instances['sample'] }}"></any-service-ref>
<template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
<eval-link callback="{{ reachable }}" label="[more]" expr="{{ instances['sampleCount'] * 2 }}">
</eval-link>
@ -4963,7 +5229,7 @@ hr {
<div class="memberItem">
<div class="memberName">Constant object pool</div>
<div class="memberValue">
<instance-ref ref="{{ code.objectPool }}"></instance-ref>
<any-service-ref ref="{{ code.objectPool }}"></any-service-ref>
</div>
</div>
</div>
@ -5647,7 +5913,7 @@ hr {
<div class="memberItem">
<div class="memberName">static value</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -5943,7 +6209,7 @@ hr {
<div class="memberItem">
<div class="memberName">{{ v['name']}}</div>
<div class="memberValue">
<instance-ref ref="{{ v['value'] }}"></instance-ref>
<any-service-ref ref="{{ v['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -14527,44 +14793,43 @@ hr {
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
<!-- TODO(turnidge): Add library nav menu here. -->
<class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
<class-nav-menu cls="{{ instance.clazz }}"></class-nav-menu>
<nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
<nav-control></nav-control>
</nav-bar>
<template if="{{ instance['error'] != null }}">
<template if="{{ instance.isError }}">
<error-view error_obj="{{ instance['error'] }}"></error-view>
</template>
<template if="{{ instance['error'] == null }}">
<template if="{{ !instance.isError }}">
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<template if="{{ isType(instance) }}">
<template if="{{ instance.isType }}">
<h1>type {{ instance.name }}</h1>
</template>
<template if="{{ !isType(instance) }}">
<h1>instance of {{ instance['class'].name }}</h1>
<template if="{{ !instance.isType }}">
<h1>instance of {{ instance.clazz.name }}</h1>
</template>
<div class="memberList">
<div class="memberItem">
<div class="memberName">class</div>
<div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
<class-ref ref="{{ instance.clazz }}">
</class-ref>
</div>
</div>
<template if="{{ instance['valueAsString'] != null }}">
<template if="{{ instance.valueAsString != null }}">
<div class="memberItem">
<div class="memberName">value</div>
<div class="memberValue">{{ instance['valueAsString'] }}</div>
<div class="memberValue">{{ instance.valueAsString }}</div>
</div>
</template>
<div class="memberItem">
<div class="memberItem" title="Space for this object in memory">
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
<div class="memberValue">{{ instance.size | formatSize }}</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
<div class="memberName">retained size</div>
<div class="memberValue">
<template if="{{ retainedBytes == null }}">
@ -14606,7 +14871,7 @@ hr {
</template>
</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Objects which directly reference this object">
<div class="memberName">inbound references</div>
<div class="memberValue">
<template if="{{ inboundReferences == null }}">
@ -14620,20 +14885,20 @@ hr {
</template>
</div>
</div>
<template if="{{ instance['type_class'] != null }}">
<template if="{{ instance.typeClass != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
<div class="memberValue">
<class-ref ref="{{ instance['type_class'] }}">
<class-ref ref="{{ instance.typeClass }}">
</class-ref>
</div>
</div>
</template>
<template if="{{ instance['closureFunc'] != null }}">
<template if="{{ instance.isClosure }}">
<div class="memberItem">
<div class="memberName">closure function</div>
<div class="memberValue">
<function-ref ref="{{ instance['closureFunc'] }}">
<function-ref ref="{{ instance.closureFunc }}">
</function-ref>
</div>
</div>
@ -14653,17 +14918,17 @@ hr {
<hr>
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block expand="{{ instance['fields'].length <= 8 }}">
<template if="{{ instance.fields.isNotEmpty }}">
fields ({{ instance.fields.length }})
<curly-block expand="{{ instance.fields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<template repeat="{{ field in instance.fields }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field['decl'] }}"></field-ref>
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -14671,11 +14936,11 @@ hr {
</curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<template if="{{ instance.nativeFields.isNotEmpty }}">
native fields ({{ instance.nativeFields.length }})
<curly-block expand="{{ instance.nativeFields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<template repeat="{{ field in instance.nativeFields }}">
<div class="memberItem">
<div class="memberName">[{{ field['index']}}]</div>
<div class="memberValue">[{{ field['value']}}]</div>
@ -14685,17 +14950,17 @@ hr {
</curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block expand="{{ instance['elements'].length <= 8 }}">
<template if="{{ instance.elements.isNotEmpty }}">
elements ({{ instance.elements.length }})
<curly-block expand="{{ instance.elements.length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<template repeat="{{ element in instance.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}">
</instance-ref>
</div>
<any-service-ref ref="{{ element['value'] }}">
</any-service-ref></div>
</div>
</template>
</div>
@ -15089,7 +15354,7 @@ hr {
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>

View file

@ -1 +1 @@
{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}

File diff suppressed because one or more lines are too long

View file

@ -921,50 +921,36 @@ hr {
}
</style>
<span>
<template if="{{ isError(ref) }}">
<pre class="errorBox">{{ ref.message }}</pre>
<template if="{{ ref.isSentinel }}">
<div title="{{ hoverText }}">{{ ref.valueAsString }}</div>
</template>
<template if="{{ isUnexpected(ref) }}">
unexpected reference type &lt;{{ ref.serviceType }}&gt;
<template if="{{ ref.isString || ref.isBool || ref.isInt || ref.isDouble || ref.isNull }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.valueAsString }}</a>
</template>
<template if="{{ isSentinel(ref) }}">
<div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
<template if="{{ ref.isType }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
</template>
<template if="{{ (isString(ref) ||
isBool(ref) ||
isNull(ref) ||
isInt(ref)) ||
isDouble(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['valueAsString'] }}</a>
</template>
<template if="{{ (isType(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['user_name'] }}</a>
</template>
<template if="{{ isInstance(ref) &amp;&amp;
ref['closureFunc'] != null}}">
<template if="{{ ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}">
<!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc'].name }}
{{ ref.closureFunc.name }}
</a>
</template>
<template if="{{ isInstance(ref) &amp;&amp;
ref['closureFunc'] == null}}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
<template if="{{ ref.isInstance &amp;&amp; !ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em></a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ field in ref['fields'] }}">
<template repeat="{{ field in ref.fields }}">
<div class="memberItem">
<div class="memberName">
{{ field['decl']['user_name'] }}
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -972,16 +958,16 @@ hr {
</curly-block>
</template>
<template if="{{ isList(ref) }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
<template if="{{ ref.isList }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em> ({{ ref.length }})</a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ element in ref['elements'] }}">
<template repeat="{{ element in ref.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}"></instance-ref>
</div>
<any-service-ref ref="{{ element['value'] }}">
</any-service-ref></div>
</div>
</template>
</div>
@ -2556,6 +2542,286 @@ hr {
<polymer-element name="error-ref" extends="service-ref">
<template>
<style>
/* Global styles */
* {
margin: 0;
padding: 0;
font: 400 14px 'Montserrat', sans-serif;
color: #333;
box-sizing: border-box;
}
.content {
padding-left: 10%;
font: 400 14px 'Montserrat', sans-serif;
}
.content-centered {
padding-left: 10%;
padding-right: 10%;
font: 400 14px 'Montserrat', sans-serif;
}
.content-centered-big {
padding-left: 5%;
padding-right: 5%;
font: 400 14px 'Montserrat', sans-serif;
}
h1 {
font: 400 18px 'Montserrat', sans-serif;
}
.memberList {
display: table;
}
.memberItem {
display: table-row;
}
.memberName, .memberValue {
display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 14px 'Montserrat', sans-serif;
}
.memberSmall {
display: table-cell;
vertical-align: top;
padding: 3px 0 3px 1em;
font: 400 12px 'Montserrat', sans-serif;
}
.monospace {
font-family: consolas, courier, monospace;
font-size: 1em;
line-height: 1.2em;
white-space: nowrap;
}
a {
color: #0489c3;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
em {
color: inherit;
font-style: italic;
}
b {
color: inherit;
font-weight: bold;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
height: 0;
box-sizing: content-box;
}
.list-group {
padding-left: 0;
margin-bottom: 20px;
}
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
}
.list-group-item:first-child {
/* rounded top corners */
border-top-right-radius:4px;
border-top-left-radius:4px;
}
.list-group-item:last-child {
margin-bottom: 0;
/* rounded bottom corners */
border-bottom-right-radius: 4px;
border-bottom-left-radius:4px;
}
/* Flex row container */
.flex-row {
display: flex;
flex-direction: row;
}
/* Flex column container */
.flex-column {
display: flex;
flex-direction: column;
}
.flex-item-fit {
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
}
.flex-item-no-shrink {
flex-grow: 0;
flex-shrink: 0;
flex-basis: auto;
}
.flex-item-fill {
flex-grow: 0;
flex-shrink: 1; /* shrink when pressured */
flex-basis: 100%; /* try and take 100% */
}
.flex-item-fixed-1-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 8.3%;
}
.flex-item-fixed-2-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 16.6%;
}
.flex-item-fixed-4-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 33.3333%;
}
.flex-item-fixed-6-12, .flex-item-50-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 50%;
}
.flex-item-fixed-8-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 66.6666%;
}
.flex-item-fixed-9-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 75%;
}
.flex-item-fixed-12-12 {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 100%;
}
.flex-item-10-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 10%;
}
.flex-item-15-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 15%;
}
.flex-item-20-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 20%;
}
.flex-item-30-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 30%;
}
.flex-item-40-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 40%;
}
.flex-item-50-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 50%;
}
.flex-item-60-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 60%;
}
.flex-item-70-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 70%;
}
.flex-item-80-percent {
flex-grow: 0;
flex-shrink: 0;
flex-basis: 80%;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
box-shadow: inset 0 1px 1px rgba(0,0,0,0.05);
}
.break-wrap {
word-wrap: break-word;
}
</style>
<style>
.errorBox {
background-color: #f5f5f5;
border: 1px solid #ccc;
padding: 10px;
font-family: consolas, courier, monospace;
font-size: 1em;
line-height: 1.2em;
white-space: pre;
}
</style>
<span>
<pre class="errorBox">{{ ref.kind }}: {{ ref.message }}</pre>
</span>
</template>
</polymer-element>
<polymer-element name="eval-box" extends="observatory-element">
<template>
<style>
@ -2626,7 +2892,7 @@ hr {
<div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
</template>
<template if="{{ result['value'] != null }}">
<instance-ref ref="{{ result['value'] }}"></instance-ref>
<any-service-ref ref="{{ result['value'] }}"></any-service-ref>
</template>
</td>
</tr>
@ -2639,6 +2905,7 @@ hr {
<polymer-element name="eval-link">
<template>
<style>
@ -2659,7 +2926,7 @@ hr {
<span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
</template>
<template if="{{ result != null }}">
= <instance-ref ref="{{ result }}"></instance-ref>
= <any-service-ref ref="{{ result }}"></any-service-ref>
</template>
</template>
</polymer-element>
@ -4235,9 +4502,8 @@ hr {
</div>
<template if="{{ cls.error != null }}">
<!-- TODO(turnidge): Don't use instance-ref for error display here -->
<instance-ref ref="{{ cls.error }}"></instance-ref>
</template>
<error-ref ref="{{ cls.error }}">
</error-ref></template>
<hr>
@ -4253,7 +4519,7 @@ hr {
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>
@ -4296,7 +4562,7 @@ hr {
</template>
<template if="{{ instances != null }}">
sample
<instance-ref ref="{{ instances['sample'] }}"></instance-ref>
<any-service-ref ref="{{ instances['sample'] }}"></any-service-ref>
<template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
<eval-link callback="{{ reachable }}" label="[more]" expr="{{ instances['sampleCount'] * 2 }}">
</eval-link>
@ -4963,7 +5229,7 @@ hr {
<div class="memberItem">
<div class="memberName">Constant object pool</div>
<div class="memberValue">
<instance-ref ref="{{ code.objectPool }}"></instance-ref>
<any-service-ref ref="{{ code.objectPool }}"></any-service-ref>
</div>
</div>
</div>
@ -5647,7 +5913,7 @@ hr {
<div class="memberItem">
<div class="memberName">static value</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -5943,7 +6209,7 @@ hr {
<div class="memberItem">
<div class="memberName">{{ v['name']}}</div>
<div class="memberValue">
<instance-ref ref="{{ v['value'] }}"></instance-ref>
<any-service-ref ref="{{ v['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -14527,44 +14793,43 @@ hr {
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
<!-- TODO(turnidge): Add library nav menu here. -->
<class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
<class-nav-menu cls="{{ instance.clazz }}"></class-nav-menu>
<nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
<nav-control></nav-control>
</nav-bar>
<template if="{{ instance['error'] != null }}">
<template if="{{ instance.isError }}">
<error-view error_obj="{{ instance['error'] }}"></error-view>
</template>
<template if="{{ instance['error'] == null }}">
<template if="{{ !instance.isError }}">
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<template if="{{ isType(instance) }}">
<template if="{{ instance.isType }}">
<h1>type {{ instance.name }}</h1>
</template>
<template if="{{ !isType(instance) }}">
<h1>instance of {{ instance['class'].name }}</h1>
<template if="{{ !instance.isType }}">
<h1>instance of {{ instance.clazz.name }}</h1>
</template>
<div class="memberList">
<div class="memberItem">
<div class="memberName">class</div>
<div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
<class-ref ref="{{ instance.clazz }}">
</class-ref>
</div>
</div>
<template if="{{ instance['valueAsString'] != null }}">
<template if="{{ instance.valueAsString != null }}">
<div class="memberItem">
<div class="memberName">value</div>
<div class="memberValue">{{ instance['valueAsString'] }}</div>
<div class="memberValue">{{ instance.valueAsString }}</div>
</div>
</template>
<div class="memberItem">
<div class="memberItem" title="Space for this object in memory">
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
<div class="memberValue">{{ instance.size | formatSize }}</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
<div class="memberName">retained size</div>
<div class="memberValue">
<template if="{{ retainedBytes == null }}">
@ -14606,7 +14871,7 @@ hr {
</template>
</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Objects which directly reference this object">
<div class="memberName">inbound references</div>
<div class="memberValue">
<template if="{{ inboundReferences == null }}">
@ -14620,20 +14885,20 @@ hr {
</template>
</div>
</div>
<template if="{{ instance['type_class'] != null }}">
<template if="{{ instance.typeClass != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
<div class="memberValue">
<class-ref ref="{{ instance['type_class'] }}">
<class-ref ref="{{ instance.typeClass }}">
</class-ref>
</div>
</div>
</template>
<template if="{{ instance['closureFunc'] != null }}">
<template if="{{ instance.isClosure }}">
<div class="memberItem">
<div class="memberName">closure function</div>
<div class="memberValue">
<function-ref ref="{{ instance['closureFunc'] }}">
<function-ref ref="{{ instance.closureFunc }}">
</function-ref>
</div>
</div>
@ -14653,17 +14918,17 @@ hr {
<hr>
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block expand="{{ instance['fields'].length <= 8 }}">
<template if="{{ instance.fields.isNotEmpty }}">
fields ({{ instance.fields.length }})
<curly-block expand="{{ instance.fields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<template repeat="{{ field in instance.fields }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field['decl'] }}"></field-ref>
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -14671,11 +14936,11 @@ hr {
</curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<template if="{{ instance.nativeFields.isNotEmpty }}">
native fields ({{ instance.nativeFields.length }})
<curly-block expand="{{ instance.nativeFields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<template repeat="{{ field in instance.nativeFields }}">
<div class="memberItem">
<div class="memberName">[{{ field['index']}}]</div>
<div class="memberValue">[{{ field['value']}}]</div>
@ -14685,17 +14950,17 @@ hr {
</curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block expand="{{ instance['elements'].length <= 8 }}">
<template if="{{ instance.elements.isNotEmpty }}">
elements ({{ instance.elements.length }})
<curly-block expand="{{ instance.elements.length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<template repeat="{{ element in instance.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}">
</instance-ref>
</div>
<any-service-ref ref="{{ element['value'] }}">
</any-service-ref></div>
</div>
</template>
</div>
@ -15089,7 +15354,7 @@ hr {
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>

View file

@ -1 +1 @@
{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}
{"experimental_bootstrap":false,"script_ids":[["observatory","lib/src/elements/curly_block.dart"],["observatory","lib/src/elements/observatory_element.dart"],["observatory","lib/src/elements/service_ref.dart"],["observatory","lib/src/elements/instance_ref.dart"],["observatory","lib/src/elements/action_link.dart"],["observatory","lib/src/elements/nav_bar.dart"],["observatory","lib/src/elements/breakpoint_list.dart"],["observatory","lib/src/elements/class_ref.dart"],["observatory","lib/src/elements/class_tree.dart"],["observatory","lib/src/elements/error_ref.dart"],["observatory","lib/src/elements/eval_box.dart"],["observatory","lib/src/elements/eval_link.dart"],["observatory","lib/src/elements/field_ref.dart"],["observatory","lib/src/elements/function_ref.dart"],["observatory","lib/src/elements/library_ref.dart"],["observatory","lib/src/elements/script_inset.dart"],["observatory","lib/src/elements/script_ref.dart"],["observatory","lib/src/elements/class_view.dart"],["observatory","lib/src/elements/code_ref.dart"],["observatory","lib/src/elements/code_view.dart"],["observatory","lib/src/elements/error_view.dart"],["observatory","lib/src/elements/field_view.dart"],["observatory","lib/src/elements/stack_frame.dart"],["observatory","lib/src/elements/flag_list.dart"],["observatory","lib/src/elements/function_view.dart"],["observatory","lib/src/elements/heap_map.dart"],["observatory","lib/src/elements/io_view.dart"],["observatory","lib/src/elements/isolate_ref.dart"],["observatory","lib/src/elements/isolate_summary.dart"],["observatory","lib/src/elements/isolate_view.dart"],["observatory","lib/src/elements/inbound_reference.dart"],["observatory","lib/src/elements/instance_view.dart"],["observatory","lib/src/elements/json_view.dart"],["observatory","lib/src/elements/library_view.dart"],["observatory","lib/src/elements/metrics.dart"],["observatory","lib/src/elements/heap_profile.dart"],["observatory","lib/src/elements/sliding_checkbox.dart"],["observatory","lib/src/elements/isolate_profile.dart"],["observatory","lib/src/elements/script_view.dart"],["observatory","lib/src/elements/stack_trace.dart"],["observatory","lib/src/elements/vm_view.dart"],["observatory","lib/src/elements/service_view.dart"],["observatory","lib/src/elements/observatory_application.dart"],["observatory","lib/src/elements/service_exception_view.dart"],["observatory","lib/src/elements/service_error_view.dart"],["observatory","lib/src/elements/vm_connect.dart"],["observatory","lib/src/elements/vm_ref.dart"],["observatory","web/main.dart"]]}

File diff suppressed because one or more lines are too long

View file

@ -92,8 +92,7 @@
</div>
<template if="{{ cls.error != null }}">
<!-- TODO(turnidge): Don't use instance-ref for error display here -->
<instance-ref ref="{{ cls.error }}"></instance-ref>
<error-ref ref="{{ cls.error }}"></error>
</template>
<hr>
@ -110,7 +109,7 @@
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>
@ -155,7 +154,7 @@
</template>
<template if="{{ instances != null }}">
sample
<instance-ref ref="{{ instances['sample'] }}"></instance-ref>
<any-service-ref ref="{{ instances['sample'] }}"></any-service-ref>
<template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
<eval-link callback="{{ reachable }}"
label="[more]"

View file

@ -97,7 +97,7 @@
<div class="memberItem">
<div class="memberName">Constant object pool</div>
<div class="memberValue">
<instance-ref ref="{{ code.objectPool }}"></instance-ref>
<any-service-ref ref="{{ code.objectPool }}"></any-service-ref>
</div>
</div>
</div>

View file

@ -0,0 +1,26 @@
<link rel="import" href="../../../../packages/polymer/polymer.html">
<link rel="import" href="curly_block.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="service_ref.html">
<polymer-element name="error-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="css/shared.css">
<style>
.errorBox {
background-color: #f5f5f5;
border: 1px solid #ccc;
padding: 10px;
font-family: consolas, courier, monospace;
font-size: 1em;
line-height: 1.2em;
white-space: pre;
}
</style>
<span>
<pre class="errorBox">{{ ref.kind }}: {{ ref.message }}</pre>
</span>
</template>
</polymer-element>
<script type="application/dart" src="error_ref.dart"></script>

View file

@ -1,5 +1,6 @@
<link rel="import" href="../../../../packages/polymer/polymer.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="error_ref.html">
<link rel="import" href="observatory_element.html">
<polymer-element name="eval-box" extends="observatory-element">
@ -74,7 +75,7 @@
<div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
</template>
<template if="{{ result['value'] != null }}">
<instance-ref ref="{{ result['value'] }}"></instance-ref>
<any-service-ref ref="{{ result['value'] }}"></any-service-ref>
</template>
</td>
</tr>

View file

@ -1,5 +1,6 @@
<link rel="import" href="../../../../packages/polymer/polymer.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="error_ref.html">
<polymer-element name="eval-link">
<template>
@ -21,7 +22,7 @@
<span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
</template>
<template if="{{ result != null }}">
= <instance-ref ref="{{ result }}"></instance-ref>
= <any-service-ref ref="{{ result }}"></any-service-ref>
</template>
</template>
</polymer-element>

View file

@ -84,7 +84,7 @@
<div class="memberItem">
<div class="memberName">static value</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>

View file

@ -18,50 +18,36 @@
}
</style>
<span>
<template if="{{ isError(ref) }}">
<pre class="errorBox">{{ ref.message }}</pre>
<template if="{{ ref.isSentinel }}">
<div title="{{ hoverText }}">{{ ref.valueAsString }}</div>
</template>
<template if="{{ isUnexpected(ref) }}">
unexpected reference type &lt;{{ ref.serviceType }}&gt;
<template if="{{ ref.isString || ref.isBool || ref.isInt || ref.isDouble || ref.isNull }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.valueAsString }}</a>
</template>
<template if="{{ isSentinel(ref) }}">
<div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
<template if="{{ ref.isType }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
</template>
<template if="{{ (isString(ref) ||
isBool(ref) ||
isNull(ref) ||
isInt(ref)) ||
isDouble(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['valueAsString'] }}</a>
</template>
<template if="{{ (isType(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['user_name'] }}</a>
</template>
<template if="{{ isInstance(ref) &&
ref['closureFunc'] != null}}">
<template if="{{ ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}">
<!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc'].name }}
{{ ref.closureFunc.name }}
</a>
</template>
<template if="{{ isInstance(ref) &&
ref['closureFunc'] == null}}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
<template if="{{ ref.isInstance && !ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em></a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ field in ref['fields'] }}">
<template repeat="{{ field in ref.fields }}">
<div class="memberItem">
<div class="memberName">
{{ field['decl']['user_name'] }}
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -69,15 +55,15 @@
</curly-block>
</template>
<template if="{{ isList(ref) }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
<template if="{{ ref.isList }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em> ({{ ref.length }})</a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ element in ref['elements'] }}">
<template repeat="{{ element in ref.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}"></instance-ref>
<any-service-ref ref="{{ element['value'] }}"></instance-ref>
</div>
</div>
</template>

View file

@ -17,44 +17,43 @@
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
<!-- TODO(turnidge): Add library nav menu here. -->
<class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
<class-nav-menu cls="{{ instance.clazz }}"></class-nav-menu>
<nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
<nav-control></nav-control>
</nav-bar>
<template if="{{ instance['error'] != null }}">
<template if="{{ instance.isError }}">
<error-view error_obj="{{ instance['error'] }}"></error-view>
</template>
<template if="{{ instance['error'] == null }}">
<template if="{{ !instance.isError }}">
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<template if="{{ isType(instance) }}">
<template if="{{ instance.isType }}">
<h1>type {{ instance.name }}</h1>
</template>
<template if="{{ !isType(instance) }}">
<h1>instance of {{ instance['class'].name }}</h1>
<template if="{{ !instance.isType }}">
<h1>instance of {{ instance.clazz.name }}</h1>
</template>
<div class="memberList">
<div class="memberItem">
<div class="memberName">class</div>
<div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
<class-ref ref="{{ instance.clazz }}">
</class-ref>
</div>
</div>
<template if="{{ instance['valueAsString'] != null }}">
<template if="{{ instance.valueAsString != null }}">
<div class="memberItem">
<div class="memberName">value</div>
<div class="memberValue">{{ instance['valueAsString'] }}</div>
<div class="memberValue">{{ instance.valueAsString }}</div>
</div>
</template>
<div class="memberItem">
<div class="memberItem" title="Space for this object in memory">
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
<div class="memberValue">{{ instance.size | formatSize }}</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
<div class="memberName">retained size</div>
<div class="memberValue">
<template if="{{ retainedBytes == null }}">
@ -102,7 +101,7 @@
</template>
</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Objects which directly reference this object">
<div class="memberName">inbound references</div>
<div class="memberValue">
<template if="{{ inboundReferences == null }}">
@ -118,20 +117,20 @@
</template>
</div>
</div>
<template if="{{ instance['type_class'] != null }}">
<template if="{{ instance.typeClass != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
<div class="memberValue">
<class-ref ref="{{ instance['type_class'] }}">
<class-ref ref="{{ instance.typeClass }}">
</class-ref>
</div>
</div>
</template>
<template if="{{ instance['closureFunc'] != null }}">
<template if="{{ instance.isClosure }}">
<div class="memberItem">
<div class="memberName">closure function</div>
<div class="memberValue">
<function-ref ref="{{ instance['closureFunc'] }}">
<function-ref ref="{{ instance.closureFunc }}">
</function-ref>
</div>
</div>
@ -151,17 +150,17 @@
<hr>
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block expand="{{ instance['fields'].length <= 8 }}">
<template if="{{ instance.fields.isNotEmpty }}">
fields ({{ instance.fields.length }})
<curly-block expand="{{ instance.fields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<template repeat="{{ field in instance.fields }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field['decl'] }}"></field-ref>
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -169,11 +168,11 @@
</curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<template if="{{ instance.nativeFields.isNotEmpty }}">
native fields ({{ instance.nativeFields.length }})
<curly-block expand="{{ instance.nativeFields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<template repeat="{{ field in instance.nativeFields }}">
<div class="memberItem">
<div class="memberName">[{{ field['index']}}]</div>
<div class="memberValue">[{{ field['value']}}]</div>
@ -183,15 +182,15 @@
</curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block expand="{{ instance['elements'].length <= 8 }}">
<template if="{{ instance.elements.isNotEmpty }}">
elements ({{ instance.elements.length }})
<curly-block expand="{{ instance.elements.length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<template repeat="{{ element in instance.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}">
<any-service-ref ref="{{ element['value'] }}">
</instance-ref>
</div>
</div>

View file

@ -104,7 +104,7 @@
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>

View file

@ -26,7 +26,7 @@
<div class="memberItem">
<div class="memberName">{{ v['name']}}</div>
<div class="memberValue">
<instance-ref ref="{{ v['value'] }}"></instance-ref>
<any-service-ref ref="{{ v['value'] }}"></any-service-ref>
</div>
</div>
</template>

View file

@ -33,12 +33,7 @@
/// discovered in the HTML document.
(function() {
// Only run in Dartium.
if (!navigator.dartEnabled &&
// TODO(sigmund): remove userAgent check once 1.6 rolls as stable.
// See: dartbug.com/18463
(navigator.userAgent.indexOf('(Dart)') === -1)) {
return;
}
if (navigator.userAgent.indexOf('(Dart)') === -1) return;
// Extract a Dart import URL from a script tag, which is the 'src' attribute
// of the script tag, or a data-url with the script contents for inlined code.

View file

@ -1,34 +1,37 @@
BUILD LOG
---------
Build Time: 2014-08-12T15:26:59
Build Time: 2014-07-24T17:50:13
NODEJS INFORMATION
==================
nodejs: v0.10.29
nodejs: v0.10.21
chai: 1.9.1
grunt: 0.4.5
grunt-audit: 0.0.3
grunt: 0.4.5
grunt-concat-sourcemap: 0.4.3
grunt-contrib-concat: 0.5.0
grunt-contrib-uglify: 0.4.1
grunt-contrib-yuidoc: 0.5.2
grunt-contrib-concat: 0.4.0
grunt-contrib-uglify: 0.4.0
grunt-karma: 0.8.3
grunt-contrib-yuidoc: 0.5.2
grunt-string-replace: 0.2.7
karma: 0.12.21
karma: 0.12.17
karma-crbot-reporter: 0.0.4
karma-firefox-launcher: 0.1.3
karma-ie-launcher: 0.1.5
karma-mocha: 0.1.7
karma-mocha: 0.1.6
karma-safari-launcher: 0.1.1
karma-script-launcher: 0.1.0
mocha: 1.21.4
mocha: 1.20.1
REPO REVISIONS
==============
polymer-expressions: 92f860ef9ff871e4b51fc5da38b2b76ba13ebdbe
polymer-gestures: a21142376f0c8a9541a2919d3f77ca557d13afe9
polymer-dev: 5d00e4b0252e443e2ed6d5c4a04a568e72ef3b25
polymer-expressions: 20247f68f0bc401cbca852fb3cfbdf12ec95a135
polymer-gestures: 1353a3aadee345e3e4cd35f9788d02595a27cb30
polymer-dev:
(0.3.4) 6a3e1b0e2a0bbe546f6896b3f4f064950d7aee8f
(with patch for CSP issue) 370b65fa23d6bb283923b10a0b9078863f5e9676
BUILD HASHES
============
build/polymer.js: 23408455239101d17426ef7448361730103cb2cf
build/polymer.js: ebbc1241930fb9a1bd7d216b0e3510dc1d5963da
(without patch, it would be 3e0477c0b09f5800e359044f3358fd1edc6f8449)

View file

@ -0,0 +1,31 @@
// Copyright (c) 2011, 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.
/**
* Coverage controller logic - used by coverage test harness to embed tests in
* content shell and extract coverage information.
*/
var LONG_LINE = 60000;
function onReceive(e) {
if (e.data == 'unittest-suite-done') {
var s = JSON.stringify(top._$jscoverage);
var res = '';
// conent shell has a bug on lines longer than 2^16, so we split them
while (s.length > LONG_LINE) {
res += s.substr(0, LONG_LINE) + '<br>\n';
s = s.substr(LONG_LINE);
}
res += s;
window.document.body.innerHTML = res;
window.layoutTestController.notifyDone();
}
}
if (window.layoutTestController) {
window.layoutTestController.dumpAsText();
window.layoutTestController.waitUntilDone();
window.addEventListener("message", onReceive, false);
}

View file

@ -0,0 +1,233 @@
// Copyright (c) 2011, 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.
/**
* Test controller logic - used by unit test harness to embed tests in
* conent shell.
*/
// Clear the console before every test run - this is Firebug specific code.
if (typeof console == "object" && typeof console.clear == "function") {
console.clear();
}
// Some tests may expect and have no way to suppress global errors.
var testExpectsGlobalError = false;
var testSuppressedGlobalErrors = [];
// Set window onerror to make sure that we catch test harness errors across all
// browsers.
window.onerror = function (message, url, lineNumber) {
if (testExpectsGlobalError) {
testSuppressedGlobalErrors.push({
message: message
});
return;
}
if (url) {
showErrorAndExit(
"\n\n" + url + ":" + lineNumber + ":\n" + message + "\n\n");
} else {
showErrorAndExit(message);
}
window.postMessage('unittest-suite-external-error', '*');
};
// Start Dartium/content_shell, unless we are waiting for HTML Imports to load.
// HTML Imports allows a document to link to other HTMLs documents via
// <link rel=import>. It also allows for those other documents to contain
// <script> tags, which must be run before scripts on the main page.
// We have package:web_components to polyfill this feature, and it will handle
// starting Dartium/content_shell in that case. HTML Imports is used by Polymer,
// but it could be used by itself too. See the specification:
// https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html
if (navigator.webkitStartDart && !window.HTMLImports) {
navigator.webkitStartDart();
}
// testRunner is provided by content shell.
// It is not available in browser tests.
var testRunner = window.testRunner || window.layoutTestController;
var waitForDone = false;
// Returns the driving window object if available
function getDriverWindow() {
if (window != window.parent) {
// We're running in an iframe.
return window.parent;
} else if (window.opener) {
// We were opened by another window.
return window.opener;
}
return null;
}
function notifyStart() {
var driver = getDriverWindow();
if (driver) {
driver.postMessage("STARTING", "*");
}
}
// We call notifyStart here to notify the encapsulating browser.
notifyStart();
function notifyDone() {
if (testRunner) testRunner.notifyDone();
// TODO(ricow): REMOVE, debug info, see issue 13292
if (!testRunner) {
printMessage('Calling notifyDone()');
}
// To support in browser launching of tests we post back start and result
// messages to the window.opener.
var driver = getDriverWindow();
if (driver) {
driver.postMessage(window.document.body.innerHTML, "*");
}
}
function processMessage(msg) {
if (typeof msg != 'string') return;
// TODO(ricow): REMOVE, debug info, see issue 13292
if (!testRunner) {
// Filter out ShadowDOM polyfill messages which are random floats.
if (msg != parseFloat(msg)) {
printMessage('processMessage(): ' + msg);
}
}
if (msg == 'unittest-suite-done') {
notifyDone();
} else if (msg == 'unittest-suite-wait-for-done') {
waitForDone = true;
if (testRunner) {
testRunner.startedDartTest = true;
}
} else if (msg == 'dart-calling-main') {
if (testRunner) {
testRunner.startedDartTest = true;
}
} else if (msg == 'dart-main-done') {
if (!waitForDone) {
printMessage('PASS');
notifyDone();
}
} else if (msg == 'unittest-suite-success') {
printMessage('PASS');
notifyDone();
} else if (msg == 'unittest-suite-fail') {
showErrorAndExit('Some tests failed.');
}
}
function onReceive(e) {
processMessage(e.data);
}
if (testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
window.addEventListener("message", onReceive, false);
function showErrorAndExit(message) {
if (message) {
printMessage('Error: ' + String(message));
}
// dart/tools/testing/test_runner.dart is looking for either PASS or
// FAIL in a browser test's output.
printMessage('FAIL');
notifyDone();
}
function onLoad(e) {
// needed for dartium compilation errors.
if (window.compilationError) {
showErrorAndExit(window.compilationError);
}
}
window.addEventListener("DOMContentLoaded", onLoad, false);
// Note: before renaming this function, note that it is also included in an
// inlined error handler in the HTML files that wrap DRT tests.
// See: tools/testing/dart/browser_test.dart
function externalError(e) {
// needed for dartium compilation errors.
showErrorAndExit(e && e.message);
window.postMessage('unittest-suite-external-error', '*');
}
document.addEventListener('readystatechange', function () {
if (document.readyState != "loaded") return;
// If 'startedDartTest' is not set, that means that the test did not have
// a chance to load. This will happen when a load error occurs in the VM.
// Give the machine time to start up.
setTimeout(function() {
// A window.postMessage might have been enqueued after this timeout.
// Just sleep another time to give the browser the time to process the
// posted message.
setTimeout(function() {
if (testRunner && !testRunner.startedDartTest) {
notifyDone();
}
}, 0);
}, 50);
});
// dart2js will generate code to call this function to handle the Dart
// [print] method.
//
// dartium will invoke this method for [print] calls if the environment variable
// "DART_FORWARDING_PRINT" was set when launching dartium.
//
// Our tests will be wrapped, so we can detect when [main] is called and when
// it has ended.
// The wrapping happens either via "dartMainRunner" (for dart2js) or wrapped
// tests for dartium.
//
// The following messages are handled specially:
// dart-calling-main: signals that the dart [main] function will be invoked
// dart-main-done: signals that the dart [main] function has finished
// unittest-suite-wait-for-done: signals the start of an asynchronous test
// unittest-suite-success: signals the end of an asynchrounous test
//
// These messages are used to communicate with the test and will be posted so
// [processMessage] above can see it.
function dartPrint(msg) {
if ((msg === 'unittest-suite-success')
|| (msg === 'unittest-suite-done')
|| (msg === 'unittest-suite-wait-for-done')
|| (msg === 'dart-calling-main')
|| (msg === 'dart-main-done')) {
window.postMessage(msg, '*');
return;
}
printMessage(msg);
}
// Prints 'msg' to the console (if available) and to the body of the html
// document.
function printMessage(msg) {
if (typeof console === 'object') console.warn(msg);
var pre = document.createElement('pre');
pre.appendChild(document.createTextNode(String(msg)));
document.body.appendChild(pre);
document.body.appendChild(document.createTextNode('\n'));
}
// dart2js will generate code to call this function instead of calling
// Dart [main] directly. The argument is a closure that invokes main.
function dartMainRunner(main) {
dartPrint('dart-calling-main');
try {
main();
} catch (e) {
dartPrint(e);
if (e.stack) dartPrint(e.stack);
window.postMessage('unittest-suite-fail', '*');
return;
}
dartPrint('dart-main-done');
}

View file

@ -1,36 +1,45 @@
BUILD LOG
---------
Build Time: 2014-08-25T14:50:58
Build Time: 2014-07-24T18:04:50
NODEJS INFORMATION
==================
nodejs: v0.10.29
chai: 1.9.1
grunt: 0.4.5
grunt-audit: 0.0.3
grunt-concat-sourcemap: 0.4.3
grunt-contrib-concat: 0.4.0
grunt-contrib-uglify: 0.5.1
grunt-karma: 0.8.3
karma: 0.12.22
nodejs: v0.10.21
chai: 1.9.0
grunt: 0.4.2
grunt-audit: 0.0.2
grunt-concat-sourcemap: 0.4.1
grunt-contrib-concat: 0.3.0
grunt-contrib-uglify: 0.3.2
grunt-contrib-yuidoc: 0.5.1
grunt-karma: 0.6.2
karma: 0.10.9
karma-chrome-launcher: 0.1.2
karma-coffee-preprocessor: 0.1.3
karma-crbot-reporter: 0.0.4
karma-firefox-launcher: 0.1.3
karma-ie-launcher: 0.1.5
karma-mocha: 0.1.9
karma-html2js-preprocessor: 0.1.0
karma-ie-launcher: 0.1.1
karma-jasmine: 0.1.5
karma-mocha: 0.1.1
karma-phantomjs-launcher: 0.1.2
karma-requirejs: 0.2.1
karma-safari-launcher: 0.1.1
mocha: 1.21.4
karma-script-launcher: 0.1.0
mocha: 1.17.1
requirejs: 2.1.11
REPO REVISIONS
==============
CustomElements: 65bb151f33891864b28eee305bdf299653ef351c
HTMLImports: 0d3133d19b35d899ef3e33fbd65ad62e0571d1d5
NodeBind: f41e84f3deb2cad22eef89ded1072060f7b1b183
ShadowDOM: 57232dc6d07dd921009679dfbab622b52174df80
TemplateBinding: f15094216a6b3f64a6d6b0f017b6bd7576b8b44e
WeakMap: 6662df5cb7146707238b08e7a65cf70056ae516a
observe-js: ca7b6ba385006f200c7ec3537c7730710e428c60
platform-dev: fe549bc7f05ec668bc496108958eaee0bd174a06
CustomElements: 2df917e8b1fb1928651a71372ae901a400ddf726
HTMLImports: d240c62fe5b784239f08f77eff40efb4aabf0105
NodeBind: 9f0089946c312d9ac9ca45d06913fce507a8b185
ShadowDOM: 86943c29aa8a10da214bc2f42e3067cf0f190279
TemplateBinding: d9f4543dc06935824bfd43564c442b0897ce1c54
WeakMap: 43ab1056a0d821af9b6028fc27ddf30db817c05a
observe-js: e212e7473962067c099a3d1859595c2f8baa36d7
platform-dev: 02a0f66b65c34585b4b986e6a3a73cc0d743683a
BUILD HASHES
============
build/platform.js: e5a0b4192fb91750c708270b7267d81c972e5bdd
build/platform.js: 9ca6c8137fefb7461693d8ec7bac2af8d5a4fd1a

File diff suppressed because one or more lines are too long

View file

@ -92,8 +92,7 @@
</div>
<template if="{{ cls.error != null }}">
<!-- TODO(turnidge): Don't use instance-ref for error display here -->
<instance-ref ref="{{ cls.error }}"></instance-ref>
<error-ref ref="{{ cls.error }}"></error>
</template>
<hr>
@ -110,7 +109,7 @@
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>
@ -155,7 +154,7 @@
</template>
<template if="{{ instances != null }}">
sample
<instance-ref ref="{{ instances['sample'] }}"></instance-ref>
<any-service-ref ref="{{ instances['sample'] }}"></any-service-ref>
<template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
<eval-link callback="{{ reachable }}"
label="[more]"

View file

@ -97,7 +97,7 @@
<div class="memberItem">
<div class="memberName">Constant object pool</div>
<div class="memberValue">
<instance-ref ref="{{ code.objectPool }}"></instance-ref>
<any-service-ref ref="{{ code.objectPool }}"></any-service-ref>
</div>
</div>
</div>

View file

@ -0,0 +1,14 @@
// Copyright (c) 2014, 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 error_ref_element;
import 'package:polymer/polymer.dart';
import 'package:observatory/service.dart';
import 'service_ref.dart';
@CustomTag('error-ref')
class ErrorRefElement extends ServiceRefElement {
ErrorRefElement.created() : super.created();
}

View file

@ -0,0 +1,26 @@
<link rel="import" href="../../../../packages/polymer/polymer.html">
<link rel="import" href="curly_block.html">
<link rel="import" href="observatory_element.html">
<link rel="import" href="service_ref.html">
<polymer-element name="error-ref" extends="service-ref">
<template>
<link rel="stylesheet" href="css/shared.css">
<style>
.errorBox {
background-color: #f5f5f5;
border: 1px solid #ccc;
padding: 10px;
font-family: consolas, courier, monospace;
font-size: 1em;
line-height: 1.2em;
white-space: pre;
}
</style>
<span>
<pre class="errorBox">{{ ref.kind }}: {{ ref.message }}</pre>
</span>
</template>
</polymer-element>
<script type="application/dart" src="error_ref.dart"></script>

View file

@ -11,7 +11,7 @@ import 'package:observatory/service.dart';
/// Displays an Error ServiceObject.
@CustomTag('error-view')
class ErrorViewElement extends ObservatoryElement {
@published ServiceObject error;
@published DartError error;
ErrorViewElement.created() : super.created();
}

View file

@ -1,5 +1,6 @@
<link rel="import" href="../../../../packages/polymer/polymer.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="error_ref.html">
<link rel="import" href="observatory_element.html">
<polymer-element name="eval-box" extends="observatory-element">
@ -74,7 +75,7 @@
<div style="color:#aaa;cursor:wait;">&lt;pending&gt;</div>
</template>
<template if="{{ result['value'] != null }}">
<instance-ref ref="{{ result['value'] }}"></instance-ref>
<any-service-ref ref="{{ result['value'] }}"></any-service-ref>
</template>
</td>
</tr>

View file

@ -1,5 +1,6 @@
<link rel="import" href="../../../../packages/polymer/polymer.html">
<link rel="import" href="instance_ref.html">
<link rel="import" href="error_ref.html">
<polymer-element name="eval-link">
<template>
@ -21,7 +22,7 @@
<span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
</template>
<template if="{{ result != null }}">
= <instance-ref ref="{{ result }}"></instance-ref>
= <any-service-ref ref="{{ result }}"></any-service-ref>
</template>
</template>
</polymer-element>

View file

@ -84,7 +84,7 @@
<div class="memberItem">
<div class="memberName">static value</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>

View file

@ -11,6 +11,7 @@ import 'service_ref.dart';
@CustomTag('inbound-reference')
class InboundReferenceElement extends ServiceRefElement {
@published ObservableMap ref;
InboundReferenceElement.created() : super.created();
dynamic get slot => (ref as ServiceMap)['slot'];
@ -40,9 +41,7 @@ class InboundReferenceElement extends ServiceRefElement {
notifyPropertyChange(#ref, 0, 1);
}).whenComplete(done);
} else {
ServiceMap refMap = ref;
refMap['fields'] = null;
refMap['elements'] = null;
inboundReferences = null;
done();
}
}

View file

@ -37,20 +37,20 @@ class InstanceRefElement extends ServiceRefElement {
}
void expandEvent(bool expand, var done) {
assert(ref is ServiceMap);
assert(ref is Instance);
if (expand) {
ref.reload().then((result) {
if (result['valueAsString'] != null) {
result.name = result['valueAsString'];
result.vmName = result['valueAsString'];
if (result.valueAsString != null) {
result.name = result.valueAsString;
result.vmName = result.valueAsString;
}
ref = result;
notifyPropertyChange(#ref, 0, 1);
}).whenComplete(done);
} else {
ServiceMap refMap = ref;
refMap['fields'] = null;
refMap['elements'] = null;
Instance refMap = ref;
refMap.fields = null;
refMap.elements = null;
done();
}
}

View file

@ -18,50 +18,36 @@
}
</style>
<span>
<template if="{{ isError(ref) }}">
<pre class="errorBox">{{ ref.message }}</pre>
<template if="{{ ref.isSentinel }}">
<div title="{{ hoverText }}">{{ ref.valueAsString }}</div>
</template>
<template if="{{ isUnexpected(ref) }}">
unexpected reference type &lt;{{ ref.serviceType }}&gt;
<template if="{{ ref.isString || ref.isBool || ref.isInt || ref.isDouble || ref.isNull }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.valueAsString }}</a>
</template>
<template if="{{ isSentinel(ref) }}">
<div title="{{ hoverText }}">{{ ref['valueAsString'] }}</div>
<template if="{{ ref.isType }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref.name }}</a>
</template>
<template if="{{ (isString(ref) ||
isBool(ref) ||
isNull(ref) ||
isInt(ref)) ||
isDouble(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['valueAsString'] }}</a>
</template>
<template if="{{ (isType(ref)) }}">
<a on-click="{{ goto }}" _href="{{ url }}">{{ ref['user_name'] }}</a>
</template>
<template if="{{ isInstance(ref) &&
ref['closureFunc'] != null}}">
<template if="{{ ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}">
<!-- TODO(turnidge): Switch this to fully-qualified function -->
{{ ref['closureFunc'].name }}
{{ ref.closureFunc.name }}
</a>
</template>
<template if="{{ isInstance(ref) &&
ref['closureFunc'] == null}}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
<template if="{{ ref.isInstance && !ref.isClosure }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em></a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ field in ref['fields'] }}">
<template repeat="{{ field in ref.fields }}">
<div class="memberItem">
<div class="memberName">
{{ field['decl']['user_name'] }}
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -69,15 +55,15 @@
</curly-block>
</template>
<template if="{{ isList(ref) }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
<template if="{{ ref.isList }}">
<a on-click="{{ goto }}" _href="{{ url }}"><em>{{ ref.clazz.name }}</em> ({{ ref.length }})</a>
<curly-block callback="{{ expander() }}">
<div class="memberList">
<template repeat="{{ element in ref['elements'] }}">
<template repeat="{{ element in ref.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}"></instance-ref>
<any-service-ref ref="{{ element['value'] }}"></instance-ref>
</div>
</div>
</template>

View file

@ -11,7 +11,7 @@ import 'package:polymer/polymer.dart';
@CustomTag('instance-view')
class InstanceViewElement extends ObservatoryElement {
@published ServiceMap instance;
@published Instance instance;
@published ServiceMap path;
@published ServiceMap inboundReferences;
@observable int retainedBytes = null;

View file

@ -17,44 +17,43 @@
<top-nav-menu></top-nav-menu>
<isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
<!-- TODO(turnidge): Add library nav menu here. -->
<class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
<class-nav-menu cls="{{ instance.clazz }}"></class-nav-menu>
<nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
<nav-refresh callback="{{ refresh }}"></nav-refresh>
<nav-control></nav-control>
</nav-bar>
<template if="{{ instance['error'] != null }}">
<template if="{{ instance.isError }}">
<error-view error_obj="{{ instance['error'] }}"></error-view>
</template>
<template if="{{ instance['error'] == null }}">
<template if="{{ !instance.isError }}">
<div class="content">
<!-- TODO(turnidge): Handle null instances. -->
<template if="{{ isType(instance) }}">
<template if="{{ instance.isType }}">
<h1>type {{ instance.name }}</h1>
</template>
<template if="{{ !isType(instance) }}">
<h1>instance of {{ instance['class'].name }}</h1>
<template if="{{ !instance.isType }}">
<h1>instance of {{ instance.clazz.name }}</h1>
</template>
<div class="memberList">
<div class="memberItem">
<div class="memberName">class</div>
<div class="memberValue">
<class-ref ref="{{ instance['class'] }}">
<class-ref ref="{{ instance.clazz }}">
</class-ref>
</div>
</div>
<template if="{{ instance['valueAsString'] != null }}">
<template if="{{ instance.valueAsString != null }}">
<div class="memberItem">
<div class="memberName">value</div>
<div class="memberValue">{{ instance['valueAsString'] }}</div>
<div class="memberValue">{{ instance.valueAsString }}</div>
</div>
</template>
<div class="memberItem">
<div class="memberItem" title="Space for this object in memory">
<div class="memberName">size</div>
<div class="memberValue">{{ instance['size'] | formatSize }}</div>
<div class="memberValue">{{ instance.size | formatSize }}</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Space that would be reclaimed if references to this object were replaced with null">
<div class="memberName">retained size</div>
<div class="memberValue">
<template if="{{ retainedBytes == null }}">
@ -102,7 +101,7 @@
</template>
</div>
</div>
<div class="memberItem">
<div class="memberItem" title="Objects which directly reference this object">
<div class="memberName">inbound references</div>
<div class="memberValue">
<template if="{{ inboundReferences == null }}">
@ -118,20 +117,20 @@
</template>
</div>
</div>
<template if="{{ instance['type_class'] != null }}">
<template if="{{ instance.typeClass != null }}">
<div class="memberItem">
<div class="memberName">type class</div>
<div class="memberValue">
<class-ref ref="{{ instance['type_class'] }}">
<class-ref ref="{{ instance.typeClass }}">
</class-ref>
</div>
</div>
</template>
<template if="{{ instance['closureFunc'] != null }}">
<template if="{{ instance.isClosure }}">
<div class="memberItem">
<div class="memberName">closure function</div>
<div class="memberValue">
<function-ref ref="{{ instance['closureFunc'] }}">
<function-ref ref="{{ instance.closureFunc }}">
</function-ref>
</div>
</div>
@ -151,17 +150,17 @@
<hr>
<div class="content">
<template if="{{ instance['fields'].isNotEmpty }}">
fields ({{ instance['fields'].length }})
<curly-block expand="{{ instance['fields'].length <= 8 }}">
<template if="{{ instance.fields.isNotEmpty }}">
fields ({{ instance.fields.length }})
<curly-block expand="{{ instance.fields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['fields'] }}">
<template repeat="{{ field in instance.fields }}">
<div class="memberItem">
<div class="memberName">
<field-ref ref="{{ field['decl'] }}"></field-ref>
</div>
<div class="memberValue">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</div>
</div>
</template>
@ -169,11 +168,11 @@
</curly-block><br><br>
</template>
<template if="{{ instance['nativeFields'].isNotEmpty }}">
native fields ({{ instance['nativeFields'].length }})
<curly-block expand="{{ instance['nativeFields'].length <= 8 }}">
<template if="{{ instance.nativeFields.isNotEmpty }}">
native fields ({{ instance.nativeFields.length }})
<curly-block expand="{{ instance.nativeFields.length <= 8 }}">
<div class="memberList">
<template repeat="{{ field in instance['nativeFields'] }}">
<template repeat="{{ field in instance.nativeFields }}">
<div class="memberItem">
<div class="memberName">[{{ field['index']}}]</div>
<div class="memberValue">[{{ field['value']}}]</div>
@ -183,15 +182,15 @@
</curly-block><br><br>
</template>
<template if="{{ instance['elements'].isNotEmpty }}">
elements ({{ instance['elements'].length }})
<curly-block expand="{{ instance['elements'].length <= 8 }}">
<template if="{{ instance.elements.isNotEmpty }}">
elements ({{ instance.elements.length }})
<curly-block expand="{{ instance.elements.length <= 8 }}">
<div class="memberList">
<template repeat="{{ element in instance['elements'] }}">
<template repeat="{{ element in instance.elements }}">
<div class="memberItem">
<div class="memberName">[{{ element['index']}}]</div>
<div class="memberValue">
<instance-ref ref="{{ element['value'] }}">
<any-service-ref ref="{{ element['value'] }}">
</instance-ref>
</div>
</div>

View file

@ -104,7 +104,7 @@
</div>
<div class="memberValue">
<template if="{{ field['value'] != null }}">
<instance-ref ref="{{ field['value'] }}"></instance-ref>
<any-service-ref ref="{{ field['value'] }}"></any-service-ref>
</template>
</div>
</div>

View file

@ -111,64 +111,4 @@ class ObservatoryElement extends PolymerElement {
}
int parseInt(String value) => int.parse(value);
bool isNull(ref) {
return ref != null && ref.serviceType == 'Null';
}
bool isSentinel(ref) {
return ref != null && ref.serviceType == 'Sentinel';
}
bool isError(ref) {
return ref != null && ref.serviceType == 'Error';
}
bool isInt(ref) {
return ref != null && (ref.serviceType == 'Smi' ||
ref.serviceType == 'Mint' ||
ref.serviceType == 'Bigint');
}
bool isBool(ref) {
return ref != null && ref.serviceType == 'Bool';
}
bool isString(ref) {
return ref != null && ref.serviceType == 'String';
}
bool isInstance(ref) {
return ref != null && ref.serviceType == 'Instance';
}
bool isDouble(ref) {
return ref != null && ref.serviceType == 'Double';
}
bool isList(ref) {
return ref != null && (ref.serviceType == 'GrowableObjectArray' ||
ref.serviceType == 'Array');
}
bool isType(ref) {
return ref != null && (ref.serviceType == 'Type');
}
bool isUnexpected(ref) {
if (ref == null) return false;
return (!['Null',
'Sentinel',
'Smi',
'Mint',
'Bigint',
'Bool',
'String',
'Double',
'Instance',
'GrowableObjectArray',
'Array',
'Type',
'Error'].contains(ref.serviceType));
}
}

View file

@ -66,7 +66,7 @@ class AnyServiceRefElement extends ObservatoryElement {
Element _constructElementForRef() {
var type = ref.serviceType;
switch (type) {
case 'Class':
case 'Class':
ServiceRefElement element = new Element.tag('class-ref');
element.ref = ref;
return element;
@ -74,6 +74,10 @@ class AnyServiceRefElement extends ObservatoryElement {
ServiceRefElement element = new Element.tag('code-ref');
element.ref = ref;
return element;
case 'Error':
ServiceRefElement element = new Element.tag('error-ref');
element.ref = ref;
return element;
case 'Field':
ServiceRefElement element = new Element.tag('field-ref');
element.ref = ref;
@ -95,6 +99,7 @@ class AnyServiceRefElement extends ObservatoryElement {
case 'Instance':
case 'Mint':
case 'Null':
case 'Sentinel': // TODO(rmacnak): Separate this out.
case 'Smi':
case 'String':
case 'Type':

View file

@ -26,7 +26,7 @@
<div class="memberItem">
<div class="memberName">{{ v['name']}}</div>
<div class="memberValue">
<instance-ref ref="{{ v['value'] }}"></instance-ref>
<any-service-ref ref="{{ v['value'] }}"></any-service-ref>
</div>
</div>
</template>

View file

@ -34,6 +34,17 @@ abstract class ServiceObject extends Observable {
@reflectable String get serviceType => _serviceType;
String _serviceType;
bool get isBool => serviceType == 'Bool';
bool get isDouble => serviceType == 'Double';
bool get isError => serviceType == 'Error';
bool get isInstance => serviceType == 'Instance';
bool get isInt => serviceType == 'Smi' || serviceType == 'Mint' || serviceType == 'Bigint';
bool get isList => serviceType == 'GrowableObjectArray' || serviceType == 'Array';
bool get isNull => serviceType == 'Null';
bool get isSentinel => serviceType == 'Sentinel';
bool get isString => serviceType == 'String';
bool get isType => serviceType == 'Type';
/// The complete service url of this object.
@reflectable String get link => _owner.relativeLink(_id);
@ -88,6 +99,20 @@ abstract class ServiceObject extends Observable {
case 'Gauge':
obj = new ServiceMetric._empty(owner);
break;
case 'Array':
case 'Bigint':
case 'Bool':
case 'Double':
case 'GrowableObjectArray':
case 'Instance':
case 'Mint':
case 'Null':
case 'Sentinel': // TODO(rmacnak): Separate this out.
case 'Smi':
case 'String':
case 'Type':
obj = new Instance._empty(owner);
break;
case 'Isolate':
obj = new Isolate._empty(owner.vm);
break;
@ -1159,7 +1184,7 @@ class DartError extends ServiceObject {
@observable String kind;
@observable String message;
@observable ServiceMap exception;
@observable Instance exception;
@observable ServiceMap stacktrace;
void _update(ObservableMap map, bool mapIsRef) {
@ -1439,6 +1464,54 @@ class Class extends ServiceObject with Coverage {
String toString() => 'Class($vmName)';
}
class Instance extends ServiceObject {
@observable Class clazz;
@observable String valueAsString;
@observable int size;
@observable ServiceFunction closureFunc; // If a closure.
@observable String name; // If a Type.
@observable var typeClass;
@observable var length;
@observable var fields;
@observable var nativeFields;
@observable var elements;
@observable var userName;
bool get isClosure => closureFunc != null;
Instance._empty(ServiceObjectOwner owner) : super._empty(owner);
void _update(ObservableMap map, bool mapIsRef) {
// Extract full properties.
_upgradeCollection(map, isolate);
clazz = map['class'];
valueAsString = map['valueAsString'];
size = map['size'];
closureFunc = map['closureFunc'];
name = map['name'];
if (mapIsRef) {
return;
}
nativeFields = map['nativeFields'];
fields = map['fields'];
length = map['length'];
elements = map['elements'];
typeClass = map['type_class'];
userName = map['user_name'];
// We are fully loaded.
_loaded = true;
}
String get shortName => valueAsString != null ? valueAsString : 'a ${clazz.name}';
String toString() => 'Instance($shortName)';
}
// TODO(koda): Sync this with VM.
class FunctionKind {
final String _strValue;
@ -2356,8 +2429,7 @@ class MetricPoller {
// Convert any ServiceMaps representing a null instance into an actual null.
_convertNull(obj) {
if (obj is ServiceMap &&
obj.serviceType == 'Null') {
if (obj.isNull) {
return null;
}
return obj;