Log Message
[SOUP] Move default buffer handling from ResourceHandleClient to ResourceHandlesoup https://bugs.webkit.org/show_bug.cgi?id=115364
Reviewed by Martin Robinson. ResourceHandleClient that is cross-platform file is not the right place for the default ResourceHandle read buffer. We can make getBuffer return 0 by default and handle it in ResourceHandleSoup, creating a default buffer when the client doesn't provide one. * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp: (StreamingClient::getOrCreateReadBuffer): Adapt to API change. * platform/network/ResourceHandle.h: (ResourceHandle): Add ensureReadBuffer(). * platform/network/ResourceHandleClient.cpp: (WebCore::ResourceHandleClient::~ResourceHandleClient): Remove soup specific code. * platform/network/ResourceHandleClient.h: (WebCore::ResourceHandleClient::getOrCreateReadBuffer): Rename getBuffer() as getOrCreateReadBuffer() and use a reference for the out parameter instead of a pointer. (ResourceHandleClient): Remove soup specific code. * platform/network/ResourceHandleInternal.h: (WebCore::ResourceHandleInternal::ResourceHandleInternal): Rename m_buffer and m_bufferSize as m_readBufferPtr and m_readBufferSize and add m_readBuffer to be used as default read buffer. * platform/network/soup/ResourceHandleSoup.cpp: (WebCore::ResourceHandle::ensureReadBuffer): Helper function to make usre we have a read buffer before a read operation. It first checks if the client provides a buffer and if it doesn't it creates or reuses the default buffer. (WebCore::redirectSkipCallback): Call ensureReadBuffer() and adapt to variable name changes. (WebCore::cleanupSoupRequestOperation): Adapt to variable name changes. (WebCore::nextMultipartResponsePartCallback): Call ensureReadBuffer() and adapt to variable name changes. (WebCore::sendRequestCallback): Ditto. (WebCore::readCallback): Ditto.
Modified Paths
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp
- trunk/Source/WebCore/platform/network/ResourceHandle.h
- trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp
- trunk/Source/WebCore/platform/network/ResourceHandleClient.h
- trunk/Source/WebCore/platform/network/ResourceHandleInternal.h
- trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp
Diff
Modified: trunk/Source/WebCore/ChangeLog (149382 => 149383)
--- trunk/Source/WebCore/ChangeLog 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/ChangeLog 2013-04-30 18:20:16 UTC (rev 149383)
@@ -1,3 +1,45 @@
+2013-04-30 Carlos Garcia Campos <[email protected]>
+
+ [SOUP] Move default buffer handling from ResourceHandleClient to ResourceHandlesoup
+ https://bugs.webkit.org/show_bug.cgi?id=115364
+
+ Reviewed by Martin Robinson.
+
+ ResourceHandleClient that is cross-platform file is not the right
+ place for the default ResourceHandle read buffer. We can make
+ getBuffer return 0 by default and handle it in ResourceHandleSoup,
+ creating a default buffer when the client doesn't provide one.
+
+ * platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp:
+ (StreamingClient::getOrCreateReadBuffer): Adapt to API change.
+ * platform/network/ResourceHandle.h:
+ (ResourceHandle): Add ensureReadBuffer().
+ * platform/network/ResourceHandleClient.cpp:
+ (WebCore::ResourceHandleClient::~ResourceHandleClient): Remove
+ soup specific code.
+ * platform/network/ResourceHandleClient.h:
+ (WebCore::ResourceHandleClient::getOrCreateReadBuffer): Rename
+ getBuffer() as getOrCreateReadBuffer() and use a reference for the
+ out parameter instead of a pointer.
+ (ResourceHandleClient): Remove soup specific code.
+ * platform/network/ResourceHandleInternal.h:
+ (WebCore::ResourceHandleInternal::ResourceHandleInternal): Rename
+ m_buffer and m_bufferSize as m_readBufferPtr and m_readBufferSize
+ and add m_readBuffer to be used as default read buffer.
+ * platform/network/soup/ResourceHandleSoup.cpp:
+ (WebCore::ResourceHandle::ensureReadBuffer): Helper function to
+ make usre we have a read buffer before a read operation. It first
+ checks if the client provides a buffer and if it doesn't it
+ creates or reuses the default buffer.
+ (WebCore::redirectSkipCallback): Call ensureReadBuffer() and adapt
+ to variable name changes.
+ (WebCore::cleanupSoupRequestOperation): Adapt to variable name
+ changes.
+ (WebCore::nextMultipartResponsePartCallback): Call
+ ensureReadBuffer() and adapt to variable name changes.
+ (WebCore::sendRequestCallback): Ditto.
+ (WebCore::readCallback): Ditto.
+
2013-04-30 Andreas Kling <[email protected]>
REGRESSION(r149287): Assertion failure in fast/frames/flattening/iframe-flattening-crash.html
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp (149382 => 149383)
--- trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2013-04-30 18:20:16 UTC (rev 149383)
@@ -53,7 +53,7 @@
virtual void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&);
virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
- virtual char* getBuffer(int, int*);
+ virtual char* getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize);
virtual void didReceiveData(ResourceHandle*, const char*, int, int);
virtual void didFinishLoading(ResourceHandle*, double /*finishTime*/);
@@ -924,7 +924,7 @@
GST_ELEMENT_ERROR(m_src, CORE, FAILED, (0), (0));
}
-char* StreamingClient::getBuffer(int requestedSize, int* actualSize)
+char* StreamingClient::getOrCreateReadBuffer(size_t requestedSize, size_t& actualSize)
{
WebKitWebSrcPrivate* priv = m_src->priv;
@@ -938,7 +938,7 @@
priv->buffer = adoptGRef(buffer);
- *actualSize = getGstBufferSize(buffer);
+ actualSize = getGstBufferSize(buffer);
return getGstBufferDataPointer(buffer);
}
Modified: trunk/Source/WebCore/platform/network/ResourceHandle.h (149382 => 149383)
--- trunk/Source/WebCore/platform/network/ResourceHandle.h 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandle.h 2013-04-30 18:20:16 UTC (rev 149383)
@@ -167,6 +167,7 @@
void sendPendingRequest();
bool shouldUseCredentialStorage();
bool cancelledOrClientless();
+ void ensureReadBuffer();
static SoupSession* defaultSession();
static uint64_t getSoupRequestInitiatingPageID(SoupRequest*);
static void setHostAllowsAnyHTTPSCertificate(const String&);
Modified: trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp (149382 => 149383)
--- trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandleClient.cpp 2013-04-30 18:20:16 UTC (rev 149383)
@@ -29,27 +29,14 @@
#include "ResourceHandle.h"
#include "SharedBuffer.h"
-#if USE(SOUP)
-#include <glib.h>
-#endif
-
namespace WebCore {
ResourceHandleClient::ResourceHandleClient()
-#if USE(SOUP)
- : m_buffer(0)
-#endif
{
}
ResourceHandleClient::~ResourceHandleClient()
{
-#if USE(SOUP)
- if (m_buffer) {
- g_free(m_buffer);
- m_buffer = 0;
- }
-#endif
}
void ResourceHandleClient::willSendRequestAsync(ResourceHandle* handle, const ResourceRequest& request, const ResourceResponse& /*redirectResponse*/)
@@ -86,16 +73,4 @@
didReceiveData(handle, buffer->data(), buffer->size(), encodedDataLength);
}
-#if USE(SOUP)
-char* ResourceHandleClient::getBuffer(int requestedLength, int* actualLength)
-{
- *actualLength = requestedLength;
-
- if (!m_buffer)
- m_buffer = static_cast<char*>(g_malloc(requestedLength));
-
- return m_buffer;
}
-#endif
-
-}
Modified: trunk/Source/WebCore/platform/network/ResourceHandleClient.h (149382 => 149383)
--- trunk/Source/WebCore/platform/network/ResourceHandleClient.h 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandleClient.h 2013-04-30 18:20:16 UTC (rev 149383)
@@ -99,7 +99,7 @@
#endif
#if USE(SOUP)
- virtual char* getBuffer(int requestedLength, int* actualLength);
+ virtual char* getOrCreateReadBuffer(size_t requestedLength, size_t& actualLength) { return 0; }
#endif
virtual bool shouldUseCredentialStorage(ResourceHandle*) { return false; }
@@ -122,10 +122,6 @@
virtual bool shouldCacheResponse(ResourceHandle*, CFCachedURLResponseRef) { return true; }
#endif
-#if USE(SOUP)
-private:
- char* m_buffer;
-#endif
};
}
Modified: trunk/Source/WebCore/platform/network/ResourceHandleInternal.h (149382 => 149383)
--- trunk/Source/WebCore/platform/network/ResourceHandleInternal.h 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/ResourceHandleInternal.h 2013-04-30 18:20:16 UTC (rev 149383)
@@ -48,6 +48,7 @@
#if USE(SOUP)
#include <libsoup/soup.h>
+#include <wtf/gobject/GOwnPtr.h>
#include <wtf/gobject/GRefPtr.h>
class Frame;
#endif
@@ -110,8 +111,8 @@
#endif
#if USE(SOUP)
, m_cancelled(false)
- , m_buffer(0)
- , m_bufferSize(0)
+ , m_readBufferPtr(0)
+ , m_readBufferSize(0)
, m_bodySize(0)
, m_bodyDataSent(0)
, m_redirectCount(0)
@@ -198,8 +199,9 @@
GRefPtr<GCancellable> m_cancellable;
GRefPtr<GAsyncResult> m_deferredResult;
GRefPtr<GSource> m_timeoutSource;
- char* m_buffer;
- int m_bufferSize;
+ GOwnPtr<char> m_defaultReadBuffer;
+ char* m_readBufferPtr;
+ size_t m_readBufferSize;
unsigned long m_bodySize;
unsigned long m_bodyDataSent;
SoupSession* soupSession();
Modified: trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp (149382 => 149383)
--- trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp 2013-04-30 18:09:52 UTC (rev 149382)
+++ trunk/Source/WebCore/platform/network/soup/ResourceHandleSoup.cpp 2013-04-30 18:20:16 UTC (rev 149383)
@@ -76,8 +76,6 @@
namespace WebCore {
-#define READ_BUFFER_SIZE 8192
-
inline static void soupLogPrinter(SoupLogger*, SoupLoggerLogLevel, char direction, const char* data, gpointer)
{
#if LOG_DISABLED
@@ -304,6 +302,28 @@
return getInternal()->m_cancelled;
}
+void ResourceHandle::ensureReadBuffer()
+{
+ ResourceHandleInternal* d = getInternal();
+
+ static const size_t defaultReadBufferSize = 8192;
+ size_t bufferSize;
+ char* bufferPtr = client()->getOrCreateReadBuffer(defaultReadBufferSize, bufferSize);
+ if (bufferPtr) {
+ d->m_defaultReadBuffer.clear();
+ d->m_readBufferPtr = bufferPtr;
+ d->m_readBufferSize = bufferSize;
+ } else if (!d->m_defaultReadBuffer) {
+ d->m_defaultReadBuffer.set(static_cast<char*>(g_malloc(defaultReadBufferSize)));
+ d->m_readBufferPtr = d->m_defaultReadBuffer.get();
+ d->m_readBufferSize = defaultReadBufferSize;
+ } else
+ d->m_readBufferPtr = d->m_defaultReadBuffer.get();
+
+ ASSERT(d->m_readBufferPtr);
+ ASSERT(d->m_readBufferSize);
+}
+
static bool isAuthenticationFailureStatusCode(int httpStatusCode)
{
return httpStatusCode == SOUP_STATUS_PROXY_AUTHENTICATION_REQUIRED || httpStatusCode == SOUP_STATUS_UNAUTHORIZED;
@@ -512,8 +532,8 @@
}
if (bytesSkipped > 0) {
- d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
- g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize, G_PRIORITY_DEFAULT,
+ handle->ensureReadBuffer();
+ g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize, G_PRIORITY_DEFAULT,
d->m_cancellable.get(), redirectSkipCallback, handle.get());
return;
}
@@ -554,10 +574,10 @@
d->m_soupMessage.clear();
}
- if (d->m_buffer) {
- d->m_buffer = 0;
- d->m_bufferSize = 0;
- }
+ if (d->m_readBufferPtr)
+ d->m_readBufferPtr = 0;
+ if (!d->m_defaultReadBuffer)
+ d->m_readBufferSize = 0;
if (d->m_timeoutSource) {
g_source_destroy(d->m_timeoutSource.get());
@@ -627,8 +647,8 @@
return;
}
- d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
- g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize,
+ handle->ensureReadBuffer();
+ g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize,
G_PRIORITY_DEFAULT, d->m_cancellable.get(), readCallback, handle.get());
}
@@ -658,7 +678,7 @@
return;
}
- ASSERT(!d->m_buffer);
+ ASSERT(!d->m_readBufferPtr);
if (soupMessage) {
if (SOUP_STATUS_IS_REDIRECTION(soupMessage->status_code) && shouldRedirect(handle.get())) {
@@ -666,8 +686,8 @@
// We use read_async() rather than skip_async() to work around
// https://bugzilla.gnome.org/show_bug.cgi?id=691489 until we can
// depend on glib > 2.35.4
- d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
- g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize, G_PRIORITY_DEFAULT,
+ handle->ensureReadBuffer();
+ g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize, G_PRIORITY_DEFAULT,
d->m_cancellable.get(), redirectSkipCallback, handle.get());
return;
}
@@ -707,9 +727,9 @@
d->m_inputStream = inputStream;
- d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
- g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize,
- G_PRIORITY_DEFAULT, d->m_cancellable.get(), readCallback, handle.get());
+ handle->ensureReadBuffer();
+ g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize,
+ G_PRIORITY_DEFAULT, d->m_cancellable.get(), readCallback, handle.get());
}
static bool addFileToSoupMessageBody(SoupMessage* message, const String& fileNameString, size_t offset, size_t lengthToSend, unsigned long& totalBodySize)
@@ -1321,7 +1341,7 @@
// It's mandatory to have sent a response before sending data
ASSERT(!d->m_response.isNull());
- handle->client()->didReceiveData(handle.get(), d->m_buffer, bytesRead, bytesRead);
+ handle->client()->didReceiveData(handle.get(), d->m_readBufferPtr, bytesRead, bytesRead);
// didReceiveData may cancel the load, which may release the last reference.
if (handle->cancelledOrClientless()) {
@@ -1329,9 +1349,9 @@
return;
}
- d->m_buffer = handle->client()->getBuffer(READ_BUFFER_SIZE, &d->m_bufferSize);
- g_input_stream_read_async(d->m_inputStream.get(), d->m_buffer, d->m_bufferSize, G_PRIORITY_DEFAULT,
- d->m_cancellable.get(), readCallback, handle.get());
+ handle->ensureReadBuffer();
+ g_input_stream_read_async(d->m_inputStream.get(), d->m_readBufferPtr, d->m_readBufferSize, G_PRIORITY_DEFAULT,
+ d->m_cancellable.get(), readCallback, handle.get());
}
static gboolean requestTimeoutCallback(gpointer data)
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
