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

Side by Side Diff: third_party/WebKit/Source/modules/media_controls/MediaControlsImpl.h

Issue 2795783004: Move core MediaControls implementation to modules/media_controls/. (Closed)
Patch Set: rebase Created 3 years, 8 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
11 * notice, this list of conditions and the following disclaimer in the 11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution. 12 * documentation and/or other materials provided with the distribution.
13 * 13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */ 25 */
26 26
27 #ifndef MediaControls_h 27 #ifndef MediaControlsImpl_h
28 #define MediaControls_h 28 #define MediaControlsImpl_h
29 29
30 #include "core/html/HTMLDivElement.h" 30 #include "core/html/HTMLDivElement.h"
31 #include "core/html/media/MediaControls.h"
31 #include "core/html/shadow/MediaControlElements.h" 32 #include "core/html/shadow/MediaControlElements.h"
33 #include "modules/ModulesExport.h"
32 34
33 namespace blink { 35 namespace blink {
34 36
35 class Event; 37 class Event;
36 class MediaControlsMediaEventListener; 38 class MediaControlsMediaEventListener;
37 class MediaControlsOrientationLockDelegate; 39 class MediaControlsOrientationLockDelegate;
38 class MediaControlsWindowEventListener; 40 class MediaControlsWindowEventListener;
39 class ShadowRoot; 41 class ShadowRoot;
40 42
41 class CORE_EXPORT MediaControls final : public HTMLDivElement { 43 // Default implementation of the core/ MediaControls interface used by
44 // HTMLMediaElement.
45 class MODULES_EXPORT MediaControlsImpl final : public HTMLDivElement,
46 public MediaControls {
47 USING_GARBAGE_COLLECTED_MIXIN(MediaControlsImpl);
48 WTF_MAKE_NONCOPYABLE(MediaControlsImpl);
49
42 public: 50 public:
43 static MediaControls* create(HTMLMediaElement&, ShadowRoot&); 51 class Factory : public MediaControls::Factory {
52 public:
53 MediaControls* create(HTMLMediaElement&, ShadowRoot&) override;
54 };
44 55
45 HTMLMediaElement& mediaElement() const { return *m_mediaElement; } 56 ~MediaControlsImpl() = default;
46 57
47 // Node override. 58 // Node override.
48 Node::InsertionNotificationRequest insertedInto(ContainerNode*) override; 59 Node::InsertionNotificationRequest insertedInto(ContainerNode*) override;
49 void removedFrom(ContainerNode*) override; 60 void removedFrom(ContainerNode*) override;
50 61
51 void reset(); 62 // MediaControls implementation.
52 void onControlsListUpdated(); 63 void show() override;
53 64 void hide() override;
54 void show(); 65 void reset() override;
55 void hide(); 66 void onControlsListUpdated() override;
56 bool isVisible() const;
57
58 void beginScrubbing();
59 void endScrubbing();
60
61 void updateCurrentTimeDisplay();
62
63 void toggleTextTrackList();
64 void showTextTrackAtIndex(unsigned indexToEnable);
65 void disableShowingTextTracks();
66
67 // Called by the fullscreen buttons to toggle fulllscreen on/off.
68 void enterFullscreen();
69 void exitFullscreen();
70
71 void showOverlayCastButtonIfNeeded();
72 // Update cast button visibility, but don't try to update our panel
73 // button visibility for space.
74 void refreshCastButtonVisibilityWithoutUpdate();
75
76 void setAllowHiddenVolumeControls(bool);
77
78 // Returns the layout object for the part of the controls that should be
79 // used for overlap checking during text track layout. May be null.
80 LayoutObject* layoutObjectForTextTrackLayout();
81
82 // Return the internal elements, which is used by registering clicking
83 // EventHandlers from MediaControlsWindowEventListener.
84 MediaControlPanelElement* panelElement() { return m_panel; }
85 MediaControlTimelineElement* timelineElement() { return m_timeline; }
86 MediaControlCastButtonElement* castButtonElement() { return m_castButton; }
87 MediaControlVolumeSliderElement* volumeSliderElement() {
88 return m_volumeSlider;
89 }
90
91 // Notify us that the media element's network state has changed.
92 void networkStateChanged();
93
94 void toggleOverflowMenu();
95
96 bool overflowMenuVisible();
97
98 // TODO(mlamouri): this is temporary to notify the controls that an 67 // TODO(mlamouri): this is temporary to notify the controls that an
99 // HTMLTrackElement failed to load because there is no web exposed way to 68 // HTMLTrackElement failed to load because there is no web exposed way to
100 // be notified on the TextTrack object. See https://crbug.com/669977 69 // be notified on the TextTrack object. See https://crbug.com/669977
101 void onTrackElementFailedToLoad() { onTextTracksAddedOrRemoved(); } 70 void onTrackElementFailedToLoad() override { onTextTracksAddedOrRemoved(); }
102
103 // TODO(mlamouri): the following methods will be able to become private when 71 // TODO(mlamouri): the following methods will be able to become private when
104 // the controls have moved to modules/ and have access to RemotePlayback. 72 // the controls have to modules/ and have access to RemotePlayback.
105 void onRemotePlaybackAvailabilityChanged() { refreshCastButtonVisibility(); } 73 void onRemotePlaybackAvailabilityChanged() override {
106 void onRemotePlaybackConnecting() { startedCasting(); } 74 refreshCastButtonVisibility();
107 void onRemotePlaybackDisconnected() { stoppedCasting(); } 75 }
108 76 void onRemotePlaybackConnecting() override { startedCasting(); }
77 void onRemotePlaybackDisconnected() override { stoppedCasting(); }
109 // TODO(mlamouri): this method is needed in order to notify the controls that 78 // TODO(mlamouri): this method is needed in order to notify the controls that
110 // the attribute have changed. 79 // the attribute have changed.
111 void onDisableRemotePlaybackAttributeChanged() { 80 void onDisableRemotePlaybackAttributeChanged() override {
112 refreshCastButtonVisibility(); 81 refreshCastButtonVisibility();
113 } 82 }
114 83 // Notify us that the media element's network state has changed.
84 void networkStateChanged() override;
85 LayoutObject* panelLayoutObject() override;
86 LayoutObject* containerLayoutObject() override;
87 // Return the internal elements, which is used by registering clicking
88 // EventHandlers from MediaControlsWindowEventListener.
89 MediaControlPanelElement* panelElement() override { return m_panel; }
90 MediaControlTimelineElement* timelineElement() override { return m_timeline; }
91 MediaControlCastButtonElement* castButtonElement() override {
92 return m_castButton;
93 }
94 MediaControlVolumeSliderElement* volumeSliderElement() override {
95 return m_volumeSlider;
96 }
97 void beginScrubbing() override;
98 void endScrubbing() override;
99 void updateCurrentTimeDisplay() override;
100 void toggleTextTrackList() override;
101 void showTextTrackAtIndex(unsigned indexToEnable) override;
102 void disableShowingTextTracks() override;
103 // Called by the fullscreen buttons to toggle fulllscreen on/off.
104 void enterFullscreen() override;
105 void exitFullscreen() override;
106 void showOverlayCastButtonIfNeeded() override;
107 void toggleOverflowMenu() override;
108 bool overflowMenuVisible() override;
115 // TODO(mlamouri): this method is needed in order to notify the controls that 109 // TODO(mlamouri): this method is needed in order to notify the controls that
116 // the `mediaControlsEnabled` setting has changed. 110 // the `MediaControlsEnabled` setting has changed.
117 void onMediaControlsEnabledChange() { 111 void onMediaControlsEnabledChange() override {
118 // There is no update because only the overlay is expected to change. 112 // There is no update because only the overlay is expected to change.
119 refreshCastButtonVisibilityWithoutUpdate(); 113 refreshCastButtonVisibilityWithoutUpdate();
120 } 114 }
115 // Methods called by MediaControlsMediaEventListener.
116 void onVolumeChange() override;
117 void onFocusIn() override;
118 void onTimeUpdate() override;
119 void onDurationChange() override;
120 void onPlay() override;
121 void onPause() override;
122 void onTextTracksAddedOrRemoved() override;
123 void onTextTracksChanged() override;
124 void onError() override;
125 void onLoadedMetadata() override;
126 void onEnteredFullscreen() override;
127 void onExitedFullscreen() override;
128 Document& ownerDocument() { return document(); }
121 129
122 DECLARE_VIRTUAL_TRACE(); 130 DECLARE_VIRTUAL_TRACE();
123 131
124 private: 132 private:
125 friend class MediaControlsMediaEventListener; 133 friend class MediaControlsMediaEventListener;
126 friend class MediaControlsOrientationLockDelegateTest; 134 friend class MediaControlsOrientationLockDelegateTest;
127 friend class MediaControlsTest; 135 friend class MediaControlsImplTest;
128
129 void invalidate(Element*);
130 136
131 // Need to be members of MediaControls for private member access. 137 // Need to be members of MediaControls for private member access.
132 class BatchedControlUpdate; 138 class BatchedControlUpdate;
133 class MediaControlsResizeObserverCallback; 139 class MediaControlsResizeObserverCallback;
134 140
141 static MediaControlsImpl* create(HTMLMediaElement&, ShadowRoot&);
142
143 void invalidate(Element*);
144
135 // Notify us that our controls enclosure has changed size. 145 // Notify us that our controls enclosure has changed size.
136 void notifyElementSizeChanged(ClientRect* newSize); 146 void notifyElementSizeChanged(ClientRect* newSize);
137 147
138 explicit MediaControls(HTMLMediaElement&); 148 explicit MediaControlsImpl(HTMLMediaElement&);
139 149
140 void initializeControls(); 150 void initializeControls();
141 151
142 void makeOpaque(); 152 void makeOpaque();
143 void makeTransparent(); 153 void makeTransparent();
154 bool isVisible() const;
144 155
145 void updatePlayState(); 156 void updatePlayState();
146 157
147 enum HideBehaviorFlags { 158 enum HideBehaviorFlags {
148 IgnoreNone = 0, 159 IgnoreNone = 0,
149 IgnoreVideoHover = 1 << 0, 160 IgnoreVideoHover = 1 << 0,
150 IgnoreFocus = 1 << 1, 161 IgnoreFocus = 1 << 1,
151 IgnoreControlsHover = 1 << 2, 162 IgnoreControlsHover = 1 << 2,
152 IgnoreWaitForTimer = 1 << 3, 163 IgnoreWaitForTimer = 1 << 3,
153 }; 164 };
(...skipping 12 matching lines...) Expand all
166 // do fit. This requires that m_effectiveWidth and m_effectiveHeight are 177 // do fit. This requires that m_effectiveWidth and m_effectiveHeight are
167 // current. 178 // current.
168 void computeWhichControlsFit(); 179 void computeWhichControlsFit();
169 180
170 // Node 181 // Node
171 bool isMediaControls() const override { return true; } 182 bool isMediaControls() const override { return true; }
172 bool willRespondToMouseMoveEvents() override { return true; } 183 bool willRespondToMouseMoveEvents() override { return true; }
173 void defaultEventHandler(Event*) override; 184 void defaultEventHandler(Event*) override;
174 bool containsRelatedTarget(Event*); 185 bool containsRelatedTarget(Event*);
175 186
176 // Methods called by MediaControlsMediaEventListener.
177 void onVolumeChange();
178 void onFocusIn();
179 void onTimeUpdate();
180 void onDurationChange();
181 void onPlay();
182 void onPause();
183 void onTextTracksAddedOrRemoved();
184 void onTextTracksChanged();
185 void onError();
186 void onLoadedMetadata();
187 void onEnteredFullscreen();
188 void onExitedFullscreen();
189
190 // Internal cast related methods. 187 // Internal cast related methods.
191 void startedCasting(); 188 void startedCasting();
192 void stoppedCasting(); 189 void stoppedCasting();
193 void refreshCastButtonVisibility(); 190 void refreshCastButtonVisibility();
194 191 void refreshCastButtonVisibilityWithoutUpdate();
195 Member<HTMLMediaElement> m_mediaElement;
196 192
197 // Media control elements. 193 // Media control elements.
198 Member<MediaControlOverlayEnclosureElement> m_overlayEnclosure; 194 Member<MediaControlOverlayEnclosureElement> m_overlayEnclosure;
199 Member<MediaControlOverlayPlayButtonElement> m_overlayPlayButton; 195 Member<MediaControlOverlayPlayButtonElement> m_overlayPlayButton;
200 Member<MediaControlCastButtonElement> m_overlayCastButton; 196 Member<MediaControlCastButtonElement> m_overlayCastButton;
201 Member<MediaControlPanelEnclosureElement> m_enclosure; 197 Member<MediaControlPanelEnclosureElement> m_enclosure;
202 Member<MediaControlPanelElement> m_panel; 198 Member<MediaControlPanelElement> m_panel;
203 Member<MediaControlPlayButtonElement> m_playButton; 199 Member<MediaControlPlayButtonElement> m_playButton;
204 Member<MediaControlTimelineElement> m_timeline; 200 Member<MediaControlTimelineElement> m_timeline;
205 Member<MediaControlCurrentTimeDisplayElement> m_currentTimeDisplay; 201 Member<MediaControlCurrentTimeDisplayElement> m_currentTimeDisplay;
206 Member<MediaControlTimeRemainingDisplayElement> m_durationDisplay; 202 Member<MediaControlTimeRemainingDisplayElement> m_durationDisplay;
207 Member<MediaControlMuteButtonElement> m_muteButton; 203 Member<MediaControlMuteButtonElement> m_muteButton;
208 Member<MediaControlVolumeSliderElement> m_volumeSlider; 204 Member<MediaControlVolumeSliderElement> m_volumeSlider;
209 Member<MediaControlToggleClosedCaptionsButtonElement> 205 Member<MediaControlToggleClosedCaptionsButtonElement>
210 m_toggleClosedCaptionsButton; 206 m_toggleClosedCaptionsButton;
211 Member<MediaControlTextTrackListElement> m_textTrackList; 207 Member<MediaControlTextTrackListElement> m_textTrackList;
212 Member<MediaControlOverflowMenuButtonElement> m_overflowMenu; 208 Member<MediaControlOverflowMenuButtonElement> m_overflowMenu;
213 Member<MediaControlOverflowMenuListElement> m_overflowList; 209 Member<MediaControlOverflowMenuListElement> m_overflowList;
214 210
215 Member<MediaControlCastButtonElement> m_castButton; 211 Member<MediaControlCastButtonElement> m_castButton;
216 Member<MediaControlFullscreenButtonElement> m_fullscreenButton; 212 Member<MediaControlFullscreenButtonElement> m_fullscreenButton;
217 Member<MediaControlDownloadButtonElement> m_downloadButton; 213 Member<MediaControlDownloadButtonElement> m_downloadButton;
218 214
219 Member<MediaControlsMediaEventListener> m_mediaEventListener; 215 Member<MediaControlsMediaEventListener> m_mediaEventListener;
220 Member<MediaControlsWindowEventListener> m_windowEventListener; 216 Member<MediaControlsWindowEventListener> m_windowEventListener;
221 Member<MediaControlsOrientationLockDelegate> m_orientationLockDelegate; 217 Member<MediaControlsOrientationLockDelegate> m_orientationLockDelegate;
222 218
223 TaskRunnerTimer<MediaControls> m_hideMediaControlsTimer; 219 TaskRunnerTimer<MediaControlsImpl> m_hideMediaControlsTimer;
224 unsigned m_hideTimerBehaviorFlags; 220 unsigned m_hideTimerBehaviorFlags;
225 bool m_isMouseOverControls : 1; 221 bool m_isMouseOverControls : 1;
226 bool m_isPausedForScrubbing : 1; 222 bool m_isPausedForScrubbing : 1;
227 223
228 // Watches the video element for resize and updates media controls as 224 // Watches the video element for resize and updates media controls as
229 // necessary. 225 // necessary.
230 Member<ResizeObserver> m_resizeObserver; 226 Member<ResizeObserver> m_resizeObserver;
231 227
232 TaskRunnerTimer<MediaControls> m_elementSizeChangedTimer; 228 TaskRunnerTimer<MediaControlsImpl> m_elementSizeChangedTimer;
233 IntSize m_size; 229 IntSize m_size;
234 230
235 bool m_keepShowingUntilTimerFires : 1; 231 bool m_keepShowingUntilTimerFires : 1;
236 }; 232 };
237 233
238 DEFINE_ELEMENT_TYPE_CASTS(MediaControls, isMediaControls()); 234 DEFINE_ELEMENT_TYPE_CASTS(MediaControlsImpl, isMediaControls());
239 235
240 } // namespace blink 236 } // namespace blink
241 237
242 #endif 238 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698