Web Replay: memoize nondeterministic attributes of the Screen interface
[WebKit-https.git] / ManualTests / inspector / replay-window-screen.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2         "http://www.w3.org/TR/html4/strict.dtd">
3 <html lang="en">
4 <head>
5 <script src="./resources/crypto-md5.js"></script>
6 <script type="text/javascript" language="javascript" charset="utf-8">
7
8     window.dumpedStates = [];
9
10     function dumpState() {
11         obj = {
12              height: window.screen.height,
13              width: window.screen.width,
14              colorDepth: window.screen.colorDepth,
15              pixelDepth: window.screen.pixelDepth,
16              availLeft: window.screen.availLeft,
17              availTop: window.screen.availTop,
18              availHeight: window.screen.availHeight,
19              availWidth: window.screen.availWidth,
20         };
21
22         dumpedStates.push(obj);
23
24         var block = createBlock(hex_md5(JSON.stringify(obj)));
25         var blocksContainer = document.getElementById("blocks");
26         blocksContainer.appendChild(block);
27
28         var hashLabel = document.getElementById("hash");
29         hash.textContent = hex_md5(JSON.stringify(dumpedStates));
30
31         appendDetails(obj);
32     }
33
34     function appendDetails(obj) {
35         var detailsContainer = document.getElementById("details");
36         var tableElement = document.createElement("table");
37         for (var key in obj) {
38             var rowElement = document.createElement("tr");
39             var keyElement = document.createElement("td");
40             keyElement.textContent = key;
41             rowElement.appendChild(keyElement);
42             var valueElement = document.createElement("td");
43             valueElement.textContent = obj[key];
44             rowElement.appendChild(valueElement);
45             tableElement.appendChild(rowElement);
46         }
47         detailsContainer.appendChild(tableElement);
48         detailsContainer.appendChild(document.createElement("hr"));
49     }
50
51     function createBlock(hash) {
52         var color = "#" + hash.substr(0,6);
53         var block = document.createElement("span");
54         block.style.backgroundColor = color;
55         return block;
56     }
57
58 </script>
59
60 <style type="text/css">
61 body {
62     max-width: 800px;
63 }
64 #blocks {
65     display: -webkit-flex;
66     width: 600px;
67     -webkit-flex-flow: row wrap;
68 }
69
70 table {
71     text-decoration: bold;
72     font-family: monospace;
73 }
74
75 #blocks > span {
76     width: 20px;
77     height: 20px;
78     border-radius: 10px;
79     font-size: 18px;
80     font-weight: bold;
81     font-family: sans-serif;
82     color: #fff;
83     text-align: center;
84 }
85 </style>
86 </head>
87 <body onload="dumpState()">
88 <p>This page is a manual test for capture and replay of the Screen API.</p>
89 <p>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.</p>
90 <hr/>
91 <p>
92 To test the replay functionality, open the Web Inspector and start capturing. Then perform one of the following to change screen state:
93 </p>
94 <ul>
95     <li>If you have two monitors, move the menu bar from one display to the other.</li>
96     <li>Change the monitor's resolution.</li>
97     <li>Change the monitor's color depth.</li>
98     <li>Move the browser window between monitors with different color depth, size, or pixel ratio.</li>
99 </ul>
100 </p>
101 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.</p>
102 </p>
103 <hr/>
104 <form>
105 <input type="button" value="Dump window.screen Values" onclick="dumpState()" />
106 </form>
107 <div id="hash"></div>
108 <div id="blocks"></div>
109 <div id="details"></div>
110 </body>
111 </html>