summaryrefslogtreecommitdiffstats
path: root/toolkit/components/url-classifier/tests/mochitest/test_classifier_changetablepref.html
blob: 7423d3e8efc729f178eecc1ee45f87f4b870fbcd (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
<!DOCTYPE HTML>
<html>
<head>
  <title>Bug 1281083 - Changing the urlclassifier.*Table prefs doesn't take effect before the next browser restart.</title>
  <script type="text/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="classifierHelper.js"></script>
  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
</head>

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

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

const testTable = "moz-track-digest256";
const UPDATE_URL = "http://mochi.test:8888/tests/toolkit/components/url-classifier/tests/mochitest/update.sjs";

var Cc = SpecialPowers.Cc;
var Ci = SpecialPowers.Ci;

var prefService = Cc["@mozilla.org/preferences-service;1"]
                  .getService(Ci.nsIPrefService);

var timer = Cc["@mozilla.org/timer;1"]
            .createInstance(Ci.nsITimer);

// If default preference contain the table we want to test,
// We should change test table to a different one.
var trackingTables = SpecialPowers.getCharPref("urlclassifier.trackingTable").split(",");
ok(!trackingTables.includes(testTable), "test table should not be in the preference");

var listmanager = Cc["@mozilla.org/url-classifier/listmanager;1"].
                    getService(Ci.nsIUrlListManager);

is(listmanager.getGethashUrl(testTable), "",
   "gethash url for test table should be empty before setting to preference");

function loadTestFrame() {
  // gethash url of test table "moz-track-digest256" should be updated
  // after setting preference.
  var url = listmanager.getGethashUrl(testTable);
  var expected = SpecialPowers.getCharPref("browser.safebrowsing.provider.mozilla.gethashURL");

  is(url, expected, testTable + " matches its gethash url");

  // Trigger update
  listmanager.disableUpdate(testTable);
  listmanager.enableUpdate(testTable);
  listmanager.maybeToggleUpdateChecking();

  // We wait until "nextupdattime" was set as a signal that update is complete.
  waitForUpdateSuccess(function() {
    document.getElementById("testFrame").src = "bug_1281083.html";
  });
}

function waitForUpdateSuccess(callback) {
  let nextupdatetime =
    SpecialPowers.getCharPref("browser.safebrowsing.provider.mozilla.nextupdatetime");

  if (nextupdatetime !== "1") {
    callback();
    return;
  }

  timer.initWithCallback(function() {
    waitForUpdateSuccess(callback);
  }, 10, Components.interfaces.nsITimer.TYPE_ONE_SHOT);
}

function addCompletionToServer(list, url) {
  return new Promise(function(resolve, reject) {
    var listParam = "list=" + list;
    var fullhashParam = "fullhash=" + hash(url);

    var xhr = new XMLHttpRequest;
    xhr.open("PUT", UPDATE_URL + "?" +
             listParam + "&" +
             fullhashParam, true);
    xhr.setRequestHeader("Content-Type", "text/plain");
    xhr.onreadystatechange = function() {
      if (this.readyState == this.DONE) {
        resolve();
      }
    };
    xhr.send();
  });
}

function hash(str) {
  function bytesFromString(str) {
    var converter =
      SpecialPowers.Cc["@mozilla.org/intl/scriptableunicodeconverter"]
                       .createInstance(SpecialPowers.Ci.nsIScriptableUnicodeConverter);
    converter.charset = "UTF-8";
    return converter.convertToByteArray(str);
  }

  var hasher = SpecialPowers.Cc["@mozilla.org/security/hash;1"]
                               .createInstance(SpecialPowers.Ci.nsICryptoHash);

  var data = bytesFromString(str);
  hasher.init(hasher.SHA256);
  hasher.update(data, data.length);

  return hasher.finish(true);
}

function runTest() {
  /**
   * In this test we try to modify only urlclassifier.*Table preference to see if
   * url specified in the table will be blocked after update.
   */
  var pushPrefPromise = SpecialPowers.pushPrefEnv(
    {"set" : [["urlclassifier.trackingTable", testTable]]});

  // To make sure url is not blocked by an already blocked url.
  // Here we use non-tracking.example.com as a tracked url.
  // Since this table is only used in this bug, so it won't affect other testcases.
  var addCompletePromise =
    addCompletionToServer(testTable, "bug1281083.example.com/");

  Promise.all([pushPrefPromise, addCompletePromise])
    .then(() => {
      loadTestFrame();
    });
}

// Set nextupdatetime to 1 to trigger an update
SpecialPowers.pushPrefEnv(
  {"set" : [["privacy.trackingprotection.enabled", true],
            ["channelclassifier.allowlist_example", true],
            ["browser.safebrowsing.provider.mozilla.nextupdatetime", "1"],
            ["browser.safebrowsing.provider.mozilla.lists", testTable],
            ["browser.safebrowsing.provider.mozilla.updateURL", UPDATE_URL]]},
  runTest);

// Expected finish() call is in "bug_1281083.html".
SimpleTest.waitForExplicitFinish();

</script>
</pre>
<iframe id="testFrame" width="100%" height="100%" onload=""></iframe>
</body>
</html>