OLD | NEW |
---|---|
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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
87 #include "public/platform/WebInbandTextTrack.h" | 87 #include "public/platform/WebInbandTextTrack.h" |
88 #include "public/platform/WebMediaPlayerSource.h" | 88 #include "public/platform/WebMediaPlayerSource.h" |
89 #include "public/platform/WebMediaStream.h" | 89 #include "public/platform/WebMediaStream.h" |
90 #include "public/platform/modules/remoteplayback/WebRemotePlaybackClient.h" | 90 #include "public/platform/modules/remoteplayback/WebRemotePlaybackClient.h" |
91 #include "public/platform/modules/remoteplayback/WebRemotePlaybackState.h" | 91 #include "public/platform/modules/remoteplayback/WebRemotePlaybackState.h" |
92 #include "wtf/CurrentTime.h" | 92 #include "wtf/CurrentTime.h" |
93 #include "wtf/MathExtras.h" | 93 #include "wtf/MathExtras.h" |
94 #include "wtf/text/CString.h" | 94 #include "wtf/text/CString.h" |
95 #include <limits> | 95 #include <limits> |
96 | 96 |
97 #define MEDIA_LOG_LEVEL 3 | |
98 | |
97 #ifndef LOG_MEDIA_EVENTS | 99 #ifndef LOG_MEDIA_EVENTS |
98 // Default to not logging events because so many are generated they can overwhel m the rest of | 100 // Default to not logging events because so many are generated they can overwhel m the rest of |
99 // the logging. | 101 // the logging. |
100 #define LOG_MEDIA_EVENTS 0 | 102 #define LOG_MEDIA_EVENTS 0 |
101 #endif | 103 #endif |
102 | 104 |
103 #ifndef LOG_CACHED_TIME_WARNINGS | 105 #ifndef LOG_CACHED_TIME_WARNINGS |
104 // Default to not logging warnings about excessive drift in the cached media tim e because it adds a | 106 // Default to not logging warnings about excessive drift in the cached media tim e because it adds a |
105 // fair amount of overhead and logging. | 107 // fair amount of overhead and logging. |
106 #define LOG_CACHED_TIME_WARNINGS 0 | 108 #define LOG_CACHED_TIME_WARNINGS 0 |
(...skipping 12 matching lines...) Expand all Loading... | |
119 const char mediaSourceBlobProtocol[] = "blob"; | 121 const char mediaSourceBlobProtocol[] = "blob"; |
120 | 122 |
121 enum MediaControlsShow { | 123 enum MediaControlsShow { |
122 MediaControlsShowAttribute = 0, | 124 MediaControlsShowAttribute = 0, |
123 MediaControlsShowFullscreen, | 125 MediaControlsShowFullscreen, |
124 MediaControlsShowNoScript, | 126 MediaControlsShowNoScript, |
125 MediaControlsShowNotShown, | 127 MediaControlsShowNotShown, |
126 MediaControlsShowMax | 128 MediaControlsShowMax |
127 }; | 129 }; |
128 | 130 |
129 #if !LOG_DISABLED | |
130 String urlForLoggingMedia(const KURL& url) | 131 String urlForLoggingMedia(const KURL& url) |
131 { | 132 { |
132 static const unsigned maximumURLLengthForLogging = 128; | 133 static const unsigned maximumURLLengthForLogging = 128; |
133 | 134 |
134 if (url.getString().length() < maximumURLLengthForLogging) | 135 if (url.getString().length() < maximumURLLengthForLogging) |
135 return url.getString(); | 136 return url.getString(); |
136 return url.getString().substring(0, maximumURLLengthForLogging) + "..."; | 137 return url.getString().substring(0, maximumURLLengthForLogging) + "..."; |
137 } | 138 } |
138 | 139 |
139 const char* boolString(bool val) | 140 const char* boolString(bool val) |
140 { | 141 { |
141 return val ? "true" : "false"; | 142 return val ? "true" : "false"; |
142 } | 143 } |
143 #endif | |
144 | 144 |
145 DocumentElementSetMap& documentToElementSetMap() | 145 DocumentElementSetMap& documentToElementSetMap() |
146 { | 146 { |
147 DEFINE_STATIC_LOCAL(DocumentElementSetMap, map, (new DocumentElementSetMap)) ; | 147 DEFINE_STATIC_LOCAL(DocumentElementSetMap, map, (new DocumentElementSetMap)) ; |
148 return map; | 148 return map; |
149 } | 149 } |
150 | 150 |
151 void addElementToDocumentMap(HTMLMediaElement* element, Document* document) | 151 void addElementToDocumentMap(HTMLMediaElement* element, Document* document) |
152 { | 152 { |
153 DocumentElementSetMap& map = documentToElementSetMap(); | 153 DocumentElementSetMap& map = documentToElementSetMap(); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 , m_textTracks(nullptr) | 426 , m_textTracks(nullptr) |
427 , m_playPromiseResolveTask(CancellableTaskFactory::create(this, &HTMLMediaEl ement::resolvePlayPromises)) | 427 , m_playPromiseResolveTask(CancellableTaskFactory::create(this, &HTMLMediaEl ement::resolvePlayPromises)) |
428 , m_playPromiseRejectTask(CancellableTaskFactory::create(this, &HTMLMediaEle ment::rejectPlayPromises)) | 428 , m_playPromiseRejectTask(CancellableTaskFactory::create(this, &HTMLMediaEle ment::rejectPlayPromises)) |
429 , m_audioSourceNode(nullptr) | 429 , m_audioSourceNode(nullptr) |
430 , m_autoplayHelperClient(AutoplayHelperClientImpl::create(this)) | 430 , m_autoplayHelperClient(AutoplayHelperClientImpl::create(this)) |
431 , m_autoplayHelper(AutoplayExperimentHelper::create(m_autoplayHelperClient.g et())) | 431 , m_autoplayHelper(AutoplayExperimentHelper::create(m_autoplayHelperClient.g et())) |
432 , m_remotePlaybackClient(nullptr) | 432 , m_remotePlaybackClient(nullptr) |
433 { | 433 { |
434 ThreadState::current()->registerPreFinalizer(this); | 434 ThreadState::current()->registerPreFinalizer(this); |
435 | 435 |
436 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); | 436 DVLOG(MEDIA_LOG_LEVEL) << "HTMLMediaElement(" << (void*)this << ")"; |
437 | 437 |
438 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture()) | 438 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes ture()) |
439 m_userGestureRequiredForPlay = true; | 439 m_userGestureRequiredForPlay = true; |
440 | 440 |
441 setHasCustomStyleCallbacks(); | 441 setHasCustomStyleCallbacks(); |
442 addElementToDocumentMap(this, &document); | 442 addElementToDocumentMap(this, &document); |
443 | 443 |
444 UseCounter::count(document, UseCounter::HTMLMediaElement); | 444 UseCounter::count(document, UseCounter::HTMLMediaElement); |
445 } | 445 } |
446 | 446 |
447 HTMLMediaElement::~HTMLMediaElement() | 447 HTMLMediaElement::~HTMLMediaElement() |
448 { | 448 { |
449 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement(%p)", this); | 449 DVLOG(MEDIA_LOG_LEVEL) << "~HTMLMediaElement(" << (void*)this << ")"; |
450 | 450 |
451 // m_audioSourceNode is explicitly cleared by AudioNode::dispose(). | 451 // m_audioSourceNode is explicitly cleared by AudioNode::dispose(). |
452 // Since AudioNode::dispose() is guaranteed to be always called before | 452 // Since AudioNode::dispose() is guaranteed to be always called before |
453 // the AudioNode is destructed, m_audioSourceNode is explicitly cleared | 453 // the AudioNode is destructed, m_audioSourceNode is explicitly cleared |
454 // even if the AudioNode and the HTMLMediaElement die together. | 454 // even if the AudioNode and the HTMLMediaElement die together. |
455 ASSERT(!m_audioSourceNode); | 455 ASSERT(!m_audioSourceNode); |
456 } | 456 } |
457 | 457 |
458 void HTMLMediaElement::dispose() | 458 void HTMLMediaElement::dispose() |
459 { | 459 { |
460 closeMediaSource(); | 460 closeMediaSource(); |
461 | 461 |
462 // Destroying the player may cause a resource load to be canceled, | 462 // Destroying the player may cause a resource load to be canceled, |
463 // which could result in LocalDOMWindow::dispatchWindowLoadEvent() being | 463 // which could result in LocalDOMWindow::dispatchWindowLoadEvent() being |
464 // called via ResourceFetch::didLoadResource(), then | 464 // called via ResourceFetch::didLoadResource(), then |
465 // FrameLoader::checkCompleted(). But it's guaranteed that the load event | 465 // FrameLoader::checkCompleted(). But it's guaranteed that the load event |
466 // doesn't get dispatched during the object destruction. | 466 // doesn't get dispatched during the object destruction. |
467 // See Document::isDelayingLoadEvent(). | 467 // See Document::isDelayingLoadEvent(). |
468 // Also see http://crbug.com/275223 for more details. | 468 // Also see http://crbug.com/275223 for more details. |
469 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); | 469 clearMediaPlayerAndAudioSourceProviderClientWithoutLocking(); |
470 } | 470 } |
471 | 471 |
472 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) | 472 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) |
473 { | 473 { |
474 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument(%p)", this); | 474 DVLOG(MEDIA_LOG_LEVEL) << "didMoveToNewDocument(" << (void*)this << ")"; |
475 | 475 |
476 if (m_shouldDelayLoadEvent) { | 476 if (m_shouldDelayLoadEvent) { |
477 document().incrementLoadEventDelayCount(); | 477 document().incrementLoadEventDelayCount(); |
478 // Note: Keeping the load event delay count increment on oldDocument tha t was added | 478 // Note: Keeping the load event delay count increment on oldDocument tha t was added |
479 // when m_shouldDelayLoadEvent was set so that destruction of m_webMedia Player can not | 479 // when m_shouldDelayLoadEvent was set so that destruction of m_webMedia Player can not |
480 // cause load event dispatching in oldDocument. | 480 // cause load event dispatching in oldDocument. |
481 } else { | 481 } else { |
482 // Incrementing the load event delay count so that destruction of m_webM ediaPlayer can not | 482 // Incrementing the load event delay count so that destruction of m_webM ediaPlayer can not |
483 // cause load event dispatching in oldDocument. | 483 // cause load event dispatching in oldDocument. |
484 oldDocument.incrementLoadEventDelayCount(); | 484 oldDocument.incrementLoadEventDelayCount(); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
551 return shouldShowControls() && HTMLElement::layoutObjectIsNeeded(style); | 551 return shouldShowControls() && HTMLElement::layoutObjectIsNeeded(style); |
552 } | 552 } |
553 | 553 |
554 LayoutObject* HTMLMediaElement::createLayoutObject(const ComputedStyle&) | 554 LayoutObject* HTMLMediaElement::createLayoutObject(const ComputedStyle&) |
555 { | 555 { |
556 return new LayoutMedia(this); | 556 return new LayoutMedia(this); |
557 } | 557 } |
558 | 558 |
559 Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(ContainerNode* insertionPoint) | 559 Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(ContainerNode* insertionPoint) |
560 { | 560 { |
561 WTF_LOG(Media, "HTMLMediaElement::insertedInto(%p, %p)", this, insertionPoin t); | 561 DVLOG(MEDIA_LOG_LEVEL) << "insertedInto(" << (void*)this << ", " << insertio nPoint << ")"; |
562 | 562 |
563 HTMLElement::insertedInto(insertionPoint); | 563 HTMLElement::insertedInto(insertionPoint); |
564 if (insertionPoint->inShadowIncludingDocument()) { | 564 if (insertionPoint->inShadowIncludingDocument()) { |
565 UseCounter::count(document(), UseCounter::HTMLMediaElementInDocument); | 565 UseCounter::count(document(), UseCounter::HTMLMediaElementInDocument); |
566 if ((!getAttribute(srcAttr).isEmpty() || m_srcObject) && m_networkState == NETWORK_EMPTY) { | 566 if ((!getAttribute(srcAttr).isEmpty() || m_srcObject) && m_networkState == NETWORK_EMPTY) { |
567 m_ignorePreloadNone = false; | 567 m_ignorePreloadNone = false; |
568 invokeLoadAlgorithm(); | 568 invokeLoadAlgorithm(); |
569 } | 569 } |
570 } | 570 } |
571 | 571 |
572 return InsertionShouldCallDidNotifySubtreeInsertions; | 572 return InsertionShouldCallDidNotifySubtreeInsertions; |
573 } | 573 } |
574 | 574 |
575 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() | 575 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() |
576 { | 576 { |
577 configureMediaControls(); | 577 configureMediaControls(); |
578 } | 578 } |
579 | 579 |
580 void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) | 580 void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) |
581 { | 581 { |
582 WTF_LOG(Media, "HTMLMediaElement::removedFrom(%p, %p)", this, insertionPoint ); | 582 DVLOG(MEDIA_LOG_LEVEL) << "removedFrom(" << (void*)this << ", " << insertion Point << ")"; |
583 | 583 |
584 HTMLElement::removedFrom(insertionPoint); | 584 HTMLElement::removedFrom(insertionPoint); |
585 if (insertionPoint->inActiveDocument()) { | 585 if (insertionPoint->inActiveDocument()) { |
586 configureMediaControls(); | 586 configureMediaControls(); |
587 if (m_networkState > NETWORK_EMPTY) | 587 if (m_networkState > NETWORK_EMPTY) |
588 pauseInternal(); | 588 pauseInternal(); |
589 } | 589 } |
590 } | 590 } |
591 | 591 |
592 void HTMLMediaElement::attach(const AttachContext& context) | 592 void HTMLMediaElement::attach(const AttachContext& context) |
593 { | 593 { |
594 HTMLElement::attach(context); | 594 HTMLElement::attach(context); |
595 | 595 |
596 if (layoutObject()) | 596 if (layoutObject()) |
597 layoutObject()->updateFromElement(); | 597 layoutObject()->updateFromElement(); |
598 } | 598 } |
599 | 599 |
600 void HTMLMediaElement::didRecalcStyle(StyleRecalcChange) | 600 void HTMLMediaElement::didRecalcStyle(StyleRecalcChange) |
601 { | 601 { |
602 if (layoutObject()) | 602 if (layoutObject()) |
603 layoutObject()->updateFromElement(); | 603 layoutObject()->updateFromElement(); |
604 } | 604 } |
605 | 605 |
606 void HTMLMediaElement::scheduleTextTrackResourceLoad() | 606 void HTMLMediaElement::scheduleTextTrackResourceLoad() |
607 { | 607 { |
608 WTF_LOG(Media, "HTMLMediaElement::scheduleTextTrackResourceLoad(%p)", this); | 608 DVLOG(MEDIA_LOG_LEVEL) << "scheduleTextTrackResourceLoad(" << (void*)this << ")"; |
609 | 609 |
610 m_pendingActionFlags |= LoadTextTrackResource; | 610 m_pendingActionFlags |= LoadTextTrackResource; |
611 | 611 |
612 if (!m_loadTimer.isActive()) | 612 if (!m_loadTimer.isActive()) |
613 m_loadTimer.startOneShot(0, BLINK_FROM_HERE); | 613 m_loadTimer.startOneShot(0, BLINK_FROM_HERE); |
614 } | 614 } |
615 | 615 |
616 void HTMLMediaElement::scheduleNextSourceChild() | 616 void HTMLMediaElement::scheduleNextSourceChild() |
617 { | 617 { |
618 // Schedule the timer to try the next <source> element WITHOUT resetting sta te ala invokeLoadAlgorithm. | 618 // Schedule the timer to try the next <source> element WITHOUT resetting sta te ala invokeLoadAlgorithm. |
619 m_pendingActionFlags |= LoadMediaResource; | 619 m_pendingActionFlags |= LoadMediaResource; |
620 m_loadTimer.startOneShot(0, BLINK_FROM_HERE); | 620 m_loadTimer.startOneShot(0, BLINK_FROM_HERE); |
621 } | 621 } |
622 | 622 |
623 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) | 623 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) |
624 { | 624 { |
625 scheduleEvent(Event::createCancelable(eventName)); | 625 scheduleEvent(Event::createCancelable(eventName)); |
626 } | 626 } |
627 | 627 |
628 void HTMLMediaElement::scheduleEvent(Event* event) | 628 void HTMLMediaElement::scheduleEvent(Event* event) |
629 { | 629 { |
630 #if LOG_MEDIA_EVENTS | 630 #if LOG_MEDIA_EVENTS |
631 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent(%p) - scheduling '%s'", this , event->type().ascii().data()); | 631 DVLOG(MEDIA_LOG_LEVEL) << "scheduleEvent(" << (void*)this << ")" << " - sche duling '" << event->type() << "'"; |
632 #endif | 632 #endif |
633 m_asyncEventQueue->enqueueEvent(event); | 633 m_asyncEventQueue->enqueueEvent(event); |
634 } | 634 } |
635 | 635 |
636 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) | 636 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) |
637 { | 637 { |
638 if (m_pendingActionFlags & LoadTextTrackResource) | 638 if (m_pendingActionFlags & LoadTextTrackResource) |
639 honorUserPreferencesForAutomaticTextTrackSelection(); | 639 honorUserPreferencesForAutomaticTextTrackSelection(); |
640 | 640 |
641 if (m_pendingActionFlags & LoadMediaResource) { | 641 if (m_pendingActionFlags & LoadMediaResource) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
680 canPlay = emptyString(); | 680 canPlay = emptyString(); |
681 break; | 681 break; |
682 case WebMimeRegistry::MayBeSupported: | 682 case WebMimeRegistry::MayBeSupported: |
683 canPlay = "maybe"; | 683 canPlay = "maybe"; |
684 break; | 684 break; |
685 case WebMimeRegistry::IsSupported: | 685 case WebMimeRegistry::IsSupported: |
686 canPlay = "probably"; | 686 canPlay = "probably"; |
687 break; | 687 break; |
688 } | 688 } |
689 | 689 |
690 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%p, %s) -> %s", this, mimeType .utf8().data(), canPlay.utf8().data()); | 690 DVLOG(MEDIA_LOG_LEVEL) << "canPlayType(" << (void*)this << ", " << mimeType << ") -> " << canPlay; |
691 | 691 |
692 return canPlay; | 692 return canPlay; |
693 } | 693 } |
694 | 694 |
695 void HTMLMediaElement::load() | 695 void HTMLMediaElement::load() |
696 { | 696 { |
697 WTF_LOG(Media, "HTMLMediaElement::load(%p)", this); | 697 DVLOG(MEDIA_LOG_LEVEL) << "load(" << (void*)this << ")"; |
698 | 698 |
699 m_autoplayHelper->loadMethodCalled(); | 699 m_autoplayHelper->loadMethodCalled(); |
700 | 700 |
701 m_ignorePreloadNone = true; | 701 m_ignorePreloadNone = true; |
702 invokeLoadAlgorithm(); | 702 invokeLoadAlgorithm(); |
703 } | 703 } |
704 | 704 |
705 // TODO(srirama.m): Currently m_ignorePreloadNone is reset before calling | 705 // TODO(srirama.m): Currently m_ignorePreloadNone is reset before calling |
706 // invokeLoadAlgorithm() in all places except load(). Move it inside here | 706 // invokeLoadAlgorithm() in all places except load(). Move it inside here |
707 // once microtask is implemented for "Await a stable state" step | 707 // once microtask is implemented for "Await a stable state" step |
708 // in resource selection algorithm. | 708 // in resource selection algorithm. |
709 void HTMLMediaElement::invokeLoadAlgorithm() | 709 void HTMLMediaElement::invokeLoadAlgorithm() |
710 { | 710 { |
711 WTF_LOG(Media, "HTMLMediaElement::invokeLoadAlgorithm(%p)", this); | 711 DVLOG(MEDIA_LOG_LEVEL) << "invokeLoadAlgorithm(" << (void*)this << ")"; |
712 | 712 |
713 // Perform the cleanup required for the resource load algorithm to run. | 713 // Perform the cleanup required for the resource load algorithm to run. |
714 stopPeriodicTimers(); | 714 stopPeriodicTimers(); |
715 m_loadTimer.stop(); | 715 m_loadTimer.stop(); |
716 cancelDeferredLoad(); | 716 cancelDeferredLoad(); |
717 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here. | 717 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec essary and set m_pendingActionFlags to 0 here. |
718 m_pendingActionFlags &= ~LoadMediaResource; | 718 m_pendingActionFlags &= ~LoadMediaResource; |
719 m_sentEndEvent = false; | 719 m_sentEndEvent = false; |
720 m_sentStalledEvent = false; | 720 m_sentStalledEvent = false; |
721 m_haveFiredLoadedData = false; | 721 m_haveFiredLoadedData = false; |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
789 m_autoplaying = true; | 789 m_autoplaying = true; |
790 | 790 |
791 // 7 - Invoke the media element's resource selection algorithm. | 791 // 7 - Invoke the media element's resource selection algorithm. |
792 invokeResourceSelectionAlgorithm(); | 792 invokeResourceSelectionAlgorithm(); |
793 | 793 |
794 // 8 - Note: Playback of any previously playing media resource for this elem ent stops. | 794 // 8 - Note: Playback of any previously playing media resource for this elem ent stops. |
795 } | 795 } |
796 | 796 |
797 void HTMLMediaElement::invokeResourceSelectionAlgorithm() | 797 void HTMLMediaElement::invokeResourceSelectionAlgorithm() |
798 { | 798 { |
799 WTF_LOG(Media, "HTMLMediaElement::invokeResourceSelectionAlgorithm(%p)", thi s); | 799 DVLOG(MEDIA_LOG_LEVEL) << "invokeResourceSelectionAlgorithm(" << (void*)this << ")"; |
800 // The resource selection algorithm | 800 // The resource selection algorithm |
801 // 1 - Set the networkState to NETWORK_NO_SOURCE | 801 // 1 - Set the networkState to NETWORK_NO_SOURCE |
802 setNetworkState(NETWORK_NO_SOURCE); | 802 setNetworkState(NETWORK_NO_SOURCE); |
803 | 803 |
804 // 2 - Set the element's show poster flag to true | 804 // 2 - Set the element's show poster flag to true |
805 // TODO(srirama.m): Introduce show poster flag and update it as per spec | 805 // TODO(srirama.m): Introduce show poster flag and update it as per spec |
806 | 806 |
807 m_playedTimeRanges = TimeRanges::create(); | 807 m_playedTimeRanges = TimeRanges::create(); |
808 | 808 |
809 // FIXME: Investigate whether these can be moved into m_networkState != NETW ORK_EMPTY block above | 809 // FIXME: Investigate whether these can be moved into m_networkState != NETW ORK_EMPTY block above |
(...skipping 23 matching lines...) Expand all Loading... | |
833 if (track->mode() != TextTrack::disabledKeyword()) | 833 if (track->mode() != TextTrack::disabledKeyword()) |
834 m_textTracksWhenResourceSelectionBegan.append(track); | 834 m_textTracksWhenResourceSelectionBegan.append(track); |
835 } | 835 } |
836 } | 836 } |
837 | 837 |
838 selectMediaResource(); | 838 selectMediaResource(); |
839 } | 839 } |
840 | 840 |
841 void HTMLMediaElement::selectMediaResource() | 841 void HTMLMediaElement::selectMediaResource() |
842 { | 842 { |
843 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this); | 843 DVLOG(MEDIA_LOG_LEVEL) << "selectMediaResource(" << (void*)this << ")"; |
844 | 844 |
845 enum Mode { Object, Attribute, Children, Nothing }; | 845 enum Mode { Object, Attribute, Children, Nothing }; |
846 Mode mode = Nothing; | 846 Mode mode = Nothing; |
847 | 847 |
848 // 6 - If the media element has an assigned media provider object, then let | 848 // 6 - If the media element has an assigned media provider object, then let |
849 // mode be object. | 849 // mode be object. |
850 if (m_srcObject) { | 850 if (m_srcObject) { |
851 mode = Object; | 851 mode = Object; |
852 } else if (fastHasAttribute(srcAttr)) { | 852 } else if (fastHasAttribute(srcAttr)) { |
853 // Otherwise, if the media element has no assigned media provider object | 853 // Otherwise, if the media element has no assigned media provider object |
(...skipping 10 matching lines...) Expand all Loading... | |
864 } else { | 864 } else { |
865 // Otherwise the media element has no assigned media provider object and | 865 // Otherwise the media element has no assigned media provider object and |
866 // has neither a src attribute nor a source element child: set the | 866 // has neither a src attribute nor a source element child: set the |
867 // networkState to NETWORK_EMPTY, and abort these steps; the synchronous | 867 // networkState to NETWORK_EMPTY, and abort these steps; the synchronous |
868 // section ends. | 868 // section ends. |
869 m_loadState = WaitingForSource; | 869 m_loadState = WaitingForSource; |
870 setShouldDelayLoadEvent(false); | 870 setShouldDelayLoadEvent(false); |
871 setNetworkState(NETWORK_EMPTY); | 871 setNetworkState(NETWORK_EMPTY); |
872 updateDisplayState(); | 872 updateDisplayState(); |
873 | 873 |
874 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing to lo ad", this); | 874 DVLOG(MEDIA_LOG_LEVEL) << "selectMediaResource(" << (void*)this << "), n othing to load"; |
875 return; | 875 return; |
876 } | 876 } |
877 | 877 |
878 // 7 - Set the media element's networkState to NETWORK_LOADING. | 878 // 7 - Set the media element's networkState to NETWORK_LOADING. |
879 setNetworkState(NETWORK_LOADING); | 879 setNetworkState(NETWORK_LOADING); |
880 | 880 |
881 // 8 - Queue a task to fire a simple event named loadstart at the media elem ent. | 881 // 8 - Queue a task to fire a simple event named loadstart at the media elem ent. |
882 scheduleEvent(EventTypeNames::loadstart); | 882 scheduleEvent(EventTypeNames::loadstart); |
883 | 883 |
884 // 9 - Run the appropriate steps... | 884 // 9 - Run the appropriate steps... |
885 switch (mode) { | 885 switch (mode) { |
886 case Object: | 886 case Object: |
887 loadSourceFromObject(); | 887 loadSourceFromObject(); |
888 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'srcObj ect' attribute", this); | 888 DVLOG(MEDIA_LOG_LEVEL) << "selectMediaResource(" << (void*)this << ", us ing 'srcObject' attribute"; |
889 break; | 889 break; |
890 case Attribute: | 890 case Attribute: |
891 loadSourceFromAttribute(); | 891 loadSourceFromAttribute(); |
892 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' a ttribute url", this); | 892 DVLOG(MEDIA_LOG_LEVEL) << "selectMediaResource(" << (void*)this << "), u sing 'src' attribute url"; |
893 break; | 893 break; |
894 case Children: | 894 case Children: |
895 loadNextSourceChild(); | 895 loadNextSourceChild(); |
896 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using source element", this); | 896 DVLOG(MEDIA_LOG_LEVEL) << "selectMediaResource(" << (void*)this << "), u sing source element"; |
897 break; | 897 break; |
898 default: | 898 default: |
899 ASSERT_NOT_REACHED(); | 899 ASSERT_NOT_REACHED(); |
wolenetz
2016/05/19 17:43:36
nit: NOTREACHED() ?
| |
900 } | 900 } |
901 } | 901 } |
902 | 902 |
903 void HTMLMediaElement::loadSourceFromObject() | 903 void HTMLMediaElement::loadSourceFromObject() |
904 { | 904 { |
905 ASSERT(m_srcObject); | 905 ASSERT(m_srcObject); |
wolenetz
2016/05/19 17:43:36
nit: DCHECK(...) ?
| |
906 m_loadState = LoadingFromSrcObject; | 906 m_loadState = LoadingFromSrcObject; |
907 | 907 |
908 // No type is available when the resource comes from the 'srcObject' | 908 // No type is available when the resource comes from the 'srcObject' |
909 // attribute. | 909 // attribute. |
910 ContentType contentType((String())); | 910 ContentType contentType((String())); |
911 loadResource(WebMediaPlayerSource(WebMediaStream(m_srcObject)), contentType) ; | 911 loadResource(WebMediaPlayerSource(WebMediaStream(m_srcObject)), contentType) ; |
912 } | 912 } |
913 | 913 |
914 void HTMLMediaElement::loadSourceFromAttribute() | 914 void HTMLMediaElement::loadSourceFromAttribute() |
915 { | 915 { |
916 m_loadState = LoadingFromSrcAttr; | 916 m_loadState = LoadingFromSrcAttr; |
917 const AtomicString& srcValue = fastGetAttribute(srcAttr); | 917 const AtomicString& srcValue = fastGetAttribute(srcAttr); |
918 | 918 |
919 // If the src attribute's value is the empty string ... jump down to the fai led step below | 919 // If the src attribute's value is the empty string ... jump down to the fai led step below |
920 if (srcValue.isEmpty()) { | 920 if (srcValue.isEmpty()) { |
921 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 921 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
922 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'src'", this); | 922 DVLOG(MEDIA_LOG_LEVEL) << "selectMediaResource(" << (void*)this << "), e mpty 'src'"; |
923 return; | 923 return; |
924 } | 924 } |
925 | 925 |
926 KURL mediaURL = document().completeURL(srcValue); | 926 KURL mediaURL = document().completeURL(srcValue); |
927 if (!isSafeToLoadURL(mediaURL, Complain)) { | 927 if (!isSafeToLoadURL(mediaURL, Complain)) { |
928 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 928 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
929 return; | 929 return; |
930 } | 930 } |
931 | 931 |
932 // No type is available when the url comes from the 'src' attribute so | 932 // No type is available when the url comes from the 'src' attribute so |
(...skipping 18 matching lines...) Expand all Loading... | |
951 loadResource(WebMediaPlayerSource(WebURL(mediaURL)), contentType); | 951 loadResource(WebMediaPlayerSource(WebURL(mediaURL)), contentType); |
952 } | 952 } |
953 | 953 |
954 void HTMLMediaElement::loadResource(const WebMediaPlayerSource& source, ContentT ype& contentType) | 954 void HTMLMediaElement::loadResource(const WebMediaPlayerSource& source, ContentT ype& contentType) |
955 { | 955 { |
956 ASSERT(isMainThread()); | 956 ASSERT(isMainThread()); |
957 KURL url; | 957 KURL url; |
958 if (source.isURL()) { | 958 if (source.isURL()) { |
959 url = source.getAsURL(); | 959 url = source.getAsURL(); |
960 ASSERT(isSafeToLoadURL(url, Complain)); | 960 ASSERT(isSafeToLoadURL(url, Complain)); |
961 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p, %s, %s)", this, urlFo rLoggingMedia(url).utf8().data(), contentType.raw().utf8().data()); | 961 DVLOG(MEDIA_LOG_LEVEL) << "loadResource(" << (void*)this << ", " << urlF orLoggingMedia(url) << ", " << contentType.raw() << ")"; |
962 } | 962 } |
963 | 963 |
964 LocalFrame* frame = document().frame(); | 964 LocalFrame* frame = document().frame(); |
965 if (!frame) { | 965 if (!frame) { |
966 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 966 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
967 return; | 967 return; |
968 } | 968 } |
969 | 969 |
970 // The resource fetch algorithm | 970 // The resource fetch algorithm |
971 setNetworkState(NETWORK_LOADING); | 971 setNetworkState(NETWORK_LOADING); |
972 | 972 |
973 m_autoplayHelper->loadingStarted(); | 973 m_autoplayHelper->loadingStarted(); |
974 | 974 |
975 // Set m_currentSrc *before* changing to the cache url, the fact that we are loading from the app | 975 // Set m_currentSrc *before* changing to the cache url, the fact that we are loading from the app |
976 // cache is an internal detail not exposed through the media element API. | 976 // cache is an internal detail not exposed through the media element API. |
977 m_currentSrc = url; | 977 m_currentSrc = url; |
978 | 978 |
979 if (m_audioSourceNode) | 979 if (m_audioSourceNode) |
980 m_audioSourceNode->onCurrentSrcChanged(m_currentSrc); | 980 m_audioSourceNode->onCurrentSrcChanged(m_currentSrc); |
981 | 981 |
982 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) - m_currentSrc -> %s", th is, urlForLoggingMedia(m_currentSrc).utf8().data()); | 982 DVLOG(MEDIA_LOG_LEVEL) << "loadResource(" << (void*)this << ") - m_currentSr c -> " << urlForLoggingMedia(m_currentSrc); |
983 | 983 |
984 startProgressEventTimer(); | 984 startProgressEventTimer(); |
985 | 985 |
986 // Reset display mode to force a recalculation of what to show because we ar e resetting the player. | 986 // Reset display mode to force a recalculation of what to show because we ar e resetting the player. |
987 setDisplayMode(Unknown); | 987 setDisplayMode(Unknown); |
988 | 988 |
989 setPlayerPreload(); | 989 setPlayerPreload(); |
990 | 990 |
991 if (fastHasAttribute(mutedAttr)) | 991 if (fastHasAttribute(mutedAttr)) |
992 m_muted = true; | 992 m_muted = true; |
(...skipping 23 matching lines...) Expand all Loading... | |
1016 } | 1016 } |
1017 | 1017 |
1018 bool canLoadResource = source.isMediaStream() || canLoadURL(url, contentType ); | 1018 bool canLoadResource = source.isMediaStream() || canLoadURL(url, contentType ); |
1019 if (attemptLoad && canLoadResource) { | 1019 if (attemptLoad && canLoadResource) { |
1020 ASSERT(!webMediaPlayer()); | 1020 ASSERT(!webMediaPlayer()); |
1021 | 1021 |
1022 // Conditionally defer the load if effective preload is 'none'. | 1022 // Conditionally defer the load if effective preload is 'none'. |
1023 // Skip this optional deferral for MediaStream sources or any blob URL, | 1023 // Skip this optional deferral for MediaStream sources or any blob URL, |
1024 // including MediaSource blob URLs. | 1024 // including MediaSource blob URLs. |
1025 if (!isStreamOrBlobUrl && effectivePreloadType() == WebMediaPlayer::Prel oadNone) { | 1025 if (!isStreamOrBlobUrl && effectivePreloadType() == WebMediaPlayer::Prel oadNone) { |
1026 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this); | 1026 DVLOG(MEDIA_LOG_LEVEL) << "loadResource(" << (void*)this << ") : Del aying load because preload == 'none'"; |
1027 deferLoad(); | 1027 deferLoad(); |
1028 } else { | 1028 } else { |
1029 startPlayerLoad(); | 1029 startPlayerLoad(); |
1030 } | 1030 } |
1031 } else { | 1031 } else { |
1032 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 1032 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
1033 } | 1033 } |
1034 | 1034 |
1035 // If there is no poster to display, allow the media engine to render video frames as soon as | 1035 // If there is no poster to display, allow the media engine to render video frames as soon as |
1036 // they are available. | 1036 // they are available. |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1237 } | 1237 } |
1238 | 1238 |
1239 void HTMLMediaElement::disableAutomaticTextTrackSelection() | 1239 void HTMLMediaElement::disableAutomaticTextTrackSelection() |
1240 { | 1240 { |
1241 m_shouldPerformAutomaticTrackSelection = false; | 1241 m_shouldPerformAutomaticTrackSelection = false; |
1242 } | 1242 } |
1243 | 1243 |
1244 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionI fInvalid) | 1244 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionI fInvalid) |
1245 { | 1245 { |
1246 if (!url.isValid()) { | 1246 if (!url.isValid()) { |
1247 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE becau se url is invalid", this, urlForLoggingMedia(url).utf8().data()); | 1247 DVLOG(MEDIA_LOG_LEVEL) << "isSafeToLoadURL(" << (void*)this << ", " << u rlForLoggingMedia(url) << ") -> FALSE because url is invalid"; |
1248 return false; | 1248 return false; |
1249 } | 1249 } |
1250 | 1250 |
1251 LocalFrame* frame = document().frame(); | 1251 LocalFrame* frame = document().frame(); |
1252 if (!frame || !document().getSecurityOrigin()->canDisplay(url)) { | 1252 if (!frame || !document().getSecurityOrigin()->canDisplay(url)) { |
1253 if (actionIfInvalid == Complain) | 1253 if (actionIfInvalid == Complain) |
1254 FrameLoader::reportLocalLoadFailed(frame, url.elidedString()); | 1254 FrameLoader::reportLocalLoadFailed(frame, url.elidedString()); |
1255 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE rejec ted by SecurityOrigin", this, urlForLoggingMedia(url).utf8().data()); | 1255 DVLOG(MEDIA_LOG_LEVEL) << "isSafeToLoadURL(" << (void*)this << ", " << u rlForLoggingMedia(url) << ") -> FALSE rejected by SecurityOrigin"; |
1256 return false; | 1256 return false; |
1257 } | 1257 } |
1258 | 1258 |
1259 if (!document().contentSecurityPolicy()->allowMediaFromSource(url)) { | 1259 if (!document().contentSecurityPolicy()->allowMediaFromSource(url)) { |
1260 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> rejected by Content Security Policy", this, urlForLoggingMedia(url).utf8().data()); | 1260 DVLOG(MEDIA_LOG_LEVEL) << "isSafeToLoadURL(" << (void*)this << ", " << u rlForLoggingMedia(url) << ") -> rejected by Content Security Policy"; |
1261 return false; | 1261 return false; |
1262 } | 1262 } |
1263 | 1263 |
1264 return true; | 1264 return true; |
1265 } | 1265 } |
1266 | 1266 |
1267 bool HTMLMediaElement::isMediaDataCORSSameOrigin(SecurityOrigin* origin) const | 1267 bool HTMLMediaElement::isMediaDataCORSSameOrigin(SecurityOrigin* origin) const |
1268 { | 1268 { |
1269 // hasSingleSecurityOrigin() tells us whether the origin in the src is | 1269 // hasSingleSecurityOrigin() tells us whether the origin in the src is |
1270 // the same as the actual request (i.e. after redirect). | 1270 // the same as the actual request (i.e. after redirect). |
(...skipping 10 matching lines...) Expand all Loading... | |
1281 if (m_progressEventTimer.isActive()) | 1281 if (m_progressEventTimer.isActive()) |
1282 return; | 1282 return; |
1283 | 1283 |
1284 m_previousProgressTime = WTF::currentTime(); | 1284 m_previousProgressTime = WTF::currentTime(); |
1285 // 350ms is not magic, it is in the spec! | 1285 // 350ms is not magic, it is in the spec! |
1286 m_progressEventTimer.startRepeating(0.350, BLINK_FROM_HERE); | 1286 m_progressEventTimer.startRepeating(0.350, BLINK_FROM_HERE); |
1287 } | 1287 } |
1288 | 1288 |
1289 void HTMLMediaElement::waitForSourceChange() | 1289 void HTMLMediaElement::waitForSourceChange() |
1290 { | 1290 { |
1291 WTF_LOG(Media, "HTMLMediaElement::waitForSourceChange(%p)", this); | 1291 DVLOG(MEDIA_LOG_LEVEL) << "waitForSourceChange(" << (void*)this << ")"; |
1292 | 1292 |
1293 stopPeriodicTimers(); | 1293 stopPeriodicTimers(); |
1294 m_loadState = WaitingForSource; | 1294 m_loadState = WaitingForSource; |
1295 | 1295 |
1296 // 6.17 - Waiting: Set the element's networkState attribute to the NETWORK_N O_SOURCE value | 1296 // 6.17 - Waiting: Set the element's networkState attribute to the NETWORK_N O_SOURCE value |
1297 setNetworkState(NETWORK_NO_SOURCE); | 1297 setNetworkState(NETWORK_NO_SOURCE); |
1298 | 1298 |
1299 // 6.18 - Set the element's delaying-the-load-event flag to false. This stop s delaying the load event. | 1299 // 6.18 - Set the element's delaying-the-load-event flag to false. This stop s delaying the load event. |
1300 setShouldDelayLoadEvent(false); | 1300 setShouldDelayLoadEvent(false); |
1301 | 1301 |
1302 updateDisplayState(); | 1302 updateDisplayState(); |
1303 | 1303 |
1304 if (layoutObject()) | 1304 if (layoutObject()) |
1305 layoutObject()->updateFromElement(); | 1305 layoutObject()->updateFromElement(); |
1306 } | 1306 } |
1307 | 1307 |
1308 void HTMLMediaElement::noneSupported() | 1308 void HTMLMediaElement::noneSupported() |
1309 { | 1309 { |
1310 WTF_LOG(Media, "HTMLMediaElement::noneSupported(%p)", this); | 1310 DVLOG(MEDIA_LOG_LEVEL) << "noneSupported(" << (void*)this << ")"; |
1311 | 1311 |
1312 stopPeriodicTimers(); | 1312 stopPeriodicTimers(); |
1313 m_loadState = WaitingForSource; | 1313 m_loadState = WaitingForSource; |
1314 m_currentSourceNode = nullptr; | 1314 m_currentSourceNode = nullptr; |
1315 | 1315 |
1316 // 4.8.13.5 | 1316 // 4.8.13.5 |
1317 // The dedicated media source failure steps are the following steps: | 1317 // The dedicated media source failure steps are the following steps: |
1318 | 1318 |
1319 // 1 - Set the error attribute to a new MediaError object whose code attribu te is set to | 1319 // 1 - Set the error attribute to a new MediaError object whose code attribu te is set to |
1320 // MEDIA_ERR_SRC_NOT_SUPPORTED. | 1320 // MEDIA_ERR_SRC_NOT_SUPPORTED. |
(...skipping 19 matching lines...) Expand all Loading... | |
1340 // 7 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event. | 1340 // 7 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event. |
1341 setShouldDelayLoadEvent(false); | 1341 setShouldDelayLoadEvent(false); |
1342 | 1342 |
1343 if (layoutObject()) | 1343 if (layoutObject()) |
1344 layoutObject()->updateFromElement(); | 1344 layoutObject()->updateFromElement(); |
1345 } | 1345 } |
1346 | 1346 |
1347 void HTMLMediaElement::mediaEngineError(MediaError* err) | 1347 void HTMLMediaElement::mediaEngineError(MediaError* err) |
1348 { | 1348 { |
1349 ASSERT(m_readyState >= HAVE_METADATA); | 1349 ASSERT(m_readyState >= HAVE_METADATA); |
1350 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%p, %d)", this, static_ca st<int>(err->code())); | 1350 DVLOG(MEDIA_LOG_LEVEL) << "mediaEngineError(" << (void*)this << ", " << stat ic_cast<int>(err->code()) << ")"; |
1351 | 1351 |
1352 // 1 - The user agent should cancel the fetching process. | 1352 // 1 - The user agent should cancel the fetching process. |
1353 stopPeriodicTimers(); | 1353 stopPeriodicTimers(); |
1354 m_loadState = WaitingForSource; | 1354 m_loadState = WaitingForSource; |
1355 | 1355 |
1356 // 2 - Set the error attribute to a new MediaError object whose code attribu te is | 1356 // 2 - Set the error attribute to a new MediaError object whose code attribu te is |
1357 // set to MEDIA_ERR_NETWORK/MEDIA_ERR_DECODE. | 1357 // set to MEDIA_ERR_NETWORK/MEDIA_ERR_DECODE. |
1358 m_error = err; | 1358 m_error = err; |
1359 | 1359 |
1360 // 3 - Queue a task to fire a simple event named error at the media element. | 1360 // 3 - Queue a task to fire a simple event named error at the media element. |
1361 scheduleEvent(EventTypeNames::error); | 1361 scheduleEvent(EventTypeNames::error); |
1362 | 1362 |
1363 // 4 - Set the element's networkState attribute to the NETWORK_IDLE value. | 1363 // 4 - Set the element's networkState attribute to the NETWORK_IDLE value. |
1364 setNetworkState(NETWORK_IDLE); | 1364 setNetworkState(NETWORK_IDLE); |
1365 | 1365 |
1366 // 5 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event. | 1366 // 5 - Set the element's delaying-the-load-event flag to false. This stops d elaying the load event. |
1367 setShouldDelayLoadEvent(false); | 1367 setShouldDelayLoadEvent(false); |
1368 | 1368 |
1369 // 6 - Abort the overall resource selection algorithm. | 1369 // 6 - Abort the overall resource selection algorithm. |
1370 m_currentSourceNode = nullptr; | 1370 m_currentSourceNode = nullptr; |
1371 } | 1371 } |
1372 | 1372 |
1373 void HTMLMediaElement::cancelPendingEventsAndCallbacks() | 1373 void HTMLMediaElement::cancelPendingEventsAndCallbacks() |
1374 { | 1374 { |
1375 WTF_LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks(%p)", this ); | 1375 DVLOG(MEDIA_LOG_LEVEL) << "cancelPendingEventsAndCallbacks(" << (void*)this << ")"; |
1376 m_asyncEventQueue->cancelAllEvents(); | 1376 m_asyncEventQueue->cancelAllEvents(); |
1377 | 1377 |
1378 for (HTMLSourceElement* source = Traversal<HTMLSourceElement>::firstChild(*t his); source; source = Traversal<HTMLSourceElement>::nextSibling(*source)) | 1378 for (HTMLSourceElement* source = Traversal<HTMLSourceElement>::firstChild(*t his); source; source = Traversal<HTMLSourceElement>::nextSibling(*source)) |
1379 source->cancelPendingErrorEvent(); | 1379 source->cancelPendingErrorEvent(); |
1380 | 1380 |
1381 m_playPromiseResolveTask->cancel(); | 1381 m_playPromiseResolveTask->cancel(); |
1382 m_playPromiseRejectTask->cancel(); | 1382 m_playPromiseRejectTask->cancel(); |
1383 } | 1383 } |
1384 | 1384 |
1385 void HTMLMediaElement::networkStateChanged() | 1385 void HTMLMediaElement::networkStateChanged() |
1386 { | 1386 { |
1387 setNetworkState(webMediaPlayer()->getNetworkState()); | 1387 setNetworkState(webMediaPlayer()->getNetworkState()); |
1388 } | 1388 } |
1389 | 1389 |
1390 void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error) | 1390 void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error) |
1391 { | 1391 { |
1392 stopPeriodicTimers(); | 1392 stopPeriodicTimers(); |
1393 | 1393 |
1394 // If we failed while trying to load a <source> element, the movie was never parsed, and there are more | 1394 // If we failed while trying to load a <source> element, the movie was never parsed, and there are more |
1395 // <source> children, schedule the next one | 1395 // <source> children, schedule the next one |
1396 if (m_readyState < HAVE_METADATA && m_loadState == LoadingFromSourceElement) { | 1396 if (m_readyState < HAVE_METADATA && m_loadState == LoadingFromSourceElement) { |
1397 | 1397 |
1398 // resource selection algorithm | 1398 // resource selection algorithm |
1399 // Step 9.Otherwise.9 - Failed with elements: Queue a task, using the DO M manipulation task source, to fire a simple event named error at the candidate element. | 1399 // Step 9.Otherwise.9 - Failed with elements: Queue a task, using the DO M manipulation task source, to fire a simple event named error at the candidate element. |
1400 if (m_currentSourceNode) | 1400 if (m_currentSourceNode) |
1401 m_currentSourceNode->scheduleErrorEvent(); | 1401 m_currentSourceNode->scheduleErrorEvent(); |
1402 else | 1402 else |
1403 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - error event not sent, <source> was removed", this); | 1403 DVLOG(MEDIA_LOG_LEVEL) << "setNetworkState(" << (void*)this << ") - error event not sent, <source> was removed"; |
1404 | 1404 |
1405 // 9.Otherwise.10 - Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorit hm says the synchronous section has ended. | 1405 // 9.Otherwise.10 - Asynchronously await a stable state. The synchronous section consists of all the remaining steps of this algorithm until the algorit hm says the synchronous section has ended. |
1406 | 1406 |
1407 // 9.Otherwise.11 - Forget the media element's media-resource-specific t racks. | 1407 // 9.Otherwise.11 - Forget the media element's media-resource-specific t racks. |
1408 forgetResourceSpecificTracks(); | 1408 forgetResourceSpecificTracks(); |
1409 | 1409 |
1410 if (havePotentialSourceChild()) { | 1410 if (havePotentialSourceChild()) { |
1411 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - scheduling n ext <source>", this); | 1411 DVLOG(MEDIA_LOG_LEVEL) << "setNetworkState(" << (void*)this << ") - scheduling next <source>"; |
1412 scheduleNextSourceChild(); | 1412 scheduleNextSourceChild(); |
1413 } else { | 1413 } else { |
1414 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - no more <sou rce> elements, waiting", this); | 1414 DVLOG(MEDIA_LOG_LEVEL) << "setNetworkState(" << (void*)this << ") - no more <source> elements, waiting"; |
1415 waitForSourceChange(); | 1415 waitForSourceChange(); |
1416 } | 1416 } |
1417 | 1417 |
1418 return; | 1418 return; |
1419 } | 1419 } |
1420 | 1420 |
1421 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV E_METADATA) | 1421 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV E_METADATA) |
1422 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); | 1422 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); |
1423 else if (error == WebMediaPlayer::NetworkStateDecodeError) | 1423 else if (error == WebMediaPlayer::NetworkStateDecodeError) |
1424 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_DECODE)); | 1424 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_DECODE)); |
1425 else if ((error == WebMediaPlayer::NetworkStateFormatError | 1425 else if ((error == WebMediaPlayer::NetworkStateFormatError |
1426 || error == WebMediaPlayer::NetworkStateNetworkError) | 1426 || error == WebMediaPlayer::NetworkStateNetworkError) |
1427 && m_loadState == LoadingFromSrcAttr) | 1427 && m_loadState == LoadingFromSrcAttr) |
1428 noneSupported(); | 1428 noneSupported(); |
1429 | 1429 |
1430 updateDisplayState(); | 1430 updateDisplayState(); |
1431 if (mediaControls()) | 1431 if (mediaControls()) |
1432 mediaControls()->reset(); | 1432 mediaControls()->reset(); |
1433 } | 1433 } |
1434 | 1434 |
1435 void HTMLMediaElement::setNetworkState(WebMediaPlayer::NetworkState state) | 1435 void HTMLMediaElement::setNetworkState(WebMediaPlayer::NetworkState state) |
1436 { | 1436 { |
1437 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p, %d) - current state is %d", this, static_cast<int>(state), static_cast<int>(m_networkState)); | 1437 DVLOG(MEDIA_LOG_LEVEL) << "setNetworkState(" << (void*)this << ", " << stati c_cast<int>(state) << ") - current state is " << static_cast<int>(m_networkState ); |
1438 | 1438 |
1439 if (state == WebMediaPlayer::NetworkStateEmpty) { | 1439 if (state == WebMediaPlayer::NetworkStateEmpty) { |
1440 // Just update the cached state and leave, we can't do anything. | 1440 // Just update the cached state and leave, we can't do anything. |
1441 setNetworkState(NETWORK_EMPTY); | 1441 setNetworkState(NETWORK_EMPTY); |
1442 return; | 1442 return; |
1443 } | 1443 } |
1444 | 1444 |
1445 if (state == WebMediaPlayer::NetworkStateFormatError | 1445 if (state == WebMediaPlayer::NetworkStateFormatError |
1446 || state == WebMediaPlayer::NetworkStateNetworkError | 1446 || state == WebMediaPlayer::NetworkStateNetworkError |
1447 || state == WebMediaPlayer::NetworkStateDecodeError) { | 1447 || state == WebMediaPlayer::NetworkStateDecodeError) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1482 setNetworkState(NETWORK_IDLE); | 1482 setNetworkState(NETWORK_IDLE); |
1483 } | 1483 } |
1484 | 1484 |
1485 void HTMLMediaElement::readyStateChanged() | 1485 void HTMLMediaElement::readyStateChanged() |
1486 { | 1486 { |
1487 setReadyState(static_cast<ReadyState>(webMediaPlayer()->getReadyState())); | 1487 setReadyState(static_cast<ReadyState>(webMediaPlayer()->getReadyState())); |
1488 } | 1488 } |
1489 | 1489 |
1490 void HTMLMediaElement::setReadyState(ReadyState state) | 1490 void HTMLMediaElement::setReadyState(ReadyState state) |
1491 { | 1491 { |
1492 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%p, %d) - current state is % d,", this, static_cast<int>(state), static_cast<int>(m_readyState)); | 1492 DVLOG(MEDIA_LOG_LEVEL) << "setReadyState(" << (void*)this << ", " << static_ cast<int>(state) << ") - current state is " << static_cast<int>(m_readyState); |
1493 | 1493 |
1494 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay ing() uses it | 1494 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay ing() uses it |
1495 bool wasPotentiallyPlaying = potentiallyPlaying(); | 1495 bool wasPotentiallyPlaying = potentiallyPlaying(); |
1496 | 1496 |
1497 ReadyState oldState = m_readyState; | 1497 ReadyState oldState = m_readyState; |
1498 ReadyState newState = state; | 1498 ReadyState newState = state; |
1499 | 1499 |
1500 bool tracksAreReady = textTracksAreReady(); | 1500 bool tracksAreReady = textTracksAreReady(); |
1501 | 1501 |
1502 if (newState == oldState && m_tracksAreReady == tracksAreReady) | 1502 if (newState == oldState && m_tracksAreReady == tracksAreReady) |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1648 layoutObject()->updateFromElement(); | 1648 layoutObject()->updateFromElement(); |
1649 } else if (timedelta > 3.0 && !m_sentStalledEvent) { | 1649 } else if (timedelta > 3.0 && !m_sentStalledEvent) { |
1650 scheduleEvent(EventTypeNames::stalled); | 1650 scheduleEvent(EventTypeNames::stalled); |
1651 m_sentStalledEvent = true; | 1651 m_sentStalledEvent = true; |
1652 setShouldDelayLoadEvent(false); | 1652 setShouldDelayLoadEvent(false); |
1653 } | 1653 } |
1654 } | 1654 } |
1655 | 1655 |
1656 void HTMLMediaElement::addPlayedRange(double start, double end) | 1656 void HTMLMediaElement::addPlayedRange(double start, double end) |
1657 { | 1657 { |
1658 WTF_LOG(Media, "HTMLMediaElement::addPlayedRange(%p, %f, %f)", this, start, end); | 1658 DVLOG(MEDIA_LOG_LEVEL) << "addPlayedRange(" << (void*)this << ", " << start << ", " << end << ")"; |
1659 if (!m_playedTimeRanges) | 1659 if (!m_playedTimeRanges) |
1660 m_playedTimeRanges = TimeRanges::create(); | 1660 m_playedTimeRanges = TimeRanges::create(); |
1661 m_playedTimeRanges->add(start, end); | 1661 m_playedTimeRanges->add(start, end); |
1662 } | 1662 } |
1663 | 1663 |
1664 bool HTMLMediaElement::supportsSave() const | 1664 bool HTMLMediaElement::supportsSave() const |
1665 { | 1665 { |
1666 return webMediaPlayer() && webMediaPlayer()->supportsSave(); | 1666 return webMediaPlayer() && webMediaPlayer()->supportsSave(); |
1667 } | 1667 } |
1668 | 1668 |
1669 void HTMLMediaElement::setIgnorePreloadNone() | 1669 void HTMLMediaElement::setIgnorePreloadNone() |
1670 { | 1670 { |
1671 WTF_LOG(Media, "HTMLMediaElement::setIgnorePreloadNone(%p)", this); | 1671 DVLOG(MEDIA_LOG_LEVEL) << "setIgnorePreloadNone(" << (void*)this << ")"; |
1672 m_ignorePreloadNone = true; | 1672 m_ignorePreloadNone = true; |
1673 setPlayerPreload(); | 1673 setPlayerPreload(); |
1674 } | 1674 } |
1675 | 1675 |
1676 void HTMLMediaElement::seek(double time) | 1676 void HTMLMediaElement::seek(double time) |
1677 { | 1677 { |
1678 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f)", this, time); | 1678 DVLOG(MEDIA_LOG_LEVEL) << "seek(" << (void*)this << ", " << time << ")"; |
1679 | 1679 |
1680 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps. | 1680 // 2 - If the media element's readyState is HAVE_NOTHING, abort these steps. |
1681 if (m_readyState == HAVE_NOTHING) | 1681 if (m_readyState == HAVE_NOTHING) |
1682 return; | 1682 return; |
1683 | 1683 |
1684 // Ignore preload none and start load if necessary. | 1684 // Ignore preload none and start load if necessary. |
1685 setIgnorePreloadNone(); | 1685 setIgnorePreloadNone(); |
1686 | 1686 |
1687 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set. | 1687 // Get the current time before setting m_seeking, m_lastSeekTime is returned once it is set. |
1688 refreshCachedTime(); | 1688 refreshCachedTime(); |
(...skipping 16 matching lines...) Expand all Loading... | |
1705 // 7 - If the new playback position is less than the earliest possible posit ion, let it be that position instead. | 1705 // 7 - If the new playback position is less than the earliest possible posit ion, let it be that position instead. |
1706 time = std::max(time, 0.0); | 1706 time = std::max(time, 0.0); |
1707 | 1707 |
1708 // Ask the media engine for the time value in the movie's time scale before comparing with current time. This | 1708 // Ask the media engine for the time value in the movie's time scale before comparing with current time. This |
1709 // is necessary because if the seek time is not equal to currentTime but the delta is less than the movie's | 1709 // is necessary because if the seek time is not equal to currentTime but the delta is less than the movie's |
1710 // time scale, we will ask the media engine to "seek" to the current movie t ime, which may be a noop and | 1710 // time scale, we will ask the media engine to "seek" to the current movie t ime, which may be a noop and |
1711 // not generate a timechanged callback. This means m_seeking will never be c leared and we will never | 1711 // not generate a timechanged callback. This means m_seeking will never be c leared and we will never |
1712 // fire a 'seeked' event. | 1712 // fire a 'seeked' event. |
1713 double mediaTime = webMediaPlayer()->mediaTimeForTimeValue(time); | 1713 double mediaTime = webMediaPlayer()->mediaTimeForTimeValue(time); |
1714 if (time != mediaTime) { | 1714 if (time != mediaTime) { |
1715 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f) - media timeline equivale nt is %f", this, time, mediaTime); | 1715 DVLOG(MEDIA_LOG_LEVEL) << "seek(" << (void*)this << ", " << time << ") - media timeline equivalent is " << mediaTime; |
1716 time = mediaTime; | 1716 time = mediaTime; |
1717 } | 1717 } |
1718 | 1718 |
1719 // 8 - If the (possibly now changed) new playback position is not in one of the ranges given in the | 1719 // 8 - If the (possibly now changed) new playback position is not in one of the ranges given in the |
1720 // seekable attribute, then let it be the position in one of the ranges give n in the seekable attribute | 1720 // seekable attribute, then let it be the position in one of the ranges give n in the seekable attribute |
1721 // that is the nearest to the new playback position. ... If there are no ran ges given in the seekable | 1721 // that is the nearest to the new playback position. ... If there are no ran ges given in the seekable |
1722 // attribute then set the seeking IDL attribute to false and abort these ste ps. | 1722 // attribute then set the seeking IDL attribute to false and abort these ste ps. |
1723 TimeRanges* seekableRanges = seekable(); | 1723 TimeRanges* seekableRanges = seekable(); |
1724 | 1724 |
1725 if (!seekableRanges->length()) { | 1725 if (!seekableRanges->length()) { |
(...skipping 13 matching lines...) Expand all Loading... | |
1739 | 1739 |
1740 // 11 - Set the current playback position to the given new playback position . | 1740 // 11 - Set the current playback position to the given new playback position . |
1741 webMediaPlayer()->seek(time); | 1741 webMediaPlayer()->seek(time); |
1742 | 1742 |
1743 // 14-17 are handled, if necessary, when the engine signals a readystate cha nge or otherwise | 1743 // 14-17 are handled, if necessary, when the engine signals a readystate cha nge or otherwise |
1744 // satisfies seek completion and signals a time change. | 1744 // satisfies seek completion and signals a time change. |
1745 } | 1745 } |
1746 | 1746 |
1747 void HTMLMediaElement::finishSeek() | 1747 void HTMLMediaElement::finishSeek() |
1748 { | 1748 { |
1749 WTF_LOG(Media, "HTMLMediaElement::finishSeek(%p)", this); | 1749 DVLOG(MEDIA_LOG_LEVEL) << "finishSeek(" << (void*)this << ")"; |
1750 | 1750 |
1751 // 14 - Set the seeking IDL attribute to false. | 1751 // 14 - Set the seeking IDL attribute to false. |
1752 m_seeking = false; | 1752 m_seeking = false; |
1753 | 1753 |
1754 // 16 - Queue a task to fire a simple event named timeupdate at the element. | 1754 // 16 - Queue a task to fire a simple event named timeupdate at the element. |
1755 scheduleTimeupdateEvent(false); | 1755 scheduleTimeupdateEvent(false); |
1756 | 1756 |
1757 // 17 - Queue a task to fire a simple event named seeked at the element. | 1757 // 17 - Queue a task to fire a simple event named seeked at the element. |
1758 scheduleEvent(EventTypeNames::seeked); | 1758 scheduleEvent(EventTypeNames::seeked); |
1759 | 1759 |
(...skipping 25 matching lines...) Expand all Loading... | |
1785 void HTMLMediaElement::refreshCachedTime() const | 1785 void HTMLMediaElement::refreshCachedTime() const |
1786 { | 1786 { |
1787 if (!webMediaPlayer() || m_readyState < HAVE_METADATA) | 1787 if (!webMediaPlayer() || m_readyState < HAVE_METADATA) |
1788 return; | 1788 return; |
1789 | 1789 |
1790 m_cachedTime = webMediaPlayer()->currentTime(); | 1790 m_cachedTime = webMediaPlayer()->currentTime(); |
1791 } | 1791 } |
1792 | 1792 |
1793 void HTMLMediaElement::invalidateCachedTime() | 1793 void HTMLMediaElement::invalidateCachedTime() |
1794 { | 1794 { |
1795 WTF_LOG(Media, "HTMLMediaElement::invalidateCachedTime(%p)", this); | 1795 DVLOG(MEDIA_LOG_LEVEL) << "invalidateCachedTime(" << (void*)this << ")"; |
1796 m_cachedTime = std::numeric_limits<double>::quiet_NaN(); | 1796 m_cachedTime = std::numeric_limits<double>::quiet_NaN(); |
1797 } | 1797 } |
1798 | 1798 |
1799 // playback state | 1799 // playback state |
1800 double HTMLMediaElement::currentTime() const | 1800 double HTMLMediaElement::currentTime() const |
1801 { | 1801 { |
1802 if (m_defaultPlaybackStartPosition) | 1802 if (m_defaultPlaybackStartPosition) |
1803 return m_defaultPlaybackStartPosition; | 1803 return m_defaultPlaybackStartPosition; |
1804 | 1804 |
1805 if (m_readyState == HAVE_NOTHING) | 1805 if (m_readyState == HAVE_NOTHING) |
1806 return 0; | 1806 return 0; |
1807 | 1807 |
1808 if (m_seeking) { | 1808 if (m_seeking) { |
1809 WTF_LOG(Media, "HTMLMediaElement::currentTime(%p) - seeking, returning % f", this, m_lastSeekTime); | 1809 DVLOG(MEDIA_LOG_LEVEL) << "currentTime(" << (void*)this << ") - seeking, returning " << m_lastSeekTime; |
1810 return m_lastSeekTime; | 1810 return m_lastSeekTime; |
1811 } | 1811 } |
1812 | 1812 |
1813 if (!std::isnan(m_cachedTime) && m_paused) { | 1813 if (!std::isnan(m_cachedTime) && m_paused) { |
1814 #if LOG_CACHED_TIME_WARNINGS | 1814 #if LOG_CACHED_TIME_WARNINGS |
1815 static const double minCachedDeltaForWarning = 0.01; | 1815 static const double minCachedDeltaForWarning = 0.01; |
1816 double delta = m_cachedTime - webMediaPlayer()->currentTime(); | 1816 double delta = m_cachedTime - webMediaPlayer()->currentTime(); |
1817 if (delta > minCachedDeltaForWarning) | 1817 if (delta > minCachedDeltaForWarning) |
1818 WTF_LOG(Media, "HTMLMediaElement::currentTime(%p) - WARNING, cached time is %f seconds off of media time when paused", this, delta); | 1818 DVLOG(MEDIA_LOG_LEVEL) << "currentTime(" << (void*)this << ") - WARN ING, cached time is " << delta << "seconds off of media time when paused"; |
1819 #endif | 1819 #endif |
1820 return m_cachedTime; | 1820 return m_cachedTime; |
1821 } | 1821 } |
1822 | 1822 |
1823 refreshCachedTime(); | 1823 refreshCachedTime(); |
1824 | 1824 |
1825 return m_cachedTime; | 1825 return m_cachedTime; |
1826 } | 1826 } |
1827 | 1827 |
1828 void HTMLMediaElement::setCurrentTime(double time) | 1828 void HTMLMediaElement::setCurrentTime(double time) |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1880 scheduleEvent(EventTypeNames::ratechange); | 1880 scheduleEvent(EventTypeNames::ratechange); |
1881 } | 1881 } |
1882 | 1882 |
1883 double HTMLMediaElement::playbackRate() const | 1883 double HTMLMediaElement::playbackRate() const |
1884 { | 1884 { |
1885 return m_playbackRate; | 1885 return m_playbackRate; |
1886 } | 1886 } |
1887 | 1887 |
1888 void HTMLMediaElement::setPlaybackRate(double rate) | 1888 void HTMLMediaElement::setPlaybackRate(double rate) |
1889 { | 1889 { |
1890 WTF_LOG(Media, "HTMLMediaElement::setPlaybackRate(%p, %f)", this, rate); | 1890 DVLOG(MEDIA_LOG_LEVEL) << "setPlaybackRate(" << (void*)this << ", " << rate << ")"; |
1891 | 1891 |
1892 if (m_playbackRate != rate) { | 1892 if (m_playbackRate != rate) { |
1893 m_playbackRate = rate; | 1893 m_playbackRate = rate; |
1894 invalidateCachedTime(); | 1894 invalidateCachedTime(); |
1895 scheduleEvent(EventTypeNames::ratechange); | 1895 scheduleEvent(EventTypeNames::ratechange); |
1896 } | 1896 } |
1897 | 1897 |
1898 updatePlaybackRate(); | 1898 updatePlaybackRate(); |
1899 } | 1899 } |
1900 | 1900 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1940 return false; | 1940 return false; |
1941 } | 1941 } |
1942 | 1942 |
1943 String HTMLMediaElement::preload() const | 1943 String HTMLMediaElement::preload() const |
1944 { | 1944 { |
1945 return preloadTypeToString(preloadType()); | 1945 return preloadTypeToString(preloadType()); |
1946 } | 1946 } |
1947 | 1947 |
1948 void HTMLMediaElement::setPreload(const AtomicString& preload) | 1948 void HTMLMediaElement::setPreload(const AtomicString& preload) |
1949 { | 1949 { |
1950 WTF_LOG(Media, "HTMLMediaElement::setPreload(%p, %s)", this, preload.utf8(). data()); | 1950 DVLOG(MEDIA_LOG_LEVEL) << "setPreload(" << (void*)this << ", " << preload << ")"; |
1951 setAttribute(preloadAttr, preload); | 1951 setAttribute(preloadAttr, preload); |
1952 } | 1952 } |
1953 | 1953 |
1954 WebMediaPlayer::Preload HTMLMediaElement::preloadType() const | 1954 WebMediaPlayer::Preload HTMLMediaElement::preloadType() const |
1955 { | 1955 { |
1956 // Force preload to none for cellular connections. | 1956 // Force preload to none for cellular connections. |
1957 if (networkStateNotifier().isCellularConnectionType()) { | 1957 if (networkStateNotifier().isCellularConnectionType()) { |
1958 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadForcedN one); | 1958 UseCounter::count(document(), UseCounter::HTMLMediaElementPreloadForcedN one); |
1959 return WebMediaPlayer::PreloadNone; | 1959 return WebMediaPlayer::PreloadNone; |
1960 } | 1960 } |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2023 | 2023 |
2024 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; | 2024 ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState) ; |
2025 ScriptPromise promise = resolver->promise(); | 2025 ScriptPromise promise = resolver->promise(); |
2026 | 2026 |
2027 m_playResolvers.append(resolver); | 2027 m_playResolvers.append(resolver); |
2028 return promise; | 2028 return promise; |
2029 } | 2029 } |
2030 | 2030 |
2031 Nullable<ExceptionCode> HTMLMediaElement::play() | 2031 Nullable<ExceptionCode> HTMLMediaElement::play() |
2032 { | 2032 { |
2033 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this); | 2033 DVLOG(MEDIA_LOG_LEVEL) << "play(" << (void*)this << ")"; |
2034 | 2034 |
2035 m_autoplayHelper->playMethodCalled(); | 2035 m_autoplayHelper->playMethodCalled(); |
2036 | 2036 |
2037 if (!UserGestureIndicator::processingUserGesture()) { | 2037 if (!UserGestureIndicator::processingUserGesture()) { |
2038 if (m_userGestureRequiredForPlay) { | 2038 if (m_userGestureRequiredForPlay) { |
2039 recordAutoplayMetric(PlayMethodFailed); | 2039 recordAutoplayMetric(PlayMethodFailed); |
2040 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture."); | 2040 String message = ExceptionMessages::failedToExecute("play", "HTMLMed iaElement", "API can only be initiated by a user gesture."); |
2041 document().addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); | 2041 document().addConsoleMessage(ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); |
2042 return NotAllowedError; | 2042 return NotAllowedError; |
2043 } | 2043 } |
2044 } else { | 2044 } else { |
2045 UserGestureIndicator::utilizeUserGesture(); | 2045 UserGestureIndicator::utilizeUserGesture(); |
2046 // We ask the helper to remove the gesture requirement for us, so that | 2046 // We ask the helper to remove the gesture requirement for us, so that |
2047 // it can record the reason. | 2047 // it can record the reason. |
2048 Platform::current()->recordAction(UserMetricsAction("Media_Play_WithGest ure")); | 2048 Platform::current()->recordAction(UserMetricsAction("Media_Play_WithGest ure")); |
2049 m_autoplayHelper->removeUserGestureRequirement(GesturelessPlaybackEnable dByPlayMethod); | 2049 m_autoplayHelper->removeUserGestureRequirement(GesturelessPlaybackEnable dByPlayMethod); |
2050 } | 2050 } |
2051 | 2051 |
2052 if (m_error && m_error->code() == MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED) | 2052 if (m_error && m_error->code() == MediaError::MEDIA_ERR_SRC_NOT_SUPPORTED) |
2053 return NotSupportedError; | 2053 return NotSupportedError; |
2054 | 2054 |
2055 playInternal(); | 2055 playInternal(); |
2056 | 2056 |
2057 return nullptr; | 2057 return nullptr; |
2058 } | 2058 } |
2059 | 2059 |
2060 void HTMLMediaElement::playInternal() | 2060 void HTMLMediaElement::playInternal() |
2061 { | 2061 { |
2062 WTF_LOG(Media, "HTMLMediaElement::playInternal(%p)", this); | 2062 DVLOG(MEDIA_LOG_LEVEL) << "playInternal(" << (void*)this << ")"; |
2063 | 2063 |
2064 // Always return the buffering strategy to normal when not paused, | 2064 // Always return the buffering strategy to normal when not paused, |
2065 // regardless of the cause. (In contrast with aggressive buffering which is | 2065 // regardless of the cause. (In contrast with aggressive buffering which is |
2066 // only enabled by pause(), not pauseInternal().) | 2066 // only enabled by pause(), not pauseInternal().) |
2067 if (webMediaPlayer()) | 2067 if (webMediaPlayer()) |
2068 webMediaPlayer()->setBufferingStrategy(WebMediaPlayer::BufferingStrategy ::Normal); | 2068 webMediaPlayer()->setBufferingStrategy(WebMediaPlayer::BufferingStrategy ::Normal); |
2069 | 2069 |
2070 // 4.8.10.9. Playing the media resource | 2070 // 4.8.10.9. Playing the media resource |
2071 if (m_networkState == NETWORK_EMPTY) | 2071 if (m_networkState == NETWORK_EMPTY) |
2072 invokeResourceSelectionAlgorithm(); | 2072 invokeResourceSelectionAlgorithm(); |
(...skipping 18 matching lines...) Expand all Loading... | |
2091 } | 2091 } |
2092 | 2092 |
2093 m_autoplaying = false; | 2093 m_autoplaying = false; |
2094 | 2094 |
2095 setIgnorePreloadNone(); | 2095 setIgnorePreloadNone(); |
2096 updatePlayState(); | 2096 updatePlayState(); |
2097 } | 2097 } |
2098 | 2098 |
2099 void HTMLMediaElement::pause() | 2099 void HTMLMediaElement::pause() |
2100 { | 2100 { |
2101 WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this); | 2101 DVLOG(MEDIA_LOG_LEVEL) << "pause(" << (void*)this << ")"; |
2102 | 2102 |
2103 // Only buffer aggressively on a user-initiated pause. Other types of pauses | 2103 // Only buffer aggressively on a user-initiated pause. Other types of pauses |
2104 // (which go directly to pauseInternal()) should not cause this behavior. | 2104 // (which go directly to pauseInternal()) should not cause this behavior. |
2105 if (webMediaPlayer() && UserGestureIndicator::utilizeUserGesture()) | 2105 if (webMediaPlayer() && UserGestureIndicator::utilizeUserGesture()) |
2106 webMediaPlayer()->setBufferingStrategy(WebMediaPlayer::BufferingStrategy ::Aggressive); | 2106 webMediaPlayer()->setBufferingStrategy(WebMediaPlayer::BufferingStrategy ::Aggressive); |
2107 | 2107 |
2108 pauseInternal(); | 2108 pauseInternal(); |
2109 } | 2109 } |
2110 | 2110 |
2111 void HTMLMediaElement::pauseInternal() | 2111 void HTMLMediaElement::pauseInternal() |
2112 { | 2112 { |
2113 WTF_LOG(Media, "HTMLMediaElement::pauseInternal(%p)", this); | 2113 DVLOG(MEDIA_LOG_LEVEL) << "pauseInternal(" << (void*)this << ")"; |
2114 | 2114 |
2115 if (m_networkState == NETWORK_EMPTY) | 2115 if (m_networkState == NETWORK_EMPTY) |
2116 invokeResourceSelectionAlgorithm(); | 2116 invokeResourceSelectionAlgorithm(); |
2117 | 2117 |
2118 m_autoplayHelper->pauseMethodCalled(); | 2118 m_autoplayHelper->pauseMethodCalled(); |
2119 | 2119 |
2120 m_autoplaying = false; | 2120 m_autoplaying = false; |
2121 | 2121 |
2122 if (!m_paused) { | 2122 if (!m_paused) { |
2123 m_paused = true; | 2123 m_paused = true; |
(...skipping 28 matching lines...) Expand all Loading... | |
2152 m_mediaSource = nullptr; | 2152 m_mediaSource = nullptr; |
2153 } | 2153 } |
2154 | 2154 |
2155 bool HTMLMediaElement::loop() const | 2155 bool HTMLMediaElement::loop() const |
2156 { | 2156 { |
2157 return fastHasAttribute(loopAttr); | 2157 return fastHasAttribute(loopAttr); |
2158 } | 2158 } |
2159 | 2159 |
2160 void HTMLMediaElement::setLoop(bool b) | 2160 void HTMLMediaElement::setLoop(bool b) |
2161 { | 2161 { |
2162 WTF_LOG(Media, "HTMLMediaElement::setLoop(%p, %s)", this, boolString(b)); | 2162 DVLOG(MEDIA_LOG_LEVEL) << "setLoop(" << (void*)this << ", " << boolString(b) << ")"; |
2163 setBooleanAttribute(loopAttr, b); | 2163 setBooleanAttribute(loopAttr, b); |
2164 } | 2164 } |
2165 | 2165 |
2166 bool HTMLMediaElement::shouldShowControls(const RecordMetricsBehavior recordMetr ics) const | 2166 bool HTMLMediaElement::shouldShowControls(const RecordMetricsBehavior recordMetr ics) const |
2167 { | 2167 { |
2168 DEFINE_STATIC_LOCAL(EnumerationHistogram, showControlsHistogram, ("Media.Con trols.Show", MediaControlsShowMax)); | 2168 DEFINE_STATIC_LOCAL(EnumerationHistogram, showControlsHistogram, ("Media.Con trols.Show", MediaControlsShowMax)); |
2169 | 2169 |
2170 if (fastHasAttribute(controlsAttr)) { | 2170 if (fastHasAttribute(controlsAttr)) { |
2171 if (recordMetrics == RecordMetricsBehavior::DoRecord) | 2171 if (recordMetrics == RecordMetricsBehavior::DoRecord) |
2172 showControlsHistogram.count(MediaControlsShowAttribute); | 2172 showControlsHistogram.count(MediaControlsShowAttribute); |
(...skipping 18 matching lines...) Expand all Loading... | |
2191 return false; | 2191 return false; |
2192 } | 2192 } |
2193 | 2193 |
2194 double HTMLMediaElement::volume() const | 2194 double HTMLMediaElement::volume() const |
2195 { | 2195 { |
2196 return m_volume; | 2196 return m_volume; |
2197 } | 2197 } |
2198 | 2198 |
2199 void HTMLMediaElement::setVolume(double vol, ExceptionState& exceptionState) | 2199 void HTMLMediaElement::setVolume(double vol, ExceptionState& exceptionState) |
2200 { | 2200 { |
2201 WTF_LOG(Media, "HTMLMediaElement::setVolume(%p, %f)", this, vol); | 2201 DVLOG(MEDIA_LOG_LEVEL) << "setVolume(" << (void*)this << ", " << vol << ")"; |
2202 | 2202 |
2203 if (m_volume == vol) | 2203 if (m_volume == vol) |
2204 return; | 2204 return; |
2205 | 2205 |
2206 if (vol < 0.0f || vol > 1.0f) { | 2206 if (vol < 0.0f || vol > 1.0f) { |
2207 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xOutsideRange("volume", vol, 0.0, ExceptionMessages::InclusiveBound, 1.0, Except ionMessages::InclusiveBound)); | 2207 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde xOutsideRange("volume", vol, 0.0, ExceptionMessages::InclusiveBound, 1.0, Except ionMessages::InclusiveBound)); |
2208 return; | 2208 return; |
2209 } | 2209 } |
2210 | 2210 |
2211 Platform::current()->recordAction(UserMetricsAction("Media_SetVolume")); | 2211 Platform::current()->recordAction(UserMetricsAction("Media_SetVolume")); |
2212 | 2212 |
2213 m_volume = vol; | 2213 m_volume = vol; |
2214 updateVolume(); | 2214 updateVolume(); |
2215 scheduleEvent(EventTypeNames::volumechange); | 2215 scheduleEvent(EventTypeNames::volumechange); |
2216 } | 2216 } |
2217 | 2217 |
2218 bool HTMLMediaElement::muted() const | 2218 bool HTMLMediaElement::muted() const |
2219 { | 2219 { |
2220 return m_muted; | 2220 return m_muted; |
2221 } | 2221 } |
2222 | 2222 |
2223 void HTMLMediaElement::setMuted(bool muted) | 2223 void HTMLMediaElement::setMuted(bool muted) |
2224 { | 2224 { |
2225 WTF_LOG(Media, "HTMLMediaElement::setMuted(%p, %s)", this, boolString(muted) ); | 2225 DVLOG(MEDIA_LOG_LEVEL) << "setMuted(" << (void*)this << ", " << boolString(m uted) << ")"; |
2226 | 2226 |
2227 if (m_muted == muted) | 2227 if (m_muted == muted) |
2228 return; | 2228 return; |
2229 | 2229 |
2230 m_muted = muted; | 2230 m_muted = muted; |
2231 | 2231 |
2232 m_autoplayHelper->mutedChanged(); | 2232 m_autoplayHelper->mutedChanged(); |
2233 | 2233 |
2234 updateVolume(); | 2234 updateVolume(); |
2235 | 2235 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2321 } | 2321 } |
2322 | 2322 |
2323 AudioTrackList& HTMLMediaElement::audioTracks() | 2323 AudioTrackList& HTMLMediaElement::audioTracks() |
2324 { | 2324 { |
2325 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2325 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2326 return *m_audioTracks; | 2326 return *m_audioTracks; |
2327 } | 2327 } |
2328 | 2328 |
2329 void HTMLMediaElement::audioTrackChanged(WebMediaPlayer::TrackId trackId, bool e nabled) | 2329 void HTMLMediaElement::audioTrackChanged(WebMediaPlayer::TrackId trackId, bool e nabled) |
2330 { | 2330 { |
2331 WTF_LOG(Media, "HTMLMediaElement::audioTrackChanged(%p) trackId=%u enabled=% d", this, trackId, enabled); | 2331 DVLOG(MEDIA_LOG_LEVEL) << "audioTrackChanged(" << (void*)this << ") trackId= " << trackId << " enabled=" << boolString(enabled); |
2332 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2332 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2333 | 2333 |
2334 audioTracks().scheduleChangeEvent(); | 2334 audioTracks().scheduleChangeEvent(); |
2335 | 2335 |
2336 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.audioTracks attribute is added. | 2336 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.audioTracks attribute is added. |
2337 | 2337 |
2338 if (!m_audioTracksTimer.isActive()) | 2338 if (!m_audioTracksTimer.isActive()) |
2339 m_audioTracksTimer.startOneShot(0, BLINK_FROM_HERE); | 2339 m_audioTracksTimer.startOneShot(0, BLINK_FROM_HERE); |
2340 } | 2340 } |
2341 | 2341 |
2342 void HTMLMediaElement::audioTracksTimerFired(Timer<HTMLMediaElement>*) | 2342 void HTMLMediaElement::audioTracksTimerFired(Timer<HTMLMediaElement>*) |
2343 { | 2343 { |
2344 Vector<WebMediaPlayer::TrackId> enabledTrackIds; | 2344 Vector<WebMediaPlayer::TrackId> enabledTrackIds; |
2345 for (unsigned i = 0; i < audioTracks().length(); ++i) { | 2345 for (unsigned i = 0; i < audioTracks().length(); ++i) { |
2346 AudioTrack* track = audioTracks().anonymousIndexedGetter(i); | 2346 AudioTrack* track = audioTracks().anonymousIndexedGetter(i); |
2347 if (track->enabled()) | 2347 if (track->enabled()) |
2348 enabledTrackIds.append(track->trackId()); | 2348 enabledTrackIds.append(track->trackId()); |
2349 } | 2349 } |
2350 | 2350 |
2351 webMediaPlayer()->enabledAudioTracksChanged(enabledTrackIds); | 2351 webMediaPlayer()->enabledAudioTracksChanged(enabledTrackIds); |
2352 } | 2352 } |
2353 | 2353 |
2354 WebMediaPlayer::TrackId HTMLMediaElement::addAudioTrack(const WebString& id, Web MediaPlayerClient::AudioTrackKind kind, const WebString& label, const WebString& language, bool enabled) | 2354 WebMediaPlayer::TrackId HTMLMediaElement::addAudioTrack(const WebString& id, Web MediaPlayerClient::AudioTrackKind kind, const WebString& label, const WebString& language, bool enabled) |
2355 { | 2355 { |
2356 AtomicString kindString = AudioKindToString(kind); | 2356 AtomicString kindString = AudioKindToString(kind); |
2357 WTF_LOG(Media, "HTMLMediaElement::addAudioTrack(%p, '%s', '%s', '%s', '%s', %d)", | 2357 DVLOG(MEDIA_LOG_LEVEL) << "addAudioTrack(" << (void*)this << ", '" << (Strin g)id << "', ' " << (AtomicString)kindString |
2358 this, id.utf8().data(), kindString.ascii().data(), label.utf8().data(), language.utf8().data(), enabled); | 2358 << "', '" << (String)label << "', '" << (String)language << "', " << boo lString(enabled) << ")"; |
2359 | 2359 |
2360 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2360 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2361 return 0; | 2361 return 0; |
2362 | 2362 |
2363 AudioTrack* audioTrack = AudioTrack::create(id, kindString, label, language, enabled); | 2363 AudioTrack* audioTrack = AudioTrack::create(id, kindString, label, language, enabled); |
2364 audioTracks().add(audioTrack); | 2364 audioTracks().add(audioTrack); |
2365 | 2365 |
2366 return audioTrack->trackId(); | 2366 return audioTrack->trackId(); |
2367 } | 2367 } |
2368 | 2368 |
2369 void HTMLMediaElement::removeAudioTrack(WebMediaPlayer::TrackId trackId) | 2369 void HTMLMediaElement::removeAudioTrack(WebMediaPlayer::TrackId trackId) |
2370 { | 2370 { |
2371 WTF_LOG(Media, "HTMLMediaElement::removeAudioTrack(%p)", this); | 2371 DVLOG(MEDIA_LOG_LEVEL) << "removeAudioTrack(" << (void*)this << ")"; |
2372 | 2372 |
2373 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2373 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2374 return; | 2374 return; |
2375 | 2375 |
2376 audioTracks().remove(trackId); | 2376 audioTracks().remove(trackId); |
2377 } | 2377 } |
2378 | 2378 |
2379 VideoTrackList& HTMLMediaElement::videoTracks() | 2379 VideoTrackList& HTMLMediaElement::videoTracks() |
2380 { | 2380 { |
2381 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2381 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2382 return *m_videoTracks; | 2382 return *m_videoTracks; |
2383 } | 2383 } |
2384 | 2384 |
2385 void HTMLMediaElement::selectedVideoTrackChanged(WebMediaPlayer::TrackId* select edTrackId) | 2385 void HTMLMediaElement::selectedVideoTrackChanged(WebMediaPlayer::TrackId* select edTrackId) |
2386 { | 2386 { |
2387 WTF_LOG(Media, "HTMLMediaElement::selectedVideoTrackChanged(%p) selectedTrac kId=%s", this, selectedTrackId ? String::format("%u", *selectedTrackId).ascii(). data() : "none"); | 2387 DVLOG(MEDIA_LOG_LEVEL) << "selectedVideoTrackChanged(" << (void*)this << ") selectedTrackId=" << (selectedTrackId ? String::format("%u", *selectedTrackId) : "none"); |
2388 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2388 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2389 | 2389 |
2390 if (selectedTrackId) | 2390 if (selectedTrackId) |
2391 videoTracks().trackSelected(*selectedTrackId); | 2391 videoTracks().trackSelected(*selectedTrackId); |
2392 | 2392 |
2393 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.videoTracks attribute is added. | 2393 // FIXME: Add call on m_mediaSource to notify it of track changes once the S ourceBuffer.videoTracks attribute is added. |
2394 | 2394 |
2395 webMediaPlayer()->selectedVideoTrackChanged(selectedTrackId); | 2395 webMediaPlayer()->selectedVideoTrackChanged(selectedTrackId); |
2396 } | 2396 } |
2397 | 2397 |
2398 WebMediaPlayer::TrackId HTMLMediaElement::addVideoTrack(const WebString& id, Web MediaPlayerClient::VideoTrackKind kind, const WebString& label, const WebString& language, bool selected) | 2398 WebMediaPlayer::TrackId HTMLMediaElement::addVideoTrack(const WebString& id, Web MediaPlayerClient::VideoTrackKind kind, const WebString& label, const WebString& language, bool selected) |
2399 { | 2399 { |
2400 AtomicString kindString = VideoKindToString(kind); | 2400 AtomicString kindString = VideoKindToString(kind); |
2401 WTF_LOG(Media, "HTMLMediaElement::addVideoTrack(%p, '%s', '%s', '%s', '%s', %d)", | 2401 DVLOG(MEDIA_LOG_LEVEL) << "addVideoTrack(" << (void*)this << ", '" << (Strin g)id << "', '" << (AtomicString)kindString |
2402 this, id.utf8().data(), kindString.ascii().data(), label.utf8().data(), language.utf8().data(), selected); | 2402 << "', '" << (String)label << "', '" << (String)language << "', " << boo lString(selected) << ")"; |
2403 | 2403 |
2404 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2404 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2405 return 0; | 2405 return 0; |
2406 | 2406 |
2407 // If another track was selected (potentially by the user), leave it selecte d. | 2407 // If another track was selected (potentially by the user), leave it selecte d. |
2408 if (selected && videoTracks().selectedIndex() != -1) | 2408 if (selected && videoTracks().selectedIndex() != -1) |
2409 selected = false; | 2409 selected = false; |
2410 | 2410 |
2411 VideoTrack* videoTrack = VideoTrack::create(id, kindString, label, language, selected); | 2411 VideoTrack* videoTrack = VideoTrack::create(id, kindString, label, language, selected); |
2412 videoTracks().add(videoTrack); | 2412 videoTracks().add(videoTrack); |
2413 | 2413 |
2414 return videoTrack->trackId(); | 2414 return videoTrack->trackId(); |
2415 } | 2415 } |
2416 | 2416 |
2417 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) | 2417 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) |
2418 { | 2418 { |
2419 WTF_LOG(Media, "HTMLMediaElement::removeVideoTrack(%p)", this); | 2419 DVLOG(MEDIA_LOG_LEVEL) << "removeVideoTrack(" << (void*)this << ")"; |
2420 | 2420 |
2421 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2421 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2422 return; | 2422 return; |
2423 | 2423 |
2424 videoTracks().remove(trackId); | 2424 videoTracks().remove(trackId); |
2425 } | 2425 } |
2426 | 2426 |
2427 void HTMLMediaElement::addTextTrack(WebInbandTextTrack* webTrack) | 2427 void HTMLMediaElement::addTextTrack(WebInbandTextTrack* webTrack) |
2428 { | 2428 { |
2429 // 4.8.10.12.2 Sourcing in-band text tracks | 2429 // 4.8.10.12.2 Sourcing in-band text tracks |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2565 addTextTrack(textTrack); | 2565 addTextTrack(textTrack); |
2566 | 2566 |
2567 // Do not schedule the track loading until parsing finishes so we don't star t before all tracks | 2567 // Do not schedule the track loading until parsing finishes so we don't star t before all tracks |
2568 // in the markup have been added. | 2568 // in the markup have been added. |
2569 if (isFinishedParsingChildren()) | 2569 if (isFinishedParsingChildren()) |
2570 scheduleTextTrackResourceLoad(); | 2570 scheduleTextTrackResourceLoad(); |
2571 } | 2571 } |
2572 | 2572 |
2573 void HTMLMediaElement::didRemoveTrackElement(HTMLTrackElement* trackElement) | 2573 void HTMLMediaElement::didRemoveTrackElement(HTMLTrackElement* trackElement) |
2574 { | 2574 { |
2575 #if !LOG_DISABLED | |
2576 KURL url = trackElement->getNonEmptyURLAttribute(srcAttr); | 2575 KURL url = trackElement->getNonEmptyURLAttribute(srcAttr); |
2577 WTF_LOG(Media, "HTMLMediaElement::didRemoveTrackElement(%p) - 'src' is %s", this, urlForLoggingMedia(url).utf8().data()); | 2576 DVLOG(MEDIA_LOG_LEVEL) << "didRemoveTrackElement(" << (void*)this << ") - 's rc' is " << urlForLoggingMedia(url); |
2578 #endif | |
2579 | 2577 |
2580 TextTrack* textTrack = trackElement->track(); | 2578 TextTrack* textTrack = trackElement->track(); |
2581 if (!textTrack) | 2579 if (!textTrack) |
2582 return; | 2580 return; |
2583 | 2581 |
2584 textTrack->setHasBeenConfigured(false); | 2582 textTrack->setHasBeenConfigured(false); |
2585 | 2583 |
2586 if (!m_textTracks) | 2584 if (!m_textTracks) |
2587 return; | 2585 return; |
2588 | 2586 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2631 KURL nextURL = selectNextSourceChild(0, DoNothing); | 2629 KURL nextURL = selectNextSourceChild(0, DoNothing); |
2632 | 2630 |
2633 m_currentSourceNode = currentSourceNode; | 2631 m_currentSourceNode = currentSourceNode; |
2634 m_nextChildNodeToConsider = nextNode; | 2632 m_nextChildNodeToConsider = nextNode; |
2635 | 2633 |
2636 return nextURL.isValid(); | 2634 return nextURL.isValid(); |
2637 } | 2635 } |
2638 | 2636 |
2639 KURL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, InvalidUR LAction actionIfInvalid) | 2637 KURL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, InvalidUR LAction actionIfInvalid) |
2640 { | 2638 { |
2641 #if !LOG_DISABLED | |
2642 // Don't log if this was just called to find out if there are any valid <sou rce> elements. | 2639 // Don't log if this was just called to find out if there are any valid <sou rce> elements. |
2643 bool shouldLog = actionIfInvalid != DoNothing; | 2640 bool shouldLog = actionIfInvalid != DoNothing; |
2644 if (shouldLog) | 2641 if (shouldLog) |
2645 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p)", this); | 2642 DVLOG(MEDIA_LOG_LEVEL) << "selectNextSourceChild(" << (void*)this << ")" ; |
2646 #endif | |
2647 | 2643 |
2648 if (!m_nextChildNodeToConsider) { | 2644 if (!m_nextChildNodeToConsider) { |
2649 #if !LOG_DISABLED | |
2650 if (shouldLog) | 2645 if (shouldLog) |
2651 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) -> 0x000 0, \"\"", this); | 2646 DVLOG(MEDIA_LOG_LEVEL) << "selectNextSourceChild(" << (void*)this << ") -> 0x0000, \"\""; |
2652 #endif | |
2653 return KURL(); | 2647 return KURL(); |
2654 } | 2648 } |
2655 | 2649 |
2656 KURL mediaURL; | 2650 KURL mediaURL; |
2657 Node* node; | 2651 Node* node; |
2658 HTMLSourceElement* source = 0; | 2652 HTMLSourceElement* source = 0; |
2659 String type; | 2653 String type; |
2660 bool lookingForStartNode = m_nextChildNodeToConsider; | 2654 bool lookingForStartNode = m_nextChildNodeToConsider; |
2661 bool canUseSourceElement = false; | 2655 bool canUseSourceElement = false; |
2662 | 2656 |
(...skipping 10 matching lines...) Expand all Loading... | |
2673 continue; | 2667 continue; |
2674 if (node->parentNode() != this) | 2668 if (node->parentNode() != this) |
2675 continue; | 2669 continue; |
2676 | 2670 |
2677 source = toHTMLSourceElement(node); | 2671 source = toHTMLSourceElement(node); |
2678 | 2672 |
2679 // 2. If candidate does not have a src attribute, or if its src | 2673 // 2. If candidate does not have a src attribute, or if its src |
2680 // attribute's value is the empty string ... jump down to the failed | 2674 // attribute's value is the empty string ... jump down to the failed |
2681 // step below | 2675 // step below |
2682 const AtomicString& srcValue = source->fastGetAttribute(srcAttr); | 2676 const AtomicString& srcValue = source->fastGetAttribute(srcAttr); |
2683 #if !LOG_DISABLED | |
2684 if (shouldLog) | 2677 if (shouldLog) |
2685 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 'src' is %s", this, urlForLoggingMedia(mediaURL).utf8().data()); | 2678 DVLOG(MEDIA_LOG_LEVEL) << "selectNextSourceChild(" << (void*)this << ") - 'src' is " << urlForLoggingMedia(mediaURL); |
2686 #endif | |
2687 if (srcValue.isEmpty()) | 2679 if (srcValue.isEmpty()) |
2688 goto checkAgain; | 2680 goto checkAgain; |
2689 | 2681 |
2690 // 3. Let urlString be the resulting URL string that would have resulted | 2682 // 3. Let urlString be the resulting URL string that would have resulted |
2691 // from parsing the URL specified by candidate's src attribute's value | 2683 // from parsing the URL specified by candidate's src attribute's value |
2692 // relative to the candidate's node document when the src attribute was | 2684 // relative to the candidate's node document when the src attribute was |
2693 // last changed. | 2685 // last changed. |
2694 mediaURL = source->document().completeURL(srcValue); | 2686 mediaURL = source->document().completeURL(srcValue); |
2695 | 2687 |
2696 // 4. If urlString was not obtained successfully, then end the | 2688 // 4. If urlString was not obtained successfully, then end the |
2697 // synchronous section, and jump down to the failed with elements step | 2689 // synchronous section, and jump down to the failed with elements step |
2698 // below. | 2690 // below. |
2699 if (!isSafeToLoadURL(mediaURL, actionIfInvalid)) | 2691 if (!isSafeToLoadURL(mediaURL, actionIfInvalid)) |
2700 goto checkAgain; | 2692 goto checkAgain; |
2701 | 2693 |
2702 // 5. If candidate has a type attribute whose value, when parsed as a | 2694 // 5. If candidate has a type attribute whose value, when parsed as a |
2703 // MIME type ... | 2695 // MIME type ... |
2704 type = source->type(); | 2696 type = source->type(); |
2705 if (type.isEmpty() && mediaURL.protocolIsData()) | 2697 if (type.isEmpty() && mediaURL.protocolIsData()) |
2706 type = mimeTypeFromDataURL(mediaURL); | 2698 type = mimeTypeFromDataURL(mediaURL); |
2707 if (!type.isEmpty()) { | 2699 if (!type.isEmpty()) { |
2708 #if !LOG_DISABLED | |
2709 if (shouldLog) | 2700 if (shouldLog) |
2710 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 't ype' is '%s'", this, type.utf8().data()); | 2701 DVLOG(MEDIA_LOG_LEVEL) << "selectNextSourceChild(" << (void*)thi s << ") - 'type' is '" << type << "'"; |
2711 #endif | |
2712 if (!supportsType(ContentType(type))) | 2702 if (!supportsType(ContentType(type))) |
2713 goto checkAgain; | 2703 goto checkAgain; |
2714 } | 2704 } |
2715 | 2705 |
2716 // Making it this far means the <source> looks reasonable. | 2706 // Making it this far means the <source> looks reasonable. |
2717 canUseSourceElement = true; | 2707 canUseSourceElement = true; |
2718 | 2708 |
2719 checkAgain: | 2709 checkAgain: |
2720 if (!canUseSourceElement && actionIfInvalid == Complain && source) | 2710 if (!canUseSourceElement && actionIfInvalid == Complain && source) |
2721 source->scheduleErrorEvent(); | 2711 source->scheduleErrorEvent(); |
2722 } | 2712 } |
2723 | 2713 |
2724 if (canUseSourceElement) { | 2714 if (canUseSourceElement) { |
2725 if (contentType) | 2715 if (contentType) |
2726 *contentType = ContentType(type); | 2716 *contentType = ContentType(type); |
2727 m_currentSourceNode = source; | 2717 m_currentSourceNode = source; |
2728 m_nextChildNodeToConsider = source->nextSibling(); | 2718 m_nextChildNodeToConsider = source->nextSibling(); |
2729 } else { | 2719 } else { |
2730 m_currentSourceNode = nullptr; | 2720 m_currentSourceNode = nullptr; |
2731 m_nextChildNodeToConsider = nullptr; | 2721 m_nextChildNodeToConsider = nullptr; |
2732 } | 2722 } |
2733 | 2723 |
2734 #if !LOG_DISABLED | |
2735 if (shouldLog) | 2724 if (shouldLog) |
2736 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) -> %p, %s", this, m_currentSourceNode.get(), canUseSourceElement ? urlForLoggingMedia(mediaU RL).utf8().data() : ""); | 2725 DVLOG(MEDIA_LOG_LEVEL) << "selectNextSourceChild(" << (void*)this << ") -> " << m_currentSourceNode.get() << ", " << (canUseSourceElement ? urlForLoggin gMedia(mediaURL) : ""); |
2737 #endif | |
2738 return canUseSourceElement ? mediaURL : KURL(); | 2726 return canUseSourceElement ? mediaURL : KURL(); |
2739 } | 2727 } |
2740 | 2728 |
2741 void HTMLMediaElement::sourceWasAdded(HTMLSourceElement* source) | 2729 void HTMLMediaElement::sourceWasAdded(HTMLSourceElement* source) |
2742 { | 2730 { |
2743 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p, %p)", this, source); | 2731 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasAdded(" << (void*)this << ", " << source << ")"; |
2744 | 2732 |
2745 #if !LOG_DISABLED | |
2746 KURL url = source->getNonEmptyURLAttribute(srcAttr); | 2733 KURL url = source->getNonEmptyURLAttribute(srcAttr); |
2747 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p) - 'src' is %s", this, u rlForLoggingMedia(url).utf8().data()); | 2734 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasAdded(" << (void*)this << ") - 'src' is " << urlForLoggingMedia(url); |
2748 #endif | |
2749 | 2735 |
2750 // We should only consider a <source> element when there is not src attribut e at all. | 2736 // We should only consider a <source> element when there is not src attribut e at all. |
2751 if (fastHasAttribute(srcAttr)) | 2737 if (fastHasAttribute(srcAttr)) |
2752 return; | 2738 return; |
2753 | 2739 |
2754 // 4.8.8 - If a source element is inserted as a child of a media element tha t has no src | 2740 // 4.8.8 - If a source element is inserted as a child of a media element tha t has no src |
2755 // attribute and whose networkState has the value NETWORK_EMPTY, the user ag ent must invoke | 2741 // attribute and whose networkState has the value NETWORK_EMPTY, the user ag ent must invoke |
2756 // the media element's resource selection algorithm. | 2742 // the media element's resource selection algorithm. |
2757 if (getNetworkState() == HTMLMediaElement::NETWORK_EMPTY) { | 2743 if (getNetworkState() == HTMLMediaElement::NETWORK_EMPTY) { |
2758 invokeResourceSelectionAlgorithm(); | 2744 invokeResourceSelectionAlgorithm(); |
2759 // Ignore current |m_nextChildNodeToConsider| and consider |source|. | 2745 // Ignore current |m_nextChildNodeToConsider| and consider |source|. |
2760 m_nextChildNodeToConsider = source; | 2746 m_nextChildNodeToConsider = source; |
2761 return; | 2747 return; |
2762 } | 2748 } |
2763 | 2749 |
2764 if (m_currentSourceNode && source == m_currentSourceNode->nextSibling()) { | 2750 if (m_currentSourceNode && source == m_currentSourceNode->nextSibling()) { |
2765 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p) - <source> inserted immediately after current source", this); | 2751 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasAdded(" << (void*)this << ") - <sour ce> inserted immediately after current source"; |
2766 // Ignore current |m_nextChildNodeToConsider| and consider |source|. | 2752 // Ignore current |m_nextChildNodeToConsider| and consider |source|. |
2767 m_nextChildNodeToConsider = source; | 2753 m_nextChildNodeToConsider = source; |
2768 return; | 2754 return; |
2769 } | 2755 } |
2770 | 2756 |
2771 // Consider current |m_nextChildNodeToConsider| as it is already in the midd le of processing. | 2757 // Consider current |m_nextChildNodeToConsider| as it is already in the midd le of processing. |
2772 if (m_nextChildNodeToConsider) | 2758 if (m_nextChildNodeToConsider) |
2773 return; | 2759 return; |
2774 | 2760 |
2775 if (m_loadState != WaitingForSource) | 2761 if (m_loadState != WaitingForSource) |
2776 return; | 2762 return; |
2777 | 2763 |
2778 // 4.8.9.5, resource selection algorithm, source elements section: | 2764 // 4.8.9.5, resource selection algorithm, source elements section: |
2779 // 21. Wait until the node after pointer is a node other than the end of the list. (This step might wait forever.) | 2765 // 21. Wait until the node after pointer is a node other than the end of the list. (This step might wait forever.) |
2780 // 22. Asynchronously await a stable state... | 2766 // 22. Asynchronously await a stable state... |
2781 // 23. Set the element's delaying-the-load-event flag back to true (this del ays the load event again, in case | 2767 // 23. Set the element's delaying-the-load-event flag back to true (this del ays the load event again, in case |
2782 // it hasn't been fired yet). | 2768 // it hasn't been fired yet). |
2783 setShouldDelayLoadEvent(true); | 2769 setShouldDelayLoadEvent(true); |
2784 | 2770 |
2785 // 24. Set the networkState back to NETWORK_LOADING. | 2771 // 24. Set the networkState back to NETWORK_LOADING. |
2786 setNetworkState(NETWORK_LOADING); | 2772 setNetworkState(NETWORK_LOADING); |
2787 | 2773 |
2788 // 25. Jump back to the find next candidate step above. | 2774 // 25. Jump back to the find next candidate step above. |
2789 m_nextChildNodeToConsider = source; | 2775 m_nextChildNodeToConsider = source; |
2790 scheduleNextSourceChild(); | 2776 scheduleNextSourceChild(); |
2791 } | 2777 } |
2792 | 2778 |
2793 void HTMLMediaElement::sourceWasRemoved(HTMLSourceElement* source) | 2779 void HTMLMediaElement::sourceWasRemoved(HTMLSourceElement* source) |
2794 { | 2780 { |
2795 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p, %p)", this, source); | 2781 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasRemoved(" << (void*)this << ", " << sour ce << ")"; |
2796 | 2782 |
2797 #if !LOG_DISABLED | |
2798 KURL url = source->getNonEmptyURLAttribute(srcAttr); | 2783 KURL url = source->getNonEmptyURLAttribute(srcAttr); |
2799 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p) - 'src' is %s", this, urlForLoggingMedia(url).utf8().data()); | 2784 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasRemoved(" << (void*)this << ") - 'src' i s " << urlForLoggingMedia(url); |
2800 #endif | |
2801 | 2785 |
2802 if (source != m_currentSourceNode && source != m_nextChildNodeToConsider) | 2786 if (source != m_currentSourceNode && source != m_nextChildNodeToConsider) |
2803 return; | 2787 return; |
2804 | 2788 |
2805 if (source == m_nextChildNodeToConsider) { | 2789 if (source == m_nextChildNodeToConsider) { |
2806 if (m_currentSourceNode) | 2790 if (m_currentSourceNode) |
2807 m_nextChildNodeToConsider = m_currentSourceNode->nextSibling(); | 2791 m_nextChildNodeToConsider = m_currentSourceNode->nextSibling(); |
2808 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_nextChildNodeToC onsider set to %p", this, m_nextChildNodeToConsider.get()); | 2792 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasRemoved(" << (void*)this << ") - m_n extChildNodeToConsider set to " << m_nextChildNodeToConsider.get(); |
2809 } else if (source == m_currentSourceNode) { | 2793 } else if (source == m_currentSourceNode) { |
2810 // Clear the current source node pointer, but don't change the movie as the spec says: | 2794 // Clear the current source node pointer, but don't change the movie as the spec says: |
2811 // 4.8.8 - Dynamically modifying a source element and its attribute when the element is already | 2795 // 4.8.8 - Dynamically modifying a source element and its attribute when the element is already |
2812 // inserted in a video or audio element will have no effect. | 2796 // inserted in a video or audio element will have no effect. |
2813 m_currentSourceNode = nullptr; | 2797 m_currentSourceNode = nullptr; |
2814 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_currentSourceNod e set to 0", this); | 2798 DVLOG(MEDIA_LOG_LEVEL) << "sourceWasRemoved(" << (void*)this << ") - m_c urrentSourceNode set to 0"; |
2815 } | 2799 } |
2816 } | 2800 } |
2817 | 2801 |
2818 void HTMLMediaElement::timeChanged() | 2802 void HTMLMediaElement::timeChanged() |
2819 { | 2803 { |
2820 WTF_LOG(Media, "HTMLMediaElement::timeChanged(%p)", this); | 2804 DVLOG(MEDIA_LOG_LEVEL) << "timeChanged(" << (void*)this << ")"; |
2821 | 2805 |
2822 cueTimeline().updateActiveCues(currentTime()); | 2806 cueTimeline().updateActiveCues(currentTime()); |
2823 | 2807 |
2824 invalidateCachedTime(); | 2808 invalidateCachedTime(); |
2825 | 2809 |
2826 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t he seek. | 2810 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t he seek. |
2827 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !webMediaPlayer()->see king()) | 2811 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !webMediaPlayer()->see king()) |
2828 finishSeek(); | 2812 finishSeek(); |
2829 | 2813 |
2830 // Always call scheduleTimeupdateEvent when the media engine reports a time discontinuity, | 2814 // Always call scheduleTimeupdateEvent when the media engine reports a time discontinuity, |
(...skipping 29 matching lines...) Expand all Loading... | |
2860 } | 2844 } |
2861 } else { | 2845 } else { |
2862 m_sentEndEvent = false; | 2846 m_sentEndEvent = false; |
2863 } | 2847 } |
2864 | 2848 |
2865 updatePlayState(); | 2849 updatePlayState(); |
2866 } | 2850 } |
2867 | 2851 |
2868 void HTMLMediaElement::durationChanged() | 2852 void HTMLMediaElement::durationChanged() |
2869 { | 2853 { |
2870 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p)", this); | 2854 DVLOG(MEDIA_LOG_LEVEL) << "durationChanged(" << (void*)this << ")"; |
2871 // FIXME: Change WebMediaPlayer to convey the currentTime | 2855 // FIXME: Change WebMediaPlayer to convey the currentTime |
2872 // when the duration change occured. The current WebMediaPlayer | 2856 // when the duration change occured. The current WebMediaPlayer |
2873 // implementations always clamp currentTime() to duration() | 2857 // implementations always clamp currentTime() to duration() |
2874 // so the requestSeek condition here is always false. | 2858 // so the requestSeek condition here is always false. |
2875 durationChanged(duration(), currentTime() > duration()); | 2859 durationChanged(duration(), currentTime() > duration()); |
2876 } | 2860 } |
2877 | 2861 |
2878 void HTMLMediaElement::durationChanged(double duration, bool requestSeek) | 2862 void HTMLMediaElement::durationChanged(double duration, bool requestSeek) |
2879 { | 2863 { |
2880 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p, %f, %d)", this, durati on, requestSeek); | 2864 DVLOG(MEDIA_LOG_LEVEL) << "durationChanged(" << (void*)this << ", " << durat ion << ", " << boolString(requestSeek) << ")"; |
2881 | 2865 |
2882 // Abort if duration unchanged. | 2866 // Abort if duration unchanged. |
2883 if (m_duration == duration) | 2867 if (m_duration == duration) |
2884 return; | 2868 return; |
2885 | 2869 |
2886 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p) : %f -> %f", this, m_d uration, duration); | 2870 DVLOG(MEDIA_LOG_LEVEL) << "durationChanged(" << (void*)this << ") : " << m_d uration << " -> " << duration; |
2887 m_duration = duration; | 2871 m_duration = duration; |
2888 scheduleEvent(EventTypeNames::durationchange); | 2872 scheduleEvent(EventTypeNames::durationchange); |
2889 | 2873 |
2890 if (mediaControls()) | 2874 if (mediaControls()) |
2891 mediaControls()->reset(); | 2875 mediaControls()->reset(); |
2892 if (layoutObject()) | 2876 if (layoutObject()) |
2893 layoutObject()->updateFromElement(); | 2877 layoutObject()->updateFromElement(); |
2894 | 2878 |
2895 if (requestSeek) | 2879 if (requestSeek) |
2896 seek(duration); | 2880 seek(duration); |
2897 } | 2881 } |
2898 | 2882 |
2899 void HTMLMediaElement::playbackStateChanged() | 2883 void HTMLMediaElement::playbackStateChanged() |
2900 { | 2884 { |
2901 WTF_LOG(Media, "HTMLMediaElement::playbackStateChanged(%p)", this); | 2885 DVLOG(MEDIA_LOG_LEVEL) << "playbackStateChanged(" << (void*)this << ")"; |
2902 | 2886 |
2903 if (!webMediaPlayer()) | 2887 if (!webMediaPlayer()) |
2904 return; | 2888 return; |
2905 | 2889 |
2906 if (webMediaPlayer()->paused()) | 2890 if (webMediaPlayer()->paused()) |
2907 pauseInternal(); | 2891 pauseInternal(); |
2908 else | 2892 else |
2909 playInternal(); | 2893 playInternal(); |
2910 } | 2894 } |
2911 | 2895 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2954 if (m_webLayer) | 2938 if (m_webLayer) |
2955 m_webLayer->invalidate(); | 2939 m_webLayer->invalidate(); |
2956 | 2940 |
2957 updateDisplayState(); | 2941 updateDisplayState(); |
2958 if (layoutObject()) | 2942 if (layoutObject()) |
2959 layoutObject()->setShouldDoFullPaintInvalidation(); | 2943 layoutObject()->setShouldDoFullPaintInvalidation(); |
2960 } | 2944 } |
2961 | 2945 |
2962 void HTMLMediaElement::sizeChanged() | 2946 void HTMLMediaElement::sizeChanged() |
2963 { | 2947 { |
2964 WTF_LOG(Media, "HTMLMediaElement::sizeChanged(%p)", this); | 2948 DVLOG(MEDIA_LOG_LEVEL) << "sizeChanged(" << (void*)this << ")"; |
2965 | 2949 |
2966 ASSERT(hasVideo()); // "resize" makes no sense absent video. | 2950 ASSERT(hasVideo()); // "resize" makes no sense absent video. |
2967 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) | 2951 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) |
2968 scheduleEvent(EventTypeNames::resize); | 2952 scheduleEvent(EventTypeNames::resize); |
2969 | 2953 |
2970 if (layoutObject()) | 2954 if (layoutObject()) |
2971 layoutObject()->updateFromElement(); | 2955 layoutObject()->updateFromElement(); |
2972 } | 2956 } |
2973 | 2957 |
2974 TimeRanges* HTMLMediaElement::buffered() const | 2958 TimeRanges* HTMLMediaElement::buffered() const |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3055 } | 3039 } |
3056 | 3040 |
3057 return false; | 3041 return false; |
3058 } | 3042 } |
3059 | 3043 |
3060 void HTMLMediaElement::updatePlayState() | 3044 void HTMLMediaElement::updatePlayState() |
3061 { | 3045 { |
3062 bool isPlaying = webMediaPlayer() && !webMediaPlayer()->paused(); | 3046 bool isPlaying = webMediaPlayer() && !webMediaPlayer()->paused(); |
3063 bool shouldBePlaying = potentiallyPlaying(); | 3047 bool shouldBePlaying = potentiallyPlaying(); |
3064 | 3048 |
3065 WTF_LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s , isPlaying = %s", | 3049 DVLOG(MEDIA_LOG_LEVEL) << "updatePlayState(" << (void*)this << ") - shouldBe Playing = " |
3066 this, boolString(shouldBePlaying), boolString(isPlaying)); | 3050 << boolString(shouldBePlaying) << ", isPlaying = " << boolString(isPlayi ng); |
3067 | 3051 |
3068 if (shouldBePlaying) { | 3052 if (shouldBePlaying) { |
3069 setDisplayMode(Video); | 3053 setDisplayMode(Video); |
3070 invalidateCachedTime(); | 3054 invalidateCachedTime(); |
3071 | 3055 |
3072 if (!isPlaying) { | 3056 if (!isPlaying) { |
3073 // Set rate, muted before calling play in case they were set before the media engine was setup. | 3057 // Set rate, muted before calling play in case they were set before the media engine was setup. |
3074 // The media engine should just stash the rate and muted values sinc e it isn't already playing. | 3058 // The media engine should just stash the rate and muted values sinc e it isn't already playing. |
3075 webMediaPlayer()->setRate(playbackRate()); | 3059 webMediaPlayer()->setRate(playbackRate()); |
3076 updateVolume(); | 3060 updateVolume(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3147 m_playingRemotely = false; | 3131 m_playingRemotely = false; |
3148 if (mediaControls()) | 3132 if (mediaControls()) |
3149 mediaControls()->refreshCastButtonVisibilityWithoutUpdate(); | 3133 mediaControls()->refreshCastButtonVisibilityWithoutUpdate(); |
3150 | 3134 |
3151 if (layoutObject()) | 3135 if (layoutObject()) |
3152 layoutObject()->setShouldDoFullPaintInvalidation(); | 3136 layoutObject()->setShouldDoFullPaintInvalidation(); |
3153 } | 3137 } |
3154 | 3138 |
3155 void HTMLMediaElement::stop() | 3139 void HTMLMediaElement::stop() |
3156 { | 3140 { |
3157 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this); | 3141 DVLOG(MEDIA_LOG_LEVEL) << "stop(" << (void*)this << ")"; |
3158 | 3142 |
3159 // Close the async event queue so that no events are enqueued. | 3143 // Close the async event queue so that no events are enqueued. |
3160 cancelPendingEventsAndCallbacks(); | 3144 cancelPendingEventsAndCallbacks(); |
3161 m_asyncEventQueue->close(); | 3145 m_asyncEventQueue->close(); |
3162 | 3146 |
3163 // Clear everything in the Media Element | 3147 // Clear everything in the Media Element |
3164 clearMediaPlayer(); | 3148 clearMediaPlayer(); |
3165 m_readyState = HAVE_NOTHING; | 3149 m_readyState = HAVE_NOTHING; |
3166 m_readyStateMaximum = HAVE_NOTHING; | 3150 m_readyStateMaximum = HAVE_NOTHING; |
3167 setNetworkState(NETWORK_EMPTY); | 3151 setNetworkState(NETWORK_EMPTY); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3214 return false; | 3198 return false; |
3215 } | 3199 } |
3216 | 3200 |
3217 bool HTMLMediaElement::isFullscreen() const | 3201 bool HTMLMediaElement::isFullscreen() const |
3218 { | 3202 { |
3219 return Fullscreen::isActiveFullScreenElement(*this); | 3203 return Fullscreen::isActiveFullScreenElement(*this); |
3220 } | 3204 } |
3221 | 3205 |
3222 void HTMLMediaElement::enterFullscreen() | 3206 void HTMLMediaElement::enterFullscreen() |
3223 { | 3207 { |
3224 WTF_LOG(Media, "HTMLMediaElement::enterFullscreen(%p)", this); | 3208 DVLOG(MEDIA_LOG_LEVEL) << "enterFullscreen(" << (void*)this << ")"; |
3225 | 3209 |
3226 Fullscreen::from(document()).requestFullscreen(*this, Fullscreen::PrefixedRe quest); | 3210 Fullscreen::from(document()).requestFullscreen(*this, Fullscreen::PrefixedRe quest); |
3227 } | 3211 } |
3228 | 3212 |
3229 void HTMLMediaElement::exitFullscreen() | 3213 void HTMLMediaElement::exitFullscreen() |
3230 { | 3214 { |
3231 WTF_LOG(Media, "HTMLMediaElement::exitFullscreen(%p)", this); | 3215 DVLOG(MEDIA_LOG_LEVEL) << "exitFullscreen(" << (void*)this << ")"; |
3232 | 3216 |
3233 Fullscreen::from(document()).exitFullscreen(); | 3217 Fullscreen::from(document()).exitFullscreen(); |
3234 } | 3218 } |
3235 | 3219 |
3236 void HTMLMediaElement::didBecomeFullscreenElement() | 3220 void HTMLMediaElement::didBecomeFullscreenElement() |
3237 { | 3221 { |
3238 if (mediaControls()) | 3222 if (mediaControls()) |
3239 mediaControls()->enteredFullscreen(); | 3223 mediaControls()->enteredFullscreen(); |
3240 // FIXME: There is no embedder-side handling in layout test mode. | 3224 // FIXME: There is no embedder-side handling in layout test mode. |
3241 if (webMediaPlayer() && !LayoutTestSupport::isRunningLayoutTest()) | 3225 if (webMediaPlayer() && !LayoutTestSupport::isRunningLayoutTest()) |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3317 // so that they are rendered behind them. | 3301 // so that they are rendered behind them. |
3318 shadowRoot.insertBefore(textTrackContainer, firstChild); | 3302 shadowRoot.insertBefore(textTrackContainer, firstChild); |
3319 | 3303 |
3320 assertShadowRootChildren(shadowRoot); | 3304 assertShadowRootChildren(shadowRoot); |
3321 | 3305 |
3322 return *textTrackContainer; | 3306 return *textTrackContainer; |
3323 } | 3307 } |
3324 | 3308 |
3325 void HTMLMediaElement::updateTextTrackDisplay() | 3309 void HTMLMediaElement::updateTextTrackDisplay() |
3326 { | 3310 { |
3327 WTF_LOG(Media, "HTMLMediaElement::updateTextTrackDisplay(%p)", this); | 3311 DVLOG(MEDIA_LOG_LEVEL) << "updateTextTrackDisplay(" << (void*)this << ")"; |
3328 | 3312 |
3329 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidNotSt artExposingControls); | 3313 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidNotSt artExposingControls); |
3330 } | 3314 } |
3331 | 3315 |
3332 void HTMLMediaElement::mediaControlsDidBecomeVisible() | 3316 void HTMLMediaElement::mediaControlsDidBecomeVisible() |
3333 { | 3317 { |
3334 WTF_LOG(Media, "HTMLMediaElement::mediaControlsDidBecomeVisible(%p)", this); | 3318 DVLOG(MEDIA_LOG_LEVEL) << "mediaControlsDidBecomeVisible(" << (void*)this << ")"; |
3335 | 3319 |
3336 // When the user agent starts exposing a user interface for a video element, | 3320 // When the user agent starts exposing a user interface for a video element, |
3337 // the user agent should run the rules for updating the text track rendering | 3321 // the user agent should run the rules for updating the text track rendering |
3338 // of each of the text tracks in the video element's list of text tracks ... | 3322 // of each of the text tracks in the video element's list of text tracks ... |
3339 if (isHTMLVideoElement() && textTracksVisible()) | 3323 if (isHTMLVideoElement() && textTracksVisible()) |
3340 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidS tartExposingControls); | 3324 ensureTextTrackContainer().updateDisplay(*this, TextTrackContainer::DidS tartExposingControls); |
3341 } | 3325 } |
3342 | 3326 |
3343 void HTMLMediaElement::setTextTrackKindUserPreferenceForAllMediaElements(Documen t* document) | 3327 void HTMLMediaElement::setTextTrackKindUserPreferenceForAllMediaElements(Documen t* document) |
3344 { | 3328 { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3405 bool HTMLMediaElement::isURLAttribute(const Attribute& attribute) const | 3389 bool HTMLMediaElement::isURLAttribute(const Attribute& attribute) const |
3406 { | 3390 { |
3407 return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute) ; | 3391 return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute) ; |
3408 } | 3392 } |
3409 | 3393 |
3410 void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay) | 3394 void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay) |
3411 { | 3395 { |
3412 if (m_shouldDelayLoadEvent == shouldDelay) | 3396 if (m_shouldDelayLoadEvent == shouldDelay) |
3413 return; | 3397 return; |
3414 | 3398 |
3415 WTF_LOG(Media, "HTMLMediaElement::setShouldDelayLoadEvent(%p, %s)", this, bo olString(shouldDelay)); | 3399 DVLOG(MEDIA_LOG_LEVEL) << "setShouldDelayLoadEvent(" << (void*)this << ", " << boolString(shouldDelay) << ")"; |
3416 | 3400 |
3417 m_shouldDelayLoadEvent = shouldDelay; | 3401 m_shouldDelayLoadEvent = shouldDelay; |
3418 if (shouldDelay) | 3402 if (shouldDelay) |
3419 document().incrementLoadEventDelayCount(); | 3403 document().incrementLoadEventDelayCount(); |
3420 else | 3404 else |
3421 document().decrementLoadEventDelayCount(); | 3405 document().decrementLoadEventDelayCount(); |
3422 } | 3406 } |
3423 | 3407 |
3424 MediaControls* HTMLMediaElement::mediaControls() const | 3408 MediaControls* HTMLMediaElement::mediaControls() const |
3425 { | 3409 { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3476 CueTimeline& HTMLMediaElement::cueTimeline() | 3460 CueTimeline& HTMLMediaElement::cueTimeline() |
3477 { | 3461 { |
3478 if (!m_cueTimeline) | 3462 if (!m_cueTimeline) |
3479 m_cueTimeline = new CueTimeline(*this); | 3463 m_cueTimeline = new CueTimeline(*this); |
3480 return *m_cueTimeline; | 3464 return *m_cueTimeline; |
3481 } | 3465 } |
3482 | 3466 |
3483 void HTMLMediaElement::configureTextTrackDisplay() | 3467 void HTMLMediaElement::configureTextTrackDisplay() |
3484 { | 3468 { |
3485 ASSERT(m_textTracks); | 3469 ASSERT(m_textTracks); |
3486 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay(%p)", this); | 3470 DVLOG(MEDIA_LOG_LEVEL) << "configureTextTrackDisplay(" << (void*)this << ")" ; |
3487 | 3471 |
3488 if (m_processingPreferenceChange) | 3472 if (m_processingPreferenceChange) |
3489 return; | 3473 return; |
3490 | 3474 |
3491 bool haveVisibleTextTrack = m_textTracks->hasShowingTracks(); | 3475 bool haveVisibleTextTrack = m_textTracks->hasShowingTracks(); |
3492 m_textTracksVisible = haveVisibleTextTrack; | 3476 m_textTracksVisible = haveVisibleTextTrack; |
3493 | 3477 |
3494 if (!haveVisibleTextTrack && !mediaControls()) | 3478 if (!haveVisibleTextTrack && !mediaControls()) |
3495 return; | 3479 return; |
3496 | 3480 |
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3850 | 3834 |
3851 IntRect HTMLMediaElement::AutoplayHelperClientImpl::absoluteBoundingBoxRect() co nst | 3835 IntRect HTMLMediaElement::AutoplayHelperClientImpl::absoluteBoundingBoxRect() co nst |
3852 { | 3836 { |
3853 IntRect result; | 3837 IntRect result; |
3854 if (LayoutObject* object = m_element->layoutObject()) | 3838 if (LayoutObject* object = m_element->layoutObject()) |
3855 result = object->absoluteBoundingBoxRect(); | 3839 result = object->absoluteBoundingBoxRect(); |
3856 return result; | 3840 return result; |
3857 } | 3841 } |
3858 | 3842 |
3859 } // namespace blink | 3843 } // namespace blink |
OLD | NEW |