| Index: third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
|
| diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
|
| index 7e9c97be1271da2d76da6ce24b09cff9415039d7..cfa659acbbe81280b54c98b2203cc101bc00db95 100644
|
| --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
|
| +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsImplTest.cpp
|
| @@ -25,6 +25,8 @@
|
| #include "modules/media_controls/elements/MediaControlDownloadButtonElement.h"
|
| #include "modules/media_controls/elements/MediaControlTimelineElement.h"
|
| #include "modules/media_controls/elements/MediaControlVolumeSliderElement.h"
|
| +#include "modules/remoteplayback/HTMLMediaElementRemotePlayback.h"
|
| +#include "modules/remoteplayback/RemotePlayback.h"
|
| #include "platform/heap/Handle.h"
|
| #include "platform/testing/EmptyWebMediaPlayer.h"
|
| #include "platform/testing/HistogramTester.h"
|
| @@ -60,23 +62,6 @@ class MockVideoWebMediaPlayer : public EmptyWebMediaPlayer {
|
| WebTimeRanges seekable_;
|
| };
|
|
|
| -class MockWebRemotePlaybackClient : public WebRemotePlaybackClient {
|
| - public:
|
| - void StateChanged(WebRemotePlaybackState) override {}
|
| - void AvailabilityChanged(
|
| - WebRemotePlaybackAvailability availability) override {
|
| - availability_ = availability;
|
| - }
|
| - void PromptCancelled() override {}
|
| - bool RemotePlaybackAvailable() const override {
|
| - return availability_ == WebRemotePlaybackAvailability::kDeviceAvailable;
|
| - }
|
| -
|
| - private:
|
| - WebRemotePlaybackAvailability availability_ =
|
| - WebRemotePlaybackAvailability::kUnknown;
|
| -};
|
| -
|
| class MockLayoutObject : public LayoutObject {
|
| public:
|
| MockLayoutObject(Node* node) : LayoutObject(node) {}
|
| @@ -100,16 +85,9 @@ class StubLocalFrameClient : public EmptyLocalFrameClient {
|
| }
|
|
|
| WebRemotePlaybackClient* CreateWebRemotePlaybackClient(
|
| - HTMLMediaElement&) override {
|
| - if (!remote_playback_client_) {
|
| - remote_playback_client_ =
|
| - WTF::WrapUnique(new MockWebRemotePlaybackClient);
|
| - }
|
| - return remote_playback_client_.get();
|
| + HTMLMediaElement& element) override {
|
| + return HTMLMediaElementRemotePlayback::remote(element);
|
| }
|
| -
|
| - private:
|
| - std::unique_ptr<MockWebRemotePlaybackClient> remote_playback_client_;
|
| };
|
|
|
| Element* GetElementByShadowPseudoId(Node& root_node,
|
| @@ -228,6 +206,10 @@ class MediaControlsImplTest : public ::testing::Test {
|
| void MouseMoveTo(WebFloatPoint pos);
|
| void MouseUpAt(WebFloatPoint pos);
|
|
|
| + bool HasAvailabilityCallbacks(RemotePlayback* remote_playback) {
|
| + return !remote_playback->availability_callbacks_.IsEmpty();
|
| + }
|
| +
|
| private:
|
| std::unique_ptr<DummyPageHolder> page_holder_;
|
| Persistent<MediaControlsImpl> media_controls_;
|
| @@ -349,10 +331,12 @@ TEST_F(MediaControlsImplTest, CastButtonDisableRemotePlaybackAttr) {
|
|
|
| MediaControls().MediaElement().SetBooleanAttribute(
|
| HTMLNames::disableremoteplaybackAttr, true);
|
| + testing::RunPendingTasks();
|
| ASSERT_FALSE(IsElementVisible(*cast_button));
|
|
|
| MediaControls().MediaElement().SetBooleanAttribute(
|
| HTMLNames::disableremoteplaybackAttr, false);
|
| + testing::RunPendingTasks();
|
| ASSERT_TRUE(IsElementVisible(*cast_button));
|
| }
|
|
|
| @@ -376,10 +360,12 @@ TEST_F(MediaControlsImplTest, CastOverlayDisableRemotePlaybackAttr) {
|
|
|
| MediaControls().MediaElement().SetBooleanAttribute(
|
| HTMLNames::disableremoteplaybackAttr, true);
|
| + testing::RunPendingTasks();
|
| ASSERT_FALSE(IsElementVisible(*cast_overlay_button));
|
|
|
| MediaControls().MediaElement().SetBooleanAttribute(
|
| HTMLNames::disableremoteplaybackAttr, false);
|
| + testing::RunPendingTasks();
|
| ASSERT_TRUE(IsElementVisible(*cast_overlay_button));
|
| }
|
|
|
| @@ -847,4 +833,61 @@ TEST_F(MediaControlsImplTest, ControlsRemainVisibleDuringKeyboardInteraction) {
|
| EXPECT_FALSE(IsElementVisible(*panel));
|
| }
|
|
|
| +TEST_F(MediaControlsImplTest,
|
| + RemovingFromDocumentRemovesListenersAndCallbacks) {
|
| + auto page_holder = DummyPageHolder::Create();
|
| +
|
| + HTMLMediaElement* element =
|
| + HTMLVideoElement::Create(page_holder->GetDocument());
|
| + element->SetBooleanAttribute(HTMLNames::controlsAttr, true);
|
| + page_holder->GetDocument().body()->AppendChild(element);
|
| +
|
| + RemotePlayback* remote_playback =
|
| + HTMLMediaElementRemotePlayback::remote(*element);
|
| +
|
| + EXPECT_TRUE(remote_playback->HasEventListeners());
|
| + EXPECT_TRUE(HasAvailabilityCallbacks(remote_playback));
|
| +
|
| + WeakPersistent<HTMLMediaElement> weak_persistent_video = element;
|
| + {
|
| + Persistent<HTMLMediaElement> persistent_video = element;
|
| + page_holder->GetDocument().body()->setInnerHTML("");
|
| +
|
| + // When removed from the document, the event listeners should have been
|
| + // dropped.
|
| + EXPECT_FALSE(remote_playback->HasEventListeners());
|
| + EXPECT_FALSE(HasAvailabilityCallbacks(remote_playback));
|
| + }
|
| +
|
| + testing::RunPendingTasks();
|
| +
|
| + ThreadState::Current()->CollectAllGarbage();
|
| +
|
| + // It has been GC'd.
|
| + EXPECT_EQ(nullptr, weak_persistent_video);
|
| +}
|
| +
|
| +TEST_F(MediaControlsImplTest,
|
| + ReInsertingInDocumentRestoresListenersAndCallbacks) {
|
| + auto page_holder = DummyPageHolder::Create();
|
| +
|
| + HTMLMediaElement* element =
|
| + HTMLVideoElement::Create(page_holder->GetDocument());
|
| + element->SetBooleanAttribute(HTMLNames::controlsAttr, true);
|
| + page_holder->GetDocument().body()->AppendChild(element);
|
| +
|
| + RemotePlayback* remote_playback =
|
| + HTMLMediaElementRemotePlayback::remote(*element);
|
| +
|
| + // This should be a no-op. We keep a reference on the media element to avoid
|
| + // an unexpected GC.
|
| + {
|
| + Persistent<HTMLMediaElement> video_holder = element;
|
| + page_holder->GetDocument().body()->RemoveChild(element);
|
| + page_holder->GetDocument().body()->AppendChild(video_holder.Get());
|
| + EXPECT_TRUE(remote_playback->HasEventListeners());
|
| + EXPECT_TRUE(HasAvailabilityCallbacks(remote_playback));
|
| + }
|
| +}
|
| +
|
| } // namespace blink
|
|
|