Chromium Code Reviews| 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 76 #include "platform/RuntimeEnabledFeatures.h" | 76 #include "platform/RuntimeEnabledFeatures.h" |
| 77 #include "platform/UserGestureIndicator.h" | 77 #include "platform/UserGestureIndicator.h" |
| 78 #include "platform/audio/AudioBus.h" | 78 #include "platform/audio/AudioBus.h" |
| 79 #include "platform/audio/AudioSourceProviderClient.h" | 79 #include "platform/audio/AudioSourceProviderClient.h" |
| 80 #include "platform/graphics/GraphicsLayer.h" | 80 #include "platform/graphics/GraphicsLayer.h" |
| 81 #include "platform/weborigin/SecurityOrigin.h" | 81 #include "platform/weborigin/SecurityOrigin.h" |
| 82 #include "public/platform/Platform.h" | 82 #include "public/platform/Platform.h" |
| 83 #include "public/platform/WebAudioSourceProvider.h" | 83 #include "public/platform/WebAudioSourceProvider.h" |
| 84 #include "public/platform/WebContentDecryptionModule.h" | 84 #include "public/platform/WebContentDecryptionModule.h" |
| 85 #include "public/platform/WebInbandTextTrack.h" | 85 #include "public/platform/WebInbandTextTrack.h" |
| 86 #include "public/platform/WebMediaStream.h" | |
| 86 #include "public/platform/modules/remoteplayback/WebRemotePlaybackClient.h" | 87 #include "public/platform/modules/remoteplayback/WebRemotePlaybackClient.h" |
| 87 #include "public/platform/modules/remoteplayback/WebRemotePlaybackState.h" | 88 #include "public/platform/modules/remoteplayback/WebRemotePlaybackState.h" |
| 88 #include "wtf/CurrentTime.h" | 89 #include "wtf/CurrentTime.h" |
| 89 #include "wtf/MathExtras.h" | 90 #include "wtf/MathExtras.h" |
| 90 #include "wtf/text/CString.h" | 91 #include "wtf/text/CString.h" |
| 91 #include <limits> | 92 #include <limits> |
| 92 | 93 |
| 93 #ifndef LOG_MEDIA_EVENTS | 94 #ifndef LOG_MEDIA_EVENTS |
| 94 // Default to not logging events because so many are generated they can overwhel m the rest of | 95 // Default to not logging events because so many are generated they can overwhel m the rest of |
| 95 // the logging. | 96 // the logging. |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 616 return new LayoutMedia(this); | 617 return new LayoutMedia(this); |
| 617 } | 618 } |
| 618 | 619 |
| 619 Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(ContainerNode* insertionPoint) | 620 Node::InsertionNotificationRequest HTMLMediaElement::insertedInto(ContainerNode* insertionPoint) |
| 620 { | 621 { |
| 621 WTF_LOG(Media, "HTMLMediaElement::insertedInto(%p, %p)", this, insertionPoin t); | 622 WTF_LOG(Media, "HTMLMediaElement::insertedInto(%p, %p)", this, insertionPoin t); |
| 622 | 623 |
| 623 HTMLElement::insertedInto(insertionPoint); | 624 HTMLElement::insertedInto(insertionPoint); |
| 624 if (insertionPoint->inDocument()) { | 625 if (insertionPoint->inDocument()) { |
| 625 UseCounter::count(document(), UseCounter::HTMLMediaElementInDocument); | 626 UseCounter::count(document(), UseCounter::HTMLMediaElementInDocument); |
| 626 if (!getAttribute(srcAttr).isEmpty() && m_networkState == NETWORK_EMPTY) { | 627 if (m_networkState == NETWORK_EMPTY && (!getAttribute(srcAttr).isEmpty() || m_source.isMediaProviderObject())) { |
|
philipj_slow
2016/04/06 11:58:42
Hmm, why this change? This block of code isn't per
Guido Urdaneta
2016/04/06 16:34:54
Nothing broke with or without this change.
wolenet
philipj_slow
2016/04/07 15:38:11
What could now be broken when using srcObject is m
Guido Urdaneta
2016/04/08 10:58:47
I think it makes sense to add the srcObject check
| |
| 627 m_ignorePreloadNone = false; | 628 m_ignorePreloadNone = false; |
| 628 invokeLoadAlgorithm(); | 629 invokeLoadAlgorithm(); |
| 629 } | 630 } |
| 630 } | 631 } |
| 631 | 632 |
| 632 return InsertionShouldCallDidNotifySubtreeInsertions; | 633 return InsertionShouldCallDidNotifySubtreeInsertions; |
| 633 } | 634 } |
| 634 | 635 |
| 635 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() | 636 void HTMLMediaElement::didNotifySubtreeInsertionsToDocument() |
| 636 { | 637 { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 711 MediaError* HTMLMediaElement::error() const | 712 MediaError* HTMLMediaElement::error() const |
| 712 { | 713 { |
| 713 return m_error; | 714 return m_error; |
| 714 } | 715 } |
| 715 | 716 |
| 716 void HTMLMediaElement::setSrc(const AtomicString& url) | 717 void HTMLMediaElement::setSrc(const AtomicString& url) |
| 717 { | 718 { |
| 718 setAttribute(srcAttr, url); | 719 setAttribute(srcAttr, url); |
| 719 } | 720 } |
| 720 | 721 |
| 722 void HTMLMediaElement::setSrcObject(const WebMediaElementSource& srcObject) | |
| 723 { | |
| 724 // The srcObject IDL attribute, on setting, must set the element's assigned | |
| 725 // media provider object to the new value, and then invoke the element's | |
| 726 // media element load algorithm. | |
| 727 m_source = srcObject; | |
|
philipj_slow
2016/04/06 11:58:42
Looking at this I'm thinking that it'd be cleaner
Guido Urdaneta
2016/04/06 16:34:55
Done.
| |
| 728 invokeLoadAlgorithm(); | |
| 729 } | |
| 730 | |
| 721 HTMLMediaElement::NetworkState HTMLMediaElement::getNetworkState() const | 731 HTMLMediaElement::NetworkState HTMLMediaElement::getNetworkState() const |
| 722 { | 732 { |
| 723 return m_networkState; | 733 return m_networkState; |
| 724 } | 734 } |
| 725 | 735 |
| 726 String HTMLMediaElement::canPlayType(const String& mimeType) const | 736 String HTMLMediaElement::canPlayType(const String& mimeType) const |
| 727 { | 737 { |
| 728 WebMimeRegistry::SupportsType support = supportsType(ContentType(mimeType)); | 738 WebMimeRegistry::SupportsType support = supportsType(ContentType(mimeType)); |
| 729 String canPlay; | 739 String canPlay; |
| 730 | 740 |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 889 } | 899 } |
| 890 } | 900 } |
| 891 | 901 |
| 892 selectMediaResource(); | 902 selectMediaResource(); |
| 893 } | 903 } |
| 894 | 904 |
| 895 void HTMLMediaElement::selectMediaResource() | 905 void HTMLMediaElement::selectMediaResource() |
| 896 { | 906 { |
| 897 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this); | 907 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p)", this); |
| 898 | 908 |
| 899 enum Mode { attribute, children }; | 909 enum Mode { Object, Attribute, Children, Nothing }; |
| 910 Mode mode = Nothing; | |
| 900 | 911 |
| 901 // 3 - If the media element has a src attribute, then let mode be attribute. | 912 // 6 - If the media element has an assigned media provider object, then let |
| 902 Mode mode = attribute; | 913 // mode be object. |
| 903 if (!fastHasAttribute(srcAttr)) { | 914 if (m_source.isMediaProviderObject()) { |
| 904 // Otherwise, if the media element does not have a src attribute but has a source | 915 mode = Object; |
| 905 // element child, then let mode be children and let candidate be the fir st such | 916 } else if (fastHasAttribute(srcAttr)) { |
| 906 // source element child in tree order. | 917 // Otherwise, if the media element has no assigned media provider object |
| 907 if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstChil d(*this)) { | 918 // but has a src attribute, then let mode be attribute. |
| 908 mode = children; | 919 mode = Attribute; |
| 909 m_nextChildNodeToConsider = element; | 920 } else if (HTMLSourceElement* element = Traversal<HTMLSourceElement>::firstC hild(*this)) { |
| 910 m_currentSourceNode = nullptr; | 921 // Otherwise, if the media element does not have an assigned media |
| 911 } else { | 922 // provider object and does not have a src attribute, but does have a |
| 912 // Otherwise the media element has neither a src attribute nor a sou rce element | 923 // source element child, then let mode be children and let candidate be |
| 913 // child: set the networkState to NETWORK_EMPTY, and abort these ste ps; the | 924 // the first such source element child in tree order. |
| 914 // synchronous section ends. | 925 mode = Children; |
| 915 m_loadState = WaitingForSource; | 926 m_nextChildNodeToConsider = element; |
| 916 setShouldDelayLoadEvent(false); | 927 m_currentSourceNode = nullptr; |
| 917 setNetworkState(NETWORK_EMPTY); | 928 } else { |
| 918 updateDisplayState(); | 929 // Otherwise the media element has no assigned media provider object and |
| 930 // has neither a src attribute nor a source element child: set the | |
| 931 // networkState to NETWORK_EMPTY, and abort these steps; the synchronous | |
| 932 // section ends. | |
| 933 m_loadState = WaitingForSource; | |
| 934 setShouldDelayLoadEvent(false); | |
| 935 setNetworkState(NETWORK_EMPTY); | |
| 936 updateDisplayState(); | |
| 919 | 937 |
| 920 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing t o load", this); | 938 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), nothing to lo ad", this); |
| 921 return; | |
| 922 } | |
| 923 } | |
| 924 | |
| 925 // 4 - Set the media element's delaying-the-load-event flag to true (this de lays the load event), | |
| 926 // and set its networkState to NETWORK_LOADING. | |
| 927 setShouldDelayLoadEvent(true); | |
| 928 setNetworkState(NETWORK_LOADING); | |
| 929 | |
| 930 // 5 - Queue a task to fire a simple event named loadstart at the media elem ent. | |
| 931 scheduleEvent(EventTypeNames::loadstart); | |
| 932 | |
| 933 // 6 - If mode is attribute, then run these substeps | |
| 934 if (mode == attribute) { | |
| 935 m_loadState = LoadingFromSrcAttr; | |
| 936 | |
| 937 const AtomicString& srcValue = fastGetAttribute(srcAttr); | |
| 938 // If the src attribute's value is the empty string ... jump down to the failed step below | |
| 939 if (srcValue.isEmpty()) { | |
| 940 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | |
| 941 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'sr c'", this); | |
| 942 return; | |
| 943 } | |
| 944 | |
| 945 KURL mediaURL = document().completeURL(srcValue); | |
| 946 if (!isSafeToLoadURL(mediaURL, Complain)) { | |
| 947 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | |
| 948 return; | |
| 949 } | |
| 950 | |
| 951 // No type is available when the url comes from the 'src' attribute so M ediaPlayer | |
| 952 // will have to pick a media engine based on the file extension. | |
| 953 ContentType contentType((String())); | |
| 954 loadResource(mediaURL, contentType); | |
| 955 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' a ttribute url", this); | |
| 956 return; | 939 return; |
| 957 } | 940 } |
| 958 | 941 |
| 959 // Otherwise, the source elements will be used | 942 // 7 - Set the media element's networkState to NETWORK_LOADING. |
| 960 loadNextSourceChild(); | 943 setNetworkState(NETWORK_LOADING); |
| 944 | |
| 945 // 8 - Queue a task to fire a simple event named loadstart at the media elem ent. | |
| 946 scheduleEvent(EventTypeNames::loadstart); | |
| 947 | |
| 948 // 9 - Run the appropriate steps... | |
| 949 switch (mode) { | |
| 950 case Object: | |
| 951 loadSourceFromObject(); | |
| 952 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'srcObj ect' attribute", this); | |
| 953 break; | |
| 954 case Attribute: | |
| 955 loadSourceFromAttribute(); | |
| 956 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using 'src' a ttribute url", this); | |
| 957 break; | |
| 958 case Children: | |
| 959 loadNextSourceChild(); | |
| 960 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), using source element", this); | |
| 961 break; | |
| 962 default: | |
| 963 ASSERT_NOT_REACHED(); | |
| 964 } | |
| 965 } | |
| 966 | |
| 967 void HTMLMediaElement::loadSourceFromObject() | |
| 968 { | |
| 969 ASSERT(m_source.isMediaProviderObject()); | |
| 970 m_loadState = LoadingFromSrcObject; | |
| 971 | |
| 972 // No type is available when the resource comes from the 'srcObject' | |
| 973 // attribute. | |
| 974 ContentType contentType((String())); | |
| 975 loadResource(contentType); | |
| 976 } | |
| 977 | |
| 978 void HTMLMediaElement::loadSourceFromAttribute() | |
| 979 { | |
| 980 m_loadState = LoadingFromSrcAttr; | |
| 981 const AtomicString& srcValue = fastGetAttribute(srcAttr); | |
| 982 | |
| 983 // If the src attribute's value is the empty string ... jump down to the fai led step below | |
| 984 if (srcValue.isEmpty()) { | |
| 985 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | |
| 986 WTF_LOG(Media, "HTMLMediaElement::selectMediaResource(%p), empty 'src'", this); | |
| 987 return; | |
| 988 } | |
| 989 | |
| 990 KURL mediaURL = document().completeURL(srcValue); | |
| 991 if (!isSafeToLoadURL(mediaURL, Complain)) { | |
| 992 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | |
| 993 return; | |
| 994 } | |
| 995 | |
| 996 // No type is available when the url comes from the 'src' attribute so | |
| 997 // MediaPlayer will have to pick a media engine based on the file extension. | |
| 998 ContentType contentType((String())); | |
| 999 m_source = WebMediaElementSource(WebURL(mediaURL)); | |
|
philipj_slow
2016/04/06 11:58:42
Here, rather than setting m_source/m_srcObject, ca
Guido Urdaneta
2016/04/06 16:34:55
Done.
| |
| 1000 loadResource(contentType); | |
| 961 } | 1001 } |
| 962 | 1002 |
| 963 void HTMLMediaElement::loadNextSourceChild() | 1003 void HTMLMediaElement::loadNextSourceChild() |
| 964 { | 1004 { |
| 965 ContentType contentType((String())); | 1005 ContentType contentType((String())); |
| 966 KURL mediaURL = selectNextSourceChild(&contentType, Complain); | 1006 KURL mediaURL = selectNextSourceChild(&contentType, Complain); |
| 967 if (!mediaURL.isValid()) { | 1007 if (!mediaURL.isValid()) { |
| 968 waitForSourceChange(); | 1008 waitForSourceChange(); |
| 969 return; | 1009 return; |
| 970 } | 1010 } |
| 971 | 1011 |
| 972 // Reset the MediaPlayer and MediaSource if any | 1012 // Reset the MediaPlayer and MediaSource if any |
| 973 resetMediaPlayerAndMediaSource(); | 1013 resetMediaPlayerAndMediaSource(); |
| 974 | 1014 |
| 975 m_loadState = LoadingFromSourceElement; | 1015 m_loadState = LoadingFromSourceElement; |
| 976 loadResource(mediaURL, contentType); | 1016 m_source = WebMediaElementSource(WebURL(mediaURL)); |
|
philipj_slow
2016/04/06 11:58:42
Ditto.
Guido Urdaneta
2016/04/06 16:34:54
Done.
| |
| 1017 loadResource(contentType); | |
| 977 } | 1018 } |
| 978 | 1019 |
| 979 void HTMLMediaElement::loadResource(const KURL& url, ContentType& contentType) | 1020 void HTMLMediaElement::loadResource(ContentType& contentType) |
| 980 { | 1021 { |
| 981 ASSERT(isMainThread()); | 1022 ASSERT(isMainThread()); |
| 982 ASSERT(isSafeToLoadURL(url, Complain)); | 1023 KURL url; |
| 983 | 1024 if (m_source.isURL()) { |
| 984 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p, %s, %s)", this, urlForLog gingMedia(url).utf8().data(), contentType.raw().utf8().data()); | 1025 url = m_source.getAsURL(); |
| 1026 ASSERT(isSafeToLoadURL(url, Complain)); | |
| 1027 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p, %s, %s)", this, urlFo rLoggingMedia(url).utf8().data(), contentType.raw().utf8().data()); | |
| 1028 } | |
| 985 | 1029 |
| 986 LocalFrame* frame = document().frame(); | 1030 LocalFrame* frame = document().frame(); |
| 987 if (!frame) { | 1031 if (!frame) { |
| 988 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 1032 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
| 989 return; | 1033 return; |
| 990 } | 1034 } |
| 991 | 1035 |
| 992 // The resource fetch algorithm | 1036 // The resource fetch algorithm |
| 993 setNetworkState(NETWORK_LOADING); | 1037 setNetworkState(NETWORK_LOADING); |
| 994 | 1038 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1011 setPlayerPreload(); | 1055 setPlayerPreload(); |
| 1012 | 1056 |
| 1013 if (fastHasAttribute(mutedAttr)) | 1057 if (fastHasAttribute(mutedAttr)) |
| 1014 m_muted = true; | 1058 m_muted = true; |
| 1015 updateVolume(); | 1059 updateVolume(); |
| 1016 | 1060 |
| 1017 ASSERT(!m_mediaSource); | 1061 ASSERT(!m_mediaSource); |
| 1018 | 1062 |
| 1019 bool attemptLoad = true; | 1063 bool attemptLoad = true; |
| 1020 | 1064 |
| 1021 if (url.protocolIs(mediaSourceBlobProtocol)) { | 1065 bool isBlobProtocol = m_source.isMediaProviderObject() || url.protocolIs(med iaSourceBlobProtocol); |
|
philipj_slow
2016/04/06 11:58:42
I guess isObjectOrBlobURL or something would be mo
Guido Urdaneta
2016/04/06 16:34:55
Done.
| |
| 1022 if (isMediaStreamURL(url.getString())) { | 1066 if (isBlobProtocol) { |
| 1067 bool isMediaStream = m_source.isMediaStream() || (m_source.isURL() && is MediaStreamURL(url.getString())); | |
| 1068 if (isMediaStream) { | |
| 1023 m_autoplayHelper->removeUserGestureRequirement(GesturelessPlaybackEn abledByStream); | 1069 m_autoplayHelper->removeUserGestureRequirement(GesturelessPlaybackEn abledByStream); |
| 1024 } else { | 1070 } else { |
| 1025 m_mediaSource = HTMLMediaSource::lookup(url.getString()); | 1071 m_mediaSource = HTMLMediaSource::lookup(url.getString()); |
| 1026 | 1072 |
| 1027 if (m_mediaSource) { | 1073 if (m_mediaSource) { |
| 1028 if (!m_mediaSource->attachToElement(this)) { | 1074 if (!m_mediaSource->attachToElement(this)) { |
| 1029 // Forget our reference to the MediaSource, so we leave it a lone | 1075 // Forget our reference to the MediaSource, so we leave it a lone |
| 1030 // while processing remainder of load failure. | 1076 // while processing remainder of load failure. |
| 1031 m_mediaSource = nullptr; | 1077 m_mediaSource = nullptr; |
| 1032 attemptLoad = false; | 1078 attemptLoad = false; |
| 1033 } | 1079 } |
| 1034 } | 1080 } |
| 1035 } | 1081 } |
| 1036 } | 1082 } |
| 1037 | 1083 |
| 1038 if (attemptLoad && canLoadURL(url, contentType)) { | 1084 bool canLoadResource = m_source.isMediaProviderObject() || canLoadURL(url, c ontentType); |
| 1085 if (attemptLoad && canLoadResource) { | |
| 1039 ASSERT(!webMediaPlayer()); | 1086 ASSERT(!webMediaPlayer()); |
| 1040 | 1087 |
| 1041 if (effectivePreloadType() == WebMediaPlayer::PreloadNone) { | 1088 if (effectivePreloadType() == WebMediaPlayer::PreloadNone) { |
| 1042 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this); | 1089 WTF_LOG(Media, "HTMLMediaElement::loadResource(%p) : Delaying load b ecause preload == 'none'", this); |
| 1043 deferLoad(); | 1090 deferLoad(); |
| 1044 } else { | 1091 } else { |
| 1045 startPlayerLoad(); | 1092 startPlayerLoad(); |
| 1046 } | 1093 } |
| 1047 } else { | 1094 } else { |
| 1048 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 1095 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
| 1049 } | 1096 } |
| 1050 | 1097 |
| 1051 // If there is no poster to display, allow the media engine to render video frames as soon as | 1098 // If there is no poster to display, allow the media engine to render video frames as soon as |
| 1052 // they are available. | 1099 // they are available. |
| 1053 updateDisplayState(); | 1100 updateDisplayState(); |
| 1054 | 1101 |
| 1055 if (layoutObject()) | 1102 if (layoutObject()) |
| 1056 layoutObject()->updateFromElement(); | 1103 layoutObject()->updateFromElement(); |
| 1057 } | 1104 } |
| 1058 | 1105 |
| 1059 void HTMLMediaElement::startPlayerLoad() | 1106 void HTMLMediaElement::startPlayerLoad() |
| 1060 { | 1107 { |
| 1061 ASSERT(!m_webMediaPlayer); | 1108 ASSERT(!m_webMediaPlayer); |
| 1062 // Filter out user:pass as those two URL components aren't | 1109 |
| 1063 // considered for media resource fetches (including for the CORS | 1110 if (m_source.isURL()) { |
|
philipj_slow
2016/04/06 11:58:42
This will have to change with my proposed changes
Guido Urdaneta
2016/04/06 16:34:55
Done.
| |
| 1064 // use-credentials mode.) That behavior aligns with Gecko, with IE | 1111 // Filter out user:pass as those two URL components aren't |
| 1065 // being more restrictive and not allowing fetches to such URLs. | 1112 // considered for media resource fetches (including for the CORS |
| 1066 // | 1113 // use-credentials mode.) That behavior aligns with Gecko, with IE |
| 1067 // Spec reference: http://whatwg.org/c/#concept-media-load-resource | 1114 // being more restrictive and not allowing fetches to such URLs. |
| 1068 // | 1115 // |
| 1069 // FIXME: when the HTML spec switches to specifying resource | 1116 // Spec reference: http://whatwg.org/c/#concept-media-load-resource |
| 1070 // fetches in terms of Fetch (http://fetch.spec.whatwg.org), and | 1117 // |
| 1071 // along with that potentially also specifying a setting for its | 1118 // FIXME: when the HTML spec switches to specifying resource |
| 1072 // 'authentication flag' to control how user:pass embedded in a | 1119 // fetches in terms of Fetch (http://fetch.spec.whatwg.org), and |
| 1073 // media resource URL should be treated, then update the handling | 1120 // along with that potentially also specifying a setting for its |
| 1074 // here to match. | 1121 // 'authentication flag' to control how user:pass embedded in a |
| 1075 KURL requestURL = m_currentSrc; | 1122 // media resource URL should be treated, then update the handling |
| 1076 if (!requestURL.user().isEmpty()) | 1123 // here to match. |
| 1077 requestURL.setUser(String()); | 1124 KURL requestURL = m_currentSrc; |
| 1078 if (!requestURL.pass().isEmpty()) | 1125 if (!requestURL.user().isEmpty()) |
| 1079 requestURL.setPass(String()); | 1126 requestURL.setUser(String()); |
| 1127 if (!requestURL.pass().isEmpty()) | |
| 1128 requestURL.setPass(String()); | |
| 1129 | |
| 1130 KURL kurl(ParsedURLString, requestURL); | |
| 1131 m_source = WebMediaElementSource(WebURL(kurl)); | |
| 1132 } | |
| 1080 | 1133 |
| 1081 LocalFrame* frame = document().frame(); | 1134 LocalFrame* frame = document().frame(); |
| 1082 // TODO(srirama.m): Figure out how frame can be null when | 1135 // TODO(srirama.m): Figure out how frame can be null when |
| 1083 // coming from executeDeferredLoad() | 1136 // coming from executeDeferredLoad() |
| 1084 if (!frame) { | 1137 if (!frame) { |
| 1085 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 1138 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
| 1086 return; | 1139 return; |
| 1087 } | 1140 } |
| 1088 | 1141 |
| 1089 KURL kurl(ParsedURLString, requestURL); | 1142 m_webMediaPlayer = frame->loader().client()->createWebMediaPlayer(*this, m_s ource, this); |
| 1090 m_webMediaPlayer = frame->loader().client()->createWebMediaPlayer(*this, kur l, this); | |
| 1091 if (!m_webMediaPlayer) { | 1143 if (!m_webMediaPlayer) { |
| 1092 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); | 1144 mediaLoadingFailed(WebMediaPlayer::NetworkStateFormatError); |
| 1093 return; | 1145 return; |
| 1094 } | 1146 } |
| 1095 | 1147 |
| 1096 if (layoutObject()) | 1148 if (layoutObject()) |
| 1097 layoutObject()->setShouldDoFullPaintInvalidation(); | 1149 layoutObject()->setShouldDoFullPaintInvalidation(); |
| 1098 // Make sure if we create/re-create the WebMediaPlayer that we update our wr apper. | 1150 // Make sure if we create/re-create the WebMediaPlayer that we update our wr apper. |
| 1099 m_audioSourceProvider.wrap(m_webMediaPlayer->getAudioSourceProvider()); | 1151 m_audioSourceProvider.wrap(m_webMediaPlayer->getAudioSourceProvider()); |
| 1100 m_webMediaPlayer->setVolume(effectiveMediaVolume()); | 1152 m_webMediaPlayer->setVolume(effectiveMediaVolume()); |
| 1101 | 1153 |
| 1102 m_webMediaPlayer->setPoster(posterImageURL()); | 1154 m_webMediaPlayer->setPoster(posterImageURL()); |
| 1103 | 1155 |
| 1104 m_webMediaPlayer->setPreload(effectivePreloadType()); | 1156 m_webMediaPlayer->setPreload(effectivePreloadType()); |
| 1105 | 1157 |
| 1106 m_webMediaPlayer->load(loadType(), kurl, corsMode()); | 1158 m_webMediaPlayer->load(loadType(), m_source, corsMode()); |
| 1107 | 1159 |
| 1108 if (isFullscreen()) { | 1160 if (isFullscreen()) { |
| 1109 // This handles any transition to or from fullscreen overlay mode. | 1161 // This handles any transition to or from fullscreen overlay mode. |
| 1110 frame->chromeClient().enterFullScreenForElement(this); | 1162 frame->chromeClient().enterFullScreenForElement(this); |
| 1111 } | 1163 } |
| 1112 } | 1164 } |
| 1113 | 1165 |
| 1114 void HTMLMediaElement::setPlayerPreload() | 1166 void HTMLMediaElement::setPlayerPreload() |
| 1115 { | 1167 { |
| 1116 if (m_webMediaPlayer) | 1168 if (m_webMediaPlayer) |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1189 } | 1241 } |
| 1190 ASSERT(m_deferredLoadState == WaitingForStopDelayingLoadEventTask); | 1242 ASSERT(m_deferredLoadState == WaitingForStopDelayingLoadEventTask); |
| 1191 m_deferredLoadState = WaitingForTrigger; | 1243 m_deferredLoadState = WaitingForTrigger; |
| 1192 } | 1244 } |
| 1193 | 1245 |
| 1194 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const | 1246 WebMediaPlayer::LoadType HTMLMediaElement::loadType() const |
| 1195 { | 1247 { |
| 1196 if (m_mediaSource) | 1248 if (m_mediaSource) |
| 1197 return WebMediaPlayer::LoadTypeMediaSource; | 1249 return WebMediaPlayer::LoadTypeMediaSource; |
| 1198 | 1250 |
| 1251 if (m_source.isMediaStream()) | |
| 1252 return WebMediaPlayer::LoadTypeMediaStream; | |
| 1253 | |
| 1199 if (isMediaStreamURL(m_currentSrc.getString())) | 1254 if (isMediaStreamURL(m_currentSrc.getString())) |
| 1200 return WebMediaPlayer::LoadTypeMediaStream; | 1255 return WebMediaPlayer::LoadTypeMediaStream; |
| 1201 | 1256 |
| 1202 return WebMediaPlayer::LoadTypeURL; | 1257 return WebMediaPlayer::LoadTypeURL; |
| 1203 } | 1258 } |
| 1204 | 1259 |
| 1205 bool HTMLMediaElement::textTracksAreReady() const | 1260 bool HTMLMediaElement::textTracksAreReady() const |
| 1206 { | 1261 { |
| 1207 // 4.8.10.12.1 Text track model | 1262 // 4.8.10.12.1 Text track model |
| 1208 // ... | 1263 // ... |
| (...skipping 2663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3872 } | 3927 } |
| 3873 | 3928 |
| 3874 #if !ENABLE(OILPAN) | 3929 #if !ENABLE(OILPAN) |
| 3875 WeakPtr<HTMLMediaElement> HTMLMediaElement::createWeakPtr() | 3930 WeakPtr<HTMLMediaElement> HTMLMediaElement::createWeakPtr() |
| 3876 { | 3931 { |
| 3877 return m_weakPtrFactory.createWeakPtr(); | 3932 return m_weakPtrFactory.createWeakPtr(); |
| 3878 } | 3933 } |
| 3879 #endif | 3934 #endif |
| 3880 | 3935 |
| 3881 } // namespace blink | 3936 } // namespace blink |
| OLD | NEW |