fune/browser/components/uitour/test/browser_trackingProtection_tour.js
Shih-Chiang Chien 97f5f8bc70 Bug 1015466 - Part 6, wait "http-on-opening-request" after tracker iframe is inserted. r=MattN
The tracking protection status will be updated after nsHttpChannel.asyncOpen on chrome process and it is asynchronously triggered by inserting the tracker iframe.
This is not guaranteed to be happened before the |showMenuPromise|.
Waiting for "http-on-opening-request" on chrome process before "showMenuPromise" is invoked can ensure the tracking protection status is updated when the menu is shown.

MozReview-Commit-ID: INjaJUMLvZU

--HG--
extra : rebase_source : 1bf32151d3134b3527978934afc4c7405dc60b3e
2017-05-23 13:29:52 +08:00

89 lines
3 KiB
JavaScript

"use strict";
var gTestTab;
var gContentAPI;
var gContentWindow;
const { UrlClassifierTestUtils } = Cu.import("resource://testing-common/UrlClassifierTestUtils.jsm", {});
const TP_ENABLED_PREF = "privacy.trackingprotection.enabled";
add_task(setup_UITourTest);
add_task(async function test_setup() {
Services.prefs.setBoolPref("privacy.trackingprotection.enabled", true);
await UrlClassifierTestUtils.addTestTrackers();
registerCleanupFunction(function() {
UrlClassifierTestUtils.cleanupTestTrackers();
Services.prefs.clearUserPref("privacy.trackingprotection.enabled");
});
});
add_UITour_task(async function test_unblock_target() {
await checkToggleTarget("controlCenter-trackingUnblock");
});
add_UITour_task(function setup_block_target() {
// Preparation for test_block_target. These are separate since the reload
// interferes with UITour as it does a teardown. All we really care about
// is the permission manager entry but UITour tests shouldn't rely on that
// implementation detail.
TrackingProtection.disableForCurrentPage();
});
add_UITour_task(async function test_block_target() {
await checkToggleTarget("controlCenter-trackingBlock");
TrackingProtection.enableForCurrentPage();
});
async function checkToggleTarget(targetID) {
let popup = document.getElementById("UITourTooltip");
let trackerOpened = new Promise(function(resolve, reject) {
Services.obs.addObserver(function onopen(subject) {
let asciiSpec = subject.QueryInterface(Ci.nsIHttpChannel).URI.asciiSpec;
if (asciiSpec === "https://tracking.example.com/") {
Services.obs.removeObserver(onopen, "http-on-opening-request");
resolve();
}
}, "http-on-opening-request");
});
await ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
let doc = content.document;
let iframe = doc.createElement("iframe");
iframe.setAttribute("id", "tracking-element");
iframe.setAttribute("src", "https://tracking.example.com/");
doc.body.insertBefore(iframe, doc.body.firstChild);
});
await trackerOpened;
let testTargetAvailability = async function(expectedAvailable) {
let data = await getConfigurationPromise("availableTargets");
let available = (data.targets.indexOf(targetID) != -1);
is(available, expectedAvailable, "Target has expected availability.");
};
await testTargetAvailability(false);
await showMenuPromise("controlCenter");
await testTargetAvailability(true);
await showInfoPromise(targetID, "This is " + targetID,
"My arrow should be on the side");
is(popup.popupBoxObject.alignmentPosition, "end_before",
"Check " + targetID + " position");
let hideMenuPromise =
promisePanelElementHidden(window, gIdentityHandler._identityPopup);
await gContentAPI.hideMenu("controlCenter");
await hideMenuPromise;
ok(!is_visible(popup), "The tooltip should now be hidden.");
await testTargetAvailability(false);
await ContentTask.spawn(gBrowser.selectedBrowser, {}, function() {
content.document.getElementById("tracking-element").remove();
});
}