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

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

Issue 1522463003: Refactor resource load and resource selection algorithms as per spec (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed TODO comment Created 5 years 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 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
464 464
465 removeElementFromDocumentMap(this, &oldDocument); 465 removeElementFromDocumentMap(this, &oldDocument);
466 addElementToDocumentMap(this, &document()); 466 addElementToDocumentMap(this, &document());
467 467
468 // FIXME: This is a temporary fix to prevent this object from causing the 468 // FIXME: This is a temporary fix to prevent this object from causing the
469 // MediaPlayer to dereference LocalFrame and FrameLoader pointers from the 469 // MediaPlayer to dereference LocalFrame and FrameLoader pointers from the
470 // previous document. This restarts the load, as if the src attribute had be en set. 470 // previous document. This restarts the load, as if the src attribute had be en set.
471 // A proper fix would provide a mechanism to allow this object to refresh 471 // A proper fix would provide a mechanism to allow this object to refresh
472 // the MediaPlayer's LocalFrame and FrameLoader references on 472 // the MediaPlayer's LocalFrame and FrameLoader references on
473 // document changes so that playback can be resumed properly. 473 // document changes so that playback can be resumed properly.
474 clearMediaPlayer(LoadMediaResource); 474 m_pendingActionFlags &= ~LoadMediaResource;
philipj_slow 2015/12/11 15:01:51 This does much less than clearMediaPlayer, is the
Srirama 2015/12/11 15:05:47 resetMediaPlayerAndMediaSource is internally calle
philipj_slow 2015/12/14 14:30:40 OK, so assuming that this CL does not change any o
475 forgetResourceSpecificTracks();
475 scheduleDelayedAction(LoadMediaResource); 476 scheduleDelayedAction(LoadMediaResource);
476 477
477 // Decrement the load event delay count on oldDocument now that m_webMediaPl ayer has been destroyed 478 // Decrement the load event delay count on oldDocument now that m_webMediaPl ayer has been destroyed
478 // and there is no risk of dispatching a load event from within the destruct or. 479 // and there is no risk of dispatching a load event from within the destruct or.
479 oldDocument.decrementLoadEventDelayCount(); 480 oldDocument.decrementLoadEventDelayCount();
480 481
481 ActiveDOMObject::didMoveToNewExecutionContext(&document()); 482 ActiveDOMObject::didMoveToNewExecutionContext(&document());
482 HTMLElement::didMoveToNewDocument(oldDocument); 483 HTMLElement::didMoveToNewDocument(oldDocument);
483 } 484 }
484 485
485 bool HTMLMediaElement::supportsFocus() const 486 bool HTMLMediaElement::supportsFocus() const
486 { 487 {
487 if (ownerDocument()->isMediaDocument()) 488 if (ownerDocument()->isMediaDocument())
488 return false; 489 return false;
489 490
490 // If no controls specified, we should still be able to focus the element if it has tabIndex. 491 // If no controls specified, we should still be able to focus the element if it has tabIndex.
491 return shouldShowControls() || HTMLElement::supportsFocus(); 492 return shouldShowControls() || HTMLElement::supportsFocus();
492 } 493 }
493 494
494 bool HTMLMediaElement::isMouseFocusable() const 495 bool HTMLMediaElement::isMouseFocusable() const
495 { 496 {
496 return false; 497 return false;
497 } 498 }
498 499
499 void HTMLMediaElement::parseAttribute(const QualifiedName& name, const AtomicStr ing& oldValue, const AtomicString& value) 500 void HTMLMediaElement::parseAttribute(const QualifiedName& name, const AtomicStr ing& oldValue, const AtomicString& value)
500 { 501 {
501 if (name == srcAttr) { 502 if (name == srcAttr) {
502 // Trigger a reload, as long as the 'src' attribute is present. 503 // Trigger a reload, as long as the 'src' attribute is present.
503 if (!value.isNull()) { 504 if (!value.isNull()) {
504 clearMediaPlayer(LoadMediaResource); 505 m_pendingActionFlags &= ~LoadMediaResource;
506 forgetResourceSpecificTracks();
505 scheduleDelayedAction(LoadMediaResource); 507 scheduleDelayedAction(LoadMediaResource);
506 } 508 }
507 } else if (name == controlsAttr) { 509 } else if (name == controlsAttr) {
508 configureMediaControls(); 510 configureMediaControls();
509 } else if (name == preloadAttr) { 511 } else if (name == preloadAttr) {
510 setPlayerPreload(); 512 setPlayerPreload();
511 } else { 513 } else {
512 HTMLElement::parseAttribute(name, oldValue, value); 514 HTMLElement::parseAttribute(name, oldValue, value);
513 } 515 }
514 } 516 }
(...skipping 2464 matching lines...) Expand 10 before | Expand all | Expand 10 after
2979 audioSourceProvider().setClient(nullptr); 2981 audioSourceProvider().setClient(nullptr);
2980 #endif 2982 #endif
2981 if (m_webMediaPlayer) { 2983 if (m_webMediaPlayer) {
2982 #if ENABLE(WEB_AUDIO) 2984 #if ENABLE(WEB_AUDIO)
2983 m_audioSourceProvider.wrap(nullptr); 2985 m_audioSourceProvider.wrap(nullptr);
2984 #endif 2986 #endif
2985 m_webMediaPlayer.clear(); 2987 m_webMediaPlayer.clear();
2986 } 2988 }
2987 } 2989 }
2988 2990
2989 void HTMLMediaElement::clearMediaPlayer(int flags)
2990 {
2991 forgetResourceSpecificTracks();
2992
2993 closeMediaSource();
2994
2995 cancelDeferredLoad();
2996
2997 {
2998 AudioSourceProviderClientLockScope scope(*this);
2999 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
3000 }
3001
3002 stopPeriodicTimers();
3003 m_loadTimer.stop();
3004
3005 m_pendingActionFlags &= ~flags;
3006 m_loadState = WaitingForSource;
3007
3008 // We can't cast if we don't have a media player.
3009 m_remoteRoutesAvailable = false;
3010 m_playingRemotely = false;
3011 if (mediaControls())
3012 mediaControls()->refreshCastButtonVisibilityWithoutUpdate();
3013
3014 if (layoutObject())
3015 layoutObject()->setShouldDoFullPaintInvalidation();
3016 }
3017
3018 void HTMLMediaElement::stop() 2991 void HTMLMediaElement::stop()
3019 { 2992 {
3020 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this); 2993 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this);
3021 2994
3022 recordMetricsIfPausing(); 2995 recordMetricsIfPausing();
3023 2996
3024 // Close the async event queue so that no events are enqueued. 2997 // Close the async event queue so that no events are enqueued.
3025 cancelPendingEventsAndCallbacks(); 2998 cancelPendingEventsAndCallbacks();
3026 m_asyncEventQueue->close(); 2999 m_asyncEventQueue->close();
3027 3000
3028 // Stop the playback without generating events 3001 // Stop the playback without generating events
3029 clearMediaPlayer(-1); 3002 resetMediaPlayerAndMediaSource();
3003 forgetResourceSpecificTracks();
3004 m_loadTimer.stop();
3005 m_pendingActionFlags = 0;
3006 m_loadState = WaitingForSource;
3030 m_readyState = HAVE_NOTHING; 3007 m_readyState = HAVE_NOTHING;
3031 m_readyStateMaximum = HAVE_NOTHING; 3008 m_readyStateMaximum = HAVE_NOTHING;
3032 setNetworkState(NETWORK_EMPTY); 3009 setNetworkState(NETWORK_EMPTY);
3033 setShouldDelayLoadEvent(false); 3010 setShouldDelayLoadEvent(false);
3034 m_currentSourceNode = nullptr; 3011 m_currentSourceNode = nullptr;
3035 invalidateCachedTime(); 3012 invalidateCachedTime();
3036 cueTimeline().updateActiveCues(0); 3013 cueTimeline().updateActiveCues(0);
3037 m_playing = false; 3014 m_playing = false;
3038 m_paused = true; 3015 m_paused = true;
3039 m_seeking = false; 3016 m_seeking = false;
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after
3384 } 3361 }
3385 3362
3386 void* HTMLMediaElement::preDispatchEventHandler(Event* event) 3363 void* HTMLMediaElement::preDispatchEventHandler(Event* event)
3387 { 3364 {
3388 if (event && event->type() == EventTypeNames::webkitfullscreenchange) 3365 if (event && event->type() == EventTypeNames::webkitfullscreenchange)
3389 configureMediaControls(); 3366 configureMediaControls();
3390 3367
3391 return nullptr; 3368 return nullptr;
3392 } 3369 }
3393 3370
3394 // TODO(srirama.m): Refactor this and clearMediaPlayer to the extent possible.
3395 void HTMLMediaElement::resetMediaPlayerAndMediaSource() 3371 void HTMLMediaElement::resetMediaPlayerAndMediaSource()
3396 { 3372 {
3397 closeMediaSource(); 3373 closeMediaSource();
3398 3374
3399 { 3375 {
3400 AudioSourceProviderClientLockScope scope(*this); 3376 AudioSourceProviderClientLockScope scope(*this);
3401 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); 3377 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking();
3402 } 3378 }
3403 3379
3404 // We haven't yet found out if any remote routes are available. 3380 // We haven't yet found out if any remote routes are available.
3405 m_remoteRoutesAvailable = false; 3381 m_remoteRoutesAvailable = false;
3406 m_playingRemotely = false; 3382 m_playingRemotely = false;
3407 3383
3408 #if ENABLE(WEB_AUDIO) 3384 #if ENABLE(WEB_AUDIO)
3409 if (m_audioSourceNode) 3385 if (m_audioSourceNode)
3410 audioSourceProvider().setClient(m_audioSourceNode); 3386 audioSourceProvider().setClient(m_audioSourceNode);
3411 #endif 3387 #endif
3388 if (mediaControls())
3389 mediaControls()->refreshCastButtonVisibilityWithoutUpdate();
3390 if (layoutObject())
3391 layoutObject()->setShouldDoFullPaintInvalidation();
3412 } 3392 }
3413 3393
3414 #if ENABLE(WEB_AUDIO) 3394 #if ENABLE(WEB_AUDIO)
3415 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) 3395 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode)
3416 { 3396 {
3417 ASSERT(isMainThread()); 3397 ASSERT(isMainThread());
3418 m_audioSourceNode = sourceNode; 3398 m_audioSourceNode = sourceNode;
3419 3399
3420 AudioSourceProviderClientLockScope scope(*this); 3400 AudioSourceProviderClientLockScope scope(*this);
3421 audioSourceProvider().setClient(m_audioSourceNode); 3401 audioSourceProvider().setClient(m_audioSourceNode);
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
3632 visitor->trace(m_client); 3612 visitor->trace(m_client);
3633 } 3613 }
3634 3614
3635 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl) 3615 DEFINE_TRACE(HTMLMediaElement::AudioSourceProviderImpl)
3636 { 3616 {
3637 visitor->trace(m_client); 3617 visitor->trace(m_client);
3638 } 3618 }
3639 #endif 3619 #endif
3640 3620
3641 } 3621 }
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