<!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>[166984] 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/166984">166984</a></dd>
<dt>Author</dt> <dd>burg@cs.washington.edu</dd>
<dt>Date</dt> <dd>2014-04-08 17:22:46 -0700 (Tue, 08 Apr 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Replay: memoize nondeterministic attributes of the Screen interface
https://bugs.webkit.org/show_bug.cgi?id=131339

Reviewed by Timothy Hatcher.

.:

* ManualTests/inspector/replay-window-screen.html: Added.

Source/WebCore:

The values from the screen interface are nondeterministic. Since we can't
change the physical screen dimensions, instead memoize values of attributes.

Test: ManualTests/inspector/replay-window-screen.html

* page/Screen.idl: Add Nondeterministic attribute.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkChangeLog">trunk/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageScreenidl">trunk/Source/WebCore/page/Screen.idl</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkManualTestsinspectorreplaywindowscreenhtml">trunk/ManualTests/inspector/replay-window-screen.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/ChangeLog (166983 => 166984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/ChangeLog        2014-04-09 00:13:43 UTC (rev 166983)
+++ trunk/ChangeLog        2014-04-09 00:22:46 UTC (rev 166984)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2014-04-08  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
+
+        Web Replay: memoize nondeterministic attributes of the Screen interface
+        https://bugs.webkit.org/show_bug.cgi?id=131339
+
+        Reviewed by Timothy Hatcher.
+
+        * ManualTests/inspector/replay-window-screen.html: Added.
+
</ins><span class="cx"> 2014-04-08  Martin Robinson  &lt;mrobinson@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Remove the WebKitGTK+ WebKit 1 code
</span></span></pre></div>
<a id="trunkManualTestsinspectorreplaywindowscreenhtml"></a>
<div class="addfile"><h4>Added: trunk/ManualTests/inspector/replay-window-screen.html (0 => 166984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/ManualTests/inspector/replay-window-screen.html                                (rev 0)
+++ trunk/ManualTests/inspector/replay-window-screen.html        2014-04-09 00:22:46 UTC (rev 166984)
</span><span class="lines">@@ -0,0 +1,111 @@
</span><ins>+&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01//EN&quot;
+        &quot;http://www.w3.org/TR/html4/strict.dtd&quot;&gt;
+&lt;html lang=&quot;en&quot;&gt;
+&lt;head&gt;
+&lt;script src=&quot;./resources/crypto-md5.js&quot;&gt;&lt;/script&gt;
+&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot; charset=&quot;utf-8&quot;&gt;
+
+    window.dumpedStates = [];
+
+    function dumpState() {
+        obj = {
+             height: window.screen.height,
+             width: window.screen.width,
+             colorDepth: window.screen.colorDepth,
+             pixelDepth: window.screen.pixelDepth,
+             availLeft: window.screen.availLeft,
+             availTop: window.screen.availTop,
+             availHeight: window.screen.availHeight,
+             availWidth: window.screen.availWidth,
+        };
+
+        dumpedStates.push(obj);
+
+        var block = createBlock(hex_md5(JSON.stringify(obj)));
+        var blocksContainer = document.getElementById(&quot;blocks&quot;);
+        blocksContainer.appendChild(block);
+
+        var hashLabel = document.getElementById(&quot;hash&quot;);
+        hash.textContent = hex_md5(JSON.stringify(dumpedStates));
+
+        appendDetails(obj);
+    }
+
+    function appendDetails(obj) {
+        var detailsContainer = document.getElementById(&quot;details&quot;);
+        var tableElement = document.createElement(&quot;table&quot;);
+        for (var key in obj) {
+            var rowElement = document.createElement(&quot;tr&quot;);
+            var keyElement = document.createElement(&quot;td&quot;);
+            keyElement.textContent = key;
+            rowElement.appendChild(keyElement);
+            var valueElement = document.createElement(&quot;td&quot;);
+            valueElement.textContent = obj[key];
+            rowElement.appendChild(valueElement);
+            tableElement.appendChild(rowElement);
+        }
+        detailsContainer.appendChild(tableElement);
+        detailsContainer.appendChild(document.createElement(&quot;hr&quot;));
+    }
+
+    function createBlock(hash) {
+        var color = &quot;#&quot; + hash.substr(0,6);
+        var block = document.createElement(&quot;span&quot;);
+        block.style.backgroundColor = color;
+        return block;
+    }
+
+&lt;/script&gt;
+
+&lt;style type=&quot;text/css&quot;&gt;
+body {
+    max-width: 800px;
+}
+#blocks {
+    display: -webkit-flex;
+    width: 600px;
+    -webkit-flex-flow: row wrap;
+}
+
+table {
+    text-decoration: bold;
+    font-family: monospace;
+}
+
+#blocks &gt; span {
+    width: 20px;
+    height: 20px;
+    border-radius: 10px;
+    font-size: 18px;
+    font-weight: bold;
+    font-family: sans-serif;
+    color: #fff;
+    text-align: center;
+}
+&lt;/style&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;dumpState()&quot;&gt;
+&lt;p&gt;This page is a manual test for capture and replay of the Screen API.&lt;/p&gt;
+&lt;p&gt;Below, a block is created for each button press that dumps state. The color is derived from a hash of the state. At the bottom is a cumulative hash of all dumped data.&lt;/p&gt;
+&lt;hr/&gt;
+&lt;p&gt;
+To test the replay functionality, open the Web Inspector and start capturing. Then perform one of the following to change screen state:
+&lt;/p&gt;
+&lt;ul&gt;
+    &lt;li&gt;If you have two monitors, move the menu bar from one display to the other.&lt;/li&gt;
+    &lt;li&gt;Change the monitor's resolution.&lt;/li&gt;
+    &lt;li&gt;Change the monitor's color depth.&lt;/li&gt;
+    &lt;li&gt;Move the browser window between monitors with different color depth, size, or pixel ratio.&lt;/li&gt;
+&lt;/ul&gt;
+&lt;/p&gt;
+Then, stop capturing and replay the recording. The replayed execution should produce the same sequence of blocks. More importantly, the cumulative hash value should be the same at the end of capturing and at the end of any subsequent replays.&lt;/p&gt;
+&lt;/p&gt;
+&lt;hr/&gt;
+&lt;form&gt;
+&lt;input type=&quot;button&quot; value=&quot;Dump window.screen Values&quot; onclick=&quot;dumpState()&quot; /&gt;
+&lt;/form&gt;
+&lt;div id=&quot;hash&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;blocks&quot;&gt;&lt;/div&gt;
+&lt;div id=&quot;details&quot;&gt;&lt;/div&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (166983 => 166984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-09 00:13:43 UTC (rev 166983)
+++ trunk/Source/WebCore/ChangeLog        2014-04-09 00:22:46 UTC (rev 166984)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2014-04-08  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
+
+        Web Replay: memoize nondeterministic attributes of the Screen interface
+        https://bugs.webkit.org/show_bug.cgi?id=131339
+
+        Reviewed by Timothy Hatcher.
+
+        The values from the screen interface are nondeterministic. Since we can't
+        change the physical screen dimensions, instead memoize values of attributes.
+
+        Test: ManualTests/inspector/replay-window-screen.html
+
+        * page/Screen.idl: Add Nondeterministic attribute.
+
</ins><span class="cx"> 2014-04-08  Beth Dakin  &lt;bdakin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=131408
</span></span></pre></div>
<a id="trunkSourceWebCorepageScreenidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Screen.idl (166983 => 166984)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Screen.idl        2014-04-09 00:13:43 UTC (rev 166983)
+++ trunk/Source/WebCore/page/Screen.idl        2014-04-09 00:22:46 UTC (rev 166984)
</span><span class="lines">@@ -30,13 +30,13 @@
</span><span class="cx"> [
</span><span class="cx">     GenerateIsReachable=ImplFrame,
</span><span class="cx"> ] interface Screen {
</span><del>-    readonly attribute unsigned long height;
-    readonly attribute unsigned long width;
-    readonly attribute unsigned long colorDepth;
-    readonly attribute unsigned long pixelDepth;
-    readonly attribute long availLeft;
-    readonly attribute long availTop;
-    readonly attribute unsigned long availHeight;
-    readonly attribute unsigned long availWidth;
</del><ins>+    [Nondeterministic] readonly attribute unsigned long height;
+    [Nondeterministic] readonly attribute unsigned long width;
+    [Nondeterministic] readonly attribute unsigned long colorDepth;
+    [Nondeterministic] readonly attribute unsigned long pixelDepth;
+    [Nondeterministic] readonly attribute long availLeft;
+    [Nondeterministic] readonly attribute long availTop;
+    [Nondeterministic] readonly attribute unsigned long availHeight;
+    [Nondeterministic] readonly attribute unsigned long availWidth;
</ins><span class="cx"> };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>