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:
@@ -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", () => {
|
||||||
|
|||||||
@@ -61,6 +61,6 @@ export class BrowserExtensionPromptComponent implements OnInit, OnDestroy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
openExtension(): void {
|
openExtension(): void {
|
||||||
this.browserExtensionPromptService.openExtension();
|
this.browserExtensionPromptService.openExtension(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
Reference in New Issue
Block a user