gecko-dev/toolkit/components/url-classifier/tests/mochitest/trackerFrame.sjs
Dimi Lee 5e81ad2260 Bug 1522412 - P7. A mochitest to test different channel open call sites are classified. r=Ehsan
The goal of this testcase is to provide an easier way to add callsites
to test if it is correctly classified. This is a first step, more callsites should be added to
the testcase(See Bug 1532691)

Flow of the test case:
1. setup the server(trackerFrame.sjs) with the expceted number of request it should receive
2. load the test frame(trackerFrame.html) with cookie restriction off, to ensure all the tracking requests contain cookies
3. server responses a list of tracker's request with cookie after reciving all the requests
4. the list should contain all the trackers in the test frame.
5. enable cookie restriction and load the test frame again.
6. server responses a list of tracker's request without cookie after reciving all the requests
7. the list should contain all the trackers in the test frame.

Differential Revision: https://phabricator.services.mozilla.com/D22116

--HG--
extra : moz-landing-system : lando
2019-03-25 12:51:58 +00:00

76 lines
2.7 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Components.utils.importGlobalProperties(["URLSearchParams"]);
const stateTotalRequests = "total-request";
const stateCallback = "callback-response";
const stateTrackersWithCookie = "trackers-with-cookie";
const stateTrackersWithoutCookie = "trackers-without-cookie";
const stateReceivedTrackers = "received-trackers";
const stateResponseType = "response-tracker-with-cookie";
function reset()
{
setState(stateCallback, "");
setState(stateTrackersWithCookie, "");
setState(stateTrackersWithoutCookie, "");
setState(stateReceivedTrackers, "");
setState(stateResponseType, "");
}
function handleRequest(aRequest, aResponse)
{
let params = new URLSearchParams(aRequest.queryString);
// init the server and tell the server the total number requests to process
// server set the cookie
if (params.has("init")) {
setState(stateTotalRequests, params.get("init"));
aResponse.setStatusLine(aRequest.httpVersion, 200);
aResponse.setHeader("Content-Type", "text/plain", false);
// Prepare the cookie
aResponse.setHeader("Set-Cookie", "cookie=1234");
aResponse.setHeader("Access-Control-Allow-Origin", aRequest.getHeader("Origin"), false);
aResponse.setHeader("Access-Control-Allow-Credentials","true", false);
aResponse.write("begin-test");
// register the callback response, the response will be fired after receiving
// all the request
} else if (params.has("callback")) {
aResponse.processAsync();
aResponse.setHeader("Content-Type", "text/plain", false);
aResponse.setHeader("Access-Control-Allow-Origin", aRequest.getHeader("Origin"), false);
aResponse.setHeader("Access-Control-Allow-Credentials","true", false);
setState(stateResponseType, params.get("callback"));
setObjectState(stateCallback, aResponse);
} else {
let count = parseInt(getState(stateReceivedTrackers) || 0) + 1;
setState(stateReceivedTrackers, count.toString());
let state = "";
if (aRequest.hasHeader("Cookie")) {
state = stateTrackersWithCookie;
} else {
state = stateTrackersWithoutCookie;
}
let ids = params.get("id").concat(",", getState(state));
setState(state, ids);
if (getState(stateTotalRequests) == getState(stateReceivedTrackers)) {
getObjectState(stateCallback, r => {
if (getState(stateResponseType) == "with-cookie") {
r.write(getState(stateTrackersWithCookie));
} else {
r.write(getState(stateTrackersWithoutCookie));
}
r.finish();
reset();
});
}
}
}