Skip to content

Commit 7648d27

Browse files
authored
internal: Improved tools for developing the browser extension (#766)
1 parent ff71b92 commit 7648d27

File tree

6 files changed

+82
-3
lines changed

6 files changed

+82
-3
lines changed

extension/src/background/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { tabs } from 'webextension-polyfill'
1+
import { runtime, tabs } from 'webextension-polyfill'
22

33
import { BrowserEvent } from '@/schemas/recording'
44

@@ -49,6 +49,12 @@ client.on('load-events', () => {
4949
})
5050
})
5151

52+
client.on('reload-extension', () => {
53+
console.log('reloading extension...')
54+
55+
runtime.reload()
56+
})
57+
5258
const logEvent = (event: BrowserExtensionEvent) => {
5359
console.log(`[background] ${event.data.type}:`, event.data)
5460
}

extension/src/background/routing.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ background.forward('events-loaded', [frontend])
2121
studio.forward('navigate', [background])
2222
studio.forward('highlight-elements', [frontend])
2323

24+
frontend.forward('reload-extension', [background])
2425
frontend.forward('record-events', [background])
2526
frontend.forward('navigate', [background])
2627
frontend.forward('load-events', [background])

extension/src/frontend/routing.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ frontend.forward('record-events', [background])
1212
frontend.forward('navigate', [background])
1313
frontend.forward('load-events', [background])
1414
frontend.forward('stop-recording', [background])
15+
frontend.forward('reload-extension', [background])
1516

1617
background.forward('events-recorded', [frontend])
1718
background.forward('events-loaded', [frontend])

extension/src/frontend/view/ToolBox/index.tsx

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,18 @@ import {
1010
restrictToHorizontalAxis,
1111
restrictToWindowEdges,
1212
} from '@dnd-kit/modifiers'
13+
import { css } from '@emotion/react'
1314
import {
1415
PanelRight,
16+
RotateCcwIcon,
1517
SquareDashedMousePointerIcon,
1618
SquareIcon,
1719
TextCursorIcon,
1820
} from 'lucide-react'
1921

2022
import { Toolbar } from '@/components/primitives/Toolbar'
2123

24+
import { client } from '../../routing'
2225
import { useToolboxSettings } from '../settings'
2326
import { Tool } from '../types'
2427

@@ -138,6 +141,34 @@ export function ToolBox({
138141
</Toolbar.ToggleItem>
139142
</ToolBoxTooltip>
140143
</Toolbar.ToggleGroup>
144+
{
145+
// @ts-expect-error we have commonjs set as module option
146+
import.meta.env.DEV && (
147+
<>
148+
<Toolbar.Separator />
149+
<ToolBoxTooltip content="Reload extension (dev only)">
150+
<Toolbar.Button
151+
onClick={() => {
152+
client.send({
153+
type: 'reload-extension',
154+
})
155+
156+
setTimeout(() => {
157+
window.location.reload()
158+
}, 500)
159+
}}
160+
>
161+
<RotateCcwIcon
162+
css={css`
163+
stroke-width: 2px !important;
164+
color: var(--red-10);
165+
`}
166+
/>
167+
</Toolbar.Button>
168+
</ToolBoxTooltip>
169+
</>
170+
)
171+
}
141172
</ToolBoxRoot>
142173
</DndContext>
143174
)

extension/src/messaging/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ export const StopRecordingSchema = z.object({
4444
type: z.literal('stop-recording'),
4545
})
4646

47+
export const ReloadExtensionSchema = z.object({
48+
type: z.literal('reload-extension'),
49+
})
50+
4751
export const BrowserExtensionMessageSchema = z.discriminatedUnion('type', [
4852
LoadEventsSchema,
4953

@@ -53,6 +57,8 @@ export const BrowserExtensionMessageSchema = z.discriminatedUnion('type', [
5357
HighlightElementsSchema,
5458
NavigateSchema,
5559
StopRecordingSchema,
60+
61+
ReloadExtensionSchema,
5662
])
5763

5864
export type RecordEvents = z.infer<typeof RecordEventsSchema>

src/handlers/browser/launch.ts

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
import { exec, spawn } from 'child_process'
77
import { app, BrowserWindow } from 'electron'
88
import log from 'electron-log/main'
9-
import { mkdtemp } from 'fs/promises'
9+
import { mkdir, mkdtemp, writeFile } from 'fs/promises'
1010
import os from 'os'
1111
import path from 'path'
1212
import { promisify } from 'util'
@@ -19,8 +19,42 @@ import { getPlatform } from '../../utils/electron'
1919

2020
import { BrowserHandler, LaunchBrowserOptions } from './types'
2121

22+
const CHROME_DEV_PREFERENCES = JSON.stringify({
23+
devtools: {
24+
preferences: {
25+
currentDockState: '"undocked"',
26+
'navigator-view-selected-tab': '"navigator-content-scripts"',
27+
'panel-selected-tab': '"sources"',
28+
},
29+
synced_preferences_sync_disabled: {
30+
// This allows content scripts to be debugged via DevTools without
31+
// having to whitelist them yourself.
32+
'skip-content-scripts': 'false',
33+
},
34+
},
35+
})
36+
2237
const createUserDataDir = async () => {
23-
return mkdtemp(path.join(os.tmpdir(), 'k6-studio-'))
38+
const userDataDir = await mkdtemp(path.join(os.tmpdir(), 'k6-studio-'))
39+
40+
// If we're in development mode, we create a default Chrome profile
41+
// with some preferences that make developing the extension easier
42+
// (e.g. whitelisting content scripts in the debugger).
43+
//
44+
// @ts-expect-error - Electron apps are built as CJS.
45+
if (import.meta.env.DEV) {
46+
try {
47+
const defaultProfilePath = path.join(userDataDir, 'Default')
48+
const preferencesPath = path.join(defaultProfilePath, 'Preferences')
49+
50+
await mkdir(defaultProfilePath, { recursive: true })
51+
await writeFile(preferencesPath, CHROME_DEV_PREFERENCES, 'utf8')
52+
} catch (error) {
53+
console.error('Error creating Chrome profile:', error)
54+
}
55+
}
56+
57+
return userDataDir
2458
}
2559

2660
export async function getBrowserPath() {

0 commit comments

Comments
 (0)