232 lines
5.6 KiB
JavaScript
232 lines
5.6 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
add_task(async function test_chips_migration() {
|
|
// Set up a profile.
|
|
let profile = do_get_profile();
|
|
|
|
// Start the cookieservice, to force creation of a database.
|
|
Services.cookies.sessionCookies;
|
|
|
|
// Close the profile.
|
|
await promise_close_profile();
|
|
|
|
// Remove the cookie file in order to create another database file.
|
|
do_get_cookie_file(profile).remove(false);
|
|
|
|
// Create a schema 14 database.
|
|
let database = new CookieDatabaseConnection(do_get_cookie_file(profile), 14);
|
|
|
|
let now = Date.now() * 1000;
|
|
let expiry = Math.round(now / 1e6 + 1000);
|
|
|
|
// Populate db with a first-party unpartitioned cookies
|
|
let cookie = new Cookie(
|
|
"test",
|
|
"Some data",
|
|
"example.com",
|
|
"/",
|
|
expiry,
|
|
now,
|
|
now,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
{},
|
|
Ci.nsICookie.SAMESITE_NONE,
|
|
Ci.nsICookie.SCHEME_UNSET,
|
|
false // isPartitioned
|
|
);
|
|
database.insertCookie(cookie);
|
|
|
|
// Populate db with a first-party unpartitioned cookies with the partitioned attribute
|
|
cookie = new Cookie(
|
|
"test partitioned",
|
|
"Some data",
|
|
"example.com",
|
|
"/",
|
|
expiry,
|
|
now,
|
|
now,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
{},
|
|
Ci.nsICookie.SAMESITE_NONE,
|
|
Ci.nsICookie.SCHEME_UNSET,
|
|
true // isPartitioned
|
|
);
|
|
database.insertCookie(cookie);
|
|
|
|
// Populate db with a first-party unpartitioned cookies with the partitioned attribute
|
|
cookie = new Cookie(
|
|
"test overwrite",
|
|
"Overwritten",
|
|
"example.com",
|
|
"/",
|
|
expiry,
|
|
now,
|
|
now,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
{},
|
|
Ci.nsICookie.SAMESITE_NONE,
|
|
Ci.nsICookie.SCHEME_UNSET,
|
|
true // isPartitioned
|
|
);
|
|
database.insertCookie(cookie);
|
|
|
|
// Populate db with a first-party unpartitioned cookies with the partitioned attribute
|
|
cookie = new Cookie(
|
|
"test overwrite",
|
|
"Did not overwrite",
|
|
"example.com",
|
|
"/",
|
|
expiry,
|
|
now,
|
|
now,
|
|
false,
|
|
false,
|
|
false,
|
|
false,
|
|
{ partitionKey: "(https,example.com)" },
|
|
Ci.nsICookie.SAMESITE_NONE,
|
|
Ci.nsICookie.SCHEME_UNSET,
|
|
true // isPartitioned
|
|
);
|
|
database.insertCookie(cookie);
|
|
|
|
database.close();
|
|
database = null;
|
|
|
|
registerCleanupFunction(() => {
|
|
Services.prefs.clearUserPref("network.cookie.CHIPS.enabled");
|
|
Services.prefs.clearUserPref("network.cookie.CHIPS.migrateDatabase");
|
|
});
|
|
|
|
// Reload profile.
|
|
Services.prefs.setBoolPref("network.cookie.CHIPS.enabled", true);
|
|
Services.prefs.setIntPref("network.cookie.CHIPS.lastMigrateDatabase", 0);
|
|
Services.prefs.setIntPref("network.cookie.CHIPS.migrateDatabaseTarget", 0);
|
|
await promise_load_profile();
|
|
|
|
// Make sure there were no changes
|
|
Assert.equal(
|
|
Services.cookies.getCookiesFromHost("example.com", {}).length,
|
|
3
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {})
|
|
.filter(cookie => cookie.name == "test").length,
|
|
1
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {})
|
|
.filter(cookie => cookie.name == "test partitioned").length,
|
|
1
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {})
|
|
.filter(cookie => cookie.name == "test overwrite").length,
|
|
1
|
|
);
|
|
Assert.equal(
|
|
Services.cookies.getCookiesFromHost("example.com", {
|
|
partitionKey: "(https,example.com)",
|
|
}).length,
|
|
1
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {})
|
|
.filter(cookie => cookie.name == "test overwrite").length,
|
|
1
|
|
);
|
|
|
|
// Close the profile.
|
|
await promise_close_profile();
|
|
|
|
// Reload profile.
|
|
await Services.prefs.setBoolPref("network.cookie.CHIPS.enabled", true);
|
|
await Services.prefs.setIntPref(
|
|
"network.cookie.CHIPS.migrateDatabaseTarget",
|
|
1000
|
|
);
|
|
await promise_load_profile();
|
|
|
|
// Check if the first-party unpartitioned cookie is still there
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {})
|
|
.filter(cookie => cookie.name == "test").length,
|
|
1
|
|
);
|
|
|
|
// Check that we no longer have Partitioned cookies in the unpartitioned storage
|
|
Assert.equal(
|
|
Services.cookies.getCookiesFromHost("example.com", {}).length,
|
|
1
|
|
);
|
|
|
|
// Check that we only have our two partitioned cookies
|
|
Assert.equal(
|
|
Services.cookies.getCookiesFromHost("example.com", {
|
|
partitionKey: "(https,example.com)",
|
|
}).length,
|
|
2
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {
|
|
partitionKey: "(https,example.com)",
|
|
})
|
|
.filter(cookie => cookie.name == "test").length,
|
|
0
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {
|
|
partitionKey: "(https,example.com)",
|
|
})
|
|
.filter(cookie => cookie.name == "test partitioned").length,
|
|
1
|
|
);
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {
|
|
partitionKey: "(https,example.com)",
|
|
})
|
|
.filter(cookie => cookie.name == "test overwrite").length,
|
|
1
|
|
);
|
|
|
|
// Test that we overwrote the value of the cookie in the partition with the
|
|
// value that was not partitioned
|
|
Assert.equal(
|
|
Services.cookies
|
|
.getCookiesFromHost("example.com", {
|
|
partitionKey: "(https,example.com)",
|
|
})
|
|
.filter(cookie => cookie.name == "test overwrite")[0].value,
|
|
"Overwritten"
|
|
);
|
|
|
|
// Make sure we cleared the migration pref as part of the migration
|
|
Assert.equal(
|
|
Services.prefs.getIntPref("network.cookie.CHIPS.lastMigrateDatabase"),
|
|
1000
|
|
);
|
|
|
|
// Cleanup
|
|
Services.cookies.removeAll();
|
|
do_close_profile();
|
|
});
|