Diff
Modified: trunk/Source/WebCore/ChangeLog (134261 => 134262)
--- trunk/Source/WebCore/ChangeLog 2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/ChangeLog 2012-11-12 19:13:08 UTC (rev 134262)
@@ -1,3 +1,25 @@
+2012-11-12 Allan Sandfeld Jensen <[email protected]>
+
+ Move resolving blob references to FormData.
+ https://bugs.webkit.org/show_bug.cgi?id=101754
+
+ Reviewed by Simon Hausmann.
+
+ Resolving Blob-references to a set of just File and Data is done similar by several platforms.
+ This patch adds a generic implementation in FormData and uses that from CFNetwork, Qt and
+ BlackBerry network implementation.
+
+ * platform/network/FormData.cpp:
+ (WebCore::appendBlobResolved):
+ (WebCore::FormData::resolveBlobReferences):
+ * platform/network/FormData.h:
+ * platform/network/blackberry/ResourceRequestBlackBerry.cpp:
+ (WebCore::ResourceRequest::initializePlatformRequest):
+ * platform/network/cf/FormDataStreamCFNet.cpp:
+ (WebCore::setHTTPBody):
+ * platform/network/qt/QNetworkReplyHandler.cpp:
+ (WebCore::FormDataIODevice::prepareFormElements):
+
2012-11-12 Zeno Albisser <[email protected]>
GraphicsSurfaceGLX does not handle transparency correctly.
Modified: trunk/Source/WebCore/platform/network/FormData.cpp (134261 => 134262)
--- trunk/Source/WebCore/platform/network/FormData.cpp 2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/FormData.cpp 2012-11-12 19:13:08 UTC (rev 134262)
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved.
* Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -23,6 +24,7 @@
#include "FormData.h"
#include "BlobData.h"
+#include "BlobRegistryImpl.h"
#include "BlobURL.h"
#include "Chrome.h"
#include "ChromeClient.h"
@@ -317,6 +319,64 @@
return Latin1Encoding().decode(reinterpret_cast<const char*>(bytes.data()), bytes.size());
}
+#if ENABLE(BLOB)
+static void appendBlobResolved(FormData* formData, const KURL& url)
+{
+ RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, url));
+ if (!blobData)
+ return;
+
+ BlobDataItemList::const_iterator it = blobData->items().begin();
+ const BlobDataItemList::const_iterator itend = blobData->items().end();
+ for (; it != itend; ++it) {
+ const BlobDataItem& blobItem = *it;
+ if (blobItem.type == BlobDataItem::Data)
+ formData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
+ else if (blobItem.type == BlobDataItem::File)
+ formData->appendFileRange(blobItem.path, blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
+ else if (blobItem.type == BlobDataItem::Blob)
+ appendBlobResolved(formData, blobItem.url);
+ else
+ ASSERT_NOT_REACHED();
+ }
+}
+
+PassRefPtr<FormData> FormData::resolveBlobReferences()
+{
+ // First check if any blobs needs to be resolved, or we can take the fast path.
+ bool hasBlob = false;
+ Vector<FormDataElement>::const_iterator it = elements().begin();
+ const Vector<FormDataElement>::const_iterator itend = elements().end();
+ for (; it != itend; ++it) {
+ if (it->m_type == FormDataElement::encodedBlob) {
+ hasBlob = true;
+ break;
+ }
+ }
+
+ if (!hasBlob)
+ return this;
+
+ // Create a copy to append the result into.
+ RefPtr<FormData> newFormData = FormData::create();
+ newFormData->setAlwaysStream(alwaysStream());
+ newFormData->setIdentifier(identifier());
+ it = elements().begin();
+ for (; it != itend; ++it) {
+ const FormDataElement& element = *it;
+ if (element.m_type == FormDataElement::data)
+ newFormData->appendData(element.m_data.data(), element.m_data.size());
+ else if (element.m_type == FormDataElement::encodedFile)
+ newFormData->appendFileRange(element.m_filename, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime, element.m_shouldGenerateFile);
+ else if (element.m_type == FormDataElement::encodedBlob)
+ appendBlobResolved(newFormData.get(), element.m_url);
+ else
+ ASSERT_NOT_REACHED();
+ }
+ return newFormData.release();
+}
+#endif
+
void FormData::generateFiles(Document* document)
{
ASSERT(!m_hasGeneratedFiles);
Modified: trunk/Source/WebCore/platform/network/FormData.h (134261 => 134262)
--- trunk/Source/WebCore/platform/network/FormData.h 2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/FormData.h 2012-11-12 19:13:08 UTC (rev 134262)
@@ -134,6 +134,12 @@
void flatten(Vector<char>&) const; // omits files
String flattenToString() const; // omits files
+#if ENABLE(BLOB)
+ // Resolve all blob references so we only have file and data.
+ // If the FormData has no blob references to resolve, this is returned.
+ PassRefPtr<FormData> resolveBlobReferences();
+#endif
+
bool isEmpty() const { return m_elements.isEmpty(); }
const Vector<FormDataElement>& elements() const { return m_elements; }
const Vector<char>& boundary() const { return m_boundary; }
Modified: trunk/Source/WebCore/platform/network/blackberry/ResourceRequestBlackBerry.cpp (134261 => 134262)
--- trunk/Source/WebCore/platform/network/blackberry/ResourceRequestBlackBerry.cpp 2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/blackberry/ResourceRequestBlackBerry.cpp 2012-11-12 19:13:08 UTC (rev 134262)
@@ -157,7 +157,11 @@
platformRequest.setSuggestedSaveName(suggestedSaveName());
if (httpBody() && !httpBody()->isEmpty()) {
- const Vector<FormDataElement>& elements = httpBody()->elements();
+ RefPtr<FormData> formData = httpBody();
+#if ENABLE(BLOB)
+ formData = formData->resolveBlobReferences();
+#endif
+ const Vector<FormDataElement>& elements = formData->elements();
// Use setData for simple forms because it is slightly more efficient.
if (elements.size() == 1 && elements[0].m_type == FormDataElement::data)
platformRequest.setData(elements[0].m_data.data(), elements[0].m_data.size());
@@ -168,24 +172,8 @@
platformRequest.addMultipartData(element.m_data.data(), element.m_data.size());
else if (element.m_type == FormDataElement::encodedFile)
platformRequest.addMultipartFilename(element.m_filename.characters(), element.m_filename.length());
-#if ENABLE(BLOB)
- else if (element.m_type == FormDataElement::encodedBlob) {
- RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, element.m_url));
- if (blobData) {
- for (size_t j = 0; j < blobData->items().size(); ++j) {
- const BlobDataItem& blobItem = blobData->items()[j];
- if (blobItem.type == BlobDataItem::Data)
- platformRequest.addMultipartData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
- else {
- ASSERT(blobItem.type == BlobDataItem::File);
- platformRequest.addMultipartFilename(blobItem.path.characters(), blobItem.path.length(), blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
- }
- }
- }
- }
-#endif
else
- ASSERT_NOT_REACHED(); // unknown type
+ ASSERT_NOT_REACHED(); // Blobs should be resolved at this point.
}
}
}
Modified: trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp (134261 => 134262)
--- trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp 2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp 2012-11-12 19:13:08 UTC (rev 134262)
@@ -395,46 +395,8 @@
}
#if ENABLE(BLOB)
- // Check if there is a blob in the form data.
- bool hasBlob = false;
- for (size_t i = 0; i < count; ++i) {
- const FormDataElement& element = formData->elements()[i];
- if (element.m_type == FormDataElement::encodedBlob) {
- hasBlob = true;
- break;
- }
- }
-
- // If yes, we have to resolve all the blob references and regenerate the form data with only data and file types.
- if (hasBlob) {
- RefPtr<FormData> newFormData = FormData::create();
- newFormData->setAlwaysStream(formData->alwaysStream());
- newFormData->setIdentifier(formData->identifier());
- for (size_t i = 0; i < count; ++i) {
- const FormDataElement& element = formData->elements()[i];
- if (element.m_type == FormDataElement::data)
- newFormData->appendData(element.m_data.data(), element.m_data.size());
- else if (element.m_type == FormDataElement::encodedFile)
- newFormData->appendFile(element.m_filename, element.m_shouldGenerateFile);
- else {
- ASSERT(element.m_type == FormDataElement::encodedBlob);
- RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, element.m_url));
- if (blobData) {
- for (size_t j = 0; j < blobData->items().size(); ++j) {
- const BlobDataItem& blobItem = blobData->items()[j];
- if (blobItem.type == BlobDataItem::Data)
- newFormData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
- else {
- ASSERT(blobItem.type == BlobDataItem::File);
- newFormData->appendFileRange(blobItem.path, blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
- }
- }
- }
- }
- }
- formData = newFormData.release();
- count = formData->elements().size();
- }
+ formData = formData->resolveBlobReferences();
+ count = formData->elements().size();
#endif
// Precompute the content length so NSURLConnection doesn't use chunked mode.
Modified: trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp (134261 => 134262)
--- trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp 2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp 2012-11-12 19:13:08 UTC (rev 134262)
@@ -21,7 +21,7 @@
#include "config.h"
#include "QNetworkReplyHandler.h"
-#include "BlobRegistryImpl.h"
+#include "BlobData.h"
#include "HTTPParsers.h"
#include "MIMETypeRegistry.h"
#include "ResourceHandle.h"
@@ -61,68 +61,19 @@
delete m_currentFile;
}
-#if ENABLE(BLOB)
-static void appendBlobResolved(FormData* formData, const KURL& url)
-{
- RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, url));
- if (blobData) {
- BlobDataItemList::const_iterator it = blobData->items().begin();
- const BlobDataItemList::const_iterator itend = blobData->items().end();
- for (; it != itend; ++it) {
- const BlobDataItem& blobItem = *it;
- if (blobItem.type == BlobDataItem::Data)
- formData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
- else if (blobItem.type == BlobDataItem::File)
- formData->appendFileRange(blobItem.path, blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
- else if (blobItem.type == BlobDataItem::Blob)
- appendBlobResolved(formData, blobItem.url);
- else
- ASSERT_NOT_REACHED();
- }
- }
-}
-#endif
-
void FormDataIODevice::prepareFormElements(FormData* formData)
{
if (!formData)
return;
-#if ENABLE(BLOB)
- bool hasBlob = false;
- Vector<FormDataElement>::const_iterator it = formData->elements().begin();
- const Vector<FormDataElement>::const_iterator itend = formData->elements().end();
- for (; it != itend; ++it) {
- if (it->m_type == FormDataElement::encodedBlob) {
- hasBlob = true;
- break;
- }
- }
+ RefPtr<FormData> formDataRef(formData);
- // Resolve all blobs so we only have file and data.
- if (hasBlob) {
- RefPtr<FormData> newFormData = FormData::create();
- newFormData->setAlwaysStream(formData->alwaysStream());
- newFormData->setIdentifier(formData->identifier());
- it = formData->elements().begin();
- for (; it != itend; ++it) {
- const FormDataElement& element = *it;
- if (element.m_type == FormDataElement::data)
- newFormData->appendData(element.m_data.data(), element.m_data.size());
- else if (element.m_type == FormDataElement::encodedFile)
- newFormData->appendFileRange(element.m_filename, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime, element.m_shouldGenerateFile);
- else if (element.m_type == FormDataElement::encodedBlob)
- appendBlobResolved(newFormData.get(), element.m_url);
- else
- ASSERT_NOT_REACHED();
- }
- m_formElements = newFormData->elements();
- return;
- }
+#if ENABLE(BLOB)
+ formDataRef = formDataRef->resolveBlobReferences();
#endif
// Take a deep copy of the FormDataElements
- m_formElements = formData->elements();
+ m_formElements = formDataRef->elements();
}