Skip to content

Commit

Permalink
Detached OffscreenCanvas should not transfer ImageBuffer
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=275144
rdar://129270155

Reviewed by Simon Fraser.

The buffer cannot contain anything, as only the context-less
OffscreenCanvases can be detached.

* Source/WebCore/bindings/js/SerializedScriptValue.cpp:
(WebCore::SerializedScriptValue::computeMemoryCost const):
* Source/WebCore/html/OffscreenCanvas.cpp:
(WebCore::DetachedOffscreenCanvas::DetachedOffscreenCanvas):
(WebCore::OffscreenCanvas::create):
(WebCore::OffscreenCanvas::detach):
(WebCore::DetachedOffscreenCanvas::takeImageBuffer): Deleted.
(WebCore::OffscreenCanvas::takeImageBuffer const): Deleted.
* Source/WebCore/html/OffscreenCanvas.h:
(WebCore::DetachedOffscreenCanvas::originClean const):
(WebCore::DetachedOffscreenCanvas::memoryCost const): Deleted.

Canonical link: https://commits.webkit.org/279775@main
  • Loading branch information
kkinnunen-apple committed Jun 6, 2024
1 parent d637301 commit fa20ed6
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 44 deletions.
6 changes: 0 additions & 6 deletions Source/WebCore/bindings/js/SerializedScriptValue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5873,12 +5873,6 @@ size_t SerializedScriptValue::computeMemoryCost() const
cost += detachedImageBitmap->memoryCost();
}

#if ENABLE(OFFSCREEN_CANVAS_IN_WORKERS)
for (auto& canvas : m_internals.detachedOffscreenCanvases) {
if (canvas)
cost += canvas->memoryCost();
}
#endif
#if ENABLE(WEB_RTC)
for (auto& channel : m_internals.detachedRTCDataChannels) {
if (channel)
Expand Down
29 changes: 3 additions & 26 deletions Source/WebCore/html/OffscreenCanvas.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,23 +93,15 @@ class OffscreenCanvasPlaceholderData : public ThreadSafeRefCounted<OffscreenCanv
RefPtr<ImageBufferPipe::Source> m_pipeSource;
};

DetachedOffscreenCanvas::DetachedOffscreenCanvas(std::unique_ptr<SerializedImageBuffer> buffer, const IntSize& size, bool originClean, RefPtr<OffscreenCanvasPlaceholderData> placeholderData)
: m_buffer(WTFMove(buffer))
, m_placeholderData(WTFMove(placeholderData))
DetachedOffscreenCanvas::DetachedOffscreenCanvas(const IntSize& size, bool originClean, RefPtr<OffscreenCanvasPlaceholderData> placeholderData)
: m_placeholderData(WTFMove(placeholderData))
, m_size(size)
, m_originClean(originClean)
{
}

DetachedOffscreenCanvas::~DetachedOffscreenCanvas() = default;

RefPtr<ImageBuffer> DetachedOffscreenCanvas::takeImageBuffer(ScriptExecutionContext& context)
{
if (!m_buffer)
return nullptr;
return SerializedImageBuffer::sinkIntoImageBuffer(WTFMove(m_buffer), context.graphicsClient());
}

RefPtr<OffscreenCanvasPlaceholderData> DetachedOffscreenCanvas::takePlaceholderData()
{
return WTFMove(m_placeholderData);
Expand Down Expand Up @@ -138,7 +130,6 @@ Ref<OffscreenCanvas> OffscreenCanvas::create(ScriptExecutionContext& scriptExecu
Ref<OffscreenCanvas> OffscreenCanvas::create(ScriptExecutionContext& scriptExecutionContext, std::unique_ptr<DetachedOffscreenCanvas>&& detachedCanvas)
{
Ref<OffscreenCanvas> clone = adoptRef(*new OffscreenCanvas(scriptExecutionContext, detachedCanvas->size(), detachedCanvas->takePlaceholderData()));
clone->setImageBuffer(detachedCanvas->takeImageBuffer(scriptExecutionContext));
if (!detachedCanvas->originClean())
clone->setOriginTainted();
clone->suspendIfNeeded();
Expand Down Expand Up @@ -473,7 +464,7 @@ std::unique_ptr<DetachedOffscreenCanvas> OffscreenCanvas::detach()

m_detached = true;

auto detached = makeUnique<DetachedOffscreenCanvas>(takeImageBuffer(), size(), originClean(), WTFMove(m_placeholderData));
auto detached = makeUnique<DetachedOffscreenCanvas>(size(), originClean(), WTFMove(m_placeholderData));
setSize(IntSize(0, 0));
return detached;
}
Expand Down Expand Up @@ -535,20 +526,6 @@ void OffscreenCanvas::setImageBufferAndMarkDirty(RefPtr<ImageBuffer>&& buffer)
CanvasBase::didDraw(FloatRect(FloatPoint(), size()));
}

std::unique_ptr<SerializedImageBuffer> OffscreenCanvas::takeImageBuffer() const
{
ASSERT(m_detached);

if (size().isEmpty())
return nullptr;

clearCopiedImage();
RefPtr<ImageBuffer> buffer = setImageBuffer(nullptr);
if (!buffer)
return nullptr;
return ImageBuffer::sinkIntoSerializedImageBuffer(WTFMove(buffer));
}

void OffscreenCanvas::reset()
{
resetGraphicsContextState();
Expand Down
13 changes: 1 addition & 12 deletions Source/WebCore/html/OffscreenCanvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,23 +82,13 @@ class DetachedOffscreenCanvas {
friend class OffscreenCanvas;

public:
DetachedOffscreenCanvas(std::unique_ptr<SerializedImageBuffer>, const IntSize&, bool originClean, RefPtr<OffscreenCanvasPlaceholderData>);
DetachedOffscreenCanvas(const IntSize&, bool originClean, RefPtr<OffscreenCanvasPlaceholderData>);
WEBCORE_EXPORT ~DetachedOffscreenCanvas();

RefPtr<ImageBuffer> takeImageBuffer(ScriptExecutionContext&);
const IntSize& size() const { return m_size; }
bool originClean() const { return m_originClean; }
size_t memoryCost() const
{
auto* buffer = m_buffer.get();
if (buffer)
return buffer->memoryCost();
return 0;
}
RefPtr<OffscreenCanvasPlaceholderData> takePlaceholderData();

private:
std::unique_ptr<SerializedImageBuffer> m_buffer;
RefPtr<OffscreenCanvasPlaceholderData> m_placeholderData;
IntSize m_size;
bool m_originClean;
Expand Down Expand Up @@ -181,7 +171,6 @@ class OffscreenCanvas final : public ActiveDOMObject, public RefCounted<Offscree
void setSize(const IntSize&) final;

void createImageBuffer() const final;
std::unique_ptr<SerializedImageBuffer> takeImageBuffer() const;

void reset();
void scheduleCommitToPlaceholderCanvas();
Expand Down

0 comments on commit fa20ed6

Please sign in to comment.