[SCM] WebKit Debian packaging branch, debian/experimental, updated. debian/1.3.8-1-1049-g2e11a8e
darin at apple.com
darin at apple.com
Fri Jan 21 14:54:05 UTC 2011
The following commit has been merged in the debian/experimental branch:
commit 2e4eb267fd0beee8f97fff0620bc134f44048420
Author: darin at apple.com <darin at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Tue Jan 4 01:35:09 2011 +0000
2011-01-03 Darin Adler <darin at apple.com>
Reviewed by Brady Eidson.
Add code to encode/decode the back/forward tree
https://bugs.webkit.org/show_bug.cgi?id=51853
* history/HistoryItem.cpp:
(WebCore::HistoryItem::encodeBackForwardTree): Added.
(WebCore::HistoryItem::encodeBackForwardTreeNode): Added.
(WebCore::HistoryItem::decodeBackForwardTree): Added.
* history/HistoryItem.h: Added functions above.
* platform/network/FormData.cpp:
(WebCore::FormData::create): Changed type to Vector<uint8_t> instead of
Vector<char>. This type is used in our newer code for vectors of bytes.
(WebCore::FormData::flatten): Ditto.
(WebCore::FormData::flattenToString): Ditto. Had to add a cast here.
(WebCore::FormData::encodeForBackForward): Added.
(WebCore::FormData::decodeForBackForward): Added.
* platform/network/FormData.h: Changed type to Vector<uint8_t> instead of
Vector<char>. Also made some single-argument constructors explicit.
Also added the new functions.
* platform/network/mac/FormDataStreamMac.mm:
(WebCore::advanceCurrentStream): Changed to use uint8_t to match above.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@74951 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 7e07cca..65742eb 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,30 @@
+2011-01-03 Darin Adler <darin at apple.com>
+
+ Reviewed by Brady Eidson.
+
+ Add code to encode/decode the back/forward tree
+ https://bugs.webkit.org/show_bug.cgi?id=51853
+
+ * history/HistoryItem.cpp:
+ (WebCore::HistoryItem::encodeBackForwardTree): Added.
+ (WebCore::HistoryItem::encodeBackForwardTreeNode): Added.
+ (WebCore::HistoryItem::decodeBackForwardTree): Added.
+ * history/HistoryItem.h: Added functions above.
+
+ * platform/network/FormData.cpp:
+ (WebCore::FormData::create): Changed type to Vector<uint8_t> instead of
+ Vector<char>. This type is used in our newer code for vectors of bytes.
+ (WebCore::FormData::flatten): Ditto.
+ (WebCore::FormData::flattenToString): Ditto. Had to add a cast here.
+ (WebCore::FormData::encodeForBackForward): Added.
+ (WebCore::FormData::decodeForBackForward): Added.
+ * platform/network/FormData.h: Changed type to Vector<uint8_t> instead of
+ Vector<char>. Also made some single-argument constructors explicit.
+ Also added the new functions.
+
+ * platform/network/mac/FormDataStreamMac.mm:
+ (WebCore::advanceCurrentStream): Changed to use uint8_t to match above.
+
2011-01-03 Simon Fraser <simon.fraser at apple.com>
Attempt to fix GTK build.
diff --git a/WebCore/history/HistoryItem.cpp b/WebCore/history/HistoryItem.cpp
index 34b54a1..b261858 100644
--- a/WebCore/history/HistoryItem.cpp
+++ b/WebCore/history/HistoryItem.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2005, 2006, 2008, 2011 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -33,11 +33,15 @@
#include "ResourceRequest.h"
#include <stdio.h>
#include <wtf/CurrentTime.h>
+#include <wtf/Decoder.h>
+#include <wtf/Encoder.h>
#include <wtf/MathExtras.h>
#include <wtf/text/CString.h>
namespace WebCore {
+const uint32_t backForwardTreeEncodingVersion = 0;
+
static long long generateSequenceNumber()
{
// Initialize to the current time to reduce the likelihood of generating
@@ -621,6 +625,180 @@ void HistoryItem::setRedirectURLs(PassOwnPtr<Vector<String> > redirectURLs)
m_redirectURLs = redirectURLs;
}
+void HistoryItem::encodeBackForwardTree(Encoder* encoder) const
+{
+ encoder->encodeUInt32(backForwardTreeEncodingVersion);
+
+ encodeBackForwardTreeNode(encoder);
+}
+
+void HistoryItem::encodeBackForwardTreeNode(Encoder* encoder) const
+{
+ size_t size = m_children.size();
+ encoder->encodeUInt64(size);
+ for (size_t i = 0; i < size; ++i) {
+ const HistoryItem& child = *m_children[i];
+
+ encoder->encodeString(child.m_originalURLString);
+
+ encoder->encodeString(child.m_urlString);
+
+ child.encodeBackForwardTreeNode(encoder);
+ }
+
+ encoder->encodeInt64(m_documentSequenceNumber);
+
+ size = m_documentState.size();
+ encoder->encodeUInt64(size);
+ for (size_t i = 0; i < size; ++i)
+ encoder->encodeString(m_documentState[i]);
+
+ encoder->encodeString(m_formContentType);
+
+ encoder->encodeBool(m_formData);
+ if (m_formData)
+ m_formData->encodeForBackForward(encoder);
+
+ encoder->encodeInt64(m_itemSequenceNumber);
+
+ encoder->encodeString(m_originalURLString);
+
+ encoder->encodeString(m_referrer);
+
+ encoder->encodeInt32(m_scrollPoint.x());
+ encoder->encodeInt32(m_scrollPoint.y());
+
+ encoder->encodeBool(m_stateObject);
+ if (m_stateObject)
+ encoder->encodeBytes(m_stateObject->data().data(), m_stateObject->data().size());
+
+ encoder->encodeString(m_target);
+}
+
+struct DecodeRecursionStackElement {
+ RefPtr<HistoryItem> node;
+ size_t i;
+ size_t size;
+
+ DecodeRecursionStackElement(PassRefPtr<HistoryItem> node, size_t i, size_t size)
+ : node(node)
+ , i(i)
+ , size(size)
+ {
+ }
+};
+
+PassRefPtr<HistoryItem> HistoryItem::decodeBackForwardTree(const String& topURLString, const String& topTitle, const String& topOriginalURLString, Decoder* decoder)
+{
+ // Since the data stream is not trusted, the decode has to be non-recursive.
+ // We don't want bad data to cause a stack overflow.
+
+ uint32_t version;
+ if (!decoder->decodeUInt32(version))
+ return 0;
+ if (version != backForwardTreeEncodingVersion)
+ return 0;
+
+ String urlString = topURLString;
+ String title = topTitle;
+ String originalURLString = topOriginalURLString;
+
+ Vector<DecodeRecursionStackElement, 16> recursionStack;
+
+recurse:
+ RefPtr<HistoryItem> node = create(urlString, title, 0);
+
+ node->setOriginalURLString(originalURLString);
+
+ title = String();
+
+ uint64_t size;
+ if (!decoder->decodeUInt64(size))
+ return 0;
+ size_t i;
+ RefPtr<HistoryItem> child;
+ for (i = 0; i < size; ++i) {
+ if (!decoder->decodeString(originalURLString))
+ return 0;
+
+ if (!decoder->decodeString(urlString))
+ return 0;
+
+ recursionStack.append(DecodeRecursionStackElement(node.release(), i, size));
+ goto recurse;
+
+resume:
+ node->m_children.append(child.release());
+ }
+
+ if (!decoder->decodeInt64(node->m_documentSequenceNumber))
+ return 0;
+
+ if (!decoder->decodeUInt64(size))
+ return 0;
+ for (i = 0; i < size; ++i) {
+ String state;
+ if (!decoder->decodeString(state))
+ return 0;
+ node->m_documentState.append(state);
+ }
+
+ if (!decoder->decodeString(node->m_formContentType))
+ return 0;
+
+ bool hasFormData;
+ if (!decoder->decodeBool(hasFormData))
+ return 0;
+ if (hasFormData) {
+ node->m_formData = FormData::decodeForBackForward(decoder);
+ if (!node->m_formData)
+ return 0;
+ }
+
+ if (!decoder->decodeInt64(node->m_itemSequenceNumber))
+ return 0;
+
+ if (!decoder->decodeString(node->m_originalURLString))
+ return 0;
+
+ if (!decoder->decodeString(node->m_referrer))
+ return 0;
+
+ int32_t x;
+ if (!decoder->decodeInt32(x))
+ return 0;
+ int32_t y;
+ if (!decoder->decodeInt32(y))
+ return 0;
+ node->m_scrollPoint = IntPoint(x, y);
+
+ bool hasStateObject;
+ if (!decoder->decodeBool(hasStateObject))
+ return 0;
+ if (hasStateObject) {
+ Vector<uint8_t> bytes;
+ if (!decoder->decodeBytes(bytes))
+ return 0;
+ node->m_stateObject = SerializedScriptValue::adopt(bytes);
+ }
+
+ if (!decoder->decodeString(node->m_target))
+ return 0;
+
+ // Simulate recursion with our own stack.
+ if (!recursionStack.isEmpty()) {
+ DecodeRecursionStackElement& element = recursionStack.last();
+ child = node.release();
+ node = element.node.release();
+ i = element.i;
+ size = element.size;
+ recursionStack.removeLast();
+ goto resume;
+ }
+
+ return node.release();
+}
+
#ifndef NDEBUG
int HistoryItem::showTree() const
diff --git a/WebCore/history/HistoryItem.h b/WebCore/history/HistoryItem.h
index ef9ac23..cd867f7 100644
--- a/WebCore/history/HistoryItem.h
+++ b/WebCore/history/HistoryItem.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2006, 2008, 2011 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -85,9 +85,12 @@ public:
}
~HistoryItem();
-
+
PassRefPtr<HistoryItem> copy() const;
-
+
+ void encodeBackForwardTree(Encoder*) const;
+ static PassRefPtr<HistoryItem> decodeBackForwardTree(const String& urlString, const String& title, const String& originalURLString, Decoder*);
+
const String& originalURLString() const;
const String& urlString() const;
const String& title() const;
@@ -223,6 +226,9 @@ private:
HistoryItem* findTargetItem();
+ void encodeBackForwardTreeNode(Encoder*) const;
+ static PassRefPtr<HistoryItem> decodeBackForwardTreeNode(const String& urlString, const String& title, const String& originalURLString, Decoder*);
+
/* When adding new member variables to this class, please notify the Qt team.
* qt/HistoryItemQt.cpp contains code to serialize history items.
*/
@@ -251,11 +257,11 @@ private:
OwnPtr<Vector<String> > m_redirectURLs;
- long long m_itemSequenceNumber;
+ int64_t m_itemSequenceNumber;
// Support for HTML5 History
RefPtr<SerializedScriptValue> m_stateObject;
- long long m_documentSequenceNumber;
+ int64_t m_documentSequenceNumber;
// info used to repost form data
RefPtr<FormData> m_formData;
diff --git a/WebCore/platform/network/FormData.cpp b/WebCore/platform/network/FormData.cpp
index b20b41a..1511dc6 100644
--- a/WebCore/platform/network/FormData.cpp
+++ b/WebCore/platform/network/FormData.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved.
* Copyright (C) 2009 Google Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
@@ -34,6 +34,8 @@
#include "MIMETypeRegistry.h"
#include "Page.h"
#include "TextEncoding.h"
+#include <wtf/Decoder.h>
+#include <wtf/Encoder.h>
namespace WebCore {
@@ -90,7 +92,7 @@ PassRefPtr<FormData> FormData::create(const CString& string)
return result.release();
}
-PassRefPtr<FormData> FormData::create(const Vector<char>& vector)
+PassRefPtr<FormData> FormData::create(const Vector<uint8_t>& vector)
{
RefPtr<FormData> result = create();
result->appendData(vector.data(), vector.size());
@@ -267,7 +269,7 @@ void FormData::appendKeyValuePairItems(const FormDataList& list, const TextEncod
appendData(encodedData.data(), encodedData.size());
}
-void FormData::flatten(Vector<char>& data) const
+void FormData::flatten(Vector<uint8_t>& data) const
{
// Concatenate all the byte arrays, but omit any files.
data.clear();
@@ -281,9 +283,9 @@ void FormData::flatten(Vector<char>& data) const
String FormData::flattenToString() const
{
- Vector<char> bytes;
+ Vector<uint8_t> bytes;
flatten(bytes);
- return Latin1Encoding().decode(bytes.data(), bytes.size());
+ return Latin1Encoding().decode(reinterpret_cast<const char*>(bytes.data()), bytes.size());
}
void FormData::generateFiles(Document* document)
@@ -327,4 +329,135 @@ void FormData::removeGeneratedFilesIfNeeded()
m_hasGeneratedFiles = false;
}
+static void encode(Encoder* encoder, const FormDataElement& element)
+{
+ encoder->encodeUInt32(element.m_type);
+
+ switch (element.m_type) {
+ case FormDataElement::data:
+ encoder->encodeBytes(element.m_data.data(), element.m_data.size());
+ return;
+
+ case FormDataElement::encodedFile:
+ encoder->encodeString(element.m_filename);
+ encoder->encodeBool(element.m_shouldGenerateFile);
+#if ENABLE(BLOB)
+ encoder->encodeInt64(element.m_fileStart);
+ encoder->encodeInt64(element.m_fileLength);
+ encoder->encodeDouble(element.m_expectedFileModificationTime);
+#else
+ encoder->encodeInt64(0);
+ encoder->encodeInt64(0);
+ encoder->encodeDouble(0);
+#endif
+ return;
+
+#if ENABLE(BLOB)
+ case FormDataElement::encodedBlob:
+ encoder->encodeString(element.m_blobURL.string());
+ return;
+#endif
+ }
+
+ ASSERT_NOT_REACHED();
+}
+
+static bool decode(Decoder* decoder, FormDataElement& element)
+{
+ uint32_t type = element.m_type;
+
+ switch (type) {
+ case FormDataElement::data:
+ return decoder->decodeBytes(element.m_data);
+
+ case FormDataElement::encodedFile: {
+ element.m_type = FormDataElement::encodedFile;
+ if (!decoder->decodeString(element.m_filename))
+ return false;
+ if (!decoder->decodeBool(element.m_shouldGenerateFile))
+ return false;
+ int64_t fileStart;
+ if (!decoder->decodeInt64(fileStart))
+ return false;
+ if (fileStart < 0)
+ return false;
+ int64_t fileLength;
+ if (!decoder->decodeInt64(fileLength))
+ return false;
+ if (fileLength < fileStart)
+ return false;
+ double expectedFileModificationTime;
+ if (!decoder->decodeDouble(expectedFileModificationTime))
+ return false;
+#if ENABLE(BLOB)
+ element.m_fileStart = fileStart;
+ element.m_fileLength = fileLength;
+ element.m_expectedFileModificationTime = expectedFileModificationTime;
+#endif
+ return true;
+ }
+
+#if ENABLE(BLOB)
+ case FormDataElement::encodedBlob:
+ element.m_type = FormDataElement::encodedBlob;
+ String blobURLString;
+ if (!decoder->decodeString(blobURLString))
+ return false;
+ element.m_blobURL = KURL(KURL(), blobURLString);
+ return true;
+#endif
+ }
+
+ return false;
+}
+
+void FormData::encodeForBackForward(Encoder* encoder) const
+{
+ encoder->encodeBool(m_alwaysStream);
+
+ encoder->encodeBytes(reinterpret_cast<const uint8_t*>(m_boundary.data()), m_boundary.size());
+
+ size_t size = m_elements.size();
+ encoder->encodeUInt64(size);
+ for (size_t i = 0; i < size; ++i)
+ encode(encoder, m_elements[i]);
+
+ encoder->encodeBool(m_hasGeneratedFiles);
+
+ encoder->encodeBool(m_identifier);
+}
+
+PassRefPtr<FormData> FormData::decodeForBackForward(Decoder* decoder)
+{
+ RefPtr<FormData> data = FormData::create();
+
+ if (!decoder->decodeBool(data->m_alwaysStream))
+ return 0;
+
+ Vector<uint8_t> boundary;
+ if (!decoder->decodeBytes(boundary))
+ return 0;
+ size_t size = boundary.size();
+ data->m_boundary.resize(size);
+ memcpy(data->m_boundary.data(), boundary.data(), size);
+
+ uint64_t elementsSize;
+ if (!decoder->decodeUInt64(elementsSize))
+ return 0;
+ for (size_t i = 0; i < elementsSize; ++i) {
+ FormDataElement element;
+ if (!decode(decoder, element))
+ return 0;
+ data->m_elements.append(element);
+ }
+
+ if (!decoder->decodeBool(data->m_hasGeneratedFiles))
+ return 0;
+
+ if (!decoder->decodeInt64(data->m_identifier))
+ return 0;
+
+ return data.release();
+}
+
} // namespace WebCore
diff --git a/WebCore/platform/network/FormData.h b/WebCore/platform/network/FormData.h
index 22ceb25..e051bf4 100644
--- a/WebCore/platform/network/FormData.h
+++ b/WebCore/platform/network/FormData.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -35,11 +35,11 @@ class TextEncoding;
class FormDataElement {
public:
FormDataElement() : m_type(data) { }
- FormDataElement(const Vector<char>& array) : m_type(data), m_data(array) { }
+ explicit FormDataElement(const Vector<uint8_t>& array) : m_type(data), m_data(array) { }
#if ENABLE(BLOB)
FormDataElement(const String& filename, long long fileStart, long long fileLength, double expectedFileModificationTime, bool shouldGenerateFile) : m_type(encodedFile), m_filename(filename), m_fileStart(fileStart), m_fileLength(fileLength), m_expectedFileModificationTime(expectedFileModificationTime), m_shouldGenerateFile(shouldGenerateFile) { }
- FormDataElement(const KURL& blobURL) : m_type(encodedBlob), m_blobURL(blobURL) { }
+ explicit FormDataElement(const KURL& blobURL) : m_type(encodedBlob), m_blobURL(blobURL) { }
#else
FormDataElement(const String& filename, bool shouldGenerateFile) : m_type(encodedFile), m_filename(filename), m_shouldGenerateFile(shouldGenerateFile) { }
#endif
@@ -51,7 +51,7 @@ public:
, encodedBlob
#endif
} m_type;
- Vector<char> m_data;
+ Vector<uint8_t> m_data;
String m_filename;
#if ENABLE(BLOB)
long long m_fileStart;
@@ -94,13 +94,16 @@ public:
static PassRefPtr<FormData> create();
static PassRefPtr<FormData> create(const void*, size_t);
static PassRefPtr<FormData> create(const CString&);
- static PassRefPtr<FormData> create(const Vector<char>&);
+ static PassRefPtr<FormData> create(const Vector<uint8_t>&);
static PassRefPtr<FormData> create(const FormDataList&, const TextEncoding&);
static PassRefPtr<FormData> createMultiPart(const FormDataList&, const TextEncoding&, Document*);
PassRefPtr<FormData> copy() const;
PassRefPtr<FormData> deepCopy() const;
~FormData();
+ void encodeForBackForward(Encoder*) const;
+ static PassRefPtr<FormData> decodeForBackForward(Decoder*);
+
void appendData(const void* data, size_t);
void appendFile(const String& filePath, bool shouldGenerateFile = false);
#if ENABLE(BLOB)
@@ -108,7 +111,7 @@ public:
void appendBlob(const KURL& blobURL);
#endif
- void flatten(Vector<char>&) const; // omits files
+ void flatten(Vector<uint8_t>&) const; // omits files
String flattenToString() const; // omits files
bool isEmpty() const { return m_elements.isEmpty(); }
diff --git a/WebCore/platform/network/mac/FormDataStreamMac.mm b/WebCore/platform/network/mac/FormDataStreamMac.mm
index 03f4579..7bb0403 100644
--- a/WebCore/platform/network/mac/FormDataStreamMac.mm
+++ b/WebCore/platform/network/mac/FormDataStreamMac.mm
@@ -136,7 +136,7 @@ struct FormStreamFields {
#if ENABLE(BLOB)
long long currentStreamRangeLength;
#endif
- char* currentData;
+ uint8_t* currentData;
CFReadStreamRef formStream;
unsigned long long streamLength;
unsigned long long bytesSent;
@@ -172,8 +172,8 @@ static bool advanceCurrentStream(FormStreamFields* form)
if (nextInput.m_type == FormDataElement::data) {
size_t size = nextInput.m_data.size();
- char* data = nextInput.m_data.releaseBuffer();
- form->currentStream = CFReadStreamCreateWithBytesNoCopy(0, reinterpret_cast<const UInt8*>(data), size, kCFAllocatorNull);
+ uint8_t* data = nextInput.m_data.releaseBuffer();
+ form->currentStream = CFReadStreamCreateWithBytesNoCopy(0, data, size, kCFAllocatorNull);
form->currentData = data;
} else {
#if ENABLE(BLOB)
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list