Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/embed/auto-frame-renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,12 @@ class AutoFrameRenderer extends TsEmbed {
*/
public async replaceIframe(iframe: HTMLIFrameElement): Promise<void> {
this.frameToReplace = iframe;
if (this.shouldWaitForRenderPromise) {
await this.isReadyForRenderPromise;
}
const src = this.getMCPIframeSrc(iframe.src);
await this.renderIFrame(src);
this.isRendered = true;
}
}

26 changes: 25 additions & 1 deletion src/embed/base.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import * as base from './base';
import * as embedConfigInstance from './embedConfig';
import * as resetService from '../utils/resetServices';
import * as processTrigger from '../utils/processTrigger';
import { createAndSetInitPromise, getInitPromise, getIsInitCalled, reloadIframe } from './base';
import { createAndSetInitPromise, getInitPromise, getIsInitCalled, getIsInitCompleted, reloadIframe } from './base';

import {
executeAfterWait,
Expand Down Expand Up @@ -607,4 +607,28 @@ describe('Init Promise Functions', () => {
const secondPromise = getInitPromise();
expect(firstPromise).toBe(secondPromise);
});

test('getIsInitCompleted returns false (not undefined) before init resolves', () => {
// fresh store via beforeEach; init not yet called
const result = getIsInitCompleted();
expect(result).toBe(false);
expect(typeof result).toBe('boolean');
});

test('getIsInitCompleted returns true after init resolves', async () => {
base.init({
thoughtSpotHost: 'tshost',
authType: index.AuthType.None,
});
await getInitPromise();
// flush the finally() microtask
await new Promise((r) => setTimeout(r, 0));
expect(getIsInitCompleted()).toBe(true);
});

test('getIsInitCompleted returns false when window store is absent', () => {
// clear the store from window
(window as any)._tsEmbedSDK = {};
expect(getIsInitCompleted()).toBe(false);
});
});
8 changes: 6 additions & 2 deletions src/embed/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,10 @@ export const createAndSetInitPromise = (): void => {
});
initPromise.finally(() => {
const curVal = getValueFromWindow<InitFlagStore>(initFlagKey);
if (!curVal) {
logger.error('initFlagStore missing when marking init complete');
return;
}
curVal.isInitCompleted = true;
storeValueInWindow(initFlagKey, curVal);
});
Expand All @@ -221,8 +225,8 @@ export const getInitPromise = ():
ReturnType<typeof init>
> => getValueFromWindow<InitFlagStore>(initFlagKey)?.initPromise;

export const getIsInitCompleted = (): boolean =>
getValueFromWindow<InitFlagStore>(initFlagKey)?.isInitCompleted;
export const getIsInitCompleted = (): boolean =>
!!getValueFromWindow<InitFlagStore>(initFlagKey)?.isInitCompleted;

export const getIsInitCalled = (): boolean => !!getValueFromWindow(initFlagKey)?.isInitCalled;

Expand Down
Loading
Loading