| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. | |
| 3 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | |
| 4 * | |
| 5 * Redistribution and use in source and binary forms, with or without | |
| 6 * modification, are permitted provided that the following conditions | |
| 7 * are met: | |
| 8 * 1. Redistributions of source code must retain the above copyright | |
| 9 * notice, this list of conditions and the following disclaimer. | |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | |
| 11 * notice, this list of conditions and the following disclaimer in the | |
| 12 * documentation and/or other materials provided with the distribution. | |
| 13 * | |
| 14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | |
| 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | |
| 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
| 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 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. | |
| 25 */ | |
| 26 | |
| 27 #ifndef MediaControls_h | |
| 28 #define MediaControls_h | |
| 29 | |
| 30 #include "core/html/HTMLDivElement.h" | |
| 31 #include "core/html/shadow/MediaControlElements.h" | |
| 32 | |
| 33 namespace blink { | |
| 34 | |
| 35 class Event; | |
| 36 class MediaControlsMediaEventListener; | |
| 37 class MediaControlsOrientationLockDelegate; | |
| 38 class MediaControlsWindowEventListener; | |
| 39 class ShadowRoot; | |
| 40 | |
| 41 class CORE_EXPORT MediaControls final : public HTMLDivElement { | |
| 42 public: | |
| 43 static MediaControls* create(HTMLMediaElement&, ShadowRoot&); | |
| 44 | |
| 45 HTMLMediaElement& mediaElement() const { return *m_mediaElement; } | |
| 46 | |
| 47 // Node override. | |
| 48 Node::InsertionNotificationRequest insertedInto(ContainerNode*) override; | |
| 49 void removedFrom(ContainerNode*) override; | |
| 50 | |
| 51 void reset(); | |
| 52 void onControlsListUpdated(); | |
| 53 | |
| 54 void show(); | |
| 55 void hide(); | |
| 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 | |
| 99 // HTMLTrackElement failed to load because there is no web exposed way to | |
| 100 // be notified on the TextTrack object. See https://crbug.com/669977 | |
| 101 void onTrackElementFailedToLoad() { onTextTracksAddedOrRemoved(); } | |
| 102 | |
| 103 // TODO(mlamouri): the following methods will be able to become private when | |
| 104 // the controls have moved to modules/ and have access to RemotePlayback. | |
| 105 void onRemotePlaybackAvailabilityChanged() { refreshCastButtonVisibility(); } | |
| 106 void onRemotePlaybackConnecting() { startedCasting(); } | |
| 107 void onRemotePlaybackDisconnected() { stoppedCasting(); } | |
| 108 | |
| 109 // TODO(mlamouri): this method is needed in order to notify the controls that | |
| 110 // the attribute have changed. | |
| 111 void onDisableRemotePlaybackAttributeChanged() { | |
| 112 refreshCastButtonVisibility(); | |
| 113 } | |
| 114 | |
| 115 // TODO(mlamouri): this method is needed in order to notify the controls that | |
| 116 // the `mediaControlsEnabled` setting has changed. | |
| 117 void onMediaControlsEnabledChange() { | |
| 118 // There is no update because only the overlay is expected to change. | |
| 119 refreshCastButtonVisibilityWithoutUpdate(); | |
| 120 } | |
| 121 | |
| 122 DECLARE_VIRTUAL_TRACE(); | |
| 123 | |
| 124 private: | |
| 125 friend class MediaControlsMediaEventListener; | |
| 126 friend class MediaControlsOrientationLockDelegateTest; | |
| 127 friend class MediaControlsTest; | |
| 128 | |
| 129 void invalidate(Element*); | |
| 130 | |
| 131 // Need to be members of MediaControls for private member access. | |
| 132 class BatchedControlUpdate; | |
| 133 class MediaControlsResizeObserverCallback; | |
| 134 | |
| 135 // Notify us that our controls enclosure has changed size. | |
| 136 void notifyElementSizeChanged(ClientRect* newSize); | |
| 137 | |
| 138 explicit MediaControls(HTMLMediaElement&); | |
| 139 | |
| 140 void initializeControls(); | |
| 141 | |
| 142 void makeOpaque(); | |
| 143 void makeTransparent(); | |
| 144 | |
| 145 void updatePlayState(); | |
| 146 | |
| 147 enum HideBehaviorFlags { | |
| 148 IgnoreNone = 0, | |
| 149 IgnoreVideoHover = 1 << 0, | |
| 150 IgnoreFocus = 1 << 1, | |
| 151 IgnoreControlsHover = 1 << 2, | |
| 152 IgnoreWaitForTimer = 1 << 3, | |
| 153 }; | |
| 154 | |
| 155 bool shouldHideMediaControls(unsigned behaviorFlags = 0) const; | |
| 156 void hideMediaControlsTimerFired(TimerBase*); | |
| 157 void startHideMediaControlsTimer(); | |
| 158 void stopHideMediaControlsTimer(); | |
| 159 void resetHideMediaControlsTimer(); | |
| 160 | |
| 161 void elementSizeChangedTimerFired(TimerBase*); | |
| 162 | |
| 163 void hideAllMenus(); | |
| 164 | |
| 165 // Hide elements that don't fit, and show those things that we want which | |
| 166 // do fit. This requires that m_effectiveWidth and m_effectiveHeight are | |
| 167 // current. | |
| 168 void computeWhichControlsFit(); | |
| 169 | |
| 170 // Node | |
| 171 bool isMediaControls() const override { return true; } | |
| 172 bool willRespondToMouseMoveEvents() override { return true; } | |
| 173 void defaultEventHandler(Event*) override; | |
| 174 bool containsRelatedTarget(Event*); | |
| 175 | |
| 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. | |
| 191 void startedCasting(); | |
| 192 void stoppedCasting(); | |
| 193 void refreshCastButtonVisibility(); | |
| 194 | |
| 195 Member<HTMLMediaElement> m_mediaElement; | |
| 196 | |
| 197 // Media control elements. | |
| 198 Member<MediaControlOverlayEnclosureElement> m_overlayEnclosure; | |
| 199 Member<MediaControlOverlayPlayButtonElement> m_overlayPlayButton; | |
| 200 Member<MediaControlCastButtonElement> m_overlayCastButton; | |
| 201 Member<MediaControlPanelEnclosureElement> m_enclosure; | |
| 202 Member<MediaControlPanelElement> m_panel; | |
| 203 Member<MediaControlPlayButtonElement> m_playButton; | |
| 204 Member<MediaControlTimelineElement> m_timeline; | |
| 205 Member<MediaControlCurrentTimeDisplayElement> m_currentTimeDisplay; | |
| 206 Member<MediaControlTimeRemainingDisplayElement> m_durationDisplay; | |
| 207 Member<MediaControlMuteButtonElement> m_muteButton; | |
| 208 Member<MediaControlVolumeSliderElement> m_volumeSlider; | |
| 209 Member<MediaControlToggleClosedCaptionsButtonElement> | |
| 210 m_toggleClosedCaptionsButton; | |
| 211 Member<MediaControlTextTrackListElement> m_textTrackList; | |
| 212 Member<MediaControlOverflowMenuButtonElement> m_overflowMenu; | |
| 213 Member<MediaControlOverflowMenuListElement> m_overflowList; | |
| 214 | |
| 215 Member<MediaControlCastButtonElement> m_castButton; | |
| 216 Member<MediaControlFullscreenButtonElement> m_fullscreenButton; | |
| 217 Member<MediaControlDownloadButtonElement> m_downloadButton; | |
| 218 | |
| 219 Member<MediaControlsMediaEventListener> m_mediaEventListener; | |
| 220 Member<MediaControlsWindowEventListener> m_windowEventListener; | |
| 221 Member<MediaControlsOrientationLockDelegate> m_orientationLockDelegate; | |
| 222 | |
| 223 TaskRunnerTimer<MediaControls> m_hideMediaControlsTimer; | |
| 224 unsigned m_hideTimerBehaviorFlags; | |
| 225 bool m_isMouseOverControls : 1; | |
| 226 bool m_isPausedForScrubbing : 1; | |
| 227 | |
| 228 // Watches the video element for resize and updates media controls as | |
| 229 // necessary. | |
| 230 Member<ResizeObserver> m_resizeObserver; | |
| 231 | |
| 232 TaskRunnerTimer<MediaControls> m_elementSizeChangedTimer; | |
| 233 IntSize m_size; | |
| 234 | |
| 235 bool m_keepShowingUntilTimerFires : 1; | |
| 236 }; | |
| 237 | |
| 238 DEFINE_ELEMENT_TYPE_CASTS(MediaControls, isMediaControls()); | |
| 239 | |
| 240 } // namespace blink | |
| 241 | |
| 242 #endif | |
| OLD | NEW |