diff --git a/src/internal/base-component/__tests__/panorama-metrics.test.ts b/src/internal/base-component/__tests__/panorama-metrics.test.ts index 55637cc..88c9d82 100644 --- a/src/internal/base-component/__tests__/panorama-metrics.test.ts +++ b/src/internal/base-component/__tests__/panorama-metrics.test.ts @@ -6,6 +6,7 @@ import { PanoramaClient } from '../metrics/log-clients'; declare global { interface Window { panorama?: any; + [key: symbol]: any; } } @@ -86,4 +87,20 @@ describe('PanoramaClient', () => { panorama.sendMetric({ timestamp: 15 }); expect(window.panorama).toHaveBeenCalledWith('trackCustomEvent', expect.objectContaining({ timestamp: 15 })); }); + + test('finds panorama function from Symbol.for("panorama") property', () => { + // Remove the regular panorama property + delete window.panorama; + + const mockPanoramaSymbolFn = jest.fn(); + const panoramaSymbol = Symbol.for('panorama'); + (window as any)[panoramaSymbol] = mockPanoramaSymbolFn; + + panorama.sendMetric({ eventValue: 'symbol-test' }); + + expect(mockPanoramaSymbolFn).toHaveBeenCalledWith( + 'trackCustomEvent', + expect.objectContaining({ eventType: 'awsui', eventValue: 'symbol-test' }) + ); + }); }); diff --git a/src/internal/base-component/metrics/log-clients.ts b/src/internal/base-component/metrics/log-clients.ts index c2861bb..cb11005 100644 --- a/src/internal/base-component/metrics/log-clients.ts +++ b/src/internal/base-component/metrics/log-clients.ts @@ -142,6 +142,12 @@ export class PanoramaClient { return currentWindow?.panorama; } + const panoramaSymbol = Symbol.for('panorama'); + const symbolProperty = (currentWindow as any)?.[panoramaSymbol]; + if (typeof symbolProperty === 'function') { + return symbolProperty as PanoramaFunction; + } + if (!currentWindow || currentWindow.parent === currentWindow) { // When the window has no more parents, it references itself return undefined;