diff --git a/src/common/normalize.ts b/src/common/normalize.ts index ab191b89..26988187 100644 --- a/src/common/normalize.ts +++ b/src/common/normalize.ts @@ -34,6 +34,10 @@ export function normalizeEvent(event: Event, basePath: string): Event { request.url = normalizeUrlToBase(request.url, basePath); } + if (event.contexts?.feedback?.url && typeof event.contexts.feedback.url === 'string') { + event.contexts.feedback.url = normalizeUrlToBase(event.contexts.feedback.url, basePath); + } + event.contexts = { ...event.contexts, runtime: { diff --git a/src/main/ipc.ts b/src/main/ipc.ts index 6b17547b..56750786 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -101,7 +101,7 @@ function eventFromEnvelope(envelope: Envelope): [Event, Attachment[], Profile | let profile: Profile | undefined; forEachEnvelopeItem(envelope, (item, type) => { - if (type === 'event' || type === 'transaction') { + if (type === 'event' || type === 'transaction' || type === 'feedback') { event = Array.isArray(item) ? (item as EventItem)[1] : undefined; } else if (type === 'attachment') { const [headers, data] = item as AttachmentItem; diff --git a/test/e2e/server/index.ts b/test/e2e/server/index.ts index 3e1b7be4..80feef9a 100644 --- a/test/e2e/server/index.ts +++ b/test/e2e/server/index.ts @@ -1,5 +1,5 @@ import { Event, Profile, ReplayEvent, Session, Transaction } from '@sentry/types'; -import { forEachEnvelopeItem, parseEnvelope } from '@sentry/utils'; +import { dropUndefinedKeys, forEachEnvelopeItem, parseEnvelope } from '@sentry/utils'; import { Server } from 'http'; import Koa from 'koa'; import bodyParser from 'koa-bodyparser'; @@ -129,7 +129,12 @@ export class TestServer { let metrics: string | undefined; forEachEnvelopeItem(envelope, ([headers, item]) => { - if (headers.type === 'event' || headers.type === 'transaction' || headers.type === 'session') { + if ( + headers.type === 'event' || + headers.type === 'transaction' || + headers.type === 'session' || + headers.type === 'feedback' + ) { data = item as Event | Transaction | Session; } @@ -155,15 +160,17 @@ export class TestServer { }); if (data || metrics) { - this._addEvent({ - data: data || {}, - attachments, - profile, - metrics, - appId: ctx.params.id, - sentryKey: keyMatch[1], - method: 'envelope', - }); + this._addEvent( + dropUndefinedKeys({ + data: data || {}, + attachments, + profile, + metrics, + appId: ctx.params.id, + sentryKey: keyMatch[1], + method: 'envelope', + }), + ); ctx.status = 200; ctx.body = 'Success'; diff --git a/test/e2e/test-apps/other/feedback/event.json b/test/e2e/test-apps/other/feedback/event.json new file mode 100644 index 00000000..94925be2 --- /dev/null +++ b/test/e2e/test-apps/other/feedback/event.json @@ -0,0 +1,17 @@ +{ + "method": "envelope", + "sentryKey": "37f8a2ee37c0409d8970bc7559c7c7e4", + "appId": "277345", + "data": { + "contexts": { + "feedback": { + "contact_email": "john@doe.com", + "name": "John Doe", + "message": "I really like your App, thanks!", + "url": "app:///src/index.html", + "source": "api" + } + }, + "type": "feedback" + } +} diff --git a/test/e2e/test-apps/other/feedback/package.json b/test/e2e/test-apps/other/feedback/package.json new file mode 100644 index 00000000..cc1c7cac --- /dev/null +++ b/test/e2e/test-apps/other/feedback/package.json @@ -0,0 +1,8 @@ +{ + "name": "feedback", + "version": "1.0.0", + "main": "src/main.js", + "dependencies": { + "@sentry/electron": "3.0.0" + } +} diff --git a/test/e2e/test-apps/other/feedback/recipe.yml b/test/e2e/test-apps/other/feedback/recipe.yml new file mode 100644 index 00000000..bf5ce753 --- /dev/null +++ b/test/e2e/test-apps/other/feedback/recipe.yml @@ -0,0 +1,2 @@ +description: User Feedback +command: yarn diff --git a/test/e2e/test-apps/other/feedback/src/index.html b/test/e2e/test-apps/other/feedback/src/index.html new file mode 100644 index 00000000..af0e4955 --- /dev/null +++ b/test/e2e/test-apps/other/feedback/src/index.html @@ -0,0 +1,24 @@ + + +
+ + + + + + diff --git a/test/e2e/test-apps/other/feedback/src/main.js b/test/e2e/test-apps/other/feedback/src/main.js new file mode 100644 index 00000000..bede8faa --- /dev/null +++ b/test/e2e/test-apps/other/feedback/src/main.js @@ -0,0 +1,23 @@ +const path = require('path'); + +const { app, BrowserWindow } = require('electron'); +const { init } = require('@sentry/electron'); + +init({ + dsn: '__DSN__', + debug: true, + autoSessionTracking: false, + onFatalError: () => {}, +}); + +app.on('ready', () => { + const mainWindow = new BrowserWindow({ + show: false, + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + }, + }); + + mainWindow.loadFile(path.join(__dirname, 'index.html')); +});