Skip to content

Commit b5bdd4b

Browse files
author
Luca Forstner
authored
fix(browser/v7): Don't assume window.document is available (#11598)
1 parent d75b9af commit b5bdd4b

File tree

8 files changed

+38
-21
lines changed

8 files changed

+38
-21
lines changed

packages/tracing-internal/src/browser/backgroundtab.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import { WINDOW } from './types';
1010
* document is hidden.
1111
*/
1212
export function registerBackgroundTabDetection(): void {
13-
if (WINDOW && WINDOW.document) {
13+
if (WINDOW.document) {
1414
WINDOW.document.addEventListener('visibilitychange', () => {
1515
// eslint-disable-next-line deprecation/deprecation
1616
const activeTransaction = getActiveTransaction() as IdleTransaction;
17-
if (WINDOW.document.hidden && activeTransaction) {
17+
if (WINDOW.document!.hidden && activeTransaction) {
1818
const statusType: SpanStatusType = 'cancelled';
1919

2020
const { op, status } = spanToJSON(activeTransaction);

packages/tracing-internal/src/browser/browserTracingIntegration.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ export const browserTracingIntegration = ((_options: Partial<BrowserTracingOptio
292292

293293
if (isPageloadTransaction && WINDOW.document) {
294294
WINDOW.document.addEventListener('readystatechange', () => {
295-
if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {
295+
if (['interactive', 'complete'].includes(WINDOW.document!.readyState)) {
296296
idleTransaction.sendAutoFinishSignal();
297297
}
298298
});
@@ -538,7 +538,9 @@ function registerInteractionListener(
538538
};
539539

540540
['click'].forEach(type => {
541-
addEventListener(type, registerInteractionTransaction, { once: false, capture: true });
541+
if (WINDOW.document) {
542+
addEventListener(type, registerInteractionTransaction, { once: false, capture: true });
543+
}
542544
});
543545
}
544546

packages/tracing-internal/src/browser/browsertracing.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -418,14 +418,16 @@ export class BrowserTracing implements Integration {
418418
);
419419

420420
if (isPageloadTransaction) {
421-
WINDOW.document.addEventListener('readystatechange', () => {
421+
if (WINDOW.document) {
422+
WINDOW.document.addEventListener('readystatechange', () => {
423+
if (['interactive', 'complete'].includes(WINDOW.document!.readyState)) {
424+
idleTransaction.sendAutoFinishSignal();
425+
}
426+
});
427+
422428
if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {
423429
idleTransaction.sendAutoFinishSignal();
424430
}
425-
});
426-
427-
if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {
428-
idleTransaction.sendAutoFinishSignal();
429431
}
430432
}
431433

@@ -496,7 +498,9 @@ export class BrowserTracing implements Integration {
496498
};
497499

498500
['click'].forEach(type => {
499-
addEventListener(type, registerInteractionTransaction, { once: false, capture: true });
501+
if (WINDOW.document) {
502+
addEventListener(type, registerInteractionTransaction, { once: false, capture: true });
503+
}
500504
});
501505
}
502506

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
import { GLOBAL_OBJ } from '@sentry/utils';
22

3-
export const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;
3+
export const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ &
4+
// document is not available in all browser environments (webworkers). We make it optional so you have to explicitly check for it
5+
Omit<Window, 'document'> &
6+
Partial<Pick<Window, 'document'>>;

packages/tracing-internal/src/browser/web-vitals/getLCP.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17+
import { WINDOW } from '../types';
1718
import { bindReporter } from './lib/bindReporter';
1819
import { getActivationStart } from './lib/getActivationStart';
1920
import { getVisibilityWatcher } from './lib/getVisibilityWatcher';
@@ -71,7 +72,9 @@ export const onLCP = (onReport: ReportCallback): StopListening | undefined => {
7172
// stop LCP observation, it's unreliable since it can be programmatically
7273
// generated. See: https://github.com/GoogleChrome/web-vitals/issues/75
7374
['keydown', 'click'].forEach(type => {
74-
addEventListener(type, stopListening, { once: true, capture: true });
75+
if (WINDOW.document) {
76+
addEventListener(type, stopListening, { once: true, capture: true });
77+
}
7578
});
7679

7780
onHidden(stopListening, true);

packages/tracing-internal/src/browser/web-vitals/lib/getVisibilityWatcher.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ import { onHidden } from './onHidden';
1919

2020
let firstHiddenTime = -1;
2121

22-
const initHiddenTime = (): number => {
22+
const initHiddenTime = (): void => {
2323
// If the document is hidden and not prerendering, assume it was always
2424
// hidden and the page was loaded in the background.
25-
return WINDOW.document.visibilityState === 'hidden' && !WINDOW.document.prerendering ? 0 : Infinity;
25+
if (WINDOW.document && WINDOW.document.visibilityState) {
26+
firstHiddenTime = WINDOW.document.visibilityState === 'hidden' && !WINDOW.document.prerendering ? 0 : Infinity;
27+
}
2628
};
2729

2830
const trackChanges = (): void => {
@@ -40,7 +42,7 @@ export const getVisibilityWatcher = (): {
4042
// since navigation start. This isn't a perfect heuristic, but it's the
4143
// best we can do until an API is available to support querying past
4244
// visibilityState.
43-
firstHiddenTime = initHiddenTime();
45+
initHiddenTime();
4446
trackChanges();
4547
}
4648
return {

packages/tracing-internal/src/browser/web-vitals/lib/initMetric.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export const initMetric = (name: Metric['name'], value?: number): Metric => {
2525
let navigationType: Metric['navigationType'] = 'navigate';
2626

2727
if (navEntry) {
28-
if (WINDOW.document.prerendering || getActivationStart() > 0) {
28+
if ((WINDOW.document && WINDOW.document.prerendering) || getActivationStart() > 0) {
2929
navigationType = 'prerender';
3030
} else {
3131
navigationType = navEntry.type.replace(/_/g, '-') as Metric['navigationType'];

packages/tracing-internal/src/browser/web-vitals/lib/onHidden.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,19 @@ export interface OnHiddenCallback {
2222

2323
export const onHidden = (cb: OnHiddenCallback, once?: boolean): void => {
2424
const onHiddenOrPageHide = (event: Event): void => {
25-
if (event.type === 'pagehide' || WINDOW.document.visibilityState === 'hidden') {
25+
if (event.type === 'pagehide' || WINDOW.document!.visibilityState === 'hidden') {
2626
cb(event);
2727
if (once) {
2828
removeEventListener('visibilitychange', onHiddenOrPageHide, true);
2929
removeEventListener('pagehide', onHiddenOrPageHide, true);
3030
}
3131
}
3232
};
33-
addEventListener('visibilitychange', onHiddenOrPageHide, true);
34-
// Some browsers have buggy implementations of visibilitychange,
35-
// so we use pagehide in addition, just to be safe.
36-
addEventListener('pagehide', onHiddenOrPageHide, true);
33+
34+
if (WINDOW.document) {
35+
addEventListener('visibilitychange', onHiddenOrPageHide, true);
36+
// Some browsers have buggy implementations of visibilitychange,
37+
// so we use pagehide in addition, just to be safe.
38+
addEventListener('pagehide', onHiddenOrPageHide, true);
39+
}
3740
};

0 commit comments

Comments
 (0)