Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 4ccb3f3a1c85f1983007f8721f5696f88266a0dc
https://github.com/WebKit/WebKit/commit/4ccb3f3a1c85f1983007f8721f5696f88266a0dc
Author: Devin Rousso <[email protected]>
Date: 2026-08-03 (Mon, 03 Aug 2026)
Changed paths:
M LayoutTests/inspector/canvas/requestClientNodes-css.html
M LayoutTests/inspector/canvas/requestClientNodes-webgpu-expected.txt
M LayoutTests/inspector/canvas/requestClientNodes-webgpu.html
M LayoutTests/inspector/canvas/resources/create-context-utilities.js
M LayoutTests/inspector/canvas/worker-webgpu-expected.txt
M LayoutTests/inspector/canvas/worker-webgpu.html
M Source/JavaScriptCore/inspector/protocol/Canvas.json
M Source/JavaScriptCore/inspector/protocol/GenericTypes.json
M Source/WebCore/html/HTMLCanvasElement.cpp
M Source/WebCore/html/canvas/GPUCanvasContextCocoa.mm
M Source/WebCore/inspector/InspectorCanvas.cpp
M Source/WebCore/inspector/InspectorCanvas.h
M Source/WebCore/inspector/InspectorInstrumentation.cpp
M Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp
M Source/WebCore/inspector/agents/InspectorCanvasAgent.h
M Source/WebCore/inspector/agents/page/PageCanvasAgent.cpp
M Source/WebCore/inspector/agents/page/PageCanvasAgent.h
M Source/WebCore/inspector/agents/worker/WorkerCanvasAgent.cpp
M Source/WebCore/inspector/agents/worker/WorkerCanvasAgent.h
M Source/WebInspectorUI/UserInterface/Controllers/CanvasManager.js
M Source/WebInspectorUI/UserInterface/Models/Canvas.js
M Source/WebInspectorUI/UserInterface/Protocol/CanvasObserver.js
M Source/WebInspectorUI/UserInterface/Views/CanvasContentView.js
M Source/WebInspectorUI/UserInterface/Views/CanvasDetailsSidebarPanel.css
M Source/WebInspectorUI/UserInterface/Views/CanvasDetailsSidebarPanel.js
M Source/WebInspectorUI/UserInterface/Views/CanvasOverviewContentView.js
M Source/WebInspectorUI/UserInterface/Views/CanvasTreeElement.js
Log Message:
-----------
Web Inspector: Canvas: expose client metadata for WebGPU devices
https://bugs.webkit.org/show_bug.cgi?id=320876
Reviewed by Mike Wyrzykowski.
* Source/WebCore/html/HTMLCanvasElement.cpp:
(WebCore::HTMLCanvasElement::getContext):
Use `navigator.gpu` when creating a WebGPU context for internal callers such as
`document.getCSSCanvasContext`.
* Source/WebCore/html/canvas/GPUCanvasContextCocoa.mm:
(WebCore::GPUCanvasContextCocoa::didUpdateCanvasSizeProperties):
(WebCore::GPUCanvasContextCocoa::configure):
Do not report the configured `GPUDevice` as temporarily detached while an
internal resize reconfigures its `GPUCanvasContext`.
Only report it if reconfiguration fails.
* Source/WebCore/inspector/InspectorCanvas.h:
* Source/WebCore/inspector/InspectorCanvas.cpp:
(WebCore::InspectorCanvas::canvasElement const):
(WebCore::InspectorCanvas::sizes const): Added.
(WebCore::InspectorCanvas::cssCanvasNames const): Added.
(WebCore::InspectorCanvas::clientNodes const):
(WebCore::InspectorCanvas::buildObjectForCanvas):
Collect distinct sizes, a single `HTMLCanvasElement`, and CSS canvas names
across every configured `GPUCanvasContext` using a `GPUDevice`.
* Source/JavaScriptCore/inspector/protocol/GenericTypes.json:
* Source/JavaScriptCore/inspector/protocol/Canvas.json:
* Source/WebCore/inspector/InspectorInstrumentation.cpp:
(WebCore::InspectorInstrumentation::didChangeCSSCanvasClientNodesImpl):
(WebCore::InspectorInstrumentation::didChangeCanvasSizeImpl):
(WebCore::InspectorInstrumentation::didChangeGPUDeviceClientNodesImpl):
* Source/WebCore/inspector/agents/InspectorCanvasAgent.h:
* Source/WebCore/inspector/agents/InspectorCanvasAgent.cpp:
(WebCore::InspectorCanvasAgent::didChangeCanvasSize):
(WebCore::InspectorCanvasAgent::didChangeGPUDeviceClientNodes): Added.
(WebCore::InspectorCanvasAgent::bindCanvas):
(WebCore::InspectorCanvasAgent::buildObjectForCanvas): Added.
(WebCore::InspectorCanvasAgent::dispatchCanvasSizeChanged): Added.
Represent canvas `width` and `height` as an array of `GenericTypes.Size` since
a single `GPUDevice` can be configured for multiple `<canvas>`.
Rename `cssCanvasName` to `cssCanvasNames`.
* Source/WebCore/inspector/agents/page/PageCanvasAgent.h:
* Source/WebCore/inspector/agents/page/PageCanvasAgent.cpp:
(WebCore::PageCanvasAgent::requestClientNodes):
(WebCore::PageCanvasAgent::frameNavigated):
(WebCore::PageCanvasAgent::didChangeCSSCanvasClientNodes):
(WebCore::PageCanvasAgent::didChangeGPUDeviceClientNodes):
(WebCore::PageCanvasAgent::buildObjectForCanvas): Added.
(WebCore::PageCanvasAgent::nodeIdForCanvas): Added.
(WebCore::PageCanvasAgent::dispatchClientNodesChanged): Added.
* Source/WebCore/inspector/agents/worker/WorkerCanvasAgent.h:
* Source/WebCore/inspector/agents/worker/WorkerCanvasAgent.cpp:
(WebCore::WorkerCanvasAgent::requestClientNodes):
Return the current client nodes and CSS `<canvas>` names with
`Canvas.requestClientNodes`.
Provide an initial `nodeId` only when a `GPUDevice` has exactly one `<canvas>`.
* Source/WebInspectorUI/UserInterface/Protocol/CanvasObserver.js:
(WI.CanvasObserver.prototype.canvasSizeChanged):
* Source/WebInspectorUI/UserInterface/Controllers/CanvasManager.js:
(WI.CanvasManager.prototype.canvasSizeChanged):
* Source/WebInspectorUI/UserInterface/Models/Canvas.js:
(WI.Canvas):
(WI.Canvas.fromPayload):
(WI.Canvas._domNodeForId): Added.
(WI.Canvas.prototype.get size): Removed.
(WI.Canvas.prototype.get sizes): Added.
(WI.Canvas.prototype.get cssCanvasNames): Renamed from `cssCanvasName`.
(WI.Canvas.prototype.get displayName):
(WI.Canvas.prototype.requestNode):
(WI.Canvas.prototype.requestClientNodes):
(WI.Canvas.prototype.saveIdentityToCookie):
(WI.Canvas.prototype.sizeChanged):
(WI.Canvas.prototype.clientNodesChanged):
(WI.Canvas.prototype._calculateSize):
Store every distinct size instead of assuming that there's only a single size.
Coalesce concurrent `Canvas.requestClientNodes` calls into one backend request
and deliver its result to every callback.
* Source/WebInspectorUI/UserInterface/Views/CanvasContentView.js:
(WI.CanvasContentView):
(WI.CanvasContentView.prototype.attached):
(WI.CanvasContentView.prototype.detached):
(WI.CanvasContentView.prototype._updateSize):
(WI.CanvasContentView.prototype._updateCanvasNode): Added.
* Source/WebInspectorUI/UserInterface/Views/CanvasDetailsSidebarPanel.js:
(WI.CanvasDetailsSidebarPanel):
(WI.CanvasDetailsSidebarPanel.prototype.set canvas):
(WI.CanvasDetailsSidebarPanel.prototype._refreshSourceSection):
(WI.CanvasDetailsSidebarPanel.prototype._refreshClientsSection):
(WI.CanvasDetailsSidebarPanel.prototype._handleClientNodesChanged): Added.
* Source/WebInspectorUI/UserInterface/Views/CanvasOverviewContentView.js:
(WI.CanvasOverviewContentView.prototype._contentViewMouseEnter):
* Source/WebInspectorUI/UserInterface/Views/CanvasTreeElement.js:
(WI.CanvasTreeElement.prototype._handleMouseOver):
* Source/WebInspectorUI/UserInterface/Views/CanvasDetailsSidebarPanel.css:
(.sidebar > .panel.details.canvas .details-section > .content
.row.simple.multiple > .value): Added.
Show "(multiple)" in the details sidebar "Width" and "Height" rows when there
are multiple sizes.
Request invalidated client metadata before refreshing source links and canvas
highlighting.
Drive-by: use `WI.Canvas.prototype.get sizes` instead of inspecting DOM
attributes or resolving a remote object.
Drive-by: listen for `WI.Canvas.Event.SizeChanged` instead of observing DOM
attribute changes.
* LayoutTests/inspector/canvas/resources/create-context-utilities.js:
* LayoutTests/inspector/canvas/requestClientNodes-css.html:
* LayoutTests/inspector/canvas/requestClientNodes-webgpu.html:
* LayoutTests/inspector/canvas/requestClientNodes-webgpu-expected.txt:
* LayoutTests/inspector/canvas/worker-webgpu.html:
* LayoutTests/inspector/canvas/worker-webgpu-expected.txt:
Canonical link: https://commits.webkit.org/318467@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications