| Index: chrome/test/data/cross_site_iframe_factory.html
|
| diff --git a/chrome/test/data/cross_site_iframe_factory.html b/chrome/test/data/cross_site_iframe_factory.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..934f4f71b803561ed12e1888893ec51282354c9d
|
| --- /dev/null
|
| +++ b/chrome/test/data/cross_site_iframe_factory.html
|
| @@ -0,0 +1,143 @@
|
| +<html>
|
| +<head>
|
| +<title>cross-site iframe factory</title>
|
| +<style>
|
| +body {font-family: Sans-Serif;
|
| + text-align: center;}
|
| +h1 {color:black}
|
| +h2 {color:black}
|
| +iframe {border-radius: 7px;
|
| + border-style: solid;
|
| + vertical-align: top;
|
| + margin: 2px;
|
| + }
|
| +</style>
|
| +</head>
|
| +<body>
|
| +<!-- This only works if the CrossSiteRedirector is running on the embedded test
|
| + server, and the host_resolver is set up to handle b.com. -->
|
| +<script src="cross_site_iframe_factory_parser.js"></script>
|
| +<script type="text/javascript">
|
| +
|
| +function murmurhash3_32_gc(key, seed) {
|
| + var remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;
|
| +
|
| + remainder = key.length & 3; // key.length % 4
|
| + bytes = key.length - remainder;
|
| + h1 = seed;
|
| + c1 = 0xcc9e2d51;
|
| + c2 = 0x1b873593;
|
| + i = 0;
|
| +
|
| + while (i < bytes) {
|
| + k1 =
|
| + ((key.charCodeAt(i) & 0xff)) |
|
| + ((key.charCodeAt(++i) & 0xff) << 8) |
|
| + ((key.charCodeAt(++i) & 0xff) << 16) |
|
| + ((key.charCodeAt(++i) & 0xff) << 24);
|
| + ++i;
|
| +
|
| + k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;
|
| + k1 = (k1 << 15) | (k1 >>> 17);
|
| + k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;
|
| +
|
| + h1 ^= k1;
|
| + h1 = (h1 << 13) | (h1 >>> 19);
|
| + h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;
|
| + h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));
|
| + }
|
| +
|
| + k1 = 0;
|
| +
|
| + switch (remainder) {
|
| + case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
|
| + case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
|
| + case 1: k1 ^= (key.charCodeAt(i) & 0xff);
|
| +
|
| + k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;
|
| + k1 = (k1 << 15) | (k1 >>> 17);
|
| + k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;
|
| + h1 ^= k1;
|
| + }
|
| +
|
| + h1 ^= key.length;
|
| +
|
| + h1 ^= h1 >>> 16;
|
| + h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;
|
| + h1 ^= h1 >>> 13;
|
| + h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;
|
| + h1 ^= h1 >>> 16;
|
| +
|
| + return h1 >>> 0;
|
| +}
|
| +
|
| +function pastel_color(input_str, gamma) {
|
| + // Picked by trial and erro so that [a.com ... h.com] are well distributed
|
| + // in colorspace.
|
| + var seeded_value = input_str + "14";
|
| + var hash = murmurhash3_32_gc(seeded_value, 0);
|
| + var x1 = ((hash >> 00) & 0x3FF) / 0x3FF;
|
| + var x2 = ((hash >> 10) & 0x3FF) / 0x3FF;
|
| + var x3 = ((hash >> 20) & 0x3FF) / 0x3FF;
|
| +
|
| + // Apply gamma for lighter/darker tones.
|
| + x1 = Math.pow(x1, gamma);
|
| + x2 = Math.pow(x2, gamma);
|
| + x3 = Math.pow(x3, gamma);
|
| +
|
| + // Average the color with the base. This produces pastel-like tones.
|
| + var alpha = 0.5;
|
| + var r = Math.round(255 * (alpha * x1 + (1 - alpha)));
|
| + var g = Math.round(255 * (alpha * x2 + (1 - alpha)));
|
| + var b = Math.round(255 * (alpha * x3 + (1 - alpha)));
|
| +
|
| + return "rgb(" + r + ", " + g + ", " + b + ")";
|
| +}
|
| +
|
| +function backgroundColor(input_str) {
|
| + return pastel_color(input_str, .5);
|
| +}
|
| +function borderColor(input_str) {
|
| + return pastel_color(input_str, 2);
|
| +}
|
| +
|
| +if (!window.location.protocol.startsWith('http')) {
|
| + var me = document.createElement('h1');
|
| + document.body.appendChild(me);
|
| +}
|
| +
|
| +function canonicalizeSite(site_string) {
|
| + if (site_string.indexOf('.') == -1)
|
| + return site_string + ".com";
|
| + return site_string;
|
| +}
|
| +
|
| +var query_string = unescape(window.location.search.substring(1));
|
| +var command = query_parser.parse(query_string);
|
| +
|
| +var me = document.createElement('h2');
|
| +var document_site = canonicalizeSite(command.site);
|
| +me.innerText = document_site;
|
| +document.body.appendChild(me);
|
| +document.body.style.backgroundColor = backgroundColor(document_site);
|
| +
|
| +for (var i = 0; i < command.frames.length; i++) {
|
| + var go_cross_site = window.location.protocol.startsWith('http');
|
| + var host = canonicalizeSite(command.frames[i].site);
|
| + var url = "";
|
| + url += window.location.protocol + "//"; // scheme (preserved)
|
| + url += go_cross_site ? host : window.location.host; // host
|
| + if (window.location.port)
|
| + url += ":" + window.location.port; // port (preserved)
|
| + url += "/" + window.location.pathname; // path (preserved)
|
| + url += "?" + escape(command.frames[i].args); // query
|
| +
|
| + var iframe = document.createElement('iframe');
|
| + iframe.src = url;
|
| + iframe.style.borderColor = borderColor(host);
|
| + iframe.scrolling = "no";
|
| + iframe.width = iframe.height = command.frames[i].args.length*25 + 50;
|
| + document.body.appendChild(iframe);
|
| +}
|
| +</script>
|
| +</body></html>
|
|
|