Index: runtime/bin/vmservice/client/deployed/web/index.html |
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html |
index 7a7bc020ae9f2ea1a58495da9519ef65910b08ff..758168da0c33734edab47deb82828401b090909b 100644 |
--- a/runtime/bin/vmservice/client/deployed/web/index.html |
+++ b/runtime/bin/vmservice/client/deployed/web/index.html |
@@ -121,7 +121,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -334,6 +339,7 @@ hr { |
+ |
@@ -447,7 +453,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -789,7 +800,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -1220,7 +1236,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -1478,7 +1499,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -1840,7 +1866,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -2091,7 +2122,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -2335,7 +2371,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -2580,7 +2621,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -2817,7 +2863,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -3188,7 +3239,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -3439,7 +3495,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -3847,7 +3908,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -4098,7 +4164,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -4357,59 +4428,13 @@ hr { |
+ |
- |
- |
-<polymer-element name="script-inset" extends="observatory-element"> |
- <template> |
- <style> |
- .sourceInset { |
- padding-left: 15%; |
- padding-right: 15%; |
- } |
- .grayBox { |
- width: 100%; |
- background-color: #f5f5f5; |
- border: 1px solid #ccc; |
- padding: 10px; |
- } |
- </style> |
- <div class="sourceInset"> |
- <content></content> |
- <div class="grayBox"> |
- <template if="{{ coverage == true }}"> |
- <table> |
- <tbody> |
- <tr template="" repeat="{{ line in lines }}"> |
- <td style="{{ hitStyle(line) }}"><span> </span></td> |
- <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td> |
- <td> </td> |
- <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td> |
- </tr> |
- </tbody> |
- </table> |
- </template> |
- <template if="{{ coverage == false }}"> |
- <table> |
- <tbody> |
- <tr template="" repeat="{{ line in lines }}"> |
- <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td> |
- <td> </td> |
- <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td> |
- </tr> |
- </tbody> |
- </table> |
- </template> |
- </div> |
- </div> |
- </template> |
- |
-</polymer-element> |
-<polymer-element name="function-view" extends="observatory-element"> |
+<polymer-element name="stack-frame" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -4469,7 +4494,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -4642,118 +4672,39 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <nav-bar> |
- <top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu> |
- <template if="{{ function['owner'].serviceType == 'Class' }}"> |
- <!-- TODO(turnidge): Add library nav menu here. --> |
- <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu> |
- </template> |
- <template if="{{ function['owner'].serviceType == 'Library' }}"> |
- <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu> |
- </template> |
- <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="content"> |
- <h1>function {{ qualifiedName }}</h1> |
- |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">kind</div> |
- <div class="memberValue"> |
- <template if="{{ function['is_static'] }}">static</template> |
- <template if="{{ function['is_const'] }}">const</template> |
- {{ kind }} |
- </div> |
- </div> |
- <template if="{{ function['parent'] != null }}"> |
- <div class="memberItem"> |
- <div class="memberName">parent function</div> |
- <div class="memberValue"> |
- <function-ref ref="{{ function['parent'] }}"></function-ref> |
- </div> |
- </div> |
- </template> |
- <div class="memberItem"> |
- <div class="memberName">owner</div> |
- <div class="memberValue"> |
- <template if="{{ function['owner'].serviceType == 'Class' }}"> |
- <class-ref ref="{{ function['owner'] }}"></class-ref> |
- </template> |
- <template if="{{ function['owner'].serviceType != 'Class' }}"> |
- <library-ref ref="{{ function['owner'] }}"></library-ref> |
- </template> |
- </div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">script</div> |
- <div class="memberValue"> |
- <script-ref ref="{{ function['script'] }}" pos="{{ function['tokenPos'] }}"> |
- </script-ref> |
- </div> |
- </div> |
- |
- <div class="memberItem"> </div> |
+ <div class="flex-row"> |
+ <div class="flex-item-fixed-1-12"> |
+ </div> |
+ <div class="flex-item-fixed-1-12"> |
+ #{{ frame['depth'] }} |
+ </div> |
+ <div class="flex-item-fixed-9-12"> |
+ <function-ref ref="{{ frame['function'] }}"></function-ref> |
+ ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}"> |
+ </script-ref> ) |
- <template if="{{ function['code'] != null }}"> |
- <div class="memberItem"> |
- <div class="memberName">optimized code</div> |
- <div class="memberValue"> |
- <code-ref ref="{{ function['code'] }}"></code-ref> |
- </div> |
- </div> |
- </template> |
- <template if="{{ function['unoptimized_code'] != null }}"> |
- <div class="memberItem"> |
- <div class="memberName">unoptimized code</div> |
- <div class="memberValue"> |
- <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref> |
+ <curly-block> |
+ <div class="memberList"> |
+ <template repeat="{{ v in frame['vars'] }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">{{ v['name']}}</div> |
+ <div class="memberValue"> |
+ <instance-ref ref="{{ v['value'] }}"></instance-ref> |
+ </div> |
+ </div> |
+ </template> |
</div> |
- <div class="memberValue"> |
- <span title="This count is used to determine when a function will be optimized. It is a combination of call counts and other factors."> |
- (usage count: {{ function['usage_counter'] }}) |
- </span> |
- </div> |
- </div> |
- </template> |
- <div class="memberItem"> |
- <div class="memberName">deoptimizations</div> |
- <div class="memberValue">{{ function['deoptimizations'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">optimizable</div> |
- <div class="memberValue">{{ function['is_optimizable'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">inlinable</div> |
- <div class="memberValue">{{ function['is_inlinable'] }}</div> |
- </div> |
- <template if="{{ function.name != function.vmName }}"> |
- <div class="memberItem"> |
- <div class="memberName">vm name</div> |
- <div class="memberValue">{{ function.vmName }}</div> |
- </div> |
- </template> |
- </div> |
+ </curly-block> |
+ </div> |
+ <div class="flex-item-fixed-1-12"> |
+ </div> |
</div> |
- |
- <hr> |
- <script-inset script="{{ function['script'] }}" pos="{{ function['tokenPos'] }}" endpos="{{ function['endTokenPos'] }}"> |
- </script-inset> |
- |
- <br> |
</template> |
</polymer-element> |
- |
- |
- |
- |
-<polymer-element name="heap-map" extends="observatory-element"> |
-<template> |
- <style> |
+<polymer-element name="flag-list" extends="observatory-element"> |
+ <template> |
+ <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -4811,7 +4762,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -4984,42 +4940,40 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <style> |
- .hover { |
- position: fixed; |
- z-index: 999; |
- height: 16px; |
- width: 100%; |
- background: #ffffff; |
- } |
- .spacer { |
- height: 16px; |
- background-color: red; |
- } |
- </style> |
- <nav-bar pad="{{ false }}"> |
- <top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu> |
- <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- <div class="hover"> |
- <p style="text-align:center">{{ status }}</p> |
- </div> |
- <div class="spacer"> |
- <!-- Make sure no data is covered by hover bar initially --> |
- </div> |
- <div class="flex-row"> |
- <canvas id="fragmentation" width="1px" height="1px"></canvas> |
- </div> |
-</template> |
+ <nav-bar> |
+ <top-nav-menu></top-nav-menu> |
+ <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ |
+ <div class="content-centered"> |
+ <template if="{{ flagList['modifiedFlags'].isNotEmpty }}"> |
+ <h1>Modified Flags</h1> |
+ <br> |
+ <template repeat="{{ flag in flagList['modifiedFlags'] }}"> |
+ <flag-item flag="{{ flag }}"></flag-item> |
+ <br> |
+ </template> |
+ <hr> |
+ </template> |
+ |
+ <h1>Unmodified Flags</h1> |
+ <br> |
+ <template if="{{ flagList['unmodifiedFlags'].isEmpty }}"> |
+ <em>None</em> |
+ </template> |
+ <template if="{{ flagList['unmodifiedFlags'].isNotEmpty }}"> |
+ <template repeat="{{ flag in flagList['unmodifiedFlags'] }}"> |
+ <flag-item flag="{{ flag }}"></flag-item> |
+ <br> |
+ </template> |
+ </template> |
+ </div> |
+ </template> |
</polymer-element> |
- |
- |
- |
-<polymer-element name="io-view" extends="observatory-element"> |
+<polymer-element name="flag-item" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -5079,7 +5033,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -5252,62 +5211,73 @@ hr { |
word-wrap: break-word; |
} |
</style> |
+ <span style="color:#aaa">// {{ flag['comment'] }}</span> |
+ <div style="padding: 3px 0"> |
+ <b>{{ flag['name'] }}</b> |
+ = |
+ {{ flag['valueAsString'] }} |
+ </div> |
+ </template> |
+</polymer-element> |
- <nav-bar> |
- <top-nav-menu last="{{ true }}"></top-nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="content"> |
- <h1>dart:io</h1> |
- |
- <br> |
- |
- <ul class="list-group"> |
- <li class="list-group-item"> |
- <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a> |
- </li> |
- </ul> |
- |
- <br> |
- |
- <ul class="list-group"> |
- <li class="list-group-item"> |
- <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a> |
- </li> |
- </ul> |
- |
- <br> |
- |
- <ul class="list-group"> |
- <li class="list-group-item"> |
- <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a> |
- </li> |
- </ul> |
- |
- <br> |
- |
- <ul class="list-group"> |
- <li class="list-group-item"> |
- <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a> |
- </li> |
- </ul> |
- <br> |
- <ul class="list-group"> |
- <li class="list-group-item"> |
- <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a> |
- </li> |
- </ul> |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+<polymer-element name="script-inset" extends="observatory-element"> |
+ <template> |
+ <style> |
+ .sourceInset { |
+ padding-left: 15%; |
+ padding-right: 15%; |
+ } |
+ .grayBox { |
+ width: 100%; |
+ background-color: #f5f5f5; |
+ border: 1px solid #ccc; |
+ padding: 10px; |
+ } |
+ </style> |
+ <div class="sourceInset"> |
+ <content></content> |
+ <div class="grayBox"> |
+ <template if="{{ coverage == true }}"> |
+ <table> |
+ <tbody> |
+ <tr template="" repeat="{{ line in lines }}"> |
+ <td style="{{ hitStyle(line) }}"><span> </span></td> |
+ <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td> |
+ <td> </td> |
+ <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td> |
+ </tr> |
+ </tbody> |
+ </table> |
+ </template> |
+ <template if="{{ coverage == false }}"> |
+ <table> |
+ <tbody> |
+ <tr template="" repeat="{{ line in lines }}"> |
+ <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td> |
+ <td> </td> |
+ <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td> |
+ </tr> |
+ </tbody> |
+ </table> |
+ </template> |
+ </div> |
</div> |
- <br> |
- <hr> |
</template> |
+ |
</polymer-element> |
- |
-<polymer-element name="io-http-server-list-view" extends="observatory-element"> |
+<polymer-element name="function-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -5367,7 +5337,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -5540,33 +5515,118 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- |
<nav-bar> |
- <top-nav-menu last="{{ true }}"></top-nav-menu> |
+ <top-nav-menu></top-nav-menu> |
+ <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu> |
+ <template if="{{ function['owner'].serviceType == 'Class' }}"> |
+ <!-- TODO(turnidge): Add library nav menu here. --> |
+ <class-nav-menu cls="{{ function['owner'] }}"></class-nav-menu> |
+ </template> |
+ <template if="{{ function['owner'].serviceType == 'Library' }}"> |
+ <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu> |
+ </template> |
+ <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu> |
<nav-refresh callback="{{ refresh }}"></nav-refresh> |
</nav-bar> |
<div class="content"> |
- <h1>HttpServers</h1> |
+ <h1>function {{ qualifiedName }}</h1> |
- <br> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">kind</div> |
+ <div class="memberValue"> |
+ <template if="{{ function['is_static'] }}">static</template> |
+ <template if="{{ function['is_const'] }}">const</template> |
+ {{ kind }} |
+ </div> |
+ </div> |
+ <template if="{{ function['parent'] != null }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">parent function</div> |
+ <div class="memberValue"> |
+ <function-ref ref="{{ function['parent'] }}"></function-ref> |
+ </div> |
+ </div> |
+ </template> |
+ <div class="memberItem"> |
+ <div class="memberName">owner</div> |
+ <div class="memberValue"> |
+ <template if="{{ function['owner'].serviceType == 'Class' }}"> |
+ <class-ref ref="{{ function['owner'] }}"></class-ref> |
+ </template> |
+ <template if="{{ function['owner'].serviceType != 'Class' }}"> |
+ <library-ref ref="{{ function['owner'] }}"></library-ref> |
+ </template> |
+ </div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">script</div> |
+ <div class="memberValue"> |
+ <script-ref ref="{{ function['script'] }}" pos="{{ function['tokenPos'] }}"> |
+ </script-ref> |
+ </div> |
+ </div> |
- <ul class="list-group"> |
- <template repeat="{{ httpServer in list['members'] }}"> |
- <li class="list-group-item"> |
- <io-http-server-ref ref="{{ httpServer }}"></io-http-server-ref> |
- </li> |
+ <div class="memberItem"> </div> |
+ |
+ <template if="{{ function['code'] != null }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">optimized code</div> |
+ <div class="memberValue"> |
+ <code-ref ref="{{ function['code'] }}"></code-ref> |
+ </div> |
+ </div> |
</template> |
- </ul> |
+ <template if="{{ function['unoptimized_code'] != null }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">unoptimized code</div> |
+ <div class="memberValue"> |
+ <code-ref ref="{{ function['unoptimized_code'] }}"></code-ref> |
+ </div> |
+ <div class="memberValue"> |
+ <span title="This count is used to determine when a function will be optimized. It is a combination of call counts and other factors."> |
+ (usage count: {{ function['usage_counter'] }}) |
+ </span> |
+ </div> |
+ </div> |
+ </template> |
+ <div class="memberItem"> |
+ <div class="memberName">deoptimizations</div> |
+ <div class="memberValue">{{ function['deoptimizations'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">optimizable</div> |
+ <div class="memberValue">{{ function['is_optimizable'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">inlinable</div> |
+ <div class="memberValue">{{ function['is_inlinable'] }}</div> |
+ </div> |
+ <template if="{{ function.name != function.vmName }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">vm name</div> |
+ <div class="memberValue">{{ function.vmName }}</div> |
+ </div> |
+ </template> |
+ </div> |
</div> |
- <br> |
+ |
<hr> |
+ <script-inset script="{{ function['script'] }}" pos="{{ function['tokenPos'] }}" endpos="{{ function['endTokenPos'] }}"> |
+ </script-inset> |
+ |
+ <br> |
</template> |
+ |
</polymer-element> |
-<polymer-element name="io-http-server-ref" extends="service-ref"> |
- <template> |
- <style> |
+ |
+ |
+ |
+<polymer-element name="heap-map" extends="observatory-element"> |
+<template> |
+ <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -5624,7 +5684,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -5797,11 +5862,42 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <a href="{{ url }}">{{ name }}</a> |
- </template> |
-</polymer-element> |
- |
-<polymer-element name="io-http-server-view" extends="observatory-element"> |
+ <style> |
+ .hover { |
+ position: fixed; |
+ z-index: 999; |
+ height: 16px; |
+ width: 100%; |
+ background: #ffffff; |
+ } |
+ .spacer { |
+ height: 16px; |
+ background-color: red; |
+ } |
+ </style> |
+ <nav-bar pad="{{ false }}"> |
+ <top-nav-menu></top-nav-menu> |
+ <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu> |
+ <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ <div class="hover"> |
+ <p style="text-align:center">{{ status }}</p> |
+ </div> |
+ <div class="spacer"> |
+ <!-- Make sure no data is covered by hover bar initially --> |
+ </div> |
+ <div class="flex-row"> |
+ <canvas id="fragmentation" width="1px" height="1px"></canvas> |
+ </div> |
+</template> |
+ |
+</polymer-element> |
+ |
+ |
+ |
+ |
+<polymer-element name="io-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -5861,7 +5957,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -6041,39 +6142,55 @@ hr { |
</nav-bar> |
<div class="content"> |
- <h1>HttpServer</h1> |
+ <h1>dart:io</h1> |
<br> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Socket</div> |
- <div class="memberValue"><io-socket-ref ref="{{ httpServer['socket'] }}"></io-socket-ref></div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Address</div> |
- <div class="memberValue">{{ httpServer['address'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Port</div> |
- <div class="memberValue">{{ httpServer['port'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Active connections</div> |
- <div class="memberValue">{{ httpServer['active'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Idle connections</div> |
- <div class="memberValue">{{ httpServer['idle'] }}</div> |
- </div> |
- </div> |
+ <ul class="list-group"> |
+ <li class="list-group-item"> |
+ <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a> |
+ </li> |
+ </ul> |
+ |
+ <br> |
+ |
+ <ul class="list-group"> |
+ <li class="list-group-item"> |
+ <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a> |
+ </li> |
+ </ul> |
+ |
+ <br> |
+ |
+ <ul class="list-group"> |
+ <li class="list-group-item"> |
+ <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a> |
+ </li> |
+ </ul> |
+ |
+ <br> |
+ |
+ <ul class="list-group"> |
+ <li class="list-group-item"> |
+ <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a> |
+ </li> |
+ </ul> |
+ |
+ <br> |
+ |
+ <ul class="list-group"> |
+ <li class="list-group-item"> |
+ <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a> |
+ </li> |
+ </ul> |
+ |
</div> |
<br> |
<hr> |
</template> |
</polymer-element> |
-<polymer-element name="io-socket-ref" extends="service-ref"> |
+<polymer-element name="io-ref" extends="service-ref"> |
<template> |
<style> |
/* Global styles */ |
@@ -6133,7 +6250,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -6306,11 +6428,19 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <a href="{{ url }}">{{ name }}</a> |
+ <template if="{{ ref.serviceType == 'Socket' }}"> |
+ <io-socket-ref ref="{{ ref }}"></io-socket-ref> |
+ </template> |
+ <template if="{{ ref.serviceType == 'HttpServer' }}"> |
+ <io-http-server-ref ref="{{ ref }}"></io-http-server-ref> |
+ </template> |
+ <template if="{{ ref.serviceType == 'WebSocket' }}"> |
+ <io-web-socket-ref ref="{{ ref }}"></io-web-socket-ref> |
+ </template> |
</template> |
</polymer-element> |
-<polymer-element name="io-socket-list-view" extends="observatory-element"> |
+<polymer-element name="io-http-server-list-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -6370,7 +6500,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -6550,14 +6685,14 @@ hr { |
</nav-bar> |
<div class="content"> |
- <h1>Sockets</h1> |
+ <h1>HttpServers</h1> |
<br> |
<ul class="list-group"> |
- <template repeat="{{ socket in list['members'] }}"> |
+ <template repeat="{{ httpServer in list['members'] }}"> |
<li class="list-group-item"> |
- <io-socket-ref ref="{{ socket }}"></io-socket-ref> |
+ <io-http-server-ref ref="{{ httpServer }}"></io-http-server-ref> |
</li> |
</template> |
</ul> |
@@ -6567,7 +6702,7 @@ hr { |
</template> |
</polymer-element> |
-<polymer-element name="io-socket-view" extends="observatory-element"> |
+<polymer-element name="io-http-server-ref" extends="service-ref"> |
<template> |
<style> |
/* Global styles */ |
@@ -6627,7 +6762,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -6800,38 +6940,11 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- |
- <nav-bar> |
- <top-nav-menu last="{{ true }}"></top-nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="content"> |
- <h1>Socket</h1> |
- |
- <br> |
- |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Address</div> |
- <div class="memberValue">{{ socket['address'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Port</div> |
- <div class="memberValue">{{ socket['port'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">File descriptor</div> |
- <div class="memberValue">{{ socket['fd'] }}</div> |
- </div> |
- </div> |
- </div> |
- <br> |
- <hr> |
+ <a href="{{ url }}">{{ name }}</a> |
</template> |
</polymer-element> |
-<polymer-element name="io-web-socket-ref" extends="service-ref"> |
+<polymer-element name="io-http-server-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -6891,7 +7004,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -7064,11 +7182,46 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <a href="{{ url }}">{{ name }}</a> |
+ |
+ <nav-bar> |
+ <top-nav-menu last="{{ true }}"></top-nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ |
+ <div class="content"> |
+ <h1>HttpServer</h1> |
+ |
+ <br> |
+ |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Socket</div> |
+ <div class="memberValue"><io-socket-ref ref="{{ httpServer['socket'] }}"></io-socket-ref></div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Address</div> |
+ <div class="memberValue">{{ httpServer['address'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Port</div> |
+ <div class="memberValue">{{ httpServer['port'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Active connections</div> |
+ <div class="memberValue">{{ httpServer['active'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Idle connections</div> |
+ <div class="memberValue">{{ httpServer['idle'] }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ <br> |
+ <hr> |
</template> |
</polymer-element> |
-<polymer-element name="io-web-socket-list-view" extends="observatory-element"> |
+<polymer-element name="io-socket-ref" extends="service-ref"> |
<template> |
<style> |
/* Global styles */ |
@@ -7128,7 +7281,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -7301,31 +7459,11 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- |
- <nav-bar> |
- <top-nav-menu last="{{ true }}"></top-nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="content"> |
- <h1>WebSockets</h1> |
- |
- <br> |
- |
- <ul class="list-group"> |
- <template repeat="{{ webSocket in list['members'] }}"> |
- <li class="list-group-item"> |
- <io-web-socket-ref ref="{{ webSocket }}"></io-web-socket-ref> |
- </li> |
- </template> |
- </ul> |
- </div> |
- <br> |
- <hr> |
+ <a href="{{ url }}">{{ name }}</a> |
</template> |
</polymer-element> |
-<polymer-element name="io-web-socket-view" extends="observatory-element"> |
+<polymer-element name="io-socket-list-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -7385,7 +7523,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -7565,23 +7708,24 @@ hr { |
</nav-bar> |
<div class="content"> |
- <h1>WebSocket</h1> |
+ <h1>Sockets</h1> |
<br> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Socket</div> |
- <div class="memberValue"><io-socket-ref ref="{{ webSocket['socket'] }}"></io-socket-ref></div> |
- </div> |
- </div> |
+ <ul class="list-group"> |
+ <template repeat="{{ socket in list['members'] }}"> |
+ <li class="list-group-item"> |
+ <io-socket-ref ref="{{ socket }}"></io-socket-ref> |
+ </li> |
+ </template> |
+ </ul> |
</div> |
<br> |
<hr> |
</template> |
</polymer-element> |
-<polymer-element name="io-random-access-file-ref" extends="service-ref"> |
+<polymer-element name="io-socket-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -7641,7 +7785,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -7814,15 +7963,48 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <a href="{{ url }}">{{ name }}</a> |
- </template> |
-</polymer-element> |
-<polymer-element name="io-random-access-file-list-view" extends="observatory-element"> |
- <template> |
- <style> |
-/* Global styles */ |
-* { |
+ <nav-bar> |
+ <top-nav-menu last="{{ true }}"></top-nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ |
+ <div class="content"> |
+ <h1>Socket</h1> |
+ |
+ <br> |
+ |
+ <div class="memberList"> |
+ <template if="{{ socket['owner'] != null }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">Owner</div> |
+ <div class="memberValue"><io-ref ref="{{ socket['owner'] }}"></io-ref></div> |
+ </div> |
+ </template> |
+ <div class="memberItem"> |
+ <div class="memberName">Address</div> |
+ <div class="memberValue">{{ socket['address'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Port</div> |
+ <div class="memberValue">{{ socket['port'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">File descriptor</div> |
+ <div class="memberValue">{{ socket['fd'] }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ <br> |
+ <hr> |
+ </template> |
+</polymer-element> |
+ |
+<polymer-element name="io-web-socket-ref" extends="service-ref"> |
+ <template> |
+ <style> |
+/* Global styles */ |
+* { |
margin: 0; |
padding: 0; |
font: 400 14px 'Montserrat', sans-serif; |
@@ -7878,7 +8060,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -8051,31 +8238,11 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- |
- <nav-bar> |
- <top-nav-menu last="{{ true }}"></top-nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="content"> |
- <h1>Random Access Files</h1> |
- |
- <br> |
- |
- <ul class="list-group"> |
- <template repeat="{{ file in list['members'] }}"> |
- <li class="list-group-item"> |
- <io-random-access-file-ref ref="{{ file }}"></io-random-access-file-ref> |
- </li> |
- </template> |
- </ul> |
- </div> |
- <br> |
- <hr> |
+ <a href="{{ url }}">{{ name }}</a> |
</template> |
</polymer-element> |
-<polymer-element name="io-random-access-file-view" extends="observatory-element"> |
+<polymer-element name="io-web-socket-list-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -8135,7 +8302,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -8315,31 +8487,24 @@ hr { |
</nav-bar> |
<div class="content"> |
- <h1>Random Access File</h1> |
+ <h1>WebSockets</h1> |
<br> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Path</div> |
- <div class="memberValue">{{ file['name'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Pending Operation</div> |
- <div class="memberValue">{{ file['asyncDispatched'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">File Descriptor</div> |
- <div class="memberValue">{{ file['fd'] }}</div> |
- </div> |
- </div> |
+ <ul class="list-group"> |
+ <template repeat="{{ webSocket in list['members'] }}"> |
+ <li class="list-group-item"> |
+ <io-web-socket-ref ref="{{ webSocket }}"></io-web-socket-ref> |
+ </li> |
+ </template> |
+ </ul> |
</div> |
<br> |
<hr> |
</template> |
</polymer-element> |
-<polymer-element name="io-process-list-view" extends="observatory-element"> |
+<polymer-element name="io-web-socket-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -8399,7 +8564,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -8579,24 +8749,23 @@ hr { |
</nav-bar> |
<div class="content"> |
- <h1>Processes</h1> |
+ <h1>WebSocket</h1> |
<br> |
- <ul class="list-group"> |
- <template repeat="{{ process in list['members'] }}"> |
- <li class="list-group-item"> |
- <io-process-ref ref="{{ process }}"></io-process-ref> |
- </li> |
- </template> |
- </ul> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Socket</div> |
+ <div class="memberValue"><io-socket-ref ref="{{ webSocket['socket'] }}"></io-socket-ref></div> |
+ </div> |
+ </div> |
</div> |
<br> |
<hr> |
</template> |
</polymer-element> |
-<polymer-element name="io-process-ref" extends="service-ref"> |
+<polymer-element name="io-random-access-file-ref" extends="service-ref"> |
<template> |
<style> |
/* Global styles */ |
@@ -8656,7 +8825,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -8829,16 +9003,11 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <template if="{{ small }}"> |
- <a href="{{ url }}">{{ name }}</a> |
- </template> |
- <template if="{{ !small }}"> |
- <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a> |
- </template> |
+ <a href="{{ url }}">{{ name }}</a> |
</template> |
</polymer-element> |
-<polymer-element name="io-process-view" extends="observatory-element"> |
+<polymer-element name="io-random-access-file-list-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -8898,7 +9067,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -9078,55 +9252,26 @@ hr { |
</nav-bar> |
<div class="content"> |
- <h1>Process</h1> |
- |
- <br> |
- |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Path</div> |
- <div class="memberValue">{{ process['name'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Pid</div> |
- <div class="memberValue">{{ process['pid'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Arguments</div> |
- <div class="memberValue">{{ process['arguments'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Started</div> |
- <div class="memberValue">{{ process['started'] }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Working Directory</div> |
- <div class="memberValue">{{ process['workingDirectory'] }}</div> |
- </div> |
- </div> |
+ <h1>Random Access Files</h1> |
<br> |
- <h2>Environment</h2> |
- <div class="well"> |
- <div class="monospace break-wrap"> |
- <template repeat="{{ variable in process['environment'] }}"> |
- {{ variable }} |
- <br> |
- </template> |
- </div> |
- </div> |
+ <ul class="list-group"> |
+ <template repeat="{{ file in list['members'] }}"> |
+ <li class="list-group-item"> |
+ <io-random-access-file-ref ref="{{ file }}"></io-random-access-file-ref> |
+ </li> |
+ </template> |
+ </ul> |
</div> |
<br> |
<hr> |
</template> |
</polymer-element> |
- |
- |
- |
-<polymer-element name="isolate-ref" extends="service-ref"> |
-<template><style> |
+<polymer-element name="io-random-access-file-view" extends="observatory-element"> |
+ <template> |
+ <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -9184,7 +9329,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -9357,18 +9507,38 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <a href="{{ url }}">{{ ref.name }}</a> |
-</template> |
+ <nav-bar> |
+ <top-nav-menu last="{{ true }}"></top-nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ |
+ <div class="content"> |
+ <h1>Random Access File</h1> |
+ |
+ <br> |
+ |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Path</div> |
+ <div class="memberValue">{{ file['name'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Pending Operation</div> |
+ <div class="memberValue">{{ file['asyncDispatched'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">File Descriptor</div> |
+ <div class="memberValue">{{ file['fd'] }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ <br> |
+ <hr> |
+ </template> |
</polymer-element> |
- |
- |
- |
- |
- |
- |
-<polymer-element name="isolate-summary" extends="observatory-element"> |
+<polymer-element name="io-process-list-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -9428,7 +9598,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -9601,105 +9776,33 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <div class="flex-row"> |
- <div class="flex-item-10-percent"> |
- <img src="packages/observatory/src/elements/img/isolate_icon.png"> |
- </div> |
- <div class="flex-item-10-percent"> |
- <isolate-ref ref="{{ isolate }}"></isolate-ref> |
- </div> |
- <div class="flex-item-20-percent"> |
- <isolate-run-state isolate="{{ isolate }}"></isolate-run-state> |
- </div> |
- <div class="flex-item-50-percent"> |
- <isolate-location isolate="{{ isolate }}"></isolate-location> |
- </div> |
- <div class="flex-item-10-percent"> |
- </div> |
- </div> |
- <div class="flex-row"> |
- <div class="flex-item-20-percent"></div> |
- <div class="flex-item-60-percent"> |
- <hr> |
- </div> |
- <div class="flex-item-20-percent"></div> |
- </div> |
+ <nav-bar> |
+ <top-nav-menu last="{{ true }}"></top-nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
- <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary> |
+ <div class="content"> |
+ <h1>Processes</h1> |
- </template> |
-</polymer-element> |
- |
-<polymer-element name="isolate-run-state" extends="observatory-element"> |
- <template> |
- <template if="{{ isolate.pauseEvent != null }}"> |
- <strong>paused</strong> |
- <action-link callback="{{ resume }}" label="resume"></action-link> |
- </template> |
- |
- <template if="{{ isolate.running }}"> |
- <strong>running</strong> |
- <action-link callback="{{ pause }}" label="pause"></action-link> |
- </template> |
- |
- <template if="{{ isolate.idle }}"> |
- <strong>idle</strong> |
- </template> |
- |
- <template if="{{ isolate.loading }}"> |
- <strong>loading...</strong> |
- </template> |
- </template> |
-</polymer-element> |
- |
-<polymer-element name="isolate-location" extends="observatory-element"> |
- <template> |
- <template if="{{ isolate.pauseEvent != null }}"> |
- <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateCreated' }}"> |
- at isolate start |
- </template> |
- <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateShutdown' }}"> |
- at isolate exit |
- </template> |
- <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateInterrupted' }}"> |
- at |
- <function-ref ref="{{ isolate.topFrame['function'] }}"> |
- </function-ref> |
- (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>) |
- </template> |
- <template if="{{ isolate.pauseEvent['eventType'] == 'BreakpointReached' }}"> |
- at breakpoint {{ isolate.pauseEvent['breakpoint']['id'] }} |
- <function-ref ref="{{ isolate.topFrame['function'] }}"> |
- </function-ref> |
- (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>) |
- </template> |
- </template> |
- |
- <template if="{{ isolate.running }}"> |
- at |
- <function-ref ref="{{ isolate.topFrame['function'] }}"> |
- </function-ref> |
- (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>) |
- </template> |
+ <br> |
+ <ul class="list-group"> |
+ <template repeat="{{ process in list['members'] }}"> |
+ <li class="list-group-item"> |
+ <io-process-ref ref="{{ process }}"></io-process-ref> |
+ </li> |
+ </template> |
+ </ul> |
+ </div> |
+ <br> |
+ <hr> |
</template> |
</polymer-element> |
-<polymer-element name="isolate-shared-summary" extends="observatory-element"> |
+<polymer-element name="io-process-ref" extends="service-ref"> |
<template> |
<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> |
- <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -9757,7 +9860,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -9930,91 +10038,16 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <template if="{{ isolate.error != null }}"> |
- <div class="content-centered"> |
- <pre class="errorBox">{{ isolate.error.message }}</pre> |
- <br> |
- </div> |
+ <template if="{{ small }}"> |
+ <a href="{{ url }}">{{ name }}</a> |
+ </template> |
+ <template if="{{ !small }}"> |
+ <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a> |
</template> |
- <div class="flex-row"> |
- <div class="flex-item-10-percent"> |
- </div> |
- <div class="flex-item-40-percent"> |
- <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart> |
- </div> |
- <div class="flex-item-40-percent"> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">new heap</div> |
- <div class="memberValue"> |
- {{ isolate.newHeapUsed | formatSize }} |
- of |
- {{ isolate.newHeapCapacity | formatSize }} |
- </div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">old heap</div> |
- <div class="memberValue"> |
- {{ isolate.oldHeapUsed | formatSize }} |
- of |
- {{ isolate.oldHeapCapacity | formatSize }} |
- </div> |
- </div> |
- </div> |
- <br> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> |
- </div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a> |
- </div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a> |
- </div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a> |
- </div> |
- </div> |
- <template if="{{ isolate.ioEnabled }}"> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a> |
- </div> |
- </div> |
- </template> |
- </div> |
- <div class="flex-item-10-percent"> |
- </div> |
- </div> |
- </template> |
-</polymer-element> |
- |
-<polymer-element name="isolate-counter-chart" extends="observatory-element"> |
- <template> |
- <div id="counterPieChart" style="height: 200px"></div> |
</template> |
</polymer-element> |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
-<polymer-element name="isolate-view" extends="observatory-element"> |
+<polymer-element name="io-process-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -10074,7 +10107,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -10247,144 +10285,62 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <style> |
- .sourceInset { |
- padding-left: 15%; |
- padding-right: 15%; |
- } |
- .miniProfileChart { |
- width: 80%; |
- } |
- </style> |
<nav-bar> |
- <top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}"> |
- </isolate-nav-menu> |
+ <top-nav-menu last="{{ true }}"></top-nav-menu> |
<nav-refresh callback="{{ refresh }}"></nav-refresh> |
</nav-bar> |
<div class="content"> |
- <h1>isolate '{{ isolate.name }}'</h1> |
- </div> |
+ <h1>Process</h1> |
- <br> |
- <div class="flex-row"> |
- <div class="flex-item-10-percent"> |
- </div> |
- <div class="flex-item-20-percent"> |
- <isolate-run-state isolate="{{ isolate }}"></isolate-run-state> |
- </div> |
- <div class="flex-item-60-percent"> |
- <isolate-location isolate="{{ isolate }}"></isolate-location> |
- </div> |
- <div class="flex-item-10-percent"> |
+ <br> |
+ |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Path</div> |
+ <div class="memberValue">{{ process['name'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Pid</div> |
+ <div class="memberValue">{{ process['pid'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Arguments</div> |
+ <div class="memberValue">{{ process['arguments'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Started</div> |
+ <div class="memberValue">{{ process['started'] }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Working Directory</div> |
+ <div class="memberValue">{{ process['workingDirectory'] }}</div> |
+ </div> |
</div> |
- </div> |
- <br> |
- <template if="{{ isolate.topFrame != null }}"> |
<br> |
- <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"> |
- </script-inset> |
- </template> |
- <div class="flex-row"> |
- <div class="flex-item-20-percent"></div> |
- <div class="flex-item-60-percent"><hr></div> |
- <div class="flex-item-20-percent"></div> |
+ <h2>Environment</h2> |
+ <div class="well"> |
+ <div class="monospace break-wrap"> |
+ <template repeat="{{ variable in process['environment'] }}"> |
+ {{ variable }} |
+ <br> |
+ </template> |
+ </div> |
+ </div> |
</div> |
- |
<br> |
+ <hr> |
+ </template> |
+</polymer-element> |
- <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary> |
- <div class="flex-row"> |
- <div class="flex-item-20-percent"></div> |
- <div class="flex-item-60-percent"><hr></div> |
- <div class="flex-item-20-percent"></div> |
- </div> |
- <div class="content-centered"> |
- <div class="flex-row"> |
- <div class="flex-item-50-percent"> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">root library</div> |
- <div class="memberValue"> |
- <library-ref ref="{{ isolate.rootLib }}"></library-ref> |
- </div> |
- </div> |
- <div class="memberItem"> |
- <template if="{{ isolate.entry != null }}"> |
- <div class="memberName">entry</div> |
- <div class="memberValue"> |
- <function-ref ref="{{ isolate.entry }}"></function-ref> |
- </div> |
- </template> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">isolate id</div> |
- <div class="memberValue">{{ isolate.mainPort }}</div> |
- </div> |
- </div> |
- </div> |
- <div class="flex-item-50-percent"> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a> |
- </div> |
- </div> |
- </div> |
- </div> |
- </div> |
- |
- <hr> |
- |
- <div class="content"> |
- libraries ({{ isolate.libraries.length }}) |
- <curly-block expand="{{ isolate.libraries.length <= 8 }}"> |
- <div class="memberList"> |
- <template repeat="{{ lib in isolate.libraries }}"> |
- <div class="memberItem"> |
- <div class="memberName"> |
- <library-ref ref="{{ lib }}"></library-ref> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block> |
- </div> |
- |
- <hr> |
- |
- <div class="content"> |
- <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div> |
- </div> |
- |
- <hr> |
- |
- <div class="content"> |
- <eval-box callback="{{ eval }}"></eval-box> |
- </div> |
- <br><br><br><br> |
- <br><br><br><br> |
- </template> |
- |
-</polymer-element> |
- |
- |
- |
- |
- |
- |
- |
- |
- |
-<polymer-element name="instance-view" extends="observatory-element"> |
- <template> |
- <style> |
+<polymer-element name="isolate-ref" extends="service-ref"> |
+<template><style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -10442,7 +10398,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -10615,182 +10576,9 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <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> |
- |
-</polymer-element> |
- |
+ <a href="{{ url }}">{{ ref.name }}</a> |
+</template> |
-<polymer-element name="json-view" extends="observatory-element"> |
- <template> |
- <nav-bar> |
- <top-nav-menu last="{{ true }}"></top-nav-menu> |
- </nav-bar> |
- <pre>{{ mapAsString }}</pre> |
- </template> |
- |
</polymer-element> |
@@ -10799,11 +10587,7 @@ hr { |
- |
- |
- |
- |
-<polymer-element name="library-view" extends="observatory-element"> |
+<polymer-element name="isolate-summary" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -10863,7 +10647,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -11036,161 +10825,105 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- |
- <nav-bar> |
- <top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu> |
- <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="content"> |
- <h1> |
- <!-- TODO(turnidge): Handle unnamed libraries --> |
- library {{ library.name }} |
- </h1> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">url</div> |
- <div class="memberValue">{{ library.url }}</div> |
- </div> |
- <template if="{{ library.name != library.vmName }}"> |
- <div class="memberItem"> |
- <div class="memberName">vm name</div> |
- <div class="memberValue">{{ library.vmName }}</div> |
- </div> |
- </template> |
+ <div class="flex-row"> |
+ <div class="flex-item-10-percent"> |
+ <img src="packages/observatory/src/elements/img/isolate_icon.png"> |
+ </div> |
+ <div class="flex-item-10-percent"> |
+ <isolate-ref ref="{{ isolate }}"></isolate-ref> |
+ </div> |
+ <div class="flex-item-20-percent"> |
+ <isolate-run-state isolate="{{ isolate }}"></isolate-run-state> |
+ </div> |
+ <div class="flex-item-50-percent"> |
+ <isolate-location isolate="{{ isolate }}"></isolate-location> |
+ </div> |
+ <div class="flex-item-10-percent"> |
</div> |
</div> |
- <hr> |
- |
- <div class="content"> |
- <template if="{{ library.imports.isNotEmpty }}"> |
- imports ({{ library.imports.length }}) |
- <curly-block expand="{{ library.imports.length <= 8 }}"> |
- <div class="memberList"> |
- <template repeat="{{ imp in library.imports }}"> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- <library-ref ref="{{ imp }}"></library-ref> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block><br> |
- <br> |
- </template> |
+ <div class="flex-row"> |
+ <div class="flex-item-20-percent"></div> |
+ <div class="flex-item-60-percent"> |
+ <hr> |
+ </div> |
+ <div class="flex-item-20-percent"></div> |
+ </div> |
- <template if="{{ library.scripts.isNotEmpty }}"> |
- scripts ({{ library.scripts.length }}) |
- <curly-block expand="{{ library.scripts.length <= 8 }}"> |
- <div class="memberList"> |
- <template repeat="{{ script in library.scripts }}"> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- <script-ref ref="{{ script }}"></script-ref> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block><br> |
- <br> |
- </template> |
+ <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary> |
- <template if="{{ library.classes.isNotEmpty }}"> |
- classes ({{ library.classes.length }}) |
- <curly-block expand="{{ library.classes.length <= 8 }}"> |
- <div class="memberList"> |
- <template repeat="{{ cls in library.classes }}"> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- <class-ref ref="{{ cls }}"></class-ref> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block><br> |
- <br> |
- </template> |
+ </template> |
+</polymer-element> |
- <template if="{{ library.variables.isNotEmpty }}"> |
- variables ({{ library.variables.length }}) |
- <curly-block expand="{{ library.variables.length <= 8 }}"> |
- <div class="memberList"> |
- <template repeat="{{ field in library.variables }}"> |
- <div class="memberItem"> |
- <div class="memberName"> |
- <field-ref ref="{{ field }}"></field-ref> |
- </div> |
- <div class="memberValue"> |
- <template if="{{ field['value'] != null }}"> |
- <instance-ref ref="{{ field['value'] }}"></instance-ref> |
- </template> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block><br> |
- <br> |
- </template> |
+<polymer-element name="isolate-run-state" extends="observatory-element"> |
+ <template> |
+ <template if="{{ isolate.pauseEvent != null }}"> |
+ <strong>paused</strong> |
+ <action-link callback="{{ resume }}" label="resume"></action-link> |
+ </template> |
- <template if="{{ library.functions.isNotEmpty }}"> |
- functions ({{ library.functions.length }}) |
- <curly-block expand="{{ library.functions.length <= 8 }}"> |
- <div class="memberList"> |
- <template repeat="{{ function in library.functions }}"> |
- <div class="memberItem"> |
- <div class="memberValue"> |
- <function-ref ref="{{ function }}"></function-ref> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block><br> |
- <br> |
- </template> |
- </div> |
+ <template if="{{ isolate.running }}"> |
+ <strong>running</strong> |
+ <action-link callback="{{ pause }}" label="pause"></action-link> |
+ </template> |
- <hr> |
+ <template if="{{ isolate.idle }}"> |
+ <strong>idle</strong> |
+ </template> |
- <div class="content"> |
- <eval-box callback="{{ eval }}"></eval-box> |
- </div> |
- <br><br><br><br> |
- <br><br><br><br> |
+ <template if="{{ isolate.loading }}"> |
+ <strong>loading...</strong> |
+ </template> |
</template> |
- |
</polymer-element> |
- |
- |
+<polymer-element name="isolate-location" extends="observatory-element"> |
+ <template> |
+ <template if="{{ isolate.pauseEvent != null }}"> |
+ <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateCreated' }}"> |
+ at isolate start |
+ </template> |
+ <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateShutdown' }}"> |
+ at isolate exit |
+ </template> |
+ <template if="{{ isolate.pauseEvent['eventType'] == 'IsolateInterrupted' }}"> |
+ at |
+ <function-ref ref="{{ isolate.topFrame['function'] }}"> |
+ </function-ref> |
+ (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>) |
+ </template> |
+ <template if="{{ isolate.pauseEvent['eventType'] == 'BreakpointReached' }}"> |
+ at breakpoint {{ isolate.pauseEvent['breakpoint']['id'] }} |
+ <function-ref ref="{{ isolate.topFrame['function'] }}"> |
+ </function-ref> |
+ (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>) |
+ </template> |
+ </template> |
- |
- |
+ <template if="{{ isolate.running }}"> |
+ at |
+ <function-ref ref="{{ isolate.topFrame['function'] }}"> |
+ </function-ref> |
+ (<script-ref ref="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"></script-ref>) |
+ </template> |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
+ </template> |
+</polymer-element> |
- |
- |
- |
-<polymer-element name="heap-profile" extends="observatory-element"> |
-<template> |
- <style> |
+<polymer-element name="isolate-shared-summary" extends="observatory-element"> |
+ <template> |
+ <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> |
+ <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -11248,7 +10981,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -11421,209 +11159,91 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <style> |
- .table { |
- border-collapse: collapse!important; |
- width: 100%; |
- margin-bottom: 20px |
- table-layout: fixed; |
- } |
- .table td:nth-of-type(1) { |
- width: 30%; |
- } |
- .th, .td { |
- padding: 8px; |
- vertical-align: top; |
- } |
- .table thead > tr > th { |
- vertical-align: bottom; |
- text-align: left; |
- border-bottom:2px solid #ddd; |
- } |
- .clickable { |
- color: #0489c3; |
- text-decoration: none; |
- cursor: pointer; |
- } |
- .clickable:hover { |
- text-decoration: underline; |
- cursor: pointer; |
- } |
- #classtable tr:hover > td { |
- background-color: #F4C7C3; |
- } |
- </style> |
- <nav-bar> |
- <top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu> |
- <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu> |
- <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh> |
- <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh> |
- <nav-refresh callback="{{ refresh }}"></nav-refresh> |
- </nav-bar> |
- |
- <div class="flex-row"> |
- <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px"> |
- </div> |
- <div id="newStatus" class="flex-item-fixed-2-12"> |
- <div class="memberList"> |
+ <template if="{{ isolate.error != null }}"> |
+ <div class="content-centered"> |
+ <pre class="errorBox">{{ isolate.error.message }}</pre> |
+ <br> |
+ </div> |
+ </template> |
+ <div class="flex-row"> |
+ <div class="flex-item-10-percent"> |
+ </div> |
+ <div class="flex-item-40-percent"> |
+ <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart> |
+ </div> |
+ <div class="flex-item-40-percent"> |
+ <div class="memberList"> |
<div class="memberItem"> |
- <div class="memberName">Collections</div> |
- <div class="memberValue">{{ formattedCollections(true) }}</div> |
+ <div class="memberName">new heap</div> |
+ <div class="memberValue"> |
+ {{ isolate.newHeapUsed | formatSize }} |
+ of |
+ {{ isolate.newHeapCapacity | formatSize }} |
+ </div> |
</div> |
<div class="memberItem"> |
- <div class="memberName">Average Collection Time</div> |
- <div class="memberValue">{{ formattedAverage(true) }}</div> |
+ <div class="memberName">old heap</div> |
+ <div class="memberValue"> |
+ {{ isolate.oldHeapUsed | formatSize }} |
+ of |
+ {{ isolate.oldHeapCapacity | formatSize }} |
+ </div> |
</div> |
- <div class="memberItem"> |
- <div class="memberName">Cumulative Collection Time</div> |
- <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div> |
+ </div> |
+ <br> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a> |
</div> |
- </div> |
- </div> |
- <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px"> |
- </div> |
- <div id="oldStatus" class="flex-item-fixed-2-12"> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Collections</div> |
- <div class="memberValue">{{ formattedCollections(false) }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a> |
</div> |
- <div class="memberItem"> |
- <div class="memberName">Average Collection Time</div> |
- <div class="memberValue">{{ formattedAverage(false) }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a> |
</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a> |
+ </div> |
+ </div> |
+ <template if="{{ isolate.ioEnabled }}"> |
<div class="memberItem"> |
- <div class="memberName">Cumulative Collection Time</div> |
- <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div> |
+ <div class="memberValue"> |
+ See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a> |
+ </div> |
</div> |
+ </template> |
+ </div> |
+ <div class="flex-item-10-percent"> |
</div> |
</div> |
- </div> |
- <div class="flex-row"> |
- <table id="classtable" class="flex-item-fixed-12-12 table"> |
- <thead> |
- <tr> |
- <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th> |
- <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th> |
- </tr> |
- </thead> |
- <tbody> |
- <tr template="" repeat="{{row in classTable.sortedRows }}"> |
- <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td> |
- <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td> |
- <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td> |
- <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td> |
- <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td> |
- <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td> |
- <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td> |
- <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td> |
- <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td> |
- </tr> |
- </tbody> |
- </table> |
- </div> |
-</template> |
+ </template> |
+</polymer-element> |
+<polymer-element name="isolate-counter-chart" extends="observatory-element"> |
+ <template> |
+ <div id="counterPieChart" style="height: 200px"></div> |
+ </template> |
</polymer-element> |
+ |
+ |
-<polymer-element name="sliding-checkbox"> |
- <template> |
- <style> |
- .switch { |
- position: relative; |
- width: 121px; |
- -webkit-user-select: none; |
- -moz-user-select: none; |
- -ms-user-select: none; |
- } |
- .hide { |
- display: none; |
- } |
- .label { |
- display: block; |
- overflow: hidden; |
- cursor: pointer; |
- border: 2px solid #999999; |
- border-radius: 15px; |
- } |
- .content { |
- width: 200%; |
- margin-left: -100%; |
- -moz-transition: margin 0.3s ease-in 0s; |
- -webkit-transition: margin 0.3s ease-in 0s; |
- -o-transition: margin 0.3s ease-in 0s; |
- transition: margin 0.3s ease-in 0s; |
- } |
- .content:before, .content:after { |
- float: left; |
- width: 50%; |
- height: 30px; |
- padding: 0; |
- line-height: 30px; |
- color: white; |
- font: 400 14px 'Montserrat', sans-serif; |
- -moz-box-sizing: border-box; |
- -webkit-box-sizing: border-box; |
- box-sizing: border-box; |
- } |
- .content:before { |
- content: {{ checkedText }}; |
- padding-left: 10px; |
- background-color: #0489C3; |
- } |
- .content:after { |
- content: {{ uncheckedText }}; |
- padding-right: 10px; |
- background-color: #EEEEEE; |
- color: #999999; |
- text-align: right; |
- } |
- .dot { |
- width: 14px; |
- margin: 8px; |
- background: #FFFFFF; |
- border: 2px solid #999999; |
- border-radius: 15px; |
- position: absolute; |
- top: 0; |
- bottom: 0; |
- right: 87px; |
- -moz-transition: all 0.3s ease-in 0s; |
- -webkit-transition: all 0.3s ease-in 0s; |
- -o-transition: all 0.3s ease-in 0s; |
- transition: all 0.3s ease-in 0s; |
- } |
- :checked + .label .content { |
- margin-left: 0; |
- } |
- :checked + .label .dot { |
- right: 0px; |
- } |
- </style> |
- <div class="switch"> |
- <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}"> |
- <label class="label" for="slide-switch"> |
- <div class="content"></div> |
- <div class="dot"></div> |
- </label> |
- </div> |
- </template> |
-</polymer-element> |
-<polymer-element name="isolate-profile" extends="observatory-element"> |
+ |
+ |
+ |
+ |
+<polymer-element name="isolate-view" extends="observatory-element"> |
<template> |
<style> |
/* Global styles */ |
@@ -11683,7 +11303,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -11856,191 +11481,1400 @@ hr { |
word-wrap: break-word; |
} |
</style> |
+ <style> |
+ .sourceInset { |
+ padding-left: 15%; |
+ padding-right: 15%; |
+ } |
+ .miniProfileChart { |
+ width: 80%; |
+ } |
+ </style> |
+ |
<nav-bar> |
<top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu> |
- <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu> |
+ <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}"> |
+ </isolate-nav-menu> |
<nav-refresh callback="{{ refresh }}"></nav-refresh> |
</nav-bar> |
- <style> |
- .table { |
- border-collapse: collapse!important; |
- width: 100%; |
- margin-bottom: 20px |
- } |
- .table thead > tr > th, |
- .table tbody > tr > th, |
- .table tfoot > tr > th, |
- .table thead > tr > td, |
- .table tbody > tr > td, |
- .table tfoot > tr > td { |
- padding: 8px; |
- vertical-align: top; |
- } |
- .table thead > tr > th { |
- vertical-align: bottom; |
- text-align: left; |
- border-bottom:2px solid #ddd; |
- } |
- tr:hover > td { |
- background-color: #FFF3E3; |
- } |
- .rowColor0 { |
- background-color: #FFE9CC; |
- } |
- .rowColor1 { |
- background-color: #FFDEB2; |
- } |
- .rowColor2 { |
- background-color: #FFD399; |
+ <div class="content"> |
+ <h1>isolate '{{ isolate.name }}'</h1> |
+ </div> |
+ |
+ <br> |
+ <div class="flex-row"> |
+ <div class="flex-item-10-percent"> |
+ </div> |
+ <div class="flex-item-20-percent"> |
+ <isolate-run-state isolate="{{ isolate }}"></isolate-run-state> |
+ </div> |
+ <div class="flex-item-60-percent"> |
+ <isolate-location isolate="{{ isolate }}"></isolate-location> |
+ </div> |
+ <div class="flex-item-10-percent"> |
+ </div> |
+ </div> |
+ <br> |
+ |
+ <template if="{{ isolate.topFrame != null }}"> |
+ <br> |
+ <script-inset script="{{ isolate.topFrame['script'] }}" pos="{{ isolate.topFrame['tokenPos'] }}"> |
+ </script-inset> |
+ </template> |
+ |
+ <div class="flex-row"> |
+ <div class="flex-item-20-percent"></div> |
+ <div class="flex-item-60-percent"><hr></div> |
+ <div class="flex-item-20-percent"></div> |
+ </div> |
+ |
+ <br> |
+ |
+ <isolate-shared-summary isolate="{{ isolate }}"></isolate-shared-summary> |
+ |
+ <div class="flex-row"> |
+ <div class="flex-item-20-percent"></div> |
+ <div class="flex-item-60-percent"><hr></div> |
+ <div class="flex-item-20-percent"></div> |
+ </div> |
+ |
+ <div class="content-centered"> |
+ <div class="flex-row"> |
+ <div class="flex-item-50-percent"> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">root library</div> |
+ <div class="memberValue"> |
+ <library-ref ref="{{ isolate.rootLib }}"></library-ref> |
+ </div> |
+ </div> |
+ <div class="memberItem"> |
+ <template if="{{ isolate.entry != null }}"> |
+ <div class="memberName">entry</div> |
+ <div class="memberValue"> |
+ <function-ref ref="{{ isolate.entry }}"></function-ref> |
+ </div> |
+ </template> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">isolate id</div> |
+ <div class="memberValue">{{ isolate.mainPort }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ <div class="flex-item-50-percent"> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a> |
+ </div> |
+ </div> |
+ </div> |
+ </div> |
+ </div> |
+ |
+ <hr> |
+ |
+ <div class="content"> |
+ libraries ({{ isolate.libraries.length }}) |
+ <curly-block expand="{{ isolate.libraries.length <= 8 }}"> |
+ <div class="memberList"> |
+ <template repeat="{{ lib in isolate.libraries }}"> |
+ <div class="memberItem"> |
+ <div class="memberName"> |
+ <library-ref ref="{{ lib }}"></library-ref> |
+ </div> |
+ </div> |
+ </template> |
+ </div> |
+ </curly-block> |
+ </div> |
+ |
+ <hr> |
+ |
+ <div class="content"> |
+ <div id="tagProfileChart" class="miniProfileChart" style="height: 600px"></div> |
+ </div> |
+ |
+ <hr> |
+ |
+ <div class="content"> |
+ <eval-box callback="{{ eval }}"></eval-box> |
+ </div> |
+ <br><br><br><br> |
+ <br><br><br><br> |
+ </template> |
+ |
+</polymer-element> |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+<polymer-element name="instance-view" extends="observatory-element"> |
+ <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; |
+} |
+ |
+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; |
+} |
+ |
+.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-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> |
+ <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> |
+ |
+</polymer-element> |
+ |
+ |
+<polymer-element name="json-view" extends="observatory-element"> |
+ <template> |
+ <nav-bar> |
+ <top-nav-menu last="{{ true }}"></top-nav-menu> |
+ </nav-bar> |
+ <pre>{{ mapAsString }}</pre> |
+ </template> |
+ |
+</polymer-element> |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+<polymer-element name="library-view" extends="observatory-element"> |
+ <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; |
+} |
+ |
+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; |
+} |
+ |
+.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-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> |
+ |
+ <nav-bar> |
+ <top-nav-menu></top-nav-menu> |
+ <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu> |
+ <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ |
+ <div class="content"> |
+ <h1> |
+ <!-- TODO(turnidge): Handle unnamed libraries --> |
+ library {{ library.name }} |
+ </h1> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">url</div> |
+ <div class="memberValue">{{ library.url }}</div> |
+ </div> |
+ <template if="{{ library.name != library.vmName }}"> |
+ <div class="memberItem"> |
+ <div class="memberName">vm name</div> |
+ <div class="memberValue">{{ library.vmName }}</div> |
+ </div> |
+ </template> |
+ </div> |
+ </div> |
+ |
+ <hr> |
+ |
+ <div class="content"> |
+ <template if="{{ library.imports.isNotEmpty }}"> |
+ imports ({{ library.imports.length }}) |
+ <curly-block expand="{{ library.imports.length <= 8 }}"> |
+ <div class="memberList"> |
+ <template repeat="{{ imp in library.imports }}"> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ <library-ref ref="{{ imp }}"></library-ref> |
+ </div> |
+ </div> |
+ </template> |
+ </div> |
+ </curly-block><br> |
+ <br> |
+ </template> |
+ |
+ <template if="{{ library.scripts.isNotEmpty }}"> |
+ scripts ({{ library.scripts.length }}) |
+ <curly-block expand="{{ library.scripts.length <= 8 }}"> |
+ <div class="memberList"> |
+ <template repeat="{{ script in library.scripts }}"> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ <script-ref ref="{{ script }}"></script-ref> |
+ </div> |
+ </div> |
+ </template> |
+ </div> |
+ </curly-block><br> |
+ <br> |
+ </template> |
+ |
+ <template if="{{ library.classes.isNotEmpty }}"> |
+ classes ({{ library.classes.length }}) |
+ <curly-block expand="{{ library.classes.length <= 8 }}"> |
+ <div class="memberList"> |
+ <template repeat="{{ cls in library.classes }}"> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ <class-ref ref="{{ cls }}"></class-ref> |
+ </div> |
+ </div> |
+ </template> |
+ </div> |
+ </curly-block><br> |
+ <br> |
+ </template> |
+ |
+ <template if="{{ library.variables.isNotEmpty }}"> |
+ variables ({{ library.variables.length }}) |
+ <curly-block expand="{{ library.variables.length <= 8 }}"> |
+ <div class="memberList"> |
+ <template repeat="{{ field in library.variables }}"> |
+ <div class="memberItem"> |
+ <div class="memberName"> |
+ <field-ref ref="{{ field }}"></field-ref> |
+ </div> |
+ <div class="memberValue"> |
+ <template if="{{ field['value'] != null }}"> |
+ <instance-ref ref="{{ field['value'] }}"></instance-ref> |
+ </template> |
+ </div> |
+ </div> |
+ </template> |
+ </div> |
+ </curly-block><br> |
+ <br> |
+ </template> |
+ |
+ <template if="{{ library.functions.isNotEmpty }}"> |
+ functions ({{ library.functions.length }}) |
+ <curly-block expand="{{ library.functions.length <= 8 }}"> |
+ <div class="memberList"> |
+ <template repeat="{{ function in library.functions }}"> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ <function-ref ref="{{ function }}"></function-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> |
+ |
+</polymer-element> |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
+<polymer-element name="heap-profile" extends="observatory-element"> |
+<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; |
+} |
+ |
+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; |
+} |
+ |
+.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-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> |
+ .table { |
+ border-collapse: collapse!important; |
+ width: 100%; |
+ margin-bottom: 20px |
+ table-layout: fixed; |
+ } |
+ .table td:nth-of-type(1) { |
+ width: 30%; |
+ } |
+ .th, .td { |
+ padding: 8px; |
+ vertical-align: top; |
+ } |
+ .table thead > tr > th { |
+ vertical-align: bottom; |
+ text-align: left; |
+ border-bottom:2px solid #ddd; |
+ } |
+ .clickable { |
+ color: #0489c3; |
+ text-decoration: none; |
+ cursor: pointer; |
+ } |
+ .clickable:hover { |
+ text-decoration: underline; |
+ cursor: pointer; |
+ } |
+ #classtable tr:hover > td { |
+ background-color: #F4C7C3; |
+ } |
+ </style> |
+ <nav-bar> |
+ <top-nav-menu></top-nav-menu> |
+ <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu> |
+ <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu> |
+ <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh> |
+ <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ |
+ <div class="flex-row"> |
+ <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px"> |
+ </div> |
+ <div id="newStatus" class="flex-item-fixed-2-12"> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Collections</div> |
+ <div class="memberValue">{{ formattedCollections(true) }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Average Collection Time</div> |
+ <div class="memberValue">{{ formattedAverage(true) }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Cumulative Collection Time</div> |
+ <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px"> |
+ </div> |
+ <div id="oldStatus" class="flex-item-fixed-2-12"> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Collections</div> |
+ <div class="memberValue">{{ formattedCollections(false) }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Average Collection Time</div> |
+ <div class="memberValue">{{ formattedAverage(false) }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Cumulative Collection Time</div> |
+ <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ </div> |
+ <div class="flex-row"> |
+ <table id="classtable" class="flex-item-fixed-12-12 table"> |
+ <thead> |
+ <tr> |
+ <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th> |
+ <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th> |
+ </tr> |
+ </thead> |
+ <tbody> |
+ <tr template="" repeat="{{row in classTable.sortedRows }}"> |
+ <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td> |
+ <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td> |
+ <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td> |
+ <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td> |
+ <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td> |
+ <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td> |
+ <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td> |
+ <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td> |
+ <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td> |
+ </tr> |
+ </tbody> |
+ </table> |
+ </div> |
+</template> |
+ |
+</polymer-element> |
+ |
+ |
+ |
+ |
+ |
+ |
+<polymer-element name="sliding-checkbox"> |
+ <template> |
+ <style> |
+ .switch { |
+ position: relative; |
+ width: 121px; |
+ -webkit-user-select: none; |
+ -moz-user-select: none; |
+ -ms-user-select: none; |
} |
- .rowColor3 { |
- background-color: #FFC87F; |
+ .hide { |
+ display: none; |
} |
- .rowColor4 { |
- background-color: #FFBD66; |
+ .label { |
+ display: block; |
+ overflow: hidden; |
+ cursor: pointer; |
+ border: 2px solid #999999; |
+ border-radius: 15px; |
} |
- .rowColor5 { |
- background-color: #FFB24C; |
+ .content { |
+ width: 200%; |
+ margin-left: -100%; |
+ -moz-transition: margin 0.3s ease-in 0s; |
+ -webkit-transition: margin 0.3s ease-in 0s; |
+ -o-transition: margin 0.3s ease-in 0s; |
+ transition: margin 0.3s ease-in 0s; |
} |
- .rowColor6 { |
- background-color: #FFA733; |
+ .content:before, .content:after { |
+ float: left; |
+ width: 50%; |
+ height: 30px; |
+ padding: 0; |
+ line-height: 30px; |
+ color: white; |
+ font: 400 14px 'Montserrat', sans-serif; |
+ -moz-box-sizing: border-box; |
+ -webkit-box-sizing: border-box; |
+ box-sizing: border-box; |
} |
- .rowColor7 { |
- background-color: #FF9C19; |
+ .content:before { |
+ content: {{ checkedText }}; |
+ padding-left: 10px; |
+ background-color: #0489C3; |
} |
- .rowColor8 { |
- background-color: #FF9100; |
+ .content:after { |
+ content: {{ uncheckedText }}; |
+ padding-right: 10px; |
+ background-color: #EEEEEE; |
+ color: #999999; |
+ text-align: right; |
} |
- |
- .tooltip { |
- display: block; |
+ .dot { |
+ width: 14px; |
+ margin: 8px; |
+ background: #FFFFFF; |
+ border: 2px solid #999999; |
+ border-radius: 15px; |
position: absolute; |
- visibility: hidden; |
- opacity: 0; |
- transition: visibility 0s linear 0.5s; |
- transition: opacity .4s ease-in-out; |
+ top: 0; |
+ bottom: 0; |
+ right: 87px; |
+ -moz-transition: all 0.3s ease-in 0s; |
+ -webkit-transition: all 0.3s ease-in 0s; |
+ -o-transition: all 0.3s ease-in 0s; |
+ transition: all 0.3s ease-in 0s; |
} |
- |
- tr:hover .tooltip { |
- display: block; |
- position: absolute; |
- top: 100%; |
- right: 100%; |
- visibility: visible; |
- z-index: 999; |
- width: 400px; |
- color: #ffffff; |
- background-color: #0489c3; |
- border-top-right-radius: 8px; |
- border-top-left-radius: 8px; |
- border-bottom-right-radius: 8px; |
- border-bottom-left-radius: 8px; |
- transition: visibility 0s linear 0.5s; |
- transition: opacity .4s ease-in-out; |
- opacity: 1; |
+ :checked + .label .content { |
+ margin-left: 0; |
} |
- |
- .white { |
- color: #ffffff; |
+ :checked + .label .dot { |
+ right: 0px; |
} |
- |
</style> |
- <div class="content"> |
- <h1>Sampled CPU profile</h1> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName">Timestamp</div> |
- <div class="memberValue">{{ refreshTime }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Time span</div> |
- <div class="memberValue">{{ timeSpan }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Sample count</div> |
- <div class="memberValue">{{ sampleCount }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Sample rate</div> |
- <div class="memberValue">{{ sampleRate }} Hz</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Sample depth</div> |
- <div class="memberValue">{{ sampleDepth }} stack frames</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Display cutoff</div> |
- <div class="memberValue">{{ displayCutoff }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName">Tags</div> |
- <div class="memberValue"> |
- <select value="{{tagSelector}}"> |
- <option value="uv">User > VM</option> |
- <option value="u">User</option> |
- <option value="vu">VM > User</option> |
- <option value="v">VM</option> |
- <option value="hide">None</option> |
- </select> |
- </div> |
- </div> |
- </div> |
- <hr> |
- <table id="tableTree" class="table"> |
- <thead> |
- <tr> |
- <th>Method</th> |
- <th>Self</th> |
- </tr> |
- </thead> |
- <tbody> |
- <tr template="" repeat="{{row in tree.rows }}" style="{{}}"> |
- <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}"> |
- <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span> |
- <div style="position: relative;display: inline"> |
- {{row.columns[0]}} |
- </div> |
- <code-ref ref="{{ row.code }}"></code-ref> |
- </td> |
- <td class="{{ coloring(row) }}" style="position: relative"> |
- {{row.columns[1]}} |
- <div class="tooltip"> |
- <div class="memberList"> |
- <div class="memberItem"> |
- <div class="memberName white">Kind</div> |
- <div class="memberValue white">{{ row.tipKind }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName white">Percent of Parent</div> |
- <div class="memberValue white">{{ row.tipParent }}</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName white">Sample Count</div> |
- <div class="memberValue white">{{ row.tipTicks }} ({{ row.tipExclusive }})</div> |
- </div> |
- <div class="memberItem"> |
- <div class="memberName white">Approximate Execution Time</div> |
- <div class="memberValue white">{{ row.tipTime }}</div> |
- </div> |
- </div> |
- </div> |
- </td> |
- </tr> |
- </tbody> |
- </table> |
+ <div class="switch"> |
+ <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}"> |
+ <label class="label" for="slide-switch"> |
+ <div class="content"></div> |
+ <div class="dot"></div> |
+ </label> |
</div> |
</template> |
</polymer-element> |
- |
- |
- |
- |
-<polymer-element name="script-view" extends="observatory-element"> |
-<template> |
- <style> |
+<polymer-element name="isolate-profile" extends="observatory-element"> |
+ <template> |
+ <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -12098,7 +12932,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -12267,44 +13106,195 @@ hr { |
box-shadow: inset 0 1px 1px rgba(0,0,0,0.05); |
} |
-.break-wrap { |
- word-wrap: break-word; |
-} |
-</style> |
- <nav-bar> |
- <top-nav-menu></top-nav-menu> |
- <isolate-nav-menu isolate="{{ script.isolate }}"> |
- </isolate-nav-menu> |
- <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}"> |
- <li> |
- <input type="checkbox" checked="{{ showCoverage }}"> |
- <label>Show Coverage Data</label> |
- </li> |
- </nav-menu> |
- <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh> |
- <nav-refresh callback="{{ refresh }}"> |
- </nav-refresh> |
- </nav-bar> |
+.break-wrap { |
+ word-wrap: break-word; |
+} |
+</style> |
+ <nav-bar> |
+ <top-nav-menu></top-nav-menu> |
+ <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu> |
+ <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu> |
+ <nav-refresh callback="{{ refresh }}"></nav-refresh> |
+ </nav-bar> |
+ <style> |
+ .table { |
+ border-collapse: collapse!important; |
+ width: 100%; |
+ margin-bottom: 20px |
+ } |
+ .table thead > tr > th, |
+ .table tbody > tr > th, |
+ .table tfoot > tr > th, |
+ .table thead > tr > td, |
+ .table tbody > tr > td, |
+ .table tfoot > tr > td { |
+ padding: 8px; |
+ vertical-align: top; |
+ } |
+ .table thead > tr > th { |
+ vertical-align: bottom; |
+ text-align: left; |
+ border-bottom:2px solid #ddd; |
+ } |
+ |
+ tr:hover > td { |
+ background-color: #FFF3E3; |
+ } |
+ .rowColor0 { |
+ background-color: #FFE9CC; |
+ } |
+ .rowColor1 { |
+ background-color: #FFDEB2; |
+ } |
+ .rowColor2 { |
+ background-color: #FFD399; |
+ } |
+ .rowColor3 { |
+ background-color: #FFC87F; |
+ } |
+ .rowColor4 { |
+ background-color: #FFBD66; |
+ } |
+ .rowColor5 { |
+ background-color: #FFB24C; |
+ } |
+ .rowColor6 { |
+ background-color: #FFA733; |
+ } |
+ .rowColor7 { |
+ background-color: #FF9C19; |
+ } |
+ .rowColor8 { |
+ background-color: #FF9100; |
+ } |
- <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endpos="{{ script.lastTokenPos }}"> |
- <h1>script {{ script.name }}</h1> |
- </script-inset> |
-</template> |
+ .tooltip { |
+ display: block; |
+ position: absolute; |
+ visibility: hidden; |
+ opacity: 0; |
+ transition: visibility 0s linear 0.5s; |
+ transition: opacity .4s ease-in-out; |
+ } |
-</polymer-element> |
+ tr:hover .tooltip { |
+ display: block; |
+ position: absolute; |
+ top: 100%; |
+ right: 100%; |
+ visibility: visible; |
+ z-index: 999; |
+ width: 400px; |
+ color: #ffffff; |
+ background-color: #0489c3; |
+ border-top-right-radius: 8px; |
+ border-top-left-radius: 8px; |
+ border-bottom-right-radius: 8px; |
+ border-bottom-left-radius: 8px; |
+ transition: visibility 0s linear 0.5s; |
+ transition: opacity .4s ease-in-out; |
+ opacity: 1; |
+ } |
- |
- |
- |
+ .white { |
+ color: #ffffff; |
+ } |
+ </style> |
+ <div class="content"> |
+ <h1>Sampled CPU profile</h1> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName">Timestamp</div> |
+ <div class="memberValue">{{ refreshTime }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Time span</div> |
+ <div class="memberValue">{{ timeSpan }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Sample count</div> |
+ <div class="memberValue">{{ sampleCount }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Sample rate</div> |
+ <div class="memberValue">{{ sampleRate }} Hz</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Sample depth</div> |
+ <div class="memberValue">{{ sampleDepth }} stack frames</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Display cutoff</div> |
+ <div class="memberValue">{{ displayCutoff }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName">Tags</div> |
+ <div class="memberValue"> |
+ <select value="{{tagSelector}}"> |
+ <option value="uv">User > VM</option> |
+ <option value="u">User</option> |
+ <option value="vu">VM > User</option> |
+ <option value="v">VM</option> |
+ <option value="hide">None</option> |
+ </select> |
+ </div> |
+ </div> |
+ </div> |
+ <hr> |
+ <table id="tableTree" class="table"> |
+ <thead> |
+ <tr> |
+ <th>Method</th> |
+ <th>Self</th> |
+ </tr> |
+ </thead> |
+ <tbody> |
+ <tr template="" repeat="{{row in tree.rows }}" style="{{}}"> |
+ <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}"> |
+ <span id="expand" style="{{ row.expanderStyle }}">{{ row.expander }}</span> |
+ <div style="position: relative;display: inline"> |
+ {{row.columns[0]}} |
+ </div> |
+ <code-ref ref="{{ row.code }}"></code-ref> |
+ </td> |
+ <td class="{{ coloring(row) }}" style="position: relative"> |
+ {{row.columns[1]}} |
+ <div class="tooltip"> |
+ <div class="memberList"> |
+ <div class="memberItem"> |
+ <div class="memberName white">Kind</div> |
+ <div class="memberValue white">{{ row.tipKind }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName white">Percent of Parent</div> |
+ <div class="memberValue white">{{ row.tipParent }}</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName white">Sample Count</div> |
+ <div class="memberValue white">{{ row.tipTicks }} ({{ row.tipExclusive }})</div> |
+ </div> |
+ <div class="memberItem"> |
+ <div class="memberName white">Approximate Execution Time</div> |
+ <div class="memberValue white">{{ row.tipTime }}</div> |
+ </div> |
+ </div> |
+ </div> |
+ </td> |
+ </tr> |
+ </tbody> |
+ </table> |
+ </div> |
+ </template> |
+</polymer-element> |
+ |
- |
-<polymer-element name="stack-frame" extends="observatory-element"> |
- <template> |
- <style> |
+<polymer-element name="script-view" extends="observatory-element"> |
+<template> |
+ <style> |
/* Global styles */ |
* { |
margin: 0; |
@@ -12362,7 +13352,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -12535,36 +13530,31 @@ hr { |
word-wrap: break-word; |
} |
</style> |
- <div class="flex-row"> |
- <div class="flex-item-fixed-1-12"> |
- </div> |
- <div class="flex-item-fixed-1-12"> |
- #{{ frame['depth'] }} |
- </div> |
- <div class="flex-item-fixed-9-12"> |
- <function-ref ref="{{ frame['function'] }}"></function-ref> |
- ( <script-ref ref="{{ frame['script'] }}" pos="{{ frame['tokenPos'] }}"> |
- </script-ref> ) |
+ <nav-bar> |
+ <top-nav-menu></top-nav-menu> |
+ <isolate-nav-menu isolate="{{ script.isolate }}"> |
+ </isolate-nav-menu> |
+ <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}"> |
+ <li> |
+ <input type="checkbox" checked="{{ showCoverage }}"> |
+ <label>Show Coverage Data</label> |
+ </li> |
+ </nav-menu> |
+ <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh> |
+ <nav-refresh callback="{{ refresh }}"> |
+ </nav-refresh> |
+ </nav-bar> |
+ |
+ <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endpos="{{ script.lastTokenPos }}"> |
+ <h1>script {{ script.name }}</h1> |
+ </script-inset> |
+</template> |
- <curly-block> |
- <div class="memberList"> |
- <template repeat="{{ v in frame['vars'] }}"> |
- <div class="memberItem"> |
- <div class="memberName">{{ v['name']}}</div> |
- <div class="memberValue"> |
- <instance-ref ref="{{ v['value'] }}"></instance-ref> |
- </div> |
- </div> |
- </template> |
- </div> |
- </curly-block> |
- </div> |
- <div class="flex-item-fixed-1-12"> |
- </div> |
- </div> |
- </template> |
- |
</polymer-element> |
+ |
+ |
+ |
+ |
<polymer-element name="stack-trace" extends="observatory-element"> |
<template> |
<style> |
@@ -12625,7 +13615,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -12890,7 +13885,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -13088,6 +14088,12 @@ hr { |
<div class="memberName">asserts enabled</div> |
<div class="memberValue">{{ vm.assertsEnabled }}</div> |
</div> |
+ <br> |
+ <div class="memberItem"> |
+ <div class="memberValue"> |
+ See <a href="#/flags">flags</a> |
+ </div> |
+ </div> |
</div> |
</div> |
@@ -13184,7 +14190,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -13434,7 +14445,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |
@@ -13679,7 +14695,12 @@ a:hover { |
em { |
color: inherit; |
- font-style:italic; |
+ font-style: italic; |
+} |
+ |
+b { |
+ color: inherit; |
+ font-weight: bold; |
} |
hr { |