1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-11 05:43:41 +00:00

[PM-18919] Browser Prompt - Show manual error state (#13776)

* show manual open error state if opening via button doesn't work

* shorten manual error timeout

* remove commented line
This commit is contained in:
Nick Krantz
2025-04-01 10:24:36 -05:00
committed by GitHub
parent c3e562e75d
commit 0f204677fb
4 changed files with 51 additions and 3 deletions

View File

@@ -15,12 +15,14 @@ describe("BrowserExtensionPromptComponent", () => {
let fixture: ComponentFixture<BrowserExtensionPromptComponent>; let fixture: ComponentFixture<BrowserExtensionPromptComponent>;
let component: BrowserExtensionPromptComponent; let component: BrowserExtensionPromptComponent;
const start = jest.fn(); const start = jest.fn();
const openExtension = jest.fn();
const pageState$ = new BehaviorSubject(BrowserPromptState.Loading); const pageState$ = new BehaviorSubject(BrowserPromptState.Loading);
const setAttribute = jest.fn(); const setAttribute = jest.fn();
const getAttribute = jest.fn().mockReturnValue("width=1010"); const getAttribute = jest.fn().mockReturnValue("width=1010");
beforeEach(async () => { beforeEach(async () => {
start.mockClear(); start.mockClear();
openExtension.mockClear();
setAttribute.mockClear(); setAttribute.mockClear();
getAttribute.mockClear(); getAttribute.mockClear();
@@ -39,7 +41,7 @@ describe("BrowserExtensionPromptComponent", () => {
providers: [ providers: [
{ {
provide: BrowserExtensionPromptService, provide: BrowserExtensionPromptService,
useValue: { start, pageState$ }, useValue: { start, openExtension, pageState$ },
}, },
{ {
provide: I18nService, provide: I18nService,
@@ -83,6 +85,15 @@ describe("BrowserExtensionPromptComponent", () => {
const errorText = fixture.debugElement.query(By.css("p")).nativeElement; const errorText = fixture.debugElement.query(By.css("p")).nativeElement;
expect(errorText.textContent.trim()).toBe("openingExtensionError"); expect(errorText.textContent.trim()).toBe("openingExtensionError");
}); });
it("opens extension on button click", () => {
const button = fixture.debugElement.query(By.css("button")).nativeElement;
button.click();
expect(openExtension).toHaveBeenCalledTimes(1);
expect(openExtension).toHaveBeenCalledWith(true);
});
}); });
describe("success state", () => { describe("success state", () => {

View File

@@ -61,6 +61,6 @@ export class BrowserExtensionPromptComponent implements OnInit, OnDestroy {
} }
openExtension(): void { openExtension(): void {
this.browserExtensionPromptService.openExtension(); this.browserExtensionPromptService.openExtension(true);
} }
} }

View File

@@ -169,5 +169,32 @@ describe("BrowserExtensionPromptService", () => {
pageTitle: { key: "somethingWentWrong" }, pageTitle: { key: "somethingWentWrong" },
}); });
}); });
it("sets manual open state when open extension is called", (done) => {
service.openExtension(true);
jest.advanceTimersByTime(1000);
service.pageState$.subscribe((state) => {
expect(state).toBe(BrowserPromptState.ManualOpen);
done();
});
});
it("shows success state when extension auto opens", (done) => {
service.openExtension(true);
jest.advanceTimersByTime(500); // don't let timeout occur
window.dispatchEvent(
new MessageEvent("message", { data: { command: VaultMessages.PopupOpened } }),
);
service.pageState$.subscribe((state) => {
expect(state).toBe(BrowserPromptState.Success);
expect(service["extensionCheckTimeout"]).toBeUndefined();
done();
});
});
}); });
}); });

View File

@@ -54,8 +54,18 @@ export class BrowserExtensionPromptService {
} }
/** Post a message to the extension to open */ /** Post a message to the extension to open */
openExtension() { openExtension(setManualErrorTimeout = false) {
window.postMessage({ command: VaultMessages.OpenPopup }); window.postMessage({ command: VaultMessages.OpenPopup });
// Optionally, configure timeout to show the manual open error state if
// the extension does not open within one second.
if (setManualErrorTimeout) {
this.clearExtensionCheckTimeout();
this.extensionCheckTimeout = window.setTimeout(() => {
this.setErrorState(BrowserPromptState.ManualOpen);
}, 750);
}
} }
/** Send message checking for the browser extension */ /** Send message checking for the browser extension */