@thoughtspot/visual-embed-sdk 1.50.0 → 1.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/package.json +1 -1
- package/cjs/src/css-variables.d.ts +95 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +136 -15
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +59 -37
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +419 -149
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +230 -1
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +30 -16
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +221 -17
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +635 -0
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/host-events.spec.js +151 -0
- package/cjs/src/embed/host-events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.d.ts +51 -14
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.js +11 -1
- package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -0
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +9 -0
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +218 -0
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.d.ts +2 -0
- package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.js +32 -2
- package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
- package/cjs/src/embed/hostEventClient/utils.spec.js +178 -0
- package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +42 -1
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +26 -6
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +83 -2
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +8 -1
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-utils.js +14 -1
- package/cjs/src/embed/spotter-utils.js.map +1 -1
- package/cjs/src/embed/spotter-utils.spec.js +61 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.d.ts +34 -0
- package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.spec.js +17 -0
- package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +29 -7
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +146 -0
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.d.ts +1 -0
- package/cjs/src/errors.d.ts.map +1 -1
- package/cjs/src/errors.js +1 -0
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/index.d.ts +2 -2
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +3 -2
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/mixpanel-service.d.ts +4 -0
- package/cjs/src/mixpanel-service.d.ts.map +1 -1
- package/cjs/src/mixpanel-service.js +4 -0
- package/cjs/src/mixpanel-service.js.map +1 -1
- package/cjs/src/react/util.spec.js +251 -0
- package/cjs/src/react/util.spec.js.map +1 -1
- package/cjs/src/types.d.ts +573 -11
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +519 -2
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/processData.spec.js +93 -0
- package/cjs/src/utils/processData.spec.js.map +1 -1
- package/cjs/src/utils/processTrigger.spec.js +61 -0
- package/cjs/src/utils/processTrigger.spec.js.map +1 -1
- package/dist/{index-B5xoN6Cp.js → index-aBzH5ZwF.js} +1 -1
- package/dist/src/css-variables.d.ts +95 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +136 -15
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +230 -1
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +51 -14
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -0
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/utils.d.ts +2 -0
- package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +42 -1
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +8 -1
- package/dist/src/embed/spotter-utils.d.ts.map +1 -1
- package/dist/src/embed/spotter-viz-utils.d.ts +34 -0
- package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts +4 -0
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/types.d.ts +573 -11
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +936 -142
- package/dist/tsembed-react.js +935 -141
- package/dist/tsembed.es.js +935 -142
- package/dist/tsembed.js +933 -140
- package/dist/visual-embed-sdk-react-full.d.ts +1147 -44
- package/dist/visual-embed-sdk-react.d.ts +1153 -46
- package/dist/visual-embed-sdk.d.ts +1161 -46
- package/lib/package.json +1 -1
- package/lib/src/css-variables.d.ts +95 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +136 -15
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +60 -38
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +420 -150
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +230 -1
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +31 -17
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +222 -18
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +635 -0
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/host-events.spec.js +152 -1
- package/lib/src/embed/host-events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +51 -14
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.js +10 -0
- package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -0
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +10 -1
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +218 -0
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.d.ts +2 -0
- package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/utils.js +28 -1
- package/lib/src/embed/hostEventClient/utils.js.map +1 -1
- package/lib/src/embed/hostEventClient/utils.spec.js +179 -1
- package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +42 -1
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +26 -6
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +83 -2
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +8 -1
- package/lib/src/embed/spotter-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-utils.js +12 -0
- package/lib/src/embed/spotter-utils.js.map +1 -1
- package/lib/src/embed/spotter-utils.spec.js +62 -1
- package/lib/src/embed/spotter-utils.spec.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.d.ts +34 -0
- package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-viz-utils.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.spec.js +17 -0
- package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +29 -7
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +146 -0
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts +1 -0
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js +1 -0
- package/lib/src/errors.js.map +1 -1
- package/lib/src/index.d.ts +2 -2
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +2 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/mixpanel-service.d.ts +4 -0
- package/lib/src/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +4 -0
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/react/util.spec.js +251 -0
- package/lib/src/react/util.spec.js.map +1 -1
- package/lib/src/types.d.ts +573 -11
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +519 -2
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/processData.spec.js +93 -0
- package/lib/src/utils/processData.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.spec.js +61 -0
- package/lib/src/utils/processTrigger.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +1161 -46
- package/package.json +1 -1
- package/src/css-variables.ts +118 -0
- package/src/embed/app.spec.ts +530 -183
- package/src/embed/app.ts +209 -66
- package/src/embed/conversation.spec.ts +275 -21
- package/src/embed/conversation.ts +262 -17
- package/src/embed/events.spec.ts +757 -1
- package/src/embed/host-events.spec.ts +194 -0
- package/src/embed/hostEventClient/contracts.ts +57 -14
- package/src/embed/hostEventClient/host-event-client.spec.ts +338 -0
- package/src/embed/hostEventClient/host-event-client.ts +16 -0
- package/src/embed/hostEventClient/utils.spec.ts +204 -0
- package/src/embed/hostEventClient/utils.ts +37 -10
- package/src/embed/liveboard.spec.ts +108 -2
- package/src/embed/liveboard.ts +82 -14
- package/src/embed/spotter-utils.spec.ts +68 -1
- package/src/embed/spotter-utils.ts +16 -1
- package/src/embed/spotter-viz-utils.spec.ts +17 -0
- package/src/embed/spotter-viz-utils.ts +34 -0
- package/src/embed/ts-embed.spec.ts +186 -0
- package/src/embed/ts-embed.ts +30 -4
- package/src/errors.ts +1 -0
- package/src/index.ts +3 -1
- package/src/mixpanel-service.ts +4 -0
- package/src/react/util.spec.tsx +255 -0
- package/src/types.ts +575 -8
- package/src/utils/processData.spec.ts +97 -0
- package/src/utils/processTrigger.spec.ts +91 -0
|
@@ -1170,6 +1170,32 @@ describe('Unit test case for ts embed', () => {
|
|
|
1170
1170
|
const { mockGetPreauthInfo } = await setup(true, 123);
|
|
1171
1171
|
expect(mockGetPreauthInfo).toHaveBeenCalledTimes(0);
|
|
1172
1172
|
});
|
|
1173
|
+
test('should NOT trigger InfoSuccess when getPreauthInfo resolves with no .info field', async () => {
|
|
1174
|
+
jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler) => {
|
|
1175
|
+
handler({
|
|
1176
|
+
data: { type: 'xyz' },
|
|
1177
|
+
ports: [3000],
|
|
1178
|
+
source: null,
|
|
1179
|
+
});
|
|
1180
|
+
});
|
|
1181
|
+
mockProcessTrigger.mockResolvedValueOnce({ session: 'test' });
|
|
1182
|
+
jest.spyOn(authService, 'fetchPreauthInfoService').mockResolvedValueOnce({
|
|
1183
|
+
ok: true,
|
|
1184
|
+
headers: new Headers({ 'content-type': 'application/json' }),
|
|
1185
|
+
json: async () => ({}), // no .info field
|
|
1186
|
+
});
|
|
1187
|
+
const iFrame = document.createElement('div');
|
|
1188
|
+
jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValueOnce(true);
|
|
1189
|
+
const tsEmbed = new SearchEmbed(getRootEl(), {});
|
|
1190
|
+
iFrame.contentWindow = { postMessage: jest.fn() };
|
|
1191
|
+
jest.spyOn(iFrame, 'addEventListener').mockImplementationOnce((event, handler) => { handler({}); });
|
|
1192
|
+
jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
|
|
1193
|
+
await tsEmbed.render();
|
|
1194
|
+
await executeAfterWait(() => {
|
|
1195
|
+
const infoSuccessCall = mockProcessTrigger.mock.calls.find((call) => call[1] === HostEvent.InfoSuccess);
|
|
1196
|
+
expect(infoSuccessCall).toBeUndefined();
|
|
1197
|
+
});
|
|
1198
|
+
});
|
|
1173
1199
|
});
|
|
1174
1200
|
describe('Preauth Cache for FullAppEmbed with PrimaryNavBar', () => {
|
|
1175
1201
|
beforeAll(() => {
|
|
@@ -1893,6 +1919,43 @@ describe('Unit test case for ts embed', () => {
|
|
|
1893
1919
|
orgId: overrideOrgId,
|
|
1894
1920
|
});
|
|
1895
1921
|
});
|
|
1922
|
+
it('Sets the overrideHistoryState param', async () => {
|
|
1923
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1924
|
+
frameParams: {
|
|
1925
|
+
width: '100%',
|
|
1926
|
+
height: '100%',
|
|
1927
|
+
},
|
|
1928
|
+
overrideHistoryState: true,
|
|
1929
|
+
});
|
|
1930
|
+
await appEmbed.render();
|
|
1931
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
1932
|
+
overrideHistoryState: true,
|
|
1933
|
+
});
|
|
1934
|
+
});
|
|
1935
|
+
it('Sets the overrideHistoryState param to false', async () => {
|
|
1936
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1937
|
+
frameParams: {
|
|
1938
|
+
width: '100%',
|
|
1939
|
+
height: '100%',
|
|
1940
|
+
},
|
|
1941
|
+
overrideHistoryState: false,
|
|
1942
|
+
});
|
|
1943
|
+
await appEmbed.render();
|
|
1944
|
+
expectUrlToHaveParamsWithValues(getIFrameSrc(), {
|
|
1945
|
+
overrideHistoryState: false,
|
|
1946
|
+
});
|
|
1947
|
+
});
|
|
1948
|
+
it('Should not add overrideHistoryState param when it is undefined', async () => {
|
|
1949
|
+
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1950
|
+
frameParams: {
|
|
1951
|
+
width: '100%',
|
|
1952
|
+
height: '100%',
|
|
1953
|
+
},
|
|
1954
|
+
});
|
|
1955
|
+
await appEmbed.render();
|
|
1956
|
+
const url = getIFrameSrc();
|
|
1957
|
+
expect(url).not.toContain('overrideHistoryState');
|
|
1958
|
+
});
|
|
1896
1959
|
it('Should not add contextMenuEnabledOnWhichClick flag to the iframe src when it is not passed', async () => {
|
|
1897
1960
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
1898
1961
|
...defaultViewConfig,
|
|
@@ -3723,6 +3786,20 @@ describe('Trigger method edge cases', () => {
|
|
|
3723
3786
|
expect(result).toBeNull();
|
|
3724
3787
|
});
|
|
3725
3788
|
});
|
|
3789
|
+
test('isValidationError catch: handleError called with embedErrorDetails and error is rethrown', async () => {
|
|
3790
|
+
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3791
|
+
const handleErrorSpy = jest.spyOn(searchEmbed, 'handleError').mockImplementation(() => { });
|
|
3792
|
+
await searchEmbed.render();
|
|
3793
|
+
// First processTrigger call is getAvailableUIPassthroughKeys for DrillDown
|
|
3794
|
+
mockProcessTrigger.mockResolvedValueOnce([
|
|
3795
|
+
{ value: { keys: Object.values(UIPassthroughEvent) } },
|
|
3796
|
+
]);
|
|
3797
|
+
// DrillDown with no points → throwDrillDownValidationError → isValidationError=true
|
|
3798
|
+
await expect(searchEmbed.trigger(HostEvent.DrillDown, {})).rejects.toThrow('DrillDown requires a valid points object');
|
|
3799
|
+
expect(handleErrorSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
3800
|
+
data: expect.objectContaining({ code: EmbedErrorCodes.HOST_EVENT_VALIDATION }),
|
|
3801
|
+
}));
|
|
3802
|
+
});
|
|
3726
3803
|
});
|
|
3727
3804
|
describe('PreRender replaceExistingPreRender scenarios', () => {
|
|
3728
3805
|
beforeAll(() => {
|
|
@@ -3731,6 +3808,9 @@ describe('PreRender replaceExistingPreRender scenarios', () => {
|
|
|
3731
3808
|
authType: AuthType.None,
|
|
3732
3809
|
});
|
|
3733
3810
|
});
|
|
3811
|
+
beforeEach(() => {
|
|
3812
|
+
document.body.innerHTML = getDocumentBody();
|
|
3813
|
+
});
|
|
3734
3814
|
afterEach(() => {
|
|
3735
3815
|
const rootEle = document.getElementById('myRoot');
|
|
3736
3816
|
rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
|
|
@@ -3838,6 +3918,40 @@ describe('Fullscreen change handler behavior', () => {
|
|
|
3838
3918
|
expect(mockProcessTrigger).not.toHaveBeenCalledWith(expect.any(Object), HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
|
|
3839
3919
|
});
|
|
3840
3920
|
});
|
|
3921
|
+
test('disableFullscreenPresentation undefined defaults to true — no fullscreenchange listener registered', () => {
|
|
3922
|
+
init({
|
|
3923
|
+
thoughtSpotHost: 'tshost',
|
|
3924
|
+
authType: AuthType.None,
|
|
3925
|
+
// disableFullscreenPresentation not set → defaults to true via ?? true
|
|
3926
|
+
});
|
|
3927
|
+
const embed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3928
|
+
const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
|
|
3929
|
+
embed['setupFullscreenChangeHandler']();
|
|
3930
|
+
expect(addEventListenerSpy).not.toHaveBeenCalledWith('fullscreenchange', expect.any(Function));
|
|
3931
|
+
addEventListenerSpy.mockRestore();
|
|
3932
|
+
// Restore for other tests in this describe
|
|
3933
|
+
init({ thoughtSpotHost: 'tshost', authType: AuthType.None, disableFullscreenPresentation: false });
|
|
3934
|
+
});
|
|
3935
|
+
test('fullscreenchange fires but iFrame.contentWindow is null — trigger NOT called, debug log emitted', () => {
|
|
3936
|
+
const embed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
3937
|
+
// Give the embed a fake iFrame with null contentWindow
|
|
3938
|
+
embed.iFrame = { contentWindow: null };
|
|
3939
|
+
const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
|
|
3940
|
+
const loggerDebugSpy = jest.spyOn(logger, 'debug').mockImplementation(() => { });
|
|
3941
|
+
const triggerSpy = jest.spyOn(embed, 'trigger').mockImplementation(() => Promise.resolve(null));
|
|
3942
|
+
embed['setupFullscreenChangeHandler']();
|
|
3943
|
+
// Capture the registered handler directly instead of dispatching to document
|
|
3944
|
+
const fullscreenCall = addEventListenerSpy.mock.calls.find((c) => c[0] === 'fullscreenchange');
|
|
3945
|
+
expect(fullscreenCall).toBeTruthy();
|
|
3946
|
+
const handler = fullscreenCall[1];
|
|
3947
|
+
Object.defineProperty(document, 'fullscreenElement', { value: null, writable: true, configurable: true });
|
|
3948
|
+
handler(new Event('fullscreenchange'));
|
|
3949
|
+
expect(triggerSpy).not.toHaveBeenCalled();
|
|
3950
|
+
expect(loggerDebugSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping ExitPresentMode'));
|
|
3951
|
+
addEventListenerSpy.mockRestore();
|
|
3952
|
+
loggerDebugSpy.mockRestore();
|
|
3953
|
+
triggerSpy.mockRestore();
|
|
3954
|
+
});
|
|
3841
3955
|
});
|
|
3842
3956
|
describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
3843
3957
|
const setupPreRenderTest = async (preRenderId, initialConfig) => {
|
|
@@ -4294,6 +4408,38 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
|
|
|
4294
4408
|
expect(placeholderEle.parentElement).not.toBeNull();
|
|
4295
4409
|
embed.destroy();
|
|
4296
4410
|
});
|
|
4411
|
+
// showPreRender located the stale placeholder with a subtree-wide
|
|
4412
|
+
// querySelector but removed it with hostElement.removeChild(), which
|
|
4413
|
+
// only accepts direct children. With fullHeight the placeholder can be
|
|
4414
|
+
// nested deeper than a direct child, so removeChild threw
|
|
4415
|
+
// "NotFoundError: Failed to execute 'removeChild' on 'Node'".
|
|
4416
|
+
it('showPreRender removes a placeholder nested below a direct child without throwing', async () => {
|
|
4417
|
+
createRootEleForEmbed();
|
|
4418
|
+
const embed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
4419
|
+
preRenderId: 'ph-nested-test',
|
|
4420
|
+
liveboardId: 'lb-id',
|
|
4421
|
+
fullHeight: true,
|
|
4422
|
+
});
|
|
4423
|
+
await embed.preRender();
|
|
4424
|
+
await waitFor(() => !!document.querySelector('#tsEmbed-pre-render-child-ph-nested-test'));
|
|
4425
|
+
const hostElement = document.querySelector('#tsEmbedDiv');
|
|
4426
|
+
const placeHolderId = 'tsEmbed-pre-render-placeholder-ph-nested-test';
|
|
4427
|
+
// Simulate the fullHeight layout where the placeholder ends up as
|
|
4428
|
+
// a grandchild of the host element rather than a direct child.
|
|
4429
|
+
const intermediateWrapper = document.createElement('div');
|
|
4430
|
+
const staleNestedPlaceholder = document.createElement('div');
|
|
4431
|
+
staleNestedPlaceholder.id = placeHolderId;
|
|
4432
|
+
intermediateWrapper.appendChild(staleNestedPlaceholder);
|
|
4433
|
+
hostElement.appendChild(intermediateWrapper);
|
|
4434
|
+
expect(hostElement.querySelector(`#${placeHolderId}`)).toBe(staleNestedPlaceholder);
|
|
4435
|
+
// Before the fix this threw NotFoundError.
|
|
4436
|
+
await expect(embed.showPreRender()).resolves.toBeDefined();
|
|
4437
|
+
// The stale nested placeholder is gone; the fresh one is a direct child.
|
|
4438
|
+
expect(staleNestedPlaceholder.isConnected).toBe(false);
|
|
4439
|
+
const currentPlaceholder = embed.getPreRenderPlaceHolderElement();
|
|
4440
|
+
expect(currentPlaceholder.parentElement).toBe(hostElement);
|
|
4441
|
+
embed.destroy();
|
|
4442
|
+
});
|
|
4297
4443
|
});
|
|
4298
4444
|
});
|
|
4299
4445
|
//# sourceMappingURL=ts-embed.spec.js.map
|