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

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

Issue 157423003: Remove the dependency on encryptedmedia from HTMLMediaElement. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Address review comments. Created 6 years, 10 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "core/frame/ContentSecurityPolicy.h" 43 #include "core/frame/ContentSecurityPolicy.h"
44 #include "core/frame/Frame.h" 44 #include "core/frame/Frame.h"
45 #include "core/frame/Settings.h" 45 #include "core/frame/Settings.h"
46 #include "core/frame/UseCounter.h" 46 #include "core/frame/UseCounter.h"
47 #include "core/html/HTMLMediaSource.h" 47 #include "core/html/HTMLMediaSource.h"
48 #include "core/html/HTMLSourceElement.h" 48 #include "core/html/HTMLSourceElement.h"
49 #include "core/html/HTMLTrackElement.h" 49 #include "core/html/HTMLTrackElement.h"
50 #include "core/html/MediaController.h" 50 #include "core/html/MediaController.h"
51 #include "core/html/MediaError.h" 51 #include "core/html/MediaError.h"
52 #include "core/html/MediaFragmentURIParser.h" 52 #include "core/html/MediaFragmentURIParser.h"
53 #include "core/html/MediaKeyError.h"
54 #include "core/html/MediaKeyEvent.h"
55 #include "core/html/TimeRanges.h" 53 #include "core/html/TimeRanges.h"
56 #include "core/html/shadow/MediaControls.h" 54 #include "core/html/shadow/MediaControls.h"
57 #include "core/html/track/InbandTextTrack.h" 55 #include "core/html/track/InbandTextTrack.h"
58 #include "core/html/track/TextTrackCueList.h" 56 #include "core/html/track/TextTrackCueList.h"
59 #include "core/html/track/TextTrackList.h" 57 #include "core/html/track/TextTrackList.h"
60 #include "core/loader/FrameLoader.h" 58 #include "core/loader/FrameLoader.h"
61 #include "core/rendering/RenderLayerCompositor.h" 59 #include "core/rendering/RenderLayerCompositor.h"
62 #include "core/rendering/RenderVideo.h" 60 #include "core/rendering/RenderVideo.h"
63 #include "core/rendering/RenderView.h" 61 #include "core/rendering/RenderView.h"
64 // FIXME: Remove dependency on modules/encryptedmedia (http://crbug.com/242754).
65 #include "modules/encryptedmedia/MediaKeyNeededEvent.h"
66 #include "modules/encryptedmedia/MediaKeys.h"
67 #include "platform/ContentType.h" 62 #include "platform/ContentType.h"
68 #include "platform/Language.h" 63 #include "platform/Language.h"
69 #include "platform/Logging.h" 64 #include "platform/Logging.h"
70 #include "platform/MIMETypeFromURL.h" 65 #include "platform/MIMETypeFromURL.h"
71 #include "platform/MIMETypeRegistry.h" 66 #include "platform/MIMETypeRegistry.h"
72 #include "platform/NotImplemented.h" 67 #include "platform/NotImplemented.h"
73 #include "platform/UserGestureIndicator.h" 68 #include "platform/UserGestureIndicator.h"
74 #include "platform/graphics/GraphicsLayer.h" 69 #include "platform/graphics/GraphicsLayer.h"
75 #include "platform/weborigin/SecurityOrigin.h" 70 #include "platform/weborigin/SecurityOrigin.h"
76 #include "public/platform/Platform.h" 71 #include "public/platform/Platform.h"
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 139
145 static void removeElementFromDocumentMap(HTMLMediaElement* element, Document* do cument) 140 static void removeElementFromDocumentMap(HTMLMediaElement* element, Document* do cument)
146 { 141 {
147 DocumentElementSetMap& map = documentToElementSetMap(); 142 DocumentElementSetMap& map = documentToElementSetMap();
148 HashSet<HTMLMediaElement*> set = map.take(document); 143 HashSet<HTMLMediaElement*> set = map.take(document);
149 set.remove(element); 144 set.remove(element);
150 if (!set.isEmpty()) 145 if (!set.isEmpty())
151 map.add(document, set); 146 map.add(document, set);
152 } 147 }
153 148
154 static void throwExceptionForMediaKeyException(const String& keySystem, const St ring& sessionId, MediaPlayer::MediaKeyException exception, ExceptionState& excep tionState)
155 {
156 switch (exception) {
157 case MediaPlayer::NoError:
158 return;
159 case MediaPlayer::InvalidPlayerState:
160 exceptionState.throwDOMException(InvalidStateError, "The player is in an invalid state.");
161 return;
162 case MediaPlayer::KeySystemNotSupported:
163 exceptionState.throwDOMException(NotSupportedError, "The key system prov ided ('" + keySystem +"') is not supported.");
164 return;
165 case MediaPlayer::InvalidAccess:
166 exceptionState.throwDOMException(InvalidAccessError, "The session ID pro vided ('" + sessionId + "') is invalid.");
167 return;
168 }
169
170 ASSERT_NOT_REACHED();
171 return;
172 }
173
174 class TrackDisplayUpdateScope { 149 class TrackDisplayUpdateScope {
175 public: 150 public:
176 TrackDisplayUpdateScope(HTMLMediaElement* mediaElement) 151 TrackDisplayUpdateScope(HTMLMediaElement* mediaElement)
177 { 152 {
178 m_mediaElement = mediaElement; 153 m_mediaElement = mediaElement;
179 m_mediaElement->beginIgnoringTrackDisplayUpdateRequests(); 154 m_mediaElement->beginIgnoringTrackDisplayUpdateRequests();
180 } 155 }
181 ~TrackDisplayUpdateScope() 156 ~TrackDisplayUpdateScope()
182 { 157 {
183 ASSERT(m_mediaElement); 158 ASSERT(m_mediaElement);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 , m_havePreparedToPlay(false) 275 , m_havePreparedToPlay(false)
301 , m_tracksAreReady(true) 276 , m_tracksAreReady(true)
302 , m_haveVisibleTextTrack(false) 277 , m_haveVisibleTextTrack(false)
303 , m_processingPreferenceChange(false) 278 , m_processingPreferenceChange(false)
304 , m_lastTextTrackUpdateTime(-1) 279 , m_lastTextTrackUpdateTime(-1)
305 , m_textTracks(nullptr) 280 , m_textTracks(nullptr)
306 , m_ignoreTrackDisplayUpdate(0) 281 , m_ignoreTrackDisplayUpdate(0)
307 #if ENABLE(WEB_AUDIO) 282 #if ENABLE(WEB_AUDIO)
308 , m_audioSourceNode(0) 283 , m_audioSourceNode(0)
309 #endif 284 #endif
310 , m_emeMode(EmeModeNotSelected)
311 { 285 {
312 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); 286 ASSERT(RuntimeEnabledFeatures::mediaEnabled());
313 287
314 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement"); 288 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement");
315 ScriptWrappable::init(this); 289 ScriptWrappable::init(this);
316 290
317 if (document.settings()) { 291 if (document.settings()) {
318 if (document.settings()->mediaPlaybackRequiresUserGesture()) 292 if (document.settings()->mediaPlaybackRequiresUserGesture())
319 addBehaviorRestriction(RequireUserGestureForPlayRestriction); 293 addBehaviorRestriction(RequireUserGestureForPlayRestriction);
320 if (document.settings()->mediaFullscreenRequiresUserGesture()) 294 if (document.settings()->mediaFullscreenRequiresUserGesture())
(...skipping 19 matching lines...) Expand all
340 if (m_textTracks) { 314 if (m_textTracks) {
341 for (unsigned i = 0; i < m_textTracks->length(); ++i) 315 for (unsigned i = 0; i < m_textTracks->length(); ++i)
342 m_textTracks->item(i)->clearClient(); 316 m_textTracks->item(i)->clearClient();
343 } 317 }
344 318
345 if (m_mediaController) { 319 if (m_mediaController) {
346 m_mediaController->removeMediaElement(this); 320 m_mediaController->removeMediaElement(this);
347 m_mediaController = nullptr; 321 m_mediaController = nullptr;
348 } 322 }
349 323
350 closeMediaSource(); 324 closeMediaSource();
ddorwin 2014/02/27 00:37:59 acolwell: Are you intending to do something simila
acolwell GONE FROM CHROMIUM 2014/02/27 01:11:11 I believe this call is actually inert and will pro
351 325
ddorwin 2014/02/27 00:37:59 When do we end up calling setMediaKeysInternal()?
acolwell GONE FROM CHROMIUM 2014/02/27 01:11:11 I'd prefer to tie the EME code to WebMediaPlayer d
c.shu 2014/02/27 14:49:46 So I won't touch MSE this time.
352 setMediaKeysInternal(0);
353
354 removeElementFromDocumentMap(this, &document()); 326 removeElementFromDocumentMap(this, &document());
355 327
356 // Destroying the player may cause a resource load to be canceled, 328 // Destroying the player may cause a resource load to be canceled,
357 // which could result in userCancelledLoad() being called back. 329 // which could result in userCancelledLoad() being called back.
358 // Setting m_completelyLoaded ensures that such a call will not cause 330 // Setting m_completelyLoaded ensures that such a call will not cause
359 // us to dispatch an abort event, which would result in a crash. 331 // us to dispatch an abort event, which would result in a crash.
360 // See http://crbug.com/233654 for more details. 332 // See http://crbug.com/233654 for more details.
361 m_completelyLoaded = true; 333 m_completelyLoaded = true;
362 334
363 // Destroying the player may cause a resource load to be canceled, 335 // Destroying the player may cause a resource load to be canceled,
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 m_loadTimer.startOneShot(0); 514 m_loadTimer.startOneShot(0);
543 } 515 }
544 516
545 void HTMLMediaElement::scheduleNextSourceChild() 517 void HTMLMediaElement::scheduleNextSourceChild()
546 { 518 {
547 // Schedule the timer to try the next <source> element WITHOUT resetting sta te ala prepareForLoad. 519 // Schedule the timer to try the next <source> element WITHOUT resetting sta te ala prepareForLoad.
548 m_pendingActionFlags |= LoadMediaResource; 520 m_pendingActionFlags |= LoadMediaResource;
549 m_loadTimer.startOneShot(0); 521 m_loadTimer.startOneShot(0);
550 } 522 }
551 523
552 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) 524 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName)
ddorwin 2014/02/27 00:37:59 Should we be overloading here? Maybe this should b
c.shu 2014/02/27 14:49:46 Done.
553 { 525 {
526 scheduleEvent(Event::createCancelable(eventName));
527 }
528
529 void HTMLMediaElement::scheduleEvent(PassRefPtr<Event> event)
530 {
554 #if LOG_MEDIA_EVENTS 531 #if LOG_MEDIA_EVENTS
555 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", eventNam e.ascii().data()); 532 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", event->t ype().ascii().data());
556 #endif 533 #endif
557 m_asyncEventQueue->enqueueEvent(Event::createCancelable(eventName)); 534 m_asyncEventQueue->enqueueEvent(event);
ddorwin 2014/02/27 00:37:59 IMO, we should either setTarget(this) here and rem
c.shu 2014/02/27 14:49:46 All the scheduleNamedEvent() now go through this f
ddorwin 2014/03/01 01:08:47 This was an unrelated comment, other than the fact
558 } 535 }
559 536
560 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) 537 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*)
561 { 538 {
562 RefPtr<HTMLMediaElement> protect(this); // loadNextSourceChild may fire 'bef oreload', which can make arbitrary DOM mutations. 539 RefPtr<HTMLMediaElement> protect(this); // loadNextSourceChild may fire 'bef oreload', which can make arbitrary DOM mutations.
563 540
564 if (RuntimeEnabledFeatures::videoTrackEnabled() && (m_pendingActionFlags & L oadTextTrackResource)) 541 if (RuntimeEnabledFeatures::videoTrackEnabled() && (m_pendingActionFlags & L oadTextTrackResource))
565 configureTextTracks(); 542 configureTextTracks();
566 543
567 if (m_pendingActionFlags & LoadMediaResource) { 544 if (m_pendingActionFlags & LoadMediaResource) {
(...skipping 1059 matching lines...) Expand 10 before | Expand all | Expand 10 after
1627 if (hasMediaControls()) 1604 if (hasMediaControls())
1628 mediaControls()->refreshClosedCaptionsButtonVisibility(); 1605 mediaControls()->refreshClosedCaptionsButtonVisibility();
1629 } 1606 }
1630 1607
1631 updatePlayState(); 1608 updatePlayState();
1632 updateMediaController(); 1609 updateMediaController();
1633 if (RuntimeEnabledFeatures::videoTrackEnabled()) 1610 if (RuntimeEnabledFeatures::videoTrackEnabled())
1634 updateActiveTextTrackCues(currentTime()); 1611 updateActiveTextTrackCues(currentTime());
1635 } 1612 }
1636 1613
1637 void HTMLMediaElement::mediaPlayerKeyAdded(const String& keySystem, const String & sessionId)
1638 {
1639 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyAdded");
1640
1641 MediaKeyEventInit initializer;
1642 initializer.keySystem = keySystem;
1643 initializer.sessionId = sessionId;
1644 initializer.bubbles = false;
1645 initializer.cancelable = false;
1646
1647 RefPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webkitkeyadded, initializer);
1648 event->setTarget(this);
1649 m_asyncEventQueue->enqueueEvent(event.release());
1650 }
1651
1652 void HTMLMediaElement::mediaPlayerKeyError(const String& keySystem, const String & sessionId, MediaPlayerClient::MediaKeyErrorCode errorCode, unsigned short syst emCode)
1653 {
1654 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyError: sessionID=%s, errorCo de=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemCode);
1655
1656 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN;
1657 switch (errorCode) {
1658 case MediaPlayerClient::UnknownError:
1659 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN;
1660 break;
1661 case MediaPlayerClient::ClientError:
1662 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT;
1663 break;
1664 case MediaPlayerClient::ServiceError:
1665 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE;
1666 break;
1667 case MediaPlayerClient::OutputError:
1668 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT;
1669 break;
1670 case MediaPlayerClient::HardwareChangeError:
1671 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE;
1672 break;
1673 case MediaPlayerClient::DomainError:
1674 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN;
1675 break;
1676 }
1677
1678 MediaKeyEventInit initializer;
1679 initializer.keySystem = keySystem;
1680 initializer.sessionId = sessionId;
1681 initializer.errorCode = MediaKeyError::create(mediaKeyErrorCode);
1682 initializer.systemCode = systemCode;
1683 initializer.bubbles = false;
1684 initializer.cancelable = false;
1685
1686 RefPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webkitkeyerror, initializer);
1687 event->setTarget(this);
1688 m_asyncEventQueue->enqueueEvent(event.release());
1689 }
1690
1691 void HTMLMediaElement::mediaPlayerKeyMessage(const String& keySystem, const Stri ng& sessionId, const unsigned char* message, unsigned messageLength, const KURL& defaultURL)
1692 {
1693 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyMessage: sessionID=%s", sess ionId.utf8().data());
1694
1695 MediaKeyEventInit initializer;
1696 initializer.keySystem = keySystem;
1697 initializer.sessionId = sessionId;
1698 initializer.message = Uint8Array::create(message, messageLength);
1699 initializer.defaultURL = defaultURL;
1700 initializer.bubbles = false;
1701 initializer.cancelable = false;
1702
1703 RefPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webkitkeymessage , initializer);
1704 event->setTarget(this);
1705 m_asyncEventQueue->enqueueEvent(event.release());
1706 }
1707
1708 // Create a MediaKeyNeededEvent for WD EME.
1709 static PassRefPtr<Event> createNeedKeyEvent(const String& contentType, const uns igned char* initData, unsigned initDataLength)
1710 {
1711 MediaKeyNeededEventInit initializer;
1712 initializer.contentType = contentType;
1713 initializer.initData = Uint8Array::create(initData, initDataLength);
1714 initializer.bubbles = false;
1715 initializer.cancelable = false;
1716
1717 return MediaKeyNeededEvent::create(EventTypeNames::needkey, initializer);
1718 }
1719
1720 // Create a 'needkey' MediaKeyEvent for v0.1b EME.
1721 static PassRefPtr<Event> createWebkitNeedKeyEvent(const String& contentType, con st unsigned char* initData, unsigned initDataLength)
1722 {
1723 MediaKeyEventInit webkitInitializer;
1724 webkitInitializer.keySystem = String();
1725 webkitInitializer.sessionId = String();
1726 webkitInitializer.initData = Uint8Array::create(initData, initDataLength);
1727 webkitInitializer.bubbles = false;
1728 webkitInitializer.cancelable = false;
1729
1730 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize r);
1731 }
1732
1733 bool HTMLMediaElement::mediaPlayerKeyNeeded(const String& contentType, const uns igned char* initData, unsigned initDataLength)
1734 {
1735 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyNeeded: contentType=%s", con tentType.utf8().data());
1736
1737 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) {
1738 // Send event for WD EME.
1739 RefPtr<Event> event = createNeedKeyEvent(contentType, initData, initData Length);
1740 event->setTarget(this);
1741 m_asyncEventQueue->enqueueEvent(event.release());
1742 }
1743
1744 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) {
1745 // Send event for v0.1b EME.
1746 RefPtr<Event> event = createWebkitNeedKeyEvent(contentType, initData, in itDataLength);
1747 event->setTarget(this);
1748 m_asyncEventQueue->enqueueEvent(event.release());
1749 }
1750
1751 return true;
1752 }
1753
1754 bool HTMLMediaElement::setEmeMode(EmeMode emeMode, ExceptionState& exceptionStat e)
1755 {
1756 if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) {
1757 exceptionState.throwDOMException(InvalidStateError, "Mixed use of EME pr efixed and unprefixed API not allowed.");
1758 return false;
1759 }
1760 m_emeMode = emeMode;
1761 return true;
1762 }
1763
1764 blink::WebContentDecryptionModule* HTMLMediaElement::contentDecryptionModule()
1765 {
1766 return m_mediaKeys ? m_mediaKeys->contentDecryptionModule() : 0;
1767 }
1768
1769 void HTMLMediaElement::setMediaKeysInternal(MediaKeys* mediaKeys)
1770 {
1771 WTF_LOG(Media, "HTMLMediaElement::setMediaKeys");
1772 if (m_mediaKeys == mediaKeys)
1773 return;
1774
1775 ASSERT(m_emeMode = EmeModeUnprefixed);
1776
1777 if (m_mediaKeys)
1778 m_mediaKeys->setMediaElement(0);
1779 m_mediaKeys = mediaKeys;
1780 if (m_mediaKeys)
1781 m_mediaKeys->setMediaElement(this);
1782
1783 // If a player is connected, tell it that the CDM has changed.
1784 if (m_player)
1785 m_player->setContentDecryptionModule(contentDecryptionModule());
1786 }
1787
1788 void HTMLMediaElement::setMediaKeys(MediaKeys* mediaKeys, ExceptionState& except ionState)
1789 {
1790 if (!setEmeMode(EmeModeUnprefixed, exceptionState))
1791 return;
1792
1793 setMediaKeysInternal(mediaKeys);
1794 }
1795
1796 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) 1614 void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*)
1797 { 1615 {
1798 ASSERT(m_player); 1616 ASSERT(m_player);
1799 if (m_networkState != NETWORK_LOADING) 1617 if (m_networkState != NETWORK_LOADING)
1800 return; 1618 return;
1801 1619
1802 double time = WTF::currentTime(); 1620 double time = WTF::currentTime();
1803 double timedelta = time - m_previousProgressTime; 1621 double timedelta = time - m_previousProgressTime;
1804 1622
1805 if (m_player->didLoadingProgress()) { 1623 if (m_player->didLoadingProgress()) {
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
2186 2004
2187 void HTMLMediaElement::closeMediaSource() 2005 void HTMLMediaElement::closeMediaSource()
2188 { 2006 {
2189 if (!m_mediaSource) 2007 if (!m_mediaSource)
2190 return; 2008 return;
2191 2009
2192 m_mediaSource->close(); 2010 m_mediaSource->close();
2193 m_mediaSource = nullptr; 2011 m_mediaSource = nullptr;
2194 } 2012 }
2195 2013
2196 void HTMLMediaElement::webkitGenerateKeyRequest(const String& keySystem, PassRef Ptr<Uint8Array> initData, ExceptionState& exceptionState)
2197 {
2198 WTF_LOG(Media, "HTMLMediaElement::webkitGenerateKeyRequest");
2199
2200 if (!setEmeMode(EmeModePrefixed, exceptionState))
2201 return;
2202
2203 if (keySystem.isEmpty()) {
2204 exceptionState.throwDOMException(SyntaxError, "The key system provided i s empty.");
2205 return;
2206 }
2207
2208 if (!m_player) {
2209 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded.");
2210 return;
2211 }
2212
2213 const unsigned char* initDataPointer = 0;
2214 unsigned initDataLength = 0;
2215 if (initData) {
2216 initDataPointer = initData->data();
2217 initDataLength = initData->length();
2218 }
2219
2220 MediaPlayer::MediaKeyException result = m_player->generateKeyRequest(keySyst em, initDataPointer, initDataLength);
2221 throwExceptionForMediaKeyException(keySystem, String(), result, exceptionSta te);
2222 }
2223
2224 void HTMLMediaElement::webkitGenerateKeyRequest(const String& keySystem, Excepti onState& exceptionState)
2225 {
2226 webkitGenerateKeyRequest(keySystem, Uint8Array::create(0), exceptionState);
2227 }
2228
2229 void HTMLMediaElement::webkitAddKey(const String& keySystem, PassRefPtr<Uint8Arr ay> key, PassRefPtr<Uint8Array> initData, const String& sessionId, ExceptionStat e& exceptionState)
2230 {
2231 WTF_LOG(Media, "HTMLMediaElement::webkitAddKey");
2232
2233 if (!setEmeMode(EmeModePrefixed, exceptionState))
2234 return;
2235
2236 if (keySystem.isEmpty()) {
2237 exceptionState.throwDOMException(SyntaxError, "The key system provided i s empty.");
2238 return;
2239 }
2240
2241 if (!key) {
2242 exceptionState.throwDOMException(SyntaxError, "The key provided is inval id.");
2243 return;
2244 }
2245
2246 if (!key->length()) {
2247 exceptionState.throwDOMException(TypeMismatchError, "The key provided is invalid.");
2248 return;
2249 }
2250
2251 if (!m_player) {
2252 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded.");
2253 return;
2254 }
2255
2256 const unsigned char* initDataPointer = 0;
2257 unsigned initDataLength = 0;
2258 if (initData) {
2259 initDataPointer = initData->data();
2260 initDataLength = initData->length();
2261 }
2262
2263 MediaPlayer::MediaKeyException result = m_player->addKey(keySystem, key->dat a(), key->length(), initDataPointer, initDataLength, sessionId);
2264 throwExceptionForMediaKeyException(keySystem, sessionId, result, exceptionSt ate);
2265 }
2266
2267 void HTMLMediaElement::webkitAddKey(const String& keySystem, PassRefPtr<Uint8Arr ay> key, ExceptionState& exceptionState)
2268 {
2269 webkitAddKey(keySystem, key, Uint8Array::create(0), String(), exceptionState );
2270 }
2271
2272 void HTMLMediaElement::webkitCancelKeyRequest(const String& keySystem, const Str ing& sessionId, ExceptionState& exceptionState)
2273 {
2274 WTF_LOG(Media, "HTMLMediaElement::webkitCancelKeyRequest");
2275
2276 if (!setEmeMode(EmeModePrefixed, exceptionState))
2277 return;
2278
2279 if (keySystem.isEmpty()) {
2280 exceptionState.throwDOMException(SyntaxError, "The key system provided i s empty.");
2281 return;
2282 }
2283
2284 if (!m_player) {
2285 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded.");
2286 return;
2287 }
2288
2289 MediaPlayer::MediaKeyException result = m_player->cancelKeyRequest(keySystem , sessionId);
2290 throwExceptionForMediaKeyException(keySystem, sessionId, result, exceptionSt ate);
2291 }
2292
2293 bool HTMLMediaElement::loop() const 2014 bool HTMLMediaElement::loop() const
2294 { 2015 {
2295 return fastHasAttribute(loopAttr); 2016 return fastHasAttribute(loopAttr);
2296 } 2017 }
2297 2018
2298 void HTMLMediaElement::setLoop(bool b) 2019 void HTMLMediaElement::setLoop(bool b)
2299 { 2020 {
2300 WTF_LOG(Media, "HTMLMediaElement::setLoop(%s)", boolString(b)); 2021 WTF_LOG(Media, "HTMLMediaElement::setLoop(%s)", boolString(b));
2301 setBooleanAttribute(loopAttr, b); 2022 setBooleanAttribute(loopAttr, b);
2302 } 2023 }
(...skipping 1086 matching lines...) Expand 10 before | Expand all | Expand 10 after
3389 #if ENABLE(WEB_AUDIO) 3110 #if ENABLE(WEB_AUDIO)
3390 if (m_audioSourceNode) 3111 if (m_audioSourceNode)
3391 m_audioSourceNode->unlock(); 3112 m_audioSourceNode->unlock();
3392 #endif 3113 #endif
3393 } 3114 }
3394 3115
3395 void HTMLMediaElement::clearMediaPlayer(int flags) 3116 void HTMLMediaElement::clearMediaPlayer(int flags)
3396 { 3117 {
3397 removeAllInbandTracks(); 3118 removeAllInbandTracks();
3398 3119
3399 closeMediaSource(); 3120 closeMediaSource();
ddorwin 2014/02/27 00:37:59 ditto
acolwell GONE FROM CHROMIUM 2014/02/27 01:11:11 Why do you actually need to clear it here vs in th
ddorwin 2014/03/01 01:08:47 We used to have to clear m_mediaKeys. I believe th
3400 3121
3401 setMediaKeysInternal(0);
3402
3403 clearMediaPlayerAndAudioSourceProviderClient(); 3122 clearMediaPlayerAndAudioSourceProviderClient();
3404 3123
3405 stopPeriodicTimers(); 3124 stopPeriodicTimers();
3406 m_loadTimer.stop(); 3125 m_loadTimer.stop();
3407 3126
3408 m_pendingActionFlags &= ~flags; 3127 m_pendingActionFlags &= ~flags;
3409 m_loadState = WaitingForSource; 3128 m_loadState = WaitingForSource;
3410 3129
3411 if (m_textTracks) 3130 if (m_textTracks)
3412 configureTextTrackDisplay(AssumeNoVisibleChange); 3131 configureTextTrackDisplay(AssumeNoVisibleChange);
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
3690 { 3409 {
3691 #if ENABLE(WEB_AUDIO) 3410 #if ENABLE(WEB_AUDIO)
3692 if (m_audioSourceNode) 3411 if (m_audioSourceNode)
3693 m_audioSourceNode->lock(); 3412 m_audioSourceNode->lock();
3694 #endif 3413 #endif
3695 3414
3696 if (m_mediaSource) 3415 if (m_mediaSource)
3697 closeMediaSource(); 3416 closeMediaSource();
3698 3417
3699 m_player = MediaPlayer::create(this); 3418 m_player = MediaPlayer::create(this);
3700 3419
ddorwin 2014/02/27 00:37:59 Where does the removed code get called now? There'
acolwell GONE FROM CHROMIUM 2014/02/27 01:11:11 It's handled in loadInternal(). Why do you need it
c.shu 2014/02/27 14:49:46 Right. All the tests are passing, too.
ddorwin 2014/03/01 01:08:47 I was just checking my understanding. I should hav
3701 if (m_emeMode == EmeModeUnprefixed && m_player)
3702 m_player->setContentDecryptionModule(contentDecryptionModule());
3703
3704 #if ENABLE(WEB_AUDIO) 3420 #if ENABLE(WEB_AUDIO)
3705 if (m_audioSourceNode) { 3421 if (m_audioSourceNode) {
3706 // When creating the player, make sure its AudioSourceProvider knows abo ut the MediaElementAudioSourceNode. 3422 // When creating the player, make sure its AudioSourceProvider knows abo ut the MediaElementAudioSourceNode.
3707 if (audioSourceProvider()) 3423 if (audioSourceProvider())
3708 audioSourceProvider()->setClient(m_audioSourceNode); 3424 audioSourceProvider()->setClient(m_audioSourceNode);
3709 3425
3710 m_audioSourceNode->unlock(); 3426 m_audioSourceNode->unlock();
3711 } 3427 }
3712 #endif 3428 #endif
3713 } 3429 }
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
3917 { 3633 {
3918 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource)); 3634 m_mediaSource->setWebMediaSourceAndOpen(adoptPtr(webMediaSource));
3919 } 3635 }
3920 3636
3921 bool HTMLMediaElement::isInteractiveContent() const 3637 bool HTMLMediaElement::isInteractiveContent() const
3922 { 3638 {
3923 return fastHasAttribute(controlsAttr); 3639 return fastHasAttribute(controlsAttr);
3924 } 3640 }
3925 3641
3926 } 3642 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698