OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights | 2 * Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights |
3 * reserved. | 3 * reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
255 contentMIMEType == "application/octet-stream" || | 255 contentMIMEType == "application/octet-stream" || |
256 contentMIMEType == "text/plain") { | 256 contentMIMEType == "text/plain") { |
257 if (url.protocolIsData()) | 257 if (url.protocolIsData()) |
258 contentMIMEType = mimeTypeFromDataURL(url.getString()); | 258 contentMIMEType = mimeTypeFromDataURL(url.getString()); |
259 } | 259 } |
260 | 260 |
261 // If no MIME type is specified, always attempt to load. | 261 // If no MIME type is specified, always attempt to load. |
262 if (contentMIMEType.isEmpty()) | 262 if (contentMIMEType.isEmpty()) |
263 return true; | 263 return true; |
264 | 264 |
265 // 4.8.10.3 MIME types - In the absence of a specification to the contrary, | 265 // 4.8.12.3 MIME types - In the absence of a specification to the contrary, |
266 // the MIME type "application/octet-stream" when used with parameters, e.g. | 266 // the MIME type "application/octet-stream" when used with parameters, e.g. |
267 // "application/octet-stream;codecs=theora", is a type that the user agent | 267 // "application/octet-stream;codecs=theora", is a type that the user agent |
268 // knows it cannot render. | 268 // knows it cannot render. |
269 if (contentMIMEType != "application/octet-stream" || | 269 if (contentMIMEType != "application/octet-stream" || |
270 contentTypeCodecs.isEmpty()) { | 270 contentTypeCodecs.isEmpty()) { |
271 return MIMETypeRegistry::supportsMediaMIMEType(contentMIMEType, | 271 return MIMETypeRegistry::supportsMediaMIMEType(contentMIMEType, |
272 contentTypeCodecs); | 272 contentTypeCodecs); |
273 } | 273 } |
274 | 274 |
275 return false; | 275 return false; |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); | 330 DEFINE_STATIC_LOCAL(const String, codecs, ("codecs")); |
331 | 331 |
332 String type = contentType.type().lower(); | 332 String type = contentType.type().lower(); |
333 // The codecs string is not lower-cased because MP4 values are case sensitive | 333 // The codecs string is not lower-cased because MP4 values are case sensitive |
334 // per http://tools.ietf.org/html/rfc4281#page-7. | 334 // per http://tools.ietf.org/html/rfc4281#page-7. |
335 String typeCodecs = contentType.parameter(codecs); | 335 String typeCodecs = contentType.parameter(codecs); |
336 | 336 |
337 if (type.isEmpty()) | 337 if (type.isEmpty()) |
338 return MIMETypeRegistry::IsNotSupported; | 338 return MIMETypeRegistry::IsNotSupported; |
339 | 339 |
340 // 4.8.10.3 MIME types - The canPlayType(type) method must return the empty | 340 // 4.8.12.3 MIME types - The canPlayType(type) method must return the empty |
341 // string if type is a type that the user agent knows it cannot render or is | 341 // string if type is a type that the user agent knows it cannot render or is |
342 // the type "application/octet-stream" | 342 // the type "application/octet-stream" |
343 if (type == "application/octet-stream") | 343 if (type == "application/octet-stream") |
344 return MIMETypeRegistry::IsNotSupported; | 344 return MIMETypeRegistry::IsNotSupported; |
345 | 345 |
346 return MIMETypeRegistry::supportsMediaMIMEType(type, typeCodecs); | 346 return MIMETypeRegistry::supportsMediaMIMEType(type, typeCodecs); |
347 } | 347 } |
348 | 348 |
349 URLRegistry* HTMLMediaElement::s_mediaStreamRegistry = 0; | 349 URLRegistry* HTMLMediaElement::s_mediaStreamRegistry = 0; |
350 | 350 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
382 for (const auto& element : elements) { | 382 for (const auto& element : elements) { |
383 element->updateControlsVisibility(); | 383 element->updateControlsVisibility(); |
384 element->mediaControls()->onMediaControlsEnabledChange(); | 384 element->mediaControls()->onMediaControlsEnabledChange(); |
385 } | 385 } |
386 } | 386 } |
387 | 387 |
388 HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, | 388 HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, |
389 Document& document) | 389 Document& document) |
390 : HTMLElement(tagName, document), | 390 : HTMLElement(tagName, document), |
391 SuspendableObject(&document), | 391 SuspendableObject(&document), |
392 m_loadTimer(TaskRunnerHelper::get(TaskType::Unthrottled, &document), | 392 m_loadTimer(TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), |
393 this, | 393 this, |
394 &HTMLMediaElement::loadTimerFired), | 394 &HTMLMediaElement::loadTimerFired), |
395 m_progressEventTimer( | 395 m_progressEventTimer( |
396 TaskRunnerHelper::get(TaskType::Unthrottled, &document), | 396 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), |
397 this, | 397 this, |
398 &HTMLMediaElement::progressEventTimerFired), | 398 &HTMLMediaElement::progressEventTimerFired), |
399 m_playbackProgressTimer( | 399 m_playbackProgressTimer( |
400 TaskRunnerHelper::get(TaskType::Unthrottled, &document), | 400 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), |
401 this, | 401 this, |
402 &HTMLMediaElement::playbackProgressTimerFired), | 402 &HTMLMediaElement::playbackProgressTimerFired), |
403 m_audioTracksTimer( | 403 m_audioTracksTimer( |
404 TaskRunnerHelper::get(TaskType::Unthrottled, &document), | 404 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), |
405 this, | 405 this, |
406 &HTMLMediaElement::audioTracksTimerFired), | 406 &HTMLMediaElement::audioTracksTimerFired), |
407 m_viewportFillDebouncerTimer( | 407 m_viewportFillDebouncerTimer( |
408 TaskRunnerHelper::get(TaskType::Unthrottled, &document), | 408 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), |
409 this, | 409 this, |
410 &HTMLMediaElement::viewportFillDebouncerTimerFired), | 410 &HTMLMediaElement::viewportFillDebouncerTimerFired), |
411 m_checkViewportIntersectionTimer( | 411 m_checkViewportIntersectionTimer( |
412 TaskRunnerHelper::get(TaskType::Unthrottled, &document), | 412 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), |
413 this, | 413 this, |
414 &HTMLMediaElement::checkViewportIntersectionTimerFired), | 414 &HTMLMediaElement::checkViewportIntersectionTimerFired), |
415 m_playedTimeRanges(), | 415 m_playedTimeRanges(), |
416 m_asyncEventQueue(GenericEventQueue::create(this)), | 416 m_asyncEventQueue(GenericEventQueue::create(this)), |
417 m_playbackRate(1.0f), | 417 m_playbackRate(1.0f), |
418 m_defaultPlaybackRate(1.0f), | 418 m_defaultPlaybackRate(1.0f), |
419 m_networkState(kNetworkEmpty), | 419 m_networkState(kNetworkEmpty), |
420 m_readyState(kHaveNothing), | 420 m_readyState(kHaveNothing), |
421 m_readyStateMaximum(kHaveNothing), | 421 m_readyStateMaximum(kHaveNothing), |
422 m_volume(1.0f), | 422 m_volume(1.0f), |
423 m_lastSeekTime(0), | 423 m_lastSeekTime(0), |
424 m_previousProgressTime(std::numeric_limits<double>::max()), | 424 m_previousProgressTime(std::numeric_limits<double>::max()), |
425 m_duration(std::numeric_limits<double>::quiet_NaN()), | 425 m_duration(std::numeric_limits<double>::quiet_NaN()), |
426 m_lastTimeUpdateEventWallTime(0), | 426 m_lastTimeUpdateEventWallTime(0), |
427 m_lastTimeUpdateEventMediaTime(std::numeric_limits<double>::quiet_NaN()), | 427 m_lastTimeUpdateEventMediaTime(std::numeric_limits<double>::quiet_NaN()), |
428 m_defaultPlaybackStartPosition(0), | 428 m_defaultPlaybackStartPosition(0), |
429 m_loadState(WaitingForSource), | 429 m_loadState(WaitingForSource), |
430 m_deferredLoadState(NotDeferred), | 430 m_deferredLoadState(NotDeferred), |
431 m_deferredLoadTimer(this, &HTMLMediaElement::deferredLoadTimerFired), | 431 m_deferredLoadTimer( |
432 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document), | |
433 this, | |
434 &HTMLMediaElement::deferredLoadTimerFired), | |
432 m_webLayer(nullptr), | 435 m_webLayer(nullptr), |
433 m_displayMode(Unknown), | 436 m_displayMode(Unknown), |
434 m_officialPlaybackPosition(0), | 437 m_officialPlaybackPosition(0), |
435 m_officialPlaybackPositionNeedsUpdate(true), | 438 m_officialPlaybackPositionNeedsUpdate(true), |
436 m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()), | 439 m_fragmentEndTime(std::numeric_limits<double>::quiet_NaN()), |
437 m_pendingActionFlags(0), | 440 m_pendingActionFlags(0), |
438 m_lockedPendingUserGesture(false), | 441 m_lockedPendingUserGesture(false), |
439 m_lockedPendingUserGestureIfCrossOriginExperimentEnabled(true), | 442 m_lockedPendingUserGestureIfCrossOriginExperimentEnabled(true), |
440 m_playing(false), | 443 m_playing(false), |
441 m_shouldDelayLoadEvent(false), | 444 m_shouldDelayLoadEvent(false), |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
499 // doesn't get dispatched during the object destruction. | 502 // doesn't get dispatched during the object destruction. |
500 // See Document::isDelayingLoadEvent(). | 503 // See Document::isDelayingLoadEvent(). |
501 // Also see http://crbug.com/275223 for more details. | 504 // Also see http://crbug.com/275223 for more details. |
502 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); | 505 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
503 } | 506 } |
504 | 507 |
505 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) { | 508 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) { |
506 BLINK_MEDIA_LOG << "didMoveToNewDocument(" << (void*)this << ")"; | 509 BLINK_MEDIA_LOG << "didMoveToNewDocument(" << (void*)this << ")"; |
507 | 510 |
508 m_loadTimer.moveToNewTaskRunner( | 511 m_loadTimer.moveToNewTaskRunner( |
509 TaskRunnerHelper::get(TaskType::Unthrottled, &document())); | 512 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); |
510 m_progressEventTimer.moveToNewTaskRunner( | 513 m_progressEventTimer.moveToNewTaskRunner( |
511 TaskRunnerHelper::get(TaskType::Unthrottled, &document())); | 514 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); |
512 m_playbackProgressTimer.moveToNewTaskRunner( | 515 m_playbackProgressTimer.moveToNewTaskRunner( |
513 TaskRunnerHelper::get(TaskType::Unthrottled, &document())); | 516 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); |
514 m_audioTracksTimer.moveToNewTaskRunner( | 517 m_audioTracksTimer.moveToNewTaskRunner( |
515 TaskRunnerHelper::get(TaskType::Unthrottled, &document())); | 518 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); |
516 m_viewportFillDebouncerTimer.moveToNewTaskRunner( | 519 m_viewportFillDebouncerTimer.moveToNewTaskRunner( |
517 TaskRunnerHelper::get(TaskType::Unthrottled, &document())); | 520 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); |
518 m_checkViewportIntersectionTimer.moveToNewTaskRunner( | 521 m_checkViewportIntersectionTimer.moveToNewTaskRunner( |
519 TaskRunnerHelper::get(TaskType::Unthrottled, &document())); | 522 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); |
523 m_deferredLoadTimer.moveToNewTaskRunner( | |
524 TaskRunnerHelper::get(TaskType::MediaElementEvent, &document())); | |
mlamouri (slow - plz ping)
2017/02/22 12:10:03
This is a change in behaviour, right?
| |
520 | 525 |
521 m_autoplayUmaHelper->didMoveToNewDocument(oldDocument); | 526 m_autoplayUmaHelper->didMoveToNewDocument(oldDocument); |
522 // If any experiment is enabled, then we want to enable a user gesture by | 527 // If any experiment is enabled, then we want to enable a user gesture by |
523 // default, otherwise the experiment does nothing. | 528 // default, otherwise the experiment does nothing. |
524 bool oldDocumentRequiresUserGesture = | 529 bool oldDocumentRequiresUserGesture = |
525 computeLockedPendingUserGesture(oldDocument); | 530 computeLockedPendingUserGesture(oldDocument); |
526 bool newDocumentRequiresUserGesture = | 531 bool newDocumentRequiresUserGesture = |
527 computeLockedPendingUserGesture(document()); | 532 computeLockedPendingUserGesture(document()); |
528 if (newDocumentRequiresUserGesture && !oldDocumentRequiresUserGesture) | 533 if (newDocumentRequiresUserGesture && !oldDocumentRequiresUserGesture) |
529 m_lockedPendingUserGesture = true; | 534 m_lockedPendingUserGesture = true; |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
732 } | 737 } |
733 | 738 |
734 HTMLMediaElement::NetworkState HTMLMediaElement::getNetworkState() const { | 739 HTMLMediaElement::NetworkState HTMLMediaElement::getNetworkState() const { |
735 return m_networkState; | 740 return m_networkState; |
736 } | 741 } |
737 | 742 |
738 String HTMLMediaElement::canPlayType(const String& mimeType) const { | 743 String HTMLMediaElement::canPlayType(const String& mimeType) const { |
739 MIMETypeRegistry::SupportsType support = supportsType(ContentType(mimeType)); | 744 MIMETypeRegistry::SupportsType support = supportsType(ContentType(mimeType)); |
740 String canPlay; | 745 String canPlay; |
741 | 746 |
742 // 4.8.10.3 | 747 // 4.8.12.3 |
743 switch (support) { | 748 switch (support) { |
744 case MIMETypeRegistry::IsNotSupported: | 749 case MIMETypeRegistry::IsNotSupported: |
745 canPlay = emptyString; | 750 canPlay = emptyString; |
746 break; | 751 break; |
747 case MIMETypeRegistry::MayBeSupported: | 752 case MIMETypeRegistry::MayBeSupported: |
748 canPlay = "maybe"; | 753 canPlay = "maybe"; |
749 break; | 754 break; |
750 case MIMETypeRegistry::IsSupported: | 755 case MIMETypeRegistry::IsSupported: |
751 canPlay = "probably"; | 756 canPlay = "probably"; |
752 break; | 757 break; |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1220 | 1225 |
1221 if (loadIsDeferred() && effectivePreloadType() != WebMediaPlayer::PreloadNone) | 1226 if (loadIsDeferred() && effectivePreloadType() != WebMediaPlayer::PreloadNone) |
1222 startDeferredLoad(); | 1227 startDeferredLoad(); |
1223 } | 1228 } |
1224 | 1229 |
1225 bool HTMLMediaElement::loadIsDeferred() const { | 1230 bool HTMLMediaElement::loadIsDeferred() const { |
1226 return m_deferredLoadState != NotDeferred; | 1231 return m_deferredLoadState != NotDeferred; |
1227 } | 1232 } |
1228 | 1233 |
1229 void HTMLMediaElement::deferLoad() { | 1234 void HTMLMediaElement::deferLoad() { |
1230 // This implements the "optional" step 3 from the resource fetch algorithm. | 1235 // This implements the "optional" step 4 from the resource fetch algorithm |
1236 // "If mode is remote". | |
1231 DCHECK(!m_deferredLoadTimer.isActive()); | 1237 DCHECK(!m_deferredLoadTimer.isActive()); |
1232 DCHECK_EQ(m_deferredLoadState, NotDeferred); | 1238 DCHECK_EQ(m_deferredLoadState, NotDeferred); |
1233 // 1. Set the networkState to NETWORK_IDLE. | 1239 // 1. Set the networkState to NETWORK_IDLE. |
1234 // 2. Queue a task to fire a simple event named suspend at the element. | 1240 // 2. Queue a task to fire a simple event named suspend at the element. |
1235 changeNetworkStateFromLoadingToIdle(); | 1241 changeNetworkStateFromLoadingToIdle(); |
1236 // 3. Queue a task to set the element's delaying-the-load-event | 1242 // 3. Queue a task to set the element's delaying-the-load-event |
1237 // flag to false. This stops delaying the load event. | 1243 // flag to false. This stops delaying the load event. |
1238 m_deferredLoadTimer.startOneShot(0, BLINK_FROM_HERE); | 1244 m_deferredLoadTimer.startOneShot(0, BLINK_FROM_HERE); |
1239 // 4. Wait for the task to be run. | 1245 // 4. Wait for the task to be run. |
1240 m_deferredLoadState = WaitingForStopDelayingLoadEventTask; | 1246 m_deferredLoadState = WaitingForStopDelayingLoadEventTask; |
1241 // Continued in executeDeferredLoad(). | 1247 // Continued in executeDeferredLoad(). |
1242 } | 1248 } |
1243 | 1249 |
1244 void HTMLMediaElement::cancelDeferredLoad() { | 1250 void HTMLMediaElement::cancelDeferredLoad() { |
1245 m_deferredLoadTimer.stop(); | 1251 m_deferredLoadTimer.stop(); |
1246 m_deferredLoadState = NotDeferred; | 1252 m_deferredLoadState = NotDeferred; |
1247 } | 1253 } |
1248 | 1254 |
1249 void HTMLMediaElement::executeDeferredLoad() { | 1255 void HTMLMediaElement::executeDeferredLoad() { |
1250 DCHECK_GE(m_deferredLoadState, WaitingForTrigger); | 1256 DCHECK_GE(m_deferredLoadState, WaitingForTrigger); |
1251 | 1257 |
1252 // resource fetch algorithm step 3 - continued from deferLoad(). | 1258 // resource fetch algorithm step 4 - continued from deferLoad(). |
1253 | 1259 |
1254 // 5. Wait for an implementation-defined event (e.g. the user requesting that | 1260 // 5. Wait for an implementation-defined event (e.g. the user requesting that |
1255 // the media element begin playback). This is assumed to be whatever 'event' | 1261 // the media element begin playback). This is assumed to be whatever 'event' |
1256 // ended up calling this method. | 1262 // ended up calling this method. |
1257 cancelDeferredLoad(); | 1263 cancelDeferredLoad(); |
1258 // 6. Set the element's delaying-the-load-event flag back to true (this | 1264 // 6. Set the element's delaying-the-load-event flag back to true (this |
1259 // delays the load event again, in case it hasn't been fired yet). | 1265 // delays the load event again, in case it hasn't been fired yet). |
1260 setShouldDelayLoadEvent(true); | 1266 setShouldDelayLoadEvent(true); |
1261 // 7. Set the networkState to NETWORK_LOADING. | 1267 // 7. Set the networkState to NETWORK_LOADING. |
1262 setNetworkState(kNetworkLoading); | 1268 setNetworkState(kNetworkLoading); |
(...skipping 30 matching lines...) Expand all Loading... | |
1293 return WebMediaPlayer::LoadTypeMediaSource; | 1299 return WebMediaPlayer::LoadTypeMediaSource; |
1294 | 1300 |
1295 if (m_srcObject || | 1301 if (m_srcObject || |
1296 (!m_currentSrc.isNull() && isMediaStreamURL(m_currentSrc.getString()))) | 1302 (!m_currentSrc.isNull() && isMediaStreamURL(m_currentSrc.getString()))) |
1297 return WebMediaPlayer::LoadTypeMediaStream; | 1303 return WebMediaPlayer::LoadTypeMediaStream; |
1298 | 1304 |
1299 return WebMediaPlayer::LoadTypeURL; | 1305 return WebMediaPlayer::LoadTypeURL; |
1300 } | 1306 } |
1301 | 1307 |
1302 bool HTMLMediaElement::textTracksAreReady() const { | 1308 bool HTMLMediaElement::textTracksAreReady() const { |
1303 // 4.8.10.12.1 Text track model | 1309 // 4.8.12.11.1 Text track model |
1304 // ... | 1310 // ... |
1305 // The text tracks of a media element are ready if all the text tracks whose | 1311 // The text tracks of a media element are ready if all the text tracks whose |
1306 // mode was not in the disabled state when the element's resource selection | 1312 // mode was not in the disabled state when the element's resource selection |
1307 // algorithm last started now have a text track readiness state of loaded or | 1313 // algorithm last started now have a text track readiness state of loaded or |
1308 // failed to load. | 1314 // failed to load. |
1309 for (const auto& textTrack : m_textTracksWhenResourceSelectionBegan) { | 1315 for (const auto& textTrack : m_textTracksWhenResourceSelectionBegan) { |
1310 if (textTrack->getReadinessState() == TextTrack::Loading || | 1316 if (textTrack->getReadinessState() == TextTrack::Loading || |
1311 textTrack->getReadinessState() == TextTrack::NotLoaded) | 1317 textTrack->getReadinessState() == TextTrack::NotLoaded) |
1312 return false; | 1318 return false; |
1313 } | 1319 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1427 layoutObject()->updateFromElement(); | 1433 layoutObject()->updateFromElement(); |
1428 } | 1434 } |
1429 | 1435 |
1430 void HTMLMediaElement::noneSupported() { | 1436 void HTMLMediaElement::noneSupported() { |
1431 BLINK_MEDIA_LOG << "noneSupported(" << (void*)this << ")"; | 1437 BLINK_MEDIA_LOG << "noneSupported(" << (void*)this << ")"; |
1432 | 1438 |
1433 stopPeriodicTimers(); | 1439 stopPeriodicTimers(); |
1434 m_loadState = WaitingForSource; | 1440 m_loadState = WaitingForSource; |
1435 m_currentSourceNode = nullptr; | 1441 m_currentSourceNode = nullptr; |
1436 | 1442 |
1437 // 4.8.13.5 | 1443 // 4.8.12.5 |
1438 // The dedicated media source failure steps are the following steps: | 1444 // The dedicated media source failure steps are the following steps: |
1439 | 1445 |
1440 // 1 - Set the error attribute to a new MediaError object whose code attribute | 1446 // 1 - Set the error attribute to a new MediaError object whose code attribute |
1441 // is set to MEDIA_ERR_SRC_NOT_SUPPORTED. | 1447 // is set to MEDIA_ERR_SRC_NOT_SUPPORTED. |
1442 m_error = MediaError::create(MediaError::kMediaErrSrcNotSupported); | 1448 m_error = MediaError::create(MediaError::kMediaErrSrcNotSupported); |
1443 | 1449 |
1444 // 2 - Forget the media element's media-resource-specific text tracks. | 1450 // 2 - Forget the media element's media-resource-specific text tracks. |
1445 forgetResourceSpecificTracks(); | 1451 forgetResourceSpecificTracks(); |
1446 | 1452 |
1447 // 3 - Set the element's networkState attribute to the NETWORK_NO_SOURCE | 1453 // 3 - Set the element's networkState attribute to the NETWORK_NO_SOURCE |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1644 m_readyState = kHaveCurrentData; | 1650 m_readyState = kHaveCurrentData; |
1645 } | 1651 } |
1646 | 1652 |
1647 if (oldState > m_readyStateMaximum) | 1653 if (oldState > m_readyStateMaximum) |
1648 m_readyStateMaximum = oldState; | 1654 m_readyStateMaximum = oldState; |
1649 | 1655 |
1650 if (m_networkState == kNetworkEmpty) | 1656 if (m_networkState == kNetworkEmpty) |
1651 return; | 1657 return; |
1652 | 1658 |
1653 if (m_seeking) { | 1659 if (m_seeking) { |
1654 // 4.8.10.9, step 9 note: If the media element was potentially playing | 1660 // 4.8.12.9, step 9 note: If the media element was potentially playing |
1655 // immediately before it started seeking, but seeking caused its readyState | 1661 // immediately before it started seeking, but seeking caused its readyState |
1656 // attribute to change to a value lower than kHaveFutureData, then a waiting | 1662 // attribute to change to a value lower than kHaveFutureData, then a waiting |
1657 // will be fired at the element. | 1663 // will be fired at the element. |
1658 if (wasPotentiallyPlaying && m_readyState < kHaveFutureData) | 1664 if (wasPotentiallyPlaying && m_readyState < kHaveFutureData) |
1659 scheduleEvent(EventTypeNames::waiting); | 1665 scheduleEvent(EventTypeNames::waiting); |
1660 | 1666 |
1661 // 4.8.10.9 steps 12-14 | 1667 // 4.8.12.9 steps 12-14 |
1662 if (m_readyState >= kHaveCurrentData) | 1668 if (m_readyState >= kHaveCurrentData) |
1663 finishSeek(); | 1669 finishSeek(); |
1664 } else { | 1670 } else { |
1665 if (wasPotentiallyPlaying && m_readyState < kHaveFutureData) { | 1671 if (wasPotentiallyPlaying && m_readyState < kHaveFutureData) { |
1666 // Force an update to official playback position. Automatic updates from | 1672 // Force an update to official playback position. Automatic updates from |
1667 // currentPlaybackPosition() will be blocked while m_readyState remains | 1673 // currentPlaybackPosition() will be blocked while m_readyState remains |
1668 // < kHaveFutureData. This blocking is desired after 'waiting' has been | 1674 // < kHaveFutureData. This blocking is desired after 'waiting' has been |
1669 // fired, but its good to update it one final time to accurately reflect | 1675 // fired, but its good to update it one final time to accurately reflect |
1670 // media time at the moment we ran out of data to play. | 1676 // media time at the moment we ran out of data to play. |
1671 setOfficialPlaybackPosition(currentPlaybackPosition()); | 1677 setOfficialPlaybackPosition(currentPlaybackPosition()); |
1672 | 1678 |
1673 // 4.8.10.8 | 1679 // 4.8.12.8 |
1674 scheduleTimeupdateEvent(false); | 1680 scheduleTimeupdateEvent(false); |
1675 scheduleEvent(EventTypeNames::waiting); | 1681 scheduleEvent(EventTypeNames::waiting); |
1676 } | 1682 } |
1677 } | 1683 } |
1678 | 1684 |
1679 // Once enough of the media data has been fetched to determine the duration of | 1685 // Once enough of the media data has been fetched to determine the duration of |
1680 // the media resource, its dimensions, and other metadata... | 1686 // the media resource, its dimensions, and other metadata... |
1681 if (m_readyState >= kHaveMetadata && oldState < kHaveMetadata) { | 1687 if (m_readyState >= kHaveMetadata && oldState < kHaveMetadata) { |
1682 createPlaceholderTracksIfNecessary(); | 1688 createPlaceholderTracksIfNecessary(); |
1683 | 1689 |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2106 | 2112 |
2107 void HTMLMediaElement::updatePlaybackRate() { | 2113 void HTMLMediaElement::updatePlaybackRate() { |
2108 // FIXME: remove m_webMediaPlayer check once we figure out how | 2114 // FIXME: remove m_webMediaPlayer check once we figure out how |
2109 // m_webMediaPlayer is going out of sync with readystate. | 2115 // m_webMediaPlayer is going out of sync with readystate. |
2110 // m_webMediaPlayer is cleared but readystate is not set to kHaveNothing. | 2116 // m_webMediaPlayer is cleared but readystate is not set to kHaveNothing. |
2111 if (m_webMediaPlayer && potentiallyPlaying()) | 2117 if (m_webMediaPlayer && potentiallyPlaying()) |
2112 webMediaPlayer()->setRate(playbackRate()); | 2118 webMediaPlayer()->setRate(playbackRate()); |
2113 } | 2119 } |
2114 | 2120 |
2115 bool HTMLMediaElement::ended() const { | 2121 bool HTMLMediaElement::ended() const { |
2116 // 4.8.10.8 Playing the media resource | 2122 // 4.8.12.8 Playing the media resource |
2117 // The ended attribute must return true if the media element has ended | 2123 // The ended attribute must return true if the media element has ended |
2118 // playback and the direction of playback is forwards, and false otherwise. | 2124 // playback and the direction of playback is forwards, and false otherwise. |
2119 return endedPlayback() && getDirectionOfPlayback() == Forward; | 2125 return endedPlayback() && getDirectionOfPlayback() == Forward; |
2120 } | 2126 } |
2121 | 2127 |
2122 bool HTMLMediaElement::autoplay() const { | 2128 bool HTMLMediaElement::autoplay() const { |
2123 return fastHasAttribute(autoplayAttr); | 2129 return fastHasAttribute(autoplayAttr); |
2124 } | 2130 } |
2125 | 2131 |
2126 bool HTMLMediaElement::shouldAutoplay() { | 2132 bool HTMLMediaElement::shouldAutoplay() { |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2288 void HTMLMediaElement::playInternal() { | 2294 void HTMLMediaElement::playInternal() { |
2289 BLINK_MEDIA_LOG << "playInternal(" << (void*)this << ")"; | 2295 BLINK_MEDIA_LOG << "playInternal(" << (void*)this << ")"; |
2290 | 2296 |
2291 // Always return the buffering strategy to normal when not paused, | 2297 // Always return the buffering strategy to normal when not paused, |
2292 // regardless of the cause. (In contrast with aggressive buffering which is | 2298 // regardless of the cause. (In contrast with aggressive buffering which is |
2293 // only enabled by pause(), not pauseInternal().) | 2299 // only enabled by pause(), not pauseInternal().) |
2294 if (webMediaPlayer()) | 2300 if (webMediaPlayer()) |
2295 webMediaPlayer()->setBufferingStrategy( | 2301 webMediaPlayer()->setBufferingStrategy( |
2296 WebMediaPlayer::BufferingStrategy::Normal); | 2302 WebMediaPlayer::BufferingStrategy::Normal); |
2297 | 2303 |
2298 // 4.8.10.9. Playing the media resource | 2304 // 4.8.12.8. Playing the media resource |
2299 if (m_networkState == kNetworkEmpty) | 2305 if (m_networkState == kNetworkEmpty) |
2300 invokeResourceSelectionAlgorithm(); | 2306 invokeResourceSelectionAlgorithm(); |
2301 | 2307 |
2302 // Generally "ended" and "looping" are exclusive. Here, the loop attribute | 2308 // Generally "ended" and "looping" are exclusive. Here, the loop attribute |
2303 // is ignored to seek back to start in case loop was set after playback | 2309 // is ignored to seek back to start in case loop was set after playback |
2304 // ended. See http://crbug.com/364442 | 2310 // ended. See http://crbug.com/364442 |
2305 if (endedPlayback(LoopCondition::Ignored)) | 2311 if (endedPlayback(LoopCondition::Ignored)) |
2306 seek(0); | 2312 seek(0); |
2307 | 2313 |
2308 if (m_paused) { | 2314 if (m_paused) { |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2674 return videoTrack->id(); | 2680 return videoTrack->id(); |
2675 } | 2681 } |
2676 | 2682 |
2677 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) { | 2683 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) { |
2678 BLINK_MEDIA_LOG << "removeVideoTrack(" << (void*)this << ")"; | 2684 BLINK_MEDIA_LOG << "removeVideoTrack(" << (void*)this << ")"; |
2679 | 2685 |
2680 videoTracks().remove(trackId); | 2686 videoTracks().remove(trackId); |
2681 } | 2687 } |
2682 | 2688 |
2683 void HTMLMediaElement::addTextTrack(WebInbandTextTrack* webTrack) { | 2689 void HTMLMediaElement::addTextTrack(WebInbandTextTrack* webTrack) { |
2684 // 4.8.10.12.2 Sourcing in-band text tracks | 2690 // 4.8.12.11.2 Sourcing in-band text tracks |
2685 // 1. Associate the relevant data with a new text track and its corresponding | 2691 // 1. Associate the relevant data with a new text track and its corresponding |
2686 // new TextTrack object. | 2692 // new TextTrack object. |
2687 InbandTextTrack* textTrack = InbandTextTrack::create(webTrack); | 2693 InbandTextTrack* textTrack = InbandTextTrack::create(webTrack); |
2688 | 2694 |
2689 // 2. Set the new text track's kind, label, and language based on the | 2695 // 2. Set the new text track's kind, label, and language based on the |
2690 // semantics of the relevant data, as defined by the relevant specification. | 2696 // semantics of the relevant data, as defined by the relevant specification. |
2691 // If there is no label in that data, then the label must be set to the empty | 2697 // If there is no label in that data, then the label must be set to the empty |
2692 // string. | 2698 // string. |
2693 // 3. Associate the text track list of cues with the rules for updating the | 2699 // 3. Associate the text track list of cues with the rules for updating the |
2694 // text track rendering appropriate for the format in question. | 2700 // text track rendering appropriate for the format in question. |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2785 } | 2791 } |
2786 | 2792 |
2787 TextTrackList* HTMLMediaElement::textTracks() { | 2793 TextTrackList* HTMLMediaElement::textTracks() { |
2788 if (!m_textTracks) | 2794 if (!m_textTracks) |
2789 m_textTracks = TextTrackList::create(this); | 2795 m_textTracks = TextTrackList::create(this); |
2790 | 2796 |
2791 return m_textTracks.get(); | 2797 return m_textTracks.get(); |
2792 } | 2798 } |
2793 | 2799 |
2794 void HTMLMediaElement::didAddTrackElement(HTMLTrackElement* trackElement) { | 2800 void HTMLMediaElement::didAddTrackElement(HTMLTrackElement* trackElement) { |
2795 // 4.8.10.12.3 Sourcing out-of-band text tracks | 2801 // 4.8.12.11.3 Sourcing out-of-band text tracks |
2796 // When a track element's parent element changes and the new parent is a media | 2802 // When a track element's parent element changes and the new parent is a media |
2797 // element, then the user agent must add the track element's corresponding | 2803 // element, then the user agent must add the track element's corresponding |
2798 // text track to the media element's list of text tracks ... [continues in | 2804 // text track to the media element's list of text tracks ... [continues in |
2799 // TextTrackList::append] | 2805 // TextTrackList::append] |
2800 TextTrack* textTrack = trackElement->track(); | 2806 TextTrack* textTrack = trackElement->track(); |
2801 if (!textTrack) | 2807 if (!textTrack) |
2802 return; | 2808 return; |
2803 | 2809 |
2804 textTracks()->append(textTrack); | 2810 textTracks()->append(textTrack); |
2805 | 2811 |
(...skipping 10 matching lines...) Expand all Loading... | |
2816 | 2822 |
2817 TextTrack* textTrack = trackElement->track(); | 2823 TextTrack* textTrack = trackElement->track(); |
2818 if (!textTrack) | 2824 if (!textTrack) |
2819 return; | 2825 return; |
2820 | 2826 |
2821 textTrack->setHasBeenConfigured(false); | 2827 textTrack->setHasBeenConfigured(false); |
2822 | 2828 |
2823 if (!m_textTracks) | 2829 if (!m_textTracks) |
2824 return; | 2830 return; |
2825 | 2831 |
2826 // 4.8.10.12.3 Sourcing out-of-band text tracks | 2832 // 4.8.12.11.3 Sourcing out-of-band text tracks |
2827 // When a track element's parent element changes and the old parent was a | 2833 // When a track element's parent element changes and the old parent was a |
2828 // media element, then the user agent must remove the track element's | 2834 // media element, then the user agent must remove the track element's |
2829 // corresponding text track from the media element's list of text tracks. | 2835 // corresponding text track from the media element's list of text tracks. |
2830 m_textTracks->remove(textTrack); | 2836 m_textTracks->remove(textTrack); |
2831 | 2837 |
2832 size_t index = m_textTracksWhenResourceSelectionBegan.find(textTrack); | 2838 size_t index = m_textTracksWhenResourceSelectionBegan.find(textTrack); |
2833 if (index != kNotFound) | 2839 if (index != kNotFound) |
2834 m_textTracksWhenResourceSelectionBegan.remove(index); | 2840 m_textTracksWhenResourceSelectionBegan.remove(index); |
2835 } | 2841 } |
2836 | 2842 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3053 BLINK_MEDIA_LOG << "sourceWasRemoved(" << (void*)this | 3059 BLINK_MEDIA_LOG << "sourceWasRemoved(" << (void*)this |
3054 << ") - m_currentSourceNode set to 0"; | 3060 << ") - m_currentSourceNode set to 0"; |
3055 } | 3061 } |
3056 } | 3062 } |
3057 | 3063 |
3058 void HTMLMediaElement::timeChanged() { | 3064 void HTMLMediaElement::timeChanged() { |
3059 BLINK_MEDIA_LOG << "timeChanged(" << (void*)this << ")"; | 3065 BLINK_MEDIA_LOG << "timeChanged(" << (void*)this << ")"; |
3060 | 3066 |
3061 cueTimeline().updateActiveCues(currentTime()); | 3067 cueTimeline().updateActiveCues(currentTime()); |
3062 | 3068 |
3063 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with the | 3069 // 4.8.12.9 steps 12-14. Needed if no ReadyState change is associated with the |
3064 // seek. | 3070 // seek. |
3065 if (m_seeking && m_readyState >= kHaveCurrentData && | 3071 if (m_seeking && m_readyState >= kHaveCurrentData && |
3066 !webMediaPlayer()->seeking()) | 3072 !webMediaPlayer()->seeking()) |
3067 finishSeek(); | 3073 finishSeek(); |
3068 | 3074 |
3069 // Always call scheduleTimeupdateEvent when the media engine reports a time | 3075 // Always call scheduleTimeupdateEvent when the media engine reports a time |
3070 // discontinuity, it will only queue a 'timeupdate' event if we haven't | 3076 // discontinuity, it will only queue a 'timeupdate' event if we haven't |
3071 // already posted one at the current movie time. | 3077 // already posted one at the current movie time. |
3072 scheduleTimeupdateEvent(false); | 3078 scheduleTimeupdateEvent(false); |
3073 | 3079 |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3304 | 3310 |
3305 bool HTMLMediaElement::couldPlayIfEnoughData() const { | 3311 bool HTMLMediaElement::couldPlayIfEnoughData() const { |
3306 return !paused() && !endedPlayback() && !stoppedDueToErrors(); | 3312 return !paused() && !endedPlayback() && !stoppedDueToErrors(); |
3307 } | 3313 } |
3308 | 3314 |
3309 bool HTMLMediaElement::endedPlayback(LoopCondition loopCondition) const { | 3315 bool HTMLMediaElement::endedPlayback(LoopCondition loopCondition) const { |
3310 double dur = duration(); | 3316 double dur = duration(); |
3311 if (std::isnan(dur)) | 3317 if (std::isnan(dur)) |
3312 return false; | 3318 return false; |
3313 | 3319 |
3314 // 4.8.10.8 Playing the media resource | 3320 // 4.8.12.8 Playing the media resource |
3315 | 3321 |
3316 // A media element is said to have ended playback when the element's | 3322 // A media element is said to have ended playback when the element's |
3317 // readyState attribute is HAVE_METADATA or greater, | 3323 // readyState attribute is HAVE_METADATA or greater, |
3318 if (m_readyState < kHaveMetadata) | 3324 if (m_readyState < kHaveMetadata) |
3319 return false; | 3325 return false; |
3320 | 3326 |
3321 // and the current playback position is the end of the media resource and the | 3327 // and the current playback position is the end of the media resource and the |
3322 // direction of playback is forwards, Either the media element does not have a | 3328 // direction of playback is forwards, Either the media element does not have a |
3323 // loop attribute specified, | 3329 // loop attribute specified, |
3324 double now = currentPlaybackPosition(); | 3330 double now = currentPlaybackPosition(); |
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4168 kMostlyFillViewportBecomeStableSeconds, BLINK_FROM_HERE); | 4174 kMostlyFillViewportBecomeStableSeconds, BLINK_FROM_HERE); |
4169 } | 4175 } |
4170 | 4176 |
4171 void HTMLMediaElement::viewportFillDebouncerTimerFired(TimerBase*) { | 4177 void HTMLMediaElement::viewportFillDebouncerTimerFired(TimerBase*) { |
4172 m_mostlyFillingViewport = true; | 4178 m_mostlyFillingViewport = true; |
4173 if (m_webMediaPlayer) | 4179 if (m_webMediaPlayer) |
4174 m_webMediaPlayer->becameDominantVisibleContent(m_mostlyFillingViewport); | 4180 m_webMediaPlayer->becameDominantVisibleContent(m_mostlyFillingViewport); |
4175 } | 4181 } |
4176 | 4182 |
4177 } // namespace blink | 4183 } // namespace blink |
OLD | NEW |