| <head> |
| <link rel="import" href="class_ref.html"> |
| <link rel="import" href="error_view.html"> |
| <link rel="import" href="eval_box.html"> |
| <link rel="import" href="eval_link.html"> |
| <link rel="import" href="field_ref.html"> |
| <link rel="import" href="function_ref.html"> |
| <link rel="import" href="instance_ref.html"> |
| <link rel="import" href="observatory_element.html"> |
| <link rel="import" href="nav_bar.html"> |
| </head> |
| <polymer-element name="instance-view" extends="observatory-element"> |
| <template> |
| <link rel="stylesheet" href="css/shared.css"> |
| <nav-bar> |
| <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> |
| <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu> |
| <nav-refresh callback="{{ refresh }}"></nav-refresh> |
| </nav-bar> |
| |
| <template if="{{ instance['error'] != null }}"> |
| <error-view error_obj="{{ instance['error'] }}"></error-view> |
| </template> |
| |
| <template if="{{ instance['error'] == null }}"> |
| <div class="content"> |
| <!-- TODO(turnidge): Handle null instances. --> |
| <template if="{{ isType(instance.serviceType) }}"> |
| <h1>type {{ instance['user_name'] }}</h1> |
| </template> |
| <template if="{{ !isType(instance.serviceType) }}"> |
| <h1>instance of {{ instance['class']['user_name'] }}</h1> |
| </template> |
| <div class="memberList"> |
| <div class="memberItem"> |
| <div class="memberName">class</div> |
| <div class="memberValue"> |
| <class-ref ref="{{ instance['class'] }}"> |
| </class-ref> |
| </div> |
| </div> |
| <template if="{{ instance['valueAsString'] != null }}"> |
| <div class="memberItem"> |
| <div class="memberName">value</div> |
| <div class="memberValue">{{ instance['valueAsString'] }}</div> |
| </div> |
| </template> |
| <div class="memberItem"> |
| <div class="memberName">size</div> |
| <div class="memberValue">{{ instance['size'] | formatSize }}</div> |
| </div> |
| <div class="memberItem"> |
| <div class="memberName">retained size</div> |
| <div class="memberValue"> |
| <eval-link callback="{{ retainedSize }}" |
| label="[calculate]"> |
| </eval-link> |
| </div> |
| </div> |
| <div class="memberItem"> |
| <div class="memberName">retaining path</div> |
| <div class="memberValue"> |
| <template if="{{ path == null }}"> |
| <eval-link callback="{{ retainingPath }}" |
| label="[find]" |
| expr="10"> |
| </eval-link> |
| </template> |
| <template if="{{ path != null }}"> |
| <template repeat="{{ element in path['elements'] }}"> |
| <div class="memberItem"> |
| <div class="memberName">[{{ element['index']}}]</div> |
| <div class="memberValue"> |
| <instance-ref ref="{{ element['value'] }}"></instance-ref> |
| </div> |
| </div> |
| </template> |
| <template if="{{ path['length'] > path['elements'].length }}"> |
| showing {{ path['elements'].length }} of {{ path['length'] }} |
| <eval-link |
| callback="{{ retainingPath }}" |
| label="[find more]" |
| expr="{{ path['elements'].length * 2 }}"> |
| </eval-link> |
| </template> |
| </template> |
| </div> |
| </div> |
| <template if="{{ instance['type_class'] != null }}"> |
| <div class="memberItem"> |
| <div class="memberName">type class</div> |
| <div class="memberValue"> |
| <class-ref ref="{{ instance['type_class'] }}"> |
| </class-ref> |
| </div> |
| </div> |
| </template> |
| <template if="{{ instance['closureFunc'] != null }}"> |
| <div class="memberItem"> |
| <div class="memberName">closure function</div> |
| <div class="memberValue"> |
| <function-ref ref="{{ instance['closureFunc'] }}"> |
| </function-ref> |
| </div> |
| </div> |
| </template> |
| |
| <div class="memberItem"> </div> |
| |
| <div class="memberItem"> |
| <div class="memberName">toString()</div> |
| <div class="memberValue"> |
| <eval-link callback="{{ eval }}" expr="toString()"></eval-link> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <hr> |
| |
| <div class="content"> |
| <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'] }}"> |
| <div class="memberItem"> |
| <div class="memberName"> |
| <field-ref ref="{{ field['decl'] }}"></field-ref> |
| </div> |
| <div class="memberValue"> |
| <instance-ref ref="{{ field['value'] }}"></instance-ref> |
| </div> |
| </div> |
| </template> |
| </div> |
| </curly-block><br><br> |
| </template> |
| |
| <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'] }}"> |
| <div class="memberItem"> |
| <div class="memberName">[{{ field['index']}}]</div> |
| <div class="memberValue">[{{ field['value']}}]</div> |
| </div> |
| </template> |
| </div> |
| </curly-block><br><br> |
| </template> |
| |
| <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'] }}"> |
| <div class="memberItem"> |
| <div class="memberName">[{{ element['index']}}]</div> |
| <div class="memberValue"> |
| <instance-ref ref="{{ element['value'] }}"> |
| </instance-ref> |
| </div> |
| </div> |
| </template> |
| </div> |
| </curly-block><br><br> |
| </template> |
| </div> |
| |
| <hr> |
| |
| <div class="content"> |
| <eval-box callback="{{ eval }}"></eval-box> |
| </div> |
| <br><br><br><br> |
| <br><br><br><br> |
| |
| </template> |
| </template> |
| <script type="application/dart" src="instance_view.dart"></script> |
| </polymer-element> |