Changeset 152778 in webkit


Ignore:
Timestamp:
Jul 17, 2013 2:39:21 AM (11 years ago)
Author:
Carlos Garcia Campos
Message:

[GStreamer] webkitwebsrc: use SubResourceLoader
https://bugs.webkit.org/show_bug.cgi?id=73743

Reviewed by Philippe Normand.

  • GNUmakefile.list.am: Add new files to compilation.
  • PlatformEfl.cmake: Ditto.
  • PlatformGTK.cmake: Ditto.
  • loader/SubresourceLoader.h: Add getOrCreateReadBuffer() when

using SOUP.

  • loader/cache/CachedRawResource.h:
  • loader/cache/CachedRawResourceClient.h:

(WebCore::CachedRawResourceClient::getOrCreateReadBuffer): Added
to allow the client to allocate the read buffer.

  • loader/cache/CachedResource.h:

(WebCore::CachedResource::getOrCreateReadBuffer):

  • loader/soup/CachedRawResourceSoup.cpp: Added.

(WebCore::CachedRawResource::getOrCreateReadBuffer): Iterate the
clients until one returns a valid read buffer or return NULL to
fallback to the default read buffer.

  • loader/soup/SubresourceLoaderSoup.cpp: Added.

(WebCore::SubresourceLoader::getOrCreateReadBuffer): Call
CachedResource::getOrCreateReadBuffer().

  • platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:

(StreamingClient): Make this a CachedRawResourceClient.
(_WebKitWebSrcPrivate): Remove frame and resourceHandle and add a
cached resource handle.
(webKitWebSrcDispose): Clear the player pointer.
(webKitWebSrcStop): Remove the client from the cached resource.
(webKitWebSrcStart): Use CachedResourceLoader to schedule a
CachedRawResource load for the media without buffering the data.
(webKitWebSrcNeedDataMainCb): Call CachedResource::setDefersLoading.
(webKitWebSrcEnoughDataMainCb): Ditto.
(webKitWebSrcSetMediaPlayer): Simply update the player pointer.
(StreamingClient::responseReceived): Update to the
CachedRawResourceClient API.
(StreamingClient::dataReceived): Ditto.
(StreamingClient::getOrCreateReadBuffer): Ditto.
(StreamingClient::notifyFinished): Ditto.

Location:
trunk/Source/WebCore
Files:
4 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r152775 r152778  
     12013-07-17  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GStreamer] webkitwebsrc: use SubResourceLoader
     4        https://bugs.webkit.org/show_bug.cgi?id=73743
     5
     6        Reviewed by Philippe Normand.
     7
     8        * GNUmakefile.list.am: Add new files to compilation.
     9        * PlatformEfl.cmake: Ditto.
     10        * PlatformGTK.cmake: Ditto.
     11        * loader/SubresourceLoader.h: Add getOrCreateReadBuffer() when
     12        using SOUP.
     13        * loader/cache/CachedRawResource.h:
     14        * loader/cache/CachedRawResourceClient.h:
     15        (WebCore::CachedRawResourceClient::getOrCreateReadBuffer): Added
     16        to allow the client to allocate the read buffer.
     17        * loader/cache/CachedResource.h:
     18        (WebCore::CachedResource::getOrCreateReadBuffer):
     19        * loader/soup/CachedRawResourceSoup.cpp: Added.
     20        (WebCore::CachedRawResource::getOrCreateReadBuffer): Iterate the
     21        clients until one returns a valid read buffer or return NULL to
     22        fallback to the default read buffer.
     23        * loader/soup/SubresourceLoaderSoup.cpp: Added.
     24        (WebCore::SubresourceLoader::getOrCreateReadBuffer): Call
     25        CachedResource::getOrCreateReadBuffer().
     26        * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
     27        (StreamingClient): Make this a CachedRawResourceClient.
     28        (_WebKitWebSrcPrivate): Remove frame and resourceHandle and add a
     29        cached resource handle.
     30        (webKitWebSrcDispose): Clear the player pointer.
     31        (webKitWebSrcStop): Remove the client from the cached resource.
     32        (webKitWebSrcStart): Use CachedResourceLoader to schedule a
     33        CachedRawResource load for the media without buffering the data.
     34        (webKitWebSrcNeedDataMainCb): Call CachedResource::setDefersLoading.
     35        (webKitWebSrcEnoughDataMainCb): Ditto.
     36        (webKitWebSrcSetMediaPlayer): Simply update the player pointer.
     37        (StreamingClient::responseReceived): Update to the
     38        CachedRawResourceClient API.
     39        (StreamingClient::dataReceived): Ditto.
     40        (StreamingClient::getOrCreateReadBuffer): Ditto.
     41        (StreamingClient::notifyFinished): Ditto.
     42
    1432013-07-17  Kwang Yul Seo  <skyul@company100.net>
    244
  • trunk/Source/WebCore/GNUmakefile.list.am

    r152702 r152778  
    41324132        Source/WebCore/loader/SubstituteData.h \
    41334133        Source/WebCore/loader/SubstituteResource.h \
     4134        Source/WebCore/loader/soup/CachedRawResourceSoup.cpp \
     4135        Source/WebCore/loader/soup/SubresourceLoaderSoup.cpp \
    41344136        Source/WebCore/loader/TextResourceDecoder.cpp \
    41354137        Source/WebCore/loader/TextResourceDecoder.h \
  • trunk/Source/WebCore/PlatformEfl.cmake

    r150240 r152778  
    3737
    3838    editing/atk/FrameSelectionAtk.cpp
     39
     40    loader/soup/CachedRawResourceSoup.cpp
     41    loader/soup/SubresourceLoaderSoup.cpp
    3942
    4043    page/efl/DragControllerEfl.cpp
  • trunk/Source/WebCore/PlatformGTK.cmake

    r152094 r152778  
    4242
    4343    editing/atk/FrameSelectionAtk.cpp
     44
     45    loader/soup/CachedRawResourceSoup.cpp
     46    loader/soup/SubresourceLoaderSoup.cpp
    4447
    4548    page/gtk/DragControllerGtk.cpp
  • trunk/Source/WebCore/loader/SubresourceLoader.h

    r151586 r152778  
    7474    virtual void releaseResources() OVERRIDE;
    7575
     76#if USE(SOUP)
     77    virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize) OVERRIDE;
     78#endif
     79
    7680    bool checkForHTTPStatusCodeError();
    7781
  • trunk/Source/WebCore/loader/cache/CachedRawResource.h

    r151586 r152778  
    6868    void notifyClientsDataWasReceived(const char* data, unsigned length);
    6969
     70#if USE(SOUP)
     71    virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize);
     72#endif
     73
    7074    unsigned long m_identifier;
    7175
  • trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h

    r148265 r152778  
    4242    virtual void dataReceived(CachedResource*, const char* /* data */, int /* length */) { }
    4343    virtual void redirectReceived(CachedResource*, ResourceRequest&, const ResourceResponse&) { }
     44#if USE(SOUP)
     45    virtual char* getOrCreateReadBuffer(CachedResource*, size_t /* requestedSize */, size_t& /* actualSize */) { return 0; }
     46#endif
    4447};
    4548
  • trunk/Source/WebCore/loader/cache/CachedResource.h

    r152219 r152778  
    256256#endif
    257257
     258#if USE(SOUP)
     259    virtual char* getOrCreateReadBuffer(size_t /* requestedSize */, size_t& /* actualSize */) { return 0; }
     260#endif
     261
    258262protected:
    259263    virtual void checkNotify();
  • trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp

    r151903 r152778  
    2323#if ENABLE(VIDEO) && USE(GSTREAMER)
    2424
    25 #include "Document.h"
    26 #include "Frame.h"
    27 #include "FrameLoader.h"
     25#include "CachedRawResource.h"
     26#include "CachedRawResourceClient.h"
     27#include "CachedResourceHandle.h"
     28#include "CachedResourceLoader.h"
     29#include "CachedResourceRequest.h"
    2830#include "GRefPtrGStreamer.h"
    2931#include "GStreamerVersioning.h"
    3032#include "MediaPlayer.h"
    31 #include "NetworkingContext.h"
    3233#include "NotImplemented.h"
    33 #include "ResourceHandleClient.h"
    34 #include "ResourceHandleInternal.h"
    3534#include "ResourceRequest.h"
    3635#include "ResourceResponse.h"
     
    4544using namespace WebCore;
    4645
    47 class StreamingClient : public ResourceHandleClient {
     46class StreamingClient : public CachedRawResourceClient {
    4847    WTF_MAKE_NONCOPYABLE(StreamingClient); WTF_MAKE_FAST_ALLOCATED;
    4948    public:
     
    5150        virtual ~StreamingClient();
    5251
    53         virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&);
    54         virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
    55 
    56         virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize);
    57 
    58         virtual void didReceiveData(ResourceHandle*, const char*, int, int);
    59         virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
    60         virtual void didFail(ResourceHandle*, const ResourceError&);
    61         virtual void wasBlocked(ResourceHandle*);
    62         virtual void cannotShowURL(ResourceHandle*);
    63 
    6452    private:
     53        // CachedResourceClient
     54        virtual void responseReceived(CachedResource*, const ResourceResponse&);
     55        virtual void dataReceived(CachedResource*, const char*, int);
     56        virtual void notifyFinished(CachedResource*);
     57        virtual char* getOrCreateReadBuffer(CachedResource*, size_t requestedSize, size_t& actualSize);
     58
    6559        WebKitWebSrc* m_src;
    6660};
     
    7266    gchar* uri;
    7367
    74     RefPtr<WebCore::Frame> frame;
    7568    WebCore::MediaPlayer* player;
    7669
    7770    StreamingClient* client;
    78     RefPtr<ResourceHandle> resourceHandle;
     71    CachedResourceHandle<CachedRawResource> resource;
    7972
    8073    guint64 offset;
     
    295288    }
    296289
     290    priv->player = 0;
     291
    297292    GST_CALL_PARENT(G_OBJECT_CLASS, dispose, (object));
    298293}
     
    367362    WebKitWebSrcPrivate* priv = src->priv;
    368363
    369     if (priv->resourceHandle) {
    370         priv->resourceHandle->cancel();
    371         priv->resourceHandle.release();
    372     }
    373     priv->resourceHandle = 0;
    374 
    375     if (priv->frame && !seeking)
    376         priv->frame.clear();
    377 
    378     priv->player = 0;
     364    if (priv->resource) {
     365        priv->resource->removeClient(priv->client);
     366        priv->resource = 0;
     367    }
     368
     369    if (priv->client) {
     370        delete priv->client;
     371        priv->client = 0;
     372    }
    379373
    380374    if (priv->buffer) {
     
    438432        return false;
    439433    }
    440    
     434
     435    ASSERT(priv->player);
     436
    441437    KURL url = KURL(KURL(), priv->uri);
    442438
    443439    ResourceRequest request(url);
    444440    request.setAllowCookies(true);
    445 
    446     NetworkingContext* context = 0;
    447     FrameLoader* loader = priv->frame ? priv->frame->loader() : 0;
    448     if (loader) {
    449         loader->addExtraFieldsToSubresourceRequest(request);
    450         context = loader->networkingContext();
    451     }
    452 
    453     if (priv->player)
    454         request.setHTTPReferrer(priv->player->referrer());
     441    request.setHTTPReferrer(priv->player->referrer());
    455442
    456443    // Let Apple web servers know we want to access their nice movie trailers.
     
    473460    request.setHTTPHeaderField("transferMode.dlna", "Streaming");
    474461
    475     priv->resourceHandle = ResourceHandle::create(context, request, priv->client, false, false);
    476     if (!priv->resourceHandle) {
    477         GST_ERROR_OBJECT(src, "Failed to create ResourceHandle");
     462    if (CachedResourceLoader* loader = priv->player->cachedResourceLoader()) {
     463        CachedResourceRequest cacheRequest(request, ResourceLoaderOptions(SendCallbacks, DoNotSniffContent, DoNotBufferData, DoNotAllowStoredCredentials, DoNotAskClientForCrossOriginCredentials, DoSecurityCheck, UseDefaultOriginRestrictionsForType));
     464        priv->resource = loader->requestRawResource(cacheRequest);
     465        if (priv->resource) {
     466            priv->client = new StreamingClient(src);
     467            priv->resource->addClient(priv->client);
     468        }
     469    }
     470
     471    if (!priv->resource) {
     472        GST_ERROR_OBJECT(src, "Failed to schedule resource load");
    478473        return false;
    479474    }
     
    677672    WebKitWebSrcPrivate* priv = src->priv;
    678673
    679     priv->resourceHandle->setDefersLoading(false);
     674    priv->resource->setDefersLoading(false);
    680675
    681676    GST_OBJECT_LOCK(src);
     
    707702    WebKitWebSrcPrivate* priv = src->priv;
    708703
    709     priv->resourceHandle->setDefersLoading(true);
     704    priv->resource->setDefersLoading(true);
    710705
    711706    GST_OBJECT_LOCK(src);
     
    770765void webKitWebSrcSetMediaPlayer(WebKitWebSrc* src, WebCore::MediaPlayer* player)
    771766{
    772     WebKitWebSrcPrivate* priv = src->priv;
    773     WebCore::Frame* frame = 0;
    774 
    775     WebCore::Document* document = player->mediaPlayerClient()->mediaPlayerOwningDocument();
    776     if (document)
    777         frame = document->frame();
    778 
    779     priv->frame = frame;
    780     priv->player = player;
     767    ASSERT(player);
     768    src->priv->player = player;
    781769}
    782770
     
    791779}
    792780
    793 void StreamingClient::willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&)
    794 {
    795 }
    796 
    797 void StreamingClient::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
     781void StreamingClient::responseReceived(CachedResource* resource, const ResourceResponse& response)
    798782{
    799783    WebKitWebSrcPrivate* priv = m_src->priv;
     
    884868}
    885869
    886 void StreamingClient::didReceiveData(ResourceHandle* handle, const char* data, int length, int)
     870void StreamingClient::dataReceived(CachedResource* resource, const char* data, int length)
    887871{
    888872    WebKitWebSrcPrivate* priv = m_src->priv;
     
    897881#endif
    898882
    899     if (priv->seekID || handle != priv->resourceHandle) {
     883    if (priv->seekID || resource != priv->resource) {
    900884        GST_DEBUG_OBJECT(m_src, "Seek in progress, ignoring data");
    901885        priv->buffer.clear();
     
    931915}
    932916
    933 char* StreamingClient::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize)
     917char* StreamingClient::getOrCreateReadBuffer(CachedResource*, size_t requestedSize, size_t& actualSize)
    934918{
    935919    WebKitWebSrcPrivate* priv = m_src->priv;
     
    949933}
    950934
    951 void StreamingClient::didFinishLoading(ResourceHandle*, double)
     935void StreamingClient::notifyFinished(CachedResource* resource)
    952936{
    953937    WebKitWebSrcPrivate* priv = m_src->priv;
     938
     939    if (resource->loadFailedOrCanceled()) {
     940        if (!resource->wasCanceled()) {
     941            const ResourceError& error = resource->resourceError();
     942            GST_ERROR_OBJECT(m_src, "Have failure: %s", error.localizedDescription().utf8().data());
     943            GST_ELEMENT_ERROR(m_src, RESOURCE, FAILED, ("%s", error.localizedDescription().utf8().data()), (0));
     944        }
     945        gst_app_src_end_of_stream(m_src->priv->appsrc);
     946        return;
     947    }
    954948
    955949    GST_DEBUG_OBJECT(m_src, "Have EOS");
     
    959953}
    960954
    961 void StreamingClient::didFail(ResourceHandle*, const ResourceError& error)
    962 {
    963     GST_ERROR_OBJECT(m_src, "Have failure: %s", error.localizedDescription().utf8().data());
    964     GST_ELEMENT_ERROR(m_src, RESOURCE, FAILED, ("%s", error.localizedDescription().utf8().data()), (0));
    965     gst_app_src_end_of_stream(m_src->priv->appsrc);
    966 }
    967 
    968 void StreamingClient::wasBlocked(ResourceHandle*)
    969 {
    970     GST_ERROR_OBJECT(m_src, "Request was blocked");
    971     GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Access to \"%s\" was blocked", m_src->priv->uri), (0));
    972 }
    973 
    974 void StreamingClient::cannotShowURL(ResourceHandle*)
    975 {
    976     GST_ERROR_OBJECT(m_src, "Cannot show URL");
    977     GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Can't show \"%s\"", m_src->priv->uri), (0));
    978 }
    979 
    980955#endif // USE(GSTREAMER)
    981956
Note: See TracChangeset for help on using the changeset viewer.