summaryrefslogtreecommitdiffstats
path: root/toolkit/components/url-classifier/tests/mochitest/test_trackingprotection_bug1312515.html
blob: 2c5c1e928c5668ab1afda7009b5c0ac3d50425dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!DOCTYPE HTML>
<!-- Any copyright is dedicated to the Public Domain.
     http://creativecommons.org/publicdomain/zero/1.0/ -->
<html>
<head>
  <title>Test Bug 1312515</title>
  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
</head>

<body>

<p><b>To see more of what is happening: <code>export MOZ_LOG=nsChannelClassifier:3</code></b></p>

<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">

<script class="testbody" type="text/javascript">

var mainWindow = window.browsingContext.topChromeWindow;
var contentPage = "http://www.itisatrap.org/chrome/toolkit/components/url-classifier/tests/mochitest/trackingRequest.html";

const {UrlClassifierTestUtils} = ChromeUtils.import("resource://testing-common/UrlClassifierTestUtils.jsm");
const {BrowserTestUtils} = ChromeUtils.import("resource://testing-common/BrowserTestUtils.jsm");
const {TestUtils} = ChromeUtils.import("resource://testing-common/TestUtils.jsm");

function testOnWindow(aPrivate, aCallback) {
  var win = mainWindow.OpenBrowserWindow({private: aPrivate});
  win.addEventListener("load", function() {
    TestUtils.topicObserved("browser-delayed-startup-finished",
                            subject => subject == win).then(() => {
      win.addEventListener("DOMContentLoaded", function onInnerLoad() {
        if (win.content.location.href != contentPage) {
          BrowserTestUtils.loadURIString(win.gBrowser, contentPage);
          return;
        }
        win.removeEventListener("DOMContentLoaded", onInnerLoad, true);

        win.content.addEventListener("load", function innerLoad2() {
          win.content.removeEventListener("load", innerLoad2);
          SimpleTest.executeSoon(function() { aCallback(win); });
        }, false, true);
      }, true);
      SimpleTest.executeSoon(function() { BrowserTestUtils.loadURIString(win.gBrowser, contentPage); });
    });
  }, {capture: true, once: true});
}

const topic = "http-on-before-connect";
var testUrl;
var testWindow;
var resolve;

function checkLowestPriority(aSubject) {
  checkPriority(aSubject, checkLowestPriority, Ci.nsISupportsPriority.PRIORITY_LOWEST, "Priority should be lowest.");
}

function checkNormalPriority(aSubject) {
  checkPriority(aSubject, checkNormalPriority, Ci.nsISupportsPriority.PRIORITY_NORMAL, "Priority should be normal.");
}

function checkPriority(aSubject, aCallback, aPriority, aMessage) {
  var channel = aSubject.QueryInterface(Ci.nsIChannel);
  info("Channel classified: " + channel.name);
  if (channel.name !== testUrl) {
    return;
  }

  SpecialPowers.removeObserver(aCallback, topic);

  var p = aSubject.QueryInterface(Ci.nsISupportsPriority);
  is(p.priority, aPriority, aMessage);

  info("Resolving promise for " + channel.name);
  resolve();
}

function testXHR1() {
  return new Promise(function(aResolve, aReject) {
    testUrl = "http://tracking.example.com/";
    info("Not blocklisted: " + testUrl);
    resolve = aResolve;
    SpecialPowers.addObserver(checkNormalPriority, topic);
    testWindow.content.postMessage({type: "doXHR", url: testUrl}, "*");
  });
}

function testXHR2() {
  return new Promise(function(aResolve, aReject) {
    testUrl = "http://trackertest.org/";
    info("Blocklisted and not entitylisted: " + testUrl);
    resolve = aResolve;
    SpecialPowers.addObserver(checkLowestPriority, topic);
    testWindow.content.postMessage({type: "doXHR", url: testUrl}, "*");
  });
}

function testFetch1() {
  return new Promise(function(aResolve, aReject) {
    testUrl = "http://itisatracker.org/"; // only entitylisted in TP, not for annotations
    info("Blocklisted and not entitylisted: " + testUrl);
    resolve = aResolve;
    SpecialPowers.addObserver(checkLowestPriority, topic);
    testWindow.content.postMessage({type: "doFetch", url: testUrl}, "*");
  });
}

function testFetch2() {
  return new Promise(function(aResolve, aReject) {
    testUrl = "http://tracking.example.org/"; // only entitylisted for annotations, not in TP
    info("Blocklisted but also entitylisted: " + testUrl);
    resolve = aResolve;
    SpecialPowers.addObserver(checkNormalPriority, topic);
    testWindow.content.postMessage({type: "doFetch", url: testUrl}, "*");
  });
}

function endTest() {
  info("Finishing up...");
  testWindow.close();
  testWindow = null;
  SimpleTest.finish();
}

async function test() {
  await SpecialPowers.pushPrefEnv(
    {"set": [["network.http.tailing.enabled", false],
             ["privacy.trackingprotection.enabled", false],
             ["privacy.trackingprotection.annotate_channels", true],
             ["privacy.trackingprotection.lower_network_priority", true],
             ["dom.security.https_first", false]]});
  await UrlClassifierTestUtils.addTestTrackers();
  testOnWindow(false, async function(aWindow) {
    testWindow = aWindow;
    await testXHR1();
    await testXHR2();
    await testFetch1();
    await testFetch2();
    await endTest();
  });
}

SimpleTest.waitForExplicitFinish();
SimpleTest.registerCleanupFunction(function() {
  info("Cleaning up prefs...");
  UrlClassifierTestUtils.cleanupTestTrackers();
});
test();

</script>

</pre>
</body>
</html>