Changeset 175050 in webkit


Ignore:
Timestamp:
Oct 22, 2014 8:12:08 AM (10 years ago)
Author:
Carlos Garcia Campos
Message:

[GStreamer] Do not use CachedResourceLoader, SecurityOrigin, ResourceBuffer and other WebCore types
https://bugs.webkit.org/show_bug.cgi?id=137064

Reviewed by Philippe Normand.

Source/WebCore:

Move the media resource loader to a new class in WebCore/loader
that inherits from a PlatformMediaResourceLoader class defined in
the platform layer. The platform specific behaviour is implemented
using a client also defined in the platform layer, implemented by
every media backend, and used by the WebCore MediaResourceLoader.

  • CMakeLists.txt: Add new files to compilation.
  • WebCore.vcxproj/WebCore.vcxproj: Ditto.
  • WebCore.vcxproj/WebCore.vcxproj.filters: Ditto.
  • WebCore.xcodeproj/project.pbxproj: Ditto.
  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::mediaPlayerCreateResourceLoader):
Create a MediaResourceLoader.
(WebCore::HTMLMediaElement::mediaPlayerCORSMode): Deleted. This is
no longer used.

  • html/HTMLMediaElement.h:
  • loader/MediaResourceLoader.cpp: Added.

(WebCore::MediaResourceLoader::MediaResourceLoader):
(WebCore::MediaResourceLoader::~MediaResourceLoader):
(WebCore::MediaResourceLoader::start): Start a new load for the
given request and load options.
(WebCore::MediaResourceLoader::stop): Stop the load if needed.
(WebCore::MediaResourceLoader::setDefersLoading):
(WebCore::MediaResourceLoader::responseReceived): Handle CORS
access check and notify the client about the response.
(WebCore::MediaResourceLoader::dataReceived): Notify the client.
(WebCore::MediaResourceLoader::notifyFinished): Ditto.
(WebCore::MediaResourceLoader::getOrCreateReadBuffer): Ask the
client to create the read buffer.

  • loader/MediaResourceLoader.h: Added.
  • platform/graphics/MediaPlayer.cpp:

(WebCore::MediaPlayer::createResourceLoader): Call
mediaPlayerCreateResourceLoader() if there's a client.

  • platform/graphics/MediaPlayer.h:

(WebCore::MediaPlayerClient::mediaPlayerCreateResourceLoader):
(WebCore::MediaPlayerClient::mediaPlayerCORSMode): Deleted.

  • platform/graphics/PlatformMediaResourceLoader.h: Added.

(WebCore::PlatformMediaResourceLoaderClient::responseReceived):
(WebCore::PlatformMediaResourceLoaderClient::dataReceived):
(WebCore::PlatformMediaResourceLoaderClient::bufferReceived):
(WebCore::PlatformMediaResourceLoaderClient::accessControlCheckFailed):
(WebCore::PlatformMediaResourceLoaderClient::loadFailed):
(WebCore::PlatformMediaResourceLoaderClient::loadFinished):
(WebCore::PlatformMediaResourceLoaderClient::getOrCreateReadBuffer):
(WebCore::PlatformMediaResourceLoader::~PlatformMediaResourceLoader):
(WebCore::PlatformMediaResourceLoader::stop):
(WebCore::PlatformMediaResourceLoader::setDefersLoading):
(WebCore::PlatformMediaResourceLoader::didPassAccessControlCheck):
(WebCore::PlatformMediaResourceLoader::PlatformMediaResourceLoader):

  • platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:

(webKitWebSrcStop): Also delete the PlatformMediaResourceLoader.
(webKitWebSrcStart): Create a new resource loader using
MediaPlayer::createResourceLoader() with a new
CachedResourceStreamingClient as client.
(webKitWebSrcNeedDataMainCb): Call setDefersLoading() for the
resource loader if there's one.
(webKitWebSrcEnoughDataMainCb): Ditto.
(webKitSrcPassedCORSAccessCheck): Return didPassAccessControlCheck.
(StreamingClient::handleResponseReceived): Remove the CORS check
result parameter since that's now handled by MediaResourceLoader.
(CachedResourceStreamingClient::CachedResourceStreamingClient):
(CachedResourceStreamingClient::~CachedResourceStreamingClient):
(CachedResourceStreamingClient::getOrCreateReadBuffer):
(CachedResourceStreamingClient::responseReceived): Update didPassAccessControlCheck.
(CachedResourceStreamingClient::dataReceived):
(CachedResourceStreamingClient::accessControlCheckFailed): Log the
error and stop the load.
(CachedResourceStreamingClient::loadFailed): Log the error if it
was not a cancellation.
(CachedResourceStreamingClient::loadFinished):
(ResourceHandleStreamingClient::didReceiveResponse):
(CachedResourceStreamingClient::setDefersLoading): Deleted.
(CachedResourceStreamingClient::notifyFinished): Deleted.

LayoutTests:

Update expected results of http/tests/security/video-cross-origin-accessfailure.html, since
now the error is also logged in the console.

  • http/tests/security/video-cross-origin-accessfailure-expected.txt:
Location:
trunk
Files:
3 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r175043 r175050  
     12014-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
    1132014-10-22  Tibor Meszaros  <tmeszaros.u-szeged@partner.samsung.com>
    214
  • trunk/LayoutTests/http/tests/security/video-cross-origin-accessfailure-expected.txt

    r167193 r175050  
     1CONSOLE MESSAGE: Cross-origin media resource load denied by Cross-Origin Resource Sharing policy.
    12EVENT(error)
    23END OF TEST
  • trunk/Source/WebCore/CMakeLists.txt

    r175028 r175050  
    18081808    loader/LinkLoader.cpp
    18091809    loader/LoaderStrategy.cpp
     1810    loader/MediaResourceLoader.cpp
    18101811    loader/MixedContentChecker.cpp
    18111812    loader/NavigationAction.cpp
  • trunk/Source/WebCore/ChangeLog

    r175046 r175050  
     12014-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
    1822014-10-22  Carlos Garcia Campos  <cgarcia@igalia.com>
    283
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r175028 r175050  
    72427242    <ClCompile Include="..\loader\LinkLoader.cpp" />
    72437243    <ClCompile Include="..\loader\LoaderStrategy.cpp" />
     7244    <ClCompile Include="..\loader\MediaResourceLoader.cpp" />
    72447245    <ClCompile Include="..\loader\MixedContentChecker.cpp" />
    72457246    <ClCompile Include="..\loader\NavigationAction.cpp" />
     
    1924219243    <ClInclude Include="..\loader\LinkLoaderClient.h" />
    1924319244    <ClInclude Include="..\loader\LoaderStrategy.h" />
     19245    <ClInclude Include="..\loader\MediaResourceLoader.h" />
    1924419246    <ClInclude Include="..\loader\MixedContentChecker.h" />
    1924519247    <ClInclude Include="..\loader\NavigationAction.h" />
     
    1958619588    <ClInclude Include="..\platform\graphics\Pattern.h" />
    1958719589    <ClInclude Include="..\platform\graphics\PlatformLayer.h" />
     19590    <ClInclude Include="..\platform\graphics\PlatformMediaResourceLoader.h" />
    1958819591    <ClInclude Include="..\platform\graphics\PlatformTimeRanges.h" />
    1958919592    <ClInclude Include="..\platform\graphics\Region.h" />
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters

    r175028 r175050  
    901901      <Filter>loader</Filter>
    902902    </ClCompile>
     903    <ClCompile Include="..\loader\MediaResourceLoader.cpp">
     904      <Filter>loader</Filter>
     905    </ClCompile>
    903906    <ClCompile Include="..\loader\MixedContentChecker.cpp">
    904907      <Filter>loader</Filter>
     
    79157918      <Filter>loader</Filter>
    79167919    </ClInclude>
     7920    <ClInclude Include="..\loader\MediaResourceLoader.h">
     7921      <Filter>loader</Filter>
     7922    </ClInclude>
    79177923    <ClInclude Include="..\loader\MixedContentChecker.h">
    79187924      <Filter>loader</Filter>
     
    85258531    </ClInclude>
    85268532    <ClInclude Include="..\platform\graphics\PlatformLayer.h">
     8533      <Filter>platform\graphics</Filter>
     8534    </ClInclude>
     8535    <ClInclude Include="..\platform\graphics\PlatformMediaResourceLoader.h">
    85278536      <Filter>platform\graphics</Filter>
    85288537    </ClInclude>
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r175028 r175050  
    57605760                CECCFC3B141973D5002A0AC1 /* DecodeEscapeSequences.h in Headers */ = {isa = PBXBuildFile; fileRef = CECCFC3A141973D5002A0AC1 /* DecodeEscapeSequences.h */; };
    57615761                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, ); }; };
    57625765                CEF418CE1179678C009D112C /* ViewportArguments.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CEF418CC1179678C009D112C /* ViewportArguments.cpp */; };
    57635766                CEF418CF1179678C009D112C /* ViewportArguments.h in Headers */ = {isa = PBXBuildFile; fileRef = CEF418CD1179678C009D112C /* ViewportArguments.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1323513238                CEDA12D6152CA1CB00D9E08D /* AlternativeTextClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AlternativeTextClient.h; sourceTree = "<group>"; };
    1323613239                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>"; };
    1323713243                CEF418CC1179678C009D112C /* ViewportArguments.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ViewportArguments.cpp; sourceTree = "<group>"; };
    1323813244                CEF418CD1179678C009D112C /* ViewportArguments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ViewportArguments.h; sourceTree = "<group>"; };
     
    2049520501                                A8FA6E5B0E4CFDED00D5CF49 /* Pattern.h */,
    2049620502                                0562F9601573F88F0031CA16 /* PlatformLayer.h */,
     20503                                CEEFCD7B19DB33DC003876D7 /* PlatformMediaResourceLoader.h */,
    2049720504                                072847E216EBC5B00043CFA4 /* PlatformTextTrack.h */,
    2049820505                                072847E316EBC5B00043CFA4 /* PlatformTextTrackMenu.h */,
     
    2118021187                                51ABF64C16392E2800132A7A /* LoaderStrategy.cpp */,
    2118121188                                51E6820F16387302003BBF3C /* LoaderStrategy.h */,
     21189                                CEEFCD7719DB31F7003876D7 /* MediaResourceLoader.cpp */,
     21190                                CEEFCD7819DB31F7003876D7 /* MediaResourceLoader.h */,
    2118221191                                52F10862162B6D82009AC81E /* MixedContentChecker.cpp */,
    2118321192                                52F10863162B6D82009AC81E /* MixedContentChecker.h */,
     
    2530825317                                D3A94A3B122DABAC00A37BBC /* MediaQueryListListener.h in Headers */,
    2530925318                                D3AA10F4123A98AA0092152B /* MediaQueryMatcher.h in Headers */,
     25319                                CEEFCD7A19DB31F7003876D7 /* MediaResourceLoader.h in Headers */,
    2531025320                                070E09191875EEFC003A1D3C /* MediaSession.h in Headers */,
    2531125321                                07F944161864D046005D31CB /* MediaSessionManager.h in Headers */,
     
    2550725517                                0562F9611573F88F0031CA16 /* PlatformLayer.h in Headers */,
    2550825518                                F544F78915CFB2A800AF33A8 /* PlatformLocale.h in Headers */,
     25519                                CEEFCD7C19DB33DC003876D7 /* PlatformMediaResourceLoader.h in Headers */,
    2550925520                                932871C00B20DEB70049035A /* PlatformMenuDescription.h in Headers */,
    2551025521                                41BF70100FE86F61005E8DEC /* PlatformMessagePortChannel.h in Headers */,
     
    2885628867                                D3A94A38122DABAC00A37BBC /* MediaQueryList.cpp in Sources */,
    2885728868                                D3AA10F3123A98AA0092152B /* MediaQueryMatcher.cpp in Sources */,
     28869                                CEEFCD7919DB31F7003876D7 /* MediaResourceLoader.cpp in Sources */,
    2885828870                                070E091B1875EF71003A1D3C /* MediaSession.cpp in Sources */,
    2885928871                                CDAE8C091746B95700532D78 /* MediaSessionManager.cpp in Sources */,
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r175003 r175050  
    6363#include "MediaList.h"
    6464#include "MediaQueryEvaluator.h"
     65#include "MediaResourceLoader.h"
    6566#include "MediaSessionManager.h"
    6667#include "NetworkingContext.h"
     
    55865587#endif
    55875588
    5588 MediaPlayerClient::CORSMode HTMLMediaElement::mediaPlayerCORSMode() const
    5589 {
    5590     if (!fastHasAttribute(HTMLNames::crossoriginAttr))
    5591         return Unspecified;
    5592     if (equalIgnoringCase(fastGetAttribute(HTMLNames::crossoriginAttr), "use-credentials"))
    5593         return UseCredentials;
    5594     return Anonymous;
    5595 }
    5596 
    55975589bool HTMLMediaElement::mediaPlayerNeedsSiteSpecificHacks() const
    55985590{
     
    56725664{
    56735665    return document().cachedResourceLoader();
     5666}
     5667
     5668PassRefPtr<PlatformMediaResourceLoader> HTMLMediaElement::mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient> client)
     5669{
     5670    return adoptRef(new MediaResourceLoader(document(), fastGetAttribute(HTMLNames::crossoriginAttr), WTF::move(client)));
    56745671}
    56755672
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r174666 r175050  
    553553    virtual String mediaPlayerReferrer() const override;
    554554    virtual String mediaPlayerUserAgent() const override;
    555     virtual CORSMode mediaPlayerCORSMode() const override;
    556555
    557556    virtual bool mediaPlayerNeedsSiteSpecificHacks() const override;
     
    571570    virtual bool mediaPlayerIsLooping() const override;
    572571    virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() override;
     572    virtual PassRefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>);
    573573
    574574#if PLATFORM(WIN) && USE(AVFOUNDATION)
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp

    r174563 r175050  
    11541154}
    11551155
     1156PassRefPtr<PlatformMediaResourceLoader> MediaPlayer::createResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient> client)
     1157{
     1158    return m_client.mediaPlayerCreateResourceLoader(WTF::move(client));
     1159}
     1160
    11561161#if ENABLE(VIDEO_TRACK)
    11571162void MediaPlayer::addAudioTrack(PassRefPtr<AudioTrackPrivate> track)
  • trunk/Source/WebCore/platform/graphics/MediaPlayer.h

    r174563 r175050  
    3939#include "NativeImagePtr.h"
    4040#include "PlatformLayer.h"
     41#include "PlatformMediaResourceLoader.h"
    4142#include "Timer.h"
    4243#include "VideoTrackPrivate.h"
     
    144145class MediaPlayerClient {
    145146public:
    146     enum CORSMode { Unspecified, Anonymous, UseCredentials };
    147 
    148147    virtual ~MediaPlayerClient() { }
    149148
     
    225224    virtual String mediaPlayerReferrer() const { return String(); }
    226225    virtual String mediaPlayerUserAgent() const { return String(); }
    227     virtual CORSMode mediaPlayerCORSMode() const { return Unspecified; }
    228226    virtual void mediaPlayerEnterFullscreen() { }
    229227    virtual void mediaPlayerExitFullscreen() { }
     
    239237    virtual bool mediaPlayerIsLooping() const { return false; }
    240238    virtual CachedResourceLoader* mediaPlayerCachedResourceLoader() { return 0; }
     239    virtual PassRefPtr<PlatformMediaResourceLoader> mediaPlayerCreateResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>) { return nullptr; }
    241240    virtual bool doesHaveAttribute(const AtomicString&, AtomicString* = 0) const { return false; }
    242241
     
    526525
    527526    CachedResourceLoader* cachedResourceLoader();
     527    PassRefPtr<PlatformMediaResourceLoader> createResourceLoader(std::unique_ptr<PlatformMediaResourceLoaderClient>);
    528528
    529529#if ENABLE(VIDEO_TRACK)
  • trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

    r174632 r175050  
    2323#if ENABLE(VIDEO) && USE(GSTREAMER)
    2424
    25 #include "CachedRawResource.h"
    26 #include "CachedRawResourceClient.h"
    27 #include "CachedResourceHandle.h"
    28 #include "CachedResourceLoader.h"
    29 #include "CachedResourceRequest.h"
    30 #include "CrossOriginAccessControl.h"
    3125#include "GRefPtrGStreamer.h"
    3226#include "GStreamerUtilities.h"
     
    3428#include "MediaPlayer.h"
    3529#include "NotImplemented.h"
     30#include "PlatformMediaResourceLoader.h"
     31#include "ResourceError.h"
    3632#include "ResourceHandle.h"
    3733#include "ResourceHandleClient.h"
    3834#include "ResourceRequest.h"
    3935#include "ResourceResponse.h"
    40 #include "SecurityOrigin.h"
    4136#include "SharedBuffer.h"
    4237#include <gst/app/gstappsrc.h>
     
    5247using namespace WebCore;
    5348
    54 enum CORSAccessCheckResult {
    55     CORSNoCheck,
    56     CORSSuccess,
    57     CORSFailure
    58 };
    59 
    6049class StreamingClient {
    6150    public:
     
    6352        virtual ~StreamingClient();
    6453
    65         virtual bool loadFailed() const = 0;
    66         virtual void setDefersLoading(bool) = 0;
    67 
    6854    protected:
    6955        char* createReadBuffer(size_t requestedSize, size_t& actualSize);
    70         void handleResponseReceived(const ResourceResponse&, CORSAccessCheckResult);
     56        void handleResponseReceived(const ResourceResponse&);
    7157        void handleDataReceived(const char*, int);
    7258        void handleNotifyFinished();
     
    7561};
    7662
    77 class CachedResourceStreamingClient : public CachedRawResourceClient, public StreamingClient {
    78     WTF_MAKE_NONCOPYABLE(CachedResourceStreamingClient); WTF_MAKE_FAST_ALLOCATED;
     63class CachedResourceStreamingClient final : public PlatformMediaResourceLoaderClient, public StreamingClient {
     64    WTF_MAKE_NONCOPYABLE(CachedResourceStreamingClient);
    7965    public:
    80         CachedResourceStreamingClient(WebKitWebSrc*, CachedResourceLoader*, const ResourceRequest&, MediaPlayerClient::CORSMode);
     66        CachedResourceStreamingClient(WebKitWebSrc*);
    8167        virtual ~CachedResourceStreamingClient();
    8268
    83         // StreamingClient virtual methods.
    84         virtual bool loadFailed() const;
    85         virtual void setDefersLoading(bool);
    86 
    8769    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;
    9677};
    9778
     
    10384
    10485        // StreamingClient virtual methods.
    105         virtual bool loadFailed() const;
    106         virtual void setDefersLoading(bool);
     86        bool loadFailed() const;
     87        void setDefersLoading(bool);
    10788
    10889    private:
     
    129110    WebCore::MediaPlayer* player;
    130111
    131     StreamingClient* client;
    132 
    133     CORSAccessCheckResult corsAccessCheck;
     112    RefPtr<PlatformMediaResourceLoader> loader;
     113    ResourceHandleStreamingClient* client;
     114
     115    bool didPassAccessControlCheck;
    134116
    135117    guint64 offset;
     
    403385    }
    404386
     387    priv->loader = nullptr;
     388
    405389    if (priv->buffer) {
    406390        unmapGstBuffer(priv->buffer.get());
     
    450434    GMutexLocker<GMutex> locker(*GST_OBJECT_GET_LOCK(src));
    451435
    452     priv->corsAccessCheck = CORSNoCheck;
     436    priv->didPassAccessControlCheck = false;
    453437
    454438    if (!priv->uri) {
     
    460444
    461445    ASSERT(!priv->client);
     446    ASSERT(!priv->loader);
    462447
    463448    URL url = URL(URL(), priv->uri);
     
    494479    request.setHTTPHeaderField(HTTPHeaderName::IcyMetadata, "1");
    495480
     481    bool loadFailed = true;
    496482    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) {
    502493        priv->client = new ResourceHandleStreamingClient(src, request);
    503 
    504     if (!priv->client || priv->client->loadFailed()) {
     494        loadFailed = priv->client->loadFailed();
     495    }
     496
     497    if (loadFailed) {
    505498        GST_ERROR_OBJECT(src, "Failed to setup streaming client");
    506499        if (priv->client) {
    507500            delete priv->client;
    508             priv->client = 0;
     501            priv->client = nullptr;
    509502        }
     503        priv->loader = nullptr;
    510504        locker.unlock();
    511505        webKitWebSrcStop(src);
     
    681675    if (priv->client)
    682676        priv->client->setDefersLoading(false);
     677    if (priv->loader)
     678        priv->loader->setDefersLoading(false);
    683679}
    684680
     
    711707    if (priv->client)
    712708        priv->client->setDefersLoading(true);
     709    if (priv->loader)
     710        priv->loader->setDefersLoading(true);
    713711}
    714712
     
    768766bool webKitSrcPassedCORSAccessCheck(WebKitWebSrc* src)
    769767{
    770     return src->priv->corsAccessCheck == CORSSuccess;
     768    return src->priv->didPassAccessControlCheck;
    771769}
    772770
     
    800798}
    801799
    802 void StreamingClient::handleResponseReceived(const ResourceResponse& response, CORSAccessCheckResult corsAccessCheck)
     800void StreamingClient::handleResponseReceived(const ResourceResponse& response)
    803801{
    804802    WebKitWebSrc* src = WEBKIT_WEB_SRC(m_src);
     
    807805    GST_DEBUG_OBJECT(src, "Received response: %d", response.httpStatusCode());
    808806
    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));
    815809        gst_app_src_end_of_stream(priv->appsrc);
    816810        webKitWebSrcStop(src);
     
    819813
    820814    GMutexLocker<GMutex> locker(*GST_OBJECT_GET_LOCK(src));
    821 
    822     priv->corsAccessCheck = corsAccessCheck;
    823815
    824816    if (priv->seekSource.isActive()) {
     
    993985}
    994986
    995 CachedResourceStreamingClient::CachedResourceStreamingClient(WebKitWebSrc* src, CachedResourceLoader* resourceLoader, const ResourceRequest& request, MediaPlayerClient::CORSMode corsMode)
     987CachedResourceStreamingClient::CachedResourceStreamingClient(WebKitWebSrc* src)
    996988    : StreamingClient(src)
    997989{
    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);
    1014990}
    1015991
    1016992CachedResourceStreamingClient::~CachedResourceStreamingClient()
    1017993{
    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
     996char* CachedResourceStreamingClient::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize)
    1036997{
    1037998    return createReadBuffer(requestedSize, actualSize);
    1038999}
    10391000
    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)
     1001void 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
     1008void CachedResourceStreamingClient::dataReceived(const char* data, int length)
    10491009{
    10501010    handleDataReceived(data, length);
    10511011}
    10521012
    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 
     1013void 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
     1021void 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
     1033void CachedResourceStreamingClient::loadFinished(SharedBuffer*)
     1034{
    10671035    handleNotifyFinished();
    10681036}
     
    11051073void ResourceHandleStreamingClient::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
    11061074{
    1107     handleResponseReceived(response, CORSNoCheck);
     1075    handleResponseReceived(response);
    11081076}
    11091077
Note: See TracChangeset for help on using the changeset viewer.