summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@digia.com>2014-03-20 15:57:31 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-03-27 17:04:35 +0100
commit9b75f92b9a3ab3216da79f390b49919266ca258f (patch)
tree86c489ea24969d7cbccd39abcd46d9977078985a
parent160e07ca411315f2c46cfecdabcce40fddb53976 (diff)
downloadqtwebkit-9b75f92b9a3ab3216da79f390b49919266ca258f.tar.gz
Fix loading nested mpegurls using GStreamer
If gstreamer tries to load an http source, we currently lose the context of where it is loaded from, which causes the load to fail. This patch caches a loading context when one is set on the outer most appsrc, and uses that for gstreamer requests until the outer most source is unloaded. This can have consequences if multiple webviews are open at the same time with different QNetworkAccessManagers, but this is considered unusual, and wouldn't work with the QtMultimedia either. Task-number: QTBUG-37636 Change-Id: I9d3b4d10705254629bc5fce7d76765077585caa2 Reviewed-by: Michael Bruning <michael.bruning@digia.com> Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
-rw-r--r--Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp31
1 files changed, 24 insertions, 7 deletions
diff --git a/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
index 12b306cc3..562587369 100644
--- a/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
+++ b/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
@@ -27,6 +27,7 @@
#include "CachedResourceHandle.h"
#include "CachedResourceLoader.h"
#include "CachedResourceRequest.h"
+#include "Frame.h"
#include "GRefPtrGStreamer.h"
#include "GStreamerVersioning.h"
#include "MediaPlayer.h"
@@ -46,6 +47,8 @@
using namespace WebCore;
+static CachedResourceLoader* s_cachedResourceLoader = 0;
+
class StreamingClient {
public:
StreamingClient(WebKitWebSrc*);
@@ -326,7 +329,10 @@ static void webKitWebSrcDispose(GObject* object)
WebKitWebSrc* src = WEBKIT_WEB_SRC(object);
WebKitWebSrcPrivate* priv = src->priv;
- priv->player = 0;
+ if (priv->player) {
+ priv->player = 0;
+ s_cachedResourceLoader = 0;
+ }
GST_CALL_PARENT(G_OBJECT_CLASS, dispose, (object));
}
@@ -462,7 +468,10 @@ static gboolean webKitWebSrcStop(WebKitWebSrc* src)
if (!seeking) {
priv->size = 0;
priv->requestedOffset = 0;
- priv->player = 0;
+ if (priv->player) {
+ priv->player = 0;
+ s_cachedResourceLoader = 0;
+ }
}
locker.unlock();
@@ -524,10 +533,14 @@ static gboolean webKitWebSrcStart(WebKitWebSrc* src)
// Needed to use DLNA streaming servers
request.setHTTPHeaderField("transferMode.dlna", "Streaming");
- if (priv->player) {
- if (CachedResourceLoader* loader = priv->player->cachedResourceLoader())
- priv->client = new CachedResourceStreamingClient(src, loader, request);
- }
+ CachedResourceLoader* loader = 0;
+ if (priv->player)
+ loader = priv->player->cachedResourceLoader();
+ else
+ loader = s_cachedResourceLoader;
+
+ if (loader)
+ priv->client = new CachedResourceStreamingClient(src, loader, request);
if (!priv->client)
priv->client = new ResourceHandleStreamingClient(src, request);
@@ -868,6 +881,7 @@ void webKitWebSrcSetMediaPlayer(WebKitWebSrc* src, WebCore::MediaPlayer* player)
ASSERT(player);
GMutexLocker locker(GST_OBJECT_GET_LOCK(src));
src->priv->player = player;
+ s_cachedResourceLoader = player->cachedResourceLoader();
}
StreamingClient::StreamingClient(WebKitWebSrc* src)
@@ -1130,7 +1144,10 @@ void CachedResourceStreamingClient::notifyFinished(CachedResource* resource)
ResourceHandleStreamingClient::ResourceHandleStreamingClient(WebKitWebSrc* src, const ResourceRequest& request)
: StreamingClient(src)
{
- m_resource = ResourceHandle::create(0 /*context*/, request, this, false, false);
+ NetworkingContext* context = 0;
+ if (s_cachedResourceLoader)
+ context = s_cachedResourceLoader->frame()->loader()->networkingContext();
+ m_resource = ResourceHandle::create(context, request, this, false, false);
}
ResourceHandleStreamingClient::~ResourceHandleStreamingClient()