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

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

Issue 1576283003: Have HTMLMediaElement::play() return a Promise. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review comments Created 4 years, 9 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 11 matching lines...) Expand all
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */ 24 */
25 25
26 #include "core/html/HTMLMediaElement.h" 26 #include "core/html/HTMLMediaElement.h"
27 27
28 #include "bindings/core/v8/ExceptionState.h" 28 #include "bindings/core/v8/ExceptionState.h"
29 #include "bindings/core/v8/ExceptionStatePlaceholder.h" 29 #include "bindings/core/v8/ExceptionStatePlaceholder.h"
30 #include "bindings/core/v8/ScriptController.h" 30 #include "bindings/core/v8/ScriptController.h"
31 #include "bindings/core/v8/ScriptEventListener.h" 31 #include "bindings/core/v8/ScriptEventListener.h"
32 #include "bindings/core/v8/ScriptPromiseResolver.h"
32 #include "core/HTMLNames.h" 33 #include "core/HTMLNames.h"
33 #include "core/css/MediaList.h" 34 #include "core/css/MediaList.h"
34 #include "core/dom/Attribute.h" 35 #include "core/dom/Attribute.h"
35 #include "core/dom/ElementTraversal.h" 36 #include "core/dom/ElementTraversal.h"
36 #include "core/dom/ExceptionCode.h"
37 #include "core/dom/Fullscreen.h" 37 #include "core/dom/Fullscreen.h"
38 #include "core/dom/shadow/ShadowRoot.h" 38 #include "core/dom/shadow/ShadowRoot.h"
39 #include "core/events/Event.h" 39 #include "core/events/Event.h"
40 #include "core/frame/LocalFrame.h" 40 #include "core/frame/LocalFrame.h"
41 #include "core/frame/Settings.h" 41 #include "core/frame/Settings.h"
42 #include "core/frame/UseCounter.h" 42 #include "core/frame/UseCounter.h"
43 #include "core/frame/csp/ContentSecurityPolicy.h" 43 #include "core/frame/csp/ContentSecurityPolicy.h"
44 #include "core/html/HTMLMediaSource.h" 44 #include "core/html/HTMLMediaSource.h"
45 #include "core/html/HTMLSourceElement.h" 45 #include "core/html/HTMLSourceElement.h"
46 #include "core/html/HTMLTrackElement.h" 46 #include "core/html/HTMLTrackElement.h"
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 m_displayMode = Unknown; 726 m_displayMode = Unknown;
727 727
728 // 1 - Abort any already-running instance of the resource selection algorith m for this element. 728 // 1 - Abort any already-running instance of the resource selection algorith m for this element.
729 m_loadState = WaitingForSource; 729 m_loadState = WaitingForSource;
730 m_currentSourceNode = nullptr; 730 m_currentSourceNode = nullptr;
731 731
732 // 2 - If there are any tasks from the media element's media element event t ask source in 732 // 2 - If there are any tasks from the media element's media element event t ask source in
733 // one of the task queues, then remove those tasks. 733 // one of the task queues, then remove those tasks.
734 cancelPendingEventsAndCallbacks(); 734 cancelPendingEventsAndCallbacks();
735 735
736 rejectPlayPromises(AbortError, "The play() request was interrupted by a new load request.");
737
736 // 3 - If the media element's networkState is set to NETWORK_LOADING or NETW ORK_IDLE, queue 738 // 3 - If the media element's networkState is set to NETWORK_LOADING or NETW ORK_IDLE, queue
737 // a task to fire a simple event named abort at the media element. 739 // a task to fire a simple event named abort at the media element.
738 if (m_networkState == NETWORK_LOADING || m_networkState == NETWORK_IDLE) 740 if (m_networkState == NETWORK_LOADING || m_networkState == NETWORK_IDLE)
739 scheduleEvent(EventTypeNames::abort); 741 scheduleEvent(EventTypeNames::abort);
740 742
741 resetMediaPlayerAndMediaSource(); 743 resetMediaPlayerAndMediaSource();
742 744
743 // 4 - If the media element's networkState is not set to NETWORK_EMPTY, then run these substeps 745 // 4 - If the media element's networkState is not set to NETWORK_EMPTY, then run these substeps
744 if (m_networkState != NETWORK_EMPTY) { 746 if (m_networkState != NETWORK_EMPTY) {
745 // 4.1 - Queue a task to fire a simple event named emptied at the media element. 747 // 4.1 - Queue a task to fire a simple event named emptied at the media element.
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 } 1240 }
1239 1241
1240 void HTMLMediaElement::noneSupported() 1242 void HTMLMediaElement::noneSupported()
1241 { 1243 {
1242 WTF_LOG(Media, "HTMLMediaElement::noneSupported(%p)", this); 1244 WTF_LOG(Media, "HTMLMediaElement::noneSupported(%p)", this);
1243 1245
1244 stopPeriodicTimers(); 1246 stopPeriodicTimers();
1245 m_loadState = WaitingForSource; 1247 m_loadState = WaitingForSource;
1246 m_currentSourceNode = nullptr; 1248 m_currentSourceNode = nullptr;
1247 1249
1248 // 4.8.10.5 1250 // 4.8.13.5
1249 // 6 - Reaching this step indicates that the media resource failed to load o r that the given 1251 // The dedicated media source failure steps are the following steps:
1250 // URL could not be resolved. In one atomic operation, run the following ste ps:
1251 1252
1252 // 6.1 - Set the error attribute to a new MediaError object whose code attri bute is set to 1253 // 1 - Set the error attribute to a new MediaError object whose code attribu te is set to
1253 // MEDIA_ERR_SRC_NOT_SUPPORTED. 1254 // MEDIA_ERR_SRC_NOT_SUPPORTED.
1254 m_error = MediaError::create(MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED); 1255 m_error = MediaError::create(MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED);
1255 1256
1256 // 6.2 - Forget the media element's media-resource-specific text tracks. 1257 // 2 - Forget the media element's media-resource-specific text tracks.
1257 forgetResourceSpecificTracks(); 1258 forgetResourceSpecificTracks();
1258 1259
1259 // 6.3 - Set the element's networkState attribute to the NETWORK_NO_SOURCE v alue. 1260 // 3 - Set the element's networkState attribute to the NETWORK_NO_SOURCE val ue.
1260 setNetworkState(NETWORK_NO_SOURCE); 1261 setNetworkState(NETWORK_NO_SOURCE);
1261 1262
1262 // 7 - Queue a task to fire a simple event named error at the media element. 1263 // 4 - Set the element's show poster flag to true.
1264 updateDisplayState();
1265
1266 // 5 - Fire a simple event named error at the media element.
1263 scheduleEvent(EventTypeNames::error); 1267 scheduleEvent(EventTypeNames::error);
1264 1268
1269 // 6 - Reject pending play promises with NotSupportedError.
1270 scheduleRejectPlayPromises(NotSupportedError, "Failed to load because no sup ported source was found.");
1271
1265 closeMediaSource(); 1272 closeMediaSource();
1266 1273
1267 // 8 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event. 1274 // 7 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event.
1268 setShouldDelayLoadEvent(false); 1275 setShouldDelayLoadEvent(false);
1269 1276
1270 // 9 - Abort these steps. Until the load() method is invoked or the src attr ibute is changed,
1271 // the element won't attempt to load another resource.
1272
1273 updateDisplayState();
1274
1275 if (layoutObject()) 1277 if (layoutObject())
1276 layoutObject()->updateFromElement(); 1278 layoutObject()->updateFromElement();
1277 } 1279 }
1278 1280
1279 void HTMLMediaElement::mediaEngineError(MediaError* err) 1281 void HTMLMediaElement::mediaEngineError(MediaError* err)
1280 { 1282 {
1281 ASSERT(m_readyState >= HAVE_METADATA); 1283 ASSERT(m_readyState >= HAVE_METADATA);
1282 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%p, %d)", this, static_ca st<int>(err->code())); 1284 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%p, %d)", this, static_ca st<int>(err->code()));
1283 1285
1284 // 1 - The user agent should cancel the fetching process. 1286 // 1 - The user agent should cancel the fetching process.
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1513 m_haveFiredLoadedData = true; 1515 m_haveFiredLoadedData = true;
1514 shouldUpdateDisplayState = true; 1516 shouldUpdateDisplayState = true;
1515 scheduleEvent(EventTypeNames::loadeddata); 1517 scheduleEvent(EventTypeNames::loadeddata);
1516 setShouldDelayLoadEvent(false); 1518 setShouldDelayLoadEvent(false);
1517 } 1519 }
1518 1520
1519 bool isPotentiallyPlaying = potentiallyPlaying(); 1521 bool isPotentiallyPlaying = potentiallyPlaying();
1520 if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tra cksAreReady) { 1522 if (m_readyState == HAVE_FUTURE_DATA && oldState <= HAVE_CURRENT_DATA && tra cksAreReady) {
1521 scheduleEvent(EventTypeNames::canplay); 1523 scheduleEvent(EventTypeNames::canplay);
1522 if (isPotentiallyPlaying) 1524 if (isPotentiallyPlaying)
1523 scheduleEvent(EventTypeNames::playing); 1525 scheduleNotifyPlaying();
1524 shouldUpdateDisplayState = true; 1526 shouldUpdateDisplayState = true;
1525 } 1527 }
1526 1528
1527 if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA && track sAreReady) { 1529 if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA && track sAreReady) {
1528 if (oldState <= HAVE_CURRENT_DATA) { 1530 if (oldState <= HAVE_CURRENT_DATA) {
1529 scheduleEvent(EventTypeNames::canplay); 1531 scheduleEvent(EventTypeNames::canplay);
1530 if (isPotentiallyPlaying) 1532 if (isPotentiallyPlaying)
1531 scheduleEvent(EventTypeNames::playing); 1533 scheduleNotifyPlaying();
1532 } 1534 }
1533 1535
1534 // Check for autoplay, and record metrics about it if needed. 1536 // Check for autoplay, and record metrics about it if needed.
1535 if (shouldAutoplay(RecordMetricsBehavior::DoRecord)) { 1537 if (shouldAutoplay(RecordMetricsBehavior::DoRecord)) {
1536 // If the autoplay experiment says that it's okay to play now, 1538 // If the autoplay experiment says that it's okay to play now,
1537 // then don't require a user gesture. 1539 // then don't require a user gesture.
1538 m_autoplayHelper.becameReadyToPlay(); 1540 m_autoplayHelper.becameReadyToPlay();
1539 1541
1540 if (!m_userGestureRequiredForPlay) { 1542 if (!m_userGestureRequiredForPlay) {
1541 m_paused = false; 1543 m_paused = false;
1542 invalidateCachedTime(); 1544 invalidateCachedTime();
1543 scheduleEvent(EventTypeNames::play); 1545 scheduleEvent(EventTypeNames::play);
1544 scheduleEvent(EventTypeNames::playing); 1546 scheduleNotifyPlaying();
1545 m_autoplaying = false; 1547 m_autoplaying = false;
1546 } 1548 }
1547 } 1549 }
1548 1550
1549 scheduleEvent(EventTypeNames::canplaythrough); 1551 scheduleEvent(EventTypeNames::canplaythrough);
1550 1552
1551 shouldUpdateDisplayState = true; 1553 shouldUpdateDisplayState = true;
1552 } 1554 }
1553 1555
1554 if (shouldUpdateDisplayState) { 1556 if (shouldUpdateDisplayState) {
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after
1926 // https://crbug.com/310450 1928 // https://crbug.com/310450
1927 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadDefault); 1929 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadDefault);
1928 return WebMediaPlayer::PreloadAuto; 1930 return WebMediaPlayer::PreloadAuto;
1929 } 1931 }
1930 1932
1931 WebMediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const 1933 WebMediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const
1932 { 1934 {
1933 return autoplay() ? WebMediaPlayer::PreloadAuto : preloadType(); 1935 return autoplay() ? WebMediaPlayer::PreloadAuto : preloadType();
1934 } 1936 }
1935 1937
1936 void HTMLMediaElement::play() 1938 ScriptPromise HTMLMediaElement::playForBindings(ScriptState* scriptState)
1939 {
1940 Nullable<ExceptionCode> code = play();
1941 if (!code.isNull()) {
1942 String message;
1943 switch (code.get()) {
1944 case NotAllowedError:
1945 message = "play() can only be initiated by a user gesture.";
1946 break;
1947 case NotSupportedError:
1948 message = "The element has no supported sources.";
1949 break;
1950 default:
1951 ASSERT_NOT_REACHED();
1952 }
1953 return ScriptPromise::rejectWithDOMException(scriptState, DOMException:: create(code.get(), message));
1954 }
1955
1956 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ;
1957 ScriptPromise promise = resolver->promise();
1958
1959 m_playResolvers.append(resolver);
1960 return promise;
1961 }
1962
1963 Nullable<ExceptionCode> HTMLMediaElement::play()
1937 { 1964 {
1938 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this); 1965 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this);
1939 1966
1940 m_autoplayHelper.playMethodCalled(); 1967 m_autoplayHelper.playMethodCalled();
1941 1968
1942 if (!UserGestureIndicator::processingUserGesture()) { 1969 if (!UserGestureIndicator::processingUserGesture()) {
1943 autoplayMediaEncountered(); 1970 autoplayMediaEncountered();
1944 1971
1945 if (m_userGestureRequiredForPlay) { 1972 if (m_userGestureRequiredForPlay) {
1946 recordAutoplayMetric(PlayMethodFailed); 1973 recordAutoplayMetric(PlayMethodFailed);
1947 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture."); 1974 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture.");
1948 document().addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); 1975 document().addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message));
1949 return; 1976 return NotAllowedError;
1950 } 1977 }
1951 } else if (m_userGestureRequiredForPlay) { 1978 } else if (m_userGestureRequiredForPlay) {
1952 if (m_autoplayMediaCounted) 1979 if (m_autoplayMediaCounted)
1953 recordAutoplayMetric(AutoplayManualStart); 1980 recordAutoplayMetric(AutoplayManualStart);
1954 m_userGestureRequiredForPlay = false; 1981 m_userGestureRequiredForPlay = false;
1955 } 1982 }
1956 1983
1984 if (m_error && m_error->code() == MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED)
1985 return NotSupportedError;
1986
1957 playInternal(); 1987 playInternal();
1988
1989 return nullptr;
1958 } 1990 }
1959 1991
1960 void HTMLMediaElement::playInternal() 1992 void HTMLMediaElement::playInternal()
1961 { 1993 {
1962 WTF_LOG(Media, "HTMLMediaElement::playInternal(%p)", this); 1994 WTF_LOG(Media, "HTMLMediaElement::playInternal(%p)", this);
1963 1995
1964 // Always return the buffering strategy to normal when not paused, 1996 // Always return the buffering strategy to normal when not paused,
1965 // regardless of the cause. (In contrast with aggressive buffering which is 1997 // regardless of the cause. (In contrast with aggressive buffering which is
1966 // only enabled by pause(), not pauseInternal().) 1998 // only enabled by pause(), not pauseInternal().)
1967 if (webMediaPlayer()) 1999 if (webMediaPlayer())
(...skipping 10 matching lines...) Expand all
1978 seek(0); 2010 seek(0);
1979 2011
1980 if (m_paused) { 2012 if (m_paused) {
1981 m_paused = false; 2013 m_paused = false;
1982 invalidateCachedTime(); 2014 invalidateCachedTime();
1983 scheduleEvent(EventTypeNames::play); 2015 scheduleEvent(EventTypeNames::play);
1984 2016
1985 if (m_readyState <= HAVE_CURRENT_DATA) 2017 if (m_readyState <= HAVE_CURRENT_DATA)
1986 scheduleEvent(EventTypeNames::waiting); 2018 scheduleEvent(EventTypeNames::waiting);
1987 else if (m_readyState >= HAVE_FUTURE_DATA) 2019 else if (m_readyState >= HAVE_FUTURE_DATA)
1988 scheduleEvent(EventTypeNames::playing); 2020 scheduleNotifyPlaying();
2021 } else if (m_readyState >= HAVE_FUTURE_DATA) {
2022 scheduleResolvePlayPromises();
1989 } 2023 }
2024
1990 m_autoplaying = false; 2025 m_autoplaying = false;
1991 2026
1992 updatePlayState(); 2027 updatePlayState();
1993 } 2028 }
1994 2029
1995 void HTMLMediaElement::autoplayMediaEncountered() 2030 void HTMLMediaElement::autoplayMediaEncountered()
1996 { 2031 {
1997 if (!m_autoplayMediaCounted) { 2032 if (!m_autoplayMediaCounted) {
1998 m_autoplayMediaCounted = true; 2033 m_autoplayMediaCounted = true;
1999 recordAutoplayMetric(AutoplayMediaFound); 2034 recordAutoplayMetric(AutoplayMediaFound);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2034 m_autoplayHelper.pauseMethodCalled(); 2069 m_autoplayHelper.pauseMethodCalled();
2035 2070
2036 m_autoplaying = false; 2071 m_autoplaying = false;
2037 2072
2038 if (!m_paused) { 2073 if (!m_paused) {
2039 recordMetricsIfPausing(); 2074 recordMetricsIfPausing();
2040 2075
2041 m_paused = true; 2076 m_paused = true;
2042 scheduleTimeupdateEvent(false); 2077 scheduleTimeupdateEvent(false);
2043 scheduleEvent(EventTypeNames::pause); 2078 scheduleEvent(EventTypeNames::pause);
2079 scheduleRejectPlayPromises(AbortError, "The play() request was interrupt ed by a call to pause().");
2044 } 2080 }
2045 2081
2046 updatePlayState(); 2082 updatePlayState();
2047 } 2083 }
2048 2084
2049 void HTMLMediaElement::requestRemotePlayback() 2085 void HTMLMediaElement::requestRemotePlayback()
2050 { 2086 {
2051 ASSERT(m_remoteRoutesAvailable); 2087 ASSERT(m_remoteRoutesAvailable);
2052 webMediaPlayer()->requestRemotePlayback(); 2088 webMediaPlayer()->requestRemotePlayback();
2053 } 2089 }
(...skipping 1430 matching lines...) Expand 10 before | Expand all | Expand 10 after
3484 visitor->trace(m_asyncEventQueue); 3520 visitor->trace(m_asyncEventQueue);
3485 visitor->trace(m_error); 3521 visitor->trace(m_error);
3486 visitor->trace(m_currentSourceNode); 3522 visitor->trace(m_currentSourceNode);
3487 visitor->trace(m_nextChildNodeToConsider); 3523 visitor->trace(m_nextChildNodeToConsider);
3488 visitor->trace(m_mediaSource); 3524 visitor->trace(m_mediaSource);
3489 visitor->trace(m_audioTracks); 3525 visitor->trace(m_audioTracks);
3490 visitor->trace(m_videoTracks); 3526 visitor->trace(m_videoTracks);
3491 visitor->trace(m_cueTimeline); 3527 visitor->trace(m_cueTimeline);
3492 visitor->trace(m_textTracks); 3528 visitor->trace(m_textTracks);
3493 visitor->trace(m_textTracksWhenResourceSelectionBegan); 3529 visitor->trace(m_textTracksWhenResourceSelectionBegan);
3530 visitor->trace(m_playResolvers);
3494 visitor->trace(m_audioSourceProvider); 3531 visitor->trace(m_audioSourceProvider);
3495 visitor->template registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::c learWeakMembers>(this); 3532 visitor->template registerWeakMembers<HTMLMediaElement, &HTMLMediaElement::c learWeakMembers>(this);
3496 visitor->trace(m_autoplayHelper); 3533 visitor->trace(m_autoplayHelper);
3497 HeapSupplementable<HTMLMediaElement>::trace(visitor); 3534 HeapSupplementable<HTMLMediaElement>::trace(visitor);
3498 #endif 3535 #endif
3499 HTMLElement::trace(visitor); 3536 HTMLElement::trace(visitor);
3500 ActiveDOMObject::trace(visitor); 3537 ActiveDOMObject::trace(visitor);
3501 } 3538 }
3502 3539
3503 void HTMLMediaElement::createPlaceholderTracksIfNecessary() 3540 void HTMLMediaElement::createPlaceholderTracksIfNecessary()
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3561 { 3598 {
3562 m_autoplayHelper.updatePositionNotificationRegistration(); 3599 m_autoplayHelper.updatePositionNotificationRegistration();
3563 } 3600 }
3564 3601
3565 // TODO(liberato): remove once autoplay gesture override experiment concludes. 3602 // TODO(liberato): remove once autoplay gesture override experiment concludes.
3566 void HTMLMediaElement::triggerAutoplayViewportCheckForTesting() 3603 void HTMLMediaElement::triggerAutoplayViewportCheckForTesting()
3567 { 3604 {
3568 m_autoplayHelper.triggerAutoplayViewportCheckForTesting(); 3605 m_autoplayHelper.triggerAutoplayViewportCheckForTesting();
3569 } 3606 }
3570 3607
3608 void HTMLMediaElement::scheduleResolvePlayPromises()
3609 {
3610 Platform::current()->currentThread()->taskRunner()->postTask(
3611 BLINK_FROM_HERE, WTF::bind(&HTMLMediaElement::resolvePlayPromises, PassR efPtrWillBeRawPtr<HTMLMediaElement>(this)));
3612 }
3613
3614 void HTMLMediaElement::scheduleRejectPlayPromises(ExceptionCode code, const Stri ng& message)
3615 {
3616 Platform::current()->currentThread()->taskRunner()->postTask(
3617 BLINK_FROM_HERE, WTF::bind(&HTMLMediaElement::rejectPlayPromises, PassRe fPtrWillBeRawPtr<HTMLMediaElement>(this), code, message));
3618 }
3619
3620 void HTMLMediaElement::scheduleNotifyPlaying()
3621 {
3622 scheduleEvent(EventTypeNames::playing);
3623 scheduleResolvePlayPromises();
3624 }
3625
3626 void HTMLMediaElement::resolvePlayPromises()
3627 {
3628 for (auto& resolver: m_playResolvers)
3629 resolver->resolve();
3630
3631 m_playResolvers.clear();
3632 }
3633
3634 void HTMLMediaElement::rejectPlayPromises(ExceptionCode code, const String& mess age)
3635 {
3636 ASSERT(code == AbortError || code == NotSupportedError);
3637
3638 for (auto& resolver: m_playResolvers)
3639 resolver->reject(DOMException::create(code, message));
3640
3641 m_playResolvers.clear();
3642 }
3643
3571 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 3644 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3572 { 3645 {
3573 if (!Heap::isHeapObjectAlive(m_audioSourceNode)) 3646 if (!Heap::isHeapObjectAlive(m_audioSourceNode))
3574 audioSourceProvider().setClient(nullptr); 3647 audioSourceProvider().setClient(nullptr);
3575 } 3648 }
3576 3649
3577 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro vider) 3650 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro vider)
3578 { 3651 {
3579 MutexLocker locker(provideInputLock); 3652 MutexLocker locker(provideInputLock);
3580 3653
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3628 { 3701 {
3629 visitor->trace(m_client); 3702 visitor->trace(m_client);
3630 } 3703 }
3631 3704
3632 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) 3705 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl)
3633 { 3706 {
3634 visitor->trace(m_client); 3707 visitor->trace(m_client);
3635 } 3708 }
3636 3709
3637 } // namespace blink 3710 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698