Bug 1193593 - Test fingerprinting resistance for media queries in picture elements. r=heycam

Based on Tor Browser #16315
https://trac.torproject.org/projects/tor/ticket/16315
This commit is contained in:
Arthur Edelstein 2015-09-01 08:51:00 -04:00
parent 7b9b707c87
commit cb8fc7fbae
7 changed files with 84 additions and 38 deletions

View File

@ -4,8 +4,6 @@
/* jshint loopfunc:true */ /* jshint loopfunc:true */
/* global window, screen, ok, SpecialPowers, matchMedia */ /* global window, screen, ok, SpecialPowers, matchMedia */
SimpleTest.waitForExplicitFinish();
// Expected values. Format: [name, pref_off_value, pref_on_value] // Expected values. Format: [name, pref_off_value, pref_on_value]
// If pref_*_value is an array with two values, then we will match // If pref_*_value is an array with two values, then we will match
// any value in between those two values. If a value is null, then // any value in between those two values. If a value is null, then
@ -166,19 +164,22 @@ let cssLine = function (query, clazz, id, color) {
" { background-color: " + color + "; } }\n"; " { background-color: " + color + "; } }\n";
}; };
// __constructQuery(key, val)__.
// Creates a CSS media query from key and val. If key is an array of
// two elements, constructs a range query (using min- and max-).
let constructQuery = function (key, val) {
return Array.isArray(val) ?
"(min-" + key + ": " + val[0] + ") and (max-" + key + ": " + val[1] + ")" :
"(" + key + ": " + val + ")";
};
// __mediaQueryCSSLine(key, val, color)__. // __mediaQueryCSSLine(key, val, color)__.
// Creates a line containing a CSS media query and a CSS expression. // Creates a line containing a CSS media query and a CSS expression.
let mediaQueryCSSLine = function (key, val, color) { let mediaQueryCSSLine = function (key, val, color) {
if (val === null) { if (val === null) {
return ""; return "";
} }
let query; return cssLine(constructQuery(key, val), "spoof", key, color);
if (Array.isArray(val)) {
query = "(min-" + key + ": " + val[0] + ") and (max-" + key + ": " + val[1] + ")";
} else {
query = "(" + key + ": " + val + ")";
}
return cssLine(query, "spoof", key, color);
}; };
// __suppressedMediaQueryCSSLine(key, color)__. // __suppressedMediaQueryCSSLine(key, color)__.
@ -248,33 +249,67 @@ let testOSXFontSmoothing = function (resisting) {
"-moz-osx-font-smoothing"); "-moz-osx-font-smoothing");
}; };
// An iterator yielding pref values for two consecutive tests. // __sleep(timeoutMs)__.
let prefVals = (for (prefVal of [false, true]) prefVal); // Returns a promise that resolves after the given timeout.
let sleep = function (timeoutMs) {
return new Promise(function(resolve, reject) {
window.setTimeout(resolve);
});
};
// __testMediaQueriesInPictureElements(resisting)__.
// Test to see if media queries are properly spoofed in picture elements
// when we are resisting fingerprinting. A generator function
// to be used with SpawnTask.js.
let testMediaQueriesInPictureElements = function* (resisting) {
let lines = "";
for (let [key, offVal, onVal] of expected_values) {
let expected = resisting ? onVal : offVal;
if (expected) {
let query = constructQuery(key, expected);
lines += "<picture>\n";
lines += " <source srcset='/tests/layout/style/test/chrome/match.png' media='" + query + "' />\n";
lines += " <img title='" + key + ":" + expected + "' class='testImage' src='/tests/layout/style/test/chrome/mismatch.png' alt='" + key + "' />\n";
lines += "</picture><br/>\n";
}
}
document.getElementById("pictures").innerHTML = lines;
var testImages = document.getElementsByClassName("testImage");
yield sleep(0);
for (let testImage of testImages) {
ok(testImage.currentSrc.endsWith("/match.png"), "Media query '" + testImage.title + "' in picture should match.");
}
};
// __pushPref(key, value)__.
// Set a pref value asynchronously, returning a promise that resolves
// when it succeeds.
let pushPref = function (key, value) {
return new Promise(function(resolve, reject) {
SpecialPowers.pushPrefEnv({"set": [[key, value]]}, resolve);
});
};
// __test(isContent)__. // __test(isContent)__.
// Run all tests. // Run all tests. A generator function to be used
let test = function(isContent) { // with SpawnTask.js.
let {value: prefValue, done} = prefVals.next(); let test = function* (isContent) {
if (done) { for (prefValue of [false, true]) {
SimpleTest.finish(); yield pushPref("privacy.resistFingerprinting", prefValue);
return; let resisting = prefValue && isContent;
expected_values.forEach(
function ([key, offVal, onVal]) {
testMatch(key, resisting ? onVal : offVal);
});
testToggles(resisting);
if (OS === "WINNT") {
testWindowsSpecific(resisting, "-moz-os-version", windows_versions);
testWindowsSpecific(resisting, "-moz-windows-theme", windows_themes);
}
testCSS(resisting);
if (OS === "Darwin") {
testOSXFontSmoothing(resisting);
}
yield testMediaQueriesInPictureElements(resisting);
} }
SpecialPowers.pushPrefEnv({set: [["privacy.resistFingerprinting", prefValue]]},
function () {
let resisting = prefValue && isContent;
expected_values.forEach(
function ([key, offVal, onVal]) {
testMatch(key, resisting ? onVal : offVal);
});
testToggles(resisting);
if (OS === "WINNT") {
testWindowsSpecific(resisting, "-moz-os-version", windows_versions);
testWindowsSpecific(resisting, "-moz-windows-theme", windows_themes);
}
testCSS(resisting);
if (OS === "Darwin") {
testOSXFontSmoothing(resisting);
}
test(isContent);
});
}; };

View File

@ -6,6 +6,8 @@ support-files =
bug535806-html.html bug535806-html.html
bug535806-xul.xul bug535806-xul.xul
hover_helper.html hover_helper.html
match.png
mismatch.png
[test_addSheet.html] [test_addSheet.html]
[test_additional_sheets.html] [test_additional_sheets.html]

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -7,13 +7,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=418986
<window title="Mozilla Bug 418986" <window title="Mozilla Bug 418986"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/> <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"/>
<!-- test results are displayed in the html:body --> <!-- test results are displayed in the html:body -->
<body xmlns="http://www.w3.org/1999/xhtml"> <body xmlns="http://www.w3.org/1999/xhtml">
<style id="test-css" scoped="true"></style> <style id="test-css" scoped="true"></style>
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=418986" <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=418986"
target="_blank">Mozilla Bug 418986</a> target="_blank">Mozilla Bug 418986</a>
<p id="display"></p> <p id="display"></p>
<p id="pictures"></p>
</body> </body>
<script type="text/javascript;version=1.7" src="bug418986-2.js"></script> <script type="text/javascript;version=1.7" src="bug418986-2.js"></script>
@ -21,7 +22,9 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=418986
<script type="text/javascript;version=1.7"> <script type="text/javascript;version=1.7">
// Run all tests now. // Run all tests now.
window.onload = function () { window.onload = function () {
test(false); add_task(function* () {
yield test(false);
});
}; };
</script> </script>
</window> </window>

View File

@ -6,6 +6,8 @@ support-files =
ccd-standards.html ccd-standards.html
css_properties.js css_properties.js
chrome/bug418986-2.js chrome/bug418986-2.js
chrome/match.png
chrome/mismatch.png
descriptor_database.js descriptor_database.js
empty.html empty.html
media_queries_dynamic_xbl_binding.xml media_queries_dynamic_xbl_binding.xml

View File

@ -7,13 +7,16 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=418986
<meta charset="utf-8"> <meta charset="utf-8">
<title>Test 2/3 for Bug #418986: Resist fingerprinting by preventing exposure of screen and system info</title> <title>Test 2/3 for Bug #418986: Resist fingerprinting by preventing exposure of screen and system info</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<style id="test-css"></style> <style id="test-css"></style>
<script type="text/javascript;version=1.7" src="chrome/bug418986-2.js"></script> <script type="text/javascript;version=1.7" src="chrome/bug418986-2.js"></script>
<script type="text/javascript;version=1.7"> <script type="text/javascript;version=1.7">
// Run all tests now. // Run all tests now.
window.onload = function () { window.onload = function () {
test(true); add_task(function* () {
yield test(true);
});
}; };
</script> </script>
</head> </head>
@ -23,6 +26,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=418986
<div id="content" style="display: none"> <div id="content" style="display: none">
</div> </div>
<p id="pictures"></p>
<pre id="test"> <pre id="test">
</pre> </pre>
</body> </body>