[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