Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp

Issue 2588823002: Media Controls: change how the MediaControls object is created and handled. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 m_processingPreferenceChange(false), 413 m_processingPreferenceChange(false),
414 m_playingRemotely(false), 414 m_playingRemotely(false),
415 m_inOverlayFullscreenVideo(false), 415 m_inOverlayFullscreenVideo(false),
416 m_mostlyFillingViewport(false), 416 m_mostlyFillingViewport(false),
417 m_audioTracks(this, AudioTrackList::create(*this)), 417 m_audioTracks(this, AudioTrackList::create(*this)),
418 m_videoTracks(this, VideoTrackList::create(*this)), 418 m_videoTracks(this, VideoTrackList::create(*this)),
419 m_textTracks(this, nullptr), 419 m_textTracks(this, nullptr),
420 m_audioSourceNode(nullptr), 420 m_audioSourceNode(nullptr),
421 m_autoplayUmaHelper(AutoplayUmaHelper::create(this)), 421 m_autoplayUmaHelper(AutoplayUmaHelper::create(this)),
422 m_remotePlaybackClient(nullptr), 422 m_remotePlaybackClient(nullptr),
423 m_autoplayVisibilityObserver(nullptr) { 423 m_autoplayVisibilityObserver(nullptr),
424 m_mediaControls(nullptr) {
424 BLINK_MEDIA_LOG << "HTMLMediaElement(" << (void*)this << ")"; 425 BLINK_MEDIA_LOG << "HTMLMediaElement(" << (void*)this << ")";
425 426
426 m_lockedPendingUserGesture = computeLockedPendingUserGesture(document); 427 m_lockedPendingUserGesture = computeLockedPendingUserGesture(document);
427 m_lockedPendingUserGestureIfCrossOriginExperimentEnabled = 428 m_lockedPendingUserGestureIfCrossOriginExperimentEnabled =
428 isDocumentCrossOrigin(document); 429 isDocumentCrossOrigin(document);
429 430
430 LocalFrame* frame = document.frame(); 431 LocalFrame* frame = document.frame();
431 if (frame) { 432 if (frame) {
432 m_remotePlaybackClient = 433 m_remotePlaybackClient =
433 frame->loader().client()->createWebRemotePlaybackClient(*this); 434 frame->loader().client()->createWebRemotePlaybackClient(*this);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 << ", srcAttr, old=" << oldValue << ", new=" << value 532 << ", srcAttr, old=" << oldValue << ", new=" << value
532 << ")"; 533 << ")";
533 // Trigger a reload, as long as the 'src' attribute is present. 534 // Trigger a reload, as long as the 'src' attribute is present.
534 if (!value.isNull()) { 535 if (!value.isNull()) {
535 m_ignorePreloadNone = false; 536 m_ignorePreloadNone = false;
536 invokeLoadAlgorithm(); 537 invokeLoadAlgorithm();
537 } 538 }
538 } else if (name == controlsAttr) { 539 } else if (name == controlsAttr) {
539 UseCounter::count(document(), 540 UseCounter::count(document(),
540 UseCounter::HTMLMediaElementControlsAttribute); 541 UseCounter::HTMLMediaElementControlsAttribute);
541 configureMediaControls(); 542 updateControlsVisibility();
542 } else if (name == preloadAttr) { 543 } else if (name == preloadAttr) {
543 setPlayerPreload(); 544 setPlayerPreload();
544 } else if (name == disableremoteplaybackAttr) { 545 } else if (name == disableremoteplaybackAttr) {
545 // This attribute is an extension described in the Remote Playback API spec. 546 // This attribute is an extension described in the Remote Playback API spec.
546 // Please see: https://w3c.github.io/remote-playback 547 // Please see: https://w3c.github.io/remote-playback
547 UseCounter::count(document(), UseCounter::DisableRemotePlaybackAttribute); 548 UseCounter::count(document(), UseCounter::DisableRemotePlaybackAttribute);
548 if (oldValue != value) { 549 if (oldValue != value) {
549 if (m_webMediaPlayer) 550 if (m_webMediaPlayer)
550 m_webMediaPlayer->requestRemotePlaybackDisabled(!value.isNull()); 551 m_webMediaPlayer->requestRemotePlaybackDisabled(!value.isNull());
551 // TODO(mlamouri): there is no direct API to expose if 552 // TODO(mlamouri): there is no direct API to expose if
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 m_networkState == kNetworkEmpty) { 587 m_networkState == kNetworkEmpty) {
587 m_ignorePreloadNone = false; 588 m_ignorePreloadNone = false;
588 invokeLoadAlgorithm(); 589 invokeLoadAlgorithm();
589 } 590 }
590 } 591 }
591 592
592 return InsertionShouldCallDidNotifySubtreeInsertions; 593 return InsertionShouldCallDidNotifySubtreeInsertions;
593 } 594 }
594 595
595 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() { 596 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() {
596 configureMediaControls(); 597 updateControlsVisibility();
597 } 598 }
598 599
599 void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) { 600 void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) {
600 BLINK_MEDIA_LOG << "removedFrom(" << (void*)this << ", " << insertionPoint 601 BLINK_MEDIA_LOG << "removedFrom(" << (void*)this << ", " << insertionPoint
601 << ")"; 602 << ")";
602 603
603 HTMLElement::removedFrom(insertionPoint); 604 HTMLElement::removedFrom(insertionPoint);
604 if (insertionPoint->inActiveDocument()) { 605 if (insertionPoint->inActiveDocument()) {
605 configureMediaControls(); 606 updateControlsVisibility();
606 if (m_networkState > kNetworkEmpty) 607 if (m_networkState > kNetworkEmpty)
607 pauseInternal(); 608 pauseInternal();
608 } 609 }
609 } 610 }
610 611
611 void HTMLMediaElement::attachLayoutTree(const AttachContext& context) { 612 void HTMLMediaElement::attachLayoutTree(const AttachContext& context) {
612 HTMLElement::attachLayoutTree(context); 613 HTMLElement::attachLayoutTree(context);
613 614
614 if (layoutObject()) 615 if (layoutObject())
615 layoutObject()->updateFromElement(); 616 layoutObject()->updateFromElement();
(...skipping 2808 matching lines...) Expand 10 before | Expand all | Expand 10 after
3424 return true; 3425 return true;
3425 3426
3426 return false; 3427 return false;
3427 } 3428 }
3428 3429
3429 bool HTMLMediaElement::isFullscreen() const { 3430 bool HTMLMediaElement::isFullscreen() const {
3430 return Fullscreen::isCurrentFullScreenElement(*this); 3431 return Fullscreen::isCurrentFullScreenElement(*this);
3431 } 3432 }
3432 3433
3433 void HTMLMediaElement::didEnterFullscreen() { 3434 void HTMLMediaElement::didEnterFullscreen() {
3434 configureMediaControls(); 3435 updateControlsVisibility();
3436
3435 // FIXME: There is no embedder-side handling in layout test mode. 3437 // FIXME: There is no embedder-side handling in layout test mode.
3436 if (webMediaPlayer() && !LayoutTestSupport::isRunningLayoutTest()) 3438 if (webMediaPlayer() && !LayoutTestSupport::isRunningLayoutTest())
3437 webMediaPlayer()->enteredFullscreen(); 3439 webMediaPlayer()->enteredFullscreen();
3438 // Cache this in case the player is destroyed before leaving fullscreen. 3440 // Cache this in case the player is destroyed before leaving fullscreen.
3439 m_inOverlayFullscreenVideo = usesOverlayFullscreenVideo(); 3441 m_inOverlayFullscreenVideo = usesOverlayFullscreenVideo();
3440 if (m_inOverlayFullscreenVideo) 3442 if (m_inOverlayFullscreenVideo)
3441 document().layoutViewItem().compositor()->setNeedsCompositingUpdate( 3443 document().layoutViewItem().compositor()->setNeedsCompositingUpdate(
3442 CompositingUpdateRebuildTree); 3444 CompositingUpdateRebuildTree);
3443 } 3445 }
3444 3446
3445 void HTMLMediaElement::didExitFullscreen() { 3447 void HTMLMediaElement::didExitFullscreen() {
3446 configureMediaControls(); 3448 updateControlsVisibility();
3449
3447 if (webMediaPlayer()) 3450 if (webMediaPlayer())
3448 webMediaPlayer()->exitedFullscreen(); 3451 webMediaPlayer()->exitedFullscreen();
3449 if (m_inOverlayFullscreenVideo) 3452 if (m_inOverlayFullscreenVideo)
3450 document().layoutViewItem().compositor()->setNeedsCompositingUpdate( 3453 document().layoutViewItem().compositor()->setNeedsCompositingUpdate(
3451 CompositingUpdateRebuildTree); 3454 CompositingUpdateRebuildTree);
3452 m_inOverlayFullscreenVideo = false; 3455 m_inOverlayFullscreenVideo = false;
3453 } 3456 }
3454 3457
3455 WebLayer* HTMLMediaElement::platformLayer() const { 3458 WebLayer* HTMLMediaElement::platformLayer() const {
3456 return m_webLayer; 3459 return m_webLayer;
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
3597 << boolString(shouldDelay) << ")"; 3600 << boolString(shouldDelay) << ")";
3598 3601
3599 m_shouldDelayLoadEvent = shouldDelay; 3602 m_shouldDelayLoadEvent = shouldDelay;
3600 if (shouldDelay) 3603 if (shouldDelay)
3601 document().incrementLoadEventDelayCount(); 3604 document().incrementLoadEventDelayCount();
3602 else 3605 else
3603 document().decrementLoadEventDelayCount(); 3606 document().decrementLoadEventDelayCount();
3604 } 3607 }
3605 3608
3606 MediaControls* HTMLMediaElement::mediaControls() const { 3609 MediaControls* HTMLMediaElement::mediaControls() const {
3607 if (ShadowRoot* shadowRoot = userAgentShadowRoot()) { 3610 return m_mediaControls;
3608 Node* lastChild = shadowRoot->lastChild();
3609 if (lastChild && lastChild->isMediaControls())
3610 return toMediaControls(lastChild);
3611 }
3612
3613 return nullptr;
3614 } 3611 }
3615 3612
3616 void HTMLMediaElement::ensureMediaControls() { 3613 void HTMLMediaElement::ensureMediaControls() {
3617 if (mediaControls()) 3614 if (mediaControls())
3618 return; 3615 return;
3619 3616
3620 MediaControls* mediaControls = MediaControls::create(*this);
3621 mediaControls->reset();
3622
3623 ShadowRoot& shadowRoot = ensureUserAgentShadowRoot(); 3617 ShadowRoot& shadowRoot = ensureUserAgentShadowRoot();
3624 assertShadowRootChildren(shadowRoot); 3618 m_mediaControls = MediaControls::create(*this, shadowRoot);
3625 3619
3626 // The media controls should be inserted after the text track container, 3620 // The media controls should be inserted after the text track container,
3627 // so that they are rendered in front of captions and subtitles. 3621 // so that they are rendered in front of captions and subtitles. This check
3628 shadowRoot.appendChild(mediaControls); 3622 // is verifying the contract.
3629
3630 assertShadowRootChildren(shadowRoot); 3623 assertShadowRootChildren(shadowRoot);
3631
3632 if (!shouldShowControls() || !isConnected())
3633 mediaControls->hide();
3634 } 3624 }
3635 3625
3636 void HTMLMediaElement::configureMediaControls() { 3626 void HTMLMediaElement::updateControlsVisibility() {
3637 if (!isConnected()) { 3627 if (!isConnected()) {
3638 if (mediaControls()) 3628 if (mediaControls())
3639 mediaControls()->hide(); 3629 mediaControls()->hide();
3640 return; 3630 return;
3641 } 3631 }
3642 3632
3643 ensureMediaControls(); 3633 ensureMediaControls();
3644 mediaControls()->reset();
3645 3634
3646 if (shouldShowControls(RecordMetricsBehavior::DoRecord)) 3635 if (shouldShowControls(RecordMetricsBehavior::DoRecord))
3647 mediaControls()->show(); 3636 mediaControls()->show();
3648 else 3637 else
3649 mediaControls()->hide(); 3638 mediaControls()->hide();
3650 } 3639 }
3651 3640
3652 CueTimeline& HTMLMediaElement::cueTimeline() { 3641 CueTimeline& HTMLMediaElement::cueTimeline() {
3653 if (!m_cueTimeline) 3642 if (!m_cueTimeline)
3654 m_cueTimeline = new CueTimeline(*this); 3643 m_cueTimeline = new CueTimeline(*this);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
3751 visitor->trace(m_cueTimeline); 3740 visitor->trace(m_cueTimeline);
3752 visitor->trace(m_textTracks); 3741 visitor->trace(m_textTracks);
3753 visitor->trace(m_textTracksWhenResourceSelectionBegan); 3742 visitor->trace(m_textTracksWhenResourceSelectionBegan);
3754 visitor->trace(m_playPromiseResolvers); 3743 visitor->trace(m_playPromiseResolvers);
3755 visitor->trace(m_playPromiseResolveList); 3744 visitor->trace(m_playPromiseResolveList);
3756 visitor->trace(m_playPromiseRejectList); 3745 visitor->trace(m_playPromiseRejectList);
3757 visitor->trace(m_audioSourceProvider); 3746 visitor->trace(m_audioSourceProvider);
3758 visitor->trace(m_autoplayUmaHelper); 3747 visitor->trace(m_autoplayUmaHelper);
3759 visitor->trace(m_srcObject); 3748 visitor->trace(m_srcObject);
3760 visitor->trace(m_autoplayVisibilityObserver); 3749 visitor->trace(m_autoplayVisibilityObserver);
3750 visitor->trace(m_mediaControls);
3761 visitor->template registerWeakMembers<HTMLMediaElement, 3751 visitor->template registerWeakMembers<HTMLMediaElement,
3762 &HTMLMediaElement::clearWeakMembers>( 3752 &HTMLMediaElement::clearWeakMembers>(
3763 this); 3753 this);
3764 Supplementable<HTMLMediaElement>::trace(visitor); 3754 Supplementable<HTMLMediaElement>::trace(visitor);
3765 HTMLElement::trace(visitor); 3755 HTMLElement::trace(visitor);
3766 SuspendableObject::trace(visitor); 3756 SuspendableObject::trace(visitor);
3767 } 3757 }
3768 3758
3769 DEFINE_TRACE_WRAPPERS(HTMLMediaElement) { 3759 DEFINE_TRACE_WRAPPERS(HTMLMediaElement) {
3770 visitor->traceWrappers(m_videoTracks); 3760 visitor->traceWrappers(m_videoTracks);
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
4112 kMostlyFillViewportBecomeStableSeconds, BLINK_FROM_HERE); 4102 kMostlyFillViewportBecomeStableSeconds, BLINK_FROM_HERE);
4113 } 4103 }
4114 4104
4115 void HTMLMediaElement::viewportFillDebouncerTimerFired(TimerBase*) { 4105 void HTMLMediaElement::viewportFillDebouncerTimerFired(TimerBase*) {
4116 m_mostlyFillingViewport = true; 4106 m_mostlyFillingViewport = true;
4117 if (m_webMediaPlayer) 4107 if (m_webMediaPlayer)
4118 m_webMediaPlayer->becameDominantVisibleContent(m_mostlyFillingViewport); 4108 m_webMediaPlayer->becameDominantVisibleContent(m_mostlyFillingViewport);
4119 } 4109 }
4120 4110
4121 } // namespace blink 4111 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698