Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions packages/browser/src/core/buffer/__tests__/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
flushAnalyticsCallsInNewTask,
PreInitMethodCallBuffer,
PreInitMethodName,
popPageContext,
} from '..'
import { Analytics } from '../../analytics'
import { Context } from '../../context'
Expand All @@ -13,6 +14,7 @@ import { User } from '../../user'
import { getBufferedPageCtxFixture } from '../../../test-helpers/fixtures'
import * as GlobalAnalytics from '../../../lib/global-analytics-helper'
import { setVersionType } from '../../../lib/version-type'
import { BufferedPageContextDiscriminant } from '../../page'

describe(PreInitMethodCallBuffer, () => {
beforeEach(() => {
Expand Down Expand Up @@ -359,6 +361,47 @@ describe(AnalyticsBuffered, () => {
})
})

describe(popPageContext, () => {
const makeBPC = (referrer: string) => ({
__t: BufferedPageContextDiscriminant,
c: undefined,
p: '/',
u: 'https://example.com/',
s: '',
t: 'Test',
r: referrer,
})

function withDocumentReferrer(value: string, fn: () => void) {
const original = document.referrer
Object.defineProperty(document, 'referrer', { value, configurable: true })
try {
fn()
} finally {
Object.defineProperty(document, 'referrer', {
value: original,
configurable: true,
})
}
}

it('should use fresh document.referrer when buffered referrer is empty', () => {
withDocumentReferrer('https://www.google.com/', () => {
const args: unknown[] = [makeBPC('')]
const result = popPageContext(args)
expect(result!.referrer).toBe('https://www.google.com/')
})
})

it('should not override when both buffered and document.referrer are empty', () => {
withDocumentReferrer('', () => {
const args: unknown[] = [makeBPC('')]
const result = popPageContext(args)
expect(result!.referrer).toBe('')
})
})
})

describe(callAnalyticsMethod, () => {
let ajs!: Analytics
let resolveSpy!: jest.Mock<any, any>
Expand Down
11 changes: 10 additions & 1 deletion packages/browser/src/core/buffer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,16 @@ export const flushAnalyticsCallsInNewTask = (
export const popPageContext = (args: unknown[]): PageContext | undefined => {
if (hasBufferedPageContextAsLastArg(args)) {
const ctx = args.pop() as BufferedPageContext
return createPageContext(ctx)
const pageCtx = createPageContext(ctx)
// Re-read referrer if the buffered value is empty (iOS Safari timing issue)
if (
!pageCtx.referrer &&
typeof document !== 'undefined' &&
document.referrer
) {
return { ...pageCtx, referrer: document.referrer }
}
return pageCtx
}
}

Expand Down
Loading