diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index 04c5b580aa83..dc419e680dbb 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -4,9 +4,9 @@ import { createClientReportEnvelope, dsnToString, getEventDescription, - getGlobalObject, logger, serializeEnvelope, + WINDOW, } from '@sentry/utils'; import { eventFromException, eventFromMessage } from './eventbuilder'; @@ -14,8 +14,6 @@ import { Breadcrumbs } from './integrations'; import { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs'; import { BrowserTransportOptions } from './transports/types'; -const globalObject = getGlobalObject(); - export interface BaseBrowserOptions { /** * A pattern for error URLs which should exclusively be sent to Sentry. @@ -71,9 +69,9 @@ export class BrowserClient extends BaseClient { super(options); - if (options.sendClientReports && globalObject.document) { - globalObject.document.addEventListener('visibilitychange', () => { - if (globalObject.document.visibilityState === 'hidden') { + if (options.sendClientReports && WINDOW.document) { + WINDOW.document.addEventListener('visibilitychange', () => { + if (WINDOW.document.visibilityState === 'hidden') { this._flushOutcomes(); } }); @@ -164,13 +162,12 @@ export class BrowserClient extends BaseClient { const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn)); try { - const global = getGlobalObject(); - const isRealNavigator = Object.prototype.toString.call(global && global.navigator) === '[object Navigator]'; - const hasSendBeacon = isRealNavigator && typeof global.navigator.sendBeacon === 'function'; + const isRealNavigator = Object.prototype.toString.call(WINDOW && WINDOW.navigator) === '[object Navigator]'; + const hasSendBeacon = isRealNavigator && typeof WINDOW.navigator.sendBeacon === 'function'; // Make sure beacon is not used if user configures custom transport options if (hasSendBeacon && !this._options.transportOptions) { // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch - const sendBeacon = global.navigator.sendBeacon.bind(global.navigator); + const sendBeacon = WINDOW.navigator.sendBeacon.bind(WINDOW.navigator); sendBeacon(url, serializeEnvelope(envelope)); } else { // If beacon is not supported or if they are using the tunnel option diff --git a/packages/browser/src/index.ts b/packages/browser/src/index.ts index ab754f6a192f..625df5c37d8d 100644 --- a/packages/browser/src/index.ts +++ b/packages/browser/src/index.ts @@ -1,16 +1,15 @@ export * from './exports'; import { Integrations as CoreIntegrations } from '@sentry/core'; -import { getGlobalObject } from '@sentry/utils'; +import { WINDOW } from '@sentry/utils'; import * as BrowserIntegrations from './integrations'; let windowIntegrations = {}; // This block is needed to add compatibility with the integrations packages when used with a CDN -const _window = getGlobalObject(); -if (_window.Sentry && _window.Sentry.Integrations) { - windowIntegrations = _window.Sentry.Integrations; +if (WINDOW.Sentry && WINDOW.Sentry.Integrations) { + windowIntegrations = WINDOW.Sentry.Integrations; } const INTEGRATIONS = { diff --git a/packages/browser/src/integrations/breadcrumbs.ts b/packages/browser/src/integrations/breadcrumbs.ts index c633bf5d139c..6f89732e9767 100644 --- a/packages/browser/src/integrations/breadcrumbs.ts +++ b/packages/browser/src/integrations/breadcrumbs.ts @@ -4,11 +4,11 @@ import { getCurrentHub } from '@sentry/core'; import { Integration } from '@sentry/types'; import { addInstrumentationHandler, - getGlobalObject, htmlTreeAsString, parseUrl, safeJoin, severityLevelFromString, + WINDOW, } from '@sentry/utils'; /** JSDoc */ @@ -245,10 +245,9 @@ function _fetchBreadcrumb(handlerData: { [key: string]: any }): void { */ // eslint-disable-next-line @typescript-eslint/no-explicit-any function _historyBreadcrumb(handlerData: { [key: string]: any }): void { - const global = getGlobalObject(); let from = handlerData.from; let to = handlerData.to; - const parsedLoc = parseUrl(global.location.href); + const parsedLoc = parseUrl(WINDOW.location.href); let parsedFrom = parseUrl(from); const parsedTo = parseUrl(to); diff --git a/packages/browser/src/integrations/httpcontext.ts b/packages/browser/src/integrations/httpcontext.ts index 2c7d5aa4e841..1d11845510f6 100644 --- a/packages/browser/src/integrations/httpcontext.ts +++ b/packages/browser/src/integrations/httpcontext.ts @@ -1,8 +1,6 @@ import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core'; import { Event, Integration } from '@sentry/types'; -import { getGlobalObject } from '@sentry/utils'; - -const global = getGlobalObject(); +import { WINDOW } from '@sentry/utils'; /** HttpContext integration collects information about HTTP request headers */ export class HttpContext implements Integration { @@ -23,14 +21,14 @@ export class HttpContext implements Integration { addGlobalEventProcessor((event: Event) => { if (getCurrentHub().getIntegration(HttpContext)) { // if none of the information we want exists, don't bother - if (!global.navigator && !global.location && !global.document) { + if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) { return event; } // grab as much info as exists and add it to the event - const url = (event.request && event.request.url) || (global.location && global.location.href); - const { referrer } = global.document || {}; - const { userAgent } = global.navigator || {}; + const url = (event.request && event.request.url) || (WINDOW.location && WINDOW.location.href); + const { referrer } = WINDOW.document || {}; + const { userAgent } = WINDOW.navigator || {}; const headers = { ...(event.request && event.request.headers), diff --git a/packages/browser/src/integrations/trycatch.ts b/packages/browser/src/integrations/trycatch.ts index b6b293d70c37..af06c54d6290 100644 --- a/packages/browser/src/integrations/trycatch.ts +++ b/packages/browser/src/integrations/trycatch.ts @@ -1,5 +1,5 @@ import { Integration, WrappedFunction } from '@sentry/types'; -import { fill, getFunctionName, getGlobalObject, getOriginalFunction } from '@sentry/utils'; +import { fill, getFunctionName, getOriginalFunction, WINDOW } from '@sentry/utils'; import { wrap } from '../helpers'; @@ -80,21 +80,19 @@ export class TryCatch implements Integration { * and provide better metadata. */ public setupOnce(): void { - const global = getGlobalObject(); - if (this._options.setTimeout) { - fill(global, 'setTimeout', _wrapTimeFunction); + fill(WINDOW, 'setTimeout', _wrapTimeFunction); } if (this._options.setInterval) { - fill(global, 'setInterval', _wrapTimeFunction); + fill(WINDOW, 'setInterval', _wrapTimeFunction); } if (this._options.requestAnimationFrame) { - fill(global, 'requestAnimationFrame', _wrapRAF); + fill(WINDOW, 'requestAnimationFrame', _wrapRAF); } - if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) { + if (this._options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) { fill(XMLHttpRequest.prototype, 'send', _wrapXHR); } @@ -185,7 +183,7 @@ function _wrapXHR(originalSend: () => void): () => void { /** JSDoc */ function _wrapEventTarget(target: string): void { // eslint-disable-next-line @typescript-eslint/no-explicit-any - const global = getGlobalObject() as { [key: string]: any }; + const global = WINDOW as { [key: string]: any }; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access const proto = global[target] && global[target].prototype; diff --git a/packages/browser/src/sdk.ts b/packages/browser/src/sdk.ts index e4cb2cfa279c..2c5c9fd63235 100644 --- a/packages/browser/src/sdk.ts +++ b/packages/browser/src/sdk.ts @@ -8,11 +8,11 @@ import { } from '@sentry/core'; import { addInstrumentationHandler, - getGlobalObject, logger, resolvedSyncPromise, stackParserFromStackParserOptions, supportsFetch, + WINDOW, } from '@sentry/utils'; import { BrowserClient, BrowserClientOptions, BrowserOptions } from './client'; @@ -94,10 +94,9 @@ export function init(options: BrowserOptions = {}): void { options.defaultIntegrations = defaultIntegrations; } if (options.release === undefined) { - const window = getGlobalObject(); // This supports the variable that sentry-webpack-plugin injects - if (window.SENTRY_RELEASE && window.SENTRY_RELEASE.id) { - options.release = window.SENTRY_RELEASE.id; + if (WINDOW.SENTRY_RELEASE && WINDOW.SENTRY_RELEASE.id) { + options.release = WINDOW.SENTRY_RELEASE.id; } } if (options.autoSessionTracking === undefined) { @@ -128,8 +127,7 @@ export function init(options: BrowserOptions = {}): void { */ export function showReportDialog(options: ReportDialogOptions = {}, hub: Hub = getCurrentHub()): void { // doesn't work without a document (React Native) - const global = getGlobalObject(); - if (!global.document) { + if (!WINDOW.document) { __DEBUG_BUILD__ && logger.error('Global document not defined in showReportDialog call'); return; } @@ -152,7 +150,7 @@ export function showReportDialog(options: ReportDialogOptions = {}, hub: Hub = g options.eventId = hub.lastEventId(); } - const script = global.document.createElement('script'); + const script = WINDOW.document.createElement('script'); script.async = true; script.src = getReportDialogEndpoint(dsn, options); @@ -161,7 +159,7 @@ export function showReportDialog(options: ReportDialogOptions = {}, hub: Hub = g script.onload = options.onLoad; } - const injectionPoint = global.document.head || global.document.body; + const injectionPoint = WINDOW.document.head || WINDOW.document.body; if (injectionPoint) { injectionPoint.appendChild(script); } else { @@ -249,10 +247,7 @@ function startSessionOnHub(hub: Hub): void { * Enable automatic Session Tracking for the initial page load. */ function startSessionTracking(): void { - const window = getGlobalObject(); - const document = window.document; - - if (typeof document === 'undefined') { + if (typeof WINDOW.document === 'undefined') { __DEBUG_BUILD__ && logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.'); return; diff --git a/packages/browser/src/transports/utils.ts b/packages/browser/src/transports/utils.ts index 405f35e400ff..137cbc88487e 100644 --- a/packages/browser/src/transports/utils.ts +++ b/packages/browser/src/transports/utils.ts @@ -1,6 +1,5 @@ -import { getGlobalObject, isNativeFetch, logger } from '@sentry/utils'; +import { isNativeFetch, logger, WINDOW } from '@sentry/utils'; -const global = getGlobalObject(); let cachedFetchImpl: FetchImpl; export type FetchImpl = typeof fetch; @@ -51,12 +50,12 @@ export function getNativeFetchImplementation(): FetchImpl { /* eslint-disable @typescript-eslint/unbound-method */ // Fast path to avoid DOM I/O - if (isNativeFetch(global.fetch)) { - return (cachedFetchImpl = global.fetch.bind(global)); + if (isNativeFetch(WINDOW.fetch)) { + return (cachedFetchImpl = WINDOW.fetch.bind(WINDOW)); } - const document = global.document; - let fetchImpl = global.fetch; + const document = WINDOW.document; + let fetchImpl = WINDOW.fetch; // eslint-disable-next-line deprecation/deprecation if (document && typeof document.createElement === 'function') { try { @@ -74,6 +73,6 @@ export function getNativeFetchImplementation(): FetchImpl { } } - return (cachedFetchImpl = fetchImpl.bind(global)); + return (cachedFetchImpl = fetchImpl.bind(WINDOW)); /* eslint-enable @typescript-eslint/unbound-method */ }