<!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>[167157] 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/167157">167157</a></dd>
<dt>Author</dt> <dd>burg@cs.washington.edu</dd>
<dt>Date</dt> <dd>2014-04-11 15:01:04 -0700 (Fri, 11 Apr 2014)</dd>
</dl>

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

Reviewed by Timothy Hatcher.

.:

* ManualTests/inspector/replay-window-navigator-basic.html: Added.

Source/WebCore:

Most attributes of window.navigator do not change very often, but they
could be easily changed by the user or embedder. So, memoize attribute values.

This change does not include navigator.mimeTypes and navigator.plugins,
which will be handled at a different level. &lt;https://webkit.org/b/131341&gt;

Test: ManualTests/inspector/replay-window-navigator-basic.html

* page/Navigator.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="#trunkSourceWebCorepageNavigatoridl">trunk/Source/WebCore/page/Navigator.idl</a></li>
</ul>

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

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/ChangeLog (167156 => 167157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/ChangeLog        2014-04-11 21:58:46 UTC (rev 167156)
+++ trunk/ChangeLog        2014-04-11 22:01:04 UTC (rev 167157)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2014-04-11  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
+
+        Web Replay: memoize nondeterministic attributes of the Navigator interface
+        https://bugs.webkit.org/show_bug.cgi?id=131340
+
+        Reviewed by Timothy Hatcher.
+
+        * ManualTests/inspector/replay-window-navigator-basic.html: Added.
+
</ins><span class="cx"> 2014-04-09  Brendan Long  &lt;b.long@cablelabs.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GStreamer] Expose MPEG-TS metadata
</span></span></pre></div>
<a id="trunkManualTestsinspectorreplaywindownavigatorbasichtml"></a>
<div class="addfile"><h4>Added: trunk/ManualTests/inspector/replay-window-navigator-basic.html (0 => 167157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/ManualTests/inspector/replay-window-navigator-basic.html                                (rev 0)
+++ trunk/ManualTests/inspector/replay-window-navigator-basic.html        2014-04-11 22:01:04 UTC (rev 167157)
</span><span class="lines">@@ -0,0 +1,114 @@
</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 = {
+            appCodeName: window.navigator.appCodeName,
+            appName: window.navigator.appName,
+            appVersion: window.navigator.appVersion,
+            language: window.navigator.language,
+            userAgent: window.navigator.userAgent,
+            platform: window.navigator.platform,
+            product: window.navigator.product,
+            productSub: window.navigator.productSub,
+            vendor: window.navigator.vendor,
+            vendorSub: window.navigator.vendorSub,
+            cookieEnabled: window.navigator.cookieEnabled,
+            javaEnabled: window.navigator.javaEnabled(),
+        };
+
+        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 parts of the Navigator DOM 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 change your browser configuration in one of the following ways to change navigator state:
+&lt;/p&gt;
+&lt;ul&gt;
+    &lt;li&gt;Change the default language.&lt;/li&gt;
+    &lt;li&gt;Toggle Java or cookies support.&lt;/li&gt;
+    &lt;li&gt;Change the user agent string.&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.navigator 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 (167156 => 167157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-04-11 21:58:46 UTC (rev 167156)
+++ trunk/Source/WebCore/ChangeLog        2014-04-11 22:01:04 UTC (rev 167157)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-04-11  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
+
+        Web Replay: memoize nondeterministic attributes of the Navigator interface
+        https://bugs.webkit.org/show_bug.cgi?id=131340
+
+        Reviewed by Timothy Hatcher.
+
+        Most attributes of window.navigator do not change very often, but they
+        could be easily changed by the user or embedder. So, memoize attribute values.
+
+        This change does not include navigator.mimeTypes and navigator.plugins,
+        which will be handled at a different level. &lt;https://webkit.org/b/131341&gt;
+
+        Test: ManualTests/inspector/replay-window-navigator-basic.html
+
+        * page/Navigator.idl: Add Nondeterministic attribute.
+
</ins><span class="cx"> 2014-04-10  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS][WK2] Videos should animate into and out of fullscreen.
</span></span></pre></div>
<a id="trunkSourceWebCorepageNavigatoridl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/Navigator.idl (167156 => 167157)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/Navigator.idl        2014-04-11 21:58:46 UTC (rev 167156)
+++ trunk/Source/WebCore/page/Navigator.idl        2014-04-11 22:01:04 UTC (rev 167157)
</span><span class="lines">@@ -20,20 +20,20 @@
</span><span class="cx"> [
</span><span class="cx">     GenerateIsReachable=ImplFrame,
</span><span class="cx"> ] interface Navigator {
</span><del>-    readonly attribute DOMString appCodeName;
-    readonly attribute DOMString appName;
-    readonly attribute DOMString appVersion;
-    readonly attribute DOMString language;
-    readonly attribute DOMString userAgent;
-    readonly attribute DOMString platform;
</del><ins>+    [Nondeterministic] readonly attribute DOMString appCodeName;
+    [Nondeterministic] readonly attribute DOMString appName;
+    [Nondeterministic] readonly attribute DOMString appVersion;
+    [Nondeterministic] readonly attribute DOMString language;
+    [Nondeterministic] readonly attribute DOMString userAgent;
+    [Nondeterministic] readonly attribute DOMString platform;
</ins><span class="cx">     readonly attribute DOMPluginArray plugins;
</span><span class="cx">     readonly attribute DOMMimeTypeArray mimeTypes;
</span><del>-    readonly attribute DOMString product;
-    readonly attribute DOMString productSub;
-    readonly attribute DOMString vendor;
-    readonly attribute DOMString vendorSub;
-    readonly attribute boolean cookieEnabled;
-    boolean javaEnabled();
</del><ins>+    [Nondeterministic] readonly attribute DOMString product;
+    [Nondeterministic] readonly attribute DOMString productSub;
+    [Nondeterministic] readonly attribute DOMString vendor;
+    [Nondeterministic] readonly attribute DOMString vendorSub;
+    [Nondeterministic] readonly attribute boolean cookieEnabled;
+    [Nondeterministic] boolean javaEnabled();
</ins><span class="cx"> 
</span><span class="cx">     readonly attribute boolean onLine;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>