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

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

Issue 1055503002: Eliminate MediaPlayer & MediaPlayerClient abstractions (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix linking error Created 5 years, 5 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 #include "core/html/track/InbandTextTrack.h" 57 #include "core/html/track/InbandTextTrack.h"
58 #include "core/html/track/TextTrackContainer.h" 58 #include "core/html/track/TextTrackContainer.h"
59 #include "core/html/track/TextTrackList.h" 59 #include "core/html/track/TextTrackList.h"
60 #include "core/html/track/VideoTrack.h" 60 #include "core/html/track/VideoTrack.h"
61 #include "core/html/track/VideoTrackList.h" 61 #include "core/html/track/VideoTrackList.h"
62 #include "core/inspector/ConsoleMessage.h" 62 #include "core/inspector/ConsoleMessage.h"
63 #include "core/layout/LayoutVideo.h" 63 #include "core/layout/LayoutVideo.h"
64 #include "core/layout/LayoutView.h" 64 #include "core/layout/LayoutView.h"
65 #include "core/layout/compositing/DeprecatedPaintLayerCompositor.h" 65 #include "core/layout/compositing/DeprecatedPaintLayerCompositor.h"
66 #include "core/loader/FrameLoader.h" 66 #include "core/loader/FrameLoader.h"
67 #include "core/loader/FrameLoaderClient.h"
67 #include "platform/ContentType.h" 68 #include "platform/ContentType.h"
68 #include "platform/Logging.h" 69 #include "platform/Logging.h"
69 #include "platform/MIMETypeFromURL.h" 70 #include "platform/MIMETypeFromURL.h"
70 #include "platform/MIMETypeRegistry.h" 71 #include "platform/MIMETypeRegistry.h"
71 #include "platform/RuntimeEnabledFeatures.h" 72 #include "platform/RuntimeEnabledFeatures.h"
72 #include "platform/UserGestureIndicator.h" 73 #include "platform/UserGestureIndicator.h"
74 #include "platform/audio/AudioBus.h"
75 #include "platform/audio/AudioSourceProviderClient.h"
73 #include "platform/graphics/GraphicsLayer.h" 76 #include "platform/graphics/GraphicsLayer.h"
74 #include "platform/weborigin/SecurityOrigin.h" 77 #include "platform/weborigin/SecurityOrigin.h"
75 #include "public/platform/Platform.h" 78 #include "public/platform/Platform.h"
79 #include "public/platform/WebAudioSourceProvider.h"
76 #include "public/platform/WebContentDecryptionModule.h" 80 #include "public/platform/WebContentDecryptionModule.h"
77 #include "public/platform/WebInbandTextTrack.h" 81 #include "public/platform/WebInbandTextTrack.h"
78 #include "wtf/CurrentTime.h" 82 #include "wtf/CurrentTime.h"
79 #include "wtf/MainThread.h" 83 #include "wtf/MainThread.h"
80 #include "wtf/MathExtras.h" 84 #include "wtf/MathExtras.h"
81 #include "wtf/text/CString.h" 85 #include "wtf/text/CString.h"
82 #include <limits> 86 #include <limits>
83 87
84 #if ENABLE(WEB_AUDIO) 88 #if ENABLE(WEB_AUDIO)
85 #include "platform/audio/AudioSourceProvider.h" 89 #include "platform/audio/AudioSourceProvider.h"
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 } 479 }
476 #endif 480 #endif
477 481
478 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) 482 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument)
479 { 483 {
480 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument(%p)", this); 484 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument(%p)", this);
481 485
482 if (m_shouldDelayLoadEvent) { 486 if (m_shouldDelayLoadEvent) {
483 document().incrementLoadEventDelayCount(); 487 document().incrementLoadEventDelayCount();
484 // Note: Keeping the load event delay count increment on oldDocument tha t was added 488 // Note: Keeping the load event delay count increment on oldDocument tha t was added
485 // when m_shouldDelayLoadEvent was set so that destruction of m_player c an not 489 // when m_shouldDelayLoadEvent was set so that destruction of m_webMedia Player can not
486 // cause load event dispatching in oldDocument. 490 // cause load event dispatching in oldDocument.
487 } else { 491 } else {
488 // Incrementing the load event delay count so that destruction of m_play er can not 492 // Incrementing the load event delay count so that destruction of m_webM ediaPlayer can not
489 // cause load event dispatching in oldDocument. 493 // cause load event dispatching in oldDocument.
490 oldDocument.incrementLoadEventDelayCount(); 494 oldDocument.incrementLoadEventDelayCount();
491 } 495 }
492 496
493 removeElementFromDocumentMap(this, &oldDocument); 497 removeElementFromDocumentMap(this, &oldDocument);
494 addElementToDocumentMap(this, &document()); 498 addElementToDocumentMap(this, &document());
495 499
496 // FIXME: This is a temporary fix to prevent this object from causing the 500 // FIXME: This is a temporary fix to prevent this object from causing the
497 // MediaPlayer to dereference LocalFrame and FrameLoader pointers from the 501 // MediaPlayer to dereference LocalFrame and FrameLoader pointers from the
498 // previous document. A proper fix would provide a mechanism to allow this 502 // previous document. A proper fix would provide a mechanism to allow this
499 // object to refresh the MediaPlayer's LocalFrame and FrameLoader references on 503 // object to refresh the MediaPlayer's LocalFrame and FrameLoader references on
500 // document changes so that playback can be resumed properly. 504 // document changes so that playback can be resumed properly.
501 userCancelledLoad(); 505 userCancelledLoad();
502 506
503 // Decrement the load event delay count on oldDocument now that m_player has been destroyed 507 // Decrement the load event delay count on oldDocument now that m_webMediaPl ayer has been destroyed
504 // and there is no risk of dispatching a load event from within the destruct or. 508 // and there is no risk of dispatching a load event from within the destruct or.
505 oldDocument.decrementLoadEventDelayCount(); 509 oldDocument.decrementLoadEventDelayCount();
506 510
507 ActiveDOMObject::didMoveToNewExecutionContext(&document()); 511 ActiveDOMObject::didMoveToNewExecutionContext(&document());
508 HTMLElement::didMoveToNewDocument(oldDocument); 512 HTMLElement::didMoveToNewDocument(oldDocument);
509 } 513 }
510 514
511 bool HTMLMediaElement::supportsFocus() const 515 bool HTMLMediaElement::supportsFocus() const
512 { 516 {
513 if (ownerDocument()->isMediaDocument()) 517 if (ownerDocument()->isMediaDocument())
(...skipping 12 matching lines...) Expand all
526 { 530 {
527 if (name == srcAttr) { 531 if (name == srcAttr) {
528 // Trigger a reload, as long as the 'src' attribute is present. 532 // Trigger a reload, as long as the 'src' attribute is present.
529 if (!value.isNull()) { 533 if (!value.isNull()) {
530 clearMediaPlayer(LoadMediaResource); 534 clearMediaPlayer(LoadMediaResource);
531 scheduleDelayedAction(LoadMediaResource); 535 scheduleDelayedAction(LoadMediaResource);
532 } 536 }
533 } else if (name == controlsAttr) { 537 } else if (name == controlsAttr) {
534 configureMediaControls(); 538 configureMediaControls();
535 } else if (name == preloadAttr) { 539 } else if (name == preloadAttr) {
536 if (m_player) 540 setPlayerPreload();
537 setPlayerPreload();
538 } else if (name == mediagroupAttr && RuntimeEnabledFeatures::mediaController Enabled()) { 541 } else if (name == mediagroupAttr && RuntimeEnabledFeatures::mediaController Enabled()) {
539 setMediaGroup(value); 542 setMediaGroup(value);
540 } else { 543 } else {
541 HTMLElement::parseAttribute(name, value); 544 HTMLElement::parseAttribute(name, value);
542 } 545 }
543 } 546 }
544 547
545 void HTMLMediaElement::finishParsingChildren() 548 void HTMLMediaElement::finishParsingChildren()
546 { 549 {
547 HTMLElement::finishParsingChildren(); 550 HTMLElement::finishParsingChildren();
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
972 m_mediaSource = nullptr; 975 m_mediaSource = nullptr;
973 attemptLoad = false; 976 attemptLoad = false;
974 } 977 }
975 } 978 }
976 } 979 }
977 } 980 }
978 981
979 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { 982 if (attemptLoad && canLoadURL(url, contentType, keySystem)) {
980 ASSERT(!webMediaPlayer()); 983 ASSERT(!webMediaPlayer());
981 984
982 if (!m_havePreparedToPlay && !autoplay() && preloadType() == MediaPlayer ::None) { 985 if (!m_havePreparedToPlay && !autoplay() && preloadType() == WebMediaPla yer::PreloadNone) {
983 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this); 986 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this);
984 deferLoad(); 987 deferLoad();
985 } else { 988 } else {
986 startPlayerLoad(); 989 startPlayerLoad();
987 } 990 }
988 } else { 991 } else {
989 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); 992 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
990 } 993 }
991 994
992 // If there is no poster to display, allow the media engine to render video frames as soon as 995 // If there is no poster to display, allow the media engine to render video frames as soon as
993 // they are available. 996 // they are available.
994 updateDisplayState(); 997 updateDisplayState();
995 998
996 if (layoutObject()) 999 if (layoutObject())
997 layoutObject()->updateFromElement(); 1000 layoutObject()->updateFromElement();
998 } 1001 }
999 1002
1000 void HTMLMediaElement::startPlayerLoad() 1003 void HTMLMediaElement::startPlayerLoad()
1001 { 1004 {
1005 ASSERT(!m_webMediaPlayer);
1002 // Filter out user:pass as those two URL components aren't 1006 // Filter out user:pass as those two URL components aren't
1003 // considered for media resource fetches (including for the CORS 1007 // considered for media resource fetches (including for the CORS
1004 // use-credentials mode.) That behavior aligns with Gecko, with IE 1008 // use-credentials mode.) That behavior aligns with Gecko, with IE
1005 // being more restrictive and not allowing fetches to such URLs. 1009 // being more restrictive and not allowing fetches to such URLs.
1006 // 1010 //
1007 // Spec reference: http://whatwg.org/c/#concept-media-load-resource 1011 // Spec reference: http://whatwg.org/c/#concept-media-load-resource
1008 // 1012 //
1009 // FIXME: when the HTML spec switches to specifying resource 1013 // FIXME: when the HTML spec switches to specifying resource
1010 // fetches in terms of Fetch (http://fetch.spec.whatwg.org), and 1014 // fetches in terms of Fetch (http://fetch.spec.whatwg.org), and
1011 // along with that potentially also specifying a setting for its 1015 // along with that potentially also specifying a setting for its
1012 // 'authentication flag' to control how user:pass embedded in a 1016 // 'authentication flag' to control how user:pass embedded in a
1013 // media resource URL should be treated, then update the handling 1017 // media resource URL should be treated, then update the handling
1014 // here to match. 1018 // here to match.
1015 KURL requestURL = m_currentSrc; 1019 KURL requestURL = m_currentSrc;
1016 if (!requestURL.user().isEmpty()) 1020 if (!requestURL.user().isEmpty())
1017 requestURL.setUser(String()); 1021 requestURL.setUser(String());
1018 if (!requestURL.pass().isEmpty()) 1022 if (!requestURL.pass().isEmpty())
1019 requestURL.setPass(String()); 1023 requestURL.setPass(String());
1020 1024
1021 m_player->load(loadType(), requestURL, corsMode()); 1025 LocalFrame* frame = document().frame();
1026 // TODO(srirama.m): Figure out how frame can be null when
1027 // coming from executeDeferredLoad()
1028 if (!frame) {
1029 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
1030 return;
1031 }
1032
1033 KURL kurl(ParsedURLString, requestURL);
1034 m_webMediaPlayer = frame->loader().client()->createWebMediaPlayer(this, kurl );
1035 if (!m_webMediaPlayer) {
1036 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
1037 return;
1038 }
1039
1040 if (layoutObject())
1041 layoutObject()->setShouldDoFullPaintInvalidation();
1042 #if ENABLE(WEB_AUDIO)
1043 // Make sure if we create/re-create the WebMediaPlayer that we update our wr apper.
1044 m_audioSourceProvider.wrap(m_webMediaPlayer->audioSourceProvider());
1045 #endif
1046 m_webMediaPlayer->setVolume(effectiveMediaVolume());
1047
1048 m_webMediaPlayer->setPoster(posterImageURL());
1049
1050 m_webMediaPlayer->setPreload(effectivePreloadType());
1051
1052 m_webMediaPlayer->load(loadType(), kurl, corsMode());
1053
1054 if (isFullscreen())
1055 m_webMediaPlayer->enterFullscreen();
1022 } 1056 }
1023 1057
1024 void HTMLMediaElement::setPlayerPreload() 1058 void HTMLMediaElement::setPlayerPreload()
1025 { 1059 {
1026 m_player->setPreload(effectivePreloadType()); 1060 if (m_webMediaPlayer)
1061 m_webMediaPlayer->setPreload(effectivePreloadType());
1027 1062
1028 if (loadIsDeferred() && preloadType() != MediaPlayer::None) 1063 if (loadIsDeferred() && preloadType() != WebMediaPlayer::PreloadNone)
1029 startDeferredLoad(); 1064 startDeferredLoad();
1030 } 1065 }
1031 1066
1032 bool HTMLMediaElement::loadIsDeferred() const 1067 bool HTMLMediaElement::loadIsDeferred() const
1033 { 1068 {
1034 return m_deferredLoadState != NotDeferred; 1069 return m_deferredLoadState != NotDeferred;
1035 } 1070 }
1036 1071
1037 void HTMLMediaElement::deferLoad() 1072 void HTMLMediaElement::deferLoad()
1038 { 1073 {
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 1317
1283 void HTMLMediaElement::cancelPendingEventsAndCallbacks() 1318 void HTMLMediaElement::cancelPendingEventsAndCallbacks()
1284 { 1319 {
1285 WTF_LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks(%p)", this ); 1320 WTF_LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks(%p)", this );
1286 m_asyncEventQueue->cancelAllEvents(); 1321 m_asyncEventQueue->cancelAllEvents();
1287 1322
1288 for (HTMLSourceElement* source = Traversal<HTMLSourceElement>::firstChild(*t his); source; source = Traversal<HTMLSourceElement>::nextSibling(*source)) 1323 for (HTMLSourceElement* source = Traversal<HTMLSourceElement>::firstChild(*t his); source; source = Traversal<HTMLSourceElement>::nextSibling(*source))
1289 source->cancelPendingErrorEvent(); 1324 source->cancelPendingErrorEvent();
1290 } 1325 }
1291 1326
1292 void HTMLMediaElement::mediaPlayerNetworkStateChanged() 1327 void HTMLMediaElement::networkStateChanged()
1293 { 1328 {
1294 setNetworkState(webMediaPlayer()->networkState()); 1329 setNetworkState(webMediaPlayer()->networkState());
1295 } 1330 }
1296 1331
1297 void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error) 1332 void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error)
1298 { 1333 {
1299 stopPeriodicTimers(); 1334 stopPeriodicTimers();
1300 1335
1301 // If we failed while trying to load a <source> element, the movie was never parsed, and there are more 1336 // If we failed while trying to load a <source> element, the movie was never parsed, and there are more
1302 // <source> children, schedule the next one 1337 // <source> children, schedule the next one
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1373 1408
1374 if (state == WebMediaPlayer::NetworkStateLoaded) { 1409 if (state == WebMediaPlayer::NetworkStateLoaded) {
1375 if (m_networkState != NETWORK_IDLE) 1410 if (m_networkState != NETWORK_IDLE)
1376 changeNetworkStateFromLoadingToIdle(); 1411 changeNetworkStateFromLoadingToIdle();
1377 m_completelyLoaded = true; 1412 m_completelyLoaded = true;
1378 } 1413 }
1379 } 1414 }
1380 1415
1381 void HTMLMediaElement::changeNetworkStateFromLoadingToIdle() 1416 void HTMLMediaElement::changeNetworkStateFromLoadingToIdle()
1382 { 1417 {
1383 ASSERT(m_player);
1384 m_progressEventTimer.stop(); 1418 m_progressEventTimer.stop();
1385 1419
1386 // Schedule one last progress event so we guarantee that at least one is fir ed 1420 // Schedule one last progress event so we guarantee that at least one is fir ed
1387 // for files that load very quickly. 1421 // for files that load very quickly.
1388 if (webMediaPlayer() && webMediaPlayer()->didLoadingProgress()) 1422 if (webMediaPlayer() && webMediaPlayer()->didLoadingProgress())
1389 scheduleEvent(EventTypeNames::progress); 1423 scheduleEvent(EventTypeNames::progress);
1390 scheduleEvent(EventTypeNames::suspend); 1424 scheduleEvent(EventTypeNames::suspend);
1391 m_networkState = NETWORK_IDLE; 1425 m_networkState = NETWORK_IDLE;
1392 } 1426 }
1393 1427
1394 void HTMLMediaElement::mediaPlayerReadyStateChanged() 1428 void HTMLMediaElement::readyStateChanged()
1395 { 1429 {
1396 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); 1430 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState()));
1397 } 1431 }
1398 1432
1399 void HTMLMediaElement::setReadyState(ReadyState state) 1433 void HTMLMediaElement::setReadyState(ReadyState state)
1400 { 1434 {
1401 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%p, %d) - current state is % d,", this, static_cast<int>(state), static_cast<int>(m_readyState)); 1435 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%p, %d) - current state is % d,", this, static_cast<int>(state), static_cast<int>(m_readyState));
1402 1436
1403 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay ing() uses it 1437 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay ing() uses it
1404 bool wasPotentiallyPlaying = potentiallyPlaying(); 1438 bool wasPotentiallyPlaying = potentiallyPlaying();
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 mediaControls()->refreshClosedCaptionsButtonVisibility(); 1576 mediaControls()->refreshClosedCaptionsButtonVisibility();
1543 } 1577 }
1544 1578
1545 updatePlayState(); 1579 updatePlayState();
1546 updateMediaController(); 1580 updateMediaController();
1547 cueTimeline().updateActiveCues(currentTime()); 1581 cueTimeline().updateActiveCues(currentTime());
1548 } 1582 }
1549 1583
1550 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) 1584 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*)
1551 { 1585 {
1552 ASSERT(m_player);
1553 if (m_networkState != NETWORK_LOADING) 1586 if (m_networkState != NETWORK_LOADING)
1554 return; 1587 return;
1555 1588
1556 double time = WTF::currentTime(); 1589 double time = WTF::currentTime();
1557 double timedelta = time - m_previousProgressTime; 1590 double timedelta = time - m_previousProgressTime;
1558 1591
1559 if (webMediaPlayer() && webMediaPlayer()->didLoadingProgress()) { 1592 if (webMediaPlayer() && webMediaPlayer()->didLoadingProgress()) {
1560 scheduleEvent(EventTypeNames::progress); 1593 scheduleEvent(EventTypeNames::progress);
1561 m_previousProgressTime = time; 1594 m_previousProgressTime = time;
1562 m_sentStalledEvent = false; 1595 m_sentStalledEvent = false;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 1628
1596 void HTMLMediaElement::seek(double time) 1629 void HTMLMediaElement::seek(double time)
1597 { 1630 {
1598 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f)", this, time); 1631 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f)", this, time);
1599 1632
1600 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps. 1633 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps.
1601 if (m_readyState == HAVE_NOTHING) 1634 if (m_readyState == HAVE_NOTHING)
1602 return; 1635 return;
1603 1636
1604 // If the media engine has been told to postpone loading data, let it go ahe ad now. 1637 // If the media engine has been told to postpone loading data, let it go ahe ad now.
1605 if (preloadType() < MediaPlayer::Auto && m_readyState < HAVE_FUTURE_DATA) 1638 if (preloadType() < WebMediaPlayer::PreloadAuto && m_readyState < HAVE_FUTUR E_DATA)
1606 prepareToPlay(); 1639 prepareToPlay();
1607 1640
1608 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set. 1641 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set.
1609 refreshCachedTime(); 1642 refreshCachedTime();
1610 // This is needed to avoid getting default playback start position from curr entTime(). 1643 // This is needed to avoid getting default playback start position from curr entTime().
1611 double now = m_cachedTime; 1644 double now = m_cachedTime;
1612 1645
1613 // 3 - If the element's seeking IDL attribute is true, then another instance of this algorithm is 1646 // 3 - If the element's seeking IDL attribute is true, then another instance of this algorithm is
1614 // already running. Abort that other instance of the algorithm without waiti ng for the step that 1647 // already running. Abort that other instance of the algorithm without waiti ng for the step that
1615 // it is running to complete. 1648 // it is running to complete.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1769 if (m_readyState == HAVE_NOTHING) { 1802 if (m_readyState == HAVE_NOTHING) {
1770 m_defaultPlaybackStartPosition = time; 1803 m_defaultPlaybackStartPosition = time;
1771 return; 1804 return;
1772 } 1805 }
1773 1806
1774 seek(time); 1807 seek(time);
1775 } 1808 }
1776 1809
1777 double HTMLMediaElement::duration() const 1810 double HTMLMediaElement::duration() const
1778 { 1811 {
1779 // FIXME: remove m_player check once we figure out how m_player is going 1812 // FIXME: remove m_webMediaPlayer check once we figure out how
1780 // out of sync with readystate. m_player is cleared but readystate is not se t 1813 // m_webMediaPlayer is going out of sync with readystate.
1781 // to HAVE_NOTHING 1814 // m_webMediaPlayer is cleared but readystate is not set to HAVE_NOTHING.
1782 if (!m_player || m_readyState < HAVE_METADATA) 1815 if (!m_webMediaPlayer || m_readyState < HAVE_METADATA)
1783 return std::numeric_limits<double>::quiet_NaN(); 1816 return std::numeric_limits<double>::quiet_NaN();
1784 1817
1785 // FIXME: Refactor so m_duration is kept current (in both MSE and 1818 // FIXME: Refactor so m_duration is kept current (in both MSE and
1786 // non-MSE cases) once we have transitioned from HAVE_NOTHING -> 1819 // non-MSE cases) once we have transitioned from HAVE_NOTHING ->
1787 // HAVE_METADATA. Currently, m_duration may be out of date for at least MSE 1820 // HAVE_METADATA. Currently, m_duration may be out of date for at least MSE
1788 // case because MediaSource and SourceBuffer do not notify the element 1821 // case because MediaSource and SourceBuffer do not notify the element
1789 // directly upon duration changes caused by endOfStream, remove, or append 1822 // directly upon duration changes caused by endOfStream, remove, or append
1790 // operations; rather the notification is triggered by the WebMediaPlayer 1823 // operations; rather the notification is triggered by the WebMediaPlayer
1791 // implementation observing that the underlying engine has updated duration 1824 // implementation observing that the underlying engine has updated duration
1792 // and notifying the element to consult its MediaSource for current 1825 // and notifying the element to consult its MediaSource for current
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1841 } 1874 }
1842 1875
1843 HTMLMediaElement::DirectionOfPlayback HTMLMediaElement::directionOfPlayback() co nst 1876 HTMLMediaElement::DirectionOfPlayback HTMLMediaElement::directionOfPlayback() co nst
1844 { 1877 {
1845 return m_playbackRate >= 0 ? Forward : Backward; 1878 return m_playbackRate >= 0 ? Forward : Backward;
1846 } 1879 }
1847 1880
1848 void HTMLMediaElement::updatePlaybackRate() 1881 void HTMLMediaElement::updatePlaybackRate()
1849 { 1882 {
1850 double effectiveRate = effectivePlaybackRate(); 1883 double effectiveRate = effectivePlaybackRate();
1851 if (m_player && potentiallyPlaying()) 1884 // FIXME: remove m_webMediaPlayer check once we figure out how
1885 // m_webMediaPlayer is going out of sync with readystate.
1886 // m_webMediaPlayer is cleared but readystate is not set to HAVE_NOTHING.
1887 if (m_webMediaPlayer && potentiallyPlaying())
1852 webMediaPlayer()->setRate(effectiveRate); 1888 webMediaPlayer()->setRate(effectiveRate);
1853 } 1889 }
1854 1890
1855 bool HTMLMediaElement::ended() const 1891 bool HTMLMediaElement::ended() const
1856 { 1892 {
1857 // 4.8.10.8 Playing the media resource 1893 // 4.8.10.8 Playing the media resource
1858 // The ended attribute must return true if the media element has ended 1894 // The ended attribute must return true if the media element has ended
1859 // playback and the direction of playback is forwards, and false otherwise. 1895 // playback and the direction of playback is forwards, and false otherwise.
1860 return endedPlayback() && directionOfPlayback() == Forward; 1896 return endedPlayback() && directionOfPlayback() == Forward;
1861 } 1897 }
1862 1898
1863 bool HTMLMediaElement::autoplay() const 1899 bool HTMLMediaElement::autoplay() const
1864 { 1900 {
1865 return fastHasAttribute(autoplayAttr); 1901 return fastHasAttribute(autoplayAttr);
1866 } 1902 }
1867 1903
1868 String HTMLMediaElement::preload() const 1904 String HTMLMediaElement::preload() const
1869 { 1905 {
1870 switch (preloadType()) { 1906 switch (preloadType()) {
1871 case MediaPlayer::None: 1907 case WebMediaPlayer::PreloadNone:
1872 return "none"; 1908 return "none";
1873 case MediaPlayer::MetaData: 1909 case WebMediaPlayer::PreloadMetaData:
1874 return "metadata"; 1910 return "metadata";
1875 case MediaPlayer::Auto: 1911 case WebMediaPlayer::PreloadAuto:
1876 return "auto"; 1912 return "auto";
1877 } 1913 }
1878 1914
1879 ASSERT_NOT_REACHED(); 1915 ASSERT_NOT_REACHED();
1880 return String(); 1916 return String();
1881 } 1917 }
1882 1918
1883 void HTMLMediaElement::setPreload(const AtomicString& preload) 1919 void HTMLMediaElement::setPreload(const AtomicString& preload)
1884 { 1920 {
1885 WTF_LOG(Media, "HTMLMediaElement::setPreload(%p, %s)", this, preload.utf8(). data()); 1921 WTF_LOG(Media, "HTMLMediaElement::setPreload(%p, %s)", this, preload.utf8(). data());
1886 setAttribute(preloadAttr, preload); 1922 setAttribute(preloadAttr, preload);
1887 } 1923 }
1888 1924
1889 MediaPlayer::Preload HTMLMediaElement::preloadType() const 1925 WebMediaPlayer::Preload HTMLMediaElement::preloadType() const
1890 { 1926 {
1891 // TODO(philipj): The spec requires case-sensitive string matching: 1927 // TODO(philipj): The spec requires case-sensitive string matching:
1892 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28951 1928 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28951
1893 const AtomicString& preload = fastGetAttribute(preloadAttr); 1929 const AtomicString& preload = fastGetAttribute(preloadAttr);
1894 if (equalIgnoringCase(preload, "none")) { 1930 if (equalIgnoringCase(preload, "none")) {
1895 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadNone); 1931 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadNone);
1896 return MediaPlayer::None; 1932 return WebMediaPlayer::PreloadNone;
1897 } 1933 }
1898 if (equalIgnoringCase(preload, "metadata")) { 1934 if (equalIgnoringCase(preload, "metadata")) {
1899 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadMetadat a); 1935 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadMetadat a);
1900 return MediaPlayer::MetaData; 1936 return WebMediaPlayer::PreloadMetaData;
1901 } 1937 }
1902 if (equalIgnoringCase(preload, "auto")) { 1938 if (equalIgnoringCase(preload, "auto")) {
1903 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadAuto); 1939 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadAuto);
1904 return MediaPlayer::Auto; 1940 return WebMediaPlayer::PreloadAuto;
1905 } 1941 }
1906 1942
1907 // "The attribute's missing value default is user-agent defined, though the 1943 // "The attribute's missing value default is user-agent defined, though the
1908 // Metadata state is suggested as a compromise between reducing server load 1944 // Metadata state is suggested as a compromise between reducing server load
1909 // and providing an optimal user experience." 1945 // and providing an optimal user experience."
1910 1946
1911 // The spec does not define an invalid value default: 1947 // The spec does not define an invalid value default:
1912 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28950 1948 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28950
1913 1949
1914 // TODO(philipj): Try to make "metadata" the default preload state: 1950 // TODO(philipj): Try to make "metadata" the default preload state:
1915 // https://crbug.com/310450 1951 // https://crbug.com/310450
1916 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadDefault); 1952 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadDefault);
1917 return MediaPlayer::Auto; 1953 return WebMediaPlayer::PreloadAuto;
1918 } 1954 }
1919 1955
1920 MediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const 1956 WebMediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const
1921 { 1957 {
1922 return autoplay() ? MediaPlayer::Auto : preloadType(); 1958 return autoplay() ? WebMediaPlayer::PreloadAuto : preloadType();
1923 } 1959 }
1924 1960
1925 void HTMLMediaElement::play() 1961 void HTMLMediaElement::play()
1926 { 1962 {
1927 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this); 1963 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this);
1928 1964
1929 if (!UserGestureIndicator::processingUserGesture()) { 1965 if (!UserGestureIndicator::processingUserGesture()) {
1930 autoplayMediaEncountered(); 1966 autoplayMediaEncountered();
1931 if (m_userGestureRequiredForPlay) { 1967 if (m_userGestureRequiredForPlay) {
1932 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture."); 1968 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture.");
1933 document().executionContext()->addConsoleMessage(ConsoleMessage::cre ate(JSMessageSource, WarningMessageLevel, message)); 1969 document().executionContext()->addConsoleMessage(ConsoleMessage::cre ate(JSMessageSource, WarningMessageLevel, message));
1934 return; 1970 return;
1935 } 1971 }
1936 } else if (m_userGestureRequiredForPlay) { 1972 } else if (m_userGestureRequiredForPlay) {
1937 if (m_autoplayMediaCounted) 1973 if (m_autoplayMediaCounted)
1938 recordAutoplayMetric(AutoplayManualStart); 1974 recordAutoplayMetric(AutoplayManualStart);
1939 m_userGestureRequiredForPlay = false; 1975 m_userGestureRequiredForPlay = false;
1940 } 1976 }
1941 1977
1942 playInternal(); 1978 playInternal();
1943 } 1979 }
1944 1980
1945 void HTMLMediaElement::playInternal() 1981 void HTMLMediaElement::playInternal()
1946 { 1982 {
1947 WTF_LOG(Media, "HTMLMediaElement::playInternal(%p)", this); 1983 WTF_LOG(Media, "HTMLMediaElement::playInternal(%p)", this);
1948 1984
1949 // 4.8.10.9. Playing the media resource 1985 // 4.8.10.9. Playing the media resource
1950 if (!m_player || m_networkState == NETWORK_EMPTY) 1986 if (m_networkState == NETWORK_EMPTY)
1951 scheduleDelayedAction(LoadMediaResource); 1987 scheduleDelayedAction(LoadMediaResource);
1952 1988
1953 // Generally "ended" and "looping" are exclusive. Here, the loop attribute 1989 // Generally "ended" and "looping" are exclusive. Here, the loop attribute
1954 // is ignored to seek back to start in case loop was set after playback 1990 // is ignored to seek back to start in case loop was set after playback
1955 // ended. See http://crbug.com/364442 1991 // ended. See http://crbug.com/364442
1956 if (endedPlayback(LoopCondition::Ignored)) 1992 if (endedPlayback(LoopCondition::Ignored))
1957 seek(0); 1993 seek(0);
1958 1994
1959 if (m_mediaController) 1995 if (m_mediaController)
1960 m_mediaController->bringElementUpToSpeed(this); 1996 m_mediaController->bringElementUpToSpeed(this);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2000 double progress = playedTime / duration(); 2036 double progress = playedTime / duration();
2001 if (progress < 0.5) 2037 if (progress < 0.5)
2002 recordAutoplayMetric(AutoplayBailout); 2038 recordAutoplayMetric(AutoplayBailout);
2003 } 2039 }
2004 } 2040 }
2005 2041
2006 void HTMLMediaElement::pause() 2042 void HTMLMediaElement::pause()
2007 { 2043 {
2008 WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this); 2044 WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this);
2009 2045
2010 if (!m_player || m_networkState == NETWORK_EMPTY) 2046 if (m_networkState == NETWORK_EMPTY)
2011 scheduleDelayedAction(LoadMediaResource); 2047 scheduleDelayedAction(LoadMediaResource);
2012 2048
2013 m_autoplaying = false; 2049 m_autoplaying = false;
2014 2050
2015 if (!m_paused) { 2051 if (!m_paused) {
2016 if (m_initialPlayWithoutUserGestures) 2052 if (m_initialPlayWithoutUserGestures)
2017 gesturelessInitialPlayHalted(); 2053 gesturelessInitialPlayHalted();
2018 2054
2019 m_paused = true; 2055 m_paused = true;
2020 scheduleTimeupdateEvent(false); 2056 scheduleTimeupdateEvent(false);
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
2145 { 2181 {
2146 if (m_playbackProgressTimer.isActive()) 2182 if (m_playbackProgressTimer.isActive())
2147 return; 2183 return;
2148 2184
2149 m_previousProgressTime = WTF::currentTime(); 2185 m_previousProgressTime = WTF::currentTime();
2150 m_playbackProgressTimer.startRepeating(maxTimeupdateEventFrequency, FROM_HER E); 2186 m_playbackProgressTimer.startRepeating(maxTimeupdateEventFrequency, FROM_HER E);
2151 } 2187 }
2152 2188
2153 void HTMLMediaElement::playbackProgressTimerFired(Timer<HTMLMediaElement>*) 2189 void HTMLMediaElement::playbackProgressTimerFired(Timer<HTMLMediaElement>*)
2154 { 2190 {
2155 ASSERT(m_player);
2156
2157 if (!std::isnan(m_fragmentEndTime) && currentTime() >= m_fragmentEndTime && directionOfPlayback() == Forward) { 2191 if (!std::isnan(m_fragmentEndTime) && currentTime() >= m_fragmentEndTime && directionOfPlayback() == Forward) {
2158 m_fragmentEndTime = std::numeric_limits<double>::quiet_NaN(); 2192 m_fragmentEndTime = std::numeric_limits<double>::quiet_NaN();
2159 if (!m_mediaController && !m_paused) { 2193 if (!m_mediaController && !m_paused) {
2160 UseCounter::count(document(), UseCounter::HTMLMediaElementPauseAtFra gmentEnd); 2194 UseCounter::count(document(), UseCounter::HTMLMediaElementPauseAtFra gmentEnd);
2161 // changes paused to true and fires a simple event named pause at th e media element. 2195 // changes paused to true and fires a simple event named pause at th e media element.
2162 pause(); 2196 pause();
2163 } 2197 }
2164 } 2198 }
2165 2199
2166 if (!m_seeking) 2200 if (!m_seeking)
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2241 Vector<WebMediaPlayer::TrackId> enabledTrackIds; 2275 Vector<WebMediaPlayer::TrackId> enabledTrackIds;
2242 for (unsigned i = 0; i < audioTracks().length(); ++i) { 2276 for (unsigned i = 0; i < audioTracks().length(); ++i) {
2243 AudioTrack* track = audioTracks().anonymousIndexedGetter(i); 2277 AudioTrack* track = audioTracks().anonymousIndexedGetter(i);
2244 if (track->enabled()) 2278 if (track->enabled())
2245 enabledTrackIds.append(track->trackId()); 2279 enabledTrackIds.append(track->trackId());
2246 } 2280 }
2247 2281
2248 webMediaPlayer()->enabledAudioTracksChanged(enabledTrackIds); 2282 webMediaPlayer()->enabledAudioTracksChanged(enabledTrackIds);
2249 } 2283 }
2250 2284
2251 WebMediaPlayer::TrackId HTMLMediaElement::addAudioTrack(const String& id, WebMed iaPlayerClient::AudioTrackKind kind, const AtomicString& label, const AtomicStri ng& language, bool enabled) 2285 WebMediaPlayer::TrackId HTMLMediaElement::addAudioTrack(const WebString& id, bli nk::WebMediaPlayerClient::AudioTrackKind kind, const WebString& label, const Web String& language, bool enabled)
2252 { 2286 {
2253 AtomicString kindString = AudioKindToString(kind); 2287 AtomicString kindString = AudioKindToString(kind);
2254 WTF_LOG(Media, "HTMLMediaElement::addAudioTrack(%p, '%s', '%s', '%s', '%s', %d)", 2288 WTF_LOG(Media, "HTMLMediaElement::addAudioTrack(%p, '%s', '%s', '%s', '%s', %d)",
2255 this, id.ascii().data(), kindString.ascii().data(), label.ascii().data() , language.ascii().data(), enabled); 2289 this, id.utf8().data(), kindString.ascii().data(), label.utf8().data(), language.utf8().data(), enabled);
2256 2290
2257 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) 2291 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled())
2258 return 0; 2292 return 0;
2259 2293
2260 RefPtrWillBeRawPtr<AudioTrack> audioTrack = AudioTrack::create(id, kindStrin g, label, language, enabled); 2294 RefPtrWillBeRawPtr<AudioTrack> audioTrack = AudioTrack::create(id, kindStrin g, label, language, enabled);
2261 audioTracks().add(audioTrack); 2295 audioTracks().add(audioTrack);
2262 2296
2263 return audioTrack->trackId(); 2297 return audioTrack->trackId();
2264 } 2298 }
2265 2299
(...skipping 19 matching lines...) Expand all
2285 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); 2319 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled());
2286 2320
2287 if (selectedTrackId) 2321 if (selectedTrackId)
2288 videoTracks().trackSelected(*selectedTrackId); 2322 videoTracks().trackSelected(*selectedTrackId);
2289 2323
2290 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.videoTracks attribute is added. 2324 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.videoTracks attribute is added.
2291 2325
2292 webMediaPlayer()->selectedVideoTrackChanged(selectedTrackId); 2326 webMediaPlayer()->selectedVideoTrackChanged(selectedTrackId);
2293 } 2327 }
2294 2328
2295 WebMediaPlayer::TrackId HTMLMediaElement::addVideoTrack(const String& id, WebMed iaPlayerClient::VideoTrackKind kind, const AtomicString& label, const AtomicStri ng& language, bool selected) 2329 WebMediaPlayer::TrackId HTMLMediaElement::addVideoTrack(const WebString& id, bli nk::WebMediaPlayerClient::VideoTrackKind kind, const WebString& label, const Web String& language, bool selected)
2296 { 2330 {
2297 AtomicString kindString = VideoKindToString(kind); 2331 AtomicString kindString = VideoKindToString(kind);
2298 WTF_LOG(Media, "HTMLMediaElement::addVideoTrack(%p, '%s', '%s', '%s', '%s', %d)", 2332 WTF_LOG(Media, "HTMLMediaElement::addVideoTrack(%p, '%s', '%s', '%s', '%s', %d)",
2299 this, id.ascii().data(), kindString.ascii().data(), label.ascii().data() , language.ascii().data(), selected); 2333 this, id.utf8().data(), kindString.ascii().data(), label.utf8().data(), language.utf8().data(), selected);
2300 2334
2301 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) 2335 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled())
2302 return 0; 2336 return 0;
2303 2337
2304 // If another track was selected (potentially by the user), leave it selecte d. 2338 // If another track was selected (potentially by the user), leave it selecte d.
2305 if (selected && videoTracks().selectedIndex() != -1) 2339 if (selected && videoTracks().selectedIndex() != -1)
2306 selected = false; 2340 selected = false;
2307 2341
2308 RefPtrWillBeRawPtr<VideoTrack> videoTrack = VideoTrack::create(id, kindStrin g, label, language, selected); 2342 RefPtrWillBeRawPtr<VideoTrack> videoTrack = VideoTrack::create(id, kindStrin g, label, language, selected);
2309 videoTracks().add(videoTrack); 2343 videoTracks().add(videoTrack);
2310 2344
2311 return videoTrack->trackId(); 2345 return videoTrack->trackId();
2312 } 2346 }
2313 2347
2314 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) 2348 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId)
2315 { 2349 {
2316 WTF_LOG(Media, "HTMLMediaElement::removeVideoTrack(%p)", this); 2350 WTF_LOG(Media, "HTMLMediaElement::removeVideoTrack(%p)", this);
2317 2351
2318 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) 2352 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled())
2319 return; 2353 return;
2320 2354
2321 videoTracks().remove(trackId); 2355 videoTracks().remove(trackId);
2322 } 2356 }
2323 2357
2324 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) 2358 void HTMLMediaElement::addTextTrack(WebInbandTextTrack* webTrack)
2325 { 2359 {
2326 // 4.8.10.12.2 Sourcing in-band text tracks 2360 // 4.8.10.12.2 Sourcing in-band text tracks
2327 // 1. Associate the relevant data with a new text track and its correspondin g new TextTrack object. 2361 // 1. Associate the relevant data with a new text track and its correspondin g new TextTrack object.
2328 RefPtrWillBeRawPtr<InbandTextTrack> textTrack = InbandTextTrack::create(webT rack); 2362 RefPtrWillBeRawPtr<InbandTextTrack> textTrack = InbandTextTrack::create(webT rack);
2329 2363
2330 // 2. Set the new text track's kind, label, and language based on the semant ics of the relevant data, 2364 // 2. Set the new text track's kind, label, and language based on the semant ics of the relevant data,
2331 // as defined by the relevant specification. If there is no label in that da ta, then the label must 2365 // as defined by the relevant specification. If there is no label in that da ta, then the label must
2332 // be set to the empty string. 2366 // be set to the empty string.
2333 // 3. Associate the text track list of cues with the rules for updating the text track rendering appropriate 2367 // 3. Associate the text track list of cues with the rules for updating the text track rendering appropriate
2334 // for the format in question. 2368 // for the format in question.
(...skipping 11 matching lines...) Expand all
2346 // - This will happen in honorUserPreferencesForAutomaticTextTrackSelection () 2380 // - This will happen in honorUserPreferencesForAutomaticTextTrackSelection ()
2347 scheduleDelayedAction(LoadTextTrackResource); 2381 scheduleDelayedAction(LoadTextTrackResource);
2348 2382
2349 // 8. Add the new text track to the media element's list of text tracks. 2383 // 8. Add the new text track to the media element's list of text tracks.
2350 // 9. Fire an event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent 2384 // 9. Fire an event with the name addtrack, that does not bubble and is not cancelable, and that uses the TrackEvent
2351 // interface, with the track attribute initialized to the text track's TextT rack object, at the media element's 2385 // interface, with the track attribute initialized to the text track's TextT rack object, at the media element's
2352 // textTracks attribute's TextTrackList object. 2386 // textTracks attribute's TextTrackList object.
2353 addTextTrack(textTrack.get()); 2387 addTextTrack(textTrack.get());
2354 } 2388 }
2355 2389
2356 void HTMLMediaElement::mediaPlayerDidRemoveTextTrack(WebInbandTextTrack* webTrac k) 2390 void HTMLMediaElement::removeTextTrack(WebInbandTextTrack* webTrack)
2357 { 2391 {
2358 if (!m_textTracks) 2392 if (!m_textTracks)
2359 return; 2393 return;
2360 2394
2361 // This cast is safe because we created the InbandTextTrack with the WebInba ndTextTrack 2395 // This cast is safe because we created the InbandTextTrack with the WebInba ndTextTrack
2362 // passed to mediaPlayerDidAddTextTrack. 2396 // passed to mediaPlayerDidAddTextTrack.
2363 RefPtrWillBeRawPtr<InbandTextTrack> textTrack = static_cast<InbandTextTrack* >(webTrack->client()); 2397 RefPtrWillBeRawPtr<InbandTextTrack> textTrack = static_cast<InbandTextTrack* >(webTrack->client());
2364 if (!textTrack) 2398 if (!textTrack)
2365 return; 2399 return;
2366 2400
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
2691 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_nextChildNodeToC onsider set to %p", this, m_nextChildNodeToConsider.get()); 2725 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_nextChildNodeToC onsider set to %p", this, m_nextChildNodeToConsider.get());
2692 } else if (source == m_currentSourceNode) { 2726 } else if (source == m_currentSourceNode) {
2693 // Clear the current source node pointer, but don't change the movie as the spec says: 2727 // Clear the current source node pointer, but don't change the movie as the spec says:
2694 // 4.8.8 - Dynamically modifying a source element and its attribute when the element is already 2728 // 4.8.8 - Dynamically modifying a source element and its attribute when the element is already
2695 // inserted in a video or audio element will have no effect. 2729 // inserted in a video or audio element will have no effect.
2696 m_currentSourceNode = nullptr; 2730 m_currentSourceNode = nullptr;
2697 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_currentSourceNod e set to 0", this); 2731 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_currentSourceNod e set to 0", this);
2698 } 2732 }
2699 } 2733 }
2700 2734
2701 void HTMLMediaElement::mediaPlayerTimeChanged() 2735 void HTMLMediaElement::timeChanged()
2702 { 2736 {
2703 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerTimeChanged(%p)", this); 2737 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerTimeChanged(%p)", this);
2704 2738
2705 cueTimeline().updateActiveCues(currentTime()); 2739 cueTimeline().updateActiveCues(currentTime());
2706 2740
2707 invalidateCachedTime(); 2741 invalidateCachedTime();
2708 2742
2709 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t he seek. 2743 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t he seek.
2710 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !webMediaPlayer()->see king()) 2744 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !webMediaPlayer()->see king())
2711 finishSeek(); 2745 finishSeek();
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2744 // for the media element's current media controller. 2778 // for the media element's current media controller.
2745 updateMediaController(); 2779 updateMediaController();
2746 } 2780 }
2747 } else { 2781 } else {
2748 m_sentEndEvent = false; 2782 m_sentEndEvent = false;
2749 } 2783 }
2750 2784
2751 updatePlayState(); 2785 updatePlayState();
2752 } 2786 }
2753 2787
2754 void HTMLMediaElement::mediaPlayerDurationChanged() 2788 void HTMLMediaElement::durationChanged()
2755 { 2789 {
2756 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerDurationChanged(%p)", this); 2790 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p)", this);
2757 // FIXME: Change MediaPlayerClient & WebMediaPlayer to convey 2791 // FIXME: Change WebMediaPlayer to convey the currentTime
2758 // the currentTime when the duration change occured. The current 2792 // when the duration change occured. The current WebMediaPlayer
2759 // WebMediaPlayer implementations always clamp currentTime() to 2793 // implementations always clamp currentTime() to duration()
2760 // duration() so the requestSeek condition here is always false. 2794 // so the requestSeek condition here is always false.
2761 durationChanged(duration(), currentTime() > duration()); 2795 durationChanged(duration(), currentTime() > duration());
2762 } 2796 }
2763 2797
2764 void HTMLMediaElement::durationChanged(double duration, bool requestSeek) 2798 void HTMLMediaElement::durationChanged(double duration, bool requestSeek)
2765 { 2799 {
2766 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p, %f, %d)", this, durati on, requestSeek); 2800 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p, %f, %d)", this, durati on, requestSeek);
2767 2801
2768 // Abort if duration unchanged. 2802 // Abort if duration unchanged.
2769 if (m_duration == duration) 2803 if (m_duration == duration)
2770 return; 2804 return;
2771 2805
2772 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p) : %f -> %f", this, m_d uration, duration); 2806 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p) : %f -> %f", this, m_d uration, duration);
2773 m_duration = duration; 2807 m_duration = duration;
2774 scheduleEvent(EventTypeNames::durationchange); 2808 scheduleEvent(EventTypeNames::durationchange);
2775 2809
2776 if (mediaControls()) 2810 if (mediaControls())
2777 mediaControls()->reset(); 2811 mediaControls()->reset();
2778 if (layoutObject()) 2812 if (layoutObject())
2779 layoutObject()->updateFromElement(); 2813 layoutObject()->updateFromElement();
2780 2814
2781 if (requestSeek) 2815 if (requestSeek)
2782 seek(duration); 2816 seek(duration);
2783 } 2817 }
2784 2818
2785 void HTMLMediaElement::mediaPlayerPlaybackStateChanged() 2819 void HTMLMediaElement::playbackStateChanged()
2786 { 2820 {
2787 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerPlaybackStateChanged(%p)", this ); 2821 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerPlaybackStateChanged(%p)", this );
2788 2822
2789 if (!webMediaPlayer()) 2823 if (!webMediaPlayer())
2790 return; 2824 return;
2791 2825
2792 if (webMediaPlayer()->paused()) 2826 if (webMediaPlayer()->paused())
2793 pause(); 2827 pause();
2794 else 2828 else
2795 playInternal(); 2829 playInternal();
2796 } 2830 }
2797 2831
2798 void HTMLMediaElement::mediaPlayerRequestSeek(double time) 2832 void HTMLMediaElement::requestSeek(double time)
2799 { 2833 {
2800 // The player is the source of this seek request. 2834 // The player is the source of this seek request.
2801 if (m_mediaController) { 2835 if (m_mediaController) {
2802 m_mediaController->setCurrentTime(time); 2836 m_mediaController->setCurrentTime(time);
2803 return; 2837 return;
2804 } 2838 }
2805 setCurrentTime(time, ASSERT_NO_EXCEPTION); 2839 setCurrentTime(time, ASSERT_NO_EXCEPTION);
2806 } 2840 }
2807 2841
2808 void HTMLMediaElement::remoteRouteAvailabilityChanged(bool routesAvailable) 2842 void HTMLMediaElement::remoteRouteAvailabilityChanged(bool routesAvailable)
(...skipping 11 matching lines...) Expand all
2820 } 2854 }
2821 2855
2822 void HTMLMediaElement::disconnectedFromRemoteDevice() 2856 void HTMLMediaElement::disconnectedFromRemoteDevice()
2823 { 2857 {
2824 m_playingRemotely = false; 2858 m_playingRemotely = false;
2825 if (mediaControls()) 2859 if (mediaControls())
2826 mediaControls()->stoppedCasting(); 2860 mediaControls()->stoppedCasting();
2827 } 2861 }
2828 2862
2829 // MediaPlayerPresentation methods 2863 // MediaPlayerPresentation methods
2830 void HTMLMediaElement::mediaPlayerRepaint() 2864 void HTMLMediaElement::repaint()
2831 { 2865 {
2832 if (m_webLayer) 2866 if (m_webLayer)
2833 m_webLayer->invalidate(); 2867 m_webLayer->invalidate();
2834 2868
2835 updateDisplayState(); 2869 updateDisplayState();
2836 if (layoutObject()) 2870 if (layoutObject())
2837 layoutObject()->setShouldDoFullPaintInvalidation(); 2871 layoutObject()->setShouldDoFullPaintInvalidation();
2838 } 2872 }
2839 2873
2840 void HTMLMediaElement::mediaPlayerSizeChanged() 2874 void HTMLMediaElement::sizeChanged()
2841 { 2875 {
2842 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerSizeChanged(%p)", this); 2876 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerSizeChanged(%p)", this);
2843 2877
2844 ASSERT(hasVideo()); // "resize" makes no sense absent video. 2878 ASSERT(hasVideo()); // "resize" makes no sense absent video.
2845 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) 2879 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement())
2846 scheduleEvent(EventTypeNames::resize); 2880 scheduleEvent(EventTypeNames::resize);
2847 2881
2848 if (layoutObject()) 2882 if (layoutObject())
2849 layoutObject()->updateFromElement(); 2883 layoutObject()->updateFromElement();
2850 } 2884 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2895 } 2929 }
2896 2930
2897 bool HTMLMediaElement::couldPlayIfEnoughData() const 2931 bool HTMLMediaElement::couldPlayIfEnoughData() const
2898 { 2932 {
2899 return !paused() && !endedPlayback() && !stoppedDueToErrors(); 2933 return !paused() && !endedPlayback() && !stoppedDueToErrors();
2900 } 2934 }
2901 2935
2902 bool HTMLMediaElement::endedPlayback(LoopCondition loopCondition) const 2936 bool HTMLMediaElement::endedPlayback(LoopCondition loopCondition) const
2903 { 2937 {
2904 double dur = duration(); 2938 double dur = duration();
2905 if (!m_player || std::isnan(dur)) 2939 if (std::isnan(dur))
2906 return false; 2940 return false;
2907 2941
2908 // 4.8.10.8 Playing the media resource 2942 // 4.8.10.8 Playing the media resource
2909 2943
2910 // A media element is said to have ended playback when the element's 2944 // A media element is said to have ended playback when the element's
2911 // readyState attribute is HAVE_METADATA or greater, 2945 // readyState attribute is HAVE_METADATA or greater,
2912 if (m_readyState < HAVE_METADATA) 2946 if (m_readyState < HAVE_METADATA)
2913 return false; 2947 return false;
2914 2948
2915 // and the current playback position is the end of the media resource and th e direction 2949 // and the current playback position is the end of the media resource and th e direction
(...skipping 15 matching lines...) Expand all
2931 RefPtrWillBeRawPtr<TimeRanges> seekableRanges = seekable(); 2965 RefPtrWillBeRawPtr<TimeRanges> seekableRanges = seekable();
2932 if (!seekableRanges->contain(currentTime())) 2966 if (!seekableRanges->contain(currentTime()))
2933 return true; 2967 return true;
2934 } 2968 }
2935 2969
2936 return false; 2970 return false;
2937 } 2971 }
2938 2972
2939 void HTMLMediaElement::updatePlayState() 2973 void HTMLMediaElement::updatePlayState()
2940 { 2974 {
2941 if (!m_player)
2942 return;
2943
2944 bool isPlaying = webMediaPlayer() && !webMediaPlayer()->paused(); 2975 bool isPlaying = webMediaPlayer() && !webMediaPlayer()->paused();
2945 bool shouldBePlaying = potentiallyPlaying(); 2976 bool shouldBePlaying = potentiallyPlaying();
2946 2977
2947 WTF_LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s , isPlaying = %s", 2978 WTF_LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s , isPlaying = %s",
2948 this, boolString(shouldBePlaying), boolString(isPlaying)); 2979 this, boolString(shouldBePlaying), boolString(isPlaying));
2949 2980
2950 if (shouldBePlaying) { 2981 if (shouldBePlaying) {
2951 setDisplayMode(Video); 2982 setDisplayMode(Video);
2952 invalidateCachedTime(); 2983 invalidateCachedTime();
2953 2984
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
3024 } else { 3055 } else {
3025 m_networkState = NETWORK_IDLE; 3056 m_networkState = NETWORK_IDLE;
3026 } 3057 }
3027 3058
3028 // 5 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event. 3059 // 5 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event.
3029 setShouldDelayLoadEvent(false); 3060 setShouldDelayLoadEvent(false);
3030 3061
3031 // 6 - Abort the overall resource selection algorithm. 3062 // 6 - Abort the overall resource selection algorithm.
3032 m_currentSourceNode = nullptr; 3063 m_currentSourceNode = nullptr;
3033 3064
3034 // Reset m_readyState since m_player is gone. 3065 // Reset m_readyState since m_webMediaPlayer is gone.
3035 m_readyState = HAVE_NOTHING; 3066 m_readyState = HAVE_NOTHING;
3036 invalidateCachedTime(); 3067 invalidateCachedTime();
3037 updateMediaController(); 3068 updateMediaController();
3038 cueTimeline().updateActiveCues(0); 3069 cueTimeline().updateActiveCues(0);
3039 } 3070 }
3040 3071
3041 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLockin g() 3072 void HTMLMediaElement::clearMediaPlayerAndAudioSourceProviderClientWithoutLockin g()
3042 { 3073 {
3043 #if ENABLE(WEB_AUDIO) 3074 #if ENABLE(WEB_AUDIO)
3044 if (audioSourceProvider()) 3075 if (audioSourceProvider())
3045 audioSourceProvider()->setClient(0); 3076 audioSourceProvider()->setClient(nullptr);
3046 #endif 3077 #endif
3047 m_player.clear(); 3078 if (m_webMediaPlayer) {
3079 m_audioSourceProvider.wrap(nullptr);
3080 m_webMediaPlayer.clear();
3081 }
3048 } 3082 }
3049 3083
3050 void HTMLMediaElement::clearMediaPlayer(int flags) 3084 void HTMLMediaElement::clearMediaPlayer(int flags)
3051 { 3085 {
3052 forgetResourceSpecificTracks(); 3086 forgetResourceSpecificTracks();
3053 3087
3054 closeMediaSource(); 3088 closeMediaSource();
3055 3089
3056 cancelDeferredLoad(); 3090 cancelDeferredLoad();
3057 3091
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
3262 // the user agent should run the rules for updating the text track rendering 3296 // the user agent should run the rules for updating the text track rendering
3263 // of each of the text tracks in the video element's list of text tracks ... 3297 // of each of the text tracks in the video element's list of text tracks ...
3264 if (isHTMLVideoElement() && closedCaptionsVisible()) 3298 if (isHTMLVideoElement() && closedCaptionsVisible())
3265 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidS tartExposingControls); 3299 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidS tartExposingControls);
3266 } 3300 }
3267 3301
3268 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) 3302 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible)
3269 { 3303 {
3270 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%p, %s)", this, b oolString(closedCaptionVisible)); 3304 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%p, %s)", this, b oolString(closedCaptionVisible));
3271 3305
3272 if (!m_player || !hasClosedCaptions()) 3306 if (!hasClosedCaptions())
3273 return; 3307 return;
3274 3308
3275 m_closedCaptionsVisible = closedCaptionVisible; 3309 m_closedCaptionsVisible = closedCaptionVisible;
3276 3310
3277 markCaptionAndSubtitleTracksAsUnconfigured(); 3311 markCaptionAndSubtitleTracksAsUnconfigured();
3278 m_processingPreferenceChange = true; 3312 m_processingPreferenceChange = true;
3279 honorUserPreferencesForAutomaticTextTrackSelection(); 3313 honorUserPreferencesForAutomaticTextTrackSelection();
3280 m_processingPreferenceChange = false; 3314 m_processingPreferenceChange = false;
3281 3315
3282 // As track visibility changed while m_processingPreferenceChange was set, 3316 // As track visibility changed while m_processingPreferenceChange was set,
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
3456 } 3490 }
3457 3491
3458 void* HTMLMediaElement::preDispatchEventHandler(Event* event) 3492 void* HTMLMediaElement::preDispatchEventHandler(Event* event)
3459 { 3493 {
3460 if (event && event->type() == EventTypeNames::webkitfullscreenchange) 3494 if (event && event->type() == EventTypeNames::webkitfullscreenchange)
3461 configureMediaControls(); 3495 configureMediaControls();
3462 3496
3463 return nullptr; 3497 return nullptr;
3464 } 3498 }
3465 3499
3466 void HTMLMediaElement::createMediaPlayer() 3500 void HTMLMediaElement::createMediaPlayer()
philipj_slow 2015/07/21 08:05:10 This is now incorrectly named, as it never creates
Srirama 2015/07/22 14:42:09 Done. Couldn't think of a better name than this.
philipj_slow 2015/07/22 14:54:06 That works well enough, thanks!
3467 { 3501 {
3468 AudioSourceProviderClientLockScope scope(*this); 3502 AudioSourceProviderClientLockScope scope(*this);
3469 3503
3470 closeMediaSource(); 3504 closeMediaSource();
3471 3505
3472 m_player = MediaPlayer::create(this); 3506 if (m_webMediaPlayer) {
3507 m_audioSourceProvider.wrap(nullptr);
3508 m_webMediaPlayer.clear();
3509 }
3473 3510
3474 // We haven't yet found out if any remote routes are available. 3511 // We haven't yet found out if any remote routes are available.
3475 m_remoteRoutesAvailable = false; 3512 m_remoteRoutesAvailable = false;
3476 m_playingRemotely = false; 3513 m_playingRemotely = false;
3477 3514
3478 #if ENABLE(WEB_AUDIO) 3515 #if ENABLE(WEB_AUDIO)
3479 if (m_audioSourceNode && audioSourceProvider()) { 3516 if (m_audioSourceNode && audioSourceProvider()) {
3480 // When creating the player, make sure its AudioSourceProvider knows abo ut the client. 3517 // When creating the player, make sure its AudioSourceProvider knows abo ut the client.
philipj_slow 2015/07/21 08:05:10 This comment and the condition doesn't seem to mak
Srirama 2015/07/22 14:42:09 Done. It will not be null.
philipj_slow 2015/07/22 14:54:06 The extra {} can now be removed too.
3481 audioSourceProvider()->setClient(m_audioSourceNode); 3518 audioSourceProvider()->setClient(m_audioSourceNode);
3482 } 3519 }
3483 #endif 3520 #endif
3484 } 3521 }
3485 3522
3486 #if ENABLE(WEB_AUDIO) 3523 #if ENABLE(WEB_AUDIO)
3487 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode) 3524 void HTMLMediaElement::setAudioSourceNode(AudioSourceProviderClient* sourceNode)
3488 { 3525 {
3489 ASSERT(isMainThread()); 3526 ASSERT(isMainThread());
3490 m_audioSourceNode = sourceNode; 3527 m_audioSourceNode = sourceNode;
3491 3528
3492 AudioSourceProviderClientLockScope scope(*this); 3529 AudioSourceProviderClientLockScope scope(*this);
3493 if (audioSourceProvider()) 3530 if (audioSourceProvider())
3494 audioSourceProvider()->setClient(m_audioSourceNode); 3531 audioSourceProvider()->setClient(m_audioSourceNode);
3495 } 3532 }
3496
3497 AudioSourceProvider* HTMLMediaElement::audioSourceProvider()
3498 {
3499 if (m_player)
3500 return m_player->audioSourceProvider();
3501
3502 return nullptr;
3503 }
3504 #endif 3533 #endif
3505 3534
3506 const AtomicString& HTMLMediaElement::mediaGroup() const 3535 const AtomicString& HTMLMediaElement::mediaGroup() const
3507 { 3536 {
3508 return fastGetAttribute(mediagroupAttr); 3537 return fastGetAttribute(mediagroupAttr);
3509 } 3538 }
3510 3539
3511 void HTMLMediaElement::setMediaGroup(const AtomicString& group) 3540 void HTMLMediaElement::setMediaGroup(const AtomicString& group)
3512 { 3541 {
3513 // When a media element is created with a mediagroup attribute, and when a m edia element's mediagroup 3542 // When a media element is created with a mediagroup attribute, and when a m edia element's mediagroup
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
3605 WebMediaPlayer::CORSMode HTMLMediaElement::corsMode() const 3634 WebMediaPlayer::CORSMode HTMLMediaElement::corsMode() const
3606 { 3635 {
3607 const AtomicString& crossOriginMode = fastGetAttribute(crossoriginAttr); 3636 const AtomicString& crossOriginMode = fastGetAttribute(crossoriginAttr);
3608 if (crossOriginMode.isNull()) 3637 if (crossOriginMode.isNull())
3609 return WebMediaPlayer::CORSModeUnspecified; 3638 return WebMediaPlayer::CORSModeUnspecified;
3610 if (equalIgnoringCase(crossOriginMode, "use-credentials")) 3639 if (equalIgnoringCase(crossOriginMode, "use-credentials"))
3611 return WebMediaPlayer::CORSModeUseCredentials; 3640 return WebMediaPlayer::CORSModeUseCredentials;
3612 return WebMediaPlayer::CORSModeAnonymous; 3641 return WebMediaPlayer::CORSModeAnonymous;
3613 } 3642 }
3614 3643
3615 void HTMLMediaElement::mediaPlayerSetWebLayer(WebLayer* webLayer) 3644 void HTMLMediaElement::setWebLayer(blink::WebLayer* webLayer)
3616 { 3645 {
3617 if (webLayer == m_webLayer) 3646 if (webLayer == m_webLayer)
3618 return; 3647 return;
3619 3648
3620 // If either of the layers is null we need to enable or disable compositing. This is done by triggering a style recalc. 3649 // If either of the layers is null we need to enable or disable compositing. This is done by triggering a style recalc.
3621 if ((!m_webLayer || !webLayer) 3650 if ((!m_webLayer || !webLayer)
3622 #if ENABLE(OILPAN) 3651 #if ENABLE(OILPAN)
3623 && !m_isFinalizing 3652 && !m_isFinalizing
3624 #endif 3653 #endif
3625 ) 3654 )
3626 setNeedsCompositingUpdate(); 3655 setNeedsCompositingUpdate();
3627 3656
3628 if (m_webLayer) 3657 if (m_webLayer)
3629 GraphicsLayer::unregisterContentsLayer(m_webLayer); 3658 GraphicsLayer::unregisterContentsLayer(m_webLayer);
3630 m_webLayer = webLayer; 3659 m_webLayer = webLayer;
3631 if (m_webLayer) 3660 if (m_webLayer)
3632 GraphicsLayer::registerContentsLayer(m_webLayer); 3661 GraphicsLayer::registerContentsLayer(m_webLayer);
3633 } 3662 }
3634 3663
3635 void HTMLMediaElement::mediaPlayerMediaSourceOpened(WebMediaSource* webMediaSour ce) 3664 void HTMLMediaElement::mediaSourceOpened(WebMediaSource* webMediaSource)
3636 { 3665 {
3637 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); 3666 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource));
3638 } 3667 }
3639 3668
3640 bool HTMLMediaElement::isInteractiveContent() const 3669 bool HTMLMediaElement::isInteractiveContent() const
3641 { 3670 {
3642 return fastHasAttribute(controlsAttr); 3671 return fastHasAttribute(controlsAttr);
3643 } 3672 }
3644 3673
3645 void HTMLMediaElement::defaultEventHandler(Event* event) 3674 void HTMLMediaElement::defaultEventHandler(Event* event)
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
3702 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1) 3731 if (videoTracks().length() > 0 && videoTracks().selectedIndex() == -1)
3703 videoTracks().anonymousIndexedGetter(0)->setSelected(true); 3732 videoTracks().anonymousIndexedGetter(0)->setSelected(true);
3704 } 3733 }
3705 3734
3706 #if ENABLE(WEB_AUDIO) 3735 #if ENABLE(WEB_AUDIO)
3707 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 3736 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3708 { 3737 {
3709 if (!Heap::isHeapObjectAlive(m_audioSourceNode) && audioSourceProvider()) 3738 if (!Heap::isHeapObjectAlive(m_audioSourceNode) && audioSourceProvider())
3710 audioSourceProvider()->setClient(nullptr); 3739 audioSourceProvider()->setClient(nullptr);
3711 } 3740 }
3741
3742 void HTMLMediaElement::AudioSourceProviderImpl::wrap(WebAudioSourceProvider* pro vider)
3743 {
3744 MutexLocker locker(provideInputLock);
3745
3746 if (m_webAudioSourceProvider && provider != m_webAudioSourceProvider)
3747 m_webAudioSourceProvider->setClient(nullptr);
3748
3749 m_webAudioSourceProvider = provider;
3750 if (m_webAudioSourceProvider)
3751 m_webAudioSourceProvider->setClient(m_client.get());
3752 }
3753
3754 void HTMLMediaElement::AudioSourceProviderImpl::setClient(AudioSourceProviderCli ent* client)
3755 {
3756 MutexLocker locker(provideInputLock);
3757
3758 if (client)
3759 m_client = new HTMLMediaElement::AudioClientImpl(client);
3760 else
3761 m_client.clear();
3762
3763 if (m_webAudioSourceProvider)
3764 m_webAudioSourceProvider->setClient(m_client.get());
3765 }
3766
3767 void HTMLMediaElement::AudioSourceProviderImpl::provideInput(AudioBus* bus, size _t framesToProcess)
3768 {
3769 if (!bus)
3770 return;
3771
3772 MutexTryLocker tryLocker(provideInputLock);
3773 if (!tryLocker.locked() || !m_webAudioSourceProvider || !m_client.get()) {
3774 bus->zero();
3775 return;
3776 }
3777
3778 // Wrap the AudioBus channel data using WebVector.
3779 size_t n = bus->numberOfChannels();
3780 WebVector<float*> webAudioData(n);
3781 for (size_t i = 0; i < n; ++i)
3782 webAudioData[i] = bus->channel(i)->mutableData();
3783
3784 m_webAudioSourceProvider->provideInput(webAudioData, framesToProcess);
3785 }
3786
3787 void HTMLMediaElement::AudioClientImpl::setFormat(size_t numberOfChannels, float sampleRate)
3788 {
3789 if (m_client)
3790 m_client->setFormat(numberOfChannels, sampleRate);
3791 }
3792
3793 DEFINE_TRACE(HTMLMediaElement::AudioClientImpl)
3794 {
3795 visitor->trace(m_client);
3796 }
3712 #endif 3797 #endif
3713 3798
3714 } 3799 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698