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

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: 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
« 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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 case WebMediaPlayer::PreloadAuto: 262 case WebMediaPlayer::PreloadAuto:
262 return "auto"; 263 return "auto";
263 } 264 }
264 265
265 ASSERT_NOT_REACHED(); 266 ASSERT_NOT_REACHED();
266 return String(); 267 return String();
267 } 268 }
268 269
269 } // anonymous namespace 270 } // anonymous namespace
270 271
272 class HTMLMediaElement::Task : public WebTaskRunner::Task {
273 public:
274 static PassOwnPtr<Task> create(HTMLMediaElement* mediaElement)
275 {
276 return adoptPtr(new Task(mediaElement));
277 }
278
279 Task(HTMLMediaElement* mediaElement)
280 : m_mediaElement(mediaElement)
281 , m_weakFactory(this)
282 {
283 v8::Isolate* isolate = V8PerIsolateData::mainThreadIsolate();
284 v8::HandleScope scope(isolate);
285 if (ScriptState::hasCurrentScriptState(isolate))
286 m_scriptState = ScriptState::current(isolate);
287 else
288 m_scriptState = ScriptState::forMainWorld(m_mediaElement->document() .frame());
289 }
290
291 void run() override
292 {
293 WTF_LOG(Media, "HTMLMediaElement::Task::run(%p)", m_mediaElement.get());
294 if (!m_mediaElement)
295 return;
296
297 if (m_scriptState->contextIsValid()) {
298 ScriptState::Scope scope(m_scriptState.get());
299 m_mediaElement->continueResourceSelectionAlgorithm();
300 } else {
301 m_mediaElement->continueResourceSelectionAlgorithm();
302 }
303 }
304
305 void clearTaskInfo()
306 {
307 m_mediaElement = nullptr;
308 m_scriptState.clear();
309 }
310
311 WeakPtr<Task> createWeakPtr()
312 {
313 return m_weakFactory.createWeakPtr();
314 }
315
316 private:
317 RawPtrWillBeWeakPersistent<HTMLMediaElement> m_mediaElement;
318 RefPtr<ScriptState> m_scriptState;
319 WeakPtrFactory<Task> m_weakFactory;
320 };
321
271 void HTMLMediaElement::recordAutoplayMetric(AutoplayMetrics metric) 322 void HTMLMediaElement::recordAutoplayMetric(AutoplayMetrics metric)
272 { 323 {
273 DEFINE_STATIC_LOCAL(EnumerationHistogram, autoplayHistogram, ("Blink.MediaEl ement.Autoplay", NumberOfAutoplayMetrics)); 324 DEFINE_STATIC_LOCAL(EnumerationHistogram, autoplayHistogram, ("Blink.MediaEl ement.Autoplay", NumberOfAutoplayMetrics));
274 autoplayHistogram.count(metric); 325 autoplayHistogram.count(metric);
275 } 326 }
276 327
277 WebMimeRegistry::SupportsType HTMLMediaElement::supportsType(const ContentType& contentType) 328 WebMimeRegistry::SupportsType HTMLMediaElement::supportsType(const ContentType& contentType)
278 { 329 {
279 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); 330 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs"));
280 331
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 442
392 setShouldDelayLoadEvent(false); 443 setShouldDelayLoadEvent(false);
393 444
394 if (m_textTracks) 445 if (m_textTracks)
395 m_textTracks->clearOwner(); 446 m_textTracks->clearOwner();
396 m_audioTracks->shutdown(); 447 m_audioTracks->shutdown();
397 m_videoTracks->shutdown(); 448 m_videoTracks->shutdown();
398 449
399 closeMediaSource(); 450 closeMediaSource();
400 451
452 if (m_pendingTask)
453 m_pendingTask->clearTaskInfo();
454
401 removeElementFromDocumentMap(this, &document()); 455 removeElementFromDocumentMap(this, &document());
402 456
403 // Destroying the player may cause a resource load to be canceled, 457 // Destroying the player may cause a resource load to be canceled,
404 // which could result in LocalDOMWindow::dispatchWindowLoadEvent() being 458 // which could result in LocalDOMWindow::dispatchWindowLoadEvent() being
405 // called via ResourceFetch::didLoadResource() then 459 // called via ResourceFetch::didLoadResource() then
406 // FrameLoader::checkCompleted(). To prevent load event dispatching during 460 // FrameLoader::checkCompleted(). To prevent load event dispatching during
407 // object destruction, we use Document::incrementLoadEventDelayCount(). 461 // object destruction, we use Document::incrementLoadEventDelayCount().
408 // See http://crbug.com/275223 for more details. 462 // See http://crbug.com/275223 for more details.
409 document().incrementLoadEventDelayCount(); 463 document().incrementLoadEventDelayCount();
410 464
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here. 794 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here.
741 m_pendingActionFlags &= ~LoadMediaResource; 795 m_pendingActionFlags &= ~LoadMediaResource;
742 m_sentEndEvent = false; 796 m_sentEndEvent = false;
743 m_sentStalledEvent = false; 797 m_sentStalledEvent = false;
744 m_haveFiredLoadedData = false; 798 m_haveFiredLoadedData = false;
745 m_displayMode = Unknown; 799 m_displayMode = Unknown;
746 800
747 // 1 - Abort any already-running instance of the resource selection algorith m for this element. 801 // 1 - Abort any already-running instance of the resource selection algorith m for this element.
748 m_loadState = WaitingForSource; 802 m_loadState = WaitingForSource;
749 m_currentSourceNode = nullptr; 803 m_currentSourceNode = nullptr;
804 if (m_pendingTask) {
805 m_pendingTask->clearTaskInfo();
806 m_pendingTask.clear();
807 }
750 808
751 // 2 - If there are any tasks from the media element's media element event t ask source in 809 // 2 - If there are any tasks from the media element's media element event t ask source in
752 // one of the task queues, then remove those tasks. 810 // one of the task queues, then remove those tasks.
753 cancelPendingEventsAndCallbacks(); 811 cancelPendingEventsAndCallbacks();
754 812
755 rejectPlayPromises(AbortError, "The play() request was interrupted by a new load request."); 813 rejectPlayPromises(AbortError, "The play() request was interrupted by a new load request.");
756 814
757 // 3 - If the media element's networkState is set to NETWORK_LOADING or NETW ORK_IDLE, queue 815 // 3 - If the media element's networkState is set to NETWORK_LOADING or NETW ORK_IDLE, queue
758 // a task to fire a simple event named abort at the media element. 816 // a task to fire a simple event named abort at the media element.
759 if (m_networkState == NETWORK_LOADING || m_networkState == NETWORK_IDLE) 817 if (m_networkState == NETWORK_LOADING || m_networkState == NETWORK_IDLE)
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 // so they are closer to the relevant spec steps. 884 // so they are closer to the relevant spec steps.
827 m_lastSeekTime = 0; 885 m_lastSeekTime = 0;
828 m_duration = std::numeric_limits<double>::quiet_NaN(); 886 m_duration = std::numeric_limits<double>::quiet_NaN();
829 887
830 // 3 - Set the media element's delaying-the-load-event flag to true (this de lays the load event) 888 // 3 - Set the media element's delaying-the-load-event flag to true (this de lays the load event)
831 setShouldDelayLoadEvent(true); 889 setShouldDelayLoadEvent(true);
832 if (mediaControls()) 890 if (mediaControls())
833 mediaControls()->reset(); 891 mediaControls()->reset();
834 892
835 // 4 - Await a stable state, allowing the task that invoked this algorithm t o continue 893 // 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. 894 OwnPtr<Task> task = Task::create(this);
837 // See http://crbug.com/593289 for more details. 895 m_pendingTask = task->createWeakPtr();
838 scheduleNextSourceChild(); 896 Microtask::enqueueMicrotask(task.release());
philipj_slow 2016/03/16 13:40:20 If you have a look at RTCPeerConnection.cpp and HT
philipj_slow 2016/03/16 15:35:10 OK, so one problem could be where the spec says "A
Srirama 2016/03/16 17:41:17 Infact when i started i just copied it from ImageL
philipj_slow 2016/03/17 11:30:55 OK. So this problem has come up several times rece
897 m_pendingActionFlags |= LoadMediaResource;
898 }
899
900 void HTMLMediaElement::continueResourceSelectionAlgorithm()
philipj_slow 2016/03/16 13:40:20 All of this method looks a bit strange, should it
Srirama 2016/03/16 14:25:40 Without these changes all the media/track test cas
Srirama 2016/03/16 14:35:23 loadtimer started by scheduleTextTrackResourceLoad
philipj_slow 2016/03/16 15:35:10 I think that really honorUserPreferencesForAutomat
Srirama 2016/03/16 17:41:17 Even i was going through it and wondering why it w
901 {
902 m_pendingTask.clear();
903 if (m_pendingActionFlags & LoadTextTrackResource)
904 honorUserPreferencesForAutomaticTextTrackSelection();
905
906 if (m_pendingActionFlags & LoadMediaResource) {
907 if (m_loadState == LoadingFromSourceElement)
908 loadNextSourceChild();
909 else
910 loadInternal();
911 }
912
913 m_pendingActionFlags = 0;
839 } 914 }
840 915
841 void HTMLMediaElement::loadInternal() 916 void HTMLMediaElement::loadInternal()
842 { 917 {
843 // HTMLMediaElement::textTracksAreReady will need "... the text tracks whose mode was not in the 918 // 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". 919 // disabled state when the element's resource selection algorithm last start ed".
845 m_textTracksWhenResourceSelectionBegan.clear(); 920 m_textTracksWhenResourceSelectionBegan.clear();
846 if (m_textTracks) { 921 if (m_textTracks) {
847 for (unsigned i = 0; i < m_textTracks->length(); ++i) { 922 for (unsigned i = 0; i < m_textTracks->length(); ++i) {
848 TextTrack* track = m_textTracks->anonymousIndexedGetter(i); 923 TextTrack* track = m_textTracks->anonymousIndexedGetter(i);
(...skipping 2330 matching lines...) Expand 10 before | Expand all | Expand 10 after
3179 3254
3180 // When connected to a MediaSource, e.g. setting MediaSource.duration will c ause a 3255 // When connected to a MediaSource, e.g. setting MediaSource.duration will c ause a
3181 // durationchange event to be fired. 3256 // durationchange event to be fired.
3182 if (m_mediaSource) 3257 if (m_mediaSource)
3183 return true; 3258 return true;
3184 3259
3185 // Wait for any pending events to be fired. 3260 // Wait for any pending events to be fired.
3186 if (m_asyncEventQueue->hasPendingEvents()) 3261 if (m_asyncEventQueue->hasPendingEvents())
3187 return true; 3262 return true;
3188 3263
3264 // Wait for any pending microtask to be fired.
3265 if (m_pendingTask)
3266 return true;
3267
3189 return false; 3268 return false;
3190 } 3269 }
3191 3270
3192 bool HTMLMediaElement::isFullscreen() const 3271 bool HTMLMediaElement::isFullscreen() const
3193 { 3272 {
3194 return Fullscreen::isActiveFullScreenElement(*this); 3273 return Fullscreen::isActiveFullScreenElement(*this);
3195 } 3274 }
3196 3275
3197 void HTMLMediaElement::enterFullscreen() 3276 void HTMLMediaElement::enterFullscreen()
3198 { 3277 {
(...skipping 605 matching lines...) Expand 10 before | Expand all | Expand 10 after
3804 { 3883 {
3805 visitor->trace(m_client); 3884 visitor->trace(m_client);
3806 } 3885 }
3807 3886
3808 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) 3887 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl)
3809 { 3888 {
3810 visitor->trace(m_client); 3889 visitor->trace(m_client);
3811 } 3890 }
3812 3891
3813 } // namespace blink 3892 } // 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