mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 17:23:37 +00:00
[PM-5189] Refactoring implementation and fixing issues with typing data
This commit is contained in:
@@ -1,3 +1,5 @@
|
|||||||
|
import { AutofillOverlayPort } from "../../utils/autofill-overlay.enum";
|
||||||
|
|
||||||
import AutofillOverlayIframeElement from "./autofill-overlay-iframe-element";
|
import AutofillOverlayIframeElement from "./autofill-overlay-iframe-element";
|
||||||
import AutofillOverlayIframeService from "./autofill-overlay-iframe.service";
|
import AutofillOverlayIframeService from "./autofill-overlay-iframe.service";
|
||||||
|
|
||||||
@@ -11,8 +13,7 @@ describe("AutofillOverlayIframeElement", () => {
|
|||||||
super();
|
super();
|
||||||
new AutofillOverlayIframeElement(
|
new AutofillOverlayIframeElement(
|
||||||
this,
|
this,
|
||||||
"overlay/button.html",
|
AutofillOverlayPort.Button,
|
||||||
"overlay/button",
|
|
||||||
{ background: "transparent", border: "none" },
|
{ background: "transparent", border: "none" },
|
||||||
"bitwardenOverlayButton",
|
"bitwardenOverlayButton",
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import { AutofillOverlayPort } from "../../utils/autofill-overlay.enum";
|
|||||||
import AutofillOverlayIframeService from "./autofill-overlay-iframe.service";
|
import AutofillOverlayIframeService from "./autofill-overlay-iframe.service";
|
||||||
|
|
||||||
describe("AutofillOverlayIframeService", () => {
|
describe("AutofillOverlayIframeService", () => {
|
||||||
const iframePath = "overlay/list.html";
|
|
||||||
let autofillOverlayIframeService: AutofillOverlayIframeService;
|
let autofillOverlayIframeService: AutofillOverlayIframeService;
|
||||||
let portSpy: chrome.runtime.Port;
|
let portSpy: chrome.runtime.Port;
|
||||||
let shadowAppendSpy: jest.SpyInstance;
|
let shadowAppendSpy: jest.SpyInstance;
|
||||||
@@ -25,9 +24,11 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
const shadow = document.createElement("div").attachShadow({ mode: "open" });
|
const shadow = document.createElement("div").attachShadow({ mode: "open" });
|
||||||
autofillOverlayIframeService = new AutofillOverlayIframeService(
|
autofillOverlayIframeService = new AutofillOverlayIframeService(
|
||||||
iframePath,
|
|
||||||
AutofillOverlayPort.Button,
|
|
||||||
shadow,
|
shadow,
|
||||||
|
AutofillOverlayPort.Button,
|
||||||
|
{ height: "0px" },
|
||||||
|
"title",
|
||||||
|
"ariaAlert",
|
||||||
);
|
);
|
||||||
shadowAppendSpy = jest.spyOn(shadow, "appendChild");
|
shadowAppendSpy = jest.spyOn(shadow, "appendChild");
|
||||||
handlePortDisconnectSpy = jest.spyOn(
|
handlePortDisconnectSpy = jest.spyOn(
|
||||||
@@ -48,9 +49,9 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("initOverlayIframe", () => {
|
describe("initMenuIframe", () => {
|
||||||
it("sets up the iframe's attributes", () => {
|
it("sets up the iframe's attributes", () => {
|
||||||
autofillOverlayIframeService.initOverlayIframe({ height: "0px" }, "title");
|
autofillOverlayIframeService.initMenuIframe();
|
||||||
|
|
||||||
expect(autofillOverlayIframeService["iframe"]).toMatchSnapshot();
|
expect(autofillOverlayIframeService["iframe"]).toMatchSnapshot();
|
||||||
});
|
});
|
||||||
@@ -58,7 +59,7 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
it("appends the iframe to the shadowDom", () => {
|
it("appends the iframe to the shadowDom", () => {
|
||||||
jest.spyOn(autofillOverlayIframeService["shadow"], "appendChild");
|
jest.spyOn(autofillOverlayIframeService["shadow"], "appendChild");
|
||||||
|
|
||||||
autofillOverlayIframeService.initOverlayIframe({}, "title");
|
autofillOverlayIframeService.initMenuIframe();
|
||||||
|
|
||||||
expect(autofillOverlayIframeService["shadow"].appendChild).toHaveBeenCalledWith(
|
expect(autofillOverlayIframeService["shadow"].appendChild).toHaveBeenCalledWith(
|
||||||
autofillOverlayIframeService["iframe"],
|
autofillOverlayIframeService["iframe"],
|
||||||
@@ -69,7 +70,7 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
const ariaAlert = "aria alert";
|
const ariaAlert = "aria alert";
|
||||||
jest.spyOn(autofillOverlayIframeService as any, "createAriaAlertElement");
|
jest.spyOn(autofillOverlayIframeService as any, "createAriaAlertElement");
|
||||||
|
|
||||||
autofillOverlayIframeService.initOverlayIframe({}, "title", ariaAlert);
|
autofillOverlayIframeService.initMenuIframe();
|
||||||
|
|
||||||
expect(autofillOverlayIframeService["createAriaAlertElement"]).toHaveBeenCalledWith(
|
expect(autofillOverlayIframeService["createAriaAlertElement"]).toHaveBeenCalledWith(
|
||||||
ariaAlert,
|
ariaAlert,
|
||||||
@@ -79,7 +80,7 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
|
|
||||||
describe("on load of the iframe source", () => {
|
describe("on load of the iframe source", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
autofillOverlayIframeService.initOverlayIframe({ height: "0px" }, "title", "ariaAlert");
|
autofillOverlayIframeService.initMenuIframe();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("sets up and connects the port message listener to the extension background", () => {
|
it("sets up and connects the port message listener to the extension background", () => {
|
||||||
@@ -122,7 +123,7 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
|
|
||||||
describe("event listeners", () => {
|
describe("event listeners", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
autofillOverlayIframeService.initOverlayIframe({ height: "0px" }, "title", "ariaAlert");
|
autofillOverlayIframeService.initMenuIframe();
|
||||||
autofillOverlayIframeService["iframe"].dispatchEvent(new Event(EVENTS.LOAD));
|
autofillOverlayIframeService["iframe"].dispatchEvent(new Event(EVENTS.LOAD));
|
||||||
Object.defineProperty(autofillOverlayIframeService["iframe"], "contentWindow", {
|
Object.defineProperty(autofillOverlayIframeService["iframe"], "contentWindow", {
|
||||||
value: {
|
value: {
|
||||||
@@ -403,7 +404,7 @@ describe("AutofillOverlayIframeService", () => {
|
|||||||
|
|
||||||
describe("mutation observer", () => {
|
describe("mutation observer", () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
autofillOverlayIframeService.initOverlayIframe({ height: "0px" }, "title", "ariaAlert");
|
autofillOverlayIframeService.initMenuIframe();
|
||||||
autofillOverlayIframeService["iframe"].dispatchEvent(new Event(EVENTS.LOAD));
|
autofillOverlayIframeService["iframe"].dispatchEvent(new Event(EVENTS.LOAD));
|
||||||
portSpy = autofillOverlayIframeService["port"];
|
portSpy = autofillOverlayIframeService["port"];
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ class AutofillOverlayIframeService implements AutofillOverlayIframeServiceInterf
|
|||||||
private defaultIframeAttributes: Record<string, string> = {
|
private defaultIframeAttributes: Record<string, string> = {
|
||||||
src: "",
|
src: "",
|
||||||
title: "",
|
title: "",
|
||||||
// sandbox: "allow-scripts",
|
|
||||||
allowtransparency: "true",
|
allowtransparency: "true",
|
||||||
tabIndex: "-1",
|
tabIndex: "-1",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import { setElementStyles } from "../../../utils";
|
|||||||
|
|
||||||
export class AutofillOverlayMenuContainer {
|
export class AutofillOverlayMenuContainer {
|
||||||
private initMessage: any;
|
private initMessage: any;
|
||||||
|
|
||||||
private extensionOriginsSet: Set<string>;
|
private extensionOriginsSet: Set<string>;
|
||||||
private port: chrome.runtime.Port | null = null;
|
private port: chrome.runtime.Port | null = null;
|
||||||
private portName: string;
|
private portName: string;
|
||||||
@@ -30,7 +29,7 @@ export class AutofillOverlayMenuContainer {
|
|||||||
private defaultIframeAttributes: Record<string, string> = {
|
private defaultIframeAttributes: Record<string, string> = {
|
||||||
src: "",
|
src: "",
|
||||||
title: "",
|
title: "",
|
||||||
// sandbox: "allow-scripts",
|
sandbox: "allow-scripts",
|
||||||
allowtransparency: "true",
|
allowtransparency: "true",
|
||||||
tabIndex: "-1",
|
tabIndex: "-1",
|
||||||
};
|
};
|
||||||
@@ -69,9 +68,13 @@ export class AutofillOverlayMenuContainer {
|
|||||||
this.port = chrome.runtime.connect({ name: this.portName });
|
this.port = chrome.runtime.connect({ name: this.portName });
|
||||||
this.port.onMessage.addListener(this.handlePortMessage);
|
this.port.onMessage.addListener(this.handlePortMessage);
|
||||||
|
|
||||||
this.iframe.contentWindow?.postMessage(this.initMessage, "*");
|
this.postMessageToIframe(this.initMessage);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private postMessageToIframe(message: any) {
|
||||||
|
this.iframe?.contentWindow?.postMessage(message, "*");
|
||||||
|
}
|
||||||
|
|
||||||
private handlePortMessage = (message: any, port: chrome.runtime.Port) => {
|
private handlePortMessage = (message: any, port: chrome.runtime.Port) => {
|
||||||
if (port.name !== this.portName) {
|
if (port.name !== this.portName) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { mock } from "jest-mock-extended";
|
import { mock } from "jest-mock-extended";
|
||||||
|
|
||||||
import { flushPromises } from "../../../spec/testing-utils";
|
|
||||||
import { OverlayButtonWindowMessageHandlers } from "../../abstractions/autofill-overlay-button";
|
import { OverlayButtonWindowMessageHandlers } from "../../abstractions/autofill-overlay-button";
|
||||||
|
|
||||||
import AutofillOverlayPageElement from "./autofill-overlay-page-element";
|
import AutofillOverlayPageElement from "./autofill-overlay-page-element";
|
||||||
@@ -48,7 +47,6 @@ describe("AutofillOverlayPageElement", () => {
|
|||||||
"button",
|
"button",
|
||||||
"https://jest-testing-website.com",
|
"https://jest-testing-website.com",
|
||||||
translations,
|
translations,
|
||||||
"https://jest-testing-website.com/message-connector",
|
|
||||||
portKey,
|
portKey,
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -63,26 +61,6 @@ describe("AutofillOverlayPageElement", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("initMessageConnector", () => {
|
|
||||||
it("initializes the message connector iframe", async () => {
|
|
||||||
const elementName = "list";
|
|
||||||
const messageConnectorUrl = "https://jest-testing-website.com/message-connector";
|
|
||||||
const messageConnectorIframe = document.createElement("iframe");
|
|
||||||
jest.spyOn(messageConnectorIframe, "addEventListener");
|
|
||||||
jest.spyOn(globalThis.document, "createElement").mockReturnValue(messageConnectorIframe);
|
|
||||||
|
|
||||||
void autofillOverlayPageElement["initMessageConnector"](messageConnectorUrl, elementName);
|
|
||||||
messageConnectorIframe.dispatchEvent(new Event("load"));
|
|
||||||
await flushPromises();
|
|
||||||
|
|
||||||
expect(messageConnectorIframe.src).toEqual(messageConnectorUrl);
|
|
||||||
expect(messageConnectorIframe.addEventListener).toHaveBeenCalledWith(
|
|
||||||
"load",
|
|
||||||
expect.any(Function),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("postMessageToConnector", () => {
|
describe("postMessageToConnector", () => {
|
||||||
it("posts a message to the parent", () => {
|
it("posts a message to the parent", () => {
|
||||||
autofillOverlayPageElement["postMessageToConnector"]({ command: "test" });
|
autofillOverlayPageElement["postMessageToConnector"]({ command: "test" });
|
||||||
|
|||||||
@@ -173,7 +173,6 @@ function createInitAutofillOverlayButtonMessageMock(
|
|||||||
translations: overlayPagesTranslations,
|
translations: overlayPagesTranslations,
|
||||||
styleSheetUrl: "https://jest-testing-website.com",
|
styleSheetUrl: "https://jest-testing-website.com",
|
||||||
authStatus: AuthenticationStatus.Unlocked,
|
authStatus: AuthenticationStatus.Unlocked,
|
||||||
messageConnectorUrl: "https://jest-testing-website.com/message-connector",
|
|
||||||
portKey: "portKey",
|
portKey: "portKey",
|
||||||
...customFields,
|
...customFields,
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user