<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[189833] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/189833">189833</a></dd>
<dt>Author</dt> <dd>bfulgham@apple.com</dd>
<dt>Date</dt> <dd>2015-09-15 18:00:32 -0700 (Tue, 15 Sep 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Win] Provide a means for viewing the layer tree
https://bugs.webkit.org/show_bug.cgi?id=149165

Reviewed by Simon Fraser.

Source/WebCore:

Revise the old fprintf logic to generate a string
containing the layer tree so that it can be output
to the debugger (or elsewhere).

* platform/graphics/ca/PlatformCALayer.h: Rename 'printTree'
to 'printLayerTree', and make it available in release builds.
* platform/graphics/ca/win/CACFLayerTreeHost.cpp:
(WebCore::CACFLayerTreeHost::printLayerTree): Added. Calls into
the PlatformCALayer implementation.
* platform/graphics/ca/win/CACFLayerTreeHost.h:
* platform/graphics/ca/win/PlatformCALayerWin.cpp:
(printIndent): Revise to use two-space indent and use StringBuilder.
(printTransform): Ditto.
(printColor): Added helper function.
(printLayer): Revised to output information on the layer contents.
(PlatformCALayerWin::printLayerTree): Renamed from 'printTree'.
(PlatformCALayerWin::printTree): Deleted.
* platform/graphics/ca/win/PlatformCALayerWinInternal.cpp:
(PlatformCALayerWinInternal::drawRepaintCounters): Drive-by fix. Match the
cocoa repaint counter logic by not painting counters for the layers that
contain the tile grid.
* platform/graphics/ca/win/PlatformCALayerWin.h:
* platform/graphics/ca/win/PlatformCALayerWinInternal.cpp:
(PlatformCALayerWinInternal::drawRepaintCounters):

Source/WebKit/win:

Add a new WebView method &quot;printLayerTree&quot; so that clients
can get a string dump of the current layer tree. Add this
to a new COM interface version so no existing clients break
compatibility.
        
* Interfaces/IWebViewPrivate.idl:
* WebView.cpp:
(WebView::QueryInterface): Recognize the new interface version.
(WebView::printLayerTree): Added. This just calls the WebCore
implementation.
* WebView.h:

Tools:

Update MiniBrowser with a new Debug menu option that will
dump the current layer tree to the debug console.
        
* MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLib.rc:
* MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLibResource.h:
* MiniBrowser/win/Common.cpp:
(WndProc): Add handler for 'Print Layer Tree' menu option.
* MiniBrowser/win/MiniBrowser.cpp:
(MiniBrowser::printLayerTree): Added Handler.
* MiniBrowser/win/MiniBrowser.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscaPlatformCALayerh">trunk/Source/WebCore/platform/graphics/ca/PlatformCALayer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscawinCACFLayerTreeHostcpp">trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscawinCACFLayerTreeHosth">trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscawinPlatformCALayerWincpp">trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscawinPlatformCALayerWinh">trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicscawinPlatformCALayerWinInternalcpp">trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWinInternal.cpp</a></li>
<li><a href="#trunkSourceWebKitwinChangeLog">trunk/Source/WebKit/win/ChangeLog</a></li>
<li><a href="#trunkSourceWebKitwinInterfacesIWebViewPrivateidl">trunk/Source/WebKit/win/Interfaces/IWebViewPrivate.idl</a></li>
<li><a href="#trunkSourceWebKitwinWebViewcpp">trunk/Source/WebKit/win/WebView.cpp</a></li>
<li><a href="#trunkSourceWebKitwinWebViewh">trunk/Source/WebKit/win/WebView.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsMiniBrowserMiniBrowservcxprojMiniBrowserLibrc">trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLib.rc</a></li>
<li><a href="#trunkToolsMiniBrowserMiniBrowservcxprojMiniBrowserLibResourceh">trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLibResource.h</a></li>
<li><a href="#trunkToolsMiniBrowserwinCommoncpp">trunk/Tools/MiniBrowser/win/Common.cpp</a></li>
<li><a href="#trunkToolsMiniBrowserwinMiniBrowsercpp">trunk/Tools/MiniBrowser/win/MiniBrowser.cpp</a></li>
<li><a href="#trunkToolsMiniBrowserwinMiniBrowserh">trunk/Tools/MiniBrowser/win/MiniBrowser.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/ChangeLog        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -1,3 +1,35 @@
</span><ins>+2015-09-15  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Win] Provide a means for viewing the layer tree
+        https://bugs.webkit.org/show_bug.cgi?id=149165
+
+        Reviewed by Simon Fraser.
+
+        Revise the old fprintf logic to generate a string
+        containing the layer tree so that it can be output
+        to the debugger (or elsewhere).
+
+        * platform/graphics/ca/PlatformCALayer.h: Rename 'printTree'
+        to 'printLayerTree', and make it available in release builds.
+        * platform/graphics/ca/win/CACFLayerTreeHost.cpp:
+        (WebCore::CACFLayerTreeHost::printLayerTree): Added. Calls into
+        the PlatformCALayer implementation.
+        * platform/graphics/ca/win/CACFLayerTreeHost.h:
+        * platform/graphics/ca/win/PlatformCALayerWin.cpp:
+        (printIndent): Revise to use two-space indent and use StringBuilder.
+        (printTransform): Ditto.
+        (printColor): Added helper function.
+        (printLayer): Revised to output information on the layer contents.
+        (PlatformCALayerWin::printLayerTree): Renamed from 'printTree'.
+        (PlatformCALayerWin::printTree): Deleted.
+        * platform/graphics/ca/win/PlatformCALayerWinInternal.cpp:
+        (PlatformCALayerWinInternal::drawRepaintCounters): Drive-by fix. Match the
+        cocoa repaint counter logic by not painting counters for the layers that
+        contain the tile grid.
+        * platform/graphics/ca/win/PlatformCALayerWin.h:
+        * platform/graphics/ca/win/PlatformCALayerWinInternal.cpp:
+        (PlatformCALayerWinInternal::drawRepaintCounters):
+
</ins><span class="cx"> 2015-09-15  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Nested isolates can cause an infinite loop when laying out bidi runs
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscaPlatformCALayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/PlatformCALayer.h (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/PlatformCALayer.h        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/platform/graphics/ca/PlatformCALayer.h        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -234,9 +234,7 @@
</span><span class="cx">     virtual PlatformCALayer* rootLayer() const = 0;
</span><span class="cx">     virtual void setNeedsLayout() = 0;
</span><span class="cx">     virtual void setNeedsCommit() = 0;
</span><del>-#ifndef NDEBUG
-    virtual void printTree() const = 0;
-#endif // NDEBUG
</del><ins>+    virtual String layerTreeAsString() const = 0;
</ins><span class="cx"> #endif // PLATFORM(WIN)
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(IOS)
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscawinCACFLayerTreeHostcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.cpp (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.cpp        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.cpp        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2009, 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2009, 2013, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -322,4 +322,12 @@
</span><span class="cx">     return winRectToCGRect(clientRect);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String CACFLayerTreeHost::layerTreeAsString() const
+{
+    if (!m_rootLayer)
+        return emptyString();
+
+    return m_rootLayer-&gt;layerTreeAsString();
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscawinCACFLayerTreeHosth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.h (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.h        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/platform/graphics/ca/win/CACFLayerTreeHost.h        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2009-2012, 2015 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -77,6 +77,8 @@
</span><span class="cx">     // AbstractCACFLayerTreeHost
</span><span class="cx">     virtual void flushPendingLayerChangesNow();
</span><span class="cx"> 
</span><ins>+    String layerTreeAsString() const;
+
</ins><span class="cx"> protected:
</span><span class="cx">     CACFLayerTreeHost();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscawinPlatformCALayerWincpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.cpp (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.cpp        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.cpp        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> #include &lt;WebKitSystemInterface/WebKitSystemInterface.h&gt;
</span><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><ins>+#include &lt;wtf/text/StringBuilder.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="lines">@@ -641,127 +642,248 @@
</span><span class="cx">     // FIXME: implement.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#ifndef NDEBUG
-static void printIndent(int indent)
</del><ins>+static void printIndent(StringBuilder&amp; builder, int indent)
</ins><span class="cx"> {
</span><span class="cx">     for ( ; indent &gt; 0; --indent)
</span><del>-        fprintf(stderr, &quot;  &quot;);
</del><ins>+        builder.append(&quot;  &quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void printTransform(const CATransform3D&amp; transform)
</del><ins>+static void printTransform(StringBuilder&amp; builder, const CATransform3D&amp; transform)
</ins><span class="cx"> {
</span><del>-    fprintf(stderr, &quot;[%g %g %g %g; %g %g %g %g; %g %g %g %g; %g %g %g %g]&quot;,
-                    transform.m11, transform.m12, transform.m13, transform.m14, 
-                    transform.m21, transform.m22, transform.m23, transform.m24, 
-                    transform.m31, transform.m32, transform.m33, transform.m34, 
-                    transform.m41, transform.m42, transform.m43, transform.m44);
</del><ins>+    builder.append('[');
+    builder.appendNumber(transform.m11);
+    builder.append(' ');
+    builder.appendNumber(transform.m12);
+    builder.append(' ');
+    builder.appendNumber(transform.m13);
+    builder.append(' ');
+    builder.appendNumber(transform.m14);
+    builder.append(&quot;; &quot;);
+    builder.appendNumber(transform.m21);
+    builder.append(' ');
+    builder.appendNumber(transform.m22);
+    builder.append(' ');
+    builder.appendNumber(transform.m23);
+    builder.append(' ');
+    builder.appendNumber(transform.m24);
+    builder.append(&quot;; &quot;);
+    builder.appendNumber(transform.m31);
+    builder.append(' ');
+    builder.appendNumber(transform.m32);
+    builder.append(' ');
+    builder.appendNumber(transform.m33);
+    builder.append(' ');
+    builder.appendNumber(transform.m34);
+    builder.append(&quot;; &quot;);
+    builder.appendNumber(transform.m41);
+    builder.append(' ');
+    builder.appendNumber(transform.m42);
+    builder.append(' ');
+    builder.appendNumber(transform.m43);
+    builder.append(' ');
+    builder.appendNumber(transform.m44);
+    builder.append(']');
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static void printLayer(const PlatformCALayer* layer, int indent)
</del><ins>+static void printColor(StringBuilder&amp; builder, int indent, const String&amp; label, CGColorRef color)
</ins><span class="cx"> {
</span><ins>+    Color layerColor(color);
+    if (!layerColor.isValid())
+        return;
+
+    builder.append('\n');
+    printIndent(builder, indent);
+    builder.append('(');
+    builder.append(label);
+    builder.append(' ');
+    builder.append(layerColor.nameForRenderTreeAsText());
+    builder.append(')');
+}
+
+static void printLayer(StringBuilder&amp; builder, const PlatformCALayer* layer, int indent)
+{
</ins><span class="cx">     FloatPoint3D layerPosition = layer-&gt;position();
</span><span class="cx">     FloatPoint3D layerAnchorPoint = layer-&gt;anchorPoint();
</span><span class="cx">     FloatRect layerBounds = layer-&gt;bounds();
</span><del>-    printIndent(indent);
</del><ins>+    builder.append('\n');
+    printIndent(builder, indent);
</ins><span class="cx"> 
</span><del>-    char* layerTypeName = 0;
</del><ins>+    char* layerTypeName = nullptr;
</ins><span class="cx">     switch (layer-&gt;layerType()) {
</span><span class="cx">     case PlatformCALayer::LayerTypeLayer: layerTypeName = &quot;layer&quot;; break;
</span><span class="cx">     case PlatformCALayer::LayerTypeWebLayer: layerTypeName = &quot;web-layer&quot;; break;
</span><ins>+    case PlatformCALayer::LayerTypeSimpleLayer: layerTypeName = &quot;simple-layer&quot;; break;
</ins><span class="cx">     case PlatformCALayer::LayerTypeTransformLayer: layerTypeName = &quot;transform-layer&quot;; break;
</span><span class="cx">     case PlatformCALayer::LayerTypeWebTiledLayer: layerTypeName = &quot;web-tiled-layer&quot;; break;
</span><span class="cx">     case PlatformCALayer::LayerTypeTiledBackingLayer: layerTypeName = &quot;tiled-backing-layer&quot;; break;
</span><ins>+    case PlatformCALayer::LayerTypePageTiledBackingLayer: layerTypeName = &quot;page-tiled-backing-layer&quot;; break;
+    case PlatformCALayer::LayerTypeTiledBackingTileLayer: layerTypeName = &quot;tiled-backing-tile-layer&quot;; break;
</ins><span class="cx">     case PlatformCALayer::LayerTypeRootLayer: layerTypeName = &quot;root-layer&quot;; break;
</span><ins>+    case PlatformCALayer::LayerTypeAVPlayerLayer: layerTypeName = &quot;avplayer-layer&quot;; break;
+    case PlatformCALayer::LayerTypeWebGLLayer: layerTypeName = &quot;webgl-layer&quot;; break;
+    case PlatformCALayer::LayerTypeBackdropLayer: layerTypeName = &quot;backdrop-layer&quot;; break;
+    case PlatformCALayer::LayerTypeShapeLayer: layerTypeName = &quot;shape-layer&quot;; break;
+    case PlatformCALayer::LayerTypeLightSystemBackdropLayer: layerTypeName = &quot;light-system-backdrop-layer&quot;; break;
+    case PlatformCALayer::LayerTypeDarkSystemBackdropLayer: layerTypeName = &quot;dark-system-backdrop-layer&quot;; break;
+    case PlatformCALayer::LayerTypeScrollingLayer: layerTypeName = &quot;scrolling-layer&quot;; break;
</ins><span class="cx">     case PlatformCALayer::LayerTypeCustom: layerTypeName = &quot;custom-layer&quot;; break;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    fprintf(stderr, &quot;(%s [%g %g %g] [%g %g %g %g] [%g %g %g] superlayer=%p\n&quot;,
-        layerTypeName,
-        layerPosition.x(), layerPosition.y(), layerPosition.z(), 
-        layerBounds.x(), layerBounds.y(), layerBounds.width(), layerBounds.height(),
-        layerAnchorPoint.x(), layerAnchorPoint.y(), layerAnchorPoint.z(), layer-&gt;superlayer());
</del><ins>+    builder.append(&quot;(&quot;);
+    builder.append(layerTypeName);
+    builder.append(&quot; [&quot;);
+    builder.appendNumber(layerPosition.x());
+    builder.append(' ');
+    builder.appendNumber(layerPosition.y());
+    builder.append(' ');
+    builder.appendNumber(layerPosition.z());
+    builder.append(&quot;] [&quot;);
+    builder.appendNumber(layerBounds.x());
+    builder.append(' ');
+    builder.appendNumber(layerBounds.y());
+    builder.append(' ');
+    builder.appendNumber(layerBounds.width());
+    builder.append(' ');
+    builder.appendNumber(layerBounds.height());
+    builder.append(&quot;] [&quot;);
+    builder.appendNumber(layerAnchorPoint.x());
+    builder.append(' ');
+    builder.appendNumber(layerAnchorPoint.y());
+    builder.append(' ');
+    builder.appendNumber(layerAnchorPoint.z());
+    builder.append(&quot;] superlayer=&quot;);
+    builder.appendNumber(reinterpret_cast&lt;unsigned long long&gt;(layer-&gt;superlayer()));
</ins><span class="cx"> 
</span><span class="cx">     // Print name if needed
</span><span class="cx">     String layerName = CACFLayerGetName(layer-&gt;platformLayer());
</span><span class="cx">     if (!layerName.isEmpty()) {
</span><del>-        printIndent(indent + 1);
-        fprintf(stderr, &quot;(name %s)\n&quot;, layerName.utf8().data());
</del><ins>+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(name \&quot;&quot;);
+        builder.append(layerName);
+        builder.append(&quot;\&quot;)&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    // Print borderWidth if needed
+    if (CGFloat borderWidth = CACFLayerGetBorderWidth(layer-&gt;platformLayer())) {
+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(borderWidth &quot;);
+        builder.appendNumber(borderWidth);
+        builder.append(')');
+    }
+
+    // Print backgroundColor if needed
+    printColor(builder, indent + 1, &quot;backgroundColor&quot;, CACFLayerGetBackgroundColor(layer-&gt;platformLayer()));
+
+    // Print borderColor if needed
+    printColor(builder, indent + 1, &quot;borderColor&quot;, CACFLayerGetBorderColor(layer-&gt;platformLayer()));
+
</ins><span class="cx">     // Print masksToBounds if needed
</span><del>-    bool layerMasksToBounds = layer-&gt;masksToBounds();
-    if (layerMasksToBounds) {
-        printIndent(indent + 1);
-        fprintf(stderr, &quot;(masksToBounds true)\n&quot;);
</del><ins>+    if (bool layerMasksToBounds = layer-&gt;masksToBounds()) {
+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(masksToBounds true)&quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Print opacity if needed
</span><span class="cx">     float layerOpacity = layer-&gt;opacity();
</span><span class="cx">     if (layerOpacity != 1) {
</span><del>-        printIndent(indent + 1);
-        fprintf(stderr, &quot;(opacity %hf)\n&quot;, layerOpacity);
</del><ins>+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(opacity &quot;);
+        builder.appendNumber(layerOpacity);
+        builder.append(')');
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Print sublayerTransform if needed
</span><span class="cx">     TransformationMatrix layerTransform = layer-&gt;sublayerTransform();
</span><span class="cx">     if (!layerTransform.isIdentity()) {
</span><del>-        printIndent(indent + 1);
-        fprintf(stderr, &quot;(sublayerTransform &quot;);
-        printTransform(layerTransform);
-        fprintf(stderr, &quot;)\n&quot;);
</del><ins>+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(sublayerTransform &quot;);
+        printTransform(builder, layerTransform);
+        builder.append(')');
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Print transform if needed
</span><span class="cx">     layerTransform = layer-&gt;transform();
</span><span class="cx">     if (!layerTransform.isIdentity()) {
</span><del>-        printIndent(indent + 1);
-        fprintf(stderr, &quot;(transform &quot;);
-        printTransform(layerTransform);
-        fprintf(stderr, &quot;)\n&quot;);
</del><ins>+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(transform &quot;);
+        printTransform(builder, layerTransform);
+        builder.append(')');
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Print contents if needed
</span><del>-    CFTypeRef layerContents = layer-&gt;contents();
-    if (layerContents) {
</del><ins>+    if (CFTypeRef layerContents = layer-&gt;contents()) {
</ins><span class="cx">         if (CFGetTypeID(layerContents) == CGImageGetTypeID()) {
</span><span class="cx">             CGImageRef imageContents = static_cast&lt;CGImageRef&gt;(const_cast&lt;void*&gt;(layerContents));
</span><del>-            printIndent(indent + 1);
-            fprintf(stderr, &quot;(contents (image [%Iu %Iu]))\n&quot;,
-                CGImageGetWidth(imageContents), CGImageGetHeight(imageContents));
</del><ins>+            builder.append('\n');
+            printIndent(builder, indent + 1);
+            builder.append(&quot;(contents (image [&quot;);
+            builder.appendNumber(CGImageGetWidth(imageContents));
+            builder.append(' ');
+            builder.appendNumber(CGImageGetHeight(imageContents));
+            builder.append(&quot;]))&quot;);
</ins><span class="cx">         }
</span><ins>+
+        if (CFGetTypeID(layerContents) == CABackingStoreGetTypeID()) {
+            CABackingStoreRef backingStore = static_cast&lt;CABackingStoreRef&gt;(const_cast&lt;void*&gt;(layerContents));
+            CGImageRef imageContents = CABackingStoreGetCGImage(backingStore);
+            builder.append('\n');
+            printIndent(builder, indent + 1);
+            builder.append(&quot;(contents (backing-store [&quot;);
+            builder.appendNumber(CGImageGetWidth(imageContents));
+            builder.append(' ');
+            builder.appendNumber(CGImageGetHeight(imageContents));
+            builder.append(&quot;]))&quot;);
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Print sublayers if needed
</span><span class="cx">     int n = intern(layer)-&gt;sublayerCount();
</span><span class="cx">     if (n &gt; 0) {
</span><del>-        printIndent(indent + 1);
-        fprintf(stderr, &quot;(sublayers\n&quot;);
</del><ins>+        builder.append('\n');
+        printIndent(builder, indent + 1);
+        builder.append(&quot;(sublayers&quot;);
</ins><span class="cx"> 
</span><span class="cx">         PlatformCALayerList sublayers;
</span><span class="cx">         intern(layer)-&gt;getSublayers(sublayers);
</span><span class="cx">         ASSERT(n == sublayers.size());
</span><span class="cx">         for (int i = 0; i &lt; n; ++i)
</span><del>-            printLayer(sublayers[i].get(), indent + 2);
</del><ins>+            printLayer(builder, sublayers[i].get(), indent + 2);
</ins><span class="cx"> 
</span><del>-        printIndent(indent + 1);
-        fprintf(stderr, &quot;)\n&quot;);
</del><ins>+        builder.append(')');
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    printIndent(indent);
-    fprintf(stderr, &quot;)\n&quot;);
</del><ins>+    builder.append(')');
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void PlatformCALayerWin::printTree() const
</del><ins>+String PlatformCALayerWin::layerTreeAsString() const
</ins><span class="cx"> {
</span><span class="cx">     // Print heading info
</span><span class="cx">     CGRect rootBounds = bounds();
</span><del>-    fprintf(stderr, &quot;\n\n** Render tree at time %g (bounds %g, %g %gx%g) **\n\n&quot;, 
-        monotonicallyIncreasingTime(), rootBounds.origin.x, rootBounds.origin.y, rootBounds.size.width, rootBounds.size.height);
</del><span class="cx"> 
</span><ins>+    StringBuilder builder;
+    builder.append(&quot;\n\n** Render tree at time &quot;);
+    builder.appendNumber(monotonicallyIncreasingTime());
+    builder.append(&quot; (bounds &quot;);
+    builder.appendNumber(rootBounds.origin.x);
+    builder.append(&quot;, &quot;);
+    builder.appendNumber(rootBounds.origin.y);
+    builder.append(' ');
+    builder.appendNumber(rootBounds.size.width);
+    builder.append('x');
+    builder.appendNumber(rootBounds.size.height);
+    builder.append(&quot;) **\n\n&quot;);
+
</ins><span class="cx">     // Print layer tree from the root
</span><del>-    printLayer(this, 0);
</del><ins>+    printLayer(builder, this, 0);
+
+    return builder.toString();
</ins><span class="cx"> }
</span><del>-#endif // #ifndef NDEBUG
</del><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;PlatformCALayer&gt; PlatformCALayerWin::createCompatibleLayer(PlatformCALayer::LayerType layerType, PlatformCALayerClient* client) const
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscawinPlatformCALayerWinh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.h (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.h        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWin.h        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -151,7 +151,7 @@
</span><span class="cx">     virtual void drawTextAtPoint(CGContextRef, CGFloat x, CGFloat y, const char* text, size_t length) const override;
</span><span class="cx"> 
</span><span class="cx"> #ifndef NDEBUG
</span><del>-    virtual void printTree() const override;
</del><ins>+    virtual String layerTreeAsString() const override;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     virtual PassRefPtr&lt;PlatformCALayer&gt; clone(PlatformCALayerClient* owner) const override;
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicscawinPlatformCALayerWinInternalcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWinInternal.cpp (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWinInternal.cpp        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebCore/platform/graphics/ca/win/PlatformCALayerWinInternal.cpp        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -124,6 +124,11 @@
</span><span class="cx"> 
</span><span class="cx"> void PlatformCALayerWinInternal::drawRepaintCounters(CACFLayerRef caLayer, CGContextRef context, CGRect layerBounds, int drawCount)
</span><span class="cx"> {
</span><ins>+    // We always update the repaint count, but we do not paint it for layers that
+    // only contain tiled backing layers. Those report their repaint counts themselves.
+    if (!owner() || owner()-&gt;usesTiledBackingLayer())
+        return;
+
</ins><span class="cx">     CGColorRef backgroundColor = nullptr;
</span><span class="cx">     // Make the background of the counter the same as the border color,
</span><span class="cx">     // unless there is no border, then make it red
</span></span></pre></div>
<a id="trunkSourceWebKitwinChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/ChangeLog (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/ChangeLog        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebKit/win/ChangeLog        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2015-09-15  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Win] Provide a means for viewing the layer tree
+        https://bugs.webkit.org/show_bug.cgi?id=149165
+
+        Reviewed by Simon Fraser.
+
+        Add a new WebView method &quot;printLayerTree&quot; so that clients
+        can get a string dump of the current layer tree. Add this
+        to a new COM interface version so no existing clients break
+        compatibility.
+        
+        * Interfaces/IWebViewPrivate.idl:
+        * WebView.cpp:
+        (WebView::QueryInterface): Recognize the new interface version.
+        (WebView::printLayerTree): Added. This just calls the WebCore
+        implementation.
+        * WebView.h:
+
</ins><span class="cx"> 2015-09-12  Brian Burg  &lt;bburg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: disambiguate inspected/frontend controllers and pages in backend code
</span></span></pre></div>
<a id="trunkSourceWebKitwinInterfacesIWebViewPrivateidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/Interfaces/IWebViewPrivate.idl (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/Interfaces/IWebViewPrivate.idl        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebKit/win/Interfaces/IWebViewPrivate.idl        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -319,4 +319,10 @@
</span><span class="cx">         [in] unsigned whitelistCount, [in, size_is(whitelistCount)] BSTR* whitelist,
</span><span class="cx">         [in] unsigned blacklistCount, [in, size_is(blacklistCount)] BSTR* blacklist,
</span><span class="cx">         [in] WebUserContentInjectedFrames injectedFrames);
</span><del>-}
</del><span class="cx">\ No newline at end of file
</span><ins>+}
+
+[ uuid(08C88359-76AA-48F2-BA27-820540E781E9) ]
+interface IWebViewPrivate3 : IWebViewPrivate2
+{
+    HRESULT layerTreeAsString([out] BSTR*);
+}
</ins></span></pre></div>
<a id="trunkSourceWebKitwinWebViewcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebView.cpp (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebView.cpp        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebKit/win/WebView.cpp        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -2627,6 +2627,8 @@
</span><span class="cx">         *ppvObject = static_cast&lt;IWebViewPrivate*&gt;(this);
</span><span class="cx">     else if (IsEqualGUID(riid, IID_IWebViewPrivate2))
</span><span class="cx">         *ppvObject = static_cast&lt;IWebViewPrivate2*&gt;(this);
</span><ins>+    else if (IsEqualGUID(riid, IID_IWebViewPrivate3))
+        *ppvObject = static_cast&lt;IWebViewPrivate3*&gt;(this);
</ins><span class="cx">     else if (IsEqualGUID(riid, IID_IWebIBActions))
</span><span class="cx">         *ppvObject = static_cast&lt;IWebIBActions*&gt;(this);
</span><span class="cx">     else if (IsEqualGUID(riid, IID_IWebViewCSS))
</span><span class="lines">@@ -7431,3 +7433,24 @@
</span><span class="cx"> 
</span><span class="cx">     return S_OK;
</span><span class="cx"> }
</span><ins>+
+HRESULT WebView::layerTreeAsString(_Deref_opt_out_ BSTR* treeBstr)
+{
+    if (!treeBstr)
+        return E_POINTER;
+
+    *treeBstr = nullptr;
+
+#if USE(CA)
+    if (!m_layerTreeHost)
+        return S_OK;
+
+    String tree = m_layerTreeHost-&gt;layerTreeAsString();
+
+    *treeBstr = BString(tree).release();
+    if (!*treeBstr &amp;&amp; tree.length())
+        return E_OUTOFMEMORY;
+#endif
+
+    return S_OK;
+}
</ins></span></pre></div>
<a id="trunkSourceWebKitwinWebViewh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit/win/WebView.h (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit/win/WebView.h        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Source/WebKit/win/WebView.h        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -82,7 +82,7 @@
</span><span class="cx"> 
</span><span class="cx"> class WebView 
</span><span class="cx">     : public IWebView
</span><del>-    , public IWebViewPrivate2
</del><ins>+    , public IWebViewPrivate3
</ins><span class="cx">     , public IWebIBActions
</span><span class="cx">     , public IWebViewCSS
</span><span class="cx">     , public IWebViewEditing
</span><span class="lines">@@ -390,6 +390,9 @@
</span><span class="cx">     virtual HRESULT STDMETHODCALLTYPE addUserStyleSheetToGroup(_In_ BSTR groupName, _In_opt_ IWebScriptWorld*, _In_ BSTR source, _In_ BSTR url,
</span><span class="cx">         unsigned whitelistCount, __inout_ecount_full(whitelistCount) BSTR* whitelist, unsigned blacklistCount, __inout_ecount_full(blacklistCount) BSTR* blacklist, WebUserContentInjectedFrames);
</span><span class="cx"> 
</span><ins>+    // IWebViewPrivate3
+    HRESULT STDMETHODCALLTYPE layerTreeAsString(_Deref_opt_out_ BSTR*);
+
</ins><span class="cx">     // WebView
</span><span class="cx">     bool shouldUseEmbeddedView(const WTF::String&amp; mimeType) const;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Tools/ChangeLog        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-09-15  Brent Fulgham  &lt;bfulgham@apple.com&gt;
+
+        [Win] Provide a means for viewing the layer tree
+        https://bugs.webkit.org/show_bug.cgi?id=149165
+
+        Reviewed by Simon Fraser.
+
+        Update MiniBrowser with a new Debug menu option that will
+        dump the current layer tree to the debug console.
+        
+        * MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLib.rc:
+        * MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLibResource.h:
+        * MiniBrowser/win/Common.cpp:
+        (WndProc): Add handler for 'Print Layer Tree' menu option.
+        * MiniBrowser/win/MiniBrowser.cpp:
+        (MiniBrowser::printLayerTree): Added Handler.
+        * MiniBrowser/win/MiniBrowser.h:
+
</ins><span class="cx"> 2015-09-14  Myles C. Maxfield  &lt;mmaxfield@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WebKitTestRunner declarative language setting is broken for iOS
</span></span></pre></div>
<a id="trunkToolsMiniBrowserMiniBrowservcxprojMiniBrowserLibrc"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLib.rc (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLib.rc        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLib.rc        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -107,6 +107,7 @@
</span><span class="cx">         MENUITEM &quot;Show Compositing Borders&quot;,    IDM_COMPOSITING_BORDERS
</span><span class="cx">         MENUITEM SEPARATOR
</span><span class="cx">         MENUITEM &quot;Show Caches Window&quot;,          IDM_CACHES
</span><ins>+        MENUITEM &quot;Show Layer Tree&quot;,             IDM_SHOW_LAYER_TREE
</ins><span class="cx">     END
</span><span class="cx"> END
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsMiniBrowserMiniBrowservcxprojMiniBrowserLibResourceh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLibResource.h (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLibResource.h        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Tools/MiniBrowser/MiniBrowser.vcxproj/MiniBrowserLibResource.h        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -52,6 +52,7 @@
</span><span class="cx"> #define IDM_ACTUAL_SIZE                 171
</span><span class="cx"> #define IDM_ZOOM_IN                     172
</span><span class="cx"> #define IDM_ZOOM_OUT                    173
</span><ins>+#define IDM_SHOW_LAYER_TREE             174
</ins><span class="cx"> #define IDC_EMPTY_URL_CACHE             1000
</span><span class="cx"> #define IDC_RETURN_FREE_MEMORY          1001
</span><span class="cx"> #define IDC_EMPTY_WEBCORE_CACHE         1002
</span></span></pre></div>
<a id="trunkToolsMiniBrowserwinCommoncpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/win/Common.cpp (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/win/Common.cpp        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Tools/MiniBrowser/win/Common.cpp        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx"> // Support moving the transparent window
</span><span class="cx"> POINT s_windowPosition = { 100, 100 };
</span><del>-SIZE s_windowSize = { 800, 400 };
</del><ins>+SIZE s_windowSize = { 500, 200 };
</ins><span class="cx"> 
</span><span class="cx"> // Forward declarations of functions included in this code module:
</span><span class="cx"> ATOM MyRegisterClass(HINSTANCE hInstance);
</span><span class="lines">@@ -512,6 +512,10 @@
</span><span class="cx">             if (gMiniBrowser)
</span><span class="cx">                 gMiniBrowser-&gt;zoomOut();
</span><span class="cx">             break;
</span><ins>+        case IDM_SHOW_LAYER_TREE:
+            if (gMiniBrowser)
+                gMiniBrowser-&gt;showLayerTree();
+            break;
</ins><span class="cx">         default:
</span><span class="cx">             if (!ToggleMenuItem(hWnd, wmId))
</span><span class="cx">                 return CallWindowProc(parentProc, hWnd, message, wParam, lParam);
</span></span></pre></div>
<a id="trunkToolsMiniBrowserwinMiniBrowsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/win/MiniBrowser.cpp (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/win/MiniBrowser.cpp        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Tools/MiniBrowser/win/MiniBrowser.cpp        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -486,6 +486,24 @@
</span><span class="cx">     webActions-&gt;zoomPageOut(nullptr);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+typedef _com_ptr_t&lt;_com_IIID&lt;IWebViewPrivate3, &amp;__uuidof(IWebViewPrivate3)&gt;&gt; IWebViewPrivate3Ptr;
+
+void MiniBrowser::showLayerTree()
+{
+    IWebViewPrivate3Ptr webViewPrivate;
+    if (FAILED(m_webView-&gt;QueryInterface(IID_IWebViewPrivate3, reinterpret_cast&lt;void**&gt;(&amp;webViewPrivate.GetInterfacePtr()))))
+        return;
+
+    OutputDebugString(L&quot;CURRENT TREE:\n&quot;);
+
+    _bstr_t layerTreeBstr;
+    if (FAILED(webViewPrivate-&gt;layerTreeAsString(layerTreeBstr.GetAddress())))
+        OutputDebugString(L&quot;    Failed to retrieve the layer tree.\n&quot;);
+    else
+        OutputDebugString(layerTreeBstr);
+    OutputDebugString(L&quot;\n\n&quot;);
+}
+
</ins><span class="cx"> void MiniBrowser::generateFontForScaleFactor(float scaleFactor)
</span><span class="cx"> {
</span><span class="cx">     if (m_hURLBarFont)
</span></span></pre></div>
<a id="trunkToolsMiniBrowserwinMiniBrowserh"></a>
<div class="modfile"><h4>Modified: trunk/Tools/MiniBrowser/win/MiniBrowser.h (189832 => 189833)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/MiniBrowser/win/MiniBrowser.h        2015-09-16 00:30:38 UTC (rev 189832)
+++ trunk/Tools/MiniBrowser/win/MiniBrowser.h        2015-09-16 01:00:32 UTC (rev 189833)
</span><span class="lines">@@ -90,6 +90,8 @@
</span><span class="cx">     void zoomIn();
</span><span class="cx">     void zoomOut();
</span><span class="cx"> 
</span><ins>+    void showLayerTree();
+
</ins><span class="cx">     float deviceScaleFactor() { return m_deviceScaleFactor; }
</span><span class="cx">     void updateDeviceScaleFactor();
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>