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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 , m_audioTracks(AudioTrackList::create(*this)) | 360 , m_audioTracks(AudioTrackList::create(*this)) |
361 , m_videoTracks(VideoTrackList::create(*this)) | 361 , m_videoTracks(VideoTrackList::create(*this)) |
362 , m_textTracks(nullptr) | 362 , m_textTracks(nullptr) |
363 , m_ignoreTrackDisplayUpdate(0) | 363 , m_ignoreTrackDisplayUpdate(0) |
364 #if ENABLE(WEB_AUDIO) | 364 #if ENABLE(WEB_AUDIO) |
365 , m_audioSourceNode(nullptr) | 365 , m_audioSourceNode(nullptr) |
366 #endif | 366 #endif |
367 { | 367 { |
368 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); | 368 ASSERT(RuntimeEnabledFeatures::mediaEnabled()); |
369 | 369 |
370 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement"); | 370 WTF_LOG(Media, "HTMLMediaElement::HTMLMediaElement(%p)", this); |
371 | 371 |
372 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes
ture()) | 372 if (document.settings() && document.settings()->mediaPlaybackRequiresUserGes
ture()) |
373 m_userGestureRequiredForPlay = true; | 373 m_userGestureRequiredForPlay = true; |
374 | 374 |
375 setHasCustomStyleCallbacks(); | 375 setHasCustomStyleCallbacks(); |
376 addElementToDocumentMap(this, &document); | 376 addElementToDocumentMap(this, &document); |
377 } | 377 } |
378 | 378 |
379 HTMLMediaElement::~HTMLMediaElement() | 379 HTMLMediaElement::~HTMLMediaElement() |
380 { | 380 { |
381 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement"); | 381 WTF_LOG(Media, "HTMLMediaElement::~HTMLMediaElement(%p)", this); |
382 | 382 |
383 #if ENABLE(OILPAN) | 383 #if ENABLE(OILPAN) |
384 // If the HTMLMediaElement dies with the document we are not | 384 // If the HTMLMediaElement dies with the document we are not |
385 // allowed to touch the document to adjust delay load event counts | 385 // allowed to touch the document to adjust delay load event counts |
386 // because the document could have been already | 386 // because the document could have been already |
387 // destructed. However, if the HTMLMediaElement dies with the | 387 // destructed. However, if the HTMLMediaElement dies with the |
388 // document there is no need to change the delayed load counts | 388 // document there is no need to change the delayed load counts |
389 // because no load event will fire anyway. If the document is | 389 // because no load event will fire anyway. If the document is |
390 // still alive we do have to decrement the load delay counts. We | 390 // still alive we do have to decrement the load delay counts. We |
391 // determine if the document is alive via the ActiveDOMObject | 391 // determine if the document is alive via the ActiveDOMObject |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 #if ENABLE(OILPAN) | 473 #if ENABLE(OILPAN) |
474 void HTMLMediaElement::setCloseMediaSourceWhenFinalizing() | 474 void HTMLMediaElement::setCloseMediaSourceWhenFinalizing() |
475 { | 475 { |
476 ASSERT(!m_closeMediaSourceWhenFinalizing); | 476 ASSERT(!m_closeMediaSourceWhenFinalizing); |
477 m_closeMediaSourceWhenFinalizing = true; | 477 m_closeMediaSourceWhenFinalizing = true; |
478 } | 478 } |
479 #endif | 479 #endif |
480 | 480 |
481 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) | 481 void HTMLMediaElement::didMoveToNewDocument(Document& oldDocument) |
482 { | 482 { |
483 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument"); | 483 WTF_LOG(Media, "HTMLMediaElement::didMoveToNewDocument(%p)", this); |
484 | 484 |
485 if (m_shouldDelayLoadEvent) { | 485 if (m_shouldDelayLoadEvent) { |
486 document().incrementLoadEventDelayCount(); | 486 document().incrementLoadEventDelayCount(); |
487 // Note: Keeping the load event delay count increment on oldDocument tha
t was added | 487 // Note: Keeping the load event delay count increment on oldDocument tha
t was added |
488 // when m_shouldDelayLoadEvent was set so that destruction of m_player c
an not | 488 // when m_shouldDelayLoadEvent was set so that destruction of m_player c
an not |
489 // cause load event dispatching in oldDocument. | 489 // cause load event dispatching in oldDocument. |
490 } else { | 490 } else { |
491 // Incrementing the load event delay count so that destruction of m_play
er can not | 491 // Incrementing the load event delay count so that destruction of m_play
er can not |
492 // cause load event dispatching in oldDocument. | 492 // cause load event dispatching in oldDocument. |
493 oldDocument.incrementLoadEventDelayCount(); | 493 oldDocument.incrementLoadEventDelayCount(); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
570 return shouldShowControls() && HTMLElement::rendererIsNeeded(style); | 570 return shouldShowControls() && HTMLElement::rendererIsNeeded(style); |
571 } | 571 } |
572 | 572 |
573 RenderObject* HTMLMediaElement::createRenderer(RenderStyle*) | 573 RenderObject* HTMLMediaElement::createRenderer(RenderStyle*) |
574 { | 574 { |
575 return new RenderMedia(this); | 575 return new RenderMedia(this); |
576 } | 576 } |
577 | 577 |
578 Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(ContainerNode*
insertionPoint) | 578 Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(ContainerNode*
insertionPoint) |
579 { | 579 { |
580 WTF_LOG(Media, "HTMLMediaElement::insertedInto"); | 580 WTF_LOG(Media, "HTMLMediaElement::insertedInto(%p, %p)", this, insertionPoin
t); |
581 | 581 |
582 HTMLElement::insertedInto(insertionPoint); | 582 HTMLElement::insertedInto(insertionPoint); |
583 if (insertionPoint->inDocument()) { | 583 if (insertionPoint->inDocument()) { |
584 m_active = true; | 584 m_active = true; |
585 | 585 |
586 if (!getAttribute(srcAttr).isEmpty() && m_networkState == NETWORK_EMPTY) | 586 if (!getAttribute(srcAttr).isEmpty() && m_networkState == NETWORK_EMPTY) |
587 scheduleDelayedAction(LoadMediaResource); | 587 scheduleDelayedAction(LoadMediaResource); |
588 } | 588 } |
589 | 589 |
590 return InsertionShouldCallDidNotifySubtreeInsertions; | 590 return InsertionShouldCallDidNotifySubtreeInsertions; |
591 } | 591 } |
592 | 592 |
593 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() | 593 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() |
594 { | 594 { |
595 configureMediaControls(); | 595 configureMediaControls(); |
596 } | 596 } |
597 | 597 |
598 void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) | 598 void HTMLMediaElement::removedFrom(ContainerNode* insertionPoint) |
599 { | 599 { |
600 WTF_LOG(Media, "HTMLMediaElement::removedFrom"); | 600 WTF_LOG(Media, "HTMLMediaElement::removedFrom(%p, %p)", this, insertionPoint
); |
601 | 601 |
602 m_active = false; | 602 m_active = false; |
603 if (insertionPoint->inDocument() && insertionPoint->document().isActive()) { | 603 if (insertionPoint->inDocument() && insertionPoint->document().isActive()) { |
604 configureMediaControls(); | 604 configureMediaControls(); |
605 if (m_networkState > NETWORK_EMPTY) | 605 if (m_networkState > NETWORK_EMPTY) |
606 pause(); | 606 pause(); |
607 } | 607 } |
608 | 608 |
609 HTMLElement::removedFrom(insertionPoint); | 609 HTMLElement::removedFrom(insertionPoint); |
610 } | 610 } |
611 | 611 |
612 void HTMLMediaElement::attach(const AttachContext& context) | 612 void HTMLMediaElement::attach(const AttachContext& context) |
613 { | 613 { |
614 HTMLElement::attach(context); | 614 HTMLElement::attach(context); |
615 | 615 |
616 if (renderer()) | 616 if (renderer()) |
617 renderer()->updateFromElement(); | 617 renderer()->updateFromElement(); |
618 } | 618 } |
619 | 619 |
620 void HTMLMediaElement::didRecalcStyle(StyleRecalcChange) | 620 void HTMLMediaElement::didRecalcStyle(StyleRecalcChange) |
621 { | 621 { |
622 if (renderer()) | 622 if (renderer()) |
623 renderer()->updateFromElement(); | 623 renderer()->updateFromElement(); |
624 } | 624 } |
625 | 625 |
626 void HTMLMediaElement::scheduleDelayedAction(DelayedActionType actionType) | 626 void HTMLMediaElement::scheduleDelayedAction(DelayedActionType actionType) |
627 { | 627 { |
628 WTF_LOG(Media, "HTMLMediaElement::scheduleDelayedAction"); | 628 WTF_LOG(Media, "HTMLMediaElement::scheduleDelayedAction(%p)", this); |
629 | 629 |
630 if ((actionType & LoadMediaResource) && !(m_pendingActionFlags & LoadMediaRe
source)) { | 630 if ((actionType & LoadMediaResource) && !(m_pendingActionFlags & LoadMediaRe
source)) { |
631 prepareForLoad(); | 631 prepareForLoad(); |
632 m_pendingActionFlags |= LoadMediaResource; | 632 m_pendingActionFlags |= LoadMediaResource; |
633 } | 633 } |
634 | 634 |
635 if (actionType & LoadTextTrackResource) | 635 if (actionType & LoadTextTrackResource) |
636 m_pendingActionFlags |= LoadTextTrackResource; | 636 m_pendingActionFlags |= LoadTextTrackResource; |
637 | 637 |
638 if (!m_loadTimer.isActive()) | 638 if (!m_loadTimer.isActive()) |
639 m_loadTimer.startOneShot(0, FROM_HERE); | 639 m_loadTimer.startOneShot(0, FROM_HERE); |
640 } | 640 } |
641 | 641 |
642 void HTMLMediaElement::scheduleNextSourceChild() | 642 void HTMLMediaElement::scheduleNextSourceChild() |
643 { | 643 { |
644 // Schedule the timer to try the next <source> element WITHOUT resetting sta
te ala prepareForLoad. | 644 // Schedule the timer to try the next <source> element WITHOUT resetting sta
te ala prepareForLoad. |
645 m_pendingActionFlags |= LoadMediaResource; | 645 m_pendingActionFlags |= LoadMediaResource; |
646 m_loadTimer.startOneShot(0, FROM_HERE); | 646 m_loadTimer.startOneShot(0, FROM_HERE); |
647 } | 647 } |
648 | 648 |
649 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) | 649 void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) |
650 { | 650 { |
651 scheduleEvent(Event::createCancelable(eventName)); | 651 scheduleEvent(Event::createCancelable(eventName)); |
652 } | 652 } |
653 | 653 |
654 void HTMLMediaElement::scheduleEvent(PassRefPtrWillBeRawPtr<Event> event) | 654 void HTMLMediaElement::scheduleEvent(PassRefPtrWillBeRawPtr<Event> event) |
655 { | 655 { |
656 #if LOG_MEDIA_EVENTS | 656 #if LOG_MEDIA_EVENTS |
657 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", event->t
ype().ascii().data()); | 657 WTF_LOG(Media, "HTMLMediaElement::scheduleEvent(%p) - scheduling '%s'", this
, event->type().ascii().data()); |
658 #endif | 658 #endif |
659 m_asyncEventQueue->enqueueEvent(event); | 659 m_asyncEventQueue->enqueueEvent(event); |
660 } | 660 } |
661 | 661 |
662 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) | 662 void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) |
663 { | 663 { |
664 if (m_pendingActionFlags & LoadTextTrackResource) | 664 if (m_pendingActionFlags & LoadTextTrackResource) |
665 configureTextTracks(); | 665 configureTextTracks(); |
666 | 666 |
667 if (m_pendingActionFlags & LoadMediaResource) { | 667 if (m_pendingActionFlags & LoadMediaResource) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
704 canPlay = emptyString(); | 704 canPlay = emptyString(); |
705 break; | 705 break; |
706 case WebMimeRegistry::MayBeSupported: | 706 case WebMimeRegistry::MayBeSupported: |
707 canPlay = "maybe"; | 707 canPlay = "maybe"; |
708 break; | 708 break; |
709 case WebMimeRegistry::IsSupported: | 709 case WebMimeRegistry::IsSupported: |
710 canPlay = "probably"; | 710 canPlay = "probably"; |
711 break; | 711 break; |
712 } | 712 } |
713 | 713 |
714 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%s, %s) -> %s", mimeType.utf8(
).data(), keySystem.utf8().data(), canPlay.utf8().data()); | 714 WTF_LOG(Media, "HTMLMediaElement::canPlayType(%p, %s, %s) -> %s", this, mime
Type.utf8().data(), keySystem.utf8().data(), canPlay.utf8().data()); |
715 | 715 |
716 return canPlay; | 716 return canPlay; |
717 } | 717 } |
718 | 718 |
719 void HTMLMediaElement::load() | 719 void HTMLMediaElement::load() |
720 { | 720 { |
721 WTF_LOG(Media, "HTMLMediaElement::load()"); | 721 WTF_LOG(Media, "HTMLMediaElement::load(%p)", this); |
722 | 722 |
723 if (UserGestureIndicator::processingUserGesture()) | 723 if (UserGestureIndicator::processingUserGesture()) |
724 m_userGestureRequiredForPlay = false; | 724 m_userGestureRequiredForPlay = false; |
725 | 725 |
726 prepareForLoad(); | 726 prepareForLoad(); |
727 loadInternal(); | 727 loadInternal(); |
728 prepareToPlay(); | 728 prepareToPlay(); |
729 } | 729 } |
730 | 730 |
731 void HTMLMediaElement::prepareForLoad() | 731 void HTMLMediaElement::prepareForLoad() |
732 { | 732 { |
733 WTF_LOG(Media, "HTMLMediaElement::prepareForLoad"); | 733 WTF_LOG(Media, "HTMLMediaElement::prepareForLoad(%p)", this); |
734 | 734 |
735 // Perform the cleanup required for the resource load algorithm to run. | 735 // Perform the cleanup required for the resource load algorithm to run. |
736 stopPeriodicTimers(); | 736 stopPeriodicTimers(); |
737 m_loadTimer.stop(); | 737 m_loadTimer.stop(); |
738 cancelDeferredLoad(); | 738 cancelDeferredLoad(); |
739 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec
essary and set m_pendingActionFlags to 0 here. | 739 // FIXME: Figure out appropriate place to reset LoadTextTrackResource if nec
essary and set m_pendingActionFlags to 0 here. |
740 m_pendingActionFlags &= ~LoadMediaResource; | 740 m_pendingActionFlags &= ~LoadMediaResource; |
741 m_sentEndEvent = false; | 741 m_sentEndEvent = false; |
742 m_sentStalledEvent = false; | 742 m_sentStalledEvent = false; |
743 m_haveFiredLoadedData = false; | 743 m_haveFiredLoadedData = false; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
841 if (track->mode() != TextTrack::disabledKeyword()) | 841 if (track->mode() != TextTrack::disabledKeyword()) |
842 m_textTracksWhenResourceSelectionBegan.append(track); | 842 m_textTracksWhenResourceSelectionBegan.append(track); |
843 } | 843 } |
844 } | 844 } |
845 | 845 |
846 selectMediaResource(); | 846 selectMediaResource(); |
847 } | 847 } |
848 | 848 |
849 void HTMLMediaElement::selectMediaResource() | 849 void HTMLMediaElement::selectMediaResource() |
850 { | 850 { |
851 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource"); | 851 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this); |
852 | 852 |
853 enum Mode { attribute, children }; | 853 enum Mode { attribute, children }; |
854 | 854 |
855 // 3 - If the media element has a src attribute, then let mode be attribute. | 855 // 3 - If the media element has a src attribute, then let mode be attribute. |
856 Mode mode = attribute; | 856 Mode mode = attribute; |
857 if (!fastHasAttribute(srcAttr)) { | 857 if (!fastHasAttribute(srcAttr)) { |
858 // Otherwise, if the media element does not have a src attribute but has
a source | 858 // Otherwise, if the media element does not have a src attribute but has
a source |
859 // element child, then let mode be children and let candidate be the fir
st such | 859 // element child, then let mode be children and let candidate be the fir
st such |
860 // source element child in tree order. | 860 // source element child in tree order. |
861 if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChil
d(*this)) { | 861 if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChil
d(*this)) { |
862 mode = children; | 862 mode = children; |
863 m_nextChildNodeToConsider = element; | 863 m_nextChildNodeToConsider = element; |
864 m_currentSourceNode = nullptr; | 864 m_currentSourceNode = nullptr; |
865 } else { | 865 } else { |
866 // Otherwise the media element has neither a src attribute nor a sou
rce element | 866 // Otherwise the media element has neither a src attribute nor a sou
rce element |
867 // child: set the networkState to NETWORK_EMPTY, and abort these ste
ps; the | 867 // child: set the networkState to NETWORK_EMPTY, and abort these ste
ps; the |
868 // synchronous section ends. | 868 // synchronous section ends. |
869 m_loadState = WaitingForSource; | 869 m_loadState = WaitingForSource; |
870 setShouldDelayLoadEvent(false); | 870 setShouldDelayLoadEvent(false); |
871 m_networkState = NETWORK_EMPTY; | 871 m_networkState = NETWORK_EMPTY; |
872 | 872 |
873 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource, nothing to lo
ad"); | 873 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing t
o load", this); |
874 return; | 874 return; |
875 } | 875 } |
876 } | 876 } |
877 | 877 |
878 // 4 - Set the media element's delaying-the-load-event flag to true (this de
lays the load event), | 878 // 4 - Set the media element's delaying-the-load-event flag to true (this de
lays the load event), |
879 // and set its networkState to NETWORK_LOADING. | 879 // and set its networkState to NETWORK_LOADING. |
880 setShouldDelayLoadEvent(true); | 880 setShouldDelayLoadEvent(true); |
881 m_networkState = NETWORK_LOADING; | 881 m_networkState = NETWORK_LOADING; |
882 | 882 |
883 // 5 - Queue a task to fire a simple event named loadstart at the media elem
ent. | 883 // 5 - Queue a task to fire a simple event named loadstart at the media elem
ent. |
884 scheduleEvent(EventTypeNames::loadstart); | 884 scheduleEvent(EventTypeNames::loadstart); |
885 | 885 |
886 // 6 - If mode is attribute, then run these substeps | 886 // 6 - If mode is attribute, then run these substeps |
887 if (mode == attribute) { | 887 if (mode == attribute) { |
888 m_loadState = LoadingFromSrcAttr; | 888 m_loadState = LoadingFromSrcAttr; |
889 | 889 |
890 // If the src attribute's value is the empty string ... jump down to the
failed step below | 890 // If the src attribute's value is the empty string ... jump down to the
failed step below |
891 KURL mediaURL = getNonEmptyURLAttribute(srcAttr); | 891 KURL mediaURL = getNonEmptyURLAttribute(srcAttr); |
892 if (mediaURL.isEmpty()) { | 892 if (mediaURL.isEmpty()) { |
893 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 893 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
894 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource, empty 'src'")
; | 894 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'sr
c'", this); |
895 return; | 895 return; |
896 } | 896 } |
897 | 897 |
898 if (!isSafeToLoadURL(mediaURL, Complain)) { | 898 if (!isSafeToLoadURL(mediaURL, Complain)) { |
899 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 899 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
900 return; | 900 return; |
901 } | 901 } |
902 | 902 |
903 // No type or key system information is available when the url comes | 903 // No type or key system information is available when the url comes |
904 // from the 'src' attribute so MediaPlayer | 904 // from the 'src' attribute so MediaPlayer |
905 // will have to pick a media engine based on the file extension. | 905 // will have to pick a media engine based on the file extension. |
906 ContentType contentType((String())); | 906 ContentType contentType((String())); |
907 loadResource(mediaURL, contentType, String()); | 907 loadResource(mediaURL, contentType, String()); |
908 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource, using 'src' attri
bute url"); | 908 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' a
ttribute url", this); |
909 return; | 909 return; |
910 } | 910 } |
911 | 911 |
912 // Otherwise, the source elements will be used | 912 // Otherwise, the source elements will be used |
913 loadNextSourceChild(); | 913 loadNextSourceChild(); |
914 } | 914 } |
915 | 915 |
916 void HTMLMediaElement::loadNextSourceChild() | 916 void HTMLMediaElement::loadNextSourceChild() |
917 { | 917 { |
918 ContentType contentType((String())); | 918 ContentType contentType((String())); |
919 String keySystem; | 919 String keySystem; |
920 KURL mediaURL = selectNextSourceChild(&contentType, &keySystem, Complain); | 920 KURL mediaURL = selectNextSourceChild(&contentType, &keySystem, Complain); |
921 if (!mediaURL.isValid()) { | 921 if (!mediaURL.isValid()) { |
922 waitForSourceChange(); | 922 waitForSourceChange(); |
923 return; | 923 return; |
924 } | 924 } |
925 | 925 |
926 // Recreate the media player for the new url | 926 // Recreate the media player for the new url |
927 createMediaPlayer(); | 927 createMediaPlayer(); |
928 | 928 |
929 m_loadState = LoadingFromSourceElement; | 929 m_loadState = LoadingFromSourceElement; |
930 loadResource(mediaURL, contentType, keySystem); | 930 loadResource(mediaURL, contentType, keySystem); |
931 } | 931 } |
932 | 932 |
933 void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType, c
onst String& keySystem) | 933 void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType, c
onst String& keySystem) |
934 { | 934 { |
935 ASSERT(isSafeToLoadURL(url, Complain)); | 935 ASSERT(isSafeToLoadURL(url, Complain)); |
936 | 936 |
937 WTF_LOG(Media, "HTMLMediaElement::loadResource(%s, %s, %s)", urlForLoggingMe
dia(url).utf8().data(), contentType.raw().utf8().data(), keySystem.utf8().data()
); | 937 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p, %s, %s, %s)", this, urlFo
rLoggingMedia(url).utf8().data(), contentType.raw().utf8().data(), keySystem.utf
8().data()); |
938 | 938 |
939 LocalFrame* frame = document().frame(); | 939 LocalFrame* frame = document().frame(); |
940 if (!frame) { | 940 if (!frame) { |
941 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 941 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
942 return; | 942 return; |
943 } | 943 } |
944 | 944 |
945 // The resource fetch algorithm | 945 // The resource fetch algorithm |
946 m_networkState = NETWORK_LOADING; | 946 m_networkState = NETWORK_LOADING; |
947 | 947 |
948 // Set m_currentSrc *before* changing to the cache url, the fact that we are
loading from the app | 948 // Set m_currentSrc *before* changing to the cache url, the fact that we are
loading from the app |
949 // cache is an internal detail not exposed through the media element API. | 949 // cache is an internal detail not exposed through the media element API. |
950 m_currentSrc = url; | 950 m_currentSrc = url; |
951 | 951 |
952 WTF_LOG(Media, "HTMLMediaElement::loadResource - m_currentSrc -> %s", urlFor
LoggingMedia(m_currentSrc).utf8().data()); | 952 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) - m_currentSrc -> %s", th
is, urlForLoggingMedia(m_currentSrc).utf8().data()); |
953 | 953 |
954 startProgressEventTimer(); | 954 startProgressEventTimer(); |
955 | 955 |
956 // Reset display mode to force a recalculation of what to show because we ar
e resetting the player. | 956 // Reset display mode to force a recalculation of what to show because we ar
e resetting the player. |
957 setDisplayMode(Unknown); | 957 setDisplayMode(Unknown); |
958 | 958 |
959 if (!autoplay()) | 959 if (!autoplay()) |
960 setPlayerPreload(); | 960 setPlayerPreload(); |
961 | 961 |
962 if (fastHasAttribute(mutedAttr)) | 962 if (fastHasAttribute(mutedAttr)) |
(...skipping 18 matching lines...) Expand all Loading... |
981 attemptLoad = false; | 981 attemptLoad = false; |
982 } | 982 } |
983 } | 983 } |
984 } | 984 } |
985 } | 985 } |
986 | 986 |
987 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { | 987 if (attemptLoad && canLoadURL(url, contentType, keySystem)) { |
988 ASSERT(!webMediaPlayer()); | 988 ASSERT(!webMediaPlayer()); |
989 | 989 |
990 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No
ne) { | 990 if (!m_havePreparedToPlay && !autoplay() && m_preload == MediaPlayer::No
ne) { |
991 WTF_LOG(Media, "HTMLMediaElement::loadResource : Delaying load becau
se preload == 'none'"); | 991 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b
ecause preload == 'none'", this); |
992 deferLoad(); | 992 deferLoad(); |
993 } else { | 993 } else { |
994 startPlayerLoad(); | 994 startPlayerLoad(); |
995 } | 995 } |
996 } else { | 996 } else { |
997 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 997 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
998 } | 998 } |
999 | 999 |
1000 // If there is no poster to display, allow the media engine to render video
frames as soon as | 1000 // If there is no poster to display, allow the media engine to render video
frames as soon as |
1001 // they are available. | 1001 // they are available. |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1453 void HTMLMediaElement::endIgnoringTrackDisplayUpdateRequests() | 1453 void HTMLMediaElement::endIgnoringTrackDisplayUpdateRequests() |
1454 { | 1454 { |
1455 ASSERT(m_ignoreTrackDisplayUpdate); | 1455 ASSERT(m_ignoreTrackDisplayUpdate); |
1456 --m_ignoreTrackDisplayUpdate; | 1456 --m_ignoreTrackDisplayUpdate; |
1457 if (!m_ignoreTrackDisplayUpdate && m_active) | 1457 if (!m_ignoreTrackDisplayUpdate && m_active) |
1458 updateActiveTextTrackCues(currentTime()); | 1458 updateActiveTextTrackCues(currentTime()); |
1459 } | 1459 } |
1460 | 1460 |
1461 void HTMLMediaElement::textTrackAddCues(TextTrack* track, const TextTrackCueList
* cues) | 1461 void HTMLMediaElement::textTrackAddCues(TextTrack* track, const TextTrackCueList
* cues) |
1462 { | 1462 { |
1463 WTF_LOG(Media, "HTMLMediaElement::textTrackAddCues"); | 1463 WTF_LOG(Media, "HTMLMediaElement::textTrackAddCues(%p)", this); |
1464 if (track->mode() == TextTrack::disabledKeyword()) | 1464 if (track->mode() == TextTrack::disabledKeyword()) |
1465 return; | 1465 return; |
1466 | 1466 |
1467 TrackDisplayUpdateScope scope(this); | 1467 TrackDisplayUpdateScope scope(this); |
1468 for (size_t i = 0; i < cues->length(); ++i) | 1468 for (size_t i = 0; i < cues->length(); ++i) |
1469 textTrackAddCue(cues->item(i)->track(), cues->item(i)); | 1469 textTrackAddCue(cues->item(i)->track(), cues->item(i)); |
1470 } | 1470 } |
1471 | 1471 |
1472 void HTMLMediaElement::textTrackRemoveCues(TextTrack*, const TextTrackCueList* c
ues) | 1472 void HTMLMediaElement::textTrackRemoveCues(TextTrack*, const TextTrackCueList* c
ues) |
1473 { | 1473 { |
1474 WTF_LOG(Media, "HTMLMediaElement::textTrackRemoveCues"); | 1474 WTF_LOG(Media, "HTMLMediaElement::textTrackRemoveCues(%p)", this); |
1475 | 1475 |
1476 TrackDisplayUpdateScope scope(this); | 1476 TrackDisplayUpdateScope scope(this); |
1477 for (size_t i = 0; i < cues->length(); ++i) | 1477 for (size_t i = 0; i < cues->length(); ++i) |
1478 textTrackRemoveCue(cues->item(i)->track(), cues->item(i)); | 1478 textTrackRemoveCue(cues->item(i)->track(), cues->item(i)); |
1479 } | 1479 } |
1480 | 1480 |
1481 void HTMLMediaElement::textTrackAddCue(TextTrack* track, PassRefPtrWillBeRawPtr<
TextTrackCue> cue) | 1481 void HTMLMediaElement::textTrackAddCue(TextTrack* track, PassRefPtrWillBeRawPtr<
TextTrackCue> cue) |
1482 { | 1482 { |
1483 if (track->mode() == TextTrack::disabledKeyword()) | 1483 if (track->mode() == TextTrack::disabledKeyword()) |
1484 return; | 1484 return; |
(...skipping 30 matching lines...) Expand all Loading... |
1515 cue->removeDisplayTree(); | 1515 cue->removeDisplayTree(); |
1516 updateActiveTextTrackCues(currentTime()); | 1516 updateActiveTextTrackCues(currentTime()); |
1517 | 1517 |
1518 cue->notifyRegionWhenRemovingDisplayTree(true); | 1518 cue->notifyRegionWhenRemovingDisplayTree(true); |
1519 } | 1519 } |
1520 | 1520 |
1521 | 1521 |
1522 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionI
fInvalid) | 1522 bool HTMLMediaElement::isSafeToLoadURL(const KURL& url, InvalidURLAction actionI
fInvalid) |
1523 { | 1523 { |
1524 if (!url.isValid()) { | 1524 if (!url.isValid()) { |
1525 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%s) -> FALSE because u
rl is invalid", urlForLoggingMedia(url).utf8().data()); | 1525 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE becau
se url is invalid", this, urlForLoggingMedia(url).utf8().data()); |
1526 return false; | 1526 return false; |
1527 } | 1527 } |
1528 | 1528 |
1529 LocalFrame* frame = document().frame(); | 1529 LocalFrame* frame = document().frame(); |
1530 if (!frame || !document().securityOrigin()->canDisplay(url)) { | 1530 if (!frame || !document().securityOrigin()->canDisplay(url)) { |
1531 if (actionIfInvalid == Complain) | 1531 if (actionIfInvalid == Complain) |
1532 FrameLoader::reportLocalLoadFailed(frame, url.elidedString()); | 1532 FrameLoader::reportLocalLoadFailed(frame, url.elidedString()); |
1533 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%s) -> FALSE rejected
by SecurityOrigin", urlForLoggingMedia(url).utf8().data()); | 1533 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> FALSE rejec
ted by SecurityOrigin", this, urlForLoggingMedia(url).utf8().data()); |
1534 return false; | 1534 return false; |
1535 } | 1535 } |
1536 | 1536 |
1537 if (!document().contentSecurityPolicy()->allowMediaFromSource(url)) { | 1537 if (!document().contentSecurityPolicy()->allowMediaFromSource(url)) { |
1538 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%s) -> rejected by Con
tent Security Policy", urlForLoggingMedia(url).utf8().data()); | 1538 WTF_LOG(Media, "HTMLMediaElement::isSafeToLoadURL(%p, %s) -> rejected by
Content Security Policy", this, urlForLoggingMedia(url).utf8().data()); |
1539 return false; | 1539 return false; |
1540 } | 1540 } |
1541 | 1541 |
1542 return true; | 1542 return true; |
1543 } | 1543 } |
1544 | 1544 |
1545 void HTMLMediaElement::startProgressEventTimer() | 1545 void HTMLMediaElement::startProgressEventTimer() |
1546 { | 1546 { |
1547 if (m_progressEventTimer.isActive()) | 1547 if (m_progressEventTimer.isActive()) |
1548 return; | 1548 return; |
1549 | 1549 |
1550 m_previousProgressTime = WTF::currentTime(); | 1550 m_previousProgressTime = WTF::currentTime(); |
1551 // 350ms is not magic, it is in the spec! | 1551 // 350ms is not magic, it is in the spec! |
1552 m_progressEventTimer.startRepeating(0.350, FROM_HERE); | 1552 m_progressEventTimer.startRepeating(0.350, FROM_HERE); |
1553 } | 1553 } |
1554 | 1554 |
1555 void HTMLMediaElement::waitForSourceChange() | 1555 void HTMLMediaElement::waitForSourceChange() |
1556 { | 1556 { |
1557 WTF_LOG(Media, "HTMLMediaElement::waitForSourceChange"); | 1557 WTF_LOG(Media, "HTMLMediaElement::waitForSourceChange(%p)", this); |
1558 | 1558 |
1559 stopPeriodicTimers(); | 1559 stopPeriodicTimers(); |
1560 m_loadState = WaitingForSource; | 1560 m_loadState = WaitingForSource; |
1561 | 1561 |
1562 // 6.17 - Waiting: Set the element's networkState attribute to the NETWORK_N
O_SOURCE value | 1562 // 6.17 - Waiting: Set the element's networkState attribute to the NETWORK_N
O_SOURCE value |
1563 m_networkState = NETWORK_NO_SOURCE; | 1563 m_networkState = NETWORK_NO_SOURCE; |
1564 | 1564 |
1565 // 6.18 - Set the element's delaying-the-load-event flag to false. This stop
s delaying the load event. | 1565 // 6.18 - Set the element's delaying-the-load-event flag to false. This stop
s delaying the load event. |
1566 setShouldDelayLoadEvent(false); | 1566 setShouldDelayLoadEvent(false); |
1567 | 1567 |
1568 updateDisplayState(); | 1568 updateDisplayState(); |
1569 | 1569 |
1570 if (renderer()) | 1570 if (renderer()) |
1571 renderer()->updateFromElement(); | 1571 renderer()->updateFromElement(); |
1572 } | 1572 } |
1573 | 1573 |
1574 void HTMLMediaElement::noneSupported() | 1574 void HTMLMediaElement::noneSupported() |
1575 { | 1575 { |
1576 WTF_LOG(Media, "HTMLMediaElement::noneSupported"); | 1576 WTF_LOG(Media, "HTMLMediaElement::noneSupported(%p)", this); |
1577 | 1577 |
1578 stopPeriodicTimers(); | 1578 stopPeriodicTimers(); |
1579 m_loadState = WaitingForSource; | 1579 m_loadState = WaitingForSource; |
1580 m_currentSourceNode = nullptr; | 1580 m_currentSourceNode = nullptr; |
1581 | 1581 |
1582 // 4.8.10.5 | 1582 // 4.8.10.5 |
1583 // 6 - Reaching this step indicates that the media resource failed to load o
r that the given | 1583 // 6 - Reaching this step indicates that the media resource failed to load o
r that the given |
1584 // URL could not be resolved. In one atomic operation, run the following ste
ps: | 1584 // URL could not be resolved. In one atomic operation, run the following ste
ps: |
1585 | 1585 |
1586 // 6.1 - Set the error attribute to a new MediaError object whose code attri
bute is set to | 1586 // 6.1 - Set the error attribute to a new MediaError object whose code attri
bute is set to |
(...skipping 19 matching lines...) Expand all Loading... |
1606 | 1606 |
1607 updateDisplayState(); | 1607 updateDisplayState(); |
1608 | 1608 |
1609 if (renderer()) | 1609 if (renderer()) |
1610 renderer()->updateFromElement(); | 1610 renderer()->updateFromElement(); |
1611 } | 1611 } |
1612 | 1612 |
1613 void HTMLMediaElement::mediaEngineError(PassRefPtrWillBeRawPtr<MediaError> err) | 1613 void HTMLMediaElement::mediaEngineError(PassRefPtrWillBeRawPtr<MediaError> err) |
1614 { | 1614 { |
1615 ASSERT(m_readyState >= HAVE_METADATA); | 1615 ASSERT(m_readyState >= HAVE_METADATA); |
1616 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%d)", static_cast<int>(er
r->code())); | 1616 WTF_LOG(Media, "HTMLMediaElement::mediaEngineError(%p, %d)", this, static_ca
st<int>(err->code())); |
1617 | 1617 |
1618 // 1 - The user agent should cancel the fetching process. | 1618 // 1 - The user agent should cancel the fetching process. |
1619 stopPeriodicTimers(); | 1619 stopPeriodicTimers(); |
1620 m_loadState = WaitingForSource; | 1620 m_loadState = WaitingForSource; |
1621 | 1621 |
1622 // 2 - Set the error attribute to a new MediaError object whose code attribu
te is | 1622 // 2 - Set the error attribute to a new MediaError object whose code attribu
te is |
1623 // set to MEDIA_ERR_NETWORK/MEDIA_ERR_DECODE. | 1623 // set to MEDIA_ERR_NETWORK/MEDIA_ERR_DECODE. |
1624 m_error = err; | 1624 m_error = err; |
1625 | 1625 |
1626 // 3 - Queue a task to fire a simple event named error at the media element. | 1626 // 3 - Queue a task to fire a simple event named error at the media element. |
1627 scheduleEvent(EventTypeNames::error); | 1627 scheduleEvent(EventTypeNames::error); |
1628 | 1628 |
1629 // 4 - Set the element's networkState attribute to the NETWORK_IDLE value. | 1629 // 4 - Set the element's networkState attribute to the NETWORK_IDLE value. |
1630 m_networkState = NETWORK_IDLE; | 1630 m_networkState = NETWORK_IDLE; |
1631 | 1631 |
1632 // 5 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. | 1632 // 5 - Set the element's delaying-the-load-event flag to false. This stops d
elaying the load event. |
1633 setShouldDelayLoadEvent(false); | 1633 setShouldDelayLoadEvent(false); |
1634 | 1634 |
1635 // 6 - Abort the overall resource selection algorithm. | 1635 // 6 - Abort the overall resource selection algorithm. |
1636 m_currentSourceNode = nullptr; | 1636 m_currentSourceNode = nullptr; |
1637 } | 1637 } |
1638 | 1638 |
1639 void HTMLMediaElement::cancelPendingEventsAndCallbacks() | 1639 void HTMLMediaElement::cancelPendingEventsAndCallbacks() |
1640 { | 1640 { |
1641 WTF_LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks"); | 1641 WTF_LOG(Media, "HTMLMediaElement::cancelPendingEventsAndCallbacks(%p)", this
); |
1642 m_asyncEventQueue->cancelAllEvents(); | 1642 m_asyncEventQueue->cancelAllEvents(); |
1643 | 1643 |
1644 for (HTMLSourceElement* source = Traversal<HTMLSourceElement>::firstChild(*t
his); source; source = Traversal<HTMLSourceElement>::nextSibling(*source)) | 1644 for (HTMLSourceElement* source = Traversal<HTMLSourceElement>::firstChild(*t
his); source; source = Traversal<HTMLSourceElement>::nextSibling(*source)) |
1645 source->cancelPendingErrorEvent(); | 1645 source->cancelPendingErrorEvent(); |
1646 } | 1646 } |
1647 | 1647 |
1648 void HTMLMediaElement::mediaPlayerNetworkStateChanged() | 1648 void HTMLMediaElement::mediaPlayerNetworkStateChanged() |
1649 { | 1649 { |
1650 setNetworkState(webMediaPlayer()->networkState()); | 1650 setNetworkState(webMediaPlayer()->networkState()); |
1651 } | 1651 } |
1652 | 1652 |
1653 void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error) | 1653 void HTMLMediaElement::mediaLoadingFailed(WebMediaPlayer::NetworkState error) |
1654 { | 1654 { |
1655 stopPeriodicTimers(); | 1655 stopPeriodicTimers(); |
1656 | 1656 |
1657 // If we failed while trying to load a <source> element, the movie was never
parsed, and there are more | 1657 // If we failed while trying to load a <source> element, the movie was never
parsed, and there are more |
1658 // <source> children, schedule the next one | 1658 // <source> children, schedule the next one |
1659 if (m_readyState < HAVE_METADATA && m_loadState == LoadingFromSourceElement)
{ | 1659 if (m_readyState < HAVE_METADATA && m_loadState == LoadingFromSourceElement)
{ |
1660 | 1660 |
1661 // resource selection algorithm | 1661 // resource selection algorithm |
1662 // 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. | 1662 // 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. |
1663 if (m_currentSourceNode) | 1663 if (m_currentSourceNode) |
1664 m_currentSourceNode->scheduleErrorEvent(); | 1664 m_currentSourceNode->scheduleErrorEvent(); |
1665 else | 1665 else |
1666 WTF_LOG(Media, "HTMLMediaElement::setNetworkState - error event not
sent, <source> was removed"); | 1666 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - error event
not sent, <source> was removed", this); |
1667 | 1667 |
1668 // 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. | 1668 // 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. |
1669 | 1669 |
1670 // 9.Otherwise.11 - Forget the media element's media-resource-specific t
racks. | 1670 // 9.Otherwise.11 - Forget the media element's media-resource-specific t
racks. |
1671 forgetResourceSpecificTracks(); | 1671 forgetResourceSpecificTracks(); |
1672 | 1672 |
1673 if (havePotentialSourceChild()) { | 1673 if (havePotentialSourceChild()) { |
1674 WTF_LOG(Media, "HTMLMediaElement::setNetworkState - scheduling next
<source>"); | 1674 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - scheduling n
ext <source>", this); |
1675 scheduleNextSourceChild(); | 1675 scheduleNextSourceChild(); |
1676 } else { | 1676 } else { |
1677 WTF_LOG(Media, "HTMLMediaElement::setNetworkState - no more <source>
elements, waiting"); | 1677 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p) - no more <sou
rce> elements, waiting", this); |
1678 waitForSourceChange(); | 1678 waitForSourceChange(); |
1679 } | 1679 } |
1680 | 1680 |
1681 return; | 1681 return; |
1682 } | 1682 } |
1683 | 1683 |
1684 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV
E_METADATA) | 1684 if (error == WebMediaPlayer::NetworkStateNetworkError && m_readyState >= HAV
E_METADATA) |
1685 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); | 1685 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_NETWORK)); |
1686 else if (error == WebMediaPlayer::NetworkStateDecodeError) | 1686 else if (error == WebMediaPlayer::NetworkStateDecodeError) |
1687 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_DECODE)); | 1687 mediaEngineError(MediaError::create(MediaError::MEDIA_ERR_DECODE)); |
1688 else if ((error == WebMediaPlayer::NetworkStateFormatError | 1688 else if ((error == WebMediaPlayer::NetworkStateFormatError |
1689 || error == WebMediaPlayer::NetworkStateNetworkError) | 1689 || error == WebMediaPlayer::NetworkStateNetworkError) |
1690 && m_loadState == LoadingFromSrcAttr) | 1690 && m_loadState == LoadingFromSrcAttr) |
1691 noneSupported(); | 1691 noneSupported(); |
1692 | 1692 |
1693 updateDisplayState(); | 1693 updateDisplayState(); |
1694 if (hasMediaControls()) | 1694 if (hasMediaControls()) |
1695 mediaControls()->reset(); | 1695 mediaControls()->reset(); |
1696 } | 1696 } |
1697 | 1697 |
1698 void HTMLMediaElement::setNetworkState(WebMediaPlayer::NetworkState state) | 1698 void HTMLMediaElement::setNetworkState(WebMediaPlayer::NetworkState state) |
1699 { | 1699 { |
1700 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%d) - current state is %d"
, static_cast<int>(state), static_cast<int>(m_networkState)); | 1700 WTF_LOG(Media, "HTMLMediaElement::setNetworkState(%p, %d) - current state is
%d", this, static_cast<int>(state), static_cast<int>(m_networkState)); |
1701 | 1701 |
1702 if (state == WebMediaPlayer::NetworkStateEmpty) { | 1702 if (state == WebMediaPlayer::NetworkStateEmpty) { |
1703 // Just update the cached state and leave, we can't do anything. | 1703 // Just update the cached state and leave, we can't do anything. |
1704 m_networkState = NETWORK_EMPTY; | 1704 m_networkState = NETWORK_EMPTY; |
1705 return; | 1705 return; |
1706 } | 1706 } |
1707 | 1707 |
1708 if (state == WebMediaPlayer::NetworkStateFormatError | 1708 if (state == WebMediaPlayer::NetworkStateFormatError |
1709 || state == WebMediaPlayer::NetworkStateNetworkError | 1709 || state == WebMediaPlayer::NetworkStateNetworkError |
1710 || state == WebMediaPlayer::NetworkStateDecodeError) { | 1710 || state == WebMediaPlayer::NetworkStateDecodeError) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1747 m_networkState = NETWORK_IDLE; | 1747 m_networkState = NETWORK_IDLE; |
1748 } | 1748 } |
1749 | 1749 |
1750 void HTMLMediaElement::mediaPlayerReadyStateChanged() | 1750 void HTMLMediaElement::mediaPlayerReadyStateChanged() |
1751 { | 1751 { |
1752 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); | 1752 setReadyState(static_cast<ReadyState>(webMediaPlayer()->readyState())); |
1753 } | 1753 } |
1754 | 1754 |
1755 void HTMLMediaElement::setReadyState(ReadyState state) | 1755 void HTMLMediaElement::setReadyState(ReadyState state) |
1756 { | 1756 { |
1757 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%d) - current state is %d,",
static_cast<int>(state), static_cast<int>(m_readyState)); | 1757 WTF_LOG(Media, "HTMLMediaElement::setReadyState(%p, %d) - current state is %
d,", this, static_cast<int>(state), static_cast<int>(m_readyState)); |
1758 | 1758 |
1759 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay
ing() uses it | 1759 // Set "wasPotentiallyPlaying" BEFORE updating m_readyState, potentiallyPlay
ing() uses it |
1760 bool wasPotentiallyPlaying = potentiallyPlaying(); | 1760 bool wasPotentiallyPlaying = potentiallyPlaying(); |
1761 | 1761 |
1762 ReadyState oldState = m_readyState; | 1762 ReadyState oldState = m_readyState; |
1763 ReadyState newState = state; | 1763 ReadyState newState = state; |
1764 | 1764 |
1765 bool tracksAreReady = textTracksAreReady(); | 1765 bool tracksAreReady = textTracksAreReady(); |
1766 | 1766 |
1767 if (newState == oldState && m_tracksAreReady == tracksAreReady) | 1767 if (newState == oldState && m_tracksAreReady == tracksAreReady) |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1888 renderer()->updateFromElement(); | 1888 renderer()->updateFromElement(); |
1889 } else if (timedelta > 3.0 && !m_sentStalledEvent) { | 1889 } else if (timedelta > 3.0 && !m_sentStalledEvent) { |
1890 scheduleEvent(EventTypeNames::stalled); | 1890 scheduleEvent(EventTypeNames::stalled); |
1891 m_sentStalledEvent = true; | 1891 m_sentStalledEvent = true; |
1892 setShouldDelayLoadEvent(false); | 1892 setShouldDelayLoadEvent(false); |
1893 } | 1893 } |
1894 } | 1894 } |
1895 | 1895 |
1896 void HTMLMediaElement::addPlayedRange(double start, double end) | 1896 void HTMLMediaElement::addPlayedRange(double start, double end) |
1897 { | 1897 { |
1898 WTF_LOG(Media, "HTMLMediaElement::addPlayedRange(%f, %f)", start, end); | 1898 WTF_LOG(Media, "HTMLMediaElement::addPlayedRange(%p, %f, %f)", this, start,
end); |
1899 if (!m_playedTimeRanges) | 1899 if (!m_playedTimeRanges) |
1900 m_playedTimeRanges = TimeRanges::create(); | 1900 m_playedTimeRanges = TimeRanges::create(); |
1901 m_playedTimeRanges->add(start, end); | 1901 m_playedTimeRanges->add(start, end); |
1902 } | 1902 } |
1903 | 1903 |
1904 bool HTMLMediaElement::supportsSave() const | 1904 bool HTMLMediaElement::supportsSave() const |
1905 { | 1905 { |
1906 return webMediaPlayer() && webMediaPlayer()->supportsSave(); | 1906 return webMediaPlayer() && webMediaPlayer()->supportsSave(); |
1907 } | 1907 } |
1908 | 1908 |
1909 void HTMLMediaElement::prepareToPlay() | 1909 void HTMLMediaElement::prepareToPlay() |
1910 { | 1910 { |
1911 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this); | 1911 WTF_LOG(Media, "HTMLMediaElement::prepareToPlay(%p)", this); |
1912 if (m_havePreparedToPlay) | 1912 if (m_havePreparedToPlay) |
1913 return; | 1913 return; |
1914 m_havePreparedToPlay = true; | 1914 m_havePreparedToPlay = true; |
1915 | 1915 |
1916 if (loadIsDeferred()) | 1916 if (loadIsDeferred()) |
1917 startDeferredLoad(); | 1917 startDeferredLoad(); |
1918 } | 1918 } |
1919 | 1919 |
1920 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState) | 1920 void HTMLMediaElement::seek(double time, ExceptionState& exceptionState) |
1921 { | 1921 { |
1922 WTF_LOG(Media, "HTMLMediaElement::seek(%f)", time); | 1922 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f)", this, time); |
1923 | 1923 |
1924 // 4.8.10.9 Seeking | 1924 // 4.8.10.9 Seeking |
1925 | 1925 |
1926 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva
lidStateError exception. | 1926 // 1 - If the media element's readyState is HAVE_NOTHING, then raise an Inva
lidStateError exception. |
1927 if (m_readyState == HAVE_NOTHING) { | 1927 if (m_readyState == HAVE_NOTHING) { |
1928 exceptionState.throwDOMException(InvalidStateError, "The element's ready
State is HAVE_NOTHING."); | 1928 exceptionState.throwDOMException(InvalidStateError, "The element's ready
State is HAVE_NOTHING."); |
1929 return; | 1929 return; |
1930 } | 1930 } |
1931 | 1931 |
1932 // If the media engine has been told to postpone loading data, let it go ahe
ad now. | 1932 // If the media engine has been told to postpone loading data, let it go ahe
ad now. |
(...skipping 21 matching lines...) Expand all Loading... |
1954 // 6 - If the new playback position is less than the earliest possible posit
ion, let it be that position instead. | 1954 // 6 - If the new playback position is less than the earliest possible posit
ion, let it be that position instead. |
1955 time = std::max(time, 0.0); | 1955 time = std::max(time, 0.0); |
1956 | 1956 |
1957 // Ask the media engine for the time value in the movie's time scale before
comparing with current time. This | 1957 // Ask the media engine for the time value in the movie's time scale before
comparing with current time. This |
1958 // is necessary because if the seek time is not equal to currentTime but the
delta is less than the movie's | 1958 // is necessary because if the seek time is not equal to currentTime but the
delta is less than the movie's |
1959 // time scale, we will ask the media engine to "seek" to the current movie t
ime, which may be a noop and | 1959 // time scale, we will ask the media engine to "seek" to the current movie t
ime, which may be a noop and |
1960 // not generate a timechanged callback. This means m_seeking will never be c
leared and we will never | 1960 // not generate a timechanged callback. This means m_seeking will never be c
leared and we will never |
1961 // fire a 'seeked' event. | 1961 // fire a 'seeked' event. |
1962 double mediaTime = webMediaPlayer()->mediaTimeForTimeValue(time); | 1962 double mediaTime = webMediaPlayer()->mediaTimeForTimeValue(time); |
1963 if (time != mediaTime) { | 1963 if (time != mediaTime) { |
1964 WTF_LOG(Media, "HTMLMediaElement::seek(%f) - media timeline equivalent i
s %f", time, mediaTime); | 1964 WTF_LOG(Media, "HTMLMediaElement::seek(%p, %f) - media timeline equivale
nt is %f", this, time, mediaTime); |
1965 time = mediaTime; | 1965 time = mediaTime; |
1966 } | 1966 } |
1967 | 1967 |
1968 // 7 - If the (possibly now changed) new playback position is not in one of
the ranges given in the | 1968 // 7 - If the (possibly now changed) new playback position is not in one of
the ranges given in the |
1969 // seekable attribute, then let it be the position in one of the ranges give
n in the seekable attribute | 1969 // seekable attribute, then let it be the position in one of the ranges give
n in the seekable attribute |
1970 // that is the nearest to the new playback position. ... If there are no ran
ges given in the seekable | 1970 // that is the nearest to the new playback position. ... If there are no ran
ges given in the seekable |
1971 // attribute then set the seeking IDL attribute to false and abort these ste
ps. | 1971 // attribute then set the seeking IDL attribute to false and abort these ste
ps. |
1972 RefPtrWillBeRawPtr<TimeRanges> seekableRanges = seekable(); | 1972 RefPtrWillBeRawPtr<TimeRanges> seekableRanges = seekable(); |
1973 | 1973 |
1974 // Short circuit seeking to the current time by just firing the events if no
seek is required. | 1974 // Short circuit seeking to the current time by just firing the events if no
seek is required. |
(...skipping 28 matching lines...) Expand all Loading... |
2003 | 2003 |
2004 // 9 - Set the current playback position to the given new playback position | 2004 // 9 - Set the current playback position to the given new playback position |
2005 webMediaPlayer()->seek(time); | 2005 webMediaPlayer()->seek(time); |
2006 | 2006 |
2007 // 10-14 are handled, if necessary, when the engine signals a readystate cha
nge or otherwise | 2007 // 10-14 are handled, if necessary, when the engine signals a readystate cha
nge or otherwise |
2008 // satisfies seek completion and signals a time change. | 2008 // satisfies seek completion and signals a time change. |
2009 } | 2009 } |
2010 | 2010 |
2011 void HTMLMediaElement::finishSeek() | 2011 void HTMLMediaElement::finishSeek() |
2012 { | 2012 { |
2013 WTF_LOG(Media, "HTMLMediaElement::finishSeek"); | 2013 WTF_LOG(Media, "HTMLMediaElement::finishSeek(%p)", this); |
2014 | 2014 |
2015 // 4.8.10.9 Seeking completion | 2015 // 4.8.10.9 Seeking completion |
2016 // 12 - Set the seeking IDL attribute to false. | 2016 // 12 - Set the seeking IDL attribute to false. |
2017 m_seeking = false; | 2017 m_seeking = false; |
2018 | 2018 |
2019 // 13 - Queue a task to fire a simple event named timeupdate at the element. | 2019 // 13 - Queue a task to fire a simple event named timeupdate at the element. |
2020 scheduleTimeupdateEvent(false); | 2020 scheduleTimeupdateEvent(false); |
2021 | 2021 |
2022 // 14 - Queue a task to fire a simple event named seeked at the element. | 2022 // 14 - Queue a task to fire a simple event named seeked at the element. |
2023 scheduleEvent(EventTypeNames::seeked); | 2023 scheduleEvent(EventTypeNames::seeked); |
(...skipping 19 matching lines...) Expand all Loading... |
2043 void HTMLMediaElement::refreshCachedTime() const | 2043 void HTMLMediaElement::refreshCachedTime() const |
2044 { | 2044 { |
2045 if (!webMediaPlayer() || m_readyState < HAVE_METADATA) | 2045 if (!webMediaPlayer() || m_readyState < HAVE_METADATA) |
2046 return; | 2046 return; |
2047 | 2047 |
2048 m_cachedTime = webMediaPlayer()->currentTime(); | 2048 m_cachedTime = webMediaPlayer()->currentTime(); |
2049 } | 2049 } |
2050 | 2050 |
2051 void HTMLMediaElement::invalidateCachedTime() | 2051 void HTMLMediaElement::invalidateCachedTime() |
2052 { | 2052 { |
2053 WTF_LOG(Media, "HTMLMediaElement::invalidateCachedTime"); | 2053 WTF_LOG(Media, "HTMLMediaElement::invalidateCachedTime(%p)", this); |
2054 m_cachedTime = MediaPlayer::invalidTime(); | 2054 m_cachedTime = MediaPlayer::invalidTime(); |
2055 } | 2055 } |
2056 | 2056 |
2057 // playback state | 2057 // playback state |
2058 double HTMLMediaElement::currentTime() const | 2058 double HTMLMediaElement::currentTime() const |
2059 { | 2059 { |
2060 if (m_readyState == HAVE_NOTHING) | 2060 if (m_readyState == HAVE_NOTHING) |
2061 return 0; | 2061 return 0; |
2062 | 2062 |
2063 if (m_seeking) { | 2063 if (m_seeking) { |
2064 WTF_LOG(Media, "HTMLMediaElement::currentTime - seeking, returning %f",
m_lastSeekTime); | 2064 WTF_LOG(Media, "HTMLMediaElement::currentTime(%p) - seeking, returning %
f", this, m_lastSeekTime); |
2065 return m_lastSeekTime; | 2065 return m_lastSeekTime; |
2066 } | 2066 } |
2067 | 2067 |
2068 if (m_cachedTime != MediaPlayer::invalidTime() && m_paused) { | 2068 if (m_cachedTime != MediaPlayer::invalidTime() && m_paused) { |
2069 #if LOG_CACHED_TIME_WARNINGS | 2069 #if LOG_CACHED_TIME_WARNINGS |
2070 static const double minCachedDeltaForWarning = 0.01; | 2070 static const double minCachedDeltaForWarning = 0.01; |
2071 double delta = m_cachedTime - webMediaPlayer()->currentTime(); | 2071 double delta = m_cachedTime - webMediaPlayer()->currentTime(); |
2072 if (delta > minCachedDeltaForWarning) | 2072 if (delta > minCachedDeltaForWarning) |
2073 WTF_LOG(Media, "HTMLMediaElement::currentTime - WARNING, cached time
is %f seconds off of media time when paused", delta); | 2073 WTF_LOG(Media, "HTMLMediaElement::currentTime(%p) - WARNING, cached
time is %f seconds off of media time when paused", this, delta); |
2074 #endif | 2074 #endif |
2075 return m_cachedTime; | 2075 return m_cachedTime; |
2076 } | 2076 } |
2077 | 2077 |
2078 refreshCachedTime(); | 2078 refreshCachedTime(); |
2079 | 2079 |
2080 return m_cachedTime; | 2080 return m_cachedTime; |
2081 } | 2081 } |
2082 | 2082 |
2083 void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionStat
e) | 2083 void HTMLMediaElement::setCurrentTime(double time, ExceptionState& exceptionStat
e) |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2132 scheduleEvent(EventTypeNames::ratechange); | 2132 scheduleEvent(EventTypeNames::ratechange); |
2133 } | 2133 } |
2134 | 2134 |
2135 double HTMLMediaElement::playbackRate() const | 2135 double HTMLMediaElement::playbackRate() const |
2136 { | 2136 { |
2137 return m_playbackRate; | 2137 return m_playbackRate; |
2138 } | 2138 } |
2139 | 2139 |
2140 void HTMLMediaElement::setPlaybackRate(double rate) | 2140 void HTMLMediaElement::setPlaybackRate(double rate) |
2141 { | 2141 { |
2142 WTF_LOG(Media, "HTMLMediaElement::setPlaybackRate(%f)", rate); | 2142 WTF_LOG(Media, "HTMLMediaElement::setPlaybackRate(%p, %f)", this, rate); |
2143 | 2143 |
2144 if (m_playbackRate != rate) { | 2144 if (m_playbackRate != rate) { |
2145 m_playbackRate = rate; | 2145 m_playbackRate = rate; |
2146 invalidateCachedTime(); | 2146 invalidateCachedTime(); |
2147 scheduleEvent(EventTypeNames::ratechange); | 2147 scheduleEvent(EventTypeNames::ratechange); |
2148 } | 2148 } |
2149 | 2149 |
2150 updatePlaybackRate(); | 2150 updatePlaybackRate(); |
2151 } | 2151 } |
2152 | 2152 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2193 return "auto"; | 2193 return "auto"; |
2194 break; | 2194 break; |
2195 } | 2195 } |
2196 | 2196 |
2197 ASSERT_NOT_REACHED(); | 2197 ASSERT_NOT_REACHED(); |
2198 return String(); | 2198 return String(); |
2199 } | 2199 } |
2200 | 2200 |
2201 void HTMLMediaElement::setPreload(const AtomicString& preload) | 2201 void HTMLMediaElement::setPreload(const AtomicString& preload) |
2202 { | 2202 { |
2203 WTF_LOG(Media, "HTMLMediaElement::setPreload(%s)", preload.utf8().data()); | 2203 WTF_LOG(Media, "HTMLMediaElement::setPreload(%p, %s)", this, preload.utf8().
data()); |
2204 setAttribute(preloadAttr, preload); | 2204 setAttribute(preloadAttr, preload); |
2205 } | 2205 } |
2206 | 2206 |
2207 void HTMLMediaElement::play() | 2207 void HTMLMediaElement::play() |
2208 { | 2208 { |
2209 WTF_LOG(Media, "HTMLMediaElement::play()"); | 2209 WTF_LOG(Media, "HTMLMediaElement::play(%p)", this); |
2210 | 2210 |
2211 if (m_userGestureRequiredForPlay && !UserGestureIndicator::processingUserGes
ture()) | 2211 if (m_userGestureRequiredForPlay && !UserGestureIndicator::processingUserGes
ture()) |
2212 return; | 2212 return; |
2213 if (UserGestureIndicator::processingUserGesture()) | 2213 if (UserGestureIndicator::processingUserGesture()) |
2214 m_userGestureRequiredForPlay = false; | 2214 m_userGestureRequiredForPlay = false; |
2215 | 2215 |
2216 playInternal(); | 2216 playInternal(); |
2217 } | 2217 } |
2218 | 2218 |
2219 void HTMLMediaElement::playInternal() | 2219 void HTMLMediaElement::playInternal() |
2220 { | 2220 { |
2221 WTF_LOG(Media, "HTMLMediaElement::playInternal"); | 2221 WTF_LOG(Media, "HTMLMediaElement::playInternal(%p)", this); |
2222 | 2222 |
2223 // 4.8.10.9. Playing the media resource | 2223 // 4.8.10.9. Playing the media resource |
2224 if (!m_player || m_networkState == NETWORK_EMPTY) | 2224 if (!m_player || m_networkState == NETWORK_EMPTY) |
2225 scheduleDelayedAction(LoadMediaResource); | 2225 scheduleDelayedAction(LoadMediaResource); |
2226 | 2226 |
2227 if (endedPlayback()) | 2227 if (endedPlayback()) |
2228 seek(0, IGNORE_EXCEPTION); | 2228 seek(0, IGNORE_EXCEPTION); |
2229 | 2229 |
2230 if (m_mediaController) | 2230 if (m_mediaController) |
2231 m_mediaController->bringElementUpToSpeed(this); | 2231 m_mediaController->bringElementUpToSpeed(this); |
2232 | 2232 |
2233 if (m_paused) { | 2233 if (m_paused) { |
2234 m_paused = false; | 2234 m_paused = false; |
2235 invalidateCachedTime(); | 2235 invalidateCachedTime(); |
2236 scheduleEvent(EventTypeNames::play); | 2236 scheduleEvent(EventTypeNames::play); |
2237 | 2237 |
2238 if (m_readyState <= HAVE_CURRENT_DATA) | 2238 if (m_readyState <= HAVE_CURRENT_DATA) |
2239 scheduleEvent(EventTypeNames::waiting); | 2239 scheduleEvent(EventTypeNames::waiting); |
2240 else if (m_readyState >= HAVE_FUTURE_DATA) | 2240 else if (m_readyState >= HAVE_FUTURE_DATA) |
2241 scheduleEvent(EventTypeNames::playing); | 2241 scheduleEvent(EventTypeNames::playing); |
2242 } | 2242 } |
2243 m_autoplaying = false; | 2243 m_autoplaying = false; |
2244 | 2244 |
2245 updatePlayState(); | 2245 updatePlayState(); |
2246 updateMediaController(); | 2246 updateMediaController(); |
2247 } | 2247 } |
2248 | 2248 |
2249 void HTMLMediaElement::pause() | 2249 void HTMLMediaElement::pause() |
2250 { | 2250 { |
2251 WTF_LOG(Media, "HTMLMediaElement::pause()"); | 2251 WTF_LOG(Media, "HTMLMediaElement::pause(%p)", this); |
2252 | 2252 |
2253 if (!m_player || m_networkState == NETWORK_EMPTY) | 2253 if (!m_player || m_networkState == NETWORK_EMPTY) |
2254 scheduleDelayedAction(LoadMediaResource); | 2254 scheduleDelayedAction(LoadMediaResource); |
2255 | 2255 |
2256 m_autoplaying = false; | 2256 m_autoplaying = false; |
2257 | 2257 |
2258 if (!m_paused) { | 2258 if (!m_paused) { |
2259 m_paused = true; | 2259 m_paused = true; |
2260 scheduleTimeupdateEvent(false); | 2260 scheduleTimeupdateEvent(false); |
2261 scheduleEvent(EventTypeNames::pause); | 2261 scheduleEvent(EventTypeNames::pause); |
(...skipping 11 matching lines...) Expand all Loading... |
2273 m_mediaSource = nullptr; | 2273 m_mediaSource = nullptr; |
2274 } | 2274 } |
2275 | 2275 |
2276 bool HTMLMediaElement::loop() const | 2276 bool HTMLMediaElement::loop() const |
2277 { | 2277 { |
2278 return fastHasAttribute(loopAttr); | 2278 return fastHasAttribute(loopAttr); |
2279 } | 2279 } |
2280 | 2280 |
2281 void HTMLMediaElement::setLoop(bool b) | 2281 void HTMLMediaElement::setLoop(bool b) |
2282 { | 2282 { |
2283 WTF_LOG(Media, "HTMLMediaElement::setLoop(%s)", boolString(b)); | 2283 WTF_LOG(Media, "HTMLMediaElement::setLoop(%p, %s)", this, boolString(b)); |
2284 setBooleanAttribute(loopAttr, b); | 2284 setBooleanAttribute(loopAttr, b); |
2285 } | 2285 } |
2286 | 2286 |
2287 bool HTMLMediaElement::shouldShowControls() const | 2287 bool HTMLMediaElement::shouldShowControls() const |
2288 { | 2288 { |
2289 LocalFrame* frame = document().frame(); | 2289 LocalFrame* frame = document().frame(); |
2290 | 2290 |
2291 // always show controls when scripting is disabled | 2291 // always show controls when scripting is disabled |
2292 if (frame && !frame->script().canExecuteScripts(NotAboutToExecuteScript)) | 2292 if (frame && !frame->script().canExecuteScripts(NotAboutToExecuteScript)) |
2293 return true; | 2293 return true; |
2294 | 2294 |
2295 // Always show controls when in full screen mode. | 2295 // Always show controls when in full screen mode. |
2296 if (isFullscreen()) | 2296 if (isFullscreen()) |
2297 return true; | 2297 return true; |
2298 | 2298 |
2299 return fastHasAttribute(controlsAttr); | 2299 return fastHasAttribute(controlsAttr); |
2300 } | 2300 } |
2301 | 2301 |
2302 double HTMLMediaElement::volume() const | 2302 double HTMLMediaElement::volume() const |
2303 { | 2303 { |
2304 return m_volume; | 2304 return m_volume; |
2305 } | 2305 } |
2306 | 2306 |
2307 void HTMLMediaElement::setVolume(double vol, ExceptionState& exceptionState) | 2307 void HTMLMediaElement::setVolume(double vol, ExceptionState& exceptionState) |
2308 { | 2308 { |
2309 WTF_LOG(Media, "HTMLMediaElement::setVolume(%f)", vol); | 2309 WTF_LOG(Media, "HTMLMediaElement::setVolume(%p, %f)", this, vol); |
2310 | 2310 |
2311 if (m_volume == vol) | 2311 if (m_volume == vol) |
2312 return; | 2312 return; |
2313 | 2313 |
2314 if (vol < 0.0f || vol > 1.0f) { | 2314 if (vol < 0.0f || vol > 1.0f) { |
2315 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xOutsideRange("volume", vol, 0.0, ExceptionMessages::InclusiveBound, 1.0, Except
ionMessages::InclusiveBound)); | 2315 exceptionState.throwDOMException(IndexSizeError, ExceptionMessages::inde
xOutsideRange("volume", vol, 0.0, ExceptionMessages::InclusiveBound, 1.0, Except
ionMessages::InclusiveBound)); |
2316 return; | 2316 return; |
2317 } | 2317 } |
2318 | 2318 |
2319 m_volume = vol; | 2319 m_volume = vol; |
2320 updateVolume(); | 2320 updateVolume(); |
2321 scheduleEvent(EventTypeNames::volumechange); | 2321 scheduleEvent(EventTypeNames::volumechange); |
2322 } | 2322 } |
2323 | 2323 |
2324 bool HTMLMediaElement::muted() const | 2324 bool HTMLMediaElement::muted() const |
2325 { | 2325 { |
2326 return m_muted; | 2326 return m_muted; |
2327 } | 2327 } |
2328 | 2328 |
2329 void HTMLMediaElement::setMuted(bool muted) | 2329 void HTMLMediaElement::setMuted(bool muted) |
2330 { | 2330 { |
2331 WTF_LOG(Media, "HTMLMediaElement::setMuted(%s)", boolString(muted)); | 2331 WTF_LOG(Media, "HTMLMediaElement::setMuted(%p, %s)", this, boolString(muted)
); |
2332 | 2332 |
2333 if (m_muted == muted) | 2333 if (m_muted == muted) |
2334 return; | 2334 return; |
2335 | 2335 |
2336 m_muted = muted; | 2336 m_muted = muted; |
2337 | 2337 |
2338 updateVolume(); | 2338 updateVolume(); |
2339 | 2339 |
2340 scheduleEvent(EventTypeNames::volumechange); | 2340 scheduleEvent(EventTypeNames::volumechange); |
2341 } | 2341 } |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2447 } | 2447 } |
2448 | 2448 |
2449 AudioTrackList& HTMLMediaElement::audioTracks() | 2449 AudioTrackList& HTMLMediaElement::audioTracks() |
2450 { | 2450 { |
2451 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2451 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2452 return *m_audioTracks; | 2452 return *m_audioTracks; |
2453 } | 2453 } |
2454 | 2454 |
2455 void HTMLMediaElement::audioTrackChanged() | 2455 void HTMLMediaElement::audioTrackChanged() |
2456 { | 2456 { |
2457 WTF_LOG(Media, "HTMLMediaElement::audioTrackChanged()"); | 2457 WTF_LOG(Media, "HTMLMediaElement::audioTrackChanged(%p)", this); |
2458 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2458 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2459 | 2459 |
2460 audioTracks().scheduleChangeEvent(); | 2460 audioTracks().scheduleChangeEvent(); |
2461 | 2461 |
2462 // FIXME: Add call on m_mediaSource to notify it of track changes once the S
ourceBuffer.audioTracks attribute is added. | 2462 // FIXME: Add call on m_mediaSource to notify it of track changes once the S
ourceBuffer.audioTracks attribute is added. |
2463 | 2463 |
2464 if (!m_audioTracksTimer.isActive()) | 2464 if (!m_audioTracksTimer.isActive()) |
2465 m_audioTracksTimer.startOneShot(0, FROM_HERE); | 2465 m_audioTracksTimer.startOneShot(0, FROM_HERE); |
2466 } | 2466 } |
2467 | 2467 |
2468 void HTMLMediaElement::audioTracksTimerFired(Timer<HTMLMediaElement>*) | 2468 void HTMLMediaElement::audioTracksTimerFired(Timer<HTMLMediaElement>*) |
2469 { | 2469 { |
2470 Vector<WebMediaPlayer::TrackId> enabledTrackIds; | 2470 Vector<WebMediaPlayer::TrackId> enabledTrackIds; |
2471 for (unsigned i = 0; i < audioTracks().length(); ++i) { | 2471 for (unsigned i = 0; i < audioTracks().length(); ++i) { |
2472 AudioTrack* track = audioTracks().anonymousIndexedGetter(i); | 2472 AudioTrack* track = audioTracks().anonymousIndexedGetter(i); |
2473 if (track->enabled()) | 2473 if (track->enabled()) |
2474 enabledTrackIds.append(track->trackId()); | 2474 enabledTrackIds.append(track->trackId()); |
2475 } | 2475 } |
2476 | 2476 |
2477 webMediaPlayer()->enabledAudioTracksChanged(enabledTrackIds); | 2477 webMediaPlayer()->enabledAudioTracksChanged(enabledTrackIds); |
2478 } | 2478 } |
2479 | 2479 |
2480 WebMediaPlayer::TrackId HTMLMediaElement::addAudioTrack(const String& id, blink:
:WebMediaPlayerClient::AudioTrackKind kind, const AtomicString& label, const Ato
micString& language, bool enabled) | 2480 WebMediaPlayer::TrackId HTMLMediaElement::addAudioTrack(const String& id, blink:
:WebMediaPlayerClient::AudioTrackKind kind, const AtomicString& label, const Ato
micString& language, bool enabled) |
2481 { | 2481 { |
2482 AtomicString kindString = AudioKindToString(kind); | 2482 AtomicString kindString = AudioKindToString(kind); |
2483 WTF_LOG(Media, "HTMLMediaElement::addAudioTrack('%s', '%s', '%s', '%s', %d)"
, | 2483 WTF_LOG(Media, "HTMLMediaElement::addAudioTrack(%p, '%s', '%s', '%s', '%s',
%d)", |
2484 id.ascii().data(), kindString.ascii().data(), label.ascii().data(), lang
uage.ascii().data(), enabled); | 2484 this, id.ascii().data(), kindString.ascii().data(), label.ascii().data()
, language.ascii().data(), enabled); |
2485 | 2485 |
2486 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2486 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2487 return 0; | 2487 return 0; |
2488 | 2488 |
2489 RefPtrWillBeRawPtr<AudioTrack> audioTrack = AudioTrack::create(id, kindStrin
g, label, language, enabled); | 2489 RefPtrWillBeRawPtr<AudioTrack> audioTrack = AudioTrack::create(id, kindStrin
g, label, language, enabled); |
2490 audioTracks().add(audioTrack); | 2490 audioTracks().add(audioTrack); |
2491 | 2491 |
2492 return audioTrack->trackId(); | 2492 return audioTrack->trackId(); |
2493 } | 2493 } |
2494 | 2494 |
2495 void HTMLMediaElement::removeAudioTrack(WebMediaPlayer::TrackId trackId) | 2495 void HTMLMediaElement::removeAudioTrack(WebMediaPlayer::TrackId trackId) |
2496 { | 2496 { |
2497 WTF_LOG(Media, "HTMLMediaElement::removeAudioTrack()"); | 2497 WTF_LOG(Media, "HTMLMediaElement::removeAudioTrack(%p)", this); |
2498 | 2498 |
2499 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2499 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2500 return; | 2500 return; |
2501 | 2501 |
2502 audioTracks().remove(trackId); | 2502 audioTracks().remove(trackId); |
2503 } | 2503 } |
2504 | 2504 |
2505 VideoTrackList& HTMLMediaElement::videoTracks() | 2505 VideoTrackList& HTMLMediaElement::videoTracks() |
2506 { | 2506 { |
2507 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2507 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2508 return *m_videoTracks; | 2508 return *m_videoTracks; |
2509 } | 2509 } |
2510 | 2510 |
2511 void HTMLMediaElement::selectedVideoTrackChanged(WebMediaPlayer::TrackId* select
edTrackId) | 2511 void HTMLMediaElement::selectedVideoTrackChanged(WebMediaPlayer::TrackId* select
edTrackId) |
2512 { | 2512 { |
2513 WTF_LOG(Media, "HTMLMediaElement::selectedVideoTrackChanged()"); | 2513 WTF_LOG(Media, "HTMLMediaElement::selectedVideoTrackChanged(%p)", this); |
2514 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); | 2514 ASSERT(RuntimeEnabledFeatures::audioVideoTracksEnabled()); |
2515 | 2515 |
2516 if (selectedTrackId) | 2516 if (selectedTrackId) |
2517 videoTracks().trackSelected(*selectedTrackId); | 2517 videoTracks().trackSelected(*selectedTrackId); |
2518 | 2518 |
2519 // FIXME: Add call on m_mediaSource to notify it of track changes once the S
ourceBuffer.videoTracks attribute is added. | 2519 // FIXME: Add call on m_mediaSource to notify it of track changes once the S
ourceBuffer.videoTracks attribute is added. |
2520 | 2520 |
2521 webMediaPlayer()->selectedVideoTrackChanged(selectedTrackId); | 2521 webMediaPlayer()->selectedVideoTrackChanged(selectedTrackId); |
2522 } | 2522 } |
2523 | 2523 |
2524 WebMediaPlayer::TrackId HTMLMediaElement::addVideoTrack(const String& id, blink:
:WebMediaPlayerClient::VideoTrackKind kind, const AtomicString& label, const Ato
micString& language, bool selected) | 2524 WebMediaPlayer::TrackId HTMLMediaElement::addVideoTrack(const String& id, blink:
:WebMediaPlayerClient::VideoTrackKind kind, const AtomicString& label, const Ato
micString& language, bool selected) |
2525 { | 2525 { |
2526 AtomicString kindString = VideoKindToString(kind); | 2526 AtomicString kindString = VideoKindToString(kind); |
2527 WTF_LOG(Media, "HTMLMediaElement::addVideoTrack('%s', '%s', '%s', '%s', %d)"
, | 2527 WTF_LOG(Media, "HTMLMediaElement::addVideoTrack(%p, '%s', '%s', '%s', '%s',
%d)", |
2528 id.ascii().data(), kindString.ascii().data(), label.ascii().data(), lang
uage.ascii().data(), selected); | 2528 this, id.ascii().data(), kindString.ascii().data(), label.ascii().data()
, language.ascii().data(), selected); |
2529 | 2529 |
2530 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2530 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2531 return 0; | 2531 return 0; |
2532 | 2532 |
2533 // If another track was selected (potentially by the user), leave it selecte
d. | 2533 // If another track was selected (potentially by the user), leave it selecte
d. |
2534 if (selected && videoTracks().selectedIndex() != -1) | 2534 if (selected && videoTracks().selectedIndex() != -1) |
2535 selected = false; | 2535 selected = false; |
2536 | 2536 |
2537 RefPtrWillBeRawPtr<VideoTrack> videoTrack = VideoTrack::create(id, kindStrin
g, label, language, selected); | 2537 RefPtrWillBeRawPtr<VideoTrack> videoTrack = VideoTrack::create(id, kindStrin
g, label, language, selected); |
2538 videoTracks().add(videoTrack); | 2538 videoTracks().add(videoTrack); |
2539 | 2539 |
2540 return videoTrack->trackId(); | 2540 return videoTrack->trackId(); |
2541 } | 2541 } |
2542 | 2542 |
2543 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) | 2543 void HTMLMediaElement::removeVideoTrack(WebMediaPlayer::TrackId trackId) |
2544 { | 2544 { |
2545 WTF_LOG(Media, "HTMLMediaElement::removeVideoTrack()"); | 2545 WTF_LOG(Media, "HTMLMediaElement::removeVideoTrack(%p)", this); |
2546 | 2546 |
2547 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) | 2547 if (!RuntimeEnabledFeatures::audioVideoTracksEnabled()) |
2548 return; | 2548 return; |
2549 | 2549 |
2550 videoTracks().remove(trackId); | 2550 videoTracks().remove(trackId); |
2551 } | 2551 } |
2552 | 2552 |
2553 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) | 2553 void HTMLMediaElement::mediaPlayerDidAddTextTrack(WebInbandTextTrack* webTrack) |
2554 { | 2554 { |
2555 // 4.8.10.12.2 Sourcing in-band text tracks | 2555 // 4.8.10.12.2 Sourcing in-band text tracks |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2691 // Do not schedule the track loading until parsing finishes so we don't star
t before all tracks | 2691 // Do not schedule the track loading until parsing finishes so we don't star
t before all tracks |
2692 // in the markup have been added. | 2692 // in the markup have been added. |
2693 if (isFinishedParsingChildren()) | 2693 if (isFinishedParsingChildren()) |
2694 scheduleDelayedAction(LoadTextTrackResource); | 2694 scheduleDelayedAction(LoadTextTrackResource); |
2695 } | 2695 } |
2696 | 2696 |
2697 void HTMLMediaElement::didRemoveTrackElement(HTMLTrackElement* trackElement) | 2697 void HTMLMediaElement::didRemoveTrackElement(HTMLTrackElement* trackElement) |
2698 { | 2698 { |
2699 #if !LOG_DISABLED | 2699 #if !LOG_DISABLED |
2700 KURL url = trackElement->getNonEmptyURLAttribute(srcAttr); | 2700 KURL url = trackElement->getNonEmptyURLAttribute(srcAttr); |
2701 WTF_LOG(Media, "HTMLMediaElement::didRemoveTrackElement - 'src' is %s", urlF
orLoggingMedia(url).utf8().data()); | 2701 WTF_LOG(Media, "HTMLMediaElement::didRemoveTrackElement(%p) - 'src' is %s",
this, urlForLoggingMedia(url).utf8().data()); |
2702 #endif | 2702 #endif |
2703 | 2703 |
2704 RefPtrWillBeRawPtr<TextTrack> textTrack = trackElement->track(); | 2704 RefPtrWillBeRawPtr<TextTrack> textTrack = trackElement->track(); |
2705 if (!textTrack) | 2705 if (!textTrack) |
2706 return; | 2706 return; |
2707 | 2707 |
2708 textTrack->setHasBeenConfigured(false); | 2708 textTrack->setHasBeenConfigured(false); |
2709 | 2709 |
2710 if (!m_textTracks) | 2710 if (!m_textTracks) |
2711 return; | 2711 return; |
(...skipping 27 matching lines...) Expand all Loading... |
2739 if (track.kind() != TextTrack::captionsKeyword() && track.kind() != TextTrac
k::subtitlesKeyword()) | 2739 if (track.kind() != TextTrack::captionsKeyword() && track.kind() != TextTrac
k::subtitlesKeyword()) |
2740 return 0; | 2740 return 0; |
2741 | 2741 |
2742 return textTrackLanguageSelectionScore(track); | 2742 return textTrackLanguageSelectionScore(track); |
2743 } | 2743 } |
2744 | 2744 |
2745 void HTMLMediaElement::configureTextTrackGroup(const TrackGroup& group) | 2745 void HTMLMediaElement::configureTextTrackGroup(const TrackGroup& group) |
2746 { | 2746 { |
2747 ASSERT(group.tracks.size()); | 2747 ASSERT(group.tracks.size()); |
2748 | 2748 |
2749 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackGroup(%d)", group.kind); | 2749 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackGroup(%p, %d)", this, gr
oup.kind); |
2750 | 2750 |
2751 // First, find the track in the group that should be enabled (if any). | 2751 // First, find the track in the group that should be enabled (if any). |
2752 WillBeHeapVector<RefPtrWillBeMember<TextTrack> > currentlyEnabledTracks; | 2752 WillBeHeapVector<RefPtrWillBeMember<TextTrack> > currentlyEnabledTracks; |
2753 RefPtrWillBeRawPtr<TextTrack> trackToEnable = nullptr; | 2753 RefPtrWillBeRawPtr<TextTrack> trackToEnable = nullptr; |
2754 RefPtrWillBeRawPtr<TextTrack> defaultTrack = nullptr; | 2754 RefPtrWillBeRawPtr<TextTrack> defaultTrack = nullptr; |
2755 RefPtrWillBeRawPtr<TextTrack> fallbackTrack = nullptr; | 2755 RefPtrWillBeRawPtr<TextTrack> fallbackTrack = nullptr; |
2756 int highestTrackScore = 0; | 2756 int highestTrackScore = 0; |
2757 for (size_t i = 0; i < group.tracks.size(); ++i) { | 2757 for (size_t i = 0; i < group.tracks.size(); ++i) { |
2758 RefPtrWillBeRawPtr<TextTrack> textTrack = group.tracks[i]; | 2758 RefPtrWillBeRawPtr<TextTrack> textTrack = group.tracks[i]; |
2759 | 2759 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2887 | 2887 |
2888 return nextURL.isValid(); | 2888 return nextURL.isValid(); |
2889 } | 2889 } |
2890 | 2890 |
2891 KURL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, String* k
eySystem, InvalidURLAction actionIfInvalid) | 2891 KURL HTMLMediaElement::selectNextSourceChild(ContentType* contentType, String* k
eySystem, InvalidURLAction actionIfInvalid) |
2892 { | 2892 { |
2893 #if !LOG_DISABLED | 2893 #if !LOG_DISABLED |
2894 // Don't log if this was just called to find out if there are any valid <sou
rce> elements. | 2894 // Don't log if this was just called to find out if there are any valid <sou
rce> elements. |
2895 bool shouldLog = actionIfInvalid != DoNothing; | 2895 bool shouldLog = actionIfInvalid != DoNothing; |
2896 if (shouldLog) | 2896 if (shouldLog) |
2897 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild"); | 2897 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p)", this); |
2898 #endif | 2898 #endif |
2899 | 2899 |
2900 if (!m_nextChildNodeToConsider) { | 2900 if (!m_nextChildNodeToConsider) { |
2901 #if !LOG_DISABLED | 2901 #if !LOG_DISABLED |
2902 if (shouldLog) | 2902 if (shouldLog) |
2903 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild -> 0x0000, \
"\""); | 2903 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) -> 0x000
0, \"\"", this); |
2904 #endif | 2904 #endif |
2905 return KURL(); | 2905 return KURL(); |
2906 } | 2906 } |
2907 | 2907 |
2908 KURL mediaURL; | 2908 KURL mediaURL; |
2909 Node* node; | 2909 Node* node; |
2910 HTMLSourceElement* source = 0; | 2910 HTMLSourceElement* source = 0; |
2911 String type; | 2911 String type; |
2912 String system; | 2912 String system; |
2913 bool lookingForStartNode = m_nextChildNodeToConsider; | 2913 bool lookingForStartNode = m_nextChildNodeToConsider; |
(...skipping 12 matching lines...) Expand all Loading... |
2926 continue; | 2926 continue; |
2927 if (node->parentNode() != this) | 2927 if (node->parentNode() != this) |
2928 continue; | 2928 continue; |
2929 | 2929 |
2930 source = toHTMLSourceElement(node); | 2930 source = toHTMLSourceElement(node); |
2931 | 2931 |
2932 // If candidate does not have a src attribute, or if its src attribute's
value is the empty string ... jump down to the failed step below | 2932 // If candidate does not have a src attribute, or if its src attribute's
value is the empty string ... jump down to the failed step below |
2933 mediaURL = source->getNonEmptyURLAttribute(srcAttr); | 2933 mediaURL = source->getNonEmptyURLAttribute(srcAttr); |
2934 #if !LOG_DISABLED | 2934 #if !LOG_DISABLED |
2935 if (shouldLog) | 2935 if (shouldLog) |
2936 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild - 'src' is %
s", urlForLoggingMedia(mediaURL).utf8().data()); | 2936 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 'src'
is %s", this, urlForLoggingMedia(mediaURL).utf8().data()); |
2937 #endif | 2937 #endif |
2938 if (mediaURL.isEmpty()) | 2938 if (mediaURL.isEmpty()) |
2939 goto check_again; | 2939 goto check_again; |
2940 | 2940 |
2941 type = source->type(); | 2941 type = source->type(); |
2942 // FIXME(82965): Add support for keySystem in <source> and set system fr
om source. | 2942 // FIXME(82965): Add support for keySystem in <source> and set system fr
om source. |
2943 if (type.isEmpty() && mediaURL.protocolIsData()) | 2943 if (type.isEmpty() && mediaURL.protocolIsData()) |
2944 type = mimeTypeFromDataURL(mediaURL); | 2944 type = mimeTypeFromDataURL(mediaURL); |
2945 if (!type.isEmpty() || !system.isEmpty()) { | 2945 if (!type.isEmpty() || !system.isEmpty()) { |
2946 #if !LOG_DISABLED | 2946 #if !LOG_DISABLED |
2947 if (shouldLog) | 2947 if (shouldLog) |
2948 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild - 'type'
is '%s' - key system is '%s'", type.utf8().data(), system.utf8().data()); | 2948 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) - 't
ype' is '%s' - key system is '%s'", this, type.utf8().data(), system.utf8().data
()); |
2949 #endif | 2949 #endif |
2950 if (!supportsType(ContentType(type), system)) | 2950 if (!supportsType(ContentType(type), system)) |
2951 goto check_again; | 2951 goto check_again; |
2952 } | 2952 } |
2953 | 2953 |
2954 // Is it safe to load this url? | 2954 // Is it safe to load this url? |
2955 if (!isSafeToLoadURL(mediaURL, actionIfInvalid)) | 2955 if (!isSafeToLoadURL(mediaURL, actionIfInvalid)) |
2956 goto check_again; | 2956 goto check_again; |
2957 | 2957 |
2958 // Making it this far means the <source> looks reasonable. | 2958 // Making it this far means the <source> looks reasonable. |
(...skipping 11 matching lines...) Expand all Loading... |
2970 *keySystem = system; | 2970 *keySystem = system; |
2971 m_currentSourceNode = source; | 2971 m_currentSourceNode = source; |
2972 m_nextChildNodeToConsider = source->nextSibling(); | 2972 m_nextChildNodeToConsider = source->nextSibling(); |
2973 } else { | 2973 } else { |
2974 m_currentSourceNode = nullptr; | 2974 m_currentSourceNode = nullptr; |
2975 m_nextChildNodeToConsider = nullptr; | 2975 m_nextChildNodeToConsider = nullptr; |
2976 } | 2976 } |
2977 | 2977 |
2978 #if !LOG_DISABLED | 2978 #if !LOG_DISABLED |
2979 if (shouldLog) | 2979 if (shouldLog) |
2980 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild -> %p, %s", m_cu
rrentSourceNode.get(), canUseSourceElement ? urlForLoggingMedia(mediaURL).utf8()
.data() : ""); | 2980 WTF_LOG(Media, "HTMLMediaElement::selectNextSourceChild(%p) -> %p, %s",
this, m_currentSourceNode.get(), canUseSourceElement ? urlForLoggingMedia(mediaU
RL).utf8().data() : ""); |
2981 #endif | 2981 #endif |
2982 return canUseSourceElement ? mediaURL : KURL(); | 2982 return canUseSourceElement ? mediaURL : KURL(); |
2983 } | 2983 } |
2984 | 2984 |
2985 void HTMLMediaElement::sourceWasAdded(HTMLSourceElement* source) | 2985 void HTMLMediaElement::sourceWasAdded(HTMLSourceElement* source) |
2986 { | 2986 { |
2987 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p)", source); | 2987 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p, %p)", this, source); |
2988 | 2988 |
2989 #if !LOG_DISABLED | 2989 #if !LOG_DISABLED |
2990 KURL url = source->getNonEmptyURLAttribute(srcAttr); | 2990 KURL url = source->getNonEmptyURLAttribute(srcAttr); |
2991 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded - 'src' is %s", urlForLoggi
ngMedia(url).utf8().data()); | 2991 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p) - 'src' is %s", this, u
rlForLoggingMedia(url).utf8().data()); |
2992 #endif | 2992 #endif |
2993 | 2993 |
2994 // We should only consider a <source> element when there is not src attribut
e at all. | 2994 // We should only consider a <source> element when there is not src attribut
e at all. |
2995 if (fastHasAttribute(srcAttr)) | 2995 if (fastHasAttribute(srcAttr)) |
2996 return; | 2996 return; |
2997 | 2997 |
2998 // 4.8.8 - If a source element is inserted as a child of a media element tha
t has no src | 2998 // 4.8.8 - If a source element is inserted as a child of a media element tha
t has no src |
2999 // attribute and whose networkState has the value NETWORK_EMPTY, the user ag
ent must invoke | 2999 // attribute and whose networkState has the value NETWORK_EMPTY, the user ag
ent must invoke |
3000 // the media element's resource selection algorithm. | 3000 // the media element's resource selection algorithm. |
3001 if (networkState() == HTMLMediaElement::NETWORK_EMPTY) { | 3001 if (networkState() == HTMLMediaElement::NETWORK_EMPTY) { |
3002 scheduleDelayedAction(LoadMediaResource); | 3002 scheduleDelayedAction(LoadMediaResource); |
3003 m_nextChildNodeToConsider = source; | 3003 m_nextChildNodeToConsider = source; |
3004 return; | 3004 return; |
3005 } | 3005 } |
3006 | 3006 |
3007 if (m_currentSourceNode && source == m_currentSourceNode->nextSibling()) { | 3007 if (m_currentSourceNode && source == m_currentSourceNode->nextSibling()) { |
3008 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded - <source> inserted imm
ediately after current source"); | 3008 WTF_LOG(Media, "HTMLMediaElement::sourceWasAdded(%p) - <source> inserted
immediately after current source", this); |
3009 m_nextChildNodeToConsider = source; | 3009 m_nextChildNodeToConsider = source; |
3010 return; | 3010 return; |
3011 } | 3011 } |
3012 | 3012 |
3013 if (m_nextChildNodeToConsider) | 3013 if (m_nextChildNodeToConsider) |
3014 return; | 3014 return; |
3015 | 3015 |
3016 if (m_loadState != WaitingForSource) | 3016 if (m_loadState != WaitingForSource) |
3017 return; | 3017 return; |
3018 | 3018 |
3019 // 4.8.9.5, resource selection algorithm, source elements section: | 3019 // 4.8.9.5, resource selection algorithm, source elements section: |
3020 // 21. Wait until the node after pointer is a node other than the end of the
list. (This step might wait forever.) | 3020 // 21. Wait until the node after pointer is a node other than the end of the
list. (This step might wait forever.) |
3021 // 22. Asynchronously await a stable state... | 3021 // 22. Asynchronously await a stable state... |
3022 // 23. Set the element's delaying-the-load-event flag back to true (this del
ays the load event again, in case | 3022 // 23. Set the element's delaying-the-load-event flag back to true (this del
ays the load event again, in case |
3023 // it hasn't been fired yet). | 3023 // it hasn't been fired yet). |
3024 setShouldDelayLoadEvent(true); | 3024 setShouldDelayLoadEvent(true); |
3025 | 3025 |
3026 // 24. Set the networkState back to NETWORK_LOADING. | 3026 // 24. Set the networkState back to NETWORK_LOADING. |
3027 m_networkState = NETWORK_LOADING; | 3027 m_networkState = NETWORK_LOADING; |
3028 | 3028 |
3029 // 25. Jump back to the find next candidate step above. | 3029 // 25. Jump back to the find next candidate step above. |
3030 m_nextChildNodeToConsider = source; | 3030 m_nextChildNodeToConsider = source; |
3031 scheduleNextSourceChild(); | 3031 scheduleNextSourceChild(); |
3032 } | 3032 } |
3033 | 3033 |
3034 void HTMLMediaElement::sourceWasRemoved(HTMLSourceElement* source) | 3034 void HTMLMediaElement::sourceWasRemoved(HTMLSourceElement* source) |
3035 { | 3035 { |
3036 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p)", source); | 3036 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p, %p)", this, source); |
3037 | 3037 |
3038 #if !LOG_DISABLED | 3038 #if !LOG_DISABLED |
3039 KURL url = source->getNonEmptyURLAttribute(srcAttr); | 3039 KURL url = source->getNonEmptyURLAttribute(srcAttr); |
3040 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved - 'src' is %s", urlForLog
gingMedia(url).utf8().data()); | 3040 WTF_LOG(Media, "HTMLMediaElement::sourceWasRemoved(%p) - 'src' is %s", this,
urlForLoggingMedia(url).utf8().data()); |
3041 #endif | 3041 #endif |
3042 | 3042 |
3043 if (source != m_currentSourceNode && source != m_nextChildNodeToConsider) | 3043 if (source != m_currentSourceNode && source != m_nextChildNodeToConsider) |
3044 return; | 3044 return; |
3045 | 3045 |
3046 if (source == m_nextChildNodeToConsider) { | 3046 if (source == m_nextChildNodeToConsider) { |
3047 if (m_currentSourceNode) | 3047 if (m_currentSourceNode) |
3048 m_nextChildNodeToConsider = m_currentSourceNode->nextSibling(); | 3048 m_nextChildNodeToConsider = m_currentSourceNode->nextSibling(); |
3049 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved - m_nextChildNodeToConsi
der set to %p", m_nextChildNodeToConsider.get()); | 3049 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_nextChildNodeToC
onsider set to %p", this, m_nextChildNodeToConsider.get()); |
3050 } else if (source == m_currentSourceNode) { | 3050 } else if (source == m_currentSourceNode) { |
3051 // Clear the current source node pointer, but don't change the movie as
the spec says: | 3051 // Clear the current source node pointer, but don't change the movie as
the spec says: |
3052 // 4.8.8 - Dynamically modifying a source element and its attribute when
the element is already | 3052 // 4.8.8 - Dynamically modifying a source element and its attribute when
the element is already |
3053 // inserted in a video or audio element will have no effect. | 3053 // inserted in a video or audio element will have no effect. |
3054 m_currentSourceNode = nullptr; | 3054 m_currentSourceNode = nullptr; |
3055 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved - m_currentSourceNode se
t to 0"); | 3055 WTF_LOG(Media, "HTMLMediaElement::sourceRemoved(%p) - m_currentSourceNod
e set to 0", this); |
3056 } | 3056 } |
3057 } | 3057 } |
3058 | 3058 |
3059 void HTMLMediaElement::mediaPlayerTimeChanged() | 3059 void HTMLMediaElement::mediaPlayerTimeChanged() |
3060 { | 3060 { |
3061 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerTimeChanged"); | 3061 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerTimeChanged(%p)", this); |
3062 | 3062 |
3063 updateActiveTextTrackCues(currentTime()); | 3063 updateActiveTextTrackCues(currentTime()); |
3064 | 3064 |
3065 invalidateCachedTime(); | 3065 invalidateCachedTime(); |
3066 | 3066 |
3067 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t
he seek. | 3067 // 4.8.10.9 steps 12-14. Needed if no ReadyState change is associated with t
he seek. |
3068 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !webMediaPlayer()->see
king()) | 3068 if (m_seeking && m_readyState >= HAVE_CURRENT_DATA && !webMediaPlayer()->see
king()) |
3069 finishSeek(); | 3069 finishSeek(); |
3070 | 3070 |
3071 // Always call scheduleTimeupdateEvent when the media engine reports a time
discontinuity, | 3071 // Always call scheduleTimeupdateEvent when the media engine reports a time
discontinuity, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3104 } | 3104 } |
3105 } | 3105 } |
3106 else | 3106 else |
3107 m_sentEndEvent = false; | 3107 m_sentEndEvent = false; |
3108 | 3108 |
3109 updatePlayState(); | 3109 updatePlayState(); |
3110 } | 3110 } |
3111 | 3111 |
3112 void HTMLMediaElement::mediaPlayerDurationChanged() | 3112 void HTMLMediaElement::mediaPlayerDurationChanged() |
3113 { | 3113 { |
3114 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerDurationChanged"); | 3114 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerDurationChanged(%p)", this); |
3115 // FIXME: Change MediaPlayerClient & WebMediaPlayer to convey | 3115 // FIXME: Change MediaPlayerClient & WebMediaPlayer to convey |
3116 // the currentTime when the duration change occured. The current | 3116 // the currentTime when the duration change occured. The current |
3117 // WebMediaPlayer implementations always clamp currentTime() to | 3117 // WebMediaPlayer implementations always clamp currentTime() to |
3118 // duration() so the requestSeek condition here is always false. | 3118 // duration() so the requestSeek condition here is always false. |
3119 durationChanged(duration(), currentTime() > duration()); | 3119 durationChanged(duration(), currentTime() > duration()); |
3120 } | 3120 } |
3121 | 3121 |
3122 void HTMLMediaElement::durationChanged(double duration, bool requestSeek) | 3122 void HTMLMediaElement::durationChanged(double duration, bool requestSeek) |
3123 { | 3123 { |
3124 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%f, %d)", duration, reques
tSeek); | 3124 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p, %f, %d)", this, durati
on, requestSeek); |
3125 | 3125 |
3126 // Abort if duration unchanged. | 3126 // Abort if duration unchanged. |
3127 if (m_duration == duration) | 3127 if (m_duration == duration) |
3128 return; | 3128 return; |
3129 | 3129 |
3130 WTF_LOG(Media, "HTMLMediaElement::durationChanged : %f -> %f", m_duration, d
uration); | 3130 WTF_LOG(Media, "HTMLMediaElement::durationChanged(%p) : %f -> %f", this, m_d
uration, duration); |
3131 m_duration = duration; | 3131 m_duration = duration; |
3132 scheduleEvent(EventTypeNames::durationchange); | 3132 scheduleEvent(EventTypeNames::durationchange); |
3133 | 3133 |
3134 if (hasMediaControls()) | 3134 if (hasMediaControls()) |
3135 mediaControls()->reset(); | 3135 mediaControls()->reset(); |
3136 if (renderer()) | 3136 if (renderer()) |
3137 renderer()->updateFromElement(); | 3137 renderer()->updateFromElement(); |
3138 | 3138 |
3139 if (requestSeek) | 3139 if (requestSeek) |
3140 seek(duration, IGNORE_EXCEPTION); | 3140 seek(duration, IGNORE_EXCEPTION); |
3141 } | 3141 } |
3142 | 3142 |
3143 void HTMLMediaElement::mediaPlayerPlaybackStateChanged() | 3143 void HTMLMediaElement::mediaPlayerPlaybackStateChanged() |
3144 { | 3144 { |
3145 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerPlaybackStateChanged"); | 3145 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerPlaybackStateChanged(%p)", this
); |
3146 | 3146 |
3147 if (!m_player || m_pausedInternal) | 3147 if (!m_player || m_pausedInternal) |
3148 return; | 3148 return; |
3149 | 3149 |
3150 if (webMediaPlayer()->paused()) | 3150 if (webMediaPlayer()->paused()) |
3151 pause(); | 3151 pause(); |
3152 else | 3152 else |
3153 playInternal(); | 3153 playInternal(); |
3154 } | 3154 } |
3155 | 3155 |
3156 void HTMLMediaElement::mediaPlayerRequestFullscreen() | 3156 void HTMLMediaElement::mediaPlayerRequestFullscreen() |
3157 { | 3157 { |
3158 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerRequestFullscreen"); | 3158 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerRequestFullscreen(%p)", this); |
3159 | 3159 |
3160 // The player is responsible for only invoking this callback in response to | 3160 // The player is responsible for only invoking this callback in response to |
3161 // user interaction or when it is technically required to play the video. | 3161 // user interaction or when it is technically required to play the video. |
3162 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); | 3162 UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); |
3163 | 3163 |
3164 enterFullscreen(); | 3164 enterFullscreen(); |
3165 } | 3165 } |
3166 | 3166 |
3167 void HTMLMediaElement::mediaPlayerRequestSeek(double time) | 3167 void HTMLMediaElement::mediaPlayerRequestSeek(double time) |
3168 { | 3168 { |
(...skipping 11 matching lines...) Expand all Loading... |
3180 if (m_webLayer) | 3180 if (m_webLayer) |
3181 m_webLayer->invalidate(); | 3181 m_webLayer->invalidate(); |
3182 | 3182 |
3183 updateDisplayState(); | 3183 updateDisplayState(); |
3184 if (renderer()) | 3184 if (renderer()) |
3185 renderer()->setShouldDoFullPaintInvalidation(true); | 3185 renderer()->setShouldDoFullPaintInvalidation(true); |
3186 } | 3186 } |
3187 | 3187 |
3188 void HTMLMediaElement::mediaPlayerSizeChanged() | 3188 void HTMLMediaElement::mediaPlayerSizeChanged() |
3189 { | 3189 { |
3190 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerSizeChanged"); | 3190 WTF_LOG(Media, "HTMLMediaElement::mediaPlayerSizeChanged(%p)", this); |
3191 | 3191 |
3192 ASSERT(hasVideo()); // "resize" makes no sense absent video. | 3192 ASSERT(hasVideo()); // "resize" makes no sense absent video. |
3193 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) | 3193 if (m_readyState > HAVE_NOTHING && isHTMLVideoElement()) |
3194 scheduleEvent(EventTypeNames::resize); | 3194 scheduleEvent(EventTypeNames::resize); |
3195 | 3195 |
3196 if (renderer()) | 3196 if (renderer()) |
3197 renderer()->updateFromElement(); | 3197 renderer()->updateFromElement(); |
3198 } | 3198 } |
3199 | 3199 |
3200 PassRefPtrWillBeRawPtr<TimeRanges> HTMLMediaElement::buffered() const | 3200 PassRefPtrWillBeRawPtr<TimeRanges> HTMLMediaElement::buffered() const |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3294 webMediaPlayer()->pause(); | 3294 webMediaPlayer()->pause(); |
3295 refreshCachedTime(); | 3295 refreshCachedTime(); |
3296 m_playbackProgressTimer.stop(); | 3296 m_playbackProgressTimer.stop(); |
3297 if (hasMediaControls()) | 3297 if (hasMediaControls()) |
3298 mediaControls()->playbackStopped(); | 3298 mediaControls()->playbackStopped(); |
3299 return; | 3299 return; |
3300 } | 3300 } |
3301 | 3301 |
3302 bool shouldBePlaying = potentiallyPlaying(); | 3302 bool shouldBePlaying = potentiallyPlaying(); |
3303 | 3303 |
3304 WTF_LOG(Media, "HTMLMediaElement::updatePlayState - shouldBePlaying = %s, is
Playing = %s", | 3304 WTF_LOG(Media, "HTMLMediaElement::updatePlayState(%p) - shouldBePlaying = %s
, isPlaying = %s", |
3305 boolString(shouldBePlaying), boolString(isPlaying)); | 3305 this, boolString(shouldBePlaying), boolString(isPlaying)); |
3306 | 3306 |
3307 if (shouldBePlaying) { | 3307 if (shouldBePlaying) { |
3308 setDisplayMode(Video); | 3308 setDisplayMode(Video); |
3309 invalidateCachedTime(); | 3309 invalidateCachedTime(); |
3310 | 3310 |
3311 if (!isPlaying) { | 3311 if (!isPlaying) { |
3312 // Set rate, muted before calling play in case they were set before
the media engine was setup. | 3312 // Set rate, muted before calling play in case they were set before
the media engine was setup. |
3313 // The media engine should just stash the rate and muted values sinc
e it isn't already playing. | 3313 // The media engine should just stash the rate and muted values sinc
e it isn't already playing. |
3314 webMediaPlayer()->setRate(effectivePlaybackRate()); | 3314 webMediaPlayer()->setRate(effectivePlaybackRate()); |
3315 updateVolume(); | 3315 updateVolume(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3352 } | 3352 } |
3353 | 3353 |
3354 void HTMLMediaElement::stopPeriodicTimers() | 3354 void HTMLMediaElement::stopPeriodicTimers() |
3355 { | 3355 { |
3356 m_progressEventTimer.stop(); | 3356 m_progressEventTimer.stop(); |
3357 m_playbackProgressTimer.stop(); | 3357 m_playbackProgressTimer.stop(); |
3358 } | 3358 } |
3359 | 3359 |
3360 void HTMLMediaElement::userCancelledLoad() | 3360 void HTMLMediaElement::userCancelledLoad() |
3361 { | 3361 { |
3362 WTF_LOG(Media, "HTMLMediaElement::userCancelledLoad"); | 3362 WTF_LOG(Media, "HTMLMediaElement::userCancelledLoad(%p)", this); |
3363 | 3363 |
3364 // If the media data fetching process is aborted by the user: | 3364 // If the media data fetching process is aborted by the user: |
3365 | 3365 |
3366 // 1 - The user agent should cancel the fetching process. | 3366 // 1 - The user agent should cancel the fetching process. |
3367 clearMediaPlayer(-1); | 3367 clearMediaPlayer(-1); |
3368 | 3368 |
3369 if (m_networkState == NETWORK_EMPTY || m_completelyLoaded) | 3369 if (m_networkState == NETWORK_EMPTY || m_completelyLoaded) |
3370 return; | 3370 return; |
3371 | 3371 |
3372 // 2 - Set the error attribute to a new MediaError object whose code attribu
te is set to MEDIA_ERR_ABORTED. | 3372 // 2 - Set the error attribute to a new MediaError object whose code attribu
te is set to MEDIA_ERR_ABORTED. |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3428 | 3428 |
3429 m_pendingActionFlags &= ~flags; | 3429 m_pendingActionFlags &= ~flags; |
3430 m_loadState = WaitingForSource; | 3430 m_loadState = WaitingForSource; |
3431 | 3431 |
3432 if (m_textTracks) | 3432 if (m_textTracks) |
3433 configureTextTrackDisplay(AssumeNoVisibleChange); | 3433 configureTextTrackDisplay(AssumeNoVisibleChange); |
3434 } | 3434 } |
3435 | 3435 |
3436 void HTMLMediaElement::stop() | 3436 void HTMLMediaElement::stop() |
3437 { | 3437 { |
3438 WTF_LOG(Media, "HTMLMediaElement::stop"); | 3438 WTF_LOG(Media, "HTMLMediaElement::stop(%p)", this); |
3439 | 3439 |
3440 m_active = false; | 3440 m_active = false; |
3441 userCancelledLoad(); | 3441 userCancelledLoad(); |
3442 | 3442 |
3443 // Stop the playback without generating events | 3443 // Stop the playback without generating events |
3444 m_playing = false; | 3444 m_playing = false; |
3445 setPausedInternal(true); | 3445 setPausedInternal(true); |
3446 | 3446 |
3447 if (renderer()) | 3447 if (renderer()) |
3448 renderer()->updateFromElement(); | 3448 renderer()->updateFromElement(); |
(...skipping 20 matching lines...) Expand all Loading... |
3469 ActiveDOMObject::contextDestroyed(); | 3469 ActiveDOMObject::contextDestroyed(); |
3470 } | 3470 } |
3471 | 3471 |
3472 bool HTMLMediaElement::isFullscreen() const | 3472 bool HTMLMediaElement::isFullscreen() const |
3473 { | 3473 { |
3474 return Fullscreen::isActiveFullScreenElement(*this); | 3474 return Fullscreen::isActiveFullScreenElement(*this); |
3475 } | 3475 } |
3476 | 3476 |
3477 void HTMLMediaElement::enterFullscreen() | 3477 void HTMLMediaElement::enterFullscreen() |
3478 { | 3478 { |
3479 WTF_LOG(Media, "HTMLMediaElement::enterFullscreen"); | 3479 WTF_LOG(Media, "HTMLMediaElement::enterFullscreen(%p)", this); |
3480 | 3480 |
3481 Fullscreen::from(document()).requestFullscreen(*this, Fullscreen::PrefixedVi
deoRequest); | 3481 Fullscreen::from(document()).requestFullscreen(*this, Fullscreen::PrefixedVi
deoRequest); |
3482 } | 3482 } |
3483 | 3483 |
3484 void HTMLMediaElement::exitFullscreen() | 3484 void HTMLMediaElement::exitFullscreen() |
3485 { | 3485 { |
3486 WTF_LOG(Media, "HTMLMediaElement::exitFullscreen"); | 3486 WTF_LOG(Media, "HTMLMediaElement::exitFullscreen(%p)", this); |
3487 | 3487 |
3488 Fullscreen::from(document()).exitFullscreen(); | 3488 Fullscreen::from(document()).exitFullscreen(); |
3489 } | 3489 } |
3490 | 3490 |
3491 void HTMLMediaElement::didBecomeFullscreenElement() | 3491 void HTMLMediaElement::didBecomeFullscreenElement() |
3492 { | 3492 { |
3493 if (hasMediaControls()) | 3493 if (hasMediaControls()) |
3494 mediaControls()->enteredFullscreen(); | 3494 mediaControls()->enteredFullscreen(); |
3495 if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled() && isHTMLVideoEl
ement()) | 3495 if (RuntimeEnabledFeatures::overlayFullscreenVideoEnabled() && isHTMLVideoEl
ement()) |
3496 document().renderView()->compositor()->setNeedsCompositingUpdate(Composi
tingUpdateRebuildTree); | 3496 document().renderView()->compositor()->setNeedsCompositingUpdate(Composi
tingUpdateRebuildTree); |
(...skipping 27 matching lines...) Expand all Loading... |
3524 return false; | 3524 return false; |
3525 } | 3525 } |
3526 | 3526 |
3527 bool HTMLMediaElement::closedCaptionsVisible() const | 3527 bool HTMLMediaElement::closedCaptionsVisible() const |
3528 { | 3528 { |
3529 return m_closedCaptionsVisible; | 3529 return m_closedCaptionsVisible; |
3530 } | 3530 } |
3531 | 3531 |
3532 void HTMLMediaElement::updateTextTrackDisplay() | 3532 void HTMLMediaElement::updateTextTrackDisplay() |
3533 { | 3533 { |
3534 WTF_LOG(Media, "HTMLMediaElement::updateTextTrackDisplay"); | 3534 WTF_LOG(Media, "HTMLMediaElement::updateTextTrackDisplay(%p)", this); |
3535 | 3535 |
3536 if (!createMediaControls()) | 3536 if (!createMediaControls()) |
3537 return; | 3537 return; |
3538 | 3538 |
3539 mediaControls()->updateTextTrackDisplay(); | 3539 mediaControls()->updateTextTrackDisplay(); |
3540 } | 3540 } |
3541 | 3541 |
3542 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) | 3542 void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) |
3543 { | 3543 { |
3544 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%s)", boolString(
closedCaptionVisible)); | 3544 WTF_LOG(Media, "HTMLMediaElement::setClosedCaptionsVisible(%p, %s)", this, b
oolString(closedCaptionVisible)); |
3545 | 3545 |
3546 if (!m_player || !hasClosedCaptions()) | 3546 if (!m_player || !hasClosedCaptions()) |
3547 return; | 3547 return; |
3548 | 3548 |
3549 m_closedCaptionsVisible = closedCaptionVisible; | 3549 m_closedCaptionsVisible = closedCaptionVisible; |
3550 | 3550 |
3551 markCaptionAndSubtitleTracksAsUnconfigured(); | 3551 markCaptionAndSubtitleTracksAsUnconfigured(); |
3552 m_processingPreferenceChange = true; | 3552 m_processingPreferenceChange = true; |
3553 configureTextTracks(); | 3553 configureTextTracks(); |
3554 m_processingPreferenceChange = false; | 3554 m_processingPreferenceChange = false; |
(...skipping 18 matching lines...) Expand all Loading... |
3573 bool HTMLMediaElement::isURLAttribute(const Attribute& attribute) const | 3573 bool HTMLMediaElement::isURLAttribute(const Attribute& attribute) const |
3574 { | 3574 { |
3575 return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute)
; | 3575 return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute)
; |
3576 } | 3576 } |
3577 | 3577 |
3578 void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay) | 3578 void HTMLMediaElement::setShouldDelayLoadEvent(bool shouldDelay) |
3579 { | 3579 { |
3580 if (m_shouldDelayLoadEvent == shouldDelay) | 3580 if (m_shouldDelayLoadEvent == shouldDelay) |
3581 return; | 3581 return; |
3582 | 3582 |
3583 WTF_LOG(Media, "HTMLMediaElement::setShouldDelayLoadEvent(%s)", boolString(s
houldDelay)); | 3583 WTF_LOG(Media, "HTMLMediaElement::setShouldDelayLoadEvent(%p, %s)", this, bo
olString(shouldDelay)); |
3584 | 3584 |
3585 m_shouldDelayLoadEvent = shouldDelay; | 3585 m_shouldDelayLoadEvent = shouldDelay; |
3586 if (shouldDelay) | 3586 if (shouldDelay) |
3587 document().incrementLoadEventDelayCount(); | 3587 document().incrementLoadEventDelayCount(); |
3588 else | 3588 else |
3589 document().decrementLoadEventDelayCount(); | 3589 document().decrementLoadEventDelayCount(); |
3590 } | 3590 } |
3591 | 3591 |
3592 | 3592 |
3593 MediaControls* HTMLMediaElement::mediaControls() const | 3593 MediaControls* HTMLMediaElement::mediaControls() const |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3638 if (!createMediaControls()) | 3638 if (!createMediaControls()) |
3639 return; | 3639 return; |
3640 | 3640 |
3641 mediaControls()->reset(); | 3641 mediaControls()->reset(); |
3642 mediaControls()->show(); | 3642 mediaControls()->show(); |
3643 } | 3643 } |
3644 | 3644 |
3645 void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu
mption) | 3645 void HTMLMediaElement::configureTextTrackDisplay(VisibilityChangeAssumption assu
mption) |
3646 { | 3646 { |
3647 ASSERT(m_textTracks); | 3647 ASSERT(m_textTracks); |
3648 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay"); | 3648 WTF_LOG(Media, "HTMLMediaElement::configureTextTrackDisplay(%p)", this); |
3649 | 3649 |
3650 if (m_processingPreferenceChange) | 3650 if (m_processingPreferenceChange) |
3651 return; | 3651 return; |
3652 | 3652 |
3653 bool haveVisibleTextTrack = false; | 3653 bool haveVisibleTextTrack = false; |
3654 for (unsigned i = 0; i < m_textTracks->length(); ++i) { | 3654 for (unsigned i = 0; i < m_textTracks->length(); ++i) { |
3655 if (m_textTracks->item(i)->mode() == TextTrack::showingKeyword()) { | 3655 if (m_textTracks->item(i)->mode() == TextTrack::showingKeyword()) { |
3656 haveVisibleTextTrack = true; | 3656 haveVisibleTextTrack = true; |
3657 break; | 3657 break; |
3658 } | 3658 } |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3970 | 3970 |
3971 #if ENABLE(WEB_AUDIO) | 3971 #if ENABLE(WEB_AUDIO) |
3972 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) | 3972 void HTMLMediaElement::clearWeakMembers(Visitor* visitor) |
3973 { | 3973 { |
3974 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) | 3974 if (!visitor->isAlive(m_audioSourceNode) && audioSourceProvider()) |
3975 audioSourceProvider()->setClient(0); | 3975 audioSourceProvider()->setClient(0); |
3976 } | 3976 } |
3977 #endif | 3977 #endif |
3978 | 3978 |
3979 } | 3979 } |
OLD | NEW |