Skip to content

Commit

Permalink
Speed up use of WeakPtr with EventTarget objects (such as Node)
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=265878

Reviewed by Darin Adler.

Speed up use of WeakPtr with EventTarget objects (such as Node) by using a
single thread ref count instead of ThreadSafeRefCounted for the WeakPtr
implementation object, like we did for RenderObjects.

Most of the EventTarget didn't need a thread-safe WeakPtr impl. For the
subclasses that did, I either:
- Updated the logic to avoid ref'ing / deref'ing the WeakPtr on a different
  thread.
- Had the subclass inherit ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr
  and used ThreadSafeWeakPtr instead of WeakPtr.

This tested as a small Speedometer progression (~0.3% on M1 with 98%
confidence). More importantly, this will help us convert more
CheckedPtr<Node> into WeakPtr<Node> without hurting performance.

* Source/WebCore/Modules/cookie-store/CookieStore.cpp:
(WebCore::CookieStore::MainThreadBridge::detach):
(WebCore::CookieStore::~CookieStore):
* Source/WebCore/Modules/mediastream/RTCRtpSFrameTransform.cpp:
(WebCore::processFrame):
(WebCore::RTCRtpSFrameTransform::initializeTransformer):
(WebCore::transformFrame):
(WebCore::RTCRtpSFrameTransform::createStreams):
* Source/WebCore/Modules/mediastream/RTCRtpSFrameTransform.h:
* Source/WebCore/Modules/permissions/MainThreadPermissionObserver.cpp:
(WebCore::MainThreadPermissionObserver::MainThreadPermissionObserver):
(WebCore::MainThreadPermissionObserver::stateChanged):
* Source/WebCore/Modules/permissions/MainThreadPermissionObserver.h:
* Source/WebCore/Modules/permissions/PermissionStatus.cpp:
(WebCore::PermissionStatus::PermissionStatus):
(WebCore::PermissionStatus::virtualHasPendingActivity const):
* Source/WebCore/Modules/permissions/PermissionStatus.h:
* Source/WebCore/Modules/webcodecs/WebCodecsAudioDecoder.cpp:
(WebCore::WebCodecsAudioDecoder::configure):
* Source/WebCore/Modules/webcodecs/WebCodecsAudioDecoder.h:
* Source/WebCore/Modules/webcodecs/WebCodecsAudioEncoder.cpp:
(WebCore::WebCodecsAudioEncoder::configure):
* Source/WebCore/Modules/webcodecs/WebCodecsAudioEncoder.h:
* Source/WebCore/Modules/webcodecs/WebCodecsVideoDecoder.cpp:
(WebCore::WebCodecsVideoDecoder::configure):
* Source/WebCore/Modules/webcodecs/WebCodecsVideoDecoder.h:
* Source/WebCore/Modules/webcodecs/WebCodecsVideoEncoder.cpp:
(WebCore::WebCodecsVideoEncoder::configure):
(WebCore::WebCodecsVideoEncoder::encode):
(WebCore::WebCodecsVideoEncoder::flush):
* Source/WebCore/Modules/webcodecs/WebCodecsVideoEncoder.h:
* Source/WebCore/dom/BroadcastChannel.cpp:
(WebCore::BroadcastChannel::MainThreadBridge::detach):
(WebCore::BroadcastChannel::~BroadcastChannel):
* Source/WebCore/dom/EventTarget.h:
* Source/WebCore/dom/MessagePort.cpp:
(WebCore::WTF_REQUIRES_LOCK):
(WebCore::MessagePort::MessagePort):
(WebCore::MessagePort::~MessagePort):
(WebCore::MessagePort::ref const): Deleted.
(WebCore::MessagePort::deref const): Deleted.
* Source/WebCore/dom/MessagePort.h:
* Source/WebCore/html/OffscreenCanvas.h:

Canonical link: https://commits.webkit.org/271982@main
  • Loading branch information
cdumez committed Dec 13, 2023
1 parent 31ed842 commit 4c56da2
Show file tree
Hide file tree
Showing 20 changed files with 99 additions and 103 deletions.
7 changes: 6 additions & 1 deletion Source/WebCore/Modules/cookie-store/CookieStore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ class CookieStore::MainThreadBridge : public ThreadSafeRefCounted<MainThreadBrid
void getAll(CookieStoreGetOptions&&, URL&&, Function<void(CookieStore&, ExceptionOr<Vector<Cookie>>&&)>&&);
void set(CookieInit&& options, Cookie&&, Function<void(CookieStore&, std::optional<Exception>&&)>&&);

void detach() { m_cookieStore = nullptr; }

private:
explicit MainThreadBridge(CookieStore&);

Expand Down Expand Up @@ -221,7 +223,10 @@ CookieStore::CookieStore(ScriptExecutionContext* context)
{
}

CookieStore::~CookieStore() = default;
CookieStore::~CookieStore()
{
m_mainThreadBridge->detach();
}

void CookieStore::get(String&& name, Ref<DeferredPromise>&& promise)
{
Expand Down
17 changes: 9 additions & 8 deletions Source/WebCore/Modules/mediastream/RTCRtpSFrameTransform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ static RTCRtpSFrameTransformErrorEvent::Type errorTypeFromInformation(const RTCR
}
}

static std::optional<Vector<uint8_t>> processFrame(std::span<const uint8_t> data, RTCRtpSFrameTransformer& transformer, ScriptExecutionContextIdentifier identifier, const WeakPtr<RTCRtpSFrameTransform, WeakPtrImplWithEventTargetData>& weakTransform)
static std::optional<Vector<uint8_t>> processFrame(std::span<const uint8_t> data, RTCRtpSFrameTransformer& transformer, ScriptExecutionContextIdentifier identifier, const ThreadSafeWeakPtr<RTCRtpSFrameTransform>& weakTransform)
{
auto result = transformer.transform(data);
if (!result.has_value()) {
Expand All @@ -132,11 +132,12 @@ static std::optional<Vector<uint8_t>> processFrame(std::span<const uint8_t> data
RELEASE_LOG_ERROR(WebRTC, "RTCRtpSFrameTransform failed transforming a frame with error %d", errorInformation.error);
// Call the error event handler.
ScriptExecutionContext::postTaskTo(identifier, [errorInformation, weakTransform](auto&&) {
if (!weakTransform || weakTransform->isContextStopped())
RefPtr transform = weakTransform.get();
if (!transform || transform->isContextStopped())
return;
if (errorInformation.error == RTCRtpSFrameTransformer::Error::KeyID && weakTransform->hasKey(errorInformation.keyId))
if (errorInformation.error == RTCRtpSFrameTransformer::Error::KeyID && transform->hasKey(errorInformation.keyId))
return;
weakTransform->dispatchEvent(RTCRtpSFrameTransformErrorEvent::create(Event::CanBubble::No, Event::IsCancelable::No, errorTypeFromInformation(errorInformation)));
transform->dispatchEvent(RTCRtpSFrameTransformErrorEvent::create(Event::CanBubble::No, Event::IsCancelable::No, errorTypeFromInformation(errorInformation)));
});
return { };
}
Expand Down Expand Up @@ -165,7 +166,7 @@ void RTCRtpSFrameTransform::initializeTransformer(RTCRtpTransformBackend& backen
m_transformer->setIsEncrypting(side == Side::Sender);
m_transformer->setMediaType(backend.mediaType());

backend.setTransformableFrameCallback([transformer = m_transformer, identifier = context->identifier(), backend = Ref { backend }, weakThis = WeakPtr { *this }](auto&& frame) {
backend.setTransformableFrameCallback([transformer = m_transformer, identifier = context->identifier(), backend = Ref { backend }, weakThis = ThreadSafeWeakPtr { *this }](auto&& frame) {
auto chunk = frame->data();
if (!chunk.data() || !chunk.size())
return;
Expand Down Expand Up @@ -195,15 +196,15 @@ void RTCRtpSFrameTransform::willClearBackend(RTCRtpTransformBackend& backend)
backend.clearTransformableFrameCallback();
}

static void transformFrame(std::span<const uint8_t> data, JSDOMGlobalObject& globalObject, RTCRtpSFrameTransformer& transformer, SimpleReadableStreamSource& source, ScriptExecutionContextIdentifier identifier, const WeakPtr<RTCRtpSFrameTransform, WeakPtrImplWithEventTargetData>& weakTransform)
static void transformFrame(std::span<const uint8_t> data, JSDOMGlobalObject& globalObject, RTCRtpSFrameTransformer& transformer, SimpleReadableStreamSource& source, ScriptExecutionContextIdentifier identifier, const ThreadSafeWeakPtr<RTCRtpSFrameTransform>& weakTransform)
{
auto result = processFrame(data, transformer, identifier, weakTransform);
auto buffer = result ? SharedBuffer::create(WTFMove(*result)) : SharedBuffer::create();
source.enqueue(toJS(&globalObject, &globalObject, buffer->tryCreateArrayBuffer().get()));
}

template<typename Frame>
void transformFrame(Frame& frame, JSDOMGlobalObject& globalObject, RTCRtpSFrameTransformer& transformer, SimpleReadableStreamSource& source, ScriptExecutionContextIdentifier identifier, const WeakPtr<RTCRtpSFrameTransform, WeakPtrImplWithEventTargetData>& weakTransform)
void transformFrame(Frame& frame, JSDOMGlobalObject& globalObject, RTCRtpSFrameTransformer& transformer, SimpleReadableStreamSource& source, ScriptExecutionContextIdentifier identifier, const ThreadSafeWeakPtr<RTCRtpSFrameTransform>& weakTransform)
{
auto rtcFrame = frame.rtcFrame();
auto chunk = rtcFrame->data();
Expand All @@ -226,7 +227,7 @@ ExceptionOr<void> RTCRtpSFrameTransform::createStreams()
if (readable.hasException())
return readable.releaseException();

auto writable = WritableStream::create(*JSC::jsCast<JSDOMGlobalObject*>(globalObject), SimpleWritableStreamSink::create([transformer = m_transformer, readableStreamSource = m_readableStreamSource, weakThis = WeakPtr { *this }](auto& context, auto value) -> ExceptionOr<void> {
auto writable = WritableStream::create(*JSC::jsCast<JSDOMGlobalObject*>(globalObject), SimpleWritableStreamSink::create([transformer = m_transformer, readableStreamSource = m_readableStreamSource, weakThis = ThreadSafeWeakPtr { *this }](auto& context, auto value) -> ExceptionOr<void> {
if (!context.globalObject())
return Exception { ExceptionCode::InvalidStateError };
auto& globalObject = *JSC::jsCast<JSDOMGlobalObject*>(context.globalObject());
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/Modules/mediastream/RTCRtpSFrameTransform.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class ReadableStream;
class SimpleReadableStreamSource;
class WritableStream;

class RTCRtpSFrameTransform : public RefCounted<RTCRtpSFrameTransform>, public ActiveDOMObject, public EventTarget {
class RTCRtpSFrameTransform : public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<RTCRtpSFrameTransform>, public ActiveDOMObject, public EventTarget {
WTF_MAKE_ISO_ALLOCATED(RTCRtpSFrameTransform);
public:
enum class Role { Encrypt, Decrypt };
Expand Down Expand Up @@ -75,8 +75,8 @@ class RTCRtpSFrameTransform : public RefCounted<RTCRtpSFrameTransform>, public A

bool hasKey(uint64_t) const;

using RefCounted<RTCRtpSFrameTransform>::ref;
using RefCounted<RTCRtpSFrameTransform>::deref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::deref;

private:
RTCRtpSFrameTransform(ScriptExecutionContext&, Options);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

namespace WebCore {

MainThreadPermissionObserver::MainThreadPermissionObserver(WeakPtr<PermissionStatus, WeakPtrImplWithEventTargetData>&& permissionStatus, ScriptExecutionContextIdentifier contextIdentifier, PermissionState state, PermissionDescriptor descriptor, PermissionQuerySource source, WeakPtr<Page>&& page, ClientOrigin&& origin)
MainThreadPermissionObserver::MainThreadPermissionObserver(ThreadSafeWeakPtr<PermissionStatus>&& permissionStatus, ScriptExecutionContextIdentifier contextIdentifier, PermissionState state, PermissionDescriptor descriptor, PermissionQuerySource source, WeakPtr<Page>&& page, ClientOrigin&& origin)
: m_permissionStatus(WTFMove(permissionStatus))
, m_contextIdentifier(contextIdentifier)
, m_state(state)
Expand All @@ -57,8 +57,8 @@ void MainThreadPermissionObserver::stateChanged(PermissionState newPermissionSta
{
m_state = newPermissionState;

ScriptExecutionContext::ensureOnContextThread(m_contextIdentifier, [permissionStatus = m_permissionStatus, newPermissionState](auto&) {
if (permissionStatus)
ScriptExecutionContext::ensureOnContextThread(m_contextIdentifier, [weakPermissionStatus = m_permissionStatus, newPermissionState](auto&) {
if (RefPtr permissionStatus = weakPermissionStatus.get())
permissionStatus->stateChanged(newPermissionState);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class MainThreadPermissionObserver final : public PermissionObserver {
WTF_MAKE_NONCOPYABLE(MainThreadPermissionObserver);
WTF_MAKE_FAST_ALLOCATED;
public:
MainThreadPermissionObserver(WeakPtr<PermissionStatus, WeakPtrImplWithEventTargetData>&&, ScriptExecutionContextIdentifier, PermissionState, PermissionDescriptor, PermissionQuerySource, WeakPtr<Page>&&, ClientOrigin&&);
MainThreadPermissionObserver(ThreadSafeWeakPtr<PermissionStatus>&&, ScriptExecutionContextIdentifier, PermissionState, PermissionDescriptor, PermissionQuerySource, WeakPtr<Page>&&, ClientOrigin&&);
~MainThreadPermissionObserver();

private:
Expand All @@ -54,7 +54,7 @@ class MainThreadPermissionObserver final : public PermissionObserver {
PermissionQuerySource source() const final { return m_source; }
const WeakPtr<Page>& page() const final { return m_page; }

WeakPtr<PermissionStatus, WeakPtrImplWithEventTargetData> m_permissionStatus;
ThreadSafeWeakPtr<PermissionStatus> m_permissionStatus;
ScriptExecutionContextIdentifier m_contextIdentifier;
PermissionState m_state;
PermissionDescriptor m_descriptor;
Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/Modules/permissions/PermissionStatus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ PermissionStatus::PermissionStatus(ScriptExecutionContext& context, PermissionSt

m_mainThreadPermissionObserverIdentifier = MainThreadPermissionObserverIdentifier::generate();

ensureOnMainThread([weakThis = WeakPtr { *this }, contextIdentifier = context.identifier(), state = m_state, descriptor = m_descriptor, source, page = WTFMove(page), origin = WTFMove(clientOrigin).isolatedCopy(), identifier = m_mainThreadPermissionObserverIdentifier]() mutable {
ensureOnMainThread([weakThis = ThreadSafeWeakPtr { *this }, contextIdentifier = context.identifier(), state = m_state, descriptor = m_descriptor, source, page = WTFMove(page), origin = WTFMove(clientOrigin).isolatedCopy(), identifier = m_mainThreadPermissionObserverIdentifier]() mutable {
auto mainThreadPermissionObserver = makeUnique<MainThreadPermissionObserver>(WTFMove(weakThis), contextIdentifier, state, descriptor, source, WTFMove(page), WTFMove(origin));
allMainThreadPermissionObservers().add(identifier, WTFMove(mainThreadPermissionObserver));
});
Expand Down Expand Up @@ -115,7 +115,7 @@ bool PermissionStatus::virtualHasPendingActivity() const
if (!m_hasChangeEventListener)
return false;

if (WeakPtr document = dynamicDowncast<Document>(scriptExecutionContext()))
if (auto* document = dynamicDowncast<Document>(scriptExecutionContext()))
return document->hasBrowsingContext();

return true;
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/Modules/permissions/PermissionStatus.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ namespace WebCore {

class ScriptExecutionContext;

class PermissionStatus final : public ActiveDOMObject, public RefCounted<PermissionStatus>, public EventTarget {
class PermissionStatus final : public ActiveDOMObject, public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<PermissionStatus>, public EventTarget {
WTF_MAKE_ISO_ALLOCATED(PermissionStatus);
public:
static Ref<PermissionStatus> create(ScriptExecutionContext&, PermissionState, PermissionDescriptor, PermissionQuerySource, WeakPtr<Page>&&);
Expand All @@ -50,8 +50,8 @@ class PermissionStatus final : public ActiveDOMObject, public RefCounted<Permiss

void stateChanged(PermissionState);

using RefCounted::ref;
using RefCounted::deref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::deref;

private:
PermissionStatus(ScriptExecutionContext&, PermissionState, PermissionDescriptor, PermissionQuerySource, WeakPtr<Page>&&);
Expand Down
7 changes: 4 additions & 3 deletions Source/WebCore/Modules/webcodecs/WebCodecsAudioDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,11 +105,12 @@ ExceptionOr<void> WebCodecsAudioDecoder::configure(ScriptExecutionContext&, WebC
bool isSupportedCodec = AudioDecoder::isCodecSupported(config.codec);
queueControlMessageAndProcess([this, config = WTFMove(config), isSupportedCodec, identifier = scriptExecutionContext()->identifier()]() mutable {
m_isMessageQueueBlocked = true;
AudioDecoder::PostTaskCallback postTaskCallback = [identifier, weakThis = WeakPtr { *this }](Function<void()>&& task) {
AudioDecoder::PostTaskCallback postTaskCallback = [identifier, weakThis = ThreadSafeWeakPtr { *this }](Function<void()>&& task) {
ScriptExecutionContext::postTaskTo(identifier, [weakThis, task = WTFMove(task)](auto&) mutable {
if (!weakThis)
RefPtr protectedThis = weakThis.get();
if (!protectedThis)
return;
weakThis->queueTaskKeepingObjectAlive(*weakThis, TaskSource::MediaElement, WTFMove(task));
protectedThis->queueTaskKeepingObjectAlive(*protectedThis, TaskSource::MediaElement, WTFMove(task));
});
};

Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/Modules/webcodecs/WebCodecsAudioDecoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class WebCodecsErrorCallback;
class WebCodecsAudioDataOutputCallback;

class WebCodecsAudioDecoder
: public RefCounted<WebCodecsAudioDecoder>
: public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<WebCodecsAudioDecoder>
, public ActiveDOMObject
, public EventTarget {
WTF_MAKE_ISO_ALLOCATED(WebCodecsAudioDecoder);
Expand All @@ -71,8 +71,8 @@ class WebCodecsAudioDecoder

static void isConfigSupported(ScriptExecutionContext&, WebCodecsAudioDecoderConfig&&, Ref<DeferredPromise>&&);

using RefCounted::ref;
using RefCounted::deref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::deref;

private:
WebCodecsAudioDecoder(ScriptExecutionContext&, Init&&);
Expand Down
11 changes: 6 additions & 5 deletions Source/WebCore/Modules/webcodecs/WebCodecsAudioEncoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,15 +139,16 @@ ExceptionOr<void> WebCodecsAudioEncoder::configure(ScriptExecutionContext&, WebC
if (m_internalEncoder) {
queueControlMessageAndProcess([this, config]() mutable {
m_isMessageQueueBlocked = true;
m_internalEncoder->flush([this, weakedThis = WeakPtr { *this }, config = WTFMove(config)]() mutable {
if (!weakedThis)
m_internalEncoder->flush([weakThis = ThreadSafeWeakPtr { *this }, config = WTFMove(config)]() mutable {
RefPtr protectedThis = weakThis.get();
if (!protectedThis)
return;

if (m_state == WebCodecsCodecState::Closed || !scriptExecutionContext())
if (protectedThis->m_state == WebCodecsCodecState::Closed || !protectedThis->scriptExecutionContext())
return;

m_isMessageQueueBlocked = false;
processControlMessageQueue();
protectedThis->m_isMessageQueueBlocked = false;
protectedThis->processControlMessageQueue();
});
});
}
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/Modules/webcodecs/WebCodecsAudioEncoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class WebCodecsAudioData;
struct WebCodecsEncodedAudioChunkMetadata;

class WebCodecsAudioEncoder
: public RefCounted<WebCodecsAudioEncoder>
: public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<WebCodecsAudioEncoder>
, public ActiveDOMObject
, public EventTarget {
WTF_MAKE_ISO_ALLOCATED(WebCodecsAudioEncoder);
Expand All @@ -71,8 +71,8 @@ class WebCodecsAudioEncoder

static void isConfigSupported(ScriptExecutionContext&, WebCodecsAudioEncoderConfig&&, Ref<DeferredPromise>&&);

using RefCounted::ref;
using RefCounted::deref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::deref;

private:
WebCodecsAudioEncoder(ScriptExecutionContext&, Init&&);
Expand Down
7 changes: 4 additions & 3 deletions Source/WebCore/Modules/webcodecs/WebCodecsVideoDecoder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,12 @@ ExceptionOr<void> WebCodecsVideoDecoder::configure(ScriptExecutionContext& conte
bool isSupportedCodec = isSupportedDecoderCodec(config.codec, context.settingsValues());
queueControlMessageAndProcess([this, config = WTFMove(config), isSupportedCodec, identifier = scriptExecutionContext()->identifier()]() mutable {
m_isMessageQueueBlocked = true;
VideoDecoder::PostTaskCallback postTaskCallback = [identifier, weakThis = WeakPtr { *this }](auto&& task) {
VideoDecoder::PostTaskCallback postTaskCallback = [identifier, weakThis = ThreadSafeWeakPtr { *this }](auto&& task) {
ScriptExecutionContext::postTaskTo(identifier, [weakThis, task = WTFMove(task)](auto&) mutable {
if (!weakThis)
RefPtr protectedThis = weakThis.get();
if (!protectedThis)
return;
weakThis->queueTaskKeepingObjectAlive(*weakThis, TaskSource::MediaElement, [task = WTFMove(task)]() mutable {
protectedThis->queueTaskKeepingObjectAlive(*protectedThis, TaskSource::MediaElement, [task = WTFMove(task)]() mutable {
task();
});
});
Expand Down
6 changes: 3 additions & 3 deletions Source/WebCore/Modules/webcodecs/WebCodecsVideoDecoder.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class WebCodecsErrorCallback;
class WebCodecsVideoFrameOutputCallback;

class WebCodecsVideoDecoder
: public RefCounted<WebCodecsVideoDecoder>
: public ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr<WebCodecsVideoDecoder>
, public ActiveDOMObject
, public EventTarget {
WTF_MAKE_ISO_ALLOCATED(WebCodecsVideoDecoder);
Expand All @@ -69,8 +69,8 @@ class WebCodecsVideoDecoder

static void isConfigSupported(ScriptExecutionContext&, WebCodecsVideoDecoderConfig&&, Ref<DeferredPromise>&&);

using RefCounted::ref;
using RefCounted::deref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::ref;
using ThreadSafeRefCountedAndCanMakeThreadSafeWeakPtr::deref;

private:
WebCodecsVideoDecoder(ScriptExecutionContext&, Init&&);
Expand Down
Loading

0 comments on commit 4c56da2

Please sign in to comment.