emberjs/ember.js · error · Error
BUG: owner is missing renderer
Error message
BUG: owner is missing renderer
What it means
captureRenderTree(owner) looks up the DOM renderer ('renderer:-dom') on the given owner so it can snapshot the render tree for debugging (used by Ember Inspector). If the owner has no DOM renderer registered, the function throws this internal bug report error.
Source
Thrown at packages/@ember/debug/lib/capture-render-tree.ts:25
*/
/**
Ember Inspector calls this function to capture the current render tree.
In production mode, this requires turning on `ENV._DEBUG_RENDER_TREE`
before loading Ember.
@private
@static
@method captureRenderTree
@for @ember/debug
@param app {ApplicationInstance} An `ApplicationInstance`.
@since 3.14.0
*/
export default function captureRenderTree(app: Owner): CapturedRenderNode[] {
let domRenderer = app.lookup('renderer:-dom') as Renderer;
if (!domRenderer) {
throw new Error(`BUG: owner is missing renderer`);
}
// SAFETY: Ideally we'd assert here but that causes awkward circular requires since this is also in @ember/debug.
// This is only for debug stuff so not very risky.
let renderer = domRenderer;
return renderer.debugRenderTree.capture();
}
View on GitHub (pinned to 26f97246a8)
Solutions
- Pass the Application instance (or its owner) that has 'renderer:-dom' registered
- Ensure the app is fully booted before capturing the render tree
- In tests, make sure the application is set up via the standard setupApplicationContext helpers
Example fix
// before captureRenderTree(engineInstance); // after captureRenderTree(getOwner(application) || application);
Defensive patterns
Strategy: validation
Validate before calling
let renderer = app.lookup && app.lookup('renderer:-dom');
if (renderer) captureRenderTree(app); Type guard
function hasDomRenderer(owner) { return typeof owner.lookup === 'function' && Boolean(owner.lookup('renderer:-dom')); } Try / catch
try { captureRenderTree(app); } catch (e) { if (!/missing renderer/.test(e.message)) throw e; /* owner not app: skip capture */ } Prevention
- Only call captureRenderTree with a fully booted Application owner
- Never pass engine instances or arbitrary objects as the owner
- Use it inside inspector/debug tooling guarded by environment checks
When it happens
Trigger: Calling captureRenderTree with an owner that was not fully built as an application/engine instance with DOM rendering — e.g. a bare EngineInstance, a partially booted app, or wrong object passed as owner.
Common situations: Test helpers calling captureRenderTree against a non-application owner; using the API with an engine owner instead of the app owner; setup errors where 'renderer:-dom' is not registered.
Related errors
- You must pass both the owner and args to super() in your com
- You must pass both the owner and args to super() in your com
- deprecation override for ${id} not found
- Assertion Failed: ${desc}
- Cannot call `.lookup('${fullName}')` after the owner has bee
AI-assisted analysis of emberjs/ember.js@26f97246a8 (2026-09-01).
Data as JSON: /api/errors/46746aa6ea72c9b0.
Report an issue: GitHub.