Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
810a3c17fd |
@@ -204,12 +204,11 @@
|
|||||||
"</svg>",
|
"</svg>",
|
||||||
);
|
);
|
||||||
|
|
||||||
// EIP-6963 wants a fresh UUIDv4 per page load — it identifies one
|
// EIP-6963 asks for one UUIDv4 per provider for the life of the page: one
|
||||||
// announcement, so a provider can be told apart from another instance of
|
// per page load, shared by every announcement in that load. It is
|
||||||
// itself in the same page. It is generated here and never stored:
|
// generated here and never stored: announcing one persisted value to every
|
||||||
// announcing one persisted value to every site, on every load and across
|
// site, on every load and across restarts, turned it into a stable
|
||||||
// restarts, turned it into a stable cross-site, cross-session tracking
|
// cross-site, cross-session tracking identifier any page could read
|
||||||
// identifier any page could read
|
|
||||||
// (https://git.eeqj.de/sneak/AutistMask/issues/398).
|
// (https://git.eeqj.de/sneak/AutistMask/issues/398).
|
||||||
const providerUuid = crypto.randomUUID();
|
const providerUuid = crypto.randomUUID();
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,13 @@
|
|||||||
// persisted in extension storage, and announced verbatim to every page on
|
// persisted in extension storage, and announced verbatim to every page on
|
||||||
// every load and across browser restarts, so any site — connected or not —
|
// every load and across browser restarts, so any site — connected or not —
|
||||||
// could read a stable cross-site, cross-session identifier for the install.
|
// could read a stable cross-site, cross-session identifier for the install.
|
||||||
// EIP-6963 wants a fresh UUIDv4 per announcement instead. The fix generates
|
// EIP-6963 asks for one UUIDv4 per page load, shared by every announcement in
|
||||||
// it per page load and stores nothing.
|
// that load. The fix generates it per page load and stores nothing.
|
||||||
|
//
|
||||||
|
// The stored UUID reached inpage.js as an AUTISTMASK_PROVIDER_UUID page
|
||||||
|
// message from the content script, and inpage.js then announced it. Each load
|
||||||
|
// below is posted the same stored UUID that way, so on the old code both loads
|
||||||
|
// announce it and the last two tests fail.
|
||||||
//
|
//
|
||||||
// inpage.js is a bare IIFE injected into the page's JS context, not a module;
|
// inpage.js is a bare IIFE injected into the page's JS context, not a module;
|
||||||
// see tests/inpageErrors.test.js for why it is evaluated against a stub window
|
// see tests/inpageErrors.test.js for why it is evaluated against a stub window
|
||||||
@@ -44,9 +49,14 @@ class StubCustomEvent extends StubEvent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Evaluate inpage.js once against a fresh stub window and return every UUID it
|
// What the old content script read out of extension storage and posted to
|
||||||
// announced. A `requestProvider` event is dispatched too, so a re-announcement
|
// every page load.
|
||||||
// within one load is observed as well as the announcement at load.
|
const STORED_UUID = "11111111-2222-4333-8444-555555555555";
|
||||||
|
|
||||||
|
// Evaluate inpage.js once against a fresh stub window, post it STORED_UUID the
|
||||||
|
// way the old content script did, then dispatch a `requestProvider` event so a
|
||||||
|
// re-announcement is observed as well as the announcement at load. Returns
|
||||||
|
// every UUID the load announced, in order.
|
||||||
function announcedUuids() {
|
function announcedUuids() {
|
||||||
const listeners = {};
|
const listeners = {};
|
||||||
const uuids = [];
|
const uuids = [];
|
||||||
@@ -73,6 +83,11 @@ function announcedUuids() {
|
|||||||
win.window = win;
|
win.window = win;
|
||||||
|
|
||||||
loadInto(win, win, webcrypto, StubEvent, StubCustomEvent);
|
loadInto(win, win, webcrypto, StubEvent, StubCustomEvent);
|
||||||
|
win.dispatchEvent({
|
||||||
|
type: "message",
|
||||||
|
source: win,
|
||||||
|
data: { type: "AUTISTMASK_PROVIDER_UUID", uuid: STORED_UUID },
|
||||||
|
});
|
||||||
win.dispatchEvent(new StubEvent("eip6963:requestProvider"));
|
win.dispatchEvent(new StubEvent("eip6963:requestProvider"));
|
||||||
return uuids;
|
return uuids;
|
||||||
}
|
}
|
||||||
@@ -81,7 +96,7 @@ const UUID_V4 =
|
|||||||
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
||||||
|
|
||||||
describe("the EIP-6963 provider UUID is fresh per page load", () => {
|
describe("the EIP-6963 provider UUID is fresh per page load", () => {
|
||||||
test("a load announces a UUIDv4, unprompted, with nothing delivered", () => {
|
test("a load announces a UUIDv4 without being asked", () => {
|
||||||
const uuids = announcedUuids();
|
const uuids = announcedUuids();
|
||||||
expect(uuids.length).toBeGreaterThan(0);
|
expect(uuids.length).toBeGreaterThan(0);
|
||||||
expect(uuids[0]).toMatch(UUID_V4);
|
expect(uuids[0]).toMatch(UUID_V4);
|
||||||
@@ -93,11 +108,11 @@ describe("the EIP-6963 provider UUID is fresh per page load", () => {
|
|||||||
expect(new Set(uuids).size).toBe(1);
|
expect(new Set(uuids).size).toBe(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test("two page loads announce different UUIDs", () => {
|
test("two page loads announce different UUIDs, neither the stored one", () => {
|
||||||
const first = announcedUuids()[0];
|
const first = announcedUuids();
|
||||||
const second = announcedUuids()[0];
|
const second = announcedUuids();
|
||||||
expect(first).toMatch(UUID_V4);
|
expect(first).not.toContain(STORED_UUID);
|
||||||
expect(second).toMatch(UUID_V4);
|
expect(second).not.toContain(STORED_UUID);
|
||||||
expect(second).not.toBe(first);
|
expect(second[0]).not.toBe(first[0]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user