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

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

Issue 1810513002: Media element resource selection algorithm should "await a stable state" Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use CancellableTaskFactory Created 4 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
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 17 matching lines...) Expand all
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 "bindings/core/v8/ScriptPromiseResolver.h"
33 #include "core/HTMLNames.h" 33 #include "core/HTMLNames.h"
34 #include "core/css/MediaList.h" 34 #include "core/css/MediaList.h"
35 #include "core/dom/Attribute.h" 35 #include "core/dom/Attribute.h"
36 #include "core/dom/ElementTraversal.h" 36 #include "core/dom/ElementTraversal.h"
37 #include "core/dom/Fullscreen.h" 37 #include "core/dom/Fullscreen.h"
38 #include "core/dom/Microtask.h"
38 #include "core/dom/shadow/ShadowRoot.h" 39 #include "core/dom/shadow/ShadowRoot.h"
39 #include "core/events/Event.h" 40 #include "core/events/Event.h"
40 #include "core/frame/LocalFrame.h" 41 #include "core/frame/LocalFrame.h"
41 #include "core/frame/Settings.h" 42 #include "core/frame/Settings.h"
42 #include "core/frame/UseCounter.h" 43 #include "core/frame/UseCounter.h"
43 #include "core/frame/csp/ContentSecurityPolicy.h" 44 #include "core/frame/csp/ContentSecurityPolicy.h"
44 #include "core/html/HTMLMediaSource.h" 45 #include "core/html/HTMLMediaSource.h"
45 #include "core/html/HTMLSourceElement.h" 46 #include "core/html/HTMLSourceElement.h"
46 #include "core/html/HTMLTrackElement.h" 47 #include "core/html/HTMLTrackElement.h"
47 #include "core/html/MediaError.h" 48 #include "core/html/MediaError.h"
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 } 304 }
304 305
305 bool HTMLMediaElement::isMediaStreamURL(const String& url) 306 bool HTMLMediaElement::isMediaStreamURL(const String& url)
306 { 307 {
307 return s_mediaStreamRegistry ? s_mediaStreamRegistry->contains(url) : false; 308 return s_mediaStreamRegistry ? s_mediaStreamRegistry->contains(url) : false;
308 } 309 }
309 310
310 HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document& docum ent) 311 HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document& docum ent)
311 : HTMLElement(tagName, document) 312 : HTMLElement(tagName, document)
312 , ActiveDOMObject(&document) 313 , ActiveDOMObject(&document)
313 , m_loadTimer(this, &HTMLMediaElement::loadTimerFired) 314 , m_textTrackLoadTimer(this, &HTMLMediaElement::textTrackLoadTimerFired)
314 , m_progressEventTimer(this, &HTMLMediaElement::progressEventTimerFired) 315 , m_progressEventTimer(this, &HTMLMediaElement::progressEventTimerFired)
315 , m_playbackProgressTimer(this, &HTMLMediaElement::playbackProgressTimerFire d) 316 , m_playbackProgressTimer(this, &HTMLMediaElement::playbackProgressTimerFire d)
316 , m_audioTracksTimer(this, &HTMLMediaElement::audioTracksTimerFired) 317 , m_audioTracksTimer(this, &HTMLMediaElement::audioTracksTimerFired)
317 , m_playedTimeRanges() 318 , m_playedTimeRanges()
318 , m_asyncEventQueue(GenericEventQueue::create(this)) 319 , m_asyncEventQueue(GenericEventQueue::create(this))
319 , m_playbackRate(1.0f) 320 , m_playbackRate(1.0f)
320 , m_defaultPlaybackRate(1.0f) 321 , m_defaultPlaybackRate(1.0f)
321 , m_networkState(NETWORK_EMPTY) 322 , m_networkState(NETWORK_EMPTY)
322 , m_readyState(HAVE_NOTHING) 323 , m_readyState(HAVE_NOTHING)
323 , m_readyStateMaximum(HAVE_NOTHING) 324 , m_readyStateMaximum(HAVE_NOTHING)
324 , m_volume(1.0f) 325 , m_volume(1.0f)
325 , m_lastSeekTime(0) 326 , m_lastSeekTime(0)
326 , m_previousProgressTime(std::numeric_limits<double>::max()) 327 , m_previousProgressTime(std::numeric_limits<double>::max())
327 , m_duration(std::numeric_limits<double>::quiet_NaN()) 328 , m_duration(std::numeric_limits<double>::quiet_NaN())
328 , m_lastTimeUpdateEventWallTime(0) 329 , m_lastTimeUpdateEventWallTime(0)
329 , m_lastTimeUpdateEventMovieTime(0) 330 , m_lastTimeUpdateEventMovieTime(0)
330 , m_defaultPlaybackStartPosition(0) 331 , m_defaultPlaybackStartPosition(0)
331 , m_loadState(WaitingForSource) 332 , m_loadState(WaitingForSource)
332 , m_deferredLoadState(NotDeferred) 333 , m_deferredLoadState(NotDeferred)
333 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired) 334 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired)
334 , m_webLayer(nullptr) 335 , m_webLayer(nullptr)
335 , m_displayMode(Unknown) 336 , m_displayMode(Unknown)
336 , m_cachedTime(std::numeric_limits<double>::quiet_NaN()) 337 , m_cachedTime(std::numeric_limits<double>::quiet_NaN())
337 , m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()) 338 , m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN())
338 , m_pendingActionFlags(0)
339 , m_userGestureRequiredForPlay(false) 339 , m_userGestureRequiredForPlay(false)
340 , m_playing(false) 340 , m_playing(false)
341 , m_shouldDelayLoadEvent(false) 341 , m_shouldDelayLoadEvent(false)
342 , m_haveFiredLoadedData(false) 342 , m_haveFiredLoadedData(false)
343 , m_autoplaying(true) 343 , m_autoplaying(true)
344 , m_muted(false) 344 , m_muted(false)
345 , m_paused(true) 345 , m_paused(true)
346 , m_seeking(false) 346 , m_seeking(false)
347 , m_sentStalledEvent(false) 347 , m_sentStalledEvent(false)
348 , m_sentEndEvent(false) 348 , m_sentEndEvent(false)
349 , m_closedCaptionsVisible(false) 349 , m_closedCaptionsVisible(false)
350 , m_ignorePreloadNone(false) 350 , m_ignorePreloadNone(false)
351 , m_tracksAreReady(true) 351 , m_tracksAreReady(true)
352 , m_processingPreferenceChange(false) 352 , m_processingPreferenceChange(false)
353 , m_remoteRoutesAvailable(false) 353 , m_remoteRoutesAvailable(false)
354 , m_playingRemotely(false) 354 , m_playingRemotely(false)
355 , m_isFinalizing(false) 355 , m_isFinalizing(false)
356 , m_initialPlayWithoutUserGesture(false) 356 , m_initialPlayWithoutUserGesture(false)
357 , m_autoplayMediaCounted(false) 357 , m_autoplayMediaCounted(false)
358 , m_inOverlayFullscreenVideo(false) 358 , m_inOverlayFullscreenVideo(false)
359 , m_audioTracks(AudioTrackList::create(*this)) 359 , m_audioTracks(AudioTrackList::create(*this))
360 , m_videoTracks(VideoTrackList::create(*this)) 360 , m_videoTracks(VideoTrackList::create(*this))
361 , m_textTracks(nullptr) 361 , m_textTracks(nullptr)
362 , m_playPromiseResolveTask(CancellableTaskFactory::create(this, &HTMLMediaEl ement::resolvePlayPromises)) 362 , m_playPromiseResolveTask(CancellableTaskFactory::create(this, &HTMLMediaEl ement::resolvePlayPromises))
363 , m_playPromiseRejectTask(CancellableTaskFactory::create(this, &HTMLMediaEle ment::rejectPlayPromises)) 363 , m_playPromiseRejectTask(CancellableTaskFactory::create(this, &HTMLMediaEle ment::rejectPlayPromises))
364 , m_resourceSelectionAlgorithmContinuationTask(CancellableTaskFactory::creat e(this, &HTMLMediaElement::continueResourceSelectionAlgorithm))
364 , m_audioSourceNode(nullptr) 365 , m_audioSourceNode(nullptr)
365 , m_autoplayHelper(*this) 366 , m_autoplayHelper(*this)
366 { 367 {
367 #if ENABLE(OILPAN) 368 #if ENABLE(OILPAN)
368 ThreadState::current()->registerPreFinalizer(this); 369 ThreadState::current()->registerPreFinalizer(this);
369 #endif 370 #endif
370 371
371 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); 372 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this);
372 373
373 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture()) 374 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture())
(...skipping 17 matching lines...) Expand all
391 392
392 setShouldDelayLoadEvent(false); 393 setShouldDelayLoadEvent(false);
393 394
394 if (m_textTracks) 395 if (m_textTracks)
395 m_textTracks->clearOwner(); 396 m_textTracks->clearOwner();
396 m_audioTracks->shutdown(); 397 m_audioTracks->shutdown();
397 m_videoTracks->shutdown(); 398 m_videoTracks->shutdown();
398 399
399 closeMediaSource(); 400 closeMediaSource();
400 401
402 if (m_resourceSelectionAlgorithmContinuationTask->isPending())
403 m_resourceSelectionAlgorithmContinuationTask->cancel();
404
401 removeElementFromDocumentMap(this, &document()); 405 removeElementFromDocumentMap(this, &document());
402 406
403 // Destroying the player may cause a resource load to be canceled, 407 // Destroying the player may cause a resource load to be canceled,
404 // which could result in LocalDOMWindow::dispatchWindowLoadEvent() being 408 // which could result in LocalDOMWindow::dispatchWindowLoadEvent() being
405 // called via ResourceFetch::didLoadResource() then 409 // called via ResourceFetch::didLoadResource() then
406 // FrameLoader::checkCompleted(). To prevent load event dispatching during 410 // FrameLoader::checkCompleted(). To prevent load event dispatching during
407 // object destruction, we use Document::incrementLoadEventDelayCount(). 411 // object destruction, we use Document::incrementLoadEventDelayCount().
408 // See http://crbug.com/275223 for more details. 412 // See http://crbug.com/275223 for more details.
409 document().incrementLoadEventDelayCount(); 413 document().incrementLoadEventDelayCount();
410 414
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 void HTMLMediaElement::didRecalcStyle(StyleRecalcChange) 597 void HTMLMediaElement::didRecalcStyle(StyleRecalcChange)
594 { 598 {
595 if (layoutObject()) 599 if (layoutObject())
596 layoutObject()->updateFromElement(); 600 layoutObject()->updateFromElement();
597 } 601 }
598 602
599 void HTMLMediaElement::scheduleTextTrackResourceLoad() 603 void HTMLMediaElement::scheduleTextTrackResourceLoad()
600 { 604 {
601 WTF_LOG(Media, "HTMLMediaElement::scheduleTextTrackResourceLoad(%p)", this); 605 WTF_LOG(Media, "HTMLMediaElement::scheduleTextTrackResourceLoad(%p)", this);
602 606
603 m_pendingActionFlags |= LoadTextTrackResource; 607 if (!m_textTrackLoadTimer.isActive())
604 608 m_textTrackLoadTimer.startOneShot(0, BLINK_FROM_HERE);
605 if (!m_loadTimer.isActive())
606 m_loadTimer.startOneShot(0, BLINK_FROM_HERE);
607 }
608
609 void HTMLMediaElement::scheduleNextSourceChild()
610 {
611 // Schedule the timer to try the next <source> element WITHOUT resetting sta te ala invokeLoadAlgorithm.
612 m_pendingActionFlags |= LoadMediaResource;
613 m_loadTimer.startOneShot(0, BLINK_FROM_HERE);
614 } 609 }
615 610
616 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) 611 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName)
617 { 612 {
618 scheduleEvent(Event::createCancelable(eventName)); 613 scheduleEvent(Event::createCancelable(eventName));
619 } 614 }
620 615
621 void HTMLMediaElement::scheduleEvent(PassRefPtrWillBeRawPtr<Event> event) 616 void HTMLMediaElement::scheduleEvent(PassRefPtrWillBeRawPtr<Event> event)
622 { 617 {
623 #if LOG_MEDIA_EVENTS 618 #if LOG_MEDIA_EVENTS
624 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent(%p) - scheduling '%s'", this , event->type().ascii().data()); 619 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent(%p) - scheduling '%s'", this , event->type().ascii().data());
625 #endif 620 #endif
626 m_asyncEventQueue->enqueueEvent(event); 621 m_asyncEventQueue->enqueueEvent(event);
627 } 622 }
628 623
629 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) 624 void HTMLMediaElement::textTrackLoadTimerFired(Timer<HTMLMediaElement>*)
630 { 625 {
631 if (m_pendingActionFlags & LoadTextTrackResource) 626 WTF_LOG(Media, "HTMLMediaElement::textTrackLoadTimerFired(%p)", this);
632 honorUserPreferencesForAutomaticTextTrackSelection(); 627 honorUserPreferencesForAutomaticTextTrackSelection();
633
634 if (m_pendingActionFlags & LoadMediaResource) {
635 if (m_loadState == LoadingFromSourceElement)
636 loadNextSourceChild();
637 else
638 loadInternal();
639 }
640
641 m_pendingActionFlags = 0;
642 } 628 }
643 629
644 MediaError* HTMLMediaElement::error() const 630 MediaError* HTMLMediaElement::error() const
645 { 631 {
646 return m_error; 632 return m_error;
647 } 633 }
648 634
649 void HTMLMediaElement::setSrc(const AtomicString& url) 635 void HTMLMediaElement::setSrc(const AtomicString& url)
650 { 636 {
651 setAttribute(srcAttr, url); 637 setAttribute(srcAttr, url);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
728 // TODO(srirama.m): Currently m_ignorePreloadNone is reset before calling 714 // TODO(srirama.m): Currently m_ignorePreloadNone is reset before calling
729 // invokeLoadAlgorithm() in all places except load(). Move it inside here 715 // invokeLoadAlgorithm() in all places except load(). Move it inside here
730 // once microtask is implemented for "Await a stable state" step 716 // once microtask is implemented for "Await a stable state" step
731 // in resource selection algorithm. 717 // in resource selection algorithm.
732 void HTMLMediaElement::invokeLoadAlgorithm() 718 void HTMLMediaElement::invokeLoadAlgorithm()
733 { 719 {
734 WTF_LOG(Media, "HTMLMediaElement::invokeLoadAlgorithm(%p)", this); 720 WTF_LOG(Media, "HTMLMediaElement::invokeLoadAlgorithm(%p)", this);
735 721
736 // Perform the cleanup required for the resource load algorithm to run. 722 // Perform the cleanup required for the resource load algorithm to run.
737 stopPeriodicTimers(); 723 stopPeriodicTimers();
738 m_loadTimer.stop();
739 cancelDeferredLoad(); 724 cancelDeferredLoad();
740 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here.
741 m_pendingActionFlags &= ~LoadMediaResource;
742 m_sentEndEvent = false; 725 m_sentEndEvent = false;
743 m_sentStalledEvent = false; 726 m_sentStalledEvent = false;
744 m_haveFiredLoadedData = false; 727 m_haveFiredLoadedData = false;
745 m_displayMode = Unknown; 728 m_displayMode = Unknown;
746 729
747 // 1 - Abort any already-running instance of the resource selection algorith m for this element. 730 // 1 - Abort any already-running instance of the resource selection algorith m for this element.
748 m_loadState = WaitingForSource; 731 m_loadState = WaitingForSource;
749 m_currentSourceNode = nullptr; 732 m_currentSourceNode = nullptr;
750 733
751 // 2 - If there are any tasks from the media element's media element event t ask source in 734 // 2 - If there are any tasks from the media element's media element event t ask source in
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 // so they are closer to the relevant spec steps. 809 // so they are closer to the relevant spec steps.
827 m_lastSeekTime = 0; 810 m_lastSeekTime = 0;
828 m_duration = std::numeric_limits<double>::quiet_NaN(); 811 m_duration = std::numeric_limits<double>::quiet_NaN();
829 812
830 // 3 - Set the media element's delaying-the-load-event flag to true (this de lays the load event) 813 // 3 - Set the media element's delaying-the-load-event flag to true (this de lays the load event)
831 setShouldDelayLoadEvent(true); 814 setShouldDelayLoadEvent(true);
832 if (mediaControls()) 815 if (mediaControls())
833 mediaControls()->reset(); 816 mediaControls()->reset();
834 817
835 // 4 - Await a stable state, allowing the task that invoked this algorithm t o continue 818 // 4 - Await a stable state, allowing the task that invoked this algorithm t o continue
836 // TODO(srirama.m): Remove scheduleNextSourceChild() and post a microtask in stead. 819 enqueueMicrotaskForResourceSelectionAlgorithmContinuation();
837 // See http://crbug.com/593289 for more details. 820 }
838 scheduleNextSourceChild(); 821
822 void HTMLMediaElement::continueResourceSelectionAlgorithm()
823 {
824 WTF_LOG(Media, "HTMLMediaElement::continueResourceSelectionAlgorithm(%p)", t his);
825 loadInternal();
826 }
827
828 void HTMLMediaElement::enqueueMicrotaskForResourceSelectionAlgorithmContinuation ()
829 {
830 OwnPtr<WebTaskRunner::Task> task = adoptPtr(m_resourceSelectionAlgorithmCont inuationTask->cancelAndCreate());
831 Microtask::enqueueMicrotask(task.release());
839 } 832 }
840 833
841 void HTMLMediaElement::loadInternal() 834 void HTMLMediaElement::loadInternal()
842 { 835 {
843 // HTMLMediaElement::textTracksAreReady will need "... the text tracks whose mode was not in the 836 // HTMLMediaElement::textTracksAreReady will need "... the text tracks whose mode was not in the
844 // disabled state when the element's resource selection algorithm last start ed". 837 // disabled state when the element's resource selection algorithm last start ed".
845 m_textTracksWhenResourceSelectionBegan.clear(); 838 m_textTracksWhenResourceSelectionBegan.clear();
846 if (m_textTracks) { 839 if (m_textTracks) {
847 for (unsigned i = 0; i < m_textTracks->length(); ++i) { 840 for (unsigned i = 0; i < m_textTracks->length(); ++i) {
848 TextTrack* track = m_textTracks->anonymousIndexedGetter(i); 841 TextTrack* track = m_textTracks->anonymousIndexedGetter(i);
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
1365 else 1358 else
1366 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - error event not sent, <source> was removed", this); 1359 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - error event not sent, <source> was removed", this);
1367 1360
1368 // 9.Otherwise.10 - Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorit hm says the synchronous section has ended. 1361 // 9.Otherwise.10 - Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorit hm says the synchronous section has ended.
1369 1362
1370 // 9.Otherwise.11 - Forget the media element's media-resource-specific t racks. 1363 // 9.Otherwise.11 - Forget the media element's media-resource-specific t racks.
1371 forgetResourceSpecificTracks(); 1364 forgetResourceSpecificTracks();
1372 1365
1373 if (havePotentialSourceChild()) { 1366 if (havePotentialSourceChild()) {
1374 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - scheduling n ext <source>", this); 1367 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - scheduling n ext <source>", this);
1375 scheduleNextSourceChild(); 1368 Microtask::enqueueMicrotask(WTF::bind(&HTMLMediaElement::loadNextSou rceChild, this));
philipj_slow 2016/04/06 12:06:52 Per spec the "await a stable state" is before forg
Srirama 2016/04/11 08:07:59 Done.
1376 } else { 1369 } else {
1377 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - no more <sou rce> elements, waiting", this); 1370 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - no more <sou rce> elements, waiting", this);
1378 waitForSourceChange(); 1371 waitForSourceChange();
1379 } 1372 }
1380 1373
1381 return; 1374 return;
1382 } 1375 }
1383 1376
1384 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV E_METADATA) 1377 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV E_METADATA)
1385 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); 1378 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK));
(...skipping 1379 matching lines...) Expand 10 before | Expand all | Expand 10 after
2765 // 22. Asynchronously await a stable state... 2758 // 22. Asynchronously await a stable state...
2766 // 23. Set the element's delaying-the-load-event flag back to true (this del ays the load event again, in case 2759 // 23. Set the element's delaying-the-load-event flag back to true (this del ays the load event again, in case
2767 // it hasn't been fired yet). 2760 // it hasn't been fired yet).
2768 setShouldDelayLoadEvent(true); 2761 setShouldDelayLoadEvent(true);
2769 2762
2770 // 24. Set the networkState back to NETWORK_LOADING. 2763 // 24. Set the networkState back to NETWORK_LOADING.
2771 setNetworkState(NETWORK_LOADING); 2764 setNetworkState(NETWORK_LOADING);
2772 2765
2773 // 25. Jump back to the find next candidate step above. 2766 // 25. Jump back to the find next candidate step above.
2774 m_nextChildNodeToConsider = source; 2767 m_nextChildNodeToConsider = source;
2775 scheduleNextSourceChild(); 2768 loadNextSourceChild();
philipj_slow 2016/04/06 12:06:52 If there are many source children, will this recur
Srirama 2016/04/11 08:07:59 I wrote a test content like below. ***************
philipj_slow 2016/04/19 14:52:44 Can you change the test so that it appends 10000 p
2776 } 2769 }
2777 2770
2778 void HTMLMediaElement::sourceWasRemoved(HTMLSourceElement* source) 2771 void HTMLMediaElement::sourceWasRemoved(HTMLSourceElement* source)
2779 { 2772 {
2780 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p, %p)", this, source); 2773 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p, %p)", this, source);
2781 2774
2782 #if !LOG_DISABLED 2775 #if !LOG_DISABLED
2783 KURL url = source->getNonEmptyURLAttribute(srcAttr); 2776 KURL url = source->getNonEmptyURLAttribute(srcAttr);
2784 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p) - 'src' is %s", this, urlForLoggingMedia(url).utf8().data()); 2777 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p) - 'src' is %s", this, urlForLoggingMedia(url).utf8().data());
2785 #endif 2778 #endif
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
3103 closeMediaSource(); 3096 closeMediaSource();
3104 3097
3105 cancelDeferredLoad(); 3098 cancelDeferredLoad();
3106 3099
3107 { 3100 {
3108 AudioSourceProviderClientLockScope scope(*this); 3101 AudioSourceProviderClientLockScope scope(*this);
3109 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); 3102 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
3110 } 3103 }
3111 3104
3112 stopPeriodicTimers(); 3105 stopPeriodicTimers();
3113 m_loadTimer.stop(); 3106 m_textTrackLoadTimer.stop();
3114 3107
3115 m_pendingActionFlags = 0;
3116 m_loadState = WaitingForSource; 3108 m_loadState = WaitingForSource;
3117 3109
3118 // We can't cast if we don't have a media player. 3110 // We can't cast if we don't have a media player.
3119 m_remoteRoutesAvailable = false; 3111 m_remoteRoutesAvailable = false;
3120 m_playingRemotely = false; 3112 m_playingRemotely = false;
3121 if (mediaControls()) 3113 if (mediaControls())
3122 mediaControls()->refreshCastButtonVisibilityWithoutUpdate(); 3114 mediaControls()->refreshCastButtonVisibilityWithoutUpdate();
3123 3115
3124 if (layoutObject()) 3116 if (layoutObject())
3125 layoutObject()->setShouldDoFullPaintInvalidation(); 3117 layoutObject()->setShouldDoFullPaintInvalidation();
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3179 3171
3180 // When connected to a MediaSource, e.g. setting MediaSource.duration will c ause a 3172 // When connected to a MediaSource, e.g. setting MediaSource.duration will c ause a
3181 // durationchange event to be fired. 3173 // durationchange event to be fired.
3182 if (m_mediaSource) 3174 if (m_mediaSource)
3183 return true; 3175 return true;
3184 3176
3185 // Wait for any pending events to be fired. 3177 // Wait for any pending events to be fired.
3186 if (m_asyncEventQueue->hasPendingEvents()) 3178 if (m_asyncEventQueue->hasPendingEvents())
3187 return true; 3179 return true;
3188 3180
3181 // Wait for any pending microtask to be fired.
3182 if (m_resourceSelectionAlgorithmContinuationTask->isPending())
philipj_slow 2016/04/06 12:06:52 Now that we're in an Oilpan only world I'm not ent
Srirama 2016/04/11 08:07:59 I think it will be a strong pointer (ownptr), isn'
3183 return true;
3184
3189 return false; 3185 return false;
3190 } 3186 }
3191 3187
3192 bool HTMLMediaElement::isFullscreen() const 3188 bool HTMLMediaElement::isFullscreen() const
3193 { 3189 {
3194 return Fullscreen::isActiveFullScreenElement(*this); 3190 return Fullscreen::isActiveFullScreenElement(*this);
3195 } 3191 }
3196 3192
3197 void HTMLMediaElement::enterFullscreen() 3193 void HTMLMediaElement::enterFullscreen()
3198 { 3194 {
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
3804 { 3800 {
3805 visitor->trace(m_client); 3801 visitor->trace(m_client);
3806 } 3802 }
3807 3803
3808 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) 3804 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl)
3809 { 3805 {
3810 visitor->trace(m_client); 3806 visitor->trace(m_client);
3811 } 3807 }
3812 3808
3813 } // namespace blink 3809 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698