Diff
Modified: trunk/Source/WebCore/ChangeLog (152777 => 152778)
--- trunk/Source/WebCore/ChangeLog 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/ChangeLog 2013-07-17 09:39:21 UTC (rev 152778)
@@ -1,3 +1,45 @@
+2013-07-17 Carlos Garcia Campos <[email protected]>
+
+ [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.
+
2013-07-17 Kwang Yul Seo <[email protected]>
Remove unused member variable m_domURL from WorkerGlobalScope
Modified: trunk/Source/WebCore/GNUmakefile.list.am (152777 => 152778)
--- trunk/Source/WebCore/GNUmakefile.list.am 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/GNUmakefile.list.am 2013-07-17 09:39:21 UTC (rev 152778)
@@ -4131,6 +4131,8 @@
Source/WebCore/loader/SubresourceLoader.h \
Source/WebCore/loader/SubstituteData.h \
Source/WebCore/loader/SubstituteResource.h \
+ Source/WebCore/loader/soup/CachedRawResourceSoup.cpp \
+ Source/WebCore/loader/soup/SubresourceLoaderSoup.cpp \
Source/WebCore/loader/TextResourceDecoder.cpp \
Source/WebCore/loader/TextResourceDecoder.h \
Source/WebCore/loader/ThreadableLoaderClient.h \
Modified: trunk/Source/WebCore/PlatformEfl.cmake (152777 => 152778)
--- trunk/Source/WebCore/PlatformEfl.cmake 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/PlatformEfl.cmake 2013-07-17 09:39:21 UTC (rev 152778)
@@ -37,6 +37,9 @@
editing/atk/FrameSelectionAtk.cpp
+ loader/soup/CachedRawResourceSoup.cpp
+ loader/soup/SubresourceLoaderSoup.cpp
+
page/efl/DragControllerEfl.cpp
page/efl/EventHandlerEfl.cpp
Modified: trunk/Source/WebCore/PlatformGTK.cmake (152777 => 152778)
--- trunk/Source/WebCore/PlatformGTK.cmake 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/PlatformGTK.cmake 2013-07-17 09:39:21 UTC (rev 152778)
@@ -42,6 +42,9 @@
editing/atk/FrameSelectionAtk.cpp
+ loader/soup/CachedRawResourceSoup.cpp
+ loader/soup/SubresourceLoaderSoup.cpp
+
page/gtk/DragControllerGtk.cpp
page/gtk/EventHandlerGtk.cpp
Modified: trunk/Source/WebCore/loader/SubresourceLoader.h (152777 => 152778)
--- trunk/Source/WebCore/loader/SubresourceLoader.h 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/loader/SubresourceLoader.h 2013-07-17 09:39:21 UTC (rev 152778)
@@ -73,6 +73,10 @@
#endif
virtual void releaseResources() OVERRIDE;
+#if USE(SOUP)
+ virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize) OVERRIDE;
+#endif
+
bool checkForHTTPStatusCodeError();
void didReceiveDataOrBuffer(const char*, int, PassRefPtr<SharedBuffer>, long long encodedDataLength, DataPayloadType);
Modified: trunk/Source/WebCore/loader/cache/CachedRawResource.h (152777 => 152778)
--- trunk/Source/WebCore/loader/cache/CachedRawResource.h 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/loader/cache/CachedRawResource.h 2013-07-17 09:39:21 UTC (rev 152778)
@@ -67,6 +67,10 @@
const char* calculateIncrementalDataChunk(ResourceBuffer*, unsigned& incrementalDataLength);
void notifyClientsDataWasReceived(const char* data, unsigned length);
+#if USE(SOUP)
+ virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize);
+#endif
+
unsigned long m_identifier;
struct RedirectPair {
Modified: trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h (152777 => 152778)
--- trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h 2013-07-17 09:39:21 UTC (rev 152778)
@@ -41,6 +41,9 @@
virtual void responseReceived(CachedResource*, const ResourceResponse&) { }
virtual void dataReceived(CachedResource*, const char* /* data */, int /* length */) { }
virtual void redirectReceived(CachedResource*, ResourceRequest&, const ResourceResponse&) { }
+#if USE(SOUP)
+ virtual char* getOrCreateReadBuffer(CachedResource*, size_t /* requestedSize */, size_t& /* actualSize */) { return 0; }
+#endif
};
}
Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (152777 => 152778)
--- trunk/Source/WebCore/loader/cache/CachedResource.h 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h 2013-07-17 09:39:21 UTC (rev 152778)
@@ -255,6 +255,10 @@
void tryReplaceEncodedData(PassRefPtr<SharedBuffer>);
#endif
+#if USE(SOUP)
+ virtual char* getOrCreateReadBuffer(size_t /* requestedSize */, size_t& /* actualSize */) { return 0; }
+#endif
+
protected:
virtual void checkNotify();
Added: trunk/Source/WebCore/loader/soup/CachedRawResourceSoup.cpp (0 => 152778)
--- trunk/Source/WebCore/loader/soup/CachedRawResourceSoup.cpp (rev 0)
+++ trunk/Source/WebCore/loader/soup/CachedRawResourceSoup.cpp 2013-07-17 09:39:21 UTC (rev 152778)
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2013 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "CachedRawResource.h"
+
+#include "CachedRawResourceClient.h"
+#include "CachedResourceClientWalker.h"
+
+namespace WebCore {
+
+char* CachedRawResource::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize)
+{
+ CachedResourceClientWalker<CachedRawResourceClient> w(m_clients);
+ while (CachedRawResourceClient* c = w.next()) {
+ if (char* bufferPtr = c->getOrCreateReadBuffer(this, requestedSize, actualSize))
+ return bufferPtr;
+ }
+
+ return 0;
+}
+
+} // namespace WebCore
Added: trunk/Source/WebCore/loader/soup/ResourceLoaderSoup.cpp (0 => 152778)
--- trunk/Source/WebCore/loader/soup/ResourceLoaderSoup.cpp (rev 0)
+++ trunk/Source/WebCore/loader/soup/ResourceLoaderSoup.cpp 2013-07-17 09:39:21 UTC (rev 152778)
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2013 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "ResourceLoader.h"
+
+namespace WebCore {
+
+char* ResourceLoader::getOrCreateReadBuffer(size_t requestedLength, size_t& actualLength)
+{
+ actualLength = requestedLength;
+ if (!m_readBuffer)
+ m_readBuffer.set(static_cast<char*>(g_malloc(requestedLength)));
+ return m_readBuffer.get();
+}
+
+} // namespace WebCore
Added: trunk/Source/WebCore/loader/soup/SubresourceLoaderSoup.cpp (0 => 152778)
--- trunk/Source/WebCore/loader/soup/SubresourceLoaderSoup.cpp (rev 0)
+++ trunk/Source/WebCore/loader/soup/SubresourceLoaderSoup.cpp 2013-07-17 09:39:21 UTC (rev 152778)
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2013 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "SubresourceLoader.h"
+
+#include "CachedResource.h"
+
+namespace WebCore {
+
+char* SubresourceLoader::getOrCreateReadBuffer(size_t requestedLength, size_t& actualLength)
+{
+ return m_resource->getOrCreateReadBuffer(requestedLength, actualLength);
+}
+
+} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (152777 => 152778)
--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2013-07-17 09:16:53 UTC (rev 152777)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2013-07-17 09:39:21 UTC (rev 152778)
@@ -22,16 +22,15 @@
#if ENABLE(VIDEO) && USE(GSTREAMER)
-#include "Document.h"
-#include "Frame.h"
-#include "FrameLoader.h"
+#include "CachedRawResource.h"
+#include "CachedRawResourceClient.h"
+#include "CachedResourceHandle.h"
+#include "CachedResourceLoader.h"
+#include "CachedResourceRequest.h"
#include "GRefPtrGStreamer.h"
#include "GStreamerVersioning.h"
#include "MediaPlayer.h"
-#include "NetworkingContext.h"
#include "NotImplemented.h"
-#include "ResourceHandleClient.h"
-#include "ResourceHandleInternal.h"
#include "ResourceRequest.h"
#include "ResourceResponse.h"
#include <gst/app/gstappsrc.h>
@@ -44,24 +43,19 @@
using namespace WebCore;
-class StreamingClient : public ResourceHandleClient {
+class StreamingClient : public CachedRawResourceClient {
WTF_MAKE_NONCOPYABLE(StreamingClient); WTF_MAKE_FAST_ALLOCATED;
public:
StreamingClient(WebKitWebSrc*);
virtual ~StreamingClient();
- virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&);
- virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
-
- virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize);
-
- virtual void didReceiveData(ResourceHandle*, const char*, int, int);
- virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
- virtual void didFail(ResourceHandle*, const ResourceError&);
- virtual void wasBlocked(ResourceHandle*);
- virtual void cannotShowURL(ResourceHandle*);
-
private:
+ // CachedResourceClient
+ virtual void responseReceived(CachedResource*, const ResourceResponse&);
+ virtual void dataReceived(CachedResource*, const char*, int);
+ virtual void notifyFinished(CachedResource*);
+ virtual char* getOrCreateReadBuffer(CachedResource*, size_t requestedSize, size_t& actualSize);
+
WebKitWebSrc* m_src;
};
@@ -71,11 +65,10 @@
GstPad* srcpad;
gchar* uri;
- RefPtr<WebCore::Frame> frame;
WebCore::MediaPlayer* player;
StreamingClient* client;
- RefPtr<ResourceHandle> resourceHandle;
+ CachedResourceHandle<CachedRawResource> resource;
guint64 offset;
guint64 size;
@@ -294,6 +287,8 @@
priv->buffer.clear();
}
+ priv->player = 0;
+
GST_CALL_PARENT(G_OBJECT_CLASS, dispose, (object));
}
@@ -366,17 +361,16 @@
{
WebKitWebSrcPrivate* priv = src->priv;
- if (priv->resourceHandle) {
- priv->resourceHandle->cancel();
- priv->resourceHandle.release();
+ if (priv->resource) {
+ priv->resource->removeClient(priv->client);
+ priv->resource = 0;
}
- priv->resourceHandle = 0;
- if (priv->frame && !seeking)
- priv->frame.clear();
+ if (priv->client) {
+ delete priv->client;
+ priv->client = 0;
+ }
- priv->player = 0;
-
if (priv->buffer) {
#ifdef GST_API_VERSION_1
unmapGstBuffer(priv->buffer.get());
@@ -437,22 +431,15 @@
GST_ERROR_OBJECT(src, "No URI provided");
return false;
}
-
+
+ ASSERT(priv->player);
+
KURL url = "" priv->uri);
ResourceRequest request(url);
request.setAllowCookies(true);
+ request.setHTTPReferrer(priv->player->referrer());
- NetworkingContext* context = 0;
- FrameLoader* loader = priv->frame ? priv->frame->loader() : 0;
- if (loader) {
- loader->addExtraFieldsToSubresourceRequest(request);
- context = loader->networkingContext();
- }
-
- if (priv->player)
- request.setHTTPReferrer(priv->player->referrer());
-
// Let Apple web servers know we want to access their nice movie trailers.
if (!g_ascii_strcasecmp("movies.apple.com", url.host().utf8().data())
|| !g_ascii_strcasecmp("trailers.apple.com", url.host().utf8().data()))
@@ -472,9 +459,17 @@
// Needed to use DLNA streaming servers
request.setHTTPHeaderField("transferMode.dlna", "Streaming");
- priv->resourceHandle = ResourceHandle::create(context, request, priv->client, false, false);
- if (!priv->resourceHandle) {
- GST_ERROR_OBJECT(src, "Failed to create ResourceHandle");
+ if (CachedResourceLoader* loader = priv->player->cachedResourceLoader()) {
+ CachedResourceRequest cacheRequest(request, ResourceLoaderOptions(SendCallbacks, DoNotSniffContent, DoNotBufferData, DoNotAllowStoredCredentials, DoNotAskClientForCrossOriginCredentials, DoSecurityCheck, UseDefaultOriginRestrictionsForType));
+ priv->resource = loader->requestRawResource(cacheRequest);
+ if (priv->resource) {
+ priv->client = new StreamingClient(src);
+ priv->resource->addClient(priv->client);
+ }
+ }
+
+ if (!priv->resource) {
+ GST_ERROR_OBJECT(src, "Failed to schedule resource load");
return false;
}
@@ -676,7 +671,7 @@
{
WebKitWebSrcPrivate* priv = src->priv;
- priv->resourceHandle->setDefersLoading(false);
+ priv->resource->setDefersLoading(false);
GST_OBJECT_LOCK(src);
priv->paused = FALSE;
@@ -706,7 +701,7 @@
{
WebKitWebSrcPrivate* priv = src->priv;
- priv->resourceHandle->setDefersLoading(true);
+ priv->resource->setDefersLoading(true);
GST_OBJECT_LOCK(src);
priv->paused = TRUE;
@@ -769,15 +764,8 @@
void webKitWebSrcSetMediaPlayer(WebKitWebSrc* src, WebCore::MediaPlayer* player)
{
- WebKitWebSrcPrivate* priv = src->priv;
- WebCore::Frame* frame = 0;
-
- WebCore::Document* document = player->mediaPlayerClient()->mediaPlayerOwningDocument();
- if (document)
- frame = document->frame();
-
- priv->frame = frame;
- priv->player = player;
+ ASSERT(player);
+ src->priv->player = player;
}
StreamingClient::StreamingClient(WebKitWebSrc* src) : m_src(src)
@@ -790,12 +778,8 @@
}
-void StreamingClient::willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&)
+void StreamingClient::responseReceived(CachedResource* resource, const ResourceResponse& response)
{
-}
-
-void StreamingClient::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
-{
WebKitWebSrcPrivate* priv = m_src->priv;
GST_DEBUG_OBJECT(m_src, "Received response: %d", response.httpStatusCode());
@@ -883,7 +867,7 @@
notifyGstTagsOnPad(GST_ELEMENT(m_src), m_src->priv->srcpad, tags);
}
-void StreamingClient::didReceiveData(ResourceHandle* handle, const char* data, int length, int)
+void StreamingClient::dataReceived(CachedResource* resource, const char* data, int length)
{
WebKitWebSrcPrivate* priv = m_src->priv;
@@ -896,7 +880,7 @@
unmapGstBuffer(priv->buffer.get());
#endif
- if (priv->seekID || handle != priv->resourceHandle) {
+ if (priv->seekID || resource != priv->resource) {
GST_DEBUG_OBJECT(m_src, "Seek in progress, ignoring data");
priv->buffer.clear();
return;
@@ -930,7 +914,7 @@
GST_ELEMENT_ERROR(m_src, CORE, FAILED, (0), (0));
}
-char* StreamingClient::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize)
+char* StreamingClient::getOrCreateReadBuffer(CachedResource*, size_t requestedSize, size_t& actualSize)
{
WebKitWebSrcPrivate* priv = m_src->priv;
@@ -948,34 +932,25 @@
return getGstBufferDataPointer(buffer);
}
-void StreamingClient::didFinishLoading(ResourceHandle*, double)
+void StreamingClient::notifyFinished(CachedResource* resource)
{
WebKitWebSrcPrivate* priv = m_src->priv;
+ if (resource->loadFailedOrCanceled()) {
+ if (!resource->wasCanceled()) {
+ const ResourceError& error = resource->resourceError();
+ GST_ERROR_OBJECT(m_src, "Have failure: %s", error.localizedDescription().utf8().data());
+ GST_ELEMENT_ERROR(m_src, RESOURCE, FAILED, ("%s", error.localizedDescription().utf8().data()), (0));
+ }
+ gst_app_src_end_of_stream(m_src->priv->appsrc);
+ return;
+ }
+
GST_DEBUG_OBJECT(m_src, "Have EOS");
if (!priv->seekID)
gst_app_src_end_of_stream(m_src->priv->appsrc);
}
-void StreamingClient::didFail(ResourceHandle*, const ResourceError& error)
-{
- GST_ERROR_OBJECT(m_src, "Have failure: %s", error.localizedDescription().utf8().data());
- GST_ELEMENT_ERROR(m_src, RESOURCE, FAILED, ("%s", error.localizedDescription().utf8().data()), (0));
- gst_app_src_end_of_stream(m_src->priv->appsrc);
-}
-
-void StreamingClient::wasBlocked(ResourceHandle*)
-{
- GST_ERROR_OBJECT(m_src, "Request was blocked");
- GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Access to \"%s\" was blocked", m_src->priv->uri), (0));
-}
-
-void StreamingClient::cannotShowURL(ResourceHandle*)
-{
- GST_ERROR_OBJECT(m_src, "Cannot show URL");
- GST_ELEMENT_ERROR(m_src, RESOURCE, OPEN_READ, ("Can't show \"%s\"", m_src->priv->uri), (0));
-}
-
#endif // USE(GSTREAMER)