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

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

Issue 1227403004: Measure usage of HTMLMediaElement preload states (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Use fastGetAttribute 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 | Annotate | Revision Log
« no previous file with comments | « 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 316 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 , m_lastSeekTime(0) 327 , m_lastSeekTime(0)
328 , m_previousProgressTime(std::numeric_limits<double>::max()) 328 , m_previousProgressTime(std::numeric_limits<double>::max())
329 , m_duration(std::numeric_limits<double>::quiet_NaN()) 329 , m_duration(std::numeric_limits<double>::quiet_NaN())
330 , m_lastTimeUpdateEventWallTime(0) 330 , m_lastTimeUpdateEventWallTime(0)
331 , m_lastTimeUpdateEventMovieTime(0) 331 , m_lastTimeUpdateEventMovieTime(0)
332 , m_defaultPlaybackStartPosition(0) 332 , m_defaultPlaybackStartPosition(0)
333 , m_loadState(WaitingForSource) 333 , m_loadState(WaitingForSource)
334 , m_deferredLoadState(NotDeferred) 334 , m_deferredLoadState(NotDeferred)
335 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired) 335 , m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired)
336 , m_webLayer(nullptr) 336 , m_webLayer(nullptr)
337 , m_preload(MediaPlayer::Auto)
338 , m_displayMode(Unknown) 337 , m_displayMode(Unknown)
339 , m_cachedTime(std::numeric_limits<double>::quiet_NaN()) 338 , m_cachedTime(std::numeric_limits<double>::quiet_NaN())
340 , m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()) 339 , m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN())
341 , m_pendingActionFlags(0) 340 , m_pendingActionFlags(0)
342 , m_userGestureRequiredForPlay(false) 341 , m_userGestureRequiredForPlay(false)
343 , m_playing(false) 342 , m_playing(false)
344 , m_shouldDelayLoadEvent(false) 343 , m_shouldDelayLoadEvent(false)
345 , m_haveFiredLoadedData(false) 344 , m_haveFiredLoadedData(false)
346 , m_autoplaying(true) 345 , m_autoplaying(true)
347 , m_muted(false) 346 , m_muted(false)
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 { 526 {
528 if (name == srcAttr) { 527 if (name == srcAttr) {
529 // Trigger a reload, as long as the 'src' attribute is present. 528 // Trigger a reload, as long as the 'src' attribute is present.
530 if (!value.isNull()) { 529 if (!value.isNull()) {
531 clearMediaPlayer(LoadMediaResource); 530 clearMediaPlayer(LoadMediaResource);
532 scheduleDelayedAction(LoadMediaResource); 531 scheduleDelayedAction(LoadMediaResource);
533 } 532 }
534 } else if (name == controlsAttr) { 533 } else if (name == controlsAttr) {
535 configureMediaControls(); 534 configureMediaControls();
536 } else if (name == preloadAttr) { 535 } else if (name == preloadAttr) {
537 if (equalIgnoringCase(value, "none")) {
538 m_preload = MediaPlayer::None;
539 } else if (equalIgnoringCase(value, "metadata")) {
540 m_preload = MediaPlayer::MetaData;
541 } else {
542 // The spec does not define an "invalid value default" but "auto" is suggested as the
543 // "missing value default", so use it for everything except "none" a nd "metadata"
544 m_preload = MediaPlayer::Auto;
545 }
546
547 // The attribute must be ignored if the autoplay attribute is present
548 if (m_player) 536 if (m_player)
549 setPlayerPreload(); 537 setPlayerPreload();
550
551 } else if (name == mediagroupAttr && RuntimeEnabledFeatures::mediaController Enabled()) { 538 } else if (name == mediagroupAttr && RuntimeEnabledFeatures::mediaController Enabled()) {
552 setMediaGroup(value); 539 setMediaGroup(value);
553 } else { 540 } else {
554 HTMLElement::parseAttribute(name, value); 541 HTMLElement::parseAttribute(name, value);
555 } 542 }
556 } 543 }
557 544
558 void HTMLMediaElement::finishParsingChildren() 545 void HTMLMediaElement::finishParsingChildren()
559 { 546 {
560 HTMLElement::finishParsingChildren(); 547 HTMLElement::finishParsingChildren();
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 m_mediaSource = nullptr; 972 m_mediaSource = nullptr;
986 attemptLoad = false; 973 attemptLoad = false;
987 } 974 }
988 } 975 }
989 } 976 }
990 } 977 }
991 978
992 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { 979 if (attemptLoad && canLoadURL(url, contentType, keySystem)) {
993 ASSERT(!webMediaPlayer()); 980 ASSERT(!webMediaPlayer());
994 981
995 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No ne) { 982 if (!m_havePreparedToPlay && !autoplay() && preloadType() == MediaPlayer ::None) {
996 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this); 983 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this);
997 deferLoad(); 984 deferLoad();
998 } else { 985 } else {
999 startPlayerLoad(); 986 startPlayerLoad();
1000 } 987 }
1001 } else { 988 } else {
1002 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); 989 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError);
1003 } 990 }
1004 991
1005 // If there is no poster to display, allow the media engine to render video frames as soon as 992 // If there is no poster to display, allow the media engine to render video frames as soon as
(...skipping 25 matching lines...) Expand all
1031 if (!requestURL.pass().isEmpty()) 1018 if (!requestURL.pass().isEmpty())
1032 requestURL.setPass(String()); 1019 requestURL.setPass(String());
1033 1020
1034 m_player->load(loadType(), requestURL, corsMode()); 1021 m_player->load(loadType(), requestURL, corsMode());
1035 } 1022 }
1036 1023
1037 void HTMLMediaElement::setPlayerPreload() 1024 void HTMLMediaElement::setPlayerPreload()
1038 { 1025 {
1039 m_player->setPreload(effectivePreloadType()); 1026 m_player->setPreload(effectivePreloadType());
1040 1027
1041 if (loadIsDeferred() && m_preload != MediaPlayer::None) 1028 if (loadIsDeferred() && preloadType() != MediaPlayer::None)
1042 startDeferredLoad(); 1029 startDeferredLoad();
1043 } 1030 }
1044 1031
1045 bool HTMLMediaElement::loadIsDeferred() const 1032 bool HTMLMediaElement::loadIsDeferred() const
1046 { 1033 {
1047 return m_deferredLoadState != NotDeferred; 1034 return m_deferredLoadState != NotDeferred;
1048 } 1035 }
1049 1036
1050 void HTMLMediaElement::deferLoad() 1037 void HTMLMediaElement::deferLoad()
1051 { 1038 {
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
1608 1595
1609 void HTMLMediaElement::seek(double time) 1596 void HTMLMediaElement::seek(double time)
1610 { 1597 {
1611 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f)", this, time); 1598 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f)", this, time);
1612 1599
1613 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps. 1600 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps.
1614 if (m_readyState == HAVE_NOTHING) 1601 if (m_readyState == HAVE_NOTHING)
1615 return; 1602 return;
1616 1603
1617 // If the media engine has been told to postpone loading data, let it go ahe ad now. 1604 // If the media engine has been told to postpone loading data, let it go ahe ad now.
1618 if (m_preload < MediaPlayer::Auto && m_readyState < HAVE_FUTURE_DATA) 1605 if (preloadType() < MediaPlayer::Auto && m_readyState < HAVE_FUTURE_DATA)
1619 prepareToPlay(); 1606 prepareToPlay();
1620 1607
1621 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set. 1608 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set.
1622 refreshCachedTime(); 1609 refreshCachedTime();
1623 // This is needed to avoid getting default playback start position from curr entTime(). 1610 // This is needed to avoid getting default playback start position from curr entTime().
1624 double now = m_cachedTime; 1611 double now = m_cachedTime;
1625 1612
1626 // 3 - If the element's seeking IDL attribute is true, then another instance of this algorithm is 1613 // 3 - If the element's seeking IDL attribute is true, then another instance of this algorithm is
1627 // already running. Abort that other instance of the algorithm without waiti ng for the step that 1614 // already running. Abort that other instance of the algorithm without waiti ng for the step that
1628 // it is running to complete. 1615 // it is running to complete.
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1873 return endedPlayback() && directionOfPlayback() == Forward; 1860 return endedPlayback() && directionOfPlayback() == Forward;
1874 } 1861 }
1875 1862
1876 bool HTMLMediaElement::autoplay() const 1863 bool HTMLMediaElement::autoplay() const
1877 { 1864 {
1878 return fastHasAttribute(autoplayAttr); 1865 return fastHasAttribute(autoplayAttr);
1879 } 1866 }
1880 1867
1881 String HTMLMediaElement::preload() const 1868 String HTMLMediaElement::preload() const
1882 { 1869 {
1883 switch (m_preload) { 1870 switch (preloadType()) {
1884 case MediaPlayer::None: 1871 case MediaPlayer::None:
1885 return "none"; 1872 return "none";
1886 break;
1887 case MediaPlayer::MetaData: 1873 case MediaPlayer::MetaData:
1888 return "metadata"; 1874 return "metadata";
1889 break;
1890 case MediaPlayer::Auto: 1875 case MediaPlayer::Auto:
1891 return "auto"; 1876 return "auto";
1892 break;
1893 } 1877 }
1894 1878
1895 ASSERT_NOT_REACHED(); 1879 ASSERT_NOT_REACHED();
1896 return String(); 1880 return String();
1897 } 1881 }
1898 1882
1899 void HTMLMediaElement::setPreload(const AtomicString& preload) 1883 void HTMLMediaElement::setPreload(const AtomicString& preload)
1900 { 1884 {
1901 WTF_LOG(Media, "HTMLMediaElement::setPreload(%p, %s)", this, preload.utf8(). data()); 1885 WTF_LOG(Media, "HTMLMediaElement::setPreload(%p, %s)", this, preload.utf8(). data());
1902 setAttribute(preloadAttr, preload); 1886 setAttribute(preloadAttr, preload);
1903 } 1887 }
1904 1888
1889 MediaPlayer::Preload HTMLMediaElement::preloadType() const
1890 {
1891 // TODO(philipj): The spec requires case-sensitive string matching:
1892 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28951
1893 const AtomicString& preload = fastGetAttribute(preloadAttr);
1894 if (equalIgnoringCase(preload, "none")) {
1895 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadNone);
1896 return MediaPlayer::None;
1897 }
1898 if (equalIgnoringCase(preload, "metadata")) {
1899 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadMetadat a);
1900 return MediaPlayer::MetaData;
1901 }
1902 if (equalIgnoringCase(preload, "auto")) {
1903 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadAuto);
1904 return MediaPlayer::Auto;
1905 }
1906
1907 // "The attribute's missing value default is user-agent defined, though the
1908 // Metadata state is suggested as a compromise between reducing server load
1909 // and providing an optimal user experience."
1910
1911 // The spec does not define an invalid value default:
1912 // https://www.w3.org/Bugs/Public/show_bug.cgi?id=28950
1913
1914 // TODO(philipj): Try to make "metadata" the default preload state:
1915 // https://crbug.com/310450
1916 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadDefault);
1917 return MediaPlayer::Auto;
1918 }
1919
1905 MediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const 1920 MediaPlayer::Preload HTMLMediaElement::effectivePreloadType() const
1906 { 1921 {
1907 return autoplay() ? MediaPlayer::Auto : m_preload; 1922 return autoplay() ? MediaPlayer::Auto : preloadType();
1908 } 1923 }
1909 1924
1910 void HTMLMediaElement::play() 1925 void HTMLMediaElement::play()
1911 { 1926 {
1912 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this); 1927 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this);
1913 1928
1914 if (!UserGestureIndicator::processingUserGesture()) { 1929 if (!UserGestureIndicator::processingUserGesture()) {
1915 autoplayMediaEncountered(); 1930 autoplayMediaEncountered();
1916 if (m_userGestureRequiredForPlay) { 1931 if (m_userGestureRequiredForPlay) {
1917 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture."); 1932 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture.");
(...skipping 1772 matching lines...) Expand 10 before | Expand all | Expand 10 after
3690 3705
3691 #if ENABLE(WEB_AUDIO) 3706 #if ENABLE(WEB_AUDIO)
3692 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) 3707 void HTMLMediaElement::clearWeakMembers(Visitor* visitor)
3693 { 3708 {
3694 if (!Heap::isHeapObjectAlive(m_audioSourceNode) && audioSourceProvider()) 3709 if (!Heap::isHeapObjectAlive(m_audioSourceNode) && audioSourceProvider())
3695 audioSourceProvider()->setClient(nullptr); 3710 audioSourceProvider()->setClient(nullptr);
3696 } 3711 }
3697 #endif 3712 #endif
3698 3713
3699 } 3714 }
OLDNEW
« no previous file with comments | « Source/core/html/HTMLMediaElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698