grafana/k6 · error

clearing permissions: %w

Error message

clearing permissions: %w

What it means

browserContext.clearPermissions() issues the CDP Browser.resetPermissions command scoped to the context (browser_context.go:199). If the CDP round-trip fails, the transport/protocol error is wrapped as 'clearing permissions: %w' — almost always because the context or browser is already closed, or the connection is gone.

Source

Thrown at internal/js/modules/k6/browser/common/browser_context.go:199

			return fmt.Errorf("adding init script to browser context: %w", err)
		}
	}

	return nil
}

// Browser returns the browser instance that this browser context belongs to.
func (b *BrowserContext) Browser() *Browser {
	return b.browser
}

// ClearPermissions clears any permission overrides.
func (b *BrowserContext) ClearPermissions() error {
	b.logger.Debugf("BrowserContext:ClearPermissions", "bctxid:%v", b.id)

	action := cdpbrowser.ResetPermissions().WithBrowserContextID(b.id)
	if err := action.Do(cdp.WithExecutor(b.ctx, b.browser.conn)); err != nil {
		return fmt.Errorf("clearing permissions: %w", err)
	}

	return nil
}

// Close shuts down the browser context.
func (b *BrowserContext) Close() error {
	b.logger.Debugf("BrowserContext:Close", "bctxid:%v", b.id)

	if b.id == "" {
		return fmt.Errorf("default browser context can't be closed")
	}
	if err := b.browser.disposeContext(b.id); err != nil {
		return fmt.Errorf("disposing browser context: %w", err)
	}
	return nil
}

View on GitHub (pinned to 93accf6570)

Solutions

  1. Call clearPermissions() while the context is open — before close()
  2. Check the wrapped error to distinguish a dead connection from a protocol refusal
  3. Wrap permission reset in a guard that skips it when the browser/context is already closed
  4. Restructure so permission changes happen in setup, not teardown

Example fix

// before
await ctx.close()
await ctx.clearPermissions() // throws: clearing permissions

// after
await ctx.clearPermissions()
await ctx.close()
Defensive patterns

Strategy: validation

Validate before calling

// reset permissions only while the context is open
if (ctxOpen) await ctx.clearPermissions() // track open/closed yourself

Try / catch

try {
  await ctx.clearPermissions()
} catch (e) {
  if (/clearing permissions/.test(String(e)) && /connection|closed/i.test(String(e))) {
    // context/browser already gone — nothing to clear
  } else throw e
}

Prevention

When it happens

Trigger: Calling clearPermissions() after context.close() or browser.close(); connection dropping mid-call; concurrent teardown from multiple VUs touching the same context.

Common situations: Cleanup code in teardown running after the browser already disconnected; helpers that reset permissions unconditionally at iteration end.

Related errors


AI-assisted analysis of grafana/k6@93accf6570 (2026-08-15). Data as JSON: /api/errors/dd82c57938a81323. Report an issue: GitHub.