Skip to content

Commit 4c9a6f9

Browse files
committed
fix(Telemetry): Honor live VS Code telemetry-disable signal
1 parent 47e294d commit 4c9a6f9

2 files changed

Lines changed: 41 additions & 5 deletions

File tree

src/__tests__/extension.spec.ts

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,8 +321,10 @@ describe("extension.ts", () => {
321321
})
322322

323323
describe("telemetry level reactivity", () => {
324-
beforeEach(() => {
324+
beforeEach(async () => {
325325
vi.resetModules()
326+
const vscode = await import("vscode")
327+
;(vscode.env as any).isTelemetryEnabled = true
326328
})
327329

328330
test("registers a listener for vscode.env.onDidChangeTelemetryEnabled", async () => {
@@ -342,26 +344,30 @@ describe("extension.ts", () => {
342344

343345
const mockContextProxyInstance = await (ContextProxy.getInstance as any)()
344346
vi.mocked(mockContextProxyInstance.getGlobalState).mockReturnValue("enabled")
347+
;(vscode.env as any).isTelemetryEnabled = true
345348

346349
const { activate } = await import("../extension")
347350
await activate(mockContext)
348351

349352
const updateTelemetryStateMock = vi.mocked(TelemetryService.instance.updateTelemetryState)
350353
updateTelemetryStateMock.mockClear()
351354

355+
// The real vscode.env.onDidChangeTelemetryEnabled event carries no payload; the handler
356+
// must read the current vscode.env.isTelemetryEnabled value, not any argument it's called with.
352357
const onDidChangeHandler = vi.mocked(vscode.env.onDidChangeTelemetryEnabled).mock.calls[0][0]
353-
onDidChangeHandler(false)
358+
onDidChangeHandler(undefined as any)
354359

355360
expect(updateTelemetryStateMock).toHaveBeenCalledWith(true)
356361
})
357362

358-
test("treats a disabled stored setting as opted out even when VS Code telemetry is re-enabled", async () => {
363+
test("treats a disabled stored setting as opted out even when VS Code telemetry is enabled", async () => {
359364
const vscode = await import("vscode")
360365
const { TelemetryService } = await import("@roo-code/telemetry")
361366
const { ContextProxy } = await import("../core/config/ContextProxy")
362367

363368
const mockContextProxyInstance = await (ContextProxy.getInstance as any)()
364369
vi.mocked(mockContextProxyInstance.getGlobalState).mockReturnValue("disabled")
370+
;(vscode.env as any).isTelemetryEnabled = true
365371

366372
const { activate } = await import("../extension")
367373
await activate(mockContext)
@@ -370,7 +376,33 @@ describe("extension.ts", () => {
370376
updateTelemetryStateMock.mockClear()
371377

372378
const onDidChangeHandler = vi.mocked(vscode.env.onDidChangeTelemetryEnabled).mock.calls[0][0]
373-
onDidChangeHandler(true)
379+
onDidChangeHandler(undefined as any)
380+
381+
expect(updateTelemetryStateMock).toHaveBeenCalledWith(false)
382+
})
383+
384+
test("treats VS Code's live telemetry-disabled signal as opted out even when the stored setting is enabled", async () => {
385+
const vscode = await import("vscode")
386+
const { TelemetryService } = await import("@roo-code/telemetry")
387+
const { ContextProxy } = await import("../core/config/ContextProxy")
388+
389+
const mockContextProxyInstance = await (ContextProxy.getInstance as any)()
390+
vi.mocked(mockContextProxyInstance.getGlobalState).mockReturnValue("enabled")
391+
;(vscode.env as any).isTelemetryEnabled = true
392+
393+
const { activate } = await import("../extension")
394+
await activate(mockContext)
395+
396+
const updateTelemetryStateMock = vi.mocked(TelemetryService.instance.updateTelemetryState)
397+
updateTelemetryStateMock.mockClear()
398+
399+
// Simulate the user turning off VS Code's global telemetry toggle: the live env value
400+
// flips before the event fires, and the handler must honor it rather than only the
401+
// stored extension setting.
402+
;(vscode.env as any).isTelemetryEnabled = false
403+
404+
const onDidChangeHandler = vi.mocked(vscode.env.onDidChangeTelemetryEnabled).mock.calls[0][0]
405+
onDidChangeHandler(undefined as any)
374406

375407
expect(updateTelemetryStateMock).toHaveBeenCalledWith(false)
376408
})

src/extension.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,10 +176,14 @@ export async function activate(context: vscode.ExtensionContext) {
176176

177177
// React live to VS Code's global telemetry toggle (recommended over only reading
178178
// telemetry.telemetryLevel, which PostHogTelemetryClient still checks as a secondary gate).
179+
// vscode.env.isTelemetryEnabled is ANDed in directly because the deprecated
180+
// telemetry.telemetryLevel setting the client checks doesn't reflect this live event.
179181
context.subscriptions.push(
180182
vscode.env.onDidChangeTelemetryEnabled(() => {
181183
const telemetrySetting = contextProxy.getGlobalState("telemetrySetting") ?? "unset"
182-
TelemetryService.instance.updateTelemetryState(isTelemetryOptedIn(telemetrySetting))
184+
TelemetryService.instance.updateTelemetryState(
185+
isTelemetryOptedIn(telemetrySetting) && vscode.env.isTelemetryEnabled,
186+
)
183187
}),
184188
)
185189

0 commit comments

Comments
 (0)