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

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

Issue 2243473002: Adding overflow menu to media player (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: small changes Created 4 years, 3 months 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) 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
3 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. 3 * Copyright (C) 2011, 2012 Google Inc. All rights 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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 , m_enclosure(nullptr) 110 , m_enclosure(nullptr)
111 , m_panel(nullptr) 111 , m_panel(nullptr)
112 , m_playButton(nullptr) 112 , m_playButton(nullptr)
113 , m_timeline(nullptr) 113 , m_timeline(nullptr)
114 , m_currentTimeDisplay(nullptr) 114 , m_currentTimeDisplay(nullptr)
115 , m_durationDisplay(nullptr) 115 , m_durationDisplay(nullptr)
116 , m_muteButton(nullptr) 116 , m_muteButton(nullptr)
117 , m_volumeSlider(nullptr) 117 , m_volumeSlider(nullptr)
118 , m_toggleClosedCaptionsButton(nullptr) 118 , m_toggleClosedCaptionsButton(nullptr)
119 , m_textTrackList(nullptr) 119 , m_textTrackList(nullptr)
120 , m_overflowList(nullptr)
120 , m_castButton(nullptr) 121 , m_castButton(nullptr)
121 , m_fullScreenButton(nullptr) 122 , m_fullScreenButton(nullptr)
122 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired ) 123 , m_hideMediaControlsTimer(this, &MediaControls::hideMediaControlsTimerFired )
123 , m_hideTimerBehaviorFlags(IgnoreNone) 124 , m_hideTimerBehaviorFlags(IgnoreNone)
124 , m_isMouseOverControls(false) 125 , m_isMouseOverControls(false)
125 , m_isPausedForScrubbing(false) 126 , m_isPausedForScrubbing(false)
126 , m_panelWidthChangedTimer(this, &MediaControls::panelWidthChangedTimerFired ) 127 , m_panelWidthChangedTimer(this, &MediaControls::panelWidthChangedTimerFired )
127 , m_panelWidth(0) 128 , m_panelWidth(0)
128 , m_allowHiddenVolumeControls(RuntimeEnabledFeatures::newMediaPlaybackUiEnab led()) 129 , m_allowHiddenVolumeControls(RuntimeEnabledFeatures::newMediaPlaybackUiEnab led())
129 { 130 {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 236
236 m_panel = panel; 237 m_panel = panel;
237 enclosure->appendChild(panel); 238 enclosure->appendChild(panel);
238 239
239 m_enclosure = enclosure; 240 m_enclosure = enclosure;
240 appendChild(enclosure); 241 appendChild(enclosure);
241 242
242 MediaControlTextTrackListElement* textTrackList = MediaControlTextTrackListE lement::create(*this); 243 MediaControlTextTrackListElement* textTrackList = MediaControlTextTrackListE lement::create(*this);
243 m_textTrackList = textTrackList; 244 m_textTrackList = textTrackList;
244 appendChild(textTrackList); 245 appendChild(textTrackList);
246
247 MediaControlOverflowMenuButtonElement* overflowMenu = MediaControlOverflowMe nuButtonElement::create(*this);
248 m_overflowMenu = overflowMenu;
249 panel->appendChild(overflowMenu);
250
251 MediaControlOverflowMenuListElement* overflowList = MediaControlOverflowMenu ListElement::create(*this);
252 m_overflowList = overflowList;
253 appendChild(overflowList);
254
255 // The order in which we append elements to the overflow list does matter.
256 m_overflowList->appendChild(m_muteButton->createOverflowElement(*this, Media ControlMuteButtonElement::create(*this)));
257 m_overflowList->appendChild(m_castButton->createOverflowElement(*this, Media ControlCastButtonElement::create(*this, false)));
258 m_overflowList->appendChild(m_toggleClosedCaptionsButton->createOverflowElem ent(*this, MediaControlToggleClosedCaptionsButtonElement::create(*this)));
259 m_overflowList->appendChild(m_fullScreenButton->createOverflowElement(*this, MediaControlFullscreenButtonElement::create(*this)));
260 m_overflowList->appendChild(m_playButton->createOverflowElement(*this, Media ControlPlayButtonElement::create(*this)));
245 } 261 }
246 262
247 void MediaControls::reset() 263 void MediaControls::reset()
248 { 264 {
249 EventDispatchForbiddenScope::AllowUserAgentEvents allowEventsInShadow; 265 EventDispatchForbiddenScope::AllowUserAgentEvents allowEventsInShadow;
250 const bool useNewUi = RuntimeEnabledFeatures::newMediaPlaybackUiEnabled(); 266 const bool useNewUi = RuntimeEnabledFeatures::newMediaPlaybackUiEnabled();
251 BatchedControlUpdate batch(this); 267 BatchedControlUpdate batch(this);
252 268
253 m_allowHiddenVolumeControls = useNewUi; 269 m_allowHiddenVolumeControls = useNewUi;
254 270
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 { 697 {
682 // Hide all controls that don't fit, and show the ones that do. 698 // Hide all controls that don't fit, and show the ones that do.
683 // This might be better suited for a layout, but since JS media controls 699 // This might be better suited for a layout, but since JS media controls
684 // won't benefit from that anwyay, we just do it here like JS will. 700 // won't benefit from that anwyay, we just do it here like JS will.
685 701
686 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled()) 702 if (!RuntimeEnabledFeatures::newMediaPlaybackUiEnabled())
687 return; 703 return;
688 704
689 // Controls that we'll hide / show, in order of decreasing priority. 705 // Controls that we'll hide / show, in order of decreasing priority.
690 MediaControlElement* elements[] = { 706 MediaControlElement* elements[] = {
691 // Exclude m_playButton; we handle it specially. 707 // Exclude m_overflowMenu; we handle it specially.
708 m_playButton.get(),
692 m_fullScreenButton.get(), 709 m_fullScreenButton.get(),
693 m_toggleClosedCaptionsButton.get(), 710 m_toggleClosedCaptionsButton.get(),
694 m_timeline.get(), 711 m_timeline.get(),
695 m_currentTimeDisplay.get(), 712 m_currentTimeDisplay.get(),
696 m_volumeSlider.get(), 713 m_volumeSlider.get(),
697 m_castButton.get(), 714 m_castButton.get(),
698 m_muteButton.get(), 715 m_muteButton.get(),
699 m_durationDisplay.get(), 716 m_durationDisplay.get(),
700 }; 717 };
701 718
702 int usedWidth = 0; 719 int usedWidth = 0;
703 720
704 // Assume that all controls require 48px, unless we can get the computed 721 // Assume that all controls require 48px, unless we can get the computed
705 // style for the play button. Since the play button is always shown, it 722 // style for the play button. Since the play button or overflow is always
706 // should be available the first time we're called after layout. This will 723 // shown, one of the two buttons should be available the first time we're
724 // called after layout. This will
707 // also be the first time we have m_panelWidth!=0, so it won't matter if 725 // also be the first time we have m_panelWidth!=0, so it won't matter if
708 // we get this wrong before that. 726 // we get this wrong before that.
709 int minimumWidth = 48; 727 int minimumWidth = 48;
710 if (m_playButton->layoutObject() && m_playButton->layoutObject()->style()) { 728 if (m_playButton->layoutObject() && m_playButton->layoutObject()->style()) {
711 const ComputedStyle* style = m_playButton->layoutObject()->style(); 729 const ComputedStyle* style = m_playButton->layoutObject()->style();
712 minimumWidth = ceil(style->width().pixels() / style->effectiveZoom()); 730 minimumWidth = ceil(style->width().pixels() / style->effectiveZoom());
713 } 731 } else if (m_overflowMenu->layoutObject() && m_overflowMenu->layoutObject()- >style()) {
714 732 const ComputedStyle* style = m_overflowMenu->layoutObject()->style();
715 // Special-case the play button; it always fits. 733 minimumWidth = ceil(style->width().pixels() / style->effectiveZoom());
716 if (m_playButton->isWanted()) {
717 m_playButton->setDoesFit(true);
718 usedWidth += minimumWidth;
719 } 734 }
720 735
721 if (!m_panelWidth) { 736 if (!m_panelWidth) {
722 // No layout yet -- hide everything, then make them show up later. 737 // No layout yet -- hide everything, then make them show up later.
723 // This prevents the wrong controls from being shown briefly 738 // This prevents the wrong controls from being shown briefly
724 // immediately after the first layout and paint, but before we have 739 // immediately after the first layout and paint, but before we have
725 // a chance to revise them. 740 // a chance to revise them.
726 for (MediaControlElement* element : elements) { 741 for (MediaControlElement* element : elements) {
727 if (element) 742 if (element)
728 element->setDoesFit(false); 743 element->setDoesFit(false);
729 } 744 }
730 return; 745 return;
731 } 746 }
732 747
748 // Insert an overflow menu. However, if we see that the overflow menu
749 // doesn't end up containing at least two elements, we will not display it
750 // but instead make place for the first element that was dropped.
751 m_overflowMenu->setDoesFit(true);
752 m_overflowMenu->setIsWanted(true);
753 usedWidth = minimumWidth;
754
755 int numOverflowElements = 0;
756 MediaControlElement* overflowElementDropped = nullptr;
mlamouri (slow - plz ping) 2016/09/07 09:07:54 May I suggest using a std::list<> instead of keepi
kdsilva 2016/09/07 11:01:10 Done.
733 // For each control that fits, enable it in order of decreasing priority. 757 // For each control that fits, enable it in order of decreasing priority.
734 bool droppedCastButton = false; 758 bool droppedCastButton = false;
735 for (MediaControlElement* element : elements) { 759 for (MediaControlElement* element : elements) {
736 if (!element) 760 if (!element)
737 continue; 761 continue;
738 762 element->shouldShowButtonInOverflowMenu(false);
739 if (element->isWanted()) { 763 if (element->isWanted()) {
740 if (usedWidth + minimumWidth <= m_panelWidth) { 764 if (usedWidth + minimumWidth <= m_panelWidth) {
741 element->setDoesFit(true); 765 element->setDoesFit(true);
742 usedWidth += minimumWidth; 766 usedWidth += minimumWidth;
743 } else { 767 } else {
744 element->setDoesFit(false); 768 element->setDoesFit(false);
745 if (element == m_castButton.get()) 769 if (element == m_castButton.get())
746 droppedCastButton = true; 770 droppedCastButton = true;
771 element->shouldShowButtonInOverflowMenu(true);
772 if (element->hasOverflowButton()) {
773 numOverflowElements++;
774 overflowElementDropped = element;
mlamouri (slow - plz ping) 2016/09/07 09:07:54 Here, you can do: `overflowElements.append(element
kdsilva 2016/09/07 11:01:09 Done.
775 }
747 } 776 }
748 } 777 }
749 } 778 }
750 779
780 // If we don't have at least two overflow elements, we will not show the
781 // overflow menu.
782 if (numOverflowElements == 0) {
mlamouri (slow - plz ping) 2016/09/07 09:07:54 `if (overflowElements.empty())`
kdsilva 2016/09/07 11:01:10 Done.
783 m_overflowMenu->setIsWanted(false);
784 usedWidth -= minimumWidth;
785 } else if (numOverflowElements == 1) {
mlamouri (slow - plz ping) 2016/09/07 09:07:54 `if (overflowElements.size() == 1)`
kdsilva 2016/09/07 11:01:09 Done.
786 m_overflowMenu->setIsWanted(false);
787 if (overflowElementDropped)
788 overflowElementDropped->setDoesFit(true);
mlamouri (slow - plz ping) 2016/09/07 09:07:54 You no longer need the null check and can do somet
kdsilva 2016/09/07 11:01:10 Done.
789 }
790
791 // We take one pass assuming that we do have an overflow menu button
792 // displayed in the media controls. If it's presence results in at least
793 // two buttons in the overflow menu, we should show the overflow menu.
794
751 // Special case for cast: if we want a cast button but dropped it, then 795 // Special case for cast: if we want a cast button but dropped it, then
752 // show the overlay cast button instead. 796 // show the overlay cast button instead.
753 if (m_castButton->isWanted()) { 797 if (m_castButton->isWanted()) {
754 if (droppedCastButton) 798 if (droppedCastButton)
755 m_overlayCastButton->tryShowOverlay(); 799 m_overlayCastButton->tryShowOverlay();
756 else 800 else
757 m_overlayCastButton->setIsWanted(false); 801 m_overlayCastButton->setIsWanted(false);
758 } 802 }
759 } 803 }
760 804
(...skipping 16 matching lines...) Expand all
777 void MediaControls::networkStateChanged() 821 void MediaControls::networkStateChanged()
778 { 822 {
779 invalidate(m_playButton); 823 invalidate(m_playButton);
780 invalidate(m_overlayPlayButton); 824 invalidate(m_overlayPlayButton);
781 invalidate(m_muteButton); 825 invalidate(m_muteButton);
782 invalidate(m_fullScreenButton); 826 invalidate(m_fullScreenButton);
783 invalidate(m_timeline); 827 invalidate(m_timeline);
784 invalidate(m_volumeSlider); 828 invalidate(m_volumeSlider);
785 } 829 }
786 830
831 bool MediaControls::overflowMenuVisible()
832 {
833 return m_overflowList->isWanted();
834 }
835
836 void MediaControls::toggleOverflowMenu()
837 {
838 m_overflowList->setIsWanted(!m_overflowList->isWanted());
839 }
840
787 DEFINE_TRACE(MediaControls) 841 DEFINE_TRACE(MediaControls)
788 { 842 {
789 visitor->trace(m_mediaElement); 843 visitor->trace(m_mediaElement);
790 visitor->trace(m_panel); 844 visitor->trace(m_panel);
791 visitor->trace(m_overlayPlayButton); 845 visitor->trace(m_overlayPlayButton);
792 visitor->trace(m_overlayEnclosure); 846 visitor->trace(m_overlayEnclosure);
793 visitor->trace(m_playButton); 847 visitor->trace(m_playButton);
794 visitor->trace(m_currentTimeDisplay); 848 visitor->trace(m_currentTimeDisplay);
795 visitor->trace(m_timeline); 849 visitor->trace(m_timeline);
796 visitor->trace(m_muteButton); 850 visitor->trace(m_muteButton);
797 visitor->trace(m_volumeSlider); 851 visitor->trace(m_volumeSlider);
798 visitor->trace(m_toggleClosedCaptionsButton); 852 visitor->trace(m_toggleClosedCaptionsButton);
799 visitor->trace(m_fullScreenButton); 853 visitor->trace(m_fullScreenButton);
800 visitor->trace(m_durationDisplay); 854 visitor->trace(m_durationDisplay);
801 visitor->trace(m_enclosure); 855 visitor->trace(m_enclosure);
802 visitor->trace(m_textTrackList); 856 visitor->trace(m_textTrackList);
857 visitor->trace(m_overflowMenu);
858 visitor->trace(m_overflowList);
803 visitor->trace(m_castButton); 859 visitor->trace(m_castButton);
804 visitor->trace(m_overlayCastButton); 860 visitor->trace(m_overlayCastButton);
805 HTMLDivElement::trace(visitor); 861 HTMLDivElement::trace(visitor);
806 } 862 }
807 863
808 } // namespace blink 864 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698