Begin stubbing out a new KeyedEncoder class
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 May 2013 19:55:49 +0000 (19:55 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 20 May 2013 19:55:49 +0000 (19:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=116456

Reviewed by Sam Weinig.

This class (and it's coming counterpart, KeyedDecoder) will be used for serializing
object graphs to a tree-like structure of dictionaries. It is up to individual ports to
serialize them further (for example, on Mac they could be serialized to CFPropertyList objects).

This will be used for serializing session storage state but I hope that it can be used for serializing
back forward state in the future as our current implementation of back forward state serialization
is fragile and depends on our IPC layer's binary encoding(!).

* Shared/KeyedCodingValue.h: Added.
* Shared/KeyedEncoder.cpp: Added.
* Shared/KeyedEncoder.h: Added.

* WebKit2.xcodeproj/project.pbxproj:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@150377 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/KeyedCodingValue.h [new file with mode: 0644]
Source/WebKit2/Shared/KeyedEncoder.cpp [new file with mode: 0644]
Source/WebKit2/Shared/KeyedEncoder.h [new file with mode: 0644]
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

index c6f7c65..5e0bd5b 100644 (file)
@@ -1,3 +1,24 @@
+2013-05-20  Anders Carlsson  <andersca@apple.com>
+
+        Begin stubbing out a new KeyedEncoder class
+        https://bugs.webkit.org/show_bug.cgi?id=116456
+
+        Reviewed by Sam Weinig.
+
+        This class (and it's coming counterpart, KeyedDecoder) will be used for serializing
+        object graphs to a tree-like structure of dictionaries. It is up to individual ports to
+        serialize them further (for example, on Mac they could be serialized to CFPropertyList objects).
+        
+        This will be used for serializing session storage state but I hope that it can be used for serializing
+        back forward state in the future as our current implementation of back forward state serialization
+        is fragile and depends on our IPC layer's binary encoding(!).
+        
+        * Shared/KeyedCodingValue.h: Added.
+        * Shared/KeyedEncoder.cpp: Added.
+        * Shared/KeyedEncoder.h: Added.
+
+        * WebKit2.xcodeproj/project.pbxproj:
+
 2013-05-19  Sam Weinig  <sam@webkit.org>
 
         Bump WKBundlePageLoaderClient version number so as not to break some clients
diff --git a/Source/WebKit2/Shared/KeyedCodingValue.h b/Source/WebKit2/Shared/KeyedCodingValue.h
new file mode 100644 (file)
index 0000000..ebe1e55
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef KeyedCodingValue_h
+#define KeyedCodingValue_h
+
+#include <wtf/HashMap.h>
+#include <wtf/text/WTFString.h>
+
+namespace WebKit {
+
+struct KeyedCodingValue {
+    enum Type {
+        StringValue,
+        ObjectValue
+    };
+
+    Type type;
+    String string;
+    HashMap<String, KeyedCodingValue> object;
+};
+
+} // namespace WebKit
+
+#endif // KeyedCodingValue_h
diff --git a/Source/WebKit2/Shared/KeyedEncoder.cpp b/Source/WebKit2/Shared/KeyedEncoder.cpp
new file mode 100644 (file)
index 0000000..3f33758
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "KeyedEncoder.h"
+
+#include "KeyedCodingValue.h"
+#include <wtf/text/StringHash.h>
+
+namespace WebKit {
+
+KeyedEncoder::KeyedEncoder()
+    : m_currentObject(&m_rootObject)
+{
+}
+
+KeyedEncoder::~KeyedEncoder()
+{
+    ASSERT(m_currentObject == &m_rootObject);
+}
+
+void KeyedEncoder::encode(const String& key, const String& value)
+{
+    ASSERT(!m_currentObject->contains(key));
+
+    KeyedCodingValue keyedCodingValue;
+    keyedCodingValue.type = KeyedCodingValue::StringValue;
+    keyedCodingValue.string = value;
+
+    m_currentObject->set(key, std::move(keyedCodingValue));
+}
+
+} // namespace WebKit
diff --git a/Source/WebKit2/Shared/KeyedEncoder.h b/Source/WebKit2/Shared/KeyedEncoder.h
new file mode 100644 (file)
index 0000000..2790955
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2013 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef KeyedEncoder_h
+#define KeyedEncoder_h
+
+#include <wtf/Forward.h>
+#include <wtf/HashMap.h>
+#include <wtf/text/WTFString.h>
+
+// FIXME: I believe this class can be moved to either WTF or WebCore
+// and replace the Encoder/Decoder classes there. Currently the Encoder/Decoder
+// classes are used to serialize history trees and using a keyed encoder would be
+// less fragile from a binary compatibility perspective.
+
+namespace WebKit {
+
+struct KeyedCodingValue;
+
+class KeyedEncoder {
+public:
+    KeyedEncoder();
+    ~KeyedEncoder();
+
+    void encode(const String& key, const String& value);
+
+private:
+#if 0
+    struct Value {
+        enum Type {
+            StringValue,
+            ObjectValue,
+        };
+
+        String string;
+        HashMap<String, Value> object;
+    };
+
+    HashMap<String, Value> root;
+#endif
+
+    HashMap<String, KeyedCodingValue> m_rootObject;
+    HashMap<String, KeyedCodingValue>* m_currentObject;
+};
+
+} // namespace WebKit
+
+#endif // KeyedEncoder_h
index aeac40a..b90a70d 100644 (file)
                1A4A9C9A12B821CD008FE984 /* NetscapePluginModuleMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A4A9C9912B821CD008FE984 /* NetscapePluginModuleMac.mm */; };
                1A4A9F3312B844E2008FE984 /* PluginQuirks.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A4A9F3112B844E2008FE984 /* PluginQuirks.h */; };
                1A50DB66110A3D57000D3FE5 /* WebProcess.app in Copy Files */ = {isa = PBXBuildFile; fileRef = 1A50DB1E110A3BDC000D3FE5 /* WebProcess.app */; };
+               1A588B30174AAC7100ACF472 /* KeyedEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A588B2E174AAC7100ACF472 /* KeyedEncoder.cpp */; };
+               1A588B31174AAC7100ACF472 /* KeyedEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A588B2F174AAC7100ACF472 /* KeyedEncoder.h */; };
+               1A588B33174AAE0B00ACF472 /* KeyedCodingValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A588B32174AAE0B00ACF472 /* KeyedCodingValue.h */; };
                1A594ABA112A1FB6009DE7C7 /* WebUIClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A594AB8112A1FB6009DE7C7 /* WebUIClient.cpp */; };
                1A594ABB112A1FB6009DE7C7 /* WebUIClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A594AB9112A1FB6009DE7C7 /* WebUIClient.h */; };
                1A5E4DA412D3BD3D0099A2BB /* TextCheckerState.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */; };
                1A4F976C100E7B6600637A18 /* FeatureDefines.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeatureDefines.xcconfig; sourceTree = "<group>"; };
                1A4F976E100E7B6600637A18 /* Version.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Version.xcconfig; sourceTree = "<group>"; };
                1A50DB1E110A3BDC000D3FE5 /* WebProcess.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WebProcess.app; sourceTree = BUILT_PRODUCTS_DIR; };
+               1A588B2E174AAC7100ACF472 /* KeyedEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KeyedEncoder.cpp; sourceTree = "<group>"; };
+               1A588B2F174AAC7100ACF472 /* KeyedEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyedEncoder.h; sourceTree = "<group>"; };
+               1A588B32174AAE0B00ACF472 /* KeyedCodingValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KeyedCodingValue.h; sourceTree = "<group>"; };
                1A594AB8112A1FB6009DE7C7 /* WebUIClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebUIClient.cpp; sourceTree = "<group>"; };
                1A594AB9112A1FB6009DE7C7 /* WebUIClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebUIClient.h; sourceTree = "<group>"; };
                1A5E4DA312D3BD3D0099A2BB /* TextCheckerState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextCheckerState.h; sourceTree = "<group>"; };
                                BC64696E11DBE603006455B0 /* ImmutableArray.h */,
                                BCBCB0CC1215E33A00DE59CA /* ImmutableDictionary.cpp */,
                                BCBCB0CA1215E32100DE59CA /* ImmutableDictionary.h */,
+                               1A588B32174AAE0B00ACF472 /* KeyedCodingValue.h */,
+                               1A588B2E174AAC7100ACF472 /* KeyedEncoder.cpp */,
+                               1A588B2F174AAC7100ACF472 /* KeyedEncoder.h */,
                                1A92DC1012F8BA460017AF65 /* LayerTreeContext.h */,
                                BCC8049D122F0D6B00103529 /* MutableArray.cpp */,
                                BCC8049E122F0D6B00103529 /* MutableArray.h */,
                                E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */,
                                519B4FF516A9EA970066874D /* SchedulableLoader.h in Headers */,
                                51D130541382EAC000351EDD /* SecItemRequestData.h in Headers */,
+                               1A588B33174AAE0B00ACF472 /* KeyedCodingValue.h in Headers */,
                                51D130561382EAC000351EDD /* SecItemResponseData.h in Headers */,
                                E179088F169BAA6A006904C7 /* SecItemShim.h in Headers */,
                                511F8A7B138B460900A95F44 /* SecItemShimLibrary.h in Headers */,
                                BC032D7710F4378D0058C15A /* WebContextMenuClient.h in Headers */,
                                512935D81288D19400A4B695 /* WebContextMenuItem.h in Headers */,
                                510FBB9B1288C95E00AFFDF4 /* WebContextMenuItemData.h in Headers */,
+                               1A588B31174AAC7100ACF472 /* KeyedEncoder.h in Headers */,
                                51ACBB82127A8BAD00D203B9 /* WebContextMenuProxy.h in Headers */,
                                51ACBBA0127A8F2C00D203B9 /* WebContextMenuProxyMac.h in Headers */,
                                BCCB75C61203A1CE00222D1B /* WebContextMessageKinds.h in Headers */,
                                BCBAACEC145225E30053F82F /* WKProcessGroup.mm in Sources */,
                                512F58FB12A88A5400629530 /* WKProtectionSpace.cpp in Sources */,
                                5167EEA1170377BF007681CA /* DiskCacheMonitor.mm in Sources */,
+                               1A588B30174AAC7100ACF472 /* KeyedEncoder.cpp in Sources */,
                                37948408150C4B9700E52CE9 /* WKRenderLayer.cpp in Sources */,
                                37608822150414F700FC82C7 /* WKRenderObject.cpp in Sources */,
                                3336763A130C99DC006C9DE2 /* WKResourceCacheManager.cpp in Sources */,