diff --git a/Source/WebCore/Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp b/Source/WebCore/Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp index bbe2cbc8b9cb..07a836b93eb7 100644 --- a/Source/WebCore/Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp +++ b/Source/WebCore/Modules/pictureinpicture/HTMLVideoElementPictureInPicture.cpp @@ -189,13 +189,7 @@ void HTMLVideoElementPictureInPicture::didExitPictureInPicture() void HTMLVideoElementPictureInPicture::pictureInPictureWindowResized(const IntSize& windowSize) { - if (m_pictureInPictureWindow->width() == windowSize.width() && m_pictureInPictureWindow->height() == windowSize.height()) - return; - m_pictureInPictureWindow->setSize(windowSize); - auto resizeEvent = Event::create(eventNames().resizeEvent, Event::CanBubble::Yes, Event::IsCancelable::No); - resizeEvent->setTarget(m_pictureInPictureWindow); - m_videoElement.scheduleEvent(WTFMove(resizeEvent)); } #if !RELEASE_LOG_DISABLED diff --git a/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.cpp b/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.cpp index 59781c814e06..7423f2592e71 100644 --- a/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.cpp +++ b/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.cpp @@ -29,19 +29,22 @@ #if ENABLE(PICTURE_IN_PICTURE_API) +#include "EventNames.h" #include namespace WebCore { WTF_MAKE_ISO_ALLOCATED_IMPL(PictureInPictureWindow); -Ref PictureInPictureWindow::create(ScriptExecutionContext& scriptExecutionContext) +Ref PictureInPictureWindow::create(Document& document) { - return adoptRef(*new PictureInPictureWindow(scriptExecutionContext)); + auto window = adoptRef(*new PictureInPictureWindow(document)); + window->suspendIfNeeded(); + return window; } -PictureInPictureWindow::PictureInPictureWindow(ScriptExecutionContext& scriptExecutionContext) - : m_scriptExecutionContext(scriptExecutionContext) +PictureInPictureWindow::PictureInPictureWindow(Document& document) + : ActiveDOMObject(document) { } @@ -49,7 +52,11 @@ PictureInPictureWindow::~PictureInPictureWindow() = default; void PictureInPictureWindow::setSize(const IntSize& size) { + if (width() == size.width() && height() == size.height()) + return; + m_size = size; + queueTaskToDispatchEvent(*this, TaskSource::MediaElement, Event::create(eventNames().resizeEvent, Event::CanBubble::No, Event::IsCancelable::No)); } void PictureInPictureWindow::close() diff --git a/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.h b/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.h index 226f42d5bfb8..5e5043e5aa28 100644 --- a/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.h +++ b/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.h @@ -28,6 +28,7 @@ #if ENABLE(PICTURE_IN_PICTURE_API) +#include "ActiveDOMObject.h" #include "EventTarget.h" #include "IntSize.h" #include @@ -35,11 +36,12 @@ namespace WebCore { class PictureInPictureWindow final - : public RefCounted - , public EventTargetWithInlineData { + : public ActiveDOMObject + , public EventTargetWithInlineData + , public RefCounted { WTF_MAKE_ISO_ALLOCATED(PictureInPictureWindow); public: - static Ref create(ScriptExecutionContext&); + static Ref create(Document&); virtual ~PictureInPictureWindow(); int width() const { return m_size.width(); } @@ -51,15 +53,17 @@ class PictureInPictureWindow final using RefCounted::deref; private: - PictureInPictureWindow(ScriptExecutionContext&); + PictureInPictureWindow(Document&); + + // ActiveDOMObject + const char* activeDOMObjectName() const final { return "PictureInPictureWindow"; } // EventTarget void refEventTarget() final { ref(); } void derefEventTarget() final { deref(); } EventTargetInterface eventTargetInterface() const override { return PictureInPictureWindowEventTargetInterfaceType; }; - ScriptExecutionContext* scriptExecutionContext() const override { return &m_scriptExecutionContext; }; + ScriptExecutionContext* scriptExecutionContext() const override { return ActiveDOMObject::scriptExecutionContext(); }; - ScriptExecutionContext& m_scriptExecutionContext; IntSize m_size; }; diff --git a/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.idl b/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.idl index 8bc0d05fca4d..ac52803acb79 100644 --- a/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.idl +++ b/Source/WebCore/Modules/pictureinpicture/PictureInPictureWindow.idl @@ -25,6 +25,7 @@ */ [ + ActiveDOMObject, Conditional=PICTURE_IN_PICTURE_API, EnabledBySetting=PictureInPictureAPIEnabled, Exposed=Window