diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js new file mode 100644 index 000000000000..c22f576ca681 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/init.js @@ -0,0 +1,16 @@ +import * as Sentry from '@sentry/browser'; + +window.Sentry = Sentry; + +Sentry.init({ + dsn: 'https://public@dsn.ingest.sentry.io/1337', + release: '0.1', + initialScope: { + user: { + id: '1337', + email: 'user@name.com', + username: 'user1337', + }, + }, + debug: true, +}); diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/template.html b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/template.html new file mode 100644 index 000000000000..77906444cbce --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/template.html @@ -0,0 +1,9 @@ + + + + + + + Navigate + + diff --git a/dev-packages/browser-integration-tests/suites/sessions/initial-scope/test.ts b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/test.ts new file mode 100644 index 000000000000..b7de815b7825 --- /dev/null +++ b/dev-packages/browser-integration-tests/suites/sessions/initial-scope/test.ts @@ -0,0 +1,41 @@ +import type { Route } from '@playwright/test'; +import { expect } from '@playwright/test'; +import type { SessionContext } from '@sentry/types'; + +import { sentryTest } from '../../../utils/fixtures'; +import { getFirstSentryEnvelopeRequest } from '../../../utils/helpers'; + +sentryTest('should start a new session on pageload.', async ({ getLocalTestPath, page }) => { + const url = await getLocalTestPath({ testDir: __dirname }); + const session = await getFirstSentryEnvelopeRequest(page, url); + + expect(session).toBeDefined(); + expect(session.init).toBe(true); + expect(session.errors).toBe(0); + expect(session.status).toBe('ok'); + expect(session.did).toBe('1337'); +}); + +sentryTest('should start a new session with navigation.', async ({ getLocalTestPath, page, browserName }) => { + // Navigations get CORS error on Firefox and WebKit as we're using `file://` protocol. + if (browserName !== 'chromium') { + sentryTest.skip(); + } + + const url = await getLocalTestPath({ testDir: __dirname }); + await page.route('**/foo', (route: Route) => route.fulfill({ path: `${__dirname}/dist/index.html` })); + + const initSession = await getFirstSentryEnvelopeRequest(page, url); + + await page.click('#navigate'); + + const newSession = await getFirstSentryEnvelopeRequest(page, url); + + expect(newSession).toBeDefined(); + expect(newSession.init).toBe(true); + expect(newSession.errors).toBe(0); + expect(newSession.status).toBe('ok'); + expect(newSession.sid).toBeDefined(); + expect(initSession.sid).not.toBe(newSession.sid); + expect(newSession.did).toBe('1337'); +}); diff --git a/packages/core/src/exports.ts b/packages/core/src/exports.ts index e92114a024dd..c1d7cd96e6d8 100644 --- a/packages/core/src/exports.ts +++ b/packages/core/src/exports.ts @@ -383,7 +383,7 @@ export function startSession(context?: SessionContext): Session { const session = makeSession({ release, environment, - user: isolationScope.getUser(), + user: currentScope.getUser() || isolationScope.getUser(), ...(userAgent && { userAgent }), ...context, }); @@ -413,7 +413,7 @@ export function endSession(): void { const isolationScope = getIsolationScope(); const currentScope = getCurrentScope(); - const session = isolationScope.getSession(); + const session = currentScope.getSession() || isolationScope.getSession(); if (session) { closeSession(session); }