From 73ca138145bc4a3aa09dd397dc5d41f3bf2aaaf5 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Fri, 2 Aug 2024 11:29:51 +0200 Subject: [PATCH] fix(browser): Avoid showing browser extension error message in non-`window` global scopes (#13156) Relax our browser extension detection check to avoid showing the error message and blocking `Sentry.init` if the SDK is not initialized in a `window` global scope. For instance, this will allow `Sentry.init` to be executed in (service) workers. We likely don't need to worry about multiple SDK instance collisions in non-`window` global scopes. --- packages/browser/src/sdk.ts | 7 ++++++- packages/browser/test/sdk.test.ts | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index 4dd323c6aa02..1421814ae9e5 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -72,7 +72,12 @@ type Runtime = { }; function shouldShowBrowserExtensionError(): boolean { - const windowWithMaybeExtension = WINDOW as typeof WINDOW & ExtensionProperties; + const windowWithMaybeExtension = + typeof WINDOW.window !== 'undefined' && (WINDOW as typeof WINDOW & ExtensionProperties); + if (!windowWithMaybeExtension) { + // No need to show the error if we're not in a browser window environment (e.g. service workers) + return false; + } const extensionKey = windowWithMaybeExtension.chrome ? 'chrome' : 'browser'; const extensionObject = windowWithMaybeExtension[extensionKey]; diff --git a/packages/browser/test/sdk.test.ts b/packages/browser/test/sdk.test.ts index 31178bc84423..80e54e3d49d2 100644 --- a/packages/browser/test/sdk.test.ts +++ b/packages/browser/test/sdk.test.ts @@ -149,6 +149,7 @@ describe('init', () => { Object.defineProperty(WINDOW, 'chrome', { value: undefined, writable: true }); Object.defineProperty(WINDOW, 'browser', { value: undefined, writable: true }); Object.defineProperty(WINDOW, 'nw', { value: undefined, writable: true }); + Object.defineProperty(WINDOW, 'window', { value: WINDOW, writable: true }); }); it('logs a browser extension error if executed inside a Chrome extension', () => { @@ -229,6 +230,18 @@ describe('init', () => { consoleErrorSpy.mockRestore(); }); + it("doesn't log a browser extension error if the `window` object isn't defined", () => { + const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + Object.defineProperty(WINDOW, 'window', { value: undefined }); + + init(options); + + expect(consoleErrorSpy).not.toHaveBeenCalled(); + + consoleErrorSpy.mockRestore(); + }); + it("doesn't return a client on initialization error", () => { const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});