1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-18 01:03:35 +00:00

[PM-5189] Refactoring implementation and fixing issues with typing data

This commit is contained in:
Cesar Gonzalez
2024-04-16 08:19:17 -05:00
parent 87152cedbd
commit 35af5b8bad
7 changed files with 20 additions and 39 deletions

View File

@@ -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",
); );

View File

@@ -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"];
}); });

View File

@@ -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",
}; };

View File

@@ -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;

View File

@@ -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" });

View File

@@ -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,
}; };