blob: 76af08e599a4d7ecb1c04022b7436663e3923f73 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/html/media/html_video_element.h"
#include "cc/layers/layer.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/dom/shadow_root.h"
#include "third_party/blink/renderer/core/html_names.h"
#include "third_party/blink/renderer/core/loader/empty_clients.h"
#include "third_party/blink/renderer/core/testing/page_test_base.h"
#include "third_party/blink/renderer/platform/testing/empty_web_media_player.h"
#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
namespace blink {
class HTMLVideoElementFrameClient : public EmptyLocalFrameClient {
public:
HTMLVideoElementFrameClient()
: player_(std::make_unique<EmptyWebMediaPlayer>()) {}
std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
HTMLMediaElement&,
const WebMediaPlayerSource&,
WebMediaPlayerClient* client,
WebLayerTreeView*) override {
DCHECK(player_) << " Empty injected player - already used?";
return std::move(player_);
}
private:
std::unique_ptr<WebMediaPlayer> player_;
};
class HTMLVideoElementTest : public PageTestBase {
public:
void SetUp() override {
SetupPageWithClients(nullptr, new HTMLVideoElementFrameClient(), nullptr);
video_ = HTMLVideoElement::Create(GetDocument());
GetDocument().body()->appendChild(video_);
}
void SetFakeCcLayer(cc::Layer* layer) { video_->SetCcLayer(layer); }
HTMLVideoElement* video() { return video_.Get(); }
private:
Persistent<HTMLVideoElement> video_;
};
TEST_F(HTMLVideoElementTest, PictureInPictureInterstitialAndTextContainer) {
scoped_refptr<cc::Layer> layer = cc::Layer::Create();
SetFakeCcLayer(layer.get());
video()->SetBooleanAttribute(HTMLNames::controlsAttr, true);
video()->SetSrc("http://example.com/foo.mp4");
test::RunPendingTasks();
// Simulate the text track being displayed.
video()->UpdateTextTrackDisplay();
video()->UpdateTextTrackDisplay();
// Simulate entering Picture-in-Picture.
video()->OnEnteredPictureInPicture();
// Simulate that text track are displayed again.
video()->UpdateTextTrackDisplay();
EXPECT_EQ(3u, video()->EnsureUserAgentShadowRoot().CountChildren());
// Reset cc::layer to avoid crashes depending on timing.
SetFakeCcLayer(nullptr);
}
} // namespace blink