summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/unit/test_IE_cookies.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/migration/tests/unit/test_IE_cookies.js')
-rw-r--r--browser/components/migration/tests/unit/test_IE_cookies.js149
1 files changed, 149 insertions, 0 deletions
diff --git a/browser/components/migration/tests/unit/test_IE_cookies.js b/browser/components/migration/tests/unit/test_IE_cookies.js
new file mode 100644
index 0000000000..bb003ad5a5
--- /dev/null
+++ b/browser/components/migration/tests/unit/test_IE_cookies.js
@@ -0,0 +1,149 @@
+"use strict";
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "ctypes",
+ "resource://gre/modules/ctypes.jsm"
+);
+
+add_task(async function() {
+ let migrator = await MigrationUtils.getMigrator("ie");
+ // Sanity check for the source.
+ Assert.ok(await migrator.isSourceAvailable());
+
+ // Windows versions newer than 1709 don't store cookies as files anymore,
+ // thus our migrators don't import anything and this test is pointless.
+ // In these versions the CookD folder contains a deprecated.cookie file.
+ let deprecatedCookie = Services.dirsvc.get("CookD", Ci.nsIFile);
+ deprecatedCookie.append("deprecated.cookie");
+ if (deprecatedCookie.exists()) {
+ return;
+ }
+
+ const BOOL = ctypes.bool;
+ const LPCTSTR = ctypes.char16_t.ptr;
+ const DWORD = ctypes.uint32_t;
+ const LPDWORD = DWORD.ptr;
+
+ let wininet = ctypes.open("Wininet");
+
+ /*
+ BOOL InternetSetCookieW(
+ _In_ LPCTSTR lpszUrl,
+ _In_ LPCTSTR lpszCookieName,
+ _In_ LPCTSTR lpszCookieData
+ );
+ */
+ // NOTE: Even though MSDN documentation does not indicate a calling convention,
+ // InternetSetCookieW is declared in SDK headers as __stdcall but is exported
+ // from wininet.dll without name mangling, so it is effectively winapi_abi
+ let setIECookie = wininet.declare(
+ "InternetSetCookieW",
+ ctypes.winapi_abi,
+ BOOL,
+ LPCTSTR,
+ LPCTSTR,
+ LPCTSTR
+ );
+
+ /*
+ BOOL InternetGetCookieW(
+ _In_ LPCTSTR lpszUrl,
+ _In_ LPCTSTR lpszCookieName,
+ _Out_ LPCTSTR lpszCookieData,
+ _Inout_ LPDWORD lpdwSize
+ );
+ */
+ // NOTE: Even though MSDN documentation does not indicate a calling convention,
+ // InternetGetCookieW is declared in SDK headers as __stdcall but is exported
+ // from wininet.dll without name mangling, so it is effectively winapi_abi
+ let getIECookie = wininet.declare(
+ "InternetGetCookieW",
+ ctypes.winapi_abi,
+ BOOL,
+ LPCTSTR,
+ LPCTSTR,
+ LPCTSTR,
+ LPDWORD
+ );
+
+ // We need to randomize the cookie to avoid clashing with other cookies
+ // that might have been set by previous tests and not properly cleared.
+ let date = new Date().getDate();
+ const COOKIE = {
+ get host() {
+ return new URL(this.href).host;
+ },
+ href: `http://mycookietest.${Math.random()}.com`,
+ name: "testcookie",
+ value: "testvalue",
+ expiry: new Date(new Date().setDate(date + 2)),
+ };
+ let data = ctypes.char16_t.array()(256);
+ let sizeRef = DWORD(256).address();
+
+ registerCleanupFunction(() => {
+ // Remove the cookie.
+ try {
+ let expired = new Date(new Date().setDate(date - 2));
+ let rv = setIECookie(
+ COOKIE.href,
+ COOKIE.name,
+ `; expires=${expired.toUTCString()}`
+ );
+ Assert.ok(rv, "Expired the IE cookie");
+ Assert.ok(
+ !getIECookie(COOKIE.href, COOKIE.name, data, sizeRef),
+ "The cookie has been properly removed"
+ );
+ } catch (ex) {}
+
+ // Close the library.
+ try {
+ wininet.close();
+ } catch (ex) {}
+ });
+
+ // Create the persistent cookie in IE.
+ let value = `${COOKIE.value}; expires=${COOKIE.expiry.toUTCString()}`;
+ let rv = setIECookie(COOKIE.href, COOKIE.name, value);
+ Assert.ok(rv, "Added a persistent IE cookie: " + value);
+
+ // Sanity check the cookie has been created.
+ Assert.ok(
+ getIECookie(COOKIE.href, COOKIE.name, data, sizeRef),
+ "Found the added persistent IE cookie"
+ );
+ info("Found cookie: " + data.readString());
+ Assert.equal(
+ data.readString(),
+ `${COOKIE.name}=${COOKIE.value}`,
+ "Found the expected cookie"
+ );
+
+ // Sanity check that there are no cookies.
+ Assert.equal(
+ Services.cookies.countCookiesFromHost(COOKIE.host),
+ 0,
+ "There are no cookies initially"
+ );
+
+ // Migrate cookies.
+ await promiseMigration(migrator, MigrationUtils.resourceTypes.COOKIES);
+
+ Assert.equal(
+ Services.cookies.countCookiesFromHost(COOKIE.host),
+ 1,
+ "Migrated the expected number of cookies"
+ );
+
+ // Now check the cookie details.
+ let cookies = Services.cookies.getCookiesFromHost(COOKIE.host, {});
+ Assert.ok(cookies.length);
+ let foundCookie = cookies[0];
+
+ Assert.equal(foundCookie.name, COOKIE.name);
+ Assert.equal(foundCookie.value, COOKIE.value);
+ Assert.equal(foundCookie.host, "." + COOKIE.host);
+ Assert.equal(foundCookie.expiry, Math.floor(COOKIE.expiry / 1000));
+});