Index: third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
diff --git a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
index 3bae974c27f776b7d77c0d3f2de88d5fd937df28..1615b92f34acfa37e1ef7363aebd4d236d264cf1 100644 |
--- a/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
+++ b/third_party/WebKit/Source/core/html/HTMLMediaElement.cpp |
@@ -384,13 +384,6 @@ HTMLMediaElement::~HTMLMediaElement() |
removeElementFromDocumentMap(this, &document()); |
// Destroying the player may cause a resource load to be canceled, |
- // which could result in userCancelledLoad() being called back. |
- // Setting m_isFinalizing ensures that such a call will not cause |
- // us to dispatch an abort event, which would result in a crash. |
- // See http://crbug.com/233654 for more details. |
- m_isFinalizing = true; |
- |
- // Destroying the player may cause a resource load to be canceled, |
// which could result in Document::dispatchWindowLoadEvent() being |
// called via ResourceFetch::didLoadResource() then |
// FrameLoader::checkCompleted(). To prevent load event dispatching during |
@@ -474,10 +467,12 @@ void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) |
// FIXME: This is a temporary fix to prevent this object from causing the |
// MediaPlayer to dereference LocalFrame and FrameLoader pointers from the |
- // previous document. A proper fix would provide a mechanism to allow this |
- // object to refresh the MediaPlayer's LocalFrame and FrameLoader references on |
+ // previous document. This restarts the load, as if the src attribute had been set. |
+ // A proper fix would provide a mechanism to allow this object to refresh |
+ // the MediaPlayer's LocalFrame and FrameLoader references on |
// document changes so that playback can be resumed properly. |
- userCancelledLoad(); |
+ clearMediaPlayer(LoadMediaResource); |
+ scheduleDelayedAction(LoadMediaResource); |
// Decrement the load event delay count on oldDocument now that m_webMediaPlayer has been destroyed |
// and there is no risk of dispatching a load event from within the destructor. |
@@ -2975,50 +2970,6 @@ void HTMLMediaElement::stopPeriodicTimers() |
m_playbackProgressTimer.stop(); |
} |
-void HTMLMediaElement::userCancelledLoad() |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::userCancelledLoad(%p)", this); |
- |
- // If the media data fetching process is aborted by the user: |
- |
- // 1 - The user agent should cancel the fetching process. |
- clearMediaPlayer(-1); |
- // Reset m_readyState and m_readyStateMaximum since m_webMediaPlayer is gone. |
- ReadyState readyState = m_readyState; |
- m_readyState = HAVE_NOTHING; |
- m_readyStateMaximum = HAVE_NOTHING; |
- |
- // TODO(srirama.m): Investigate if this condition can be dropped entirely without any issues. |
- if (m_networkState == NETWORK_EMPTY || m_completelyLoaded || m_isFinalizing) |
- return; |
- |
- // 2 - Set the error attribute to a new MediaError object whose code attribute is set to MEDIA_ERR_ABORTED. |
- m_error = MediaError::create(MediaError::MEDIA_ERR_ABORTED); |
- |
- // 3 - Queue a task to fire a simple event named error at the media element. |
- scheduleEvent(EventTypeNames::abort); |
- |
- // 4 - If the media element's readyState attribute has a value equal to HAVE_NOTHING, set the |
- // element's networkState attribute to the NETWORK_EMPTY value and queue a task to fire a |
- // simple event named emptied at the element. Otherwise, set the element's networkState |
- // attribute to the NETWORK_IDLE value. |
- if (readyState == HAVE_NOTHING) { |
- setNetworkState(NETWORK_EMPTY); |
- scheduleEvent(EventTypeNames::emptied); |
- } else { |
- setNetworkState(NETWORK_IDLE); |
- } |
- |
- // 5 - Set the element's delaying-the-load-event flag to false. This stops delaying the load event. |
- setShouldDelayLoadEvent(false); |
- |
- // 6 - Abort the overall resource selection algorithm. |
- m_currentSourceNode = nullptr; |
- |
- invalidateCachedTime(); |
- cueTimeline().updateActiveCues(0); |
-} |
- |
void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLocking() |
{ |
#if ENABLE(WEB_AUDIO) |
@@ -3067,13 +3018,19 @@ void HTMLMediaElement::stop() |
recordMetricsIfPausing(); |
- // Close the async event queue so that no events are enqueued by userCancelledLoad. |
+ // Close the async event queue so that no events are enqueued. |
cancelPendingEventsAndCallbacks(); |
m_asyncEventQueue->close(); |
- userCancelledLoad(); |
- |
// Stop the playback without generating events |
+ clearMediaPlayer(-1); |
+ m_readyState = HAVE_NOTHING; |
+ m_readyStateMaximum = HAVE_NOTHING; |
+ setNetworkState(NETWORK_EMPTY); |
+ setShouldDelayLoadEvent(false); |
+ m_currentSourceNode = nullptr; |
+ invalidateCachedTime(); |
+ cueTimeline().updateActiveCues(0); |
m_playing = false; |
m_paused = true; |
m_seeking = false; |