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

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

Issue 1179223002: Implement autoplay gesture override experiment. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Refactored into AutoplayExperimentHelper. Created 5 years, 4 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) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 // when used with parameters, e.g. "application/octet-stream;codecs=theora", is a type that the user agent knows 244 // when used with parameters, e.g. "application/octet-stream;codecs=theora", is a type that the user agent knows
245 // it cannot render. 245 // it cannot render.
246 if (contentMIMEType != "application/octet-stream" || contentTypeCodecs.isEmp ty()) { 246 if (contentMIMEType != "application/octet-stream" || contentTypeCodecs.isEmp ty()) {
247 WebMimeRegistry::SupportsType supported = Platform::current()->mimeRegis try()->supportsMediaMIMEType(contentMIMEType, contentTypeCodecs, keySystem.lower ()); 247 WebMimeRegistry::SupportsType supported = Platform::current()->mimeRegis try()->supportsMediaMIMEType(contentMIMEType, contentTypeCodecs, keySystem.lower ());
248 return supported > WebMimeRegistry::IsNotSupported; 248 return supported > WebMimeRegistry::IsNotSupported;
249 } 249 }
250 250
251 return false; 251 return false;
252 } 252 }
253 253
254 // These values are used for a histogram. Do not reorder. 254 void HTMLMediaElement::recordAutoplayMetric(AutoplayMetrics metric)
255 enum AutoplayMetrics {
256 // Media element with autoplay seen.
257 AutoplayMediaFound = 0,
258 // Autoplay enabled and user stopped media play at any point.
259 AutoplayStopped = 1,
260 // Autoplay enabled but user bailed out on media play early.
261 AutoplayBailout = 2,
262 // Autoplay disabled but user manually started media.
263 AutoplayManualStart = 3,
264 // Autoplay was (re)enabled through a user-gesture triggered load()
265 AutoplayEnabledThroughLoad = 4,
266 // Autoplay disabled by sandbox flags.
267 AutoplayDisabledBySandbox = 5,
268 // This enum value must be last.
269 NumberOfAutoplayMetrics,
270 };
271
272 static void recordAutoplayMetric(AutoplayMetrics metric)
273 { 255 {
274 Platform::current()->histogramEnumeration("Blink.MediaElement.Autoplay", met ric, NumberOfAutoplayMetrics); 256 Platform::current()->histogramEnumeration("Blink.MediaElement.Autoplay", met ric, NumberOfAutoplayMetrics);
275 } 257 }
276 258
277 WebMimeRegistry::SupportsType HTMLMediaElement::supportsType(const ContentType& contentType, const String& keySystem) 259 WebMimeRegistry::SupportsType HTMLMediaElement::supportsType(const ContentType& contentType, const String& keySystem)
278 { 260 {
279 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); 261 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs"));
280 262
281 if (!RuntimeEnabledFeatures::mediaEnabled()) 263 if (!RuntimeEnabledFeatures::mediaEnabled())
282 return WebMimeRegistry::IsNotSupported; 264 return WebMimeRegistry::IsNotSupported;
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 , m_playingRemotely(false) 342 , m_playingRemotely(false)
361 , m_isFinalizing(false) 343 , m_isFinalizing(false)
362 , m_initialPlayWithoutUserGestures(false) 344 , m_initialPlayWithoutUserGestures(false)
363 , m_autoplayMediaCounted(false) 345 , m_autoplayMediaCounted(false)
364 , m_audioTracks(AudioTrackList::create(*this)) 346 , m_audioTracks(AudioTrackList::create(*this))
365 , m_videoTracks(VideoTrackList::create(*this)) 347 , m_videoTracks(VideoTrackList::create(*this))
366 , m_textTracks(nullptr) 348 , m_textTracks(nullptr)
367 #if ENABLE(WEB_AUDIO) 349 #if ENABLE(WEB_AUDIO)
368 , m_audioSourceNode(nullptr) 350 , m_audioSourceNode(nullptr)
369 #endif 351 #endif
352 , m_autoplayHelper(*this)
370 { 353 {
371 #if ENABLE(OILPAN) 354 #if ENABLE(OILPAN)
372 ThreadState::current()->registerPreFinalizer(this); 355 ThreadState::current()->registerPreFinalizer(this);
373 #endif 356 #endif
374 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); 357 ASSERT(RuntimeEnabledFeatures::mediaEnabled());
375 358
376 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); 359 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this);
377 360
378 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture()) 361 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture())
379 m_userGestureRequiredForPlay = true; 362 m_userGestureRequiredForPlay = true;
380 363
381 setHasCustomStyleCallbacks(); 364 setHasCustomStyleCallbacks();
382 addElementToDocumentMap(this, &document); 365 addElementToDocumentMap(this, &document);
383 } 366 }
384 367
385 HTMLMediaElement::~HTMLMediaElement() 368 HTMLMediaElement::~HTMLMediaElement()
386 { 369 {
387 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement(%p)", this); 370 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement(%p)", this);
371
388 #if !ENABLE(OILPAN) 372 #if !ENABLE(OILPAN)
389 // HTMLMediaElement and m_asyncEventQueue always become unreachable 373 // HTMLMediaElement and m_asyncEventQueue always become unreachable
390 // together. So HTMLMediaElement and m_asyncEventQueue are destructed in 374 // together. So HTMLMediaElement and m_asyncEventQueue are destructed in
391 // the same GC. We don't need to close it explicitly in Oilpan. 375 // the same GC. We don't need to close it explicitly in Oilpan.
392 m_asyncEventQueue->close(); 376 m_asyncEventQueue->close();
393 377
394 setShouldDelayLoadEvent(false); 378 setShouldDelayLoadEvent(false);
395 379
396 if (m_textTracks) 380 if (m_textTracks)
397 m_textTracks->clearOwner(); 381 m_textTracks->clearOwner();
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 case WebMimeRegistry::IsSupported: 671 case WebMimeRegistry::IsSupported:
688 canPlay = "probably"; 672 canPlay = "probably";
689 break; 673 break;
690 } 674 }
691 675
692 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%p, %s, %s) -> %s", this, mime Type.utf8().data(), keySystem.utf8().data(), canPlay.utf8().data()); 676 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%p, %s, %s) -> %s", this, mime Type.utf8().data(), keySystem.utf8().data(), canPlay.utf8().data());
693 677
694 return canPlay; 678 return canPlay;
695 } 679 }
696 680
681 void HTMLMediaElement::recordMetricsIfStopping()
philipj_slow 2015/08/13 11:12:48 Since this AutoplayExperimentHelper is a friend cl
liberato (no reviews please) 2015/09/01 06:54:20 they could, but they were part of the old autoplay
682 {
683 // If not playing, then nothing to record.
684 if (!m_playing)
685 return;
686
687 const bool bailout = isBailout();
688
689 // Record that play was stopped. We don't care if it was autoplay,
690 // play(), or the user manually started it.
691 recordAutoplayMetric(AnyPlaybackStopped);
692 if (bailout)
693 recordAutoplayMetric(AnyPlaybackBailout);
694
695 // If this was a gestureless play, then record that separately.
696 // These cover attr and play() gestureless starts.
697 if (m_initialPlayWithoutUserGestures) {
698 m_initialPlayWithoutUserGestures = false;
699
700 recordAutoplayMetric(AutoplayStopped);
701
702 if (bailout)
703 recordAutoplayMetric(AutoplayBailout);
704 }
705 }
706
697 void HTMLMediaElement::load() 707 void HTMLMediaElement::load()
698 { 708 {
699 WTF_LOG(Media, "HTMLMediaElement::load(%p)", this); 709 WTF_LOG(Media, "HTMLMediaElement::load(%p)", this);
700 710
701 if (m_initialPlayWithoutUserGestures && m_playing) 711 recordMetricsIfStopping();
702 gesturelessInitialPlayHalted();
703 712
704 if (UserGestureIndicator::processingUserGesture() && m_userGestureRequiredFo rPlay) { 713 if (UserGestureIndicator::processingUserGesture() && m_userGestureRequiredFo rPlay) {
705 recordAutoplayMetric(AutoplayEnabledThroughLoad); 714 recordAutoplayMetric(AutoplayEnabledThroughLoad);
706 m_userGestureRequiredForPlay = false; 715 m_userGestureRequiredForPlay = false;
707 // While usergesture-initiated load()s technically count as autoplayed, 716 // While usergesture-initiated load()s technically count as autoplayed,
708 // they don't feel like such to the users and hence we don't want to 717 // they don't feel like such to the users and hence we don't want to
709 // count them for the purposes of metrics. 718 // count them for the purposes of metrics.
710 m_autoplayMediaCounted = true; 719 m_autoplayMediaCounted = true;
711 } 720 }
712 721
(...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 scheduleEvent(EventTypeNames::canplay); 1557 scheduleEvent(EventTypeNames::canplay);
1549 if (isPotentiallyPlaying) 1558 if (isPotentiallyPlaying)
1550 scheduleEvent(EventTypeNames::playing); 1559 scheduleEvent(EventTypeNames::playing);
1551 } 1560 }
1552 1561
1553 if (m_autoplaying && m_paused && autoplay()) { 1562 if (m_autoplaying && m_paused && autoplay()) {
1554 autoplayMediaEncountered(); 1563 autoplayMediaEncountered();
1555 1564
1556 if (document().isSandboxed(SandboxAutomaticFeatures)) { 1565 if (document().isSandboxed(SandboxAutomaticFeatures)) {
1557 recordAutoplayMetric(AutoplayDisabledBySandbox); 1566 recordAutoplayMetric(AutoplayDisabledBySandbox);
1558 } else if (!m_userGestureRequiredForPlay) { 1567 } else {
1559 m_paused = false; 1568 // If the autoplay experiment says that it's okay to play now,
1560 invalidateCachedTime(); 1569 // then don't require a user gesture.
1561 scheduleEvent(EventTypeNames::play); 1570 m_autoplayHelper.onReadyToPlay();
1562 scheduleEvent(EventTypeNames::playing); 1571
1572 if (!m_userGestureRequiredForPlay) {
1573 m_paused = false;
1574 invalidateCachedTime();
1575 scheduleEvent(EventTypeNames::play);
1576 scheduleEvent(EventTypeNames::playing);
1577 }
1563 } 1578 }
1564 } 1579 }
1565 1580
1566 scheduleEvent(EventTypeNames::canplaythrough); 1581 scheduleEvent(EventTypeNames::canplaythrough);
1567 1582
1568 shouldUpdateDisplayState = true; 1583 shouldUpdateDisplayState = true;
1569 } 1584 }
1570 1585
1571 if (shouldUpdateDisplayState) { 1586 if (shouldUpdateDisplayState) {
1572 updateDisplayState(); 1587 updateDisplayState();
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 1968
1954 WebMediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const 1969 WebMediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const
1955 { 1970 {
1956 return autoplay() ? WebMediaPlayer::PreloadAuto : preloadType(); 1971 return autoplay() ? WebMediaPlayer::PreloadAuto : preloadType();
1957 } 1972 }
1958 1973
1959 void HTMLMediaElement::play() 1974 void HTMLMediaElement::play()
1960 { 1975 {
1961 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this); 1976 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this);
1962 1977
1978 m_autoplayHelper.onPlayMethodCalled();
1979
1963 if (!UserGestureIndicator::processingUserGesture()) { 1980 if (!UserGestureIndicator::processingUserGesture()) {
1964 autoplayMediaEncountered(); 1981 autoplayMediaEncountered();
1982
1965 if (m_userGestureRequiredForPlay) { 1983 if (m_userGestureRequiredForPlay) {
1984 recordAutoplayMetric(PlayMethodFailed);
philipj_slow 2015/08/13 11:12:48 If recordAutoplayMetric is also moved to the helpe
liberato (no reviews please) 2015/09/01 06:54:20 Acknowledged.
1966 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture."); 1985 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture.");
1967 document().executionContext()->addConsoleMessage(ConsoleMessage::cre ate(JSMessageSource, WarningMessageLevel, message)); 1986 document().executionContext()->addConsoleMessage(ConsoleMessage::cre ate(JSMessageSource, WarningMessageLevel, message));
1968 return; 1987 return;
1969 } 1988 }
1970 } else if (m_userGestureRequiredForPlay) { 1989 } else if (m_userGestureRequiredForPlay) {
1971 if (m_autoplayMediaCounted) 1990 if (m_autoplayMediaCounted)
1972 recordAutoplayMetric(AutoplayManualStart); 1991 recordAutoplayMetric(AutoplayManualStart);
1973 m_userGestureRequiredForPlay = false; 1992 m_userGestureRequiredForPlay = false;
1974 } 1993 }
1975 1994
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2013 { 2032 {
2014 if (!m_autoplayMediaCounted) { 2033 if (!m_autoplayMediaCounted) {
2015 m_autoplayMediaCounted = true; 2034 m_autoplayMediaCounted = true;
2016 recordAutoplayMetric(AutoplayMediaFound); 2035 recordAutoplayMetric(AutoplayMediaFound);
2017 2036
2018 if (!m_userGestureRequiredForPlay) 2037 if (!m_userGestureRequiredForPlay)
2019 m_initialPlayWithoutUserGestures = true; 2038 m_initialPlayWithoutUserGestures = true;
2020 } 2039 }
2021 } 2040 }
2022 2041
2023 void HTMLMediaElement::gesturelessInitialPlayHalted() 2042 bool HTMLMediaElement::isBailout() const
2024 { 2043 {
2025 ASSERT(m_initialPlayWithoutUserGestures);
2026 m_initialPlayWithoutUserGestures = false;
2027
2028 recordAutoplayMetric(AutoplayStopped);
2029
2030 // We count the user as having bailed-out on the video if they watched 2044 // We count the user as having bailed-out on the video if they watched
2031 // less than one minute and less than 50% of it. 2045 // less than one minute and less than 50% of it.
2032 double playedTime = currentTime(); 2046 const double playedTime = currentTime();
2033 if (playedTime < 60) { 2047 const double progress = playedTime / duration();
2034 double progress = playedTime / duration(); 2048 return (playedTime < 60) && (progress < 0.5);
2035 if (progress < 0.5)
2036 recordAutoplayMetric(AutoplayBailout);
2037 }
2038 } 2049 }
2039 2050
2040 void HTMLMediaElement::pause() 2051 void HTMLMediaElement::pause()
2041 { 2052 {
2042 WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this); 2053 WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this);
2043 2054
2044 if (m_networkState == NETWORK_EMPTY) 2055 if (m_networkState == NETWORK_EMPTY)
2045 scheduleDelayedAction(LoadMediaResource); 2056 scheduleDelayedAction(LoadMediaResource);
2046 2057
2058 m_autoplayHelper.onPauseMethodCalled();
2059
2047 m_autoplaying = false; 2060 m_autoplaying = false;
2048 2061
2049 if (!m_paused) { 2062 if (!m_paused) {
2050 if (m_initialPlayWithoutUserGestures) 2063 recordMetricsIfStopping();
2051 gesturelessInitialPlayHalted();
2052 2064
2053 m_paused = true; 2065 m_paused = true;
2054 scheduleTimeupdateEvent(false); 2066 scheduleTimeupdateEvent(false);
2055 scheduleEvent(EventTypeNames::pause); 2067 scheduleEvent(EventTypeNames::pause);
2056 } 2068 }
2057 2069
2058 updatePlayState(); 2070 updatePlayState();
2059 } 2071 }
2060 2072
2061 void HTMLMediaElement::requestRemotePlayback() 2073 void HTMLMediaElement::requestRemotePlayback()
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2134 2146
2135 void HTMLMediaElement::setMuted(bool muted) 2147 void HTMLMediaElement::setMuted(bool muted)
2136 { 2148 {
2137 WTF_LOG(Media, "HTMLMediaElement::setMuted(%p, %s)", this, boolString(muted) ); 2149 WTF_LOG(Media, "HTMLMediaElement::setMuted(%p, %s)", this, boolString(muted) );
2138 2150
2139 if (m_muted == muted) 2151 if (m_muted == muted)
2140 return; 2152 return;
2141 2153
2142 m_muted = muted; 2154 m_muted = muted;
2143 2155
2156 m_autoplayHelper.onMuteChanged();
philipj_slow 2015/08/13 11:12:48 s/Mute/Muted/
liberato (no reviews please) 2015/09/01 06:54:20 Done.
2157
2144 updateVolume(); 2158 updateVolume();
2145 2159
2146 scheduleEvent(EventTypeNames::volumechange); 2160 scheduleEvent(EventTypeNames::volumechange);
2147 } 2161 }
2148 2162
2149 void HTMLMediaElement::updateVolume() 2163 void HTMLMediaElement::updateVolume()
2150 { 2164 {
2151 if (webMediaPlayer()) 2165 if (webMediaPlayer())
2152 webMediaPlayer()->setVolume(effectiveMediaVolume()); 2166 webMediaPlayer()->setVolume(effectiveMediaVolume());
2153 2167
(...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after
2765 if (!m_mediaController && !m_paused) { 2779 if (!m_mediaController && !m_paused) {
2766 // changes paused to true and fires a simple event named pause a t the media element. 2780 // changes paused to true and fires a simple event named pause a t the media element.
2767 m_paused = true; 2781 m_paused = true;
2768 scheduleEvent(EventTypeNames::pause); 2782 scheduleEvent(EventTypeNames::pause);
2769 } 2783 }
2770 // Queue a task to fire a simple event named ended at the media elem ent. 2784 // Queue a task to fire a simple event named ended at the media elem ent.
2771 if (!m_sentEndEvent) { 2785 if (!m_sentEndEvent) {
2772 m_sentEndEvent = true; 2786 m_sentEndEvent = true;
2773 scheduleEvent(EventTypeNames::ended); 2787 scheduleEvent(EventTypeNames::ended);
2774 } 2788 }
2789 recordMetricsIfStopping();
2775 // If the media element has a current media controller, then report the controller state 2790 // If the media element has a current media controller, then report the controller state
2776 // for the media element's current media controller. 2791 // for the media element's current media controller.
2777 updateMediaController(); 2792 updateMediaController();
2778 } 2793 }
2779 } else { 2794 } else {
2780 m_sentEndEvent = false; 2795 m_sentEndEvent = false;
2781 } 2796 }
2782 2797
2783 updatePlayState(); 2798 updatePlayState();
2784 } 2799 }
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2985 // The media engine should just stash the rate and muted values sinc e it isn't already playing. 3000 // The media engine should just stash the rate and muted values sinc e it isn't already playing.
2986 webMediaPlayer()->setRate(effectivePlaybackRate()); 3001 webMediaPlayer()->setRate(effectivePlaybackRate());
2987 updateVolume(); 3002 updateVolume();
2988 webMediaPlayer()->play(); 3003 webMediaPlayer()->play();
2989 } 3004 }
2990 3005
2991 if (mediaControls()) 3006 if (mediaControls())
2992 mediaControls()->playbackStarted(); 3007 mediaControls()->playbackStarted();
2993 startPlaybackProgressTimer(); 3008 startPlaybackProgressTimer();
2994 m_playing = true; 3009 m_playing = true;
3010 recordAutoplayMetric(AnyPlaybackStarted);
2995 3011
2996 } else { // Should not be playing right now 3012 } else { // Should not be playing right now
2997 if (isPlaying) 3013 if (isPlaying)
2998 webMediaPlayer()->pause(); 3014 webMediaPlayer()->pause();
2999 refreshCachedTime(); 3015 refreshCachedTime();
3000 3016
3001 m_playbackProgressTimer.stop(); 3017 m_playbackProgressTimer.stop();
3002 m_playing = false; 3018 m_playing = false;
3003 double time = currentTime(); 3019 double time = currentTime();
3004 if (time > m_lastSeekTime) 3020 if (time > m_lastSeekTime)
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 mediaControls()->refreshCastButtonVisibility(); 3120 mediaControls()->refreshCastButtonVisibility();
3105 3121
3106 if (layoutObject()) 3122 if (layoutObject())
3107 layoutObject()->setShouldDoFullPaintInvalidation(); 3123 layoutObject()->setShouldDoFullPaintInvalidation();
3108 } 3124 }
3109 3125
3110 void HTMLMediaElement::stop() 3126 void HTMLMediaElement::stop()
3111 { 3127 {
3112 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this); 3128 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this);
3113 3129
3114 if (m_playing && m_initialPlayWithoutUserGestures) 3130 recordMetricsIfStopping();
philipj_slow 2015/08/13 11:12:48 HTMLMediaElement::stop() is an ActiveDOMObject ove
philipj_slow 2015/09/02 09:31:47 Ping.
3115 gesturelessInitialPlayHalted();
3116 3131
3117 // Close the async event queue so that no events are enqueued by userCancell edLoad. 3132 // Close the async event queue so that no events are enqueued by userCancell edLoad.
3118 cancelPendingEventsAndCallbacks(); 3133 cancelPendingEventsAndCallbacks();
3119 m_asyncEventQueue->close(); 3134 m_asyncEventQueue->close();
3120 3135
3121 userCancelledLoad(); 3136 userCancelledLoad();
3122 3137
3123 // Stop the playback without generating events 3138 // Stop the playback without generating events
3124 m_playing = false; 3139 m_playing = false;
3125 m_paused = true; 3140 m_paused = true;
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
3714 3729
3715 // Enable the first audio track if an audio track hasn't been enabled yet. 3730 // Enable the first audio track if an audio track hasn't been enabled yet.
3716 if (audioTracks().length() > 0 && !audioTracks().hasEnabledTrack()) 3731 if (audioTracks().length() > 0 && !audioTracks().hasEnabledTrack())
3717 audioTracks().anonymousIndexedGetter(0)->setEnabled(true); 3732 audioTracks().anonymousIndexedGetter(0)->setEnabled(true);
3718 3733
3719 // Select the first video track if a video track hasn't been selected yet. 3734 // Select the first video track if a video track hasn't been selected yet.
3720 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1) 3735 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1)
3721 videoTracks().anonymousIndexedGetter(0)->setSelected(true); 3736 videoTracks().anonymousIndexedGetter(0)->setSelected(true);
3722 } 3737 }
3723 3738
3739 bool HTMLMediaElement::isUserGestureRequiredForPlay() const
3740 {
3741 return m_userGestureRequiredForPlay;
3742 }
3743
3744 void HTMLMediaElement::removeUserGestureRequirement()
3745 {
3746 m_userGestureRequiredForPlay = false;
3747 }
3748
3749 void HTMLMediaElement::setInitialPlayWithoutUserGestures(bool value)
3750 {
3751 m_initialPlayWithoutUserGestures = value;
philipj_slow 2015/08/13 11:12:48 You didn't add m_initialPlayWithoutUserGestures, b
liberato (no reviews please) 2015/09/01 06:54:20 Done.
3752 }
3753
3724 #if ENABLE(WEB_AUDIO) 3754 #if ENABLE(WEB_AUDIO)
3725 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 3755 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3726 { 3756 {
3727 if (!Heap::isHeapObjectAlive(m_audioSourceNode)) 3757 if (!Heap::isHeapObjectAlive(m_audioSourceNode))
3728 audioSourceProvider().setClient(nullptr); 3758 audioSourceProvider().setClient(nullptr);
3729 } 3759 }
3730 3760
3731 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro vider) 3761 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro vider)
3732 { 3762 {
3733 MutexLocker locker(provideInputLock); 3763 MutexLocker locker(provideInputLock);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
3783 visitor->trace(m_client); 3813 visitor->trace(m_client);
3784 } 3814 }
3785 3815
3786 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) 3816 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl)
3787 { 3817 {
3788 visitor->trace(m_client); 3818 visitor->trace(m_client);
3789 } 3819 }
3790 #endif 3820 #endif
3791 3821
3792 } 3822 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698