Changeset 175050 in webkit
- Timestamp:
- Oct 22, 2014 8:12:08 AM (10 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r175043 r175050 1 2014-10-22 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GStreamer] Do not use CachedResourceLoader, SecurityOrigin, ResourceBuffer and other WebCore types 4 https://bugs.webkit.org/show_bug.cgi?id=137064 5 6 Reviewed by Philippe Normand. 7 8 Update expected results of http/tests/security/video-cross-origin-accessfailure.html, since 9 now the error is also logged in the console. 10 11 * http/tests/security/video-cross-origin-accessfailure-expected.txt: 12 1 13 2014-10-22 Tibor Meszaros <tmeszaros.u-szeged@partner.samsung.com> 2 14 -
trunk/LayoutTests/http/tests/security/video-cross-origin-accessfailure-expected.txt
r167193 r175050 1 CONSOLE MESSAGE: Cross-origin media resource load denied by Cross-Origin Resource Sharing policy. 1 2 EVENT(error) 2 3 END OF TEST -
trunk/Source/WebCore/CMakeLists.txt
r175028 r175050 1808 1808 loader/LinkLoader.cpp 1809 1809 loader/LoaderStrategy.cpp 1810 loader/MediaResourceLoader.cpp 1810 1811 loader/MixedContentChecker.cpp 1811 1812 loader/NavigationAction.cpp -
trunk/Source/WebCore/ChangeLog
r175046 r175050 1 2014-10-22 Carlos Garcia Campos <cgarcia@igalia.com> 2 3 [GStreamer] Do not use CachedResourceLoader, SecurityOrigin, ResourceBuffer and other WebCore types 4 https://bugs.webkit.org/show_bug.cgi?id=137064 5 6 Reviewed by Philippe Normand. 7 8 Move the media resource loader to a new class in WebCore/loader 9 that inherits from a PlatformMediaResourceLoader class defined in 10 the platform layer. The platform specific behaviour is implemented 11 using a client also defined in the platform layer, implemented by 12 every media backend, and used by the WebCore MediaResourceLoader. 13 14 * CMakeLists.txt: Add new files to compilation. 15 * WebCore.vcxproj/WebCore.vcxproj: Ditto. 16 * WebCore.vcxproj/WebCore.vcxproj.filters: Ditto. 17 * WebCore.xcodeproj/project.pbxproj: Ditto. 18 * html/HTMLMediaElement.cpp: 19 (WebCore::HTMLMediaElement::mediaPlayerCreateResourceLoader): 20 Create a MediaResourceLoader. 21 (WebCore::HTMLMediaElement::mediaPlayerCORSMode): Deleted. This is 22 no longer used. 23 * html/HTMLMediaElement.h: 24 * loader/MediaResourceLoader.cpp: Added. 25 (WebCore::MediaResourceLoader::MediaResourceLoader): 26 (WebCore::MediaResourceLoader::~MediaResourceLoader): 27 (WebCore::MediaResourceLoader::start): Start a new load for the 28 given request and load options. 29 (WebCore::MediaResourceLoader::stop): Stop the load if needed. 30 (WebCore::MediaResourceLoader::setDefersLoading): 31 (WebCore::MediaResourceLoader::responseReceived): Handle CORS 32 access check and notify the client about the response. 33 (WebCore::MediaResourceLoader::dataReceived): Notify the client. 34 (WebCore::MediaResourceLoader::notifyFinished): Ditto. 35 (WebCore::MediaResourceLoader::getOrCreateReadBuffer): Ask the 36 client to create the read buffer. 37 * loader/MediaResourceLoader.h: Added. 38 * platform/graphics/MediaPlayer.cpp: 39 (WebCore::MediaPlayer::createResourceLoader): Call 40 mediaPlayerCreateResourceLoader() if there's a client. 41 * platform/graphics/MediaPlayer.h: 42 (WebCore::MediaPlayerClient::mediaPlayerCreateResourceLoader): 43 (WebCore::MediaPlayerClient::mediaPlayerCORSMode): Deleted. 44 * platform/graphics/PlatformMediaResourceLoader.h: Added. 45 (WebCore::PlatformMediaResourceLoaderClient::responseReceived): 46 (WebCore::PlatformMediaResourceLoaderClient::dataReceived): 47 (WebCore::PlatformMediaResourceLoaderClient::bufferReceived): 48 (WebCore::PlatformMediaResourceLoaderClient::accessControlCheckFailed): 49 (WebCore::PlatformMediaResourceLoaderClient::loadFailed): 50 (WebCore::PlatformMediaResourceLoaderClient::loadFinished): 51 (WebCore::PlatformMediaResourceLoaderClient::getOrCreateReadBuffer): 52 (WebCore::PlatformMediaResourceLoader::~PlatformMediaResourceLoader): 53 (WebCore::PlatformMediaResourceLoader::stop): 54 (WebCore::PlatformMediaResourceLoader::setDefersLoading): 55 (WebCore::PlatformMediaResourceLoader::didPassAccessControlCheck): 56 (WebCore::PlatformMediaResourceLoader::PlatformMediaResourceLoader): 57 * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: 58 (webKitWebSrcStop): Also delete the PlatformMediaResourceLoader. 59 (webKitWebSrcStart): Create a new resource loader using 60 MediaPlayer::createResourceLoader() with a new 61 CachedResourceStreamingClient as client. 62 (webKitWebSrcNeedDataMainCb): Call setDefersLoading() for the 63 resource loader if there's one. 64 (webKitWebSrcEnoughDataMainCb): Ditto. 65 (webKitSrcPassedCORSAccessCheck): Return didPassAccessControlCheck. 66 (StreamingClient::handleResponseReceived): Remove the CORS check 67 result parameter since that's now handled by MediaResourceLoader. 68 (CachedResourceStreamingClient::CachedResourceStreamingClient): 69 (CachedResourceStreamingClient::~CachedResourceStreamingClient): 70 (CachedResourceStreamingClient::getOrCreateReadBuffer): 71 (CachedResourceStreamingClient::responseReceived): Update didPassAccessControlCheck. 72 (CachedResourceStreamingClient::dataReceived): 73 (CachedResourceStreamingClient::accessControlCheckFailed): Log the 74 error and stop the load. 75 (CachedResourceStreamingClient::loadFailed): Log the error if it 76 was not a cancellation. 77 (CachedResourceStreamingClient::loadFinished): 78 (ResourceHandleStreamingClient::didReceiveResponse): 79 (CachedResourceStreamingClient::setDefersLoading): Deleted. 80 (CachedResourceStreamingClient::notifyFinished): Deleted. 81 1 82 2014-10-22 Carlos Garcia Campos <cgarcia@igalia.com> 2 83 -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r175028 r175050 7242 7242 <ClCompile Include="..\loader\LinkLoader.cpp" /> 7243 7243 <ClCompile Include="..\loader\LoaderStrategy.cpp" /> 7244 <ClCompile Include="..\loader\MediaResourceLoader.cpp" /> 7244 7245 <ClCompile Include="..\loader\MixedContentChecker.cpp" /> 7245 7246 <ClCompile Include="..\loader\NavigationAction.cpp" /> … … 19242 19243 <ClInclude Include="..\loader\LinkLoaderClient.h" /> 19243 19244 <ClInclude Include="..\loader\LoaderStrategy.h" /> 19245 <ClInclude Include="..\loader\MediaResourceLoader.h" /> 19244 19246 <ClInclude Include="..\loader\MixedContentChecker.h" /> 19245 19247 <ClInclude Include="..\loader\NavigationAction.h" /> … … 19586 19588 <ClInclude Include="..\platform\graphics\Pattern.h" /> 19587 19589 <ClInclude Include="..\platform\graphics\PlatformLayer.h" /> 19590 <ClInclude Include="..\platform\graphics\PlatformMediaResourceLoader.h" /> 19588 19591 <ClInclude Include="..\platform\graphics\PlatformTimeRanges.h" /> 19589 19592 <ClInclude Include="..\platform\graphics\Region.h" /> -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters
r175028 r175050 901 901 <Filter>loader</Filter> 902 902 </ClCompile> 903 <ClCompile Include="..\loader\MediaResourceLoader.cpp"> 904 <Filter>loader</Filter> 905 </ClCompile> 903 906 <ClCompile Include="..\loader\MixedContentChecker.cpp"> 904 907 <Filter>loader</Filter> … … 7915 7918 <Filter>loader</Filter> 7916 7919 </ClInclude> 7920 <ClInclude Include="..\loader\MediaResourceLoader.h"> 7921 <Filter>loader</Filter> 7922 </ClInclude> 7917 7923 <ClInclude Include="..\loader\MixedContentChecker.h"> 7918 7924 <Filter>loader</Filter> … … 8525 8531 </ClInclude> 8526 8532 <ClInclude Include="..\platform\graphics\PlatformLayer.h"> 8533 <Filter>platform\graphics</Filter> 8534 </ClInclude> 8535 <ClInclude Include="..\platform\graphics\PlatformMediaResourceLoader.h"> 8527 8536 <Filter>platform\graphics</Filter> 8528 8537 </ClInclude> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r175028 r175050 5760 5760 CECCFC3B141973D5002A0AC1 /* DecodeEscapeSequences.h in Headers */ = {isa = PBXBuildFile; fileRef = CECCFC3A141973D5002A0AC1 /* DecodeEscapeSequences.h */; }; 5761 5761 CEDA12D7152CA1CB00D9E08D /* AlternativeTextClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CEDA12D6152CA1CB00D9E08D /* AlternativeTextClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5762 CEEFCD7919DB31F7003876D7 /* MediaResourceLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEEFCD7719DB31F7003876D7 /* MediaResourceLoader.cpp */; }; 5763 CEEFCD7A19DB31F7003876D7 /* MediaResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = CEEFCD7819DB31F7003876D7 /* MediaResourceLoader.h */; }; 5764 CEEFCD7C19DB33DC003876D7 /* PlatformMediaResourceLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = CEEFCD7B19DB33DC003876D7 /* PlatformMediaResourceLoader.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5762 5765 CEF418CE1179678C009D112C /* ViewportArguments.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEF418CC1179678C009D112C /* ViewportArguments.cpp */; }; 5763 5766 CEF418CF1179678C009D112C /* ViewportArguments.h in Headers */ = {isa = PBXBuildFile; fileRef = CEF418CD1179678C009D112C /* ViewportArguments.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 13235 13238 CEDA12D6152CA1CB00D9E08D /* AlternativeTextClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlternativeTextClient.h; sourceTree = "<group>"; }; 13236 13239 CEEC6034187DD962003E43BB /* TextTrackRepresentationIOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackRepresentationIOS.h; sourceTree = "<group>"; }; 13240 CEEFCD7719DB31F7003876D7 /* MediaResourceLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaResourceLoader.cpp; sourceTree = "<group>"; }; 13241 CEEFCD7819DB31F7003876D7 /* MediaResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaResourceLoader.h; sourceTree = "<group>"; }; 13242 CEEFCD7B19DB33DC003876D7 /* PlatformMediaResourceLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformMediaResourceLoader.h; sourceTree = "<group>"; }; 13237 13243 CEF418CC1179678C009D112C /* ViewportArguments.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ViewportArguments.cpp; sourceTree = "<group>"; }; 13238 13244 CEF418CD1179678C009D112C /* ViewportArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewportArguments.h; sourceTree = "<group>"; }; … … 20495 20501 A8FA6E5B0E4CFDED00D5CF49 /* Pattern.h */, 20496 20502 0562F9601573F88F0031CA16 /* PlatformLayer.h */, 20503 CEEFCD7B19DB33DC003876D7 /* PlatformMediaResourceLoader.h */, 20497 20504 072847E216EBC5B00043CFA4 /* PlatformTextTrack.h */, 20498 20505 072847E316EBC5B00043CFA4 /* PlatformTextTrackMenu.h */, … … 21180 21187 51ABF64C16392E2800132A7A /* LoaderStrategy.cpp */, 21181 21188 51E6820F16387302003BBF3C /* LoaderStrategy.h */, 21189 CEEFCD7719DB31F7003876D7 /* MediaResourceLoader.cpp */, 21190 CEEFCD7819DB31F7003876D7 /* MediaResourceLoader.h */, 21182 21191 52F10862162B6D82009AC81E /* MixedContentChecker.cpp */, 21183 21192 52F10863162B6D82009AC81E /* MixedContentChecker.h */, … … 25308 25317 D3A94A3B122DABAC00A37BBC /* MediaQueryListListener.h in Headers */, 25309 25318 D3AA10F4123A98AA0092152B /* MediaQueryMatcher.h in Headers */, 25319 CEEFCD7A19DB31F7003876D7 /* MediaResourceLoader.h in Headers */, 25310 25320 070E09191875EEFC003A1D3C /* MediaSession.h in Headers */, 25311 25321 07F944161864D046005D31CB /* MediaSessionManager.h in Headers */, … … 25507 25517 0562F9611573F88F0031CA16 /* PlatformLayer.h in Headers */, 25508 25518 F544F78915CFB2A800AF33A8 /* PlatformLocale.h in Headers */, 25519 CEEFCD7C19DB33DC003876D7 /* PlatformMediaResourceLoader.h in Headers */, 25509 25520 932871C00B20DEB70049035A /* PlatformMenuDescription.h in Headers */, 25510 25521 41BF70100FE86F61005E8DEC /* PlatformMessagePortChannel.h in Headers */, … … 28856 28867 D3A94A38122DABAC00A37BBC /* MediaQueryList.cpp in Sources */, 28857 28868 D3AA10F3123A98AA0092152B /* MediaQueryMatcher.cpp in Sources */, 28869 CEEFCD7919DB31F7003876D7 /* MediaResourceLoader.cpp in Sources */, 28858 28870 070E091B1875EF71003A1D3C /* MediaSession.cpp in Sources */, 28859 28871 CDAE8C091746B95700532D78 /* MediaSessionManager.cpp in Sources */, -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r175003 r175050 63 63 #include "MediaList.h" 64 64 #include "MediaQueryEvaluator.h" 65 #include "MediaResourceLoader.h" 65 66 #include "MediaSessionManager.h" 66 67 #include "NetworkingContext.h" … … 5586 5587 #endif 5587 5588 5588 MediaPlayerClient::CORSMode HTMLMediaElement::mediaPlayerCORSMode() const5589 {5590 if (!fastHasAttribute(HTMLNames::crossoriginAttr))5591 return Unspecified;5592 if (equalIgnoringCase(fastGetAttribute(HTMLNames::crossoriginAttr), "use-credentials"))5593 return UseCredentials;5594 return Anonymous;5595 }5596 5597 5589 bool HTMLMediaElement::mediaPlayerNeedsSiteSpecificHacks() const 5598 5590 { … … 5672 5664 { 5673 5665 return document().cachedResourceLoader(); 5666 } 5667 5668 PassRefPtr<PlatformMediaResourceLoader> HTMLMediaElement::mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient> client) 5669 { 5670 return adoptRef(new MediaResourceLoader(document(), fastGetAttribute(HTMLNames::crossoriginAttr), WTF::move(client))); 5674 5671 } 5675 5672 -
trunk/Source/WebCore/html/HTMLMediaElement.h
r174666 r175050 553 553 virtual String mediaPlayerReferrer() const override; 554 554 virtual String mediaPlayerUserAgent() const override; 555 virtual CORSMode mediaPlayerCORSMode() const override;556 555 557 556 virtual bool mediaPlayerNeedsSiteSpecificHacks() const override; … … 571 570 virtual bool mediaPlayerIsLooping() const override; 572 571 virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() override; 572 virtual PassRefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>); 573 573 574 574 #if PLATFORM(WIN) && USE(AVFOUNDATION) -
trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp
r174563 r175050 1154 1154 } 1155 1155 1156 PassRefPtr<PlatformMediaResourceLoader> MediaPlayer::createResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient> client) 1157 { 1158 return m_client.mediaPlayerCreateResourceLoader(WTF::move(client)); 1159 } 1160 1156 1161 #if ENABLE(VIDEO_TRACK) 1157 1162 void MediaPlayer::addAudioTrack(PassRefPtr<AudioTrackPrivate> track) -
trunk/Source/WebCore/platform/graphics/MediaPlayer.h
r174563 r175050 39 39 #include "NativeImagePtr.h" 40 40 #include "PlatformLayer.h" 41 #include "PlatformMediaResourceLoader.h" 41 42 #include "Timer.h" 42 43 #include "VideoTrackPrivate.h" … … 144 145 class MediaPlayerClient { 145 146 public: 146 enum CORSMode { Unspecified, Anonymous, UseCredentials };147 148 147 virtual ~MediaPlayerClient() { } 149 148 … … 225 224 virtual String mediaPlayerReferrer() const { return String(); } 226 225 virtual String mediaPlayerUserAgent() const { return String(); } 227 virtual CORSMode mediaPlayerCORSMode() const { return Unspecified; }228 226 virtual void mediaPlayerEnterFullscreen() { } 229 227 virtual void mediaPlayerExitFullscreen() { } … … 239 237 virtual bool mediaPlayerIsLooping() const { return false; } 240 238 virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() { return 0; } 239 virtual PassRefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>) { return nullptr; } 241 240 virtual bool doesHaveAttribute(const AtomicString&, AtomicString* = 0) const { return false; } 242 241 … … 526 525 527 526 CachedResourceLoader* cachedResourceLoader(); 527 PassRefPtr<PlatformMediaResourceLoader> createResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>); 528 528 529 529 #if ENABLE(VIDEO_TRACK) -
trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
r174632 r175050 23 23 #if ENABLE(VIDEO) && USE(GSTREAMER) 24 24 25 #include "CachedRawResource.h"26 #include "CachedRawResourceClient.h"27 #include "CachedResourceHandle.h"28 #include "CachedResourceLoader.h"29 #include "CachedResourceRequest.h"30 #include "CrossOriginAccessControl.h"31 25 #include "GRefPtrGStreamer.h" 32 26 #include "GStreamerUtilities.h" … … 34 28 #include "MediaPlayer.h" 35 29 #include "NotImplemented.h" 30 #include "PlatformMediaResourceLoader.h" 31 #include "ResourceError.h" 36 32 #include "ResourceHandle.h" 37 33 #include "ResourceHandleClient.h" 38 34 #include "ResourceRequest.h" 39 35 #include "ResourceResponse.h" 40 #include "SecurityOrigin.h"41 36 #include "SharedBuffer.h" 42 37 #include <gst/app/gstappsrc.h> … … 52 47 using namespace WebCore; 53 48 54 enum CORSAccessCheckResult {55 CORSNoCheck,56 CORSSuccess,57 CORSFailure58 };59 60 49 class StreamingClient { 61 50 public: … … 63 52 virtual ~StreamingClient(); 64 53 65 virtual bool loadFailed() const = 0;66 virtual void setDefersLoading(bool) = 0;67 68 54 protected: 69 55 char* createReadBuffer(size_t requestedSize, size_t& actualSize); 70 void handleResponseReceived(const ResourceResponse& , CORSAccessCheckResult);56 void handleResponseReceived(const ResourceResponse&); 71 57 void handleDataReceived(const char*, int); 72 58 void handleNotifyFinished(); … … 75 61 }; 76 62 77 class CachedResourceStreamingClient : public CachedRawResourceClient, public StreamingClient {78 WTF_MAKE_NONCOPYABLE(CachedResourceStreamingClient); WTF_MAKE_FAST_ALLOCATED;63 class CachedResourceStreamingClient final : public PlatformMediaResourceLoaderClient, public StreamingClient { 64 WTF_MAKE_NONCOPYABLE(CachedResourceStreamingClient); 79 65 public: 80 CachedResourceStreamingClient(WebKitWebSrc* , CachedResourceLoader*, const ResourceRequest&, MediaPlayerClient::CORSMode);66 CachedResourceStreamingClient(WebKitWebSrc*); 81 67 virtual ~CachedResourceStreamingClient(); 82 68 83 // StreamingClient virtual methods.84 virtual bool loadFailed() const;85 virtual void setDefersLoading(bool);86 87 69 private: 88 // CachedResourceClient virtual methods. 89 virtual char* getOrCreateReadBuffer(CachedResource*, size_t requestedSize, size_t& actualSize); 90 virtual void responseReceived(CachedResource*, const ResourceResponse&); 91 virtual void dataReceived(CachedResource*, const char*, int); 92 virtual void notifyFinished(CachedResource*); 93 94 CachedResourceHandle<CachedRawResource> m_resource; 95 RefPtr<SecurityOrigin> m_origin; 70 // PlatformMediaResourceLoaderClient virtual methods. 71 virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize) override; 72 virtual void responseReceived(const ResourceResponse&) override; 73 virtual void dataReceived(const char*, int) override; 74 virtual void accessControlCheckFailed(const ResourceError&) override; 75 virtual void loadFailed(const ResourceError&) override; 76 virtual void loadFinished(SharedBuffer*) override; 96 77 }; 97 78 … … 103 84 104 85 // StreamingClient virtual methods. 105 virtualbool loadFailed() const;106 v irtual void setDefersLoading(bool);86 bool loadFailed() const; 87 void setDefersLoading(bool); 107 88 108 89 private: … … 129 110 WebCore::MediaPlayer* player; 130 111 131 StreamingClient* client; 132 133 CORSAccessCheckResult corsAccessCheck; 112 RefPtr<PlatformMediaResourceLoader> loader; 113 ResourceHandleStreamingClient* client; 114 115 bool didPassAccessControlCheck; 134 116 135 117 guint64 offset; … … 403 385 } 404 386 387 priv->loader = nullptr; 388 405 389 if (priv->buffer) { 406 390 unmapGstBuffer(priv->buffer.get()); … … 450 434 GMutexLocker<GMutex> locker(*GST_OBJECT_GET_LOCK(src)); 451 435 452 priv-> corsAccessCheck = CORSNoCheck;436 priv->didPassAccessControlCheck = false; 453 437 454 438 if (!priv->uri) { … … 460 444 461 445 ASSERT(!priv->client); 446 ASSERT(!priv->loader); 462 447 463 448 URL url = URL(URL(), priv->uri); … … 494 479 request.setHTTPHeaderField(HTTPHeaderName::IcyMetadata, "1"); 495 480 481 bool loadFailed = true; 496 482 if (priv->player) { 497 if (CachedResourceLoader* loader = priv->player->cachedResourceLoader()) 498 priv->client = new CachedResourceStreamingClient(src, loader, request, priv->player->client().mediaPlayerCORSMode()); 499 } 500 501 if (!priv->client) 483 priv->loader = priv->player->createResourceLoader(std::make_unique<CachedResourceStreamingClient>(src)); 484 if (priv->loader) { 485 PlatformMediaResourceLoader::LoadOptions loadOptions = 0; 486 if (request.url().protocolIs("blob")) 487 loadOptions |= PlatformMediaResourceLoader::LoadOption::BufferData; 488 loadFailed = !priv->loader->start(request, loadOptions); 489 } 490 } 491 492 if (!priv->loader) { 502 493 priv->client = new ResourceHandleStreamingClient(src, request); 503 504 if (!priv->client || priv->client->loadFailed()) { 494 loadFailed = priv->client->loadFailed(); 495 } 496 497 if (loadFailed) { 505 498 GST_ERROR_OBJECT(src, "Failed to setup streaming client"); 506 499 if (priv->client) { 507 500 delete priv->client; 508 priv->client = 0;501 priv->client = nullptr; 509 502 } 503 priv->loader = nullptr; 510 504 locker.unlock(); 511 505 webKitWebSrcStop(src); … … 681 675 if (priv->client) 682 676 priv->client->setDefersLoading(false); 677 if (priv->loader) 678 priv->loader->setDefersLoading(false); 683 679 } 684 680 … … 711 707 if (priv->client) 712 708 priv->client->setDefersLoading(true); 709 if (priv->loader) 710 priv->loader->setDefersLoading(true); 713 711 } 714 712 … … 768 766 bool webKitSrcPassedCORSAccessCheck(WebKitWebSrc* src) 769 767 { 770 return src->priv-> corsAccessCheck == CORSSuccess;768 return src->priv->didPassAccessControlCheck; 771 769 } 772 770 … … 800 798 } 801 799 802 void StreamingClient::handleResponseReceived(const ResourceResponse& response , CORSAccessCheckResult corsAccessCheck)800 void StreamingClient::handleResponseReceived(const ResourceResponse& response) 803 801 { 804 802 WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src); … … 807 805 GST_DEBUG_OBJECT(src, "Received response: %d", response.httpStatusCode()); 808 806 809 if (response.httpStatusCode() >= 400 || corsAccessCheck == CORSFailure) { 810 // Received error code or CORS check failed 811 if (corsAccessCheck == CORSFailure) 812 GST_ELEMENT_ERROR(src, RESOURCE, READ, ("Cross-origin stream load denied by Cross-Origin Resource Sharing policy."), (nullptr)); 813 else 814 GST_ELEMENT_ERROR(src, RESOURCE, READ, ("Received %d HTTP error code", response.httpStatusCode()), (nullptr)); 807 if (response.httpStatusCode() >= 400) { 808 GST_ELEMENT_ERROR(src, RESOURCE, READ, ("Received %d HTTP error code", response.httpStatusCode()), (nullptr)); 815 809 gst_app_src_end_of_stream(priv->appsrc); 816 810 webKitWebSrcStop(src); … … 819 813 820 814 GMutexLocker<GMutex> locker(*GST_OBJECT_GET_LOCK(src)); 821 822 priv->corsAccessCheck = corsAccessCheck;823 815 824 816 if (priv->seekSource.isActive()) { … … 993 985 } 994 986 995 CachedResourceStreamingClient::CachedResourceStreamingClient(WebKitWebSrc* src , CachedResourceLoader* resourceLoader, const ResourceRequest& request, MediaPlayerClient::CORSMode corsMode)987 CachedResourceStreamingClient::CachedResourceStreamingClient(WebKitWebSrc* src) 996 988 : StreamingClient(src) 997 989 { 998 DataBufferingPolicy bufferingPolicy = request.url().protocolIs("blob") ? BufferData : DoNotBufferData;999 RequestOriginPolicy corsPolicy = corsMode != MediaPlayerClient::Unspecified ? PotentiallyCrossOriginEnabled : UseDefaultOriginRestrictionsForType;1000 StoredCredentials allowCredentials = corsMode == MediaPlayerClient::Anonymous ? DoNotAllowStoredCredentials : AllowStoredCredentials;1001 ResourceLoaderOptions options(SendCallbacks, DoNotSniffContent, bufferingPolicy, allowCredentials, DoNotAskClientForCrossOriginCredentials, DoSecurityCheck, corsPolicy, DoNotIncludeCertificateInfo);1002 1003 CachedResourceRequest cacheRequest(request, options);1004 1005 if (corsMode != MediaPlayerClient::Unspecified) {1006 m_origin = resourceLoader->document() ? resourceLoader->document()->securityOrigin() : nullptr;1007 updateRequestForAccessControl(cacheRequest.mutableResourceRequest(), m_origin.get(), allowCredentials);1008 }1009 1010 // TODO: Decide whether to use preflight mode for cross-origin requests (see http://wkbug.com/131484).1011 m_resource = resourceLoader->requestRawResource(cacheRequest);1012 if (m_resource)1013 m_resource->addClient(this);1014 990 } 1015 991 1016 992 CachedResourceStreamingClient::~CachedResourceStreamingClient() 1017 993 { 1018 if (m_resource) { 1019 m_resource->removeClient(this); 1020 m_resource = 0; 1021 } 1022 } 1023 1024 bool CachedResourceStreamingClient::loadFailed() const 1025 { 1026 return !m_resource; 1027 } 1028 1029 void CachedResourceStreamingClient::setDefersLoading(bool defers) 1030 { 1031 if (m_resource) 1032 m_resource->setDefersLoading(defers); 1033 } 1034 1035 char* CachedResourceStreamingClient::getOrCreateReadBuffer(CachedResource*, size_t requestedSize, size_t& actualSize) 994 } 995 996 char* CachedResourceStreamingClient::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize) 1036 997 { 1037 998 return createReadBuffer(requestedSize, actualSize); 1038 999 } 1039 1000 1040 void CachedResourceStreamingClient::responseReceived(CachedResource* resource, const ResourceResponse& response) 1041 { 1042 CORSAccessCheckResult corsAccessCheck = CORSNoCheck; 1043 if (m_origin) 1044 corsAccessCheck = (m_origin->canRequest(response.url()) || resource->passesAccessControlCheck(m_origin.get())) ? CORSSuccess : CORSFailure; 1045 handleResponseReceived(response, corsAccessCheck); 1046 } 1047 1048 void CachedResourceStreamingClient::dataReceived(CachedResource*, const char* data, int length) 1001 void CachedResourceStreamingClient::responseReceived(const ResourceResponse& response) 1002 { 1003 WebKitWebSrcPrivate* priv = WEBKIT_WEB_SRC(m_src)->priv; 1004 priv->didPassAccessControlCheck = priv->loader->didPassAccessControlCheck(); 1005 handleResponseReceived(response); 1006 } 1007 1008 void CachedResourceStreamingClient::dataReceived(const char* data, int length) 1049 1009 { 1050 1010 handleDataReceived(data, length); 1051 1011 } 1052 1012 1053 void CachedResourceStreamingClient::notifyFinished(CachedResource* resource) 1054 { 1055 if (resource->loadFailedOrCanceled()) { 1056 WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src); 1057 1058 if (!resource->wasCanceled()) { 1059 const ResourceError& error = resource->resourceError(); 1060 GST_ERROR_OBJECT(src, "Have failure: %s", error.localizedDescription().utf8().data()); 1061 GST_ELEMENT_ERROR(src, RESOURCE, FAILED, ("%s", error.localizedDescription().utf8().data()), (0)); 1062 } 1063 gst_app_src_end_of_stream(src->priv->appsrc); 1064 return; 1065 } 1066 1013 void CachedResourceStreamingClient::accessControlCheckFailed(const ResourceError& error) 1014 { 1015 WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src); 1016 GST_ELEMENT_ERROR(src, RESOURCE, READ, ("%s", error.localizedDescription().utf8().data()), (nullptr)); 1017 gst_app_src_end_of_stream(src->priv->appsrc); 1018 webKitWebSrcStop(src); 1019 } 1020 1021 void CachedResourceStreamingClient::loadFailed(const ResourceError& error) 1022 { 1023 WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src); 1024 1025 if (!error.isCancellation()) { 1026 GST_ERROR_OBJECT(src, "Have failure: %s", error.localizedDescription().utf8().data()); 1027 GST_ELEMENT_ERROR(src, RESOURCE, FAILED, ("%s", error.localizedDescription().utf8().data()), (nullptr)); 1028 } 1029 1030 gst_app_src_end_of_stream(src->priv->appsrc); 1031 } 1032 1033 void CachedResourceStreamingClient::loadFinished(SharedBuffer*) 1034 { 1067 1035 handleNotifyFinished(); 1068 1036 } … … 1105 1073 void ResourceHandleStreamingClient::didReceiveResponse(ResourceHandle*, const ResourceResponse& response) 1106 1074 { 1107 handleResponseReceived(response , CORSNoCheck);1075 handleResponseReceived(response); 1108 1076 } 1109 1077
Note: See TracChangeset
for help on using the changeset viewer.