Commit a0651819 authored by mlamouri's avatar mlamouri Committed by Commit bot

Media Controls: change how the MediaControls object is created and handled.

The HTMLMediaElement no longer adds the MediaControls to the shadow tree
in order to prepare for the class to be an interface implemented by
modules. This CL also removes a couple of reset() call.

BUG=662761
R=zqzhang@chromium.org

Review-Url: https://codereview.chromium.org/2588823002
Cr-Commit-Position: refs/heads/master@{#439811}
parent a5ec1880
...@@ -420,7 +420,8 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, ...@@ -420,7 +420,8 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName,
m_audioSourceNode(nullptr), m_audioSourceNode(nullptr),
m_autoplayUmaHelper(AutoplayUmaHelper::create(this)), m_autoplayUmaHelper(AutoplayUmaHelper::create(this)),
m_remotePlaybackClient(nullptr), m_remotePlaybackClient(nullptr),
m_autoplayVisibilityObserver(nullptr) { m_autoplayVisibilityObserver(nullptr),
m_mediaControls(nullptr) {
BLINK_MEDIA_LOG << "HTMLMediaElement(" << (void*)this << ")"; BLINK_MEDIA_LOG << "HTMLMediaElement(" << (void*)this << ")";
m_lockedPendingUserGesture = computeLockedPendingUserGesture(document); m_lockedPendingUserGesture = computeLockedPendingUserGesture(document);
...@@ -538,7 +539,7 @@ void HTMLMediaElement::parseAttribute(const QualifiedName& name, ...@@ -538,7 +539,7 @@ void HTMLMediaElement::parseAttribute(const QualifiedName& name,
} else if (name == controlsAttr) { } else if (name == controlsAttr) {
UseCounter::count(document(), UseCounter::count(document(),
UseCounter::HTMLMediaElementControlsAttribute); UseCounter::HTMLMediaElementControlsAttribute);
configureMediaControls(); updateControlsVisibility();
} else if (name == preloadAttr) { } else if (name == preloadAttr) {
setPlayerPreload(); setPlayerPreload();
} else if (name == disableremoteplaybackAttr) { } else if (name == disableremoteplaybackAttr) {
...@@ -593,7 +594,7 @@ Node::InsertionNotificationRequest HTMLMediaElement::insertedInto( ...@@ -593,7 +594,7 @@ Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(
} }
void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() { void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() {
configureMediaControls(); updateControlsVisibility();
} }
void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) { void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) {
...@@ -602,7 +603,7 @@ void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) { ...@@ -602,7 +603,7 @@ void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) {
HTMLElement::removedFrom(insertionPoint); HTMLElement::removedFrom(insertionPoint);
if (insertionPoint->inActiveDocument()) { if (insertionPoint->inActiveDocument()) {
configureMediaControls(); updateControlsVisibility();
if (m_networkState > kNetworkEmpty) if (m_networkState > kNetworkEmpty)
pauseInternal(); pauseInternal();
} }
...@@ -3431,7 +3432,8 @@ bool HTMLMediaElement::isFullscreen() const { ...@@ -3431,7 +3432,8 @@ bool HTMLMediaElement::isFullscreen() const {
} }
void HTMLMediaElement::didEnterFullscreen() { void HTMLMediaElement::didEnterFullscreen() {
configureMediaControls(); updateControlsVisibility();
// FIXME: There is no embedder-side handling in layout test mode. // FIXME: There is no embedder-side handling in layout test mode.
if (webMediaPlayer() && !LayoutTestSupport::isRunningLayoutTest()) if (webMediaPlayer() && !LayoutTestSupport::isRunningLayoutTest())
webMediaPlayer()->enteredFullscreen(); webMediaPlayer()->enteredFullscreen();
...@@ -3443,7 +3445,8 @@ void HTMLMediaElement::didEnterFullscreen() { ...@@ -3443,7 +3445,8 @@ void HTMLMediaElement::didEnterFullscreen() {
} }
void HTMLMediaElement::didExitFullscreen() { void HTMLMediaElement::didExitFullscreen() {
configureMediaControls(); updateControlsVisibility();
if (webMediaPlayer()) if (webMediaPlayer())
webMediaPlayer()->exitedFullscreen(); webMediaPlayer()->exitedFullscreen();
if (m_inOverlayFullscreenVideo) if (m_inOverlayFullscreenVideo)
...@@ -3604,36 +3607,23 @@ void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay) { ...@@ -3604,36 +3607,23 @@ void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay) {
} }
MediaControls* HTMLMediaElement::mediaControls() const { MediaControls* HTMLMediaElement::mediaControls() const {
if (ShadowRoot* shadowRoot = userAgentShadowRoot()) { return m_mediaControls;
Node* lastChild = shadowRoot->lastChild();
if (lastChild && lastChild->isMediaControls())
return toMediaControls(lastChild);
}
return nullptr;
} }
void HTMLMediaElement::ensureMediaControls() { void HTMLMediaElement::ensureMediaControls() {
if (mediaControls()) if (mediaControls())
return; return;
MediaControls* mediaControls = MediaControls::create(*this);
mediaControls->reset();
ShadowRoot& shadowRoot = ensureUserAgentShadowRoot(); ShadowRoot& shadowRoot = ensureUserAgentShadowRoot();
assertShadowRootChildren(shadowRoot); m_mediaControls = MediaControls::create(*this, shadowRoot);
// The media controls should be inserted after the text track container, // The media controls should be inserted after the text track container,
// so that they are rendered in front of captions and subtitles. // so that they are rendered in front of captions and subtitles. This check
shadowRoot.appendChild(mediaControls); // is verifying the contract.
assertShadowRootChildren(shadowRoot); assertShadowRootChildren(shadowRoot);
if (!shouldShowControls() || !isConnected())
mediaControls->hide();
} }
void HTMLMediaElement::configureMediaControls() { void HTMLMediaElement::updateControlsVisibility() {
if (!isConnected()) { if (!isConnected()) {
if (mediaControls()) if (mediaControls())
mediaControls()->hide(); mediaControls()->hide();
...@@ -3641,6 +3631,9 @@ void HTMLMediaElement::configureMediaControls() { ...@@ -3641,6 +3631,9 @@ void HTMLMediaElement::configureMediaControls() {
} }
ensureMediaControls(); ensureMediaControls();
// TODO(mlamouri): this doesn't sound needed but the following tests, on
// Android fails when removed:
// fullscreen/compositor-touch-hit-rects-fullscreen-video-controls.html
mediaControls()->reset(); mediaControls()->reset();
if (shouldShowControls(RecordMetricsBehavior::DoRecord)) if (shouldShowControls(RecordMetricsBehavior::DoRecord))
...@@ -3758,6 +3751,7 @@ DEFINE_TRACE(HTMLMediaElement) { ...@@ -3758,6 +3751,7 @@ DEFINE_TRACE(HTMLMediaElement) {
visitor->trace(m_autoplayUmaHelper); visitor->trace(m_autoplayUmaHelper);
visitor->trace(m_srcObject); visitor->trace(m_srcObject);
visitor->trace(m_autoplayVisibilityObserver); visitor->trace(m_autoplayVisibilityObserver);
visitor->trace(m_mediaControls);
visitor->template registerWeakMembers<HTMLMediaElement, visitor->template registerWeakMembers<HTMLMediaElement,
&HTMLMediaElement::clearWeakMembers>( &HTMLMediaElement::clearWeakMembers>(
this); this);
......
...@@ -483,7 +483,7 @@ class CORE_EXPORT HTMLMediaElement ...@@ -483,7 +483,7 @@ class CORE_EXPORT HTMLMediaElement
void requireOfficialPlaybackPositionUpdate() const; void requireOfficialPlaybackPositionUpdate() const;
void ensureMediaControls(); void ensureMediaControls();
void configureMediaControls(); void updateControlsVisibility();
TextTrackContainer& ensureTextTrackContainer(); TextTrackContainer& ensureTextTrackContainer();
...@@ -746,6 +746,8 @@ class CORE_EXPORT HTMLMediaElement ...@@ -746,6 +746,8 @@ class CORE_EXPORT HTMLMediaElement
IntRect m_currentIntersectRect; IntRect m_currentIntersectRect;
Member<MediaControls> m_mediaControls;
static URLRegistry* s_mediaStreamRegistry; static URLRegistry* s_mediaStreamRegistry;
}; };
......
...@@ -878,6 +878,7 @@ MediaControlFullscreenButtonElement::create(MediaControls& mediaControls) { ...@@ -878,6 +878,7 @@ MediaControlFullscreenButtonElement::create(MediaControls& mediaControls) {
button->setType(InputTypeNames::button); button->setType(InputTypeNames::button);
button->setShadowPseudoId( button->setShadowPseudoId(
AtomicString("-webkit-media-controls-fullscreen-button")); AtomicString("-webkit-media-controls-fullscreen-button"));
button->setIsFullscreen(mediaControls.mediaElement().isFullscreen());
button->setIsWanted(false); button->setIsWanted(false);
return button; return button;
} }
......
...@@ -140,10 +140,12 @@ MediaControls::MediaControls(HTMLMediaElement& mediaElement) ...@@ -140,10 +140,12 @@ MediaControls::MediaControls(HTMLMediaElement& mediaElement)
m_panelWidth(0), m_panelWidth(0),
m_keepShowingUntilTimerFires(false) {} m_keepShowingUntilTimerFires(false) {}
MediaControls* MediaControls::create(HTMLMediaElement& mediaElement) { MediaControls* MediaControls::create(HTMLMediaElement& mediaElement,
ShadowRoot& shadowRoot) {
MediaControls* controls = new MediaControls(mediaElement); MediaControls* controls = new MediaControls(mediaElement);
controls->setShadowPseudoId(AtomicString("-webkit-media-controls")); controls->setShadowPseudoId(AtomicString("-webkit-media-controls"));
controls->initializeControls(); controls->initializeControls();
controls->reset();
// Initialize the orientation lock when going fullscreen feature. // Initialize the orientation lock when going fullscreen feature.
if (RuntimeEnabledFeatures::videoFullscreenOrientationLockEnabled() && if (RuntimeEnabledFeatures::videoFullscreenOrientationLockEnabled() &&
...@@ -153,6 +155,7 @@ MediaControls* MediaControls::create(HTMLMediaElement& mediaElement) { ...@@ -153,6 +155,7 @@ MediaControls* MediaControls::create(HTMLMediaElement& mediaElement) {
toHTMLVideoElement(mediaElement)); toHTMLVideoElement(mediaElement));
} }
shadowRoot.appendChild(controls);
return controls; return controls;
} }
...@@ -354,7 +357,6 @@ void MediaControls::reset() { ...@@ -354,7 +357,6 @@ void MediaControls::reset() {
onTextTracksAddedOrRemoved(); onTextTracksAddedOrRemoved();
m_fullscreenButton->setIsWanted(shouldShowFullscreenButton(mediaElement())); m_fullscreenButton->setIsWanted(shouldShowFullscreenButton(mediaElement()));
m_fullscreenButton->setIsFullscreen(mediaElement().isFullscreen());
refreshCastButtonVisibilityWithoutUpdate(); refreshCastButtonVisibilityWithoutUpdate();
......
...@@ -36,10 +36,11 @@ class Event; ...@@ -36,10 +36,11 @@ class Event;
class MediaControlsMediaEventListener; class MediaControlsMediaEventListener;
class MediaControlsOrientationLockDelegate; class MediaControlsOrientationLockDelegate;
class MediaControlsWindowEventListener; class MediaControlsWindowEventListener;
class ShadowRoot;
class CORE_EXPORT MediaControls final : public HTMLDivElement { class CORE_EXPORT MediaControls final : public HTMLDivElement {
public: public:
static MediaControls* create(HTMLMediaElement&); static MediaControls* create(HTMLMediaElement&, ShadowRoot&);
HTMLMediaElement& mediaElement() const { return *m_mediaElement; } HTMLMediaElement& mediaElement() const { return *m_mediaElement; }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment