commit 6d7f6ea31a7629d3df6fd09fc579b5a60e599c35 Author: sanketh sgmenda@uwaterloo.ca Date: Sun May 10 16:50:41 2020 +0000
(ESR68) Bug 1511941 - Don't expose PerformanceNavigationTiming in RFP mode
In RFP mode, we do not support PerformanceNavigationTiming, so don't expose it. In particular, window.PerformanceNavigationTiming should return undefined.
Added a new method PerformanceNavigationTiming::Enabled which when used with the WebIDL Func attribute allows us to toggle whether window.PerformanceNavigationTiming is exposed.
Created dom/tests/mochitest/general/test_toggling_performance_navigation_timing.html to test whether the toggling works. Updated browser/components/resistfingerprinting/test/browser/browser_performanceAPI.js to create a new window each time privacy.resistFingerprinting is flipped so this behavior does not leak into other tests. --- .../test/browser/browser_performanceAPI.js | 62 ++++++++-------------- dom/performance/PerformanceMainThread.cpp | 3 +- dom/performance/PerformanceNavigationTiming.cpp | 6 +++ dom/performance/PerformanceNavigationTiming.h | 6 +++ dom/tests/mochitest/general/mochitest.ini | 1 + ...est_toggling_performance_navigation_timing.html | 47 ++++++++++++++++ dom/webidl/PerformanceNavigationTiming.webidl | 2 + 7 files changed, 85 insertions(+), 42 deletions(-)
diff --git a/browser/components/resistfingerprinting/test/browser/browser_performanceAPI.js b/browser/components/resistfingerprinting/test/browser/browser_performanceAPI.js index b4c6b4f9d461..eb51a98e7364 100644 --- a/browser/components/resistfingerprinting/test/browser/browser_performanceAPI.js +++ b/browser/components/resistfingerprinting/test/browser/browser_performanceAPI.js @@ -78,7 +78,6 @@ let isRounded = (x, expectedPrecision) => { };
let setupTest = async function( - tab, resistFingerprinting, reduceTimerPrecision, expectedPrecision, @@ -95,6 +94,13 @@ let setupTest = async function( ], ], }); + + let win = await BrowserTestUtils.openNewBrowserWindow(); + let tab = await BrowserTestUtils.openNewForegroundTab( + win.gBrowser, + TEST_PATH + "file_dummy.html" + ); + // No matter what we set the precision to, if we're in ResistFingerprinting mode // we use the larger of the precision pref and the constant 100ms if (resistFingerprinting) { @@ -110,15 +116,11 @@ let setupTest = async function( }, runTests ); + await BrowserTestUtils.closeWindow(win); }; // ================================================================================================ // ================================================================================================ add_task(async function runRPTests() { - let tab = await BrowserTestUtils.openNewForegroundTab( - gBrowser, - TEST_PATH + "file_dummy.html" - ); - let runTests = async function(data) { let timerlist = data.list; let expectedPrecision = data.precision; @@ -165,21 +167,14 @@ add_task(async function runRPTests() { ); };
- await setupTest(tab, true, true, 100, runTests); - await setupTest(tab, true, false, 13, runTests); - await setupTest(tab, true, false, 0.13, runTests); - - BrowserTestUtils.removeTab(tab); + await setupTest(true, true, 100, runTests); + await setupTest(true, false, 13, runTests); + await setupTest(true, false, 0.13, runTests); });
// ================================================================================================ // ================================================================================================ add_task(async function runRTPTests() { - let tab = await BrowserTestUtils.openNewForegroundTab( - gBrowser, - TEST_PATH + "file_dummy.html" - ); - let runTests = async function(data) { let timerlist = data.list; let expectedPrecision = data.precision; @@ -215,6 +210,7 @@ add_task(async function runRTPTests() { content.performance.getEntries().length, 4, "For reduceTimerPrecision, there should be 4 entries for performance.getEntries()" + // PerformanceNavigationTiming, PerformanceMark, PerformanceMark, PerformanceMeasure ); for (var i = 0; i < 4; i++) { let startTime = content.performance.getEntries()[i].startTime; @@ -253,11 +249,9 @@ add_task(async function runRTPTests() { content.performance.clearResourceTimings(); };
- await setupTest(tab, false, true, 100, runTests); - await setupTest(tab, false, true, 13, runTests); - await setupTest(tab, false, true, 0.13, runTests); - - BrowserTestUtils.removeTab(tab); + await setupTest(false, true, 100, runTests); + await setupTest(false, true, 13, runTests); + await setupTest(false, true, 0.13, runTests); });
// ================================================================================================ @@ -284,27 +278,13 @@ let runWorkerTest = async function(data) { };
add_task(async function runRPTestsForWorker() { - let tab = await BrowserTestUtils.openNewForegroundTab( - gBrowser, - TEST_PATH + "file_dummy.html" - ); - - await setupTest(tab, true, true, 100, runWorkerTest, "runRPTests"); - await setupTest(tab, true, false, 13, runWorkerTest, "runRPTests"); - await setupTest(tab, true, true, 0.13, runWorkerTest, "runRPTests"); - - BrowserTestUtils.removeTab(tab); + await setupTest(true, true, 100, runWorkerTest, "runRPTests"); + await setupTest(true, false, 13, runWorkerTest, "runRPTests"); + await setupTest(true, true, 0.13, runWorkerTest, "runRPTests"); });
add_task(async function runRTPTestsForWorker() { - let tab = await BrowserTestUtils.openNewForegroundTab( - gBrowser, - TEST_PATH + "file_dummy.html" - ); - - await setupTest(tab, false, true, 100, runWorkerTest, "runRTPTests"); - await setupTest(tab, false, true, 13, runWorkerTest, "runRTPTests"); - await setupTest(tab, false, true, 0.13, runWorkerTest, "runRTPTests"); - - BrowserTestUtils.removeTab(tab); + await setupTest(false, true, 100, runWorkerTest, "runRTPTests"); + await setupTest(false, true, 13, runWorkerTest, "runRTPTests"); + await setupTest(false, true, 0.13, runWorkerTest, "runRTPTests"); }); diff --git a/dom/performance/PerformanceMainThread.cpp b/dom/performance/PerformanceMainThread.cpp index 7c39b9350646..bfcbea4e1148 100644 --- a/dom/performance/PerformanceMainThread.cpp +++ b/dom/performance/PerformanceMainThread.cpp @@ -305,7 +305,8 @@ DOMHighResTimeStamp PerformanceMainThread::CreationTime() const { void PerformanceMainThread::CreateNavigationTimingEntry() { MOZ_ASSERT(!mDocEntry, "mDocEntry should be null.");
- if (!StaticPrefs::dom_enable_performance_navigation_timing()) { + if (!StaticPrefs::dom_enable_performance_navigation_timing() || + StaticPrefs::privacy_resistFingerprinting()) { return; }
diff --git a/dom/performance/PerformanceNavigationTiming.cpp b/dom/performance/PerformanceNavigationTiming.cpp index dbc6aa78c4d5..fb18b91aabe6 100644 --- a/dom/performance/PerformanceNavigationTiming.cpp +++ b/dom/performance/PerformanceNavigationTiming.cpp @@ -6,6 +6,7 @@
#include "mozilla/dom/PerformanceNavigationTiming.h" #include "mozilla/dom/PerformanceNavigationTimingBinding.h" +#include "mozilla/StaticPrefs.h"
using namespace mozilla::dom;
@@ -138,3 +139,8 @@ void PerformanceNavigationTiming::UpdatePropertiesFromHttpChannel( nsIHttpChannel* aHttpChannel, nsITimedChannel* aChannel) { mTimingData->SetPropertiesFromHttpChannel(aHttpChannel, aChannel); } + +bool PerformanceNavigationTiming::Enabled(JSContext* aCx, JSObject* aGlobal) { + return (StaticPrefs::dom_enable_performance_navigation_timing() && + !StaticPrefs::privacy_resistFingerprinting()); +} diff --git a/dom/performance/PerformanceNavigationTiming.h b/dom/performance/PerformanceNavigationTiming.h index 8ef79999a1bc..7bf76ee3d670 100644 --- a/dom/performance/PerformanceNavigationTiming.h +++ b/dom/performance/PerformanceNavigationTiming.h @@ -65,6 +65,12 @@ class PerformanceNavigationTiming final : public PerformanceResourceTiming { void UpdatePropertiesFromHttpChannel(nsIHttpChannel* aHttpChannel, nsITimedChannel* aChannel);
+ /* + * For use with the WebIDL Func attribute to determine whether + * window.PerformanceNavigationTiming is exposed. + */ + static bool Enabled(JSContext* aCx, JSObject* aGlobal); + private: ~PerformanceNavigationTiming() {} }; diff --git a/dom/tests/mochitest/general/mochitest.ini b/dom/tests/mochitest/general/mochitest.ini index cb233881397d..36f955500c09 100644 --- a/dom/tests/mochitest/general/mochitest.ini +++ b/dom/tests/mochitest/general/mochitest.ini @@ -141,6 +141,7 @@ skip-if = toolkit == 'android' # bug 1230232 - Mouse doesn't select in the same [test_storagePermissionsReject.html] [test_storagePermissionsRejectForeign.html] [test_stylesheetPI.html] +[test_toggling_performance_navigation_timing.html] [test_vibrator.html] [test_WebKitCSSMatrix.html] [test_windowedhistoryframes.html] diff --git a/dom/tests/mochitest/general/test_toggling_performance_navigation_timing.html b/dom/tests/mochitest/general/test_toggling_performance_navigation_timing.html new file mode 100644 index 000000000000..88f7154286cd --- /dev/null +++ b/dom/tests/mochitest/general/test_toggling_performance_navigation_timing.html @@ -0,0 +1,47 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <title>Test for Bug 1511941 - Don't expose PerformanceNavigationTiming when it is disabled</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> +</head> +<body> + <div id="content"> </div> + <script type="application/javascript"> + async function testWhetherExposed(resistFingerprinting, enable_performance_navigation_timing) { + await SpecialPowers.pushPrefEnv({ + "set": [["privacy.resistFingerprinting", resistFingerprinting], + ["dom.enable_performance_navigation_timing", enable_performance_navigation_timing]], + }); + var iframe = document.createElement("iframe"); + document.body.append(iframe); + var p = iframe.contentWindow.PerformanceNavigationTiming; + if (resistFingerprinting) + is(p, undefined, "window.PerformanceNavigationTiming should not be exposed when" + + " dom.enable_performance_navigation_timing=" + enable_performance_navigation_timing + + " and privacy.resistFingerprinting="+ resistFingerprinting +"."); + if (!enable_performance_navigation_timing) + is(p, undefined, "window.PerformanceNavigationTiming should not be exposed when" + + " dom.enable_performance_navigation_timing=" + enable_performance_navigation_timing + + " and privacy.resistFingerprinting="+ resistFingerprinting +"."); + if (enable_performance_navigation_timing && !resistFingerprinting) { + isnot(p, undefined, "window.PerformanceNavigationTiming should be exposed when" + + " dom.enable_performance_navigation_timing=" + enable_performance_navigation_timing + + " and privacy.resistFingerprinting="+ resistFingerprinting +"."); + } + } + + async function start() { + await testWhetherExposed(true,true); + await testWhetherExposed(true,false); + await testWhetherExposed(false,true); + await testWhetherExposed(false,false); + SimpleTest.finish(); + } + + SimpleTest.waitForExplicitFinish(); + start(); + </script> +</body> +</html> diff --git a/dom/webidl/PerformanceNavigationTiming.webidl b/dom/webidl/PerformanceNavigationTiming.webidl index b26e1c18f688..cf029972304f 100644 --- a/dom/webidl/PerformanceNavigationTiming.webidl +++ b/dom/webidl/PerformanceNavigationTiming.webidl @@ -17,6 +17,8 @@ enum NavigationType { "prerender" };
+[Exposed=Window, + Func="mozilla::dom::PerformanceNavigationTiming::Enabled"] interface PerformanceNavigationTiming : PerformanceResourceTiming { readonly attribute DOMHighResTimeStamp unloadEventStart; readonly attribute DOMHighResTimeStamp unloadEventEnd;
tbb-commits@lists.torproject.org