summaryrefslogtreecommitdiffstats
path: root/toolkit/components/cleardata/tests/unit/test_fingerprinting_protection_state.js
blob: 6c50f915518abfe10674c3bc607334f3fe07662d (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
157
158
159
160
161
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

do_get_profile();

add_task(async function test_clear_fingerprinting_protection_state() {
  info("Enabling fingerprinting randomization");
  Services.prefs.setBoolPref("privacy.resistFingerprinting", true);

  let uri = Services.io.newURI("https://example.com");
  let principal = Services.scriptSecurityManager.createContentPrincipal(
    uri,
    {}
  );
  let channel = Services.io.newChannelFromURI(
    uri,
    null, // aLoadingNode
    principal,
    null, // aTriggeringPrincipal
    Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
    Ci.nsIContentPolicy.TYPE_DOCUMENT
  );

  // Test nsIClearDataService.deleteDataFromHost
  let key = Services.rfp.testGenerateRandomKey(channel);
  let keyStr = key.map(bytes => bytes.toString(16).padStart(2, "0")).join("");

  // Verify that the key remains the same without clearing.
  key = Services.rfp.testGenerateRandomKey(channel);
  let keyStrAgain = key
    .map(bytes => bytes.toString(16).padStart(2, "0"))
    .join("");

  Assert.equal(
    keyStr,
    keyStrAgain,
    "The fingerprinting randomization key remain the same without clearing."
  );

  info("Trigger the deleteDataFromHost");
  await new Promise(resolve => {
    Services.clearData.deleteDataFromHost(
      "example.com",
      true /* user request */,
      Ci.nsIClearDataService.CLEAR_FINGERPRINTING_PROTECTION_STATE,
      _ => {
        resolve();
      }
    );
  });

  key = Services.rfp.testGenerateRandomKey(channel);
  let newKeyStr = key
    .map(bytes => bytes.toString(16).padStart(2, "0"))
    .join("");

  Assert.notEqual(
    keyStr,
    newKeyStr,
    "The fingerprinting randomization key is reset properly."
  );

  // Test nsIClearDataService.deleteDataFromBaseDomain
  keyStr = newKeyStr;

  info("Trigger the deleteDataFromBaseDomain");
  await new Promise(resolve => {
    Services.clearData.deleteDataFromBaseDomain(
      "example.com",
      true /* user request */,
      Ci.nsIClearDataService.CLEAR_FINGERPRINTING_PROTECTION_STATE,
      _ => {
        resolve();
      }
    );
  });

  key = Services.rfp.testGenerateRandomKey(channel);
  newKeyStr = key.map(bytes => bytes.toString(16).padStart(2, "0")).join("");

  Assert.notEqual(
    keyStr,
    newKeyStr,
    "The fingerprinting randomization key is reset properly."
  );

  // Test nsIClearDataService.deleteDataFromPrincipal
  keyStr = newKeyStr;

  await new Promise(resolve => {
    Services.clearData.deleteDataFromPrincipal(
      principal,
      true /* user request */,
      Ci.nsIClearDataService.CLEAR_FINGERPRINTING_PROTECTION_STATE,
      _ => {
        resolve();
      }
    );
  });

  key = Services.rfp.testGenerateRandomKey(channel);
  newKeyStr = key.map(bytes => bytes.toString(16).padStart(2, "0")).join("");

  Assert.notEqual(
    keyStr,
    newKeyStr,
    "The fingerprinting randomization key is reset properly."
  );

  // Test nsIClearDataService.deleteData
  keyStr = newKeyStr;

  // Generate a key for another site.
  uri = Services.io.newURI("https://example.org");
  principal = Services.scriptSecurityManager.createContentPrincipal(uri, {});
  let channelAnother = Services.io.newChannelFromURI(
    uri,
    null, // aLoadingNode
    principal,
    null, // aTriggeringPrincipal
    Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_SEC_CONTEXT_IS_NULL,
    Ci.nsIContentPolicy.TYPE_DOCUMENT
  );
  key = Services.rfp.testGenerateRandomKey(channelAnother);
  let keyStrAnother = key
    .map(bytes => bytes.toString(16).padStart(2, "0"))
    .join("");

  info("Trigger the deleteData");
  await new Promise(resolve => {
    Services.clearData.deleteData(
      Ci.nsIClearDataService.CLEAR_FINGERPRINTING_PROTECTION_STATE,
      _ => {
        resolve();
      }
    );
  });

  key = Services.rfp.testGenerateRandomKey(channel);
  newKeyStr = key.map(bytes => bytes.toString(16).padStart(2, "0")).join("");

  Assert.notEqual(
    keyStr,
    newKeyStr,
    "The fingerprinting randomization key is reset properly."
  );

  // Verify whether deleteData clears another site as well.
  key = Services.rfp.testGenerateRandomKey(channelAnother);
  newKeyStr = key.map(bytes => bytes.toString(16).padStart(2, "0")).join("");

  Assert.notEqual(
    keyStrAnother,
    newKeyStr,
    "The fingerprinting randomization key is reset properly for another site."
  );

  Services.prefs.clearUserPref("privacy.resistFingerprinting");
});