diff --git a/public/all.gyp b/public/all.gyp
index f85d76a..64d92eb 100644
--- a/public/all.gyp
+++ b/public/all.gyp
@@ -39,8 +39,9 @@
             'target_name': 'all_blink',
             'type': 'none',
             'dependencies': [
-                '../Source/wtf/wtf_tests.gyp:wtf_unittests',
                 '../Source/WebKit/chromium/WebKitUnitTests.gyp:webkit_unit_tests',
+                '../Source/weborigin/weborigin_tests.gyp:weborigin_unittests',
+                '../Source/wtf/wtf_tests.gyp:wtf_unittests',
                 '../Tools/DumpRenderTree/DumpRenderTree.gyp/DumpRenderTree.gyp:DumpRenderTree',
             ],
             'conditions': [
diff --git a/public/blink.gyp b/public/blink.gyp
new file mode 100644
index 0000000..e62e94f
--- /dev/null
+++ b/public/blink.gyp
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2013 Google 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:
+#
+#         * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#         * 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.
+#         * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+# OWNER OR 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.
+#
+{
+    'includes': [
+        '../Source/core/features.gypi',
+    ],
+    'targets': [
+        {
+            'target_name': 'blink',
+            'type': 'none',
+            'dependencies': [
+                '../Source/WebKit/chromium/WebKit.gyp:webkit',
+            ],
+            'export_dependent_settings': [
+                '../Source/WebKit/chromium/WebKit.gyp:webkit',
+            ]
+        },
+    ],
+}
diff --git a/public/blink.target.darwin-arm.mk b/public/blink.target.darwin-arm.mk
new file mode 100644
index 0000000..dfdb5fd
--- /dev/null
+++ b/public/blink.target.darwin-arm.mk
@@ -0,0 +1,39 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := third_party_WebKit_public_blink_gyp
+LOCAL_MODULE_STEM := blink
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES := \
+	$(call intermediates-dir-for,STATIC_LIBRARIES,third_party_WebKit_Source_WebKit_chromium_webkit_gyp)/third_party_WebKit_Source_WebKit_chromium_webkit_gyp.a
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: third_party_WebKit_public_blink_gyp
+
+# Alias gyp target name.
+.PHONY: blink
+blink: third_party_WebKit_public_blink_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+	$(hide) echo "Gyp timestamp: $@"
+	$(hide) mkdir -p $(dir $@)
+	$(hide) touch $@
diff --git a/public/blink.target.darwin-x86.mk b/public/blink.target.darwin-x86.mk
new file mode 100644
index 0000000..dfdb5fd
--- /dev/null
+++ b/public/blink.target.darwin-x86.mk
@@ -0,0 +1,39 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := third_party_WebKit_public_blink_gyp
+LOCAL_MODULE_STEM := blink
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES := \
+	$(call intermediates-dir-for,STATIC_LIBRARIES,third_party_WebKit_Source_WebKit_chromium_webkit_gyp)/third_party_WebKit_Source_WebKit_chromium_webkit_gyp.a
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: third_party_WebKit_public_blink_gyp
+
+# Alias gyp target name.
+.PHONY: blink
+blink: third_party_WebKit_public_blink_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+	$(hide) echo "Gyp timestamp: $@"
+	$(hide) mkdir -p $(dir $@)
+	$(hide) touch $@
diff --git a/public/blink.target.linux-arm.mk b/public/blink.target.linux-arm.mk
new file mode 100644
index 0000000..dfdb5fd
--- /dev/null
+++ b/public/blink.target.linux-arm.mk
@@ -0,0 +1,39 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := third_party_WebKit_public_blink_gyp
+LOCAL_MODULE_STEM := blink
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES := \
+	$(call intermediates-dir-for,STATIC_LIBRARIES,third_party_WebKit_Source_WebKit_chromium_webkit_gyp)/third_party_WebKit_Source_WebKit_chromium_webkit_gyp.a
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: third_party_WebKit_public_blink_gyp
+
+# Alias gyp target name.
+.PHONY: blink
+blink: third_party_WebKit_public_blink_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+	$(hide) echo "Gyp timestamp: $@"
+	$(hide) mkdir -p $(dir $@)
+	$(hide) touch $@
diff --git a/public/blink.target.linux-x86.mk b/public/blink.target.linux-x86.mk
new file mode 100644
index 0000000..dfdb5fd
--- /dev/null
+++ b/public/blink.target.linux-x86.mk
@@ -0,0 +1,39 @@
+# This file is generated by gyp; do not edit.
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_CLASS := GYP
+LOCAL_MODULE := third_party_WebKit_public_blink_gyp
+LOCAL_MODULE_STEM := blink
+LOCAL_MODULE_SUFFIX := .stamp
+LOCAL_MODULE_TAGS := optional
+gyp_intermediate_dir := $(call local-intermediates-dir)
+gyp_shared_intermediate_dir := $(call intermediates-dir-for,GYP,shared)
+
+# Make sure our deps are built first.
+GYP_TARGET_DEPENDENCIES := \
+	$(call intermediates-dir-for,STATIC_LIBRARIES,third_party_WebKit_Source_WebKit_chromium_webkit_gyp)/third_party_WebKit_Source_WebKit_chromium_webkit_gyp.a
+
+GYP_GENERATED_OUTPUTS :=
+
+# Make sure our deps and generated files are built first.
+LOCAL_ADDITIONAL_DEPENDENCIES := $(GYP_TARGET_DEPENDENCIES) $(GYP_GENERATED_OUTPUTS)
+
+### Rules for final target.
+# Add target alias to "gyp_all_modules" target.
+.PHONY: gyp_all_modules
+gyp_all_modules: third_party_WebKit_public_blink_gyp
+
+# Alias gyp target name.
+.PHONY: blink
+blink: third_party_WebKit_public_blink_gyp
+
+LOCAL_MODULE_PATH := $(PRODUCT_OUT)/gyp_stamp
+LOCAL_UNINSTALLABLE_MODULE := true
+
+include $(BUILD_SYSTEM)/base_rules.mk
+
+$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES)
+	$(hide) echo "Gyp timestamp: $@"
+	$(hide) mkdir -p $(dir $@)
+	$(hide) touch $@
diff --git a/public/platform/Platform.h b/public/platform/Platform.h
index 5663057..acff986 100644
--- a/public/platform/Platform.h
+++ b/public/platform/Platform.h
@@ -54,6 +54,7 @@
 class WebClipboard;
 class WebCompositorSupport;
 class WebCookieJar;
+class WebDeviceMotionListener;
 class WebDiscardableMemory;
 class WebFallbackThemeEngine;
 class WebFileSystem;
@@ -63,6 +64,7 @@
 class WebGestureCurve;
 class WebGraphicsContext3DProvider;
 class WebHyphenator;
+class WebIDBFactory;
 class WebMediaStreamCenter;
 class WebMediaStreamCenterClient;
 class WebMessagePortChannel;
@@ -178,6 +180,10 @@
     // Must return non-null.
     virtual WebFileSystem* fileSystem() { return 0; }
 
+    // IndexedDB ----------------------------------------------------------
+
+    // Must return non-null.
+    virtual WebIDBFactory* idbFactory() { return 0; }
 
     // Gamepad -------------------------------------------------------------
 
@@ -404,7 +410,7 @@
     virtual TraceEventAPIAtomicWord* getTraceSamplingState(const unsigned bucketName) { return 0; }
 
     // Add a trace event to the platform tracing system. Depending on the actual
-    // enabled state, this event may be recorded or dropped. 
+    // enabled state, this event may be recorded or dropped.
     // - phase specifies the type of event:
     //   - BEGIN ('B'): Marks the beginning of a scoped event.
     //   - END ('E'): Marks the end of a scoped event.
@@ -510,6 +516,13 @@
     virtual void didStartWorkerRunLoop(const WebWorkerRunLoop&) { }
     virtual void didStopWorkerRunLoop(const WebWorkerRunLoop&) { }
 
+
+    // Device Motion / Orientation ----------------------------------------
+
+    // Sets a Listener to listen for device motion data updates.
+    // If null, the platform stops providing device motion data to the current listener.
+    virtual void setDeviceMotionListener(WebKit::WebDeviceMotionListener*) { }
+
 protected:
     virtual ~Platform() { }
 };
diff --git a/public/platform/WebCString.h b/public/platform/WebCString.h
index 8fa0e82..7eb6fc1 100644
--- a/public/platform/WebCString.h
+++ b/public/platform/WebCString.h
@@ -32,6 +32,7 @@
 #define WebCString_h
 
 #include "WebCommon.h"
+#include "WebPrivatePtr.h"
 
 #if WEBKIT_IMPLEMENTATION
 #include <wtf/Forward.h>
@@ -41,11 +42,11 @@
 
 namespace WTF {
 class CString;
+class CStringBuffer;
 }
 
 namespace WebKit {
 
-class WebCStringPrivate;
 class WebString;
 
 // A single-byte string container with unspecified encoding.  It is
@@ -57,14 +58,14 @@
 public:
     ~WebCString() { reset(); }
 
-    WebCString() : m_private(0) { }
+    WebCString() { }
 
-    WebCString(const char* data, size_t len) : m_private(0)
+    WebCString(const char* data, size_t len)
     {
         assign(data, len);
     }
 
-    WebCString(const WebCString& s) : m_private(0) { assign(s); }
+    WebCString(const WebCString& s) { assign(s); }
 
     WebCString& operator=(const WebCString& s)
     {
@@ -85,7 +86,7 @@
     WEBKIT_EXPORT const char* data() const;
 
     bool isEmpty() const { return !length(); }
-    bool isNull() const { return !m_private; }
+    bool isNull() const { return m_private.isNull(); }
 
     WEBKIT_EXPORT WebString utf16() const;
 
@@ -94,7 +95,7 @@
     WebCString& operator=(const WTF::CString&);
     operator WTF::CString() const;
 #else
-    WebCString(const std::string& s) : m_private(0)
+    WebCString(const std::string& s)
     {
         assign(s.data(), s.length());
     }
@@ -119,8 +120,8 @@
 #endif
 
 private:
-    void assign(WebCStringPrivate*);
-    WebCStringPrivate* m_private;
+    void assign(WTF::CStringBuffer*);
+    WebPrivatePtr<WTF::CStringBuffer> m_private;
 };
 
 inline bool operator<(const WebCString& a, const WebCString& b)
diff --git a/public/platform/WebCommon.h b/public/platform/WebCommon.h
index 1475615..0140077 100644
--- a/public/platform/WebCommon.h
+++ b/public/platform/WebCommon.h
@@ -77,6 +77,9 @@
 typedef unsigned short WebUChar;
 #endif
 
+// Latin-1 character type
+typedef unsigned char WebLChar;
+
 // -----------------------------------------------------------------------------
 // Assertions
 
diff --git a/public/platform/WebContentLayer.h b/public/platform/WebContentLayer.h
index 36a23fc..0b13fa1 100644
--- a/public/platform/WebContentLayer.h
+++ b/public/platform/WebContentLayer.h
@@ -48,11 +48,6 @@
     // to false.
     virtual void setAutomaticallyComputeRasterScale(bool) { }
 
-    // Set to render text in this layer with LCD antialiasing. Only set if you know that this layer will be
-    // drawn in a way where this makes sense - i.e. opaque background, not rotated or scaled, etc.
-    // Defaults to false;
-    virtual void setUseLCDText(bool) = 0;
-
     // Set to draw a system-defined checkerboard if the compositor would otherwise draw a tile in this layer
     // and the actual contents are unavailable. If false, the compositor will draw the layer's background color
     // for these tiles.
diff --git a/public/platform/WebDeviceMotionData.h b/public/platform/WebDeviceMotionData.h
new file mode 100644
index 0000000..9c173b5
--- /dev/null
+++ b/public/platform/WebDeviceMotionData.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDeviceMotionData_h
+#define WebDeviceMotionData_h
+
+#include "WebCommon.h"
+
+namespace WebKit {
+
+#pragma pack(push, 1)
+
+class WebDeviceMotionData {
+public:
+    WEBKIT_EXPORT WebDeviceMotionData();
+    ~WebDeviceMotionData() { }
+
+    double accelerationX;
+    double accelerationY;
+    double accelerationZ;
+
+    double accelerationIncludingGravityX;
+    double accelerationIncludingGravityY;
+    double accelerationIncludingGravityZ;
+
+    double rotationRateAlpha;
+    double rotationRateBeta;
+    double rotationRateGamma;
+
+    double interval;
+
+    bool hasAccelerationX : 1;
+    bool hasAccelerationY : 1;
+    bool hasAccelerationZ : 1;
+
+    bool hasAccelerationIncludingGravityX : 1;
+    bool hasAccelerationIncludingGravityY : 1;
+    bool hasAccelerationIncludingGravityZ : 1;
+
+    bool hasRotationRateAlpha : 1;
+    bool hasRotationRateBeta : 1;
+    bool hasRotationRateGamma : 1;
+};
+
+#if WEBKIT_IMPLEMENTATION
+COMPILE_ASSERT(sizeof(WebDeviceMotionData) == (10 * sizeof(double) + 2 * sizeof(char)), WebDeviceMotionData_has_wrong_size);
+#endif
+
+#pragma pack(pop)
+
+} // namespace WebKit
+
+#endif // WebDeviceMotionData_h
diff --git a/public/platform/WebDeviceMotionListener.h b/public/platform/WebDeviceMotionListener.h
new file mode 100644
index 0000000..b8da150
--- /dev/null
+++ b/public/platform/WebDeviceMotionListener.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDeviceMotionListener_h
+#define WebDeviceMotionListener_h
+
+namespace WebKit {
+
+class WebDeviceMotionData;
+
+class WebDeviceMotionListener {
+public:
+    // This method is called every time new device motion data is available.
+    virtual void didChangeDeviceMotion(const WebDeviceMotionData&) = 0;
+};
+
+} // namespace WebKit
+
+#endif // WebDeviceMotionListener_h
diff --git a/public/platform/WebGraphicsContext3D.h b/public/platform/WebGraphicsContext3D.h
index 38e0a71..54bf283 100644
--- a/public/platform/WebGraphicsContext3D.h
+++ b/public/platform/WebGraphicsContext3D.h
@@ -186,8 +186,6 @@
     // Query whether it is built on top of compliant GLES2 implementation.
     virtual bool isGLES2Compliant() { return true; }
 
-    virtual bool setParentContext(WebGraphicsContext3D* parentContext) { return false; }
-
     virtual unsigned insertSyncPoint() { return 0; }
     virtual void waitSyncPoint(unsigned) { }
     // This call passes ownership of the WebGraphicsSyncPointCallback to the
diff --git a/public/platform/WebIDBCursor.h b/public/platform/WebIDBCursor.h
index 2028422..f8d632f 100644
--- a/public/platform/WebIDBCursor.h
+++ b/public/platform/WebIDBCursor.h
@@ -47,7 +47,6 @@
 
     virtual void advance(unsigned long, WebIDBCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void continueFunction(const WebIDBKey&, WebIDBCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
-    virtual void deleteFunction(WebIDBCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void prefetchContinue(int numberToFetch, WebIDBCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void prefetchReset(int usedPrefetches, int unusedPrefetches) { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual void postSuccessHandlerCallback() { } // Only used in frontend.
diff --git a/public/platform/WebIDBFactory.h b/public/platform/WebIDBFactory.h
index d79539f..ed7653e 100644
--- a/public/platform/WebIDBFactory.h
+++ b/public/platform/WebIDBFactory.h
@@ -45,8 +45,6 @@
 // http://dev.w3.org/2006/webapi/WebSimpleDB/
 class WebIDBFactory {
 public:
-    WEBKIT_EXPORT static WebIDBFactory* create();
-
     virtual ~WebIDBFactory() { }
 
     virtual void getDatabaseNames(WebIDBCallbacks* callbacks, const WebString& databaseIdentifier, const WebString& dataDir) { }
@@ -56,9 +54,6 @@
     virtual void deleteDatabase(const WebString& name, WebIDBCallbacks* callbacks, const WebString& databaseIdentifier, const WebString& dataDir) { WEBKIT_ASSERT_NOT_REACHED(); }
 };
 
-// Initializes IndexedDB support.
-WEBKIT_EXPORT void setIDBFactory(WebIDBFactory*);
-
 } // namespace WebKit
 
 #endif // WebIDBFactory_h
diff --git a/public/platform/WebLayer.h b/public/platform/WebLayer.h
index c43a813..a21ffed 100644
--- a/public/platform/WebLayer.h
+++ b/public/platform/WebLayer.h
@@ -168,7 +168,7 @@
     virtual bool hasActiveAnimation() = 0;
 
     // Transfers all animations running on the current layer.
-    virtual void transferAnimationsTo(WebLayer*) = 0;
+    virtual void transferAnimationsTo(WebLayer*) { }
 
     // Scrolling
     virtual void setScrollPosition(WebPoint) = 0;
diff --git a/public/platform/WebMediaStreamCenter.h b/public/platform/WebMediaStreamCenter.h
index 18348a4..8340a4e 100644
--- a/public/platform/WebMediaStreamCenter.h
+++ b/public/platform/WebMediaStreamCenter.h
@@ -31,18 +31,21 @@
 #ifndef WebMediaStreamCenter_h
 #define WebMediaStreamCenter_h
 
-#include "WebString.h"
+#include "WebVector.h"
 
 namespace WebKit {
 class WebMediaStream;
 class WebMediaStreamSourcesRequest;
 class WebMediaStreamTrack;
+class WebSourceInfo;
+class WebString;
 
 class WebMediaStreamCenter {
 public:
     virtual ~WebMediaStreamCenter() { }
 
     virtual void queryMediaStreamSources(const WebMediaStreamSourcesRequest&) = 0;
+    virtual bool getSourceInfos(const WebString& url, WebVector<WebSourceInfo>&) { return false; }
     virtual void didEnableMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack&) = 0;
     virtual void didDisableMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack&) = 0;
     virtual bool didAddMediaStreamTrack(const WebMediaStream&, const WebMediaStreamTrack&) { return false; };
diff --git a/public/platform/WebRTCDataChannelInit.h b/public/platform/WebRTCDataChannelInit.h
new file mode 100644
index 0000000..5ab0d05
--- /dev/null
+++ b/public/platform/WebRTCDataChannelInit.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebRTCDataChannelInit_h
+#define WebRTCDataChannelInit_h
+
+#include "WebString.h"
+
+namespace WebKit {
+
+struct WebRTCDataChannelInit {
+public:
+    WebRTCDataChannelInit()
+        : ordered(true)
+        , maxRetransmitTime(-1)
+        , maxRetransmits(-1)
+        , negotiated(true)
+        , id(-1) { }
+    bool ordered;
+    int maxRetransmitTime;
+    int maxRetransmits;
+    WebString protocol;
+    bool negotiated;
+    int id;
+};
+
+} // namespace WebKit
+
+#endif // WebRTCDataChannelInit_h
diff --git a/public/platform/WebRTCPeerConnectionHandler.h b/public/platform/WebRTCPeerConnectionHandler.h
index c4defa8..7d9310e 100644
--- a/public/platform/WebRTCPeerConnectionHandler.h
+++ b/public/platform/WebRTCPeerConnectionHandler.h
@@ -45,6 +45,7 @@
 class WebRTCStatsRequest;
 class WebRTCVoidRequest;
 class WebString;
+struct WebRTCDataChannelInit;
 
 class WebRTCPeerConnectionHandler {
 public:
@@ -63,7 +64,7 @@
     virtual bool addStream(const WebMediaStream&, const WebMediaConstraints&) = 0;
     virtual void removeStream(const WebMediaStream&) = 0;
     virtual void getStats(const WebRTCStatsRequest&) = 0;
-    virtual WebRTCDataChannelHandler* createDataChannel(const WebString& label, bool reliable) = 0;
+    virtual WebRTCDataChannelHandler* createDataChannel(const WebString& label, const WebRTCDataChannelInit&) = 0;
     virtual WebRTCDTMFSenderHandler* createDTMFSender(const WebMediaStreamTrack&) = 0;
     virtual void stop() = 0;
 };
diff --git a/public/platform/WebSourceInfo.h b/public/platform/WebSourceInfo.h
new file mode 100644
index 0000000..0ae96e7
--- /dev/null
+++ b/public/platform/WebSourceInfo.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2013 Google 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 GOOGLE INC. ``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 GOOGLE INC. OR
+ * 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 WebSourceInfo_h
+#define WebSourceInfo_h
+
+#include "WebCommon.h"
+#include "WebNonCopyable.h"
+#include "WebPrivatePtr.h"
+#include "WebString.h"
+
+namespace WebKit {
+
+class WebSourceInfoPrivate;
+
+class WebSourceInfo {
+public:
+    enum SourceKind {
+        SourceKindNone,
+        SourceKindAudio,
+        SourceKindVideo
+    };
+
+    enum VideoFacingMode {
+        VideoFacingModeNone,
+        VideoFacingModeUser,
+        VideoFacingModeEnvironment
+    };
+
+    WebSourceInfo() { }
+    WebSourceInfo(const WebSourceInfo& other) { assign(other); }
+    ~WebSourceInfo() { reset(); }
+
+    WebSourceInfo& operator=(const WebSourceInfo& other)
+    {
+        assign(other);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void assign(const WebSourceInfo&);
+
+    WEBKIT_EXPORT void initialize(const WebString& id, SourceKind, const WebString& label, VideoFacingMode);
+    WEBKIT_EXPORT void reset();
+    bool isNull() const { return m_private.isNull(); }
+
+    WEBKIT_EXPORT WebString id() const;
+    WEBKIT_EXPORT SourceKind kind() const;
+    WEBKIT_EXPORT WebString label() const;
+    WEBKIT_EXPORT VideoFacingMode facing() const;
+
+private:
+    WebPrivatePtr<WebSourceInfoPrivate> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebSourceInfo_h
diff --git a/public/platform/WebString.h b/public/platform/WebString.h
index b8bc939..1d3b402 100644
--- a/public/platform/WebString.h
+++ b/public/platform/WebString.h
@@ -32,18 +32,23 @@
 #define WebString_h
 
 #include "WebCommon.h"
+#include "WebPrivatePtr.h"
 
 #if WEBKIT_IMPLEMENTATION
 #include <wtf/Forward.h>
 #else
 #include <base/nullable_string16.h>
 #include <base/string16.h>
+#include <base/strings/latin1_string_conversions.h>
 #endif
 
+namespace WTF {
+class StringImpl;
+}
+
 namespace WebKit {
 
 class WebCString;
-class WebStringPrivate;
 
 // A UTF-16 string container.  It is inexpensive to copy a WebString
 // object.
@@ -54,14 +59,14 @@
 public:
     ~WebString() { reset(); }
 
-    WebString() : m_private(0) { }
+    WebString() { }
 
-    WebString(const WebUChar* data, size_t len) : m_private(0)
+    WebString(const WebUChar* data, size_t len)
     {
         assign(data, len);
     }
 
-    WebString(const WebString& s) : m_private(0) { assign(s); }
+    WebString(const WebString& s) { assign(s); }
 
     WebString& operator=(const WebString& s)
     {
@@ -76,13 +81,12 @@
     WEBKIT_EXPORT bool equals(const WebString& s) const;
 
     WEBKIT_EXPORT size_t length() const;
-    WEBKIT_EXPORT const WebUChar* data() const;
 
     // Caller must check bounds.
     WEBKIT_EXPORT WebUChar at(unsigned) const;
 
     bool isEmpty() const { return !length(); }
-    bool isNull() const { return !m_private; }
+    bool isNull() const { return m_private.isNull(); }
 
     WEBKIT_EXPORT WebCString utf8() const;
 
@@ -90,7 +94,6 @@
     WEBKIT_EXPORT static WebString fromUTF8(const char* data);
 
     template <int N> WebString(const char (&data)[N])
-        : m_private(0)
     {
         assign(fromUTF8(data, N - 1));
     }
@@ -111,7 +114,7 @@
     operator WTF::AtomicString() const;
 #else
 
-    WebString(const string16& s) : m_private(0)
+    WebString(const string16& s)
     {
         assign(s.data(), s.length());
     }
@@ -124,11 +127,10 @@
 
     operator string16() const
     {
-        size_t len = length();
-        return len ? string16(data(), len) : string16();
+        return base::Latin1OrUTF16ToUTF16(length(), data8(), data16());
     }
 
-    WebString(const NullableString16& s) : m_private(0)
+    WebString(const NullableString16& s)
     {
         if (s.is_null())
             reset();
@@ -147,10 +149,7 @@
 
     operator NullableString16() const
     {
-        if (!m_private)
-            return NullableString16(string16(), true);
-        size_t len = length();
-        return NullableString16(len ? string16(data(), len) : string16(), false);
+        return NullableString16(operator string16(), m_private.isNull());
     }
 
     template <class UTF8String>
@@ -161,9 +160,13 @@
 #endif
 
 private:
-    void assign(WebStringPrivate*);
+    WEBKIT_EXPORT bool is8Bit() const;
+    WEBKIT_EXPORT const WebLChar* data8() const;
+    WEBKIT_EXPORT const WebUChar* data16() const;
 
-    WebStringPrivate* m_private;
+    void assign(WTF::StringImpl*);
+
+    WebPrivatePtr<WTF::StringImpl> m_private;
 };
 
 inline bool operator==(const WebString& a, const WebString& b)
diff --git a/public/platform/WebURLLoadTiming.h b/public/platform/WebURLLoadTiming.h
index fc185a5..07f15d2 100644
--- a/public/platform/WebURLLoadTiming.h
+++ b/public/platform/WebURLLoadTiming.h
@@ -60,7 +60,6 @@
     WEBKIT_EXPORT double requestTime() const;
     WEBKIT_EXPORT void setRequestTime(double);
 
-#ifdef ENABLE_DOUBLE_RESOURCE_LOAD_TIMING
     WEBKIT_EXPORT double proxyStart() const;
     WEBKIT_EXPORT void setProxyStart(double);
 
@@ -93,40 +92,6 @@
 
     WEBKIT_EXPORT double sslEnd() const;
     WEBKIT_EXPORT void setSSLEnd(double);
-#else
-    WEBKIT_EXPORT int proxyStart() const;
-    WEBKIT_EXPORT void setProxyStart(int);
-
-    WEBKIT_EXPORT int proxyEnd() const;
-    WEBKIT_EXPORT void setProxyEnd(int);
-
-    WEBKIT_EXPORT int dnsStart() const;
-    WEBKIT_EXPORT void setDNSStart(int);
-
-    WEBKIT_EXPORT int dnsEnd() const;
-    WEBKIT_EXPORT void setDNSEnd(int);
-
-    WEBKIT_EXPORT int connectStart() const;
-    WEBKIT_EXPORT void setConnectStart(int);
-
-    WEBKIT_EXPORT int connectEnd() const;
-    WEBKIT_EXPORT void setConnectEnd(int);
-
-    WEBKIT_EXPORT int sendStart() const;
-    WEBKIT_EXPORT void setSendStart(int);
-
-    WEBKIT_EXPORT int sendEnd() const;
-    WEBKIT_EXPORT void setSendEnd(int);
-
-    WEBKIT_EXPORT int receiveHeadersEnd() const;
-    WEBKIT_EXPORT void setReceiveHeadersEnd(int);
-
-    WEBKIT_EXPORT int sslStart() const;
-    WEBKIT_EXPORT void setSSLStart(int);
-
-    WEBKIT_EXPORT int sslEnd() const;
-    WEBKIT_EXPORT void setSSLEnd(int);
-#endif
 
 #if WEBKIT_IMPLEMENTATION
     WebURLLoadTiming(const WTF::PassRefPtr<WebCore::ResourceLoadTiming>&);
diff --git a/public/webpage/WebAccessibilityNotification.h b/public/webpage/WebAccessibilityNotification.h
new file mode 100644
index 0000000..629d988
--- /dev/null
+++ b/public/webpage/WebAccessibilityNotification.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebAccessibilityNotification_h
+#define WebAccessibilityNotification_h
+
+namespace WebKit {
+
+// These values must match WebCore::AXObjectCache::AXNotification values.
+// Enforced in AssertMatchingEnums.cpp.
+enum WebAccessibilityNotification {
+    WebAccessibilityNotificationActiveDescendantChanged,
+    WebAccessibilityNotificationAutocorrectionOccured,
+    WebAccessibilityNotificationCheckedStateChanged,
+    WebAccessibilityNotificationChildrenChanged,
+    WebAccessibilityNotificationFocusedUIElementChanged,
+    WebAccessibilityNotificationLayoutComplete,
+    WebAccessibilityNotificationLoadComplete,
+    WebAccessibilityNotificationSelectedChildrenChanged,
+    WebAccessibilityNotificationSelectedTextChanged,
+    WebAccessibilityNotificationValueChanged,
+    WebAccessibilityNotificationScrolledToAnchor,
+    WebAccessibilityNotificationLiveRegionChanged,
+    WebAccessibilityNotificationMenuListItemSelected,
+    WebAccessibilityNotificationMenuListValueChanged,
+    WebAccessibilityNotificationRowCountChanged,
+    WebAccessibilityNotificationRowCollapsed,
+    WebAccessibilityNotificationRowExpanded,
+    WebAccessibilityNotificationInvalidStatusChanged,
+    WebAccessibilityNotificationTextChanged,
+    WebAccessibilityNotificationAriaAttributeChanged
+};
+
+} // namespace WebKit
+
+#endif // WebAccessibilityNotification_h
diff --git a/public/webpage/WebAccessibilityObject.h b/public/webpage/WebAccessibilityObject.h
new file mode 100644
index 0000000..a8f149a
--- /dev/null
+++ b/public/webpage/WebAccessibilityObject.h
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebAccessibilityObject_h
+#define WebAccessibilityObject_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebVector.h"
+#include "WebAccessibilityRole.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebCore { class AccessibilityObject; }
+
+namespace WebKit {
+
+class WebNode;
+class WebDocument;
+class WebString;
+class WebURL;
+struct WebPoint;
+struct WebRect;
+
+// A container for passing around a reference to AccessibilityObject.
+class WebAccessibilityObject {
+public:
+    ~WebAccessibilityObject() { reset(); }
+
+    WebAccessibilityObject() { }
+    WebAccessibilityObject(const WebAccessibilityObject& o) { assign(o); }
+    WebAccessibilityObject& operator=(const WebAccessibilityObject& o)
+    {
+        assign(o);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebAccessibilityObject&);
+    WEBKIT_EXPORT bool equals(const WebAccessibilityObject&) const;
+
+    bool isNull() const { return m_private.isNull(); }
+    // isDetached also checks for null, so it's safe to just call isDetached.
+    WEBKIT_EXPORT bool isDetached() const;
+
+    // Static methods for enabling accessibility.
+    WEBKIT_EXPORT static void enableAccessibility();
+    WEBKIT_EXPORT static bool accessibilityEnabled();
+
+    WEBKIT_EXPORT void startCachingComputedObjectAttributesUntilTreeMutates();
+    WEBKIT_EXPORT void stopCachingComputedObjectAttributes();
+
+    WEBKIT_EXPORT int axID() const;
+
+    // Update the underlying tree, and return true if this object is
+    // still valid (not detached). Note that calling this method
+    // can cause other WebAccessibilityObjects to become invalid, too,
+    // so always call isDetached if updateBackingStoreAndCheckValidity
+    // has been called on any object, or if any other WebCore code has run.
+    WEBKIT_EXPORT bool updateBackingStoreAndCheckValidity();
+
+    WEBKIT_EXPORT WebString accessibilityDescription() const;
+    WEBKIT_EXPORT unsigned childCount() const;
+
+    WEBKIT_EXPORT WebAccessibilityObject childAt(unsigned) const;
+    WEBKIT_EXPORT WebAccessibilityObject parentObject() const;
+
+    WEBKIT_EXPORT bool isAnchor() const;
+    WEBKIT_EXPORT bool isAriaReadOnly() const;
+    WEBKIT_EXPORT bool isButtonStateMixed() const;
+    WEBKIT_EXPORT bool isChecked() const;
+    WEBKIT_EXPORT bool isCollapsed() const;
+    WEBKIT_EXPORT bool isControl() const;
+    WEBKIT_EXPORT bool isEnabled() const;
+    WEBKIT_EXPORT bool isFocused() const;
+    WEBKIT_EXPORT bool isHovered() const;
+    WEBKIT_EXPORT bool isIndeterminate() const;
+    WEBKIT_EXPORT bool isLinked() const;
+    WEBKIT_EXPORT bool isLoaded() const;
+    WEBKIT_EXPORT bool isMultiSelectable() const;
+    WEBKIT_EXPORT bool isOffScreen() const;
+    WEBKIT_EXPORT bool isPasswordField() const;
+    WEBKIT_EXPORT bool isPressed() const;
+    WEBKIT_EXPORT bool isReadOnly() const;
+    WEBKIT_EXPORT bool isRequired() const;
+    WEBKIT_EXPORT bool isSelected() const;
+    WEBKIT_EXPORT bool isSelectedOptionActive() const;
+    WEBKIT_EXPORT bool isVertical() const;
+    WEBKIT_EXPORT bool isVisible() const;
+    WEBKIT_EXPORT bool isVisited() const;
+
+    WEBKIT_EXPORT WebString accessKey() const;
+    WEBKIT_EXPORT bool ariaHasPopup() const;
+    WEBKIT_EXPORT bool ariaLiveRegionAtomic() const;
+    WEBKIT_EXPORT bool ariaLiveRegionBusy() const;
+    WEBKIT_EXPORT WebString ariaLiveRegionRelevant() const;
+    WEBKIT_EXPORT WebString ariaLiveRegionStatus() const;
+    WEBKIT_EXPORT WebRect boundingBoxRect() const;
+    WEBKIT_EXPORT bool canvasHasFallbackContent() const;
+    WEBKIT_EXPORT WebPoint clickPoint() const;
+    WEBKIT_EXPORT void colorValue(int& r, int& g, int& b) const;
+    WEBKIT_EXPORT double estimatedLoadingProgress() const;
+    WEBKIT_EXPORT WebString helpText() const;
+    WEBKIT_EXPORT int headingLevel() const;
+    WEBKIT_EXPORT int hierarchicalLevel() const;
+    WEBKIT_EXPORT WebAccessibilityObject hitTest(const WebPoint&) const;
+    WEBKIT_EXPORT WebString keyboardShortcut() const;
+    WEBKIT_EXPORT WebAccessibilityRole roleValue() const;
+    WEBKIT_EXPORT unsigned selectionEnd() const;
+    WEBKIT_EXPORT unsigned selectionEndLineNumber() const;
+    WEBKIT_EXPORT unsigned selectionStart() const;
+    WEBKIT_EXPORT unsigned selectionStartLineNumber() const;
+    WEBKIT_EXPORT WebString stringValue() const;
+    WEBKIT_EXPORT WebString title() const;
+    WEBKIT_EXPORT WebAccessibilityObject titleUIElement() const;
+    WEBKIT_EXPORT WebURL url() const;
+
+    WEBKIT_EXPORT bool supportsRangeValue() const;
+    WEBKIT_EXPORT WebString valueDescription() const;
+    WEBKIT_EXPORT float valueForRange() const;
+    WEBKIT_EXPORT float maxValueForRange() const;
+    WEBKIT_EXPORT float minValueForRange() const;
+
+    WEBKIT_EXPORT WebNode node() const;
+    WEBKIT_EXPORT WebDocument document() const;
+    WEBKIT_EXPORT bool hasComputedStyle() const;
+    WEBKIT_EXPORT WebString computedStyleDisplay() const;
+    WEBKIT_EXPORT bool accessibilityIsIgnored() const;
+    WEBKIT_EXPORT bool lineBreaks(WebVector<int>&) const;
+
+    // Actions
+    WEBKIT_EXPORT WebString actionVerb() const; // The verb corresponding to performDefaultAction.
+    WEBKIT_EXPORT bool canDecrement() const;
+    WEBKIT_EXPORT bool canIncrement() const;
+    WEBKIT_EXPORT bool canPress() const;
+    WEBKIT_EXPORT bool canSetFocusAttribute() const;
+    WEBKIT_EXPORT bool canSetSelectedAttribute() const;
+    WEBKIT_EXPORT bool canSetValueAttribute() const;
+    WEBKIT_EXPORT bool performDefaultAction() const;
+    WEBKIT_EXPORT bool press() const;
+    WEBKIT_EXPORT bool increment() const;
+    WEBKIT_EXPORT bool decrement() const;
+    WEBKIT_EXPORT void setFocused(bool) const;
+    WEBKIT_EXPORT void setSelectedTextRange(int selectionStart, int selectionEnd) const;
+
+    // For a table
+    WEBKIT_EXPORT unsigned columnCount() const;
+    WEBKIT_EXPORT unsigned rowCount() const;
+    WEBKIT_EXPORT WebAccessibilityObject cellForColumnAndRow(unsigned column, unsigned row) const;
+    WEBKIT_EXPORT WebAccessibilityObject headerContainerObject() const;
+    WEBKIT_EXPORT WebAccessibilityObject rowAtIndex(unsigned rowIndex) const;
+    WEBKIT_EXPORT WebAccessibilityObject columnAtIndex(unsigned columnIndex) const;
+
+    // For a table row
+    WEBKIT_EXPORT unsigned rowIndex() const;
+    WEBKIT_EXPORT WebAccessibilityObject rowHeader() const;
+
+    // For a table column
+    WEBKIT_EXPORT unsigned columnIndex() const;
+    WEBKIT_EXPORT WebAccessibilityObject columnHeader() const;
+
+    // For a table cell
+    WEBKIT_EXPORT unsigned cellColumnIndex() const;
+    WEBKIT_EXPORT unsigned cellColumnSpan() const;
+    WEBKIT_EXPORT unsigned cellRowIndex() const;
+    WEBKIT_EXPORT unsigned cellRowSpan() const;
+
+    // Make this object visible by scrolling as many nested scrollable views as needed.
+    WEBKIT_EXPORT void scrollToMakeVisible() const;
+    // Same, but if the whole object can't be made visible, try for this subrect, in local coordinates.
+    WEBKIT_EXPORT void scrollToMakeVisibleWithSubFocus(const WebRect&) const;
+    // Scroll this object to a given point in global coordinates of the top-level window.
+    WEBKIT_EXPORT void scrollToGlobalPoint(const WebPoint&) const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebAccessibilityObject(const WTF::PassRefPtr<WebCore::AccessibilityObject>&);
+    WebAccessibilityObject& operator=(const WTF::PassRefPtr<WebCore::AccessibilityObject>&);
+    operator WTF::PassRefPtr<WebCore::AccessibilityObject>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::AccessibilityObject> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebAccessibilityRole.h b/public/webpage/WebAccessibilityRole.h
new file mode 100644
index 0000000..196ef22
--- /dev/null
+++ b/public/webpage/WebAccessibilityRole.h
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebAccessibilityRole_h
+#define WebAccessibilityRole_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// These values must match WebCore::AccessibilityRole values
+enum WebAccessibilityRole {
+    WebAccessibilityRoleAnnotation = 1,
+    WebAccessibilityRoleApplication,
+    WebAccessibilityRoleApplicationAlert,
+    WebAccessibilityRoleApplicationAlertDialog,
+    WebAccessibilityRoleApplicationDialog,
+    WebAccessibilityRoleApplicationLog,
+    WebAccessibilityRoleApplicationMarquee,
+    WebAccessibilityRoleApplicationStatus,
+    WebAccessibilityRoleApplicationTimer, 
+    WebAccessibilityRoleBrowser,
+    WebAccessibilityRoleBusyIndicator,
+    WebAccessibilityRoleButton,
+    WebAccessibilityRoleCanvas,
+    WebAccessibilityRoleCell, 
+    WebAccessibilityRoleCheckBox,
+    WebAccessibilityRoleColorWell,
+    WebAccessibilityRoleColumn,
+    WebAccessibilityRoleColumnHeader,
+    WebAccessibilityRoleComboBox,
+    WebAccessibilityRoleDefinition,
+    WebAccessibilityRoleDescriptionListTerm,
+    WebAccessibilityRoleDescriptionListDetail,
+    WebAccessibilityRoleDirectory,
+    WebAccessibilityRoleDisclosureTriangle,
+    WebAccessibilityRoleDiv,
+    WebAccessibilityRoleDocument,
+    WebAccessibilityRoleDocumentArticle,
+    WebAccessibilityRoleDocumentMath,
+    WebAccessibilityRoleDocumentNote,
+    WebAccessibilityRoleDocumentRegion,
+    WebAccessibilityRoleDrawer,
+    WebAccessibilityRoleEditableText,
+    WebAccessibilityRoleFooter,
+    WebAccessibilityRoleForm,
+    WebAccessibilityRoleGrid,
+    WebAccessibilityRoleGroup,
+    WebAccessibilityRoleGrowArea,
+    WebAccessibilityRoleHeading,
+    WebAccessibilityRoleHelpTag,
+    WebAccessibilityRoleHorizontalRule,
+    WebAccessibilityRoleIgnored,
+    WebAccessibilityRoleImage,
+    WebAccessibilityRoleImageMap,
+    WebAccessibilityRoleImageMapLink,
+    WebAccessibilityRoleIncrementor,
+    WebAccessibilityRoleLabel,
+    WebAccessibilityRoleLandmarkApplication,
+    WebAccessibilityRoleLandmarkBanner,
+    WebAccessibilityRoleLandmarkComplementary,
+    WebAccessibilityRoleLandmarkContentInfo,
+    WebAccessibilityRoleLandmarkMain,
+    WebAccessibilityRoleLandmarkNavigation,
+    WebAccessibilityRoleLandmarkSearch,
+    WebAccessibilityRoleLegend,
+    WebAccessibilityRoleLink,
+    WebAccessibilityRoleList,
+    WebAccessibilityRoleListBox,
+    WebAccessibilityRoleListBoxOption,
+    WebAccessibilityRoleListItem,
+    WebAccessibilityRoleListMarker,
+    WebAccessibilityRoleMathElement,
+    WebAccessibilityRoleMatte,
+    WebAccessibilityRoleMenu,
+    WebAccessibilityRoleMenuBar,
+    WebAccessibilityRoleMenuButton,
+    WebAccessibilityRoleMenuItem,
+    WebAccessibilityRoleMenuListPopup,
+    WebAccessibilityRoleMenuListOption,
+    WebAccessibilityRoleOutline,
+    WebAccessibilityRoleParagraph,
+    WebAccessibilityRolePopUpButton,
+    WebAccessibilityRolePresentational,
+    WebAccessibilityRoleProgressIndicator,
+    WebAccessibilityRoleRadioButton,
+    WebAccessibilityRoleRadioGroup,
+    WebAccessibilityRoleRowHeader,
+    WebAccessibilityRoleRow,
+    WebAccessibilityRoleRuler,
+    WebAccessibilityRoleRulerMarker,
+    WebAccessibilityRoleScrollArea,
+    WebAccessibilityRoleScrollBar,
+    WebAccessibilityRoleSeamlessWebArea,
+    WebAccessibilityRoleSheet,
+    WebAccessibilityRoleSlider,
+    WebAccessibilityRoleSliderThumb,
+    WebAccessibilityRoleSpinButton,
+    WebAccessibilityRoleSpinButtonPart,
+    WebAccessibilityRoleSplitGroup,
+    WebAccessibilityRoleSplitter,
+    WebAccessibilityRoleStaticText,
+    WebAccessibilityRoleSystemWide,
+    WebAccessibilityRoleSVGRoot,
+    WebAccessibilityRoleTabGroup,
+    WebAccessibilityRoleTabList,
+    WebAccessibilityRoleTabPanel,
+    WebAccessibilityRoleTab,
+    WebAccessibilityRoleTable,
+    WebAccessibilityRoleTableHeaderContainer,
+    WebAccessibilityRoleTextArea,
+    WebAccessibilityRoleTreeRole,
+    WebAccessibilityRoleTreeGrid,
+    WebAccessibilityRoleTreeItemRole,
+    WebAccessibilityRoleTextField,
+    WebAccessibilityRoleToggleButton,
+    WebAccessibilityRoleToolbar,
+    WebAccessibilityRoleUnknown,
+    WebAccessibilityRoleUserInterfaceTooltip,
+    WebAccessibilityRoleValueIndicator,
+    WebAccessibilityRoleWebArea,
+    WebAccessibilityRoleWebCoreLink,
+    WebAccessibilityRoleWindow,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebActiveWheelFlingParameters.h b/public/webpage/WebActiveWheelFlingParameters.h
new file mode 100644
index 0000000..8804bb1
--- /dev/null
+++ b/public/webpage/WebActiveWheelFlingParameters.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2012 Google 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 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 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 WebActiveWheelFlingParameters_h
+#define WebActiveWheelFlingParameters_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebFloatPoint.h"
+#include "../platform/WebPoint.h"
+#include "../platform/WebSize.h"
+#include "WebInputEvent.h"
+
+namespace WebKit {
+
+struct WebActiveWheelFlingParameters {
+    WebFloatPoint delta;
+    WebPoint point;
+    WebPoint globalPoint;
+    int modifiers;
+    WebGestureEvent::SourceDevice sourceDevice;
+    WebSize cumulativeScroll;
+    double startTime;
+
+    WebActiveWheelFlingParameters()
+        : modifiers(0)
+        , sourceDevice(WebGestureEvent::Touchpad)
+        , startTime(0)
+    {
+    }
+};
+
+}
+
+#endif
diff --git a/public/webpage/WebApplicationCacheHost.h b/public/webpage/WebApplicationCacheHost.h
new file mode 100644
index 0000000..4731b45
--- /dev/null
+++ b/public/webpage/WebApplicationCacheHost.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebApplicationCacheHost_h
+#define WebApplicationCacheHost_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebURL.h"
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+
+class WebApplicationCacheHostClient;
+class WebFrame;
+class WebURL;
+class WebURLRequest;
+class WebURLResponse;
+struct WebURLError;
+
+// This interface is used by webkit to call out to the embedder. Webkit uses
+// the WebFrameClient::createApplicationCacheHost method to create instances,
+// and calls delete when the instance is no longer needed.
+class WebApplicationCacheHost {
+public:
+    // These values must match WebCore::ApplicationCacheHost::Status values
+    enum Status {
+        Uncached,
+        Idle,
+        Checking,
+        Downloading,
+        UpdateReady,
+        Obsolete
+    };
+
+    // These values must match WebCore::ApplicationCacheHost::EventID values
+    enum EventID {
+        CheckingEvent,
+        ErrorEvent,
+        NoUpdateEvent,
+        DownloadingEvent,
+        ProgressEvent,
+        UpdateReadyEvent,
+        CachedEvent,
+        ObsoleteEvent
+    };
+
+    virtual ~WebApplicationCacheHost() { }
+
+    // Called for every request made within the context.
+    virtual void willStartMainResourceRequest(WebURLRequest& r, const WebFrame*) { }
+    virtual void willStartSubResourceRequest(WebURLRequest&) { }
+
+    // One or the other selectCache methods is called after having parsed the <html> tag.
+    // The latter returns false if the current document has been identified as a "foreign"
+    // entry, in which case the frame navigation will be restarted by webkit.
+    virtual void selectCacheWithoutManifest() { }
+    virtual bool selectCacheWithManifest(const WebURL& manifestURL) { return true; }
+
+    // Called as the main resource is retrieved.
+    virtual void didReceiveResponseForMainResource(const WebURLResponse&) { }
+    virtual void didReceiveDataForMainResource(const char* data, int len) { }
+    virtual void didFinishLoadingMainResource(bool success) { }
+
+    // Called on behalf of the scriptable interface.
+    virtual Status status() { return Uncached; }
+    virtual bool startUpdate() { return false; }
+    virtual bool swapCache() { return false; }
+    virtual void abort() { }
+
+    // Structures and methods to support inspecting Application Caches.
+    struct CacheInfo {
+        WebURL manifestURL; // Empty if there is no associated cache.
+        double creationTime;
+        double updateTime;
+        long long totalSize;
+        CacheInfo() : creationTime(0), updateTime(0), totalSize(0) { }
+    };
+    struct ResourceInfo {
+        WebURL url;
+        long long size;
+        bool isMaster;
+        bool isManifest;
+        bool isExplicit;
+        bool isForeign;
+        bool isFallback;
+        ResourceInfo() : size(0), isMaster(false), isManifest(false), isExplicit(false), isForeign(false), isFallback(false) { }
+    };
+    virtual void getAssociatedCacheInfo(CacheInfo*) { }
+    virtual void getResourceList(WebVector<ResourceInfo>*) { }
+    virtual void deleteAssociatedCacheGroup() { }
+};
+
+}  // namespace WebKit
+
+#endif  // WebApplicationCacheHost_h
diff --git a/public/webpage/WebApplicationCacheHostClient.h b/public/webpage/WebApplicationCacheHostClient.h
new file mode 100644
index 0000000..9f08a72
--- /dev/null
+++ b/public/webpage/WebApplicationCacheHostClient.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebApplicationCacheHostClient_h
+#define WebApplicationCacheHostClient_h
+
+#include "../platform/WebCommon.h"
+#include "WebApplicationCacheHost.h"
+
+namespace WebKit {
+
+// This interface is used by the embedder to call into webkit.
+class WebApplicationCacheHostClient {
+public:
+    // Called when a different cache, including possibly no cache, is associated with the host.
+    virtual void didChangeCacheAssociation() = 0;
+
+    // Called to fire events in the scriptable interface.
+    virtual void notifyEventListener(WebApplicationCacheHost::EventID) = 0;
+    virtual void notifyProgressEventListener(const WebURL&, int num_total, int num_complete) = 0;
+
+protected:
+    // Should not be deleted by the embedder.
+    virtual ~WebApplicationCacheHostClient() { }
+};
+
+}  // namespace WebKit
+
+#endif  // WebApplicationCacheHostClient_h
+
diff --git a/public/webpage/WebArrayBuffer.h b/public/webpage/WebArrayBuffer.h
new file mode 100644
index 0000000..ecee122
--- /dev/null
+++ b/public/webpage/WebArrayBuffer.h
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebArrayBuffer_h
+#define WebArrayBuffer_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace v8 {
+class Value;
+template <class T> class Handle;
+}
+
+namespace WTF { class ArrayBuffer; }
+
+namespace WebKit {
+
+class WebArrayBuffer {
+public:
+    ~WebArrayBuffer() { reset(); }
+
+    WebArrayBuffer() { }
+    WebArrayBuffer(const WebArrayBuffer& b) { assign(b); }
+    WebArrayBuffer& operator=(const WebArrayBuffer& b)
+    {
+        assign(b);
+        return *this;
+    }
+
+    WEBKIT_EXPORT static WebArrayBuffer create(unsigned numElements, unsigned elementByteSize);
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebArrayBuffer&);
+
+    bool isNull() const { return m_private.isNull(); }
+    WEBKIT_EXPORT void* data() const;
+    WEBKIT_EXPORT unsigned byteLength() const;
+
+    WEBKIT_EXPORT v8::Handle<v8::Value> toV8Value();
+    WEBKIT_EXPORT static WebArrayBuffer* createFromV8Value(v8::Handle<v8::Value>);
+
+#if WEBKIT_IMPLEMENTATION
+    WebArrayBuffer(const WTF::PassRefPtr<WTF::ArrayBuffer>&);
+    WebArrayBuffer& operator=(const PassRefPtr<WTF::ArrayBuffer>&);
+    operator WTF::PassRefPtr<WTF::ArrayBuffer>() const;
+#endif
+
+protected:
+    WebPrivatePtr<WTF::ArrayBuffer> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebArrayBuffer_h
diff --git a/public/webpage/WebArrayBufferView.h b/public/webpage/WebArrayBufferView.h
new file mode 100644
index 0000000..db29119
--- /dev/null
+++ b/public/webpage/WebArrayBufferView.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2011 Google 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.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE 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 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 WebArrayBufferView_h
+#define WebArrayBufferView_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace v8 {
+class Value;
+template <class T> class Handle;
+}
+
+namespace WTF { class ArrayBufferView; }
+
+namespace WebKit {
+
+// Provides access to an ArrayBufferView.
+class WebArrayBufferView {
+public:
+    ~WebArrayBufferView() { reset(); }
+    WebArrayBufferView() { }
+    WebArrayBufferView(const WebArrayBufferView& v) { assign(v); }
+
+    WEBKIT_EXPORT void* baseAddress() const;
+    WEBKIT_EXPORT unsigned byteOffset() const;
+    WEBKIT_EXPORT unsigned byteLength() const;
+
+    WEBKIT_EXPORT void assign(const WebArrayBufferView&);
+    WEBKIT_EXPORT void reset();
+
+    WEBKIT_EXPORT static WebArrayBufferView* createFromV8Value(v8::Handle<v8::Value>);
+
+#if WEBKIT_IMPLEMENTATION
+    WebArrayBufferView(const WTF::PassRefPtr<WTF::ArrayBufferView>&);
+    WebArrayBufferView& operator=(const WTF::PassRefPtr<WTF::ArrayBufferView>&);
+    operator WTF::PassRefPtr<WTF::ArrayBufferView>() const;
+#endif
+
+private:
+    WebPrivatePtr<WTF::ArrayBufferView> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebAudioSourceProvider.h b/public/webpage/WebAudioSourceProvider.h
new file mode 100644
index 0000000..c23d3c1
--- /dev/null
+++ b/public/webpage/WebAudioSourceProvider.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011, Google 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 WebAudioSourceProvider_h
+#define WebAudioSourceProvider_h
+
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+    
+class WebAudioSourceProviderClient;
+
+// Abstract interface for a pull-model client.
+class WebAudioSourceProvider {
+public:
+    // provideInput() gets called repeatedly to render time-slices of a continuous audio stream.
+    virtual void provideInput(const WebVector<float*>& audioData, size_t numberOfFrames) = 0;
+
+    // If a client is set, we call it back when the audio format is available.
+    virtual void setClient(WebAudioSourceProviderClient*) { };
+
+protected:
+    virtual ~WebAudioSourceProvider() { }
+};
+
+} // WebKit
+
+#endif // WebAudioSourceProvider_h
diff --git a/public/webpage/WebAudioSourceProviderClient.h b/public/webpage/WebAudioSourceProviderClient.h
new file mode 100644
index 0000000..ab21a0e
--- /dev/null
+++ b/public/webpage/WebAudioSourceProviderClient.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011, Google 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 WebAudioSourceProviderClient_h
+#define WebAudioSourceProviderClient_h
+
+namespace WebKit {
+
+class WebAudioSourceProviderClient {
+public:
+    virtual void setFormat(size_t numberOfChannels, float sampleRate) = 0;
+protected:
+    virtual ~WebAudioSourceProviderClient() { }
+};
+
+} // WebKit
+
+#endif // WebAudioSourceProviderClient_h
diff --git a/public/webpage/WebAutofillClient.h b/public/webpage/WebAutofillClient.h
new file mode 100644
index 0000000..b690433
--- /dev/null
+++ b/public/webpage/WebAutofillClient.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebAutofillClient_h
+#define WebAutofillClient_h
+
+namespace WebKit {
+
+class WebFormElement;
+class WebFrame;
+class WebInputElement;
+class WebKeyboardEvent;
+class WebNode;
+class WebString;
+
+template <typename T> class WebVector;
+
+class WebAutofillClient {
+public:
+    enum {
+        MenuItemIDAutocompleteEntry = 0,
+        MenuItemIDWarningMessage = -1,
+        MenuItemIDPasswordEntry = -2,
+        MenuItemIDSeparator = -3,
+        MenuItemIDClearForm = -4,
+        MenuItemIDAutofillOptions = -5,
+        MenuItemIDDataListEntry = -6
+    };
+
+    // Informs the browser that the user has accepted an Autofill suggestion for
+    // a WebNode. A positive |itemID| is a unique id used to identify the set
+    // of Autofill profiles. If it is AutocompleteEntryMenuItemID, then the
+    // suggestion is an Autocomplete suggestion; and |value| stores the
+    // suggested text. |index| is an index of the selected suggestion in the
+    // list of suggestions provided by the client.
+    virtual void didAcceptAutofillSuggestion(const WebNode&,
+                                             const WebString& value,
+                                             const WebString& label,
+                                             int itemID,
+                                             unsigned index) { }
+
+    // Informs the browser that the user has selected an Autofill suggestion for
+    // a WebNode.  This happens when the user hovers over a suggestion or uses
+    // the arrow keys to navigate to a suggestion.
+    virtual void didSelectAutofillSuggestion(const WebNode&,
+                                             const WebString& name,
+                                             const WebString& label,
+                                             int itemID) { }
+
+    // Informs the browser that the user has cleared the selection from the
+    // Autofill suggestions popup. This happens when a user uses the arrow
+    // keys to navigate outside the range of possible selections.
+    virtual void didClearAutofillSelection(const WebNode&) { }
+
+    // Informs the browser an interactive autocomplete has been requested.
+    virtual void didRequestAutocomplete(WebFrame*, const WebFormElement&) { }
+
+    // Instructs the browser to remove the Autocomplete entry specified from
+    // its DB.
+    virtual void removeAutocompleteSuggestion(const WebString& name,
+                                              const WebString& value) { }
+
+    // These methods are called when the users edits a text-field.
+    virtual void textFieldDidEndEditing(const WebInputElement&) { }
+    virtual void textFieldDidChange(const WebInputElement&) { }
+    virtual void textFieldDidReceiveKeyDown(const WebInputElement&, const WebKeyboardEvent&) { }
+
+    // Informs the client whether or not any subsequent text changes should be ignored.
+    virtual void setIgnoreTextChanges(bool ignore) { }
+
+    virtual void didAssociateFormControls(const WebVector<WebNode>&) { }
+
+protected:
+    virtual ~WebAutofillClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebBindings.h b/public/webpage/WebBindings.h
new file mode 100644
index 0000000..da33672
--- /dev/null
+++ b/public/webpage/WebBindings.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebBindings_h
+#define WebBindings_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include <bindings/npruntime.h>
+
+namespace v8 {
+class Value;
+template <class T> class Handle;
+template <class T> class Local;
+}
+
+namespace WebKit {
+
+class WebArrayBuffer;
+class WebArrayBufferView;
+class WebDragData;
+class WebElement;
+class WebNode;
+class WebRange;
+
+// A haphazard collection of functions for dealing with plugins.
+class WebBindings {
+public:
+    // NPN Functions ------------------------------------------------------
+    // These are all defined in npruntime.h and are well documented.
+
+    // NPN_Construct
+    WEBKIT_EXPORT static bool construct(NPP, NPObject*, const NPVariant* args, uint32_t argCount, NPVariant* result);
+
+    // NPN_CreateObject
+    WEBKIT_EXPORT static NPObject* createObject(NPP, NPClass*);
+
+    // NPN_Enumerate
+    WEBKIT_EXPORT static bool enumerate(NPP, NPObject*, NPIdentifier**, uint32_t* identifierCount);
+
+    // NPN_Evaluate
+    WEBKIT_EXPORT static bool evaluate(NPP, NPObject*, NPString* script, NPVariant* result);
+
+    // NPN_EvaluateHelper
+    WEBKIT_EXPORT static bool evaluateHelper(NPP, bool popupsAllowed, NPObject*, NPString* script, NPVariant* result);
+
+    // NPN_GetIntIdentifier
+    WEBKIT_EXPORT static NPIdentifier getIntIdentifier(int32_t number);
+
+    // NPN_GetProperty
+    WEBKIT_EXPORT static bool getProperty(NPP, NPObject*, NPIdentifier property, NPVariant *result);
+
+    // NPN_GetStringIdentifier
+    WEBKIT_EXPORT static NPIdentifier getStringIdentifier(const NPUTF8* string);
+
+    // NPN_GetStringIdentifiers
+    WEBKIT_EXPORT static void getStringIdentifiers(const NPUTF8** names, int32_t nameCount, NPIdentifier*);
+
+    // NPN_HasMethod
+    WEBKIT_EXPORT static bool hasMethod(NPP, NPObject*, NPIdentifier method);
+
+    // NPN_HasProperty
+    WEBKIT_EXPORT static bool hasProperty(NPP, NPObject*, NPIdentifier property);
+
+    // NPN_IdentifierIsString
+    WEBKIT_EXPORT static bool identifierIsString(NPIdentifier);
+
+    // NPN_InitializeVariantWithStringCopy (though sometimes prefixed with an underscore)
+    WEBKIT_EXPORT static void initializeVariantWithStringCopy(NPVariant*, const NPString*);
+
+    // NPN_IntFromIdentifier
+    WEBKIT_EXPORT static int32_t intFromIdentifier(NPIdentifier);
+
+    // NPN_Invoke
+    WEBKIT_EXPORT static bool invoke(NPP, NPObject*, NPIdentifier method, const NPVariant* args, uint32_t argCount, NPVariant* result);
+
+    // NPN_InvokeDefault
+    WEBKIT_EXPORT static bool invokeDefault(NPP, NPObject*, const NPVariant* args, uint32_t argCount, NPVariant* result);
+
+    // NPN_ReleaseObject
+    WEBKIT_EXPORT static void releaseObject(NPObject*);
+
+    // NPN_ReleaseVariantValue
+    WEBKIT_EXPORT static void releaseVariantValue(NPVariant*);
+
+    // NPN_RemoveProperty
+    WEBKIT_EXPORT static bool removeProperty(NPP, NPObject*, NPIdentifier);
+
+    // NPN_RetainObject
+    WEBKIT_EXPORT static NPObject* retainObject(NPObject*);
+
+    // NPN_SetException
+    WEBKIT_EXPORT static void setException(NPObject*, const NPUTF8* message);
+
+    // NPN_SetProperty
+    WEBKIT_EXPORT static bool setProperty(NPP, NPObject*, NPIdentifier, const NPVariant*);
+
+    // _NPN_RegisterObjectOwner
+    WEBKIT_EXPORT static void registerObjectOwner(NPP);
+
+    // _NPN_UnregisterObjectOwner
+    WEBKIT_EXPORT static void unregisterObjectOwner(NPP);
+
+    // _NPN_UnregisterObject
+    WEBKIT_EXPORT static void unregisterObject(NPObject*);
+
+    // NPN_UTF8FromIdentifier
+    WEBKIT_EXPORT static NPUTF8* utf8FromIdentifier(NPIdentifier);
+
+    // Miscellaneous utility functions ----------------------------------------
+
+    // Complement to NPN_Get___Identifier functions.  Extracts data from the NPIdentifier data
+    // structure.  If isString is true upon return, string will be set but number's value is
+    // undefined.  If iString is false, the opposite is true.
+    WEBKIT_EXPORT static void extractIdentifierData(const NPIdentifier&, const NPUTF8*& string, int32_t& number, bool& isString);
+
+    // DumpRenderTree support -------------------------------------------------
+
+    // Return true (success) if the given npobj is a range object.
+    // If so, return that range as a WebRange object.
+    WEBKIT_EXPORT static bool getRange(NPObject* range, WebRange*);
+
+    // Return true (success) if the given npobj is an ArrayBuffer object.
+    // If so, return it as a WebArrayBuffer object.
+    WEBKIT_EXPORT static bool getArrayBuffer(NPObject* arrayBuffer, WebArrayBuffer*);
+
+    // Return true (success) if the given npobj is an ArrayBufferView object.
+    // If so, return it as a WebArrayBufferView object.
+    WEBKIT_EXPORT static bool getArrayBufferView(NPObject* arrayBufferView, WebArrayBufferView*);
+
+    // Return true (success) if the given npobj is a node.
+    // If so, return that node as a WebNode object.
+    WEBKIT_EXPORT static bool getNode(NPObject* element, WebNode*);
+
+    // Return true (success) if the given npobj is an element.
+    // If so, return that element as a WebElement object.
+    WEBKIT_EXPORT static bool getElement(NPObject* element, WebElement*);
+
+    WEBKIT_EXPORT static NPObject* makeIntArray(const WebVector<int>&);
+    WEBKIT_EXPORT static NPObject* makeStringArray(const WebVector<WebString>&);
+
+    // Exceptions -------------------------------------------------------------
+
+    typedef void (ExceptionHandler)(void* data, const NPUTF8* message);
+
+    // The exception handler will be notified of any exceptions thrown while
+    // operating on a NPObject.
+    WEBKIT_EXPORT static void pushExceptionHandler(ExceptionHandler, void* data);
+    WEBKIT_EXPORT static void popExceptionHandler();
+
+    // Conversion utilities to/from V8 native objects and NPVariant wrappers.
+    WEBKIT_EXPORT static void toNPVariant(v8::Local<v8::Value>, NPObject* root, NPVariant* result);
+    WEBKIT_EXPORT static v8::Handle<v8::Value> toV8Value(const NPVariant*);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebBlob.h b/public/webpage/WebBlob.h
new file mode 100644
index 0000000..81f519b
--- /dev/null
+++ b/public/webpage/WebBlob.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebBlob_h
+#define WebBlob_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebString.h"
+
+namespace v8 {
+class Value;
+template <class T> class Handle;
+}
+
+namespace WebCore { class Blob; }
+
+namespace WebKit {
+
+class WebBlob {
+public:
+    ~WebBlob() { reset(); }
+
+    WebBlob() { }
+    WebBlob(const WebBlob& b) { assign(b); }
+    WebBlob& operator=(const WebBlob& b)
+    {
+        assign(b);
+        return *this;
+    }
+
+    WEBKIT_EXPORT static WebBlob createFromFile(const WebString& path, long long size);
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebBlob&);
+
+    bool isNull() const { return m_private.isNull(); }
+
+    WEBKIT_EXPORT v8::Handle<v8::Value>  toV8Value();
+
+#if WEBKIT_IMPLEMENTATION
+    WebBlob(const WTF::PassRefPtr<WebCore::Blob>&);
+    WebBlob& operator=(const WTF::PassRefPtr<WebCore::Blob>&);
+    operator WTF::PassRefPtr<WebCore::Blob>() const;
+#endif
+
+protected:
+    WebPrivatePtr<WebCore::Blob> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebBlob_h
diff --git a/public/webpage/WebCache.h b/public/webpage/WebCache.h
new file mode 100644
index 0000000..0696ebe
--- /dev/null
+++ b/public/webpage/WebCache.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebCache_h
+#define WebCache_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// An interface to query and configure WebKit's resource cache.
+class WebCache {
+public:
+    struct UsageStats {
+        // Capacities.
+        size_t minDeadCapacity;
+        size_t maxDeadCapacity;
+        size_t capacity;
+        // Utilization.
+        size_t liveSize;
+        size_t deadSize;
+    };
+
+    // A struct mirroring WebCore::MemoryCache::TypeStatistic.
+    struct ResourceTypeStat {
+        size_t count;
+        size_t size;
+        size_t liveSize;
+        size_t decodedSize;
+    };
+
+    // A struct mirroring WebCore::MemoryCache::Statistics.
+    struct ResourceTypeStats {
+        ResourceTypeStat images;
+        ResourceTypeStat cssStyleSheets;
+        ResourceTypeStat scripts;
+        ResourceTypeStat xslStyleSheets;
+        ResourceTypeStat fonts;
+    };
+
+    // Sets the capacities of the resource cache, evicting objects as necessary.
+    WEBKIT_EXPORT static void setCapacities(size_t minDeadCapacity,
+                                            size_t maxDeadCapacity,
+                                            size_t capacity);
+
+    // Clears the cache (as much as possible; some resources may not be
+    // cleared if they are actively referenced). Note that this method
+    // only removes resources from live list, w/o releasing cache memory.
+    WEBKIT_EXPORT static void clear();
+
+    // Prunes resource cache. Destroys decoded images data and returns
+    // memory to the system.
+    WEBKIT_EXPORT static void prune();
+
+    // Gets the usage statistics from the resource cache.
+    WEBKIT_EXPORT static void getUsageStats(UsageStats*);
+
+    // Get usage stats about the resource cache.
+    WEBKIT_EXPORT static void getResourceTypeStats(ResourceTypeStats*);
+
+private:
+    WebCache();  // Not intended to be instanced.
+};
+
+}  // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebCachedURLRequest.h b/public/webpage/WebCachedURLRequest.h
new file mode 100644
index 0000000..c0bff22
--- /dev/null
+++ b/public/webpage/WebCachedURLRequest.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebCachedURLRequest_h
+#define WebCachedURLRequest_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivateOwnPtr.h"
+#include "../platform/WebString.h"
+
+namespace WebCore { class CachedResourceRequest; }
+
+namespace WebKit {
+
+class WebString;
+class WebURLRequest;
+class WrappedResourceRequest;
+
+class WebCachedURLRequest {
+public:
+    ~WebCachedURLRequest() { reset(); }
+    WEBKIT_EXPORT void reset();
+
+    WEBKIT_EXPORT const WebURLRequest& urlRequest() const;
+    WEBKIT_EXPORT WebString charset() const;
+    WEBKIT_EXPORT bool forPreload() const;
+    WEBKIT_EXPORT WebString initiatorName() const;
+
+#if WEBKIT_IMPLEMENTATION
+    explicit WebCachedURLRequest(WebCore::CachedResourceRequest*);
+#endif
+
+private:
+    WebCachedURLRequest(const WebCachedURLRequest&);
+    WebCachedURLRequest& operator=(const WebCachedURLRequest&);
+
+    WebCore::CachedResourceRequest* m_private;
+    mutable WebPrivateOwnPtr<WrappedResourceRequest> m_resourceRequestWrapper;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebColorChooser.h b/public/webpage/WebColorChooser.h
new file mode 100644
index 0000000..53d15f8
--- /dev/null
+++ b/public/webpage/WebColorChooser.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 Google 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 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 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 WebColorChooser_h
+#define WebColorChooser_h
+
+#include "../platform/WebColor.h"
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// This represents a color chooser.
+class WebColorChooser {
+public:
+    virtual ~WebColorChooser() { }
+
+    // Set selected color in the color chooser.
+    virtual void setSelectedColor(const WebColor color) { }
+
+    // Calling this ends the color chooser and the client won't be recieving
+    // didChooseColor callbacks anymore.
+    virtual void endChooser() { }
+};
+
+}
+
+#endif // WebColorChooser_h
diff --git a/public/webpage/WebColorChooserClient.h b/public/webpage/WebColorChooserClient.h
new file mode 100644
index 0000000..6099bfe
--- /dev/null
+++ b/public/webpage/WebColorChooserClient.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google 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 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 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 WebColorChooserClient_h
+#define WebColorChooserClient_h
+
+#include "../platform/WebColor.h"
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// Receives calls from WebColorChooser and passes it to the WebCore side.
+class WebColorChooserClient {
+public:
+    virtual ~WebColorChooserClient() { }
+
+    // Called when user selects a color in the color chooser.
+    virtual void didChooseColor(const WebColor&) { }
+
+    // Called when color chooser has ended.
+    virtual void didEndChooser() { }
+};
+
+}
+
+#endif // WebColorChooserClient_h
diff --git a/public/webpage/WebColorName.h b/public/webpage/WebColorName.h
new file mode 100644
index 0000000..1f28d89
--- /dev/null
+++ b/public/webpage/WebColorName.h
@@ -0,0 +1,77 @@
+/*
+* Copyright (C) 2009 Google 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:
+*
+*     * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*     * 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.
+*     * Neither the name of Google Inc. nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+* OWNER OR 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 WebColorName_h
+#define WebColorName_h
+
+#include "../platform/WebColor.h"
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+enum WebColorName {
+    WebColorActiveBorder,
+    WebColorActiveCaption,
+    WebColorAppworkspace,
+    WebColorBackground,
+    WebColorButtonFace,
+    WebColorButtonHighlight,
+    WebColorButtonShadow,
+    WebColorButtonText,
+    WebColorCaptionText,
+    WebColorGrayText,
+    WebColorHighlight,
+    WebColorHighlightText,
+    WebColorInactiveBorder,
+    WebColorInactiveCaption,
+    WebColorInactiveCaptionText,
+    WebColorInfoBackground,
+    WebColorInfoText,
+    WebColorMenu,
+    WebColorMenuText,
+    WebColorScrollbar,
+    WebColorText,
+    WebColorThreedDarkShadow,
+    WebColorThreedShadow,
+    WebColorThreedFace,
+    WebColorThreedHighlight,
+    WebColorThreedLightShadow,
+    WebColorWebkitFocusRingColor,
+    WebColorWindow,
+    WebColorWindowFrame,
+    WebColorWindowText
+};
+
+// Sets the values of a set of named colors.
+WEBKIT_EXPORT void setNamedColors(const WebColorName*, const WebColor*, size_t length);
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebCommonWorkerClient.h b/public/webpage/WebCommonWorkerClient.h
new file mode 100644
index 0000000..489859e
--- /dev/null
+++ b/public/webpage/WebCommonWorkerClient.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebCommonWorkerClient_h
+#define WebCommonWorkerClient_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebFileSystem.h"
+#include "../platform/WebFileSystemType.h"
+// FIXME: need to move this to Platform
+#include "WebStorageQuotaCallbacks.h"
+#include "WebStorageQuotaType.h"
+
+namespace WebKit {
+
+class WebApplicationCacheHost;
+class WebApplicationCacheHostClient;
+class WebFrame;
+class WebNotificationPresenter;
+class WebString;
+class WebWorker;
+class WebWorkerClient;
+
+class WebCommonWorkerClient {
+public:
+    // Called on the main webkit thread before opening a web database.
+    virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize)
+    {
+        return true;
+    }
+
+    // Called on the main webkit thread before opening a file system.
+    virtual bool allowFileSystem()
+    {
+        return true;
+    }
+
+    // Called on the main webkit thread before opening a file system.
+    virtual void openFileSystem(WebFileSystemType, long long size, bool create, WebFileSystemCallbacks*)
+    {
+        WEBKIT_ASSERT_NOT_REACHED();
+    }
+
+    // Called on the main webkit thread before opening an indexed database.
+    virtual bool allowIndexedDB(const WebString& name)
+    {
+        return true;
+    }
+    virtual void queryUsageAndQuota(WebStorageQuotaType, WebStorageQuotaCallbacks*)
+    {
+        WEBKIT_ASSERT_NOT_REACHED();
+    }
+};
+
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebCompositionUnderline.h b/public/webpage/WebCompositionUnderline.h
new file mode 100644
index 0000000..1c5c1f1
--- /dev/null
+++ b/public/webpage/WebCompositionUnderline.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebCompositionUnderline_h
+#define WebCompositionUnderline_h
+
+#include "../platform/WebColor.h"
+
+namespace WebKit {
+
+// Class WebCompositionUnderline is intended to be used with WebWidget's
+// setComposition() method.
+struct WebCompositionUnderline {
+    WebCompositionUnderline()
+        : startOffset(0)
+        , endOffset(0)
+        , color(0)
+        , thick(false) { }
+
+    WebCompositionUnderline(unsigned s, unsigned e, WebColor c, bool t)
+        : startOffset(s)
+        , endOffset(e)
+        , color(c)
+        , thick(t) { }
+
+    unsigned startOffset;
+    unsigned endOffset;
+    WebColor color;
+    bool thick;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebConsoleMessage.h b/public/webpage/WebConsoleMessage.h
new file mode 100644
index 0000000..6e2d627
--- /dev/null
+++ b/public/webpage/WebConsoleMessage.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebConsoleMessage_h
+#define WebConsoleMessage_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+struct WebConsoleMessage {
+    enum Level {
+        LevelDebug = 4,
+        LevelLog = 1,
+        LevelWarning = 2,
+        LevelError = 3,
+    };
+
+    Level level;
+    WebString text;
+
+    WebConsoleMessage()
+        : level(LevelLog) { }
+    WebConsoleMessage(Level level, const WebString& text)
+        : level(level)
+        , text(text) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebContentDetectionResult.h b/public/webpage/WebContentDetectionResult.h
new file mode 100644
index 0000000..d9516ae
--- /dev/null
+++ b/public/webpage/WebContentDetectionResult.h
@@ -0,0 +1,64 @@
+/*
+* Copyright (C) 2012 Google 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 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 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 WebContentDetectionResult_h
+#define WebContentDetectionResult_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+#include "WebRange.h"
+
+namespace WebKit {
+
+class WebContentDetectionResult {
+public:
+    WebContentDetectionResult()
+        : m_isValid(false)
+    {
+    }
+
+    WebContentDetectionResult(const WebRange& range, const WebString& string, const WebURL& intent)
+        : m_isValid(true)
+        , m_range(range)
+        , m_string(string)
+        , m_intent(intent)
+    {
+    }
+
+    bool isValid() const { return m_isValid; }
+    const WebRange& range() const { return m_range; }
+    const WebString& string() const { return m_string; }
+    const WebURL& intent() const { return m_intent; }
+
+private:
+    bool m_isValid;
+    WebRange m_range;
+    WebString m_string;
+    WebURL m_intent;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebContentSecurityPolicy.h b/public/webpage/WebContentSecurityPolicy.h
new file mode 100644
index 0000000..ad1d297
--- /dev/null
+++ b/public/webpage/WebContentSecurityPolicy.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebContentSecurityPolicy_h
+#define WebContentSecurityPolicy_h
+
+namespace WebKit {
+
+enum WebContentSecurityPolicyType {
+    WebContentSecurityPolicyTypeReport,
+    WebContentSecurityPolicyTypeEnforce,
+    WebContentSecurityPolicyTypePrefixedReport,
+    WebContentSecurityPolicyTypePrefixedEnforce,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebContextMenuData.h b/public/webpage/WebContextMenuData.h
new file mode 100644
index 0000000..53be1b6
--- /dev/null
+++ b/public/webpage/WebContextMenuData.h
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2009, 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebContextMenuData_h
+#define WebContextMenuData_h
+
+#include "../platform/WebPoint.h"
+#include "../platform/WebReferrerPolicy.h"
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+#include "../platform/WebVector.h"
+#include "WebHistoryItem.h"
+#include "WebMenuItemInfo.h"
+#include "WebNode.h"
+
+#define WEBCONTEXT_MEDIATYPEFILE_DEFINED
+
+namespace WebKit {
+
+// This struct is passed to WebViewClient::ShowContextMenu.
+struct WebContextMenuData {
+    enum MediaType {
+        // No special node is in context.
+        MediaTypeNone,
+        // An image node is selected.
+        MediaTypeImage,
+        // A video node is selected.
+        MediaTypeVideo,
+        // An audio node is selected.
+        MediaTypeAudio,
+        // A file node is selected.
+        MediaTypeFile,
+        // A plugin node is selected.
+        MediaTypePlugin,
+    };
+    // The type of media the context menu is being invoked on.
+    MediaType mediaType;
+
+    // The x and y position of the mouse pointer (relative to the webview).
+    WebPoint mousePosition;
+
+    // The absolute URL of the link that is in context.
+    WebURL linkURL;
+
+    // The absolute URL of the image/video/audio that is in context.
+    WebURL srcURL;
+
+    // Whether the image in context has been blocked.
+    bool isImageBlocked;
+
+    // The absolute URL of the page in context.
+    WebURL pageURL;
+
+    // The absolute keyword search URL including the %s search tag when the
+    // "Add as search engine..." option is clicked (left empty if not used).
+    WebURL keywordURL;
+
+    // The absolute URL of the subframe in context.
+    WebURL frameURL;
+
+    // The encoding for the frame in context.
+    WebString frameEncoding;
+
+    // History state of the subframe in context.
+    WebHistoryItem frameHistoryItem;
+
+    enum MediaFlags {
+        MediaNone = 0x0,
+        MediaInError = 0x1,
+        MediaPaused = 0x2,
+        MediaMuted = 0x4,
+        MediaLoop = 0x8,
+        MediaCanSave = 0x10,
+        MediaHasAudio = 0x20,
+        MediaHasVideo = 0x40,
+        MediaControls = 0x80,
+        MediaCanPrint = 0x100,
+        MediaCanRotate = 0x200,
+    };
+
+    // Extra attributes describing media elements.
+    int mediaFlags;
+
+    // The raw text of the selection in context.
+    WebString selectedText;
+
+    // Whether speech input is enabled.
+    bool isSpeechInputEnabled;
+
+    // Whether spell checking is enabled.
+    bool isSpellCheckingEnabled;
+
+    // The editable (possibily) misspelled word.
+    WebString misspelledWord;
+
+    // The identifier of the misspelling.
+    uint32_t misspellingHash;
+
+    // If misspelledWord is not empty, holds suggestions from the dictionary.
+    WebVector<WebString> dictionarySuggestions;
+
+    // Whether context is editable.
+    bool isEditable;
+
+    enum CheckableMenuItemFlags {
+        CheckableMenuItemDisabled = 0x0,
+        CheckableMenuItemEnabled = 0x1,
+        CheckableMenuItemChecked = 0x2,
+    };
+
+    // Writing direction menu items - values are unions of
+    // CheckableMenuItemFlags.
+    // Currently only used on OS X.
+    int writingDirectionDefault;
+    int writingDirectionLeftToRight;
+    int writingDirectionRightToLeft;
+
+    enum EditFlags {
+        CanDoNone = 0x0,
+        CanUndo = 0x1,
+        CanRedo = 0x2,
+        CanCut = 0x4,
+        CanCopy = 0x8,
+        CanPaste = 0x10,
+        CanDelete = 0x20,
+        CanSelectAll = 0x40,
+        CanTranslate = 0x80,
+    };
+
+    // Which edit operations are available in the context.
+    int editFlags;
+
+    // Security information for the context.
+    WebCString securityInfo;
+
+    // The referrer policy applicable to this context.
+    WebReferrerPolicy referrerPolicy;
+
+    // Custom context menu items provided by the WebCore internals.
+    WebVector<WebMenuItemInfo> customItems;
+
+    // The node that was clicked.
+    WebNode node;
+
+    WebContextMenuData()
+        : mediaType(MediaTypeNone)
+        , isImageBlocked(false)
+        , mediaFlags(MediaNone)
+        , isSpeechInputEnabled(false)
+        , isSpellCheckingEnabled(false)
+        , isEditable(false)
+        , writingDirectionDefault(CheckableMenuItemDisabled)
+        , writingDirectionLeftToRight(CheckableMenuItemEnabled)
+        , writingDirectionRightToLeft(CheckableMenuItemEnabled)
+        , editFlags(0) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebCrossOriginPreflightResultCache.h b/public/webpage/WebCrossOriginPreflightResultCache.h
new file mode 100644
index 0000000..3f80096
--- /dev/null
+++ b/public/webpage/WebCrossOriginPreflightResultCache.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebCrossOriginPreflightResultCache_h
+#define WebCrossOriginPreflightResultCache_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// An interface to configure WebKit's cross-origin preflight result cache.
+class WebCrossOriginPreflightResultCache {
+public:
+    // Clears the cache.
+    WEBKIT_EXPORT static void clear();
+
+private:
+    WebCrossOriginPreflightResultCache();  // Not intended to be instanced.
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebCursorInfo.h b/public/webpage/WebCursorInfo.h
new file mode 100644
index 0000000..6767d87
--- /dev/null
+++ b/public/webpage/WebCursorInfo.h
@@ -0,0 +1,32 @@
+/*
+* Copyright (C) 2013 Google 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:
+*
+*     * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*     * 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.
+*     * Neither the name of Google Inc. nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+* OWNER OR 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 "../platform/WebCursorInfo.h"
+
diff --git a/public/webpage/WebDOMActivityLogger.h b/public/webpage/WebDOMActivityLogger.h
new file mode 100644
index 0000000..2830b1d
--- /dev/null
+++ b/public/webpage/WebDOMActivityLogger.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMActivityLogger_h
+#define WebDOMActivityLogger_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebString.h"
+#include <v8.h>
+
+namespace WebKit {
+
+class WebDOMActivityLogger {
+public:
+    virtual ~WebDOMActivityLogger() { }
+    virtual void log(const WebString& apiName, int argc, const v8::Handle<v8::Value>* argv, const WebString& extraInfo) { }
+};
+
+// Checks if a logger already exists for the world identified
+// by worldId (worldId may be 0 identifying the main world).
+WEBKIT_EXPORT bool hasDOMActivityLogger(int worldId);
+
+// Checks if the provided logger is non-null and if so associates it
+// with the world identified by worldId (worldId may be 0 identifying the main world).
+WEBKIT_EXPORT void setDOMActivityLogger(int worldId, WebDOMActivityLogger*);
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMCustomEvent.h b/public/webpage/WebDOMCustomEvent.h
new file mode 100644
index 0000000..9165cf6
--- /dev/null
+++ b/public/webpage/WebDOMCustomEvent.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMCustomEvent_h
+#define WebDOMCustomEvent_h
+
+#include "WebDOMEvent.h"
+#include "WebSerializedScriptValue.h"
+
+namespace WebKit {
+
+class WebFrame;
+class WebString;
+
+class WebDOMCustomEvent : public WebDOMEvent {
+public:
+    WebDOMCustomEvent() { }
+    WEBKIT_EXPORT void initCustomEvent(const WebString& type, bool canBubble, bool cancelable, const WebSerializedScriptValue& messageData);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMEvent.h b/public/webpage/WebDOMEvent.h
new file mode 100644
index 0000000..9e7e998
--- /dev/null
+++ b/public/webpage/WebDOMEvent.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMEvent_h
+#define WebDOMEvent_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebString.h"
+#include "WebNode.h"
+
+namespace WebCore { class Event; }
+#if WEBKIT_IMPLEMENTATION
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+
+class WebDOMEvent {
+public:
+    enum PhaseType {
+        CapturingPhase     = 1,
+        AtTarget           = 2,
+        BubblingPhase      = 3
+    };
+
+    ~WebDOMEvent() { reset(); }
+
+    WebDOMEvent() { }
+    WebDOMEvent(const WebDOMEvent& other) { assign(other); }
+    WebDOMEvent& operator=(const WebDOMEvent& e)
+    {
+        assign(e);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebDOMEvent&);
+
+    bool isNull() const { return m_private.isNull(); }
+
+    WEBKIT_EXPORT WebString type() const;
+    WEBKIT_EXPORT WebNode target() const;
+    WEBKIT_EXPORT WebNode currentTarget() const;
+
+    WEBKIT_EXPORT PhaseType eventPhase() const;
+    WEBKIT_EXPORT bool bubbles() const;
+    WEBKIT_EXPORT bool cancelable() const;
+
+    WEBKIT_EXPORT bool isUIEvent() const;
+    WEBKIT_EXPORT bool isMouseEvent() const;
+    WEBKIT_EXPORT bool isMutationEvent() const;
+    WEBKIT_EXPORT bool isKeyboardEvent() const;
+    WEBKIT_EXPORT bool isTextEvent() const;
+    WEBKIT_EXPORT bool isCompositionEvent() const;
+    WEBKIT_EXPORT bool isDragEvent() const;
+    WEBKIT_EXPORT bool isClipboardEvent() const;
+    WEBKIT_EXPORT bool isMessageEvent() const;
+    WEBKIT_EXPORT bool isWheelEvent() const;
+    WEBKIT_EXPORT bool isBeforeTextInsertedEvent() const;
+    WEBKIT_EXPORT bool isOverflowEvent() const;
+    WEBKIT_EXPORT bool isPageTransitionEvent() const;
+    WEBKIT_EXPORT bool isPopStateEvent() const;
+    WEBKIT_EXPORT bool isProgressEvent() const;
+    WEBKIT_EXPORT bool isXMLHttpRequestProgressEvent() const;
+    WEBKIT_EXPORT bool isBeforeLoadEvent() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebDOMEvent(const WTF::PassRefPtr<WebCore::Event>&);
+    operator WTF::PassRefPtr<WebCore::Event>() const;
+#endif
+
+    template<typename T> T to()
+    {
+        T res;
+        res.WebDOMEvent::assign(*this);
+        return res;
+    }
+
+    template<typename T> const T toConst() const
+    {
+        T res;
+        res.WebDOMEvent::assign(*this);
+        return res;
+    }
+
+protected:
+    typedef WebCore::Event WebDOMEventPrivate;
+#if WEBKIT_IMPLEMENTATION
+    void assign(const WTF::PassRefPtr<WebDOMEventPrivate>&);
+
+    template<typename T> T* unwrap()
+    {
+        return static_cast<T*>(m_private.get());
+    }
+
+    template<typename T> const T* constUnwrap() const
+    {
+        return static_cast<const T*>(m_private.get());
+    }
+#endif
+
+    WebPrivatePtr<WebDOMEventPrivate> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMEventListener.h b/public/webpage/WebDOMEventListener.h
new file mode 100644
index 0000000..58992fe
--- /dev/null
+++ b/public/webpage/WebDOMEventListener.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMEventListener_h
+#define WebDOMEventListener_h
+
+#include "../platform/WebCommon.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class EventTarget; }
+#endif
+
+namespace WebKit {
+
+class EventListenerWrapper;
+class WebDOMEvent;
+class WebDOMEventListenerPrivate;
+class WebNode;
+class WebString;
+
+class WebDOMEventListener {
+public:
+    WEBKIT_EXPORT WebDOMEventListener();
+    WEBKIT_EXPORT virtual ~WebDOMEventListener();
+
+    // Called when an event is received.
+    virtual void handleEvent(const WebDOMEvent&) = 0;
+
+#if WEBKIT_IMPLEMENTATION
+    void notifyEventListenerDeleted(EventListenerWrapper*);
+    EventListenerWrapper* createEventListenerWrapper(const WebString& eventType, bool useCapture, WebCore::EventTarget*);
+    EventListenerWrapper* getEventListenerWrapper(const WebString& eventType, bool useCapture, WebCore::EventTarget*);
+#endif
+
+private:
+    WebDOMEventListenerPrivate* m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMMessageEvent.h b/public/webpage/WebDOMMessageEvent.h
new file mode 100644
index 0000000..dace153
--- /dev/null
+++ b/public/webpage/WebDOMMessageEvent.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMMessageEvent_h
+#define WebDOMMessageEvent_h
+
+#include "../platform/WebMessagePortChannel.h"
+#include "WebDOMEvent.h"
+#include "WebSerializedScriptValue.h"
+
+#if WEBKIT_IMPLEMENTATION
+#include "core/dom/Event.h"
+#include "core/dom/MessageEvent.h"
+#endif
+
+namespace WebKit {
+
+class WebFrame;
+class WebString;
+
+class WebDOMMessageEvent : public WebDOMEvent {
+public:
+    WebDOMMessageEvent() { }
+    WEBKIT_EXPORT void initMessageEvent(const WebString& type, bool canBubble, bool cancelable, const WebSerializedScriptValue& messageData, const WebString& origin, const WebFrame* sourceFrame, const WebString& lastEventId);
+
+    WEBKIT_EXPORT WebSerializedScriptValue data() const;
+    WEBKIT_EXPORT WebString origin() const;
+
+#if WEBKIT_IMPLEMENTATION
+    explicit WebDOMMessageEvent(const WTF::PassRefPtr<WebCore::MessageEvent>& e) : WebDOMEvent(e) { }
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMMouseEvent.h b/public/webpage/WebDOMMouseEvent.h
new file mode 100644
index 0000000..373c9ee
--- /dev/null
+++ b/public/webpage/WebDOMMouseEvent.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMMouseEvent_h
+#define WebDOMMouseEvent_h
+
+#include "WebDOMEvent.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class Event; }
+#endif
+
+namespace WebKit {
+
+class WebDOMMouseEvent : public WebDOMEvent {
+public:
+    WEBKIT_EXPORT int screenX() const;
+    WEBKIT_EXPORT int screenY() const;
+    WEBKIT_EXPORT int clientX() const;
+    WEBKIT_EXPORT int clientY() const;
+    WEBKIT_EXPORT int offsetX();
+    WEBKIT_EXPORT int offsetY();
+    WEBKIT_EXPORT int pageX() const;
+    WEBKIT_EXPORT int pageY() const;
+    WEBKIT_EXPORT int x() const;
+    WEBKIT_EXPORT int y() const;
+
+    WEBKIT_EXPORT int button() const;
+    WEBKIT_EXPORT bool buttonDown() const;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMMutationEvent.h b/public/webpage/WebDOMMutationEvent.h
new file mode 100644
index 0000000..8eb3b12
--- /dev/null
+++ b/public/webpage/WebDOMMutationEvent.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMMutationEvent_h
+#define WebDOMMutationEvent_h
+
+#include "WebDOMEvent.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class Event; }
+#endif
+
+namespace WebKit {
+
+class WebDOMMutationEvent : public WebDOMEvent {
+public:
+    enum AttrChangeType {
+        Modification    = 1,
+        Addition        = 2,
+        Removal         = 3
+    };
+
+    WEBKIT_EXPORT WebNode relatedNode() const;
+    WEBKIT_EXPORT WebString prevValue() const;
+    WEBKIT_EXPORT WebString newValue() const;
+    WEBKIT_EXPORT WebString attrName() const;
+    WEBKIT_EXPORT AttrChangeType attrChange() const;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMProgressEvent.h b/public/webpage/WebDOMProgressEvent.h
new file mode 100644
index 0000000..e9b0921
--- /dev/null
+++ b/public/webpage/WebDOMProgressEvent.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMProgressEvent_h
+#define WebDOMProgressEvent_h
+
+#include "WebDOMEvent.h"
+
+namespace WebKit {
+
+class WebString;
+
+class WebDOMProgressEvent : public WebDOMEvent {
+public:
+    WebDOMProgressEvent() { }
+    WEBKIT_EXPORT WebDOMProgressEvent(const WebString& type, bool lengthIsComputable, unsigned long long loaded, unsigned long long total);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDOMResourceProgressEvent.h b/public/webpage/WebDOMResourceProgressEvent.h
new file mode 100644
index 0000000..b65d93c
--- /dev/null
+++ b/public/webpage/WebDOMResourceProgressEvent.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDOMResourceProgressEvent_h
+#define WebDOMResourceProgressEvent_h
+
+#include "WebDOMProgressEvent.h"
+
+namespace WebKit {
+
+class WebString;
+
+class WebDOMResourceProgressEvent : public WebDOMProgressEvent {
+public:
+    WebDOMResourceProgressEvent() { }
+    WEBKIT_EXPORT WebDOMResourceProgressEvent(const WebString& type, bool lengthIsComputable, unsigned long long loaded, unsigned long long total, const WebString& url);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDataSource.h b/public/webpage/WebDataSource.h
new file mode 100644
index 0000000..e7eab6a
--- /dev/null
+++ b/public/webpage/WebDataSource.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDataSource_h
+#define WebDataSource_h
+
+#include "../platform/WebCommon.h"
+#include "WebNavigationType.h"
+#include "WebTextDirection.h"
+
+namespace WebKit {
+
+class WebApplicationCacheHost;
+class WebString;
+class WebURL;
+class WebURLRequest;
+class WebURLResponse;
+template <typename T> class WebVector;
+
+class WebDataSource {
+public:
+    class ExtraData {
+    public:
+        virtual ~ExtraData() { }
+    };
+
+    // Returns the original request that resulted in this datasource.
+    virtual const WebURLRequest& originalRequest() const = 0;
+
+    // Returns the request corresponding to this datasource.  It may
+    // include additional request headers added by WebKit that were not
+    // present in the original request.  This request may also correspond
+    // to a location specified by a redirect that was followed.
+    virtual const WebURLRequest& request() const = 0;
+
+    // Returns the response associated with this datasource.
+    virtual const WebURLResponse& response() const = 0;
+
+    // When this datasource was created as a result of WebFrame::loadData,
+    // there may be an associated unreachableURL.
+    virtual bool hasUnreachableURL() const = 0;
+    virtual WebURL unreachableURL() const = 0;
+
+    // Returns all redirects that occurred (both client and server) before
+    // at last committing the current page.  This will contain one entry
+    // for each intermediate URL, and one entry for the last URL (so if
+    // there are no redirects, it will contain exactly the current URL, and
+    // if there is one redirect, it will contain the source and destination
+    // URL).
+    virtual void redirectChain(WebVector<WebURL>&) const = 0;
+
+    // Returns whether the navigation associated with this datasource is a
+    // client redirect that should replace the current history item.
+    virtual bool isClientRedirect() const = 0;
+
+    // Returns the title for the current page.
+    virtual WebString pageTitle() const = 0;
+
+    // Returns the text direction of the title for the current page.
+    virtual WebTextDirection pageTitleDirection() const = 0;
+
+    // The type of navigation that triggered the creation of this datasource.
+    virtual WebNavigationType navigationType() const = 0;
+
+    // The time in seconds (since the epoch) of the event that triggered
+    // the creation of this datasource.  Returns 0 if unknown.
+    virtual double triggeringEventTime() const = 0;
+
+    // Extra data associated with this datasource.  If non-null, the extra
+    // data pointer will be deleted when the datasource is destroyed.
+    // Setting the extra data pointer will cause any existing non-null
+    // extra data pointer to be deleted.
+    virtual ExtraData* extraData() const = 0;
+    virtual void setExtraData(ExtraData*) = 0;
+
+    // The application cache host associated with this datasource.
+    virtual WebApplicationCacheHost* applicationCacheHost() = 0;
+
+    // Set deferMainResourceDataLoad flag on the loader.  This is used for
+    // testing.
+    virtual void setDeferMainResourceDataLoad(bool) = 0;
+
+    // Sets the navigation start time for this datasource. Ordinarily,
+    // navigation start is determined in WebCore. But, in some situations,
+    // the embedder might have a better value and can override it here. This
+    // should be called before WebFrameClient::didCommitProvisionalLoad.
+    // Calling it later may confuse users, because JavaScript may have run and
+    // the user may have already recorded the original value.
+    virtual void setNavigationStartTime(double) = 0;
+
+protected:
+    ~WebDataSource() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDatabase.h b/public/webpage/WebDatabase.h
new file mode 100644
index 0000000..f05d6c6
--- /dev/null
+++ b/public/webpage/WebDatabase.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDatabase_h
+#define WebDatabase_h
+
+#include "../platform/WebCommon.h"
+#include "WebSecurityOrigin.h"
+
+namespace WebCore { class DatabaseBackendBase; }
+
+namespace WebKit {
+
+class WebDatabaseObserver;
+class WebString;
+
+class WebDatabase {
+public:
+    WEBKIT_EXPORT WebString name() const;
+    WEBKIT_EXPORT WebString displayName() const;
+    WEBKIT_EXPORT unsigned long estimatedSize() const;
+    WEBKIT_EXPORT WebSecurityOrigin securityOrigin() const;
+    WEBKIT_EXPORT bool isSyncDatabase() const;
+
+    WEBKIT_EXPORT static void setObserver(WebDatabaseObserver*);
+    WEBKIT_EXPORT static WebDatabaseObserver* observer();
+
+    WEBKIT_EXPORT static void updateDatabaseSize(
+        const WebString& originIdentifier, const WebString& name, long long size);
+    WEBKIT_EXPORT static void updateSpaceAvailable(
+        const WebString& originIdentifier, long long spaceAvailable);
+    WEBKIT_EXPORT static void resetSpaceAvailable(
+        const WebString& originIdentifier);
+
+    WEBKIT_EXPORT static void closeDatabaseImmediately(
+        const WebString& originIdentifier, const WebString& databaseName);
+
+#if WEBKIT_IMPLEMENTATION
+    WebDatabase(const WebCore::DatabaseBackendBase*);
+#endif
+
+private:
+    WebDatabase() { }
+    const WebCore::DatabaseBackendBase* m_database;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDatabaseObserver.h b/public/webpage/WebDatabaseObserver.h
new file mode 100644
index 0000000..99e7db7
--- /dev/null
+++ b/public/webpage/WebDatabaseObserver.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDatabaseObserver_h
+#define WebDatabaseObserver_h
+
+namespace WebKit {
+class WebDatabase;
+
+class WebDatabaseObserver {
+public:
+    virtual void databaseOpened(const WebDatabase&) = 0;
+    virtual void databaseModified(const WebDatabase&) = 0;
+    virtual void databaseClosed(const WebDatabase&) = 0;
+
+    virtual void reportOpenDatabaseResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { }
+    virtual void reportChangeVersionResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { }
+    virtual void reportStartTransactionResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { }
+    virtual void reportCommitTransactionResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { }
+    virtual void reportExecuteStatementResult(const WebDatabase&, int errorSite, int webSqlErrorCode, int sqliteErrorCode) { }
+    virtual void reportVacuumDatabaseResult(const WebDatabase&, int sqliteErrorCode) { }
+
+protected:
+    ~WebDatabaseObserver() {}
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDateTimeChooserCompletion.h b/public/webpage/WebDateTimeChooserCompletion.h
new file mode 100644
index 0000000..37522c6
--- /dev/null
+++ b/public/webpage/WebDateTimeChooserCompletion.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2012 Google 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 WebDateTimeChooserCompletion_h
+#define WebDateTimeChooserCompletion_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+// Gets called back when WebViewClient finished choosing a date/time value.
+class WebDateTimeChooserCompletion {
+public:
+
+    // Called with a date/time value in the HTML format. The callback instance
+    // is destroyed when this method is called.
+    virtual void didChooseValue(const WebString&) = 0;
+
+    // Called when a user closed the chooser without choosing a value. The
+    // callback instance is destroyed when this method is called.
+    virtual void didCancelChooser() = 0;
+
+protected:
+    virtual ~WebDateTimeChooserCompletion() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDateTimeChooserParams.h b/public/webpage/WebDateTimeChooserParams.h
new file mode 100644
index 0000000..1adc445
--- /dev/null
+++ b/public/webpage/WebDateTimeChooserParams.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2012 Google 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 WebDateTimeChooserParams_h
+#define WebDateTimeChooserParams_h
+
+#include "../platform/WebRect.h"
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include "WebDateTimeInputType.h"
+
+namespace WebKit {
+
+// This class conveys various information to make date/time chooser UI.
+// See WebViewClient::openDateTimeChooser.
+struct WebDateTimeChooserParams {
+    // The type of chooser to show.
+    WebDateTimeInputType type;
+    // Bounding rectangle of the requester element.
+    WebRect anchorRectInScreen;
+    // The current value of the requester element.
+    WebString currentValue;
+    // <datalist> option values associated to the requester element. These
+    // values should not be shown to users. The vector size might be 0.
+    WebVector<WebString> suggestionValues;
+    // Localized values of <datalist> options associated to the requester
+    // element. These values should be shown to users. The vector size must be
+    // same as suggestionValues size.
+    WebVector<WebString> localizedSuggestionValues;
+    // <datalist> option labels associated to the requester element. These
+    // values should be shown to users. The vector size must be same as
+    // suggestionValues size.
+    WebVector<WebString> suggestionLabels;
+    // HTMLInputElement::min attribute value parsed in the valusAsNumber rule,
+    // that is to say, milliseconds from the epoch for non-month types and
+    // months from the epoch for month type. If the min attribute is missing,
+    // this field has the hard minimum limit.
+    double minimum;
+    // Similar to minimum.
+    double maximum;
+    // Step value represented in milliseconds for non-month types, and
+    // represetnted in months for month type.
+    double step;
+    // Step-base value represeted in milliseconds, or months.
+    double stepBase;
+    // True if the requester element has required attribute.
+    bool isRequired;
+    // True if the requester element is rendered in rtl direction.
+    bool isAnchorElementRTL;
+
+    WebDateTimeChooserParams()
+        : minimum(0)
+        , maximum(0)
+        , step(0)
+        , stepBase(0)
+        , isRequired(false)
+        , isAnchorElementRTL(false)
+    {
+    }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDateTimeInputType.h b/public/webpage/WebDateTimeInputType.h
new file mode 100644
index 0000000..52d60fb
--- /dev/null
+++ b/public/webpage/WebDateTimeInputType.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDateTimeInputType_h
+#define WebDateTimeInputType_h
+
+namespace WebKit {
+
+enum WebDateTimeInputType {
+    WebDateTimeInputTypeNone,
+    WebDateTimeInputTypeDate,
+    WebDateTimeInputTypeDateTime,
+    WebDateTimeInputTypeDateTimeLocal,
+    WebDateTimeInputTypeMonth,
+    WebDateTimeInputTypeTime,
+    WebDateTimeInputTypeWeek,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDevToolsAgent.h b/public/webpage/WebDevToolsAgent.h
new file mode 100644
index 0000000..7b07371
--- /dev/null
+++ b/public/webpage/WebDevToolsAgent.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDevToolsAgent_h
+#define WebDevToolsAgent_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+class WebDevToolsAgentClient;
+class WebDevToolsMessageTransport;
+class WebFrame;
+class WebString;
+class WebURLRequest;
+class WebURLResponse;
+class WebView;
+struct WebDevToolsMessageData;
+struct WebPoint;
+struct WebMemoryUsageInfo;
+struct WebURLError;
+
+class WebDevToolsAgent {
+public:
+    virtual ~WebDevToolsAgent() {}
+
+    // Returns WebKit WebInspector protocol version.
+    WEBKIT_EXPORT static WebString inspectorProtocolVersion();
+
+    // Returns true if and only if the given protocol version is supported by the WebKit Web Inspector.
+    WEBKIT_EXPORT static bool supportsInspectorProtocolVersion(const WebString& version);
+
+    virtual void attach() = 0;
+    virtual void reattach(const WebString& savedState) = 0;
+    virtual void detach() = 0;
+
+    virtual void didNavigate() = 0;
+
+    virtual void dispatchOnInspectorBackend(const WebString& message) = 0;
+
+    virtual void inspectElementAt(const WebPoint&) = 0;
+    virtual void setProcessId(long) = 0;
+
+    virtual void didBeginFrame() = 0;
+    virtual void didCancelFrame() = 0;
+    virtual void willComposite() = 0;
+    virtual void didComposite() = 0;
+    
+    // Exposed for TestRunner.
+    virtual void evaluateInWebInspector(long callId, const WebString& script) = 0;
+
+    virtual WebVector<WebMemoryUsageInfo> processMemoryDistribution() const = 0;
+
+    class MessageDescriptor {
+    public:
+        virtual ~MessageDescriptor() { }
+        virtual WebDevToolsAgent* agent() = 0;
+        virtual WebString message() = 0;
+    };
+    // Asynchronously request debugger to pause immediately and run the command.
+    WEBKIT_EXPORT static void interruptAndDispatch(MessageDescriptor*);
+    WEBKIT_EXPORT static bool shouldInterruptForMessage(const WebString&);
+    WEBKIT_EXPORT static void processPendingMessages();
+
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDevToolsAgentClient.h b/public/webpage/WebDevToolsAgentClient.h
new file mode 100644
index 0000000..f853873
--- /dev/null
+++ b/public/webpage/WebDevToolsAgentClient.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDevToolsAgentClient_h
+#define WebDevToolsAgentClient_h
+
+#include "../platform/WebCString.h"
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+class WebString;
+struct WebDevToolsMessageData;
+
+class WebDevToolsAgentClient {
+public:
+    virtual void sendMessageToInspectorFrontend(const WebString&) { }
+    virtual void sendDebuggerOutput(const WebString&) { }
+
+    // Returns the identifier of the entity hosting this agent.
+    virtual int hostIdentifier() { return -1; }
+
+    // Save the agent state in order to pass it later into WebDevToolsAgent::reattach
+    // if the same client is reattached to another agent.
+    virtual void saveAgentRuntimeState(const WebString&) { }
+
+    class WebKitClientMessageLoop {
+    public:
+        virtual ~WebKitClientMessageLoop() { }
+        virtual void run() = 0;
+        virtual void quitNow() = 0;
+    };
+    virtual WebKitClientMessageLoop* createClientMessageLoop() { return 0; }
+
+    virtual void clearBrowserCache() { }
+    virtual void clearBrowserCookies() { }
+
+    class AllocatedObjectVisitor {
+    public:
+        virtual bool visitObject(const void* ptr) = 0;
+    protected:
+        virtual ~AllocatedObjectVisitor() { }
+    };
+    virtual void visitAllocatedObjects(AllocatedObjectVisitor*) { }
+
+    class InstrumentedObjectSizeProvider {
+    public:
+        virtual size_t objectSize(const void* ptr) const = 0;
+    protected:
+        virtual ~InstrumentedObjectSizeProvider() { }
+    };
+    virtual void dumpUncountedAllocatedObjects(const InstrumentedObjectSizeProvider*) { }
+
+    typedef void (*TraceEventCallback)(char phase, const unsigned char*, const char* name, unsigned long long id,
+        int numArgs, const char* const* argNames, const unsigned char* argTypes, const unsigned long long* argValues,
+        unsigned char flags);
+
+    virtual void setTraceEventCallback(TraceEventCallback) { }
+
+protected:
+    ~WebDevToolsAgentClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDevToolsFrontend.h b/public/webpage/WebDevToolsFrontend.h
new file mode 100644
index 0000000..2194ee3
--- /dev/null
+++ b/public/webpage/WebDevToolsFrontend.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDevToolsFrontend_h
+#define WebDevToolsFrontend_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebDevToolsFrontendClient;
+class WebString;
+class WebView;
+
+// WebDevToolsFrontend represents DevTools client sitting in the Glue. It provides
+// direct and delegate Apis to the host.
+class WebDevToolsFrontend {
+public:
+    WEBKIT_EXPORT static WebDevToolsFrontend* create(WebView* view,
+                                                     WebDevToolsFrontendClient* client,
+                                                     const WebString& applicationLocale);
+
+    virtual ~WebDevToolsFrontend() {}
+
+    virtual void dispatchOnInspectorFrontend(const WebString&) = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDevToolsFrontendClient.h b/public/webpage/WebDevToolsFrontendClient.h
new file mode 100644
index 0000000..3e53539
--- /dev/null
+++ b/public/webpage/WebDevToolsFrontendClient.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDevToolsFrontendClient_h
+#define WebDevToolsFrontendClient_h
+
+namespace WebKit {
+
+class WebString;
+struct WebFloatPoint;
+struct WebDevToolsMessageData;
+
+class WebDevToolsFrontendClient {
+public:
+    WebDevToolsFrontendClient() { }
+
+    virtual void sendMessageToBackend(const WebString&) { }
+
+    virtual void activateWindow() { }
+    virtual void changeAttachedWindowHeight(unsigned height) { }
+    virtual void closeWindow() { }
+    virtual void requestDockWindow() { }
+    virtual void requestUndockWindow() { }
+    virtual void requestSetDockSide(const WebString& side) { }
+    virtual void moveWindowBy(const WebFloatPoint&) { }
+    virtual void openInNewTab(const WebString& side) { }
+    virtual void save(const WebString& url, const WebString& content, bool saveAs) { }
+    virtual void append(const WebString& url, const WebString& content) { }
+
+    virtual void requestFileSystems() { }
+    virtual void addFileSystem() { }
+    virtual void removeFileSystem(const WebString& fileSystemPath) { }
+
+    virtual bool isUnderTest() { return false; }
+
+protected:
+    virtual ~WebDevToolsFrontendClient() {}
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDeviceOrientation.h b/public/webpage/WebDeviceOrientation.h
new file mode 100644
index 0000000..f56c032
--- /dev/null
+++ b/public/webpage/WebDeviceOrientation.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebDeviceOrientation_h
+#define WebDeviceOrientation_h
+
+#if WEBKIT_IMPLEMENTATION
+namespace WTF { template <typename T> class PassRefPtr; }
+namespace WebCore { class DeviceOrientationData; }
+#endif
+
+namespace WebKit {
+
+class WebDeviceOrientation {
+public:
+    WebDeviceOrientation()
+        : m_isNull(true)
+        , m_canProvideAlpha(false)
+        , m_alpha(0)
+        , m_canProvideBeta(false)
+        , m_beta(0)
+        , m_canProvideGamma(false)
+        , m_gamma(0)
+        , m_canProvideAbsolute(false)
+        , m_absolute(false)
+    {
+    }
+
+    static WebDeviceOrientation nullOrientation() { return WebDeviceOrientation(); }
+
+    void setNull(bool isNull) { m_isNull = isNull; }
+    bool isNull() const { return m_isNull; }
+
+    void setAlpha(double alpha)
+    {
+        m_canProvideAlpha = true;
+        m_alpha = alpha;
+    }
+    bool canProvideAlpha() const { return m_canProvideAlpha; }
+    double alpha() const { return m_alpha; }
+
+    void setBeta(double beta)
+    {
+        m_canProvideBeta = true;
+        m_beta = beta;
+    }
+    bool canProvideBeta() const { return m_canProvideBeta; }
+    double beta() const { return m_beta; }
+
+    void setGamma(double gamma)
+    {
+        m_canProvideGamma = true;
+        m_gamma = gamma;
+    }
+    bool canProvideGamma() const { return m_canProvideGamma; }
+    double gamma() const { return m_gamma; }
+
+    void setAbsolute(bool absolute)
+    {
+        m_canProvideAbsolute = true;
+        m_absolute = absolute;
+    }
+    bool canProvideAbsolute() const {return m_canProvideAbsolute; }
+    bool absolute() const { return m_absolute; }
+
+#if WEBKIT_IMPLEMENTATION
+    WebDeviceOrientation(const WebCore::DeviceOrientationData*);
+    operator WTF::PassRefPtr<WebCore::DeviceOrientationData>() const;
+#endif
+
+private:
+    bool m_isNull;
+    bool m_canProvideAlpha;
+    double m_alpha;
+    bool m_canProvideBeta;
+    double m_beta;
+    bool m_canProvideGamma;
+    double m_gamma;
+    bool m_canProvideAbsolute;
+    bool m_absolute;
+};
+
+} // namespace WebKit
+
+#endif // WebDeviceOrientation_h
diff --git a/public/webpage/WebDeviceOrientationClient.h b/public/webpage/WebDeviceOrientationClient.h
new file mode 100644
index 0000000..095e2b3
--- /dev/null
+++ b/public/webpage/WebDeviceOrientationClient.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebDeviceOrientationClient_h
+#define WebDeviceOrientationClient_h
+
+#include "../platform/WebCommon.h"
+#include "WebDeviceOrientation.h"
+
+namespace WebKit {
+
+class WebDeviceOrientation;
+class WebDeviceOrientationController;
+
+class WebDeviceOrientationClient {
+public:
+    virtual ~WebDeviceOrientationClient() {}
+
+    virtual void setController(WebDeviceOrientationController*) { WEBKIT_ASSERT_NOT_REACHED(); }
+    virtual void startUpdating() { WEBKIT_ASSERT_NOT_REACHED(); }
+    virtual void stopUpdating() { WEBKIT_ASSERT_NOT_REACHED(); }
+
+    virtual WebDeviceOrientation lastOrientation() const
+    {
+        WEBKIT_ASSERT_NOT_REACHED();
+        return WebDeviceOrientation::nullOrientation();
+    }
+};
+
+} // namespace WebKit
+
+#endif // WebDeviceOrientationClient_h
diff --git a/public/webpage/WebDeviceOrientationClientMock.h b/public/webpage/WebDeviceOrientationClientMock.h
new file mode 100644
index 0000000..b2e34d3
--- /dev/null
+++ b/public/webpage/WebDeviceOrientationClientMock.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebDeviceOrientationClientMock_h
+#define WebDeviceOrientationClientMock_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivateOwnPtr.h"
+#include "WebDeviceOrientationClient.h"
+
+namespace WebCore { class DeviceOrientationClientMock; }
+
+namespace WebKit {
+
+class WebDeviceOrientationClientMock : public WebDeviceOrientationClient {
+public:
+    WEBKIT_EXPORT static WebDeviceOrientationClientMock* create();
+    ~WebDeviceOrientationClientMock() { reset(); }
+
+    virtual void setController(WebDeviceOrientationController*) OVERRIDE;
+    virtual void startUpdating() OVERRIDE;
+    virtual void stopUpdating() OVERRIDE;
+    virtual WebDeviceOrientation lastOrientation() const OVERRIDE;
+
+    WEBKIT_EXPORT void setOrientation(WebDeviceOrientation&);
+
+private:
+    WebDeviceOrientationClientMock() { initialize(); }
+    WEBKIT_EXPORT void initialize();
+    WEBKIT_EXPORT void reset();
+
+    WebPrivateOwnPtr<WebCore::DeviceOrientationClientMock> m_clientMock;
+};
+
+} // namespace WebKit
+
+#endif // WebDeviceOrientationClientMock_h
diff --git a/public/webpage/WebDeviceOrientationController.h b/public/webpage/WebDeviceOrientationController.h
new file mode 100644
index 0000000..8e98422
--- /dev/null
+++ b/public/webpage/WebDeviceOrientationController.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebDeviceOrientationController_h
+#define WebDeviceOrientationController_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebCore { class DeviceOrientationController; }
+
+namespace WebKit {
+
+class WebDeviceOrientation;
+
+class WebDeviceOrientationController {
+public:
+    WebDeviceOrientationController(WebCore::DeviceOrientationController* c)
+        : m_controller(c)
+    {
+    }
+
+    WEBKIT_EXPORT void didChangeDeviceOrientation(const WebDeviceOrientation&);
+
+#if WEBKIT_IMPLEMENTATION
+    WebCore::DeviceOrientationController* controller() const;
+#endif
+
+private:
+    WebCore::DeviceOrientationController* m_controller;
+};
+
+} // namespace WebKit
+
+#endif // WebDeviceOrientationController_h
diff --git a/public/webpage/WebDocument.h b/public/webpage/WebDocument.h
new file mode 100644
index 0000000..8d1d009
--- /dev/null
+++ b/public/webpage/WebDocument.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDocument_h
+#define WebDocument_h
+
+#include "../platform/WebReferrerPolicy.h"
+#include "../platform/WebVector.h"
+#include "WebDraggableRegion.h"
+#include "WebNode.h"
+#include "WebSecurityOrigin.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore {
+class Document;
+class DocumentType;
+}
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+class WebAccessibilityObject;
+class WebDocumentType;
+class WebElement;
+class WebFormElement;
+class WebFrame;
+class WebNodeCollection;
+class WebNodeList;
+class WebString;
+class WebURL;
+
+// Provides readonly access to some properties of a DOM document.
+class WebDocument : public WebNode {
+public:
+    enum UserStyleLevel {
+        UserStyleUserLevel,
+        UserStyleAuthorLevel
+    };
+
+    WebDocument() { }
+    WebDocument(const WebDocument& e) : WebNode(e) { }
+
+    WebDocument& operator=(const WebDocument& e)
+    {
+        WebNode::assign(e);
+        return *this;
+    }
+    void assign(const WebDocument& e) { WebNode::assign(e); }
+
+    WEBKIT_EXPORT WebURL url() const;
+    // Note: Security checks should use the securityOrigin(), not url().
+    WEBKIT_EXPORT WebSecurityOrigin securityOrigin() const;
+
+    WEBKIT_EXPORT WebString encoding() const;
+    WEBKIT_EXPORT WebString contentLanguage() const;
+
+    // The url of the OpenSearch Desription Document (if any).
+    WEBKIT_EXPORT WebURL openSearchDescriptionURL() const;
+
+    // Returns the frame the document belongs to or 0 if the document is frameless.
+    WEBKIT_EXPORT WebFrame* frame() const;
+    WEBKIT_EXPORT bool isHTMLDocument() const;
+    WEBKIT_EXPORT bool isXHTMLDocument() const;
+    WEBKIT_EXPORT bool isPluginDocument() const;
+    WEBKIT_EXPORT WebURL baseURL() const;
+    WEBKIT_EXPORT WebURL firstPartyForCookies() const;
+    WEBKIT_EXPORT WebElement documentElement() const;
+    WEBKIT_EXPORT WebElement body() const;
+    WEBKIT_EXPORT WebElement head();
+    WEBKIT_EXPORT WebString title() const;
+    WEBKIT_EXPORT WebNodeCollection all();
+    WEBKIT_EXPORT void forms(WebVector<WebFormElement>&) const;
+    WEBKIT_EXPORT void images(WebVector<WebElement>&);
+    WEBKIT_EXPORT WebURL completeURL(const WebString&) const;
+    WEBKIT_EXPORT WebElement getElementById(const WebString&) const;
+    WEBKIT_EXPORT WebNode focusedNode() const;
+    WEBKIT_EXPORT WebDocumentType doctype() const;
+    WEBKIT_EXPORT void cancelFullScreen();
+    WEBKIT_EXPORT WebElement fullScreenElement() const;
+    WEBKIT_EXPORT WebDOMEvent createEvent(const WebString& eventType);
+    WEBKIT_EXPORT WebReferrerPolicy referrerPolicy() const;
+    WEBKIT_EXPORT WebElement createElement(const WebString& tagName);
+
+    // Accessibility support. These methods should only be called on the
+    // top-level document, because one accessibility cache spans all of
+    // the documents on the page.
+
+    // Gets the accessibility object for this document.
+    WEBKIT_EXPORT WebAccessibilityObject accessibilityObject() const;
+
+    // Gets the accessibility object for an object on this page by ID.
+    WEBKIT_EXPORT WebAccessibilityObject accessibilityObjectFromID(int axID) const;
+    // Inserts the given CSS source code as a user stylesheet in the document.
+    // Meant for programatic/one-off injection, as opposed to
+    // WebView::addUserStyleSheet which inserts styles for the lifetime of the
+    // WebView.
+    WEBKIT_EXPORT void insertUserStyleSheet(const WebString& sourceCode, UserStyleLevel);
+
+    WEBKIT_EXPORT WebVector<WebDraggableRegion> draggableRegions() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebDocument(const WTF::PassRefPtr<WebCore::Document>&);
+    WebDocument& operator=(const WTF::PassRefPtr<WebCore::Document>&);
+    operator WTF::PassRefPtr<WebCore::Document>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDocumentType.h b/public/webpage/WebDocumentType.h
new file mode 100644
index 0000000..a9113bb
--- /dev/null
+++ b/public/webpage/WebDocumentType.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDocumentType_h
+#define WebDocumentType_h
+
+#include "WebNode.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class DocumentType; }
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+class WebString;
+
+// Provides readonly access to some properties of a DOM document type.
+class WebDocumentType : public WebNode {
+public:
+    WebDocumentType() { }
+    WebDocumentType(const WebDocumentType& e) : WebNode(e) { }
+
+    WebDocumentType& operator=(const WebDocumentType& e)
+    {
+        WebNode::assign(e);
+        return *this;
+    }
+    void assign(const WebDocumentType& e) { WebNode::assign(e); }
+
+    WEBKIT_EXPORT WebString name() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebDocumentType(const WTF::PassRefPtr<WebCore::DocumentType>&);
+    WebDocumentType& operator=(const WTF::PassRefPtr<WebCore::DocumentType>&);
+    operator WTF::PassRefPtr<WebCore::DocumentType>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDragOperation.h b/public/webpage/WebDragOperation.h
new file mode 100644
index 0000000..050b74f
--- /dev/null
+++ b/public/webpage/WebDragOperation.h
@@ -0,0 +1,59 @@
+/*
+* Copyright (C) 2009 Google 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:
+*
+*     * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*     * 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.
+*     * Neither the name of Google Inc. nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+* OWNER OR 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 WebDragOperation_h
+#define WebDragOperation_h
+
+#include <limits.h>
+
+namespace WebKit {
+
+// "Verb" of a drag-and-drop operation as negotiated between the source and
+// destination.
+// (These constants match their equivalents in WebCore's DragActions.h and
+// should not be renumbered.)
+enum WebDragOperation {
+    WebDragOperationNone    = 0,
+    WebDragOperationCopy    = 1,
+    WebDragOperationLink    = 2,
+    WebDragOperationGeneric = 4,
+    WebDragOperationPrivate = 8,
+    WebDragOperationMove    = 16,
+    WebDragOperationDelete  = 32,
+    WebDragOperationEvery   = UINT_MAX
+};
+
+// Alternate typedef to make it clear when this is being used as a mask
+// with potentially multiple value bits set.
+typedef WebDragOperation WebDragOperationsMask;
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDragStatus.h b/public/webpage/WebDragStatus.h
new file mode 100644
index 0000000..fb490d3
--- /dev/null
+++ b/public/webpage/WebDragStatus.h
@@ -0,0 +1,46 @@
+/*
+* Copyright (C) 2012 Google 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:
+*
+*     * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+*     * 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.
+*     * Neither the name of Google Inc. nor the names of its
+* contributors may be used to endorse or promote products derived from
+* this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+* OWNER OR 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 WebDragStatus_h
+#define WebDragStatus_h
+
+namespace WebKit {
+
+enum WebDragStatus {
+    WebDragStatusUnknown = 0,
+    WebDragStatusEnter,
+    WebDragStatusOver,
+    WebDragStatusLeave,
+    WebDragStatusDrop
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebDraggableRegion.h b/public/webpage/WebDraggableRegion.h
new file mode 100644
index 0000000..1ec01db
--- /dev/null
+++ b/public/webpage/WebDraggableRegion.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebDraggableRegion_h
+#define WebDraggableRegion_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebRect.h"
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+struct WebDraggableRegion {
+    bool draggable;
+    WebRect bounds;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebEditingAction.h b/public/webpage/WebEditingAction.h
new file mode 100644
index 0000000..4e76100
--- /dev/null
+++ b/public/webpage/WebEditingAction.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebEditingAction_h
+#define WebEditingAction_h
+
+namespace WebKit {
+
+enum WebEditingAction {
+    WebEditingActionTyped,
+    WebEditingActionPasted,
+    WebEditingActionDropped,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebElement.h b/public/webpage/WebElement.h
new file mode 100644
index 0000000..ae1a9c2
--- /dev/null
+++ b/public/webpage/WebElement.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebElement_h
+#define WebElement_h
+
+#include "WebNode.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class Element; }
+#endif
+
+namespace WebKit {
+struct WebRect;
+
+    // Provides access to some properties of a DOM element node.
+    class WebElement : public WebNode {
+    public:
+        WebElement() : WebNode() { }
+        WebElement(const WebElement& e) : WebNode(e) { }
+
+        WebElement& operator=(const WebElement& e) { WebNode::assign(e); return *this; }
+        void assign(const WebElement& e) { WebNode::assign(e); }
+
+        WEBKIT_EXPORT bool isFormControlElement() const;
+        WEBKIT_EXPORT bool isTextFormControlElement() const;
+        // Returns the qualified name, which may contain a prefix and a colon.
+        WEBKIT_EXPORT WebString tagName() const;
+        // Check if this element has the specified qualified name. This function
+        // doesn't makes much sense because we have no ways to check namespace
+        // URI. Do not use this.
+        WEBKIT_EXPORT bool hasTagName(const WebString&) const;
+        // Check if this element has the specified local tag name, and the HTML
+        // namespace. Tag name matching is case-insensitive.
+        WEBKIT_EXPORT bool hasHTMLTagName(const WebString&) const;
+        WEBKIT_EXPORT bool hasAttribute(const WebString&) const;
+        WEBKIT_EXPORT void removeAttribute(const WebString&);
+        WEBKIT_EXPORT WebString getAttribute(const WebString&) const;
+        WEBKIT_EXPORT bool setAttribute(const WebString& name, const WebString& value);
+        WEBKIT_EXPORT WebString innerText();
+        WEBKIT_EXPORT WebDocument document() const;
+        WEBKIT_EXPORT void requestFullScreen();
+        WEBKIT_EXPORT WebString attributeLocalName(unsigned index) const;
+        WEBKIT_EXPORT WebString attributeValue(unsigned index) const;
+        WEBKIT_EXPORT unsigned attributeCount() const;
+        WEBKIT_EXPORT WebNode shadowRoot() const;
+
+        // Returns the language code specified for this element.  This attribute
+        // is inherited, so the returned value is drawn from the closest parent
+        // element that has the lang attribute set, or from the HTTP
+        // "Content-Language" header as a fallback.
+        WEBKIT_EXPORT WebString computeInheritedLanguage() const;
+
+        // Returns the bounds of the element in viewport space. The bounds
+        // have been adjusted to include any transformations. This view is
+        // also called the Root View in WebKit.
+        // This function will update the layout if required.
+        WEBKIT_EXPORT WebRect boundsInViewportSpace();
+
+#if WEBKIT_IMPLEMENTATION
+        WebElement(const WTF::PassRefPtr<WebCore::Element>&);
+        WebElement& operator=(const WTF::PassRefPtr<WebCore::Element>&);
+        operator WTF::PassRefPtr<WebCore::Element>() const;
+#endif
+    };
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebExceptionCode.h b/public/webpage/WebExceptionCode.h
new file mode 100644
index 0000000..61d53d9
--- /dev/null
+++ b/public/webpage/WebExceptionCode.h
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebExceptionCode_h
+#define WebExceptionCode_h
+
+namespace WebKit {
+
+// This should match how ExceptionCode is defined in WebCore.
+typedef int WebExceptionCode;
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebExternalPopupMenu.h b/public/webpage/WebExternalPopupMenu.h
new file mode 100644
index 0000000..49630cf
--- /dev/null
+++ b/public/webpage/WebExternalPopupMenu.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebExternalPopupMenu_h
+#define WebExternalPopupMenu_h
+
+namespace WebKit {
+
+struct WebRect;
+
+class WebExternalPopupMenu {
+public:
+    virtual void show(const WebRect& bounds) = 0;
+    virtual void close() = 0;
+};
+
+} // namespace WebKit
+
+#endif // WebExternalPopupMenu_h
diff --git a/public/webpage/WebExternalPopupMenuClient.h b/public/webpage/WebExternalPopupMenuClient.h
new file mode 100644
index 0000000..1396c65
--- /dev/null
+++ b/public/webpage/WebExternalPopupMenuClient.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebExternalPopupMenuClient_h
+#define WebExternalPopupMenuClient_h
+
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+
+class WebExternalPopupMenuClient {
+public:
+    // Should be called when the currently selected item in the popup menu
+    // changed. Can be -1 if there is no selection.
+    virtual void didChangeSelection(int index) = 0;
+
+    // Should be called when an index has been accepted.
+    // Note that it is not safe to access this WebExternalPopupClientMenu after
+    // this has been called as it might not be valid anymore.
+    virtual void didAcceptIndex(int index) = 0;
+
+    // Should be called when a set of indices have been selected.
+    // Note that it is not safe to access this WebExternalPopupClientMenu after
+    // this has been called as it might not be valid anymore.
+    virtual void didAcceptIndices(const WebVector<int>& indices) = 0;
+
+    // Should be called when the popup menu was discarded (closed without a
+    // selection.
+    // Note that it is not safe to access this WebExternalPopupClientMenu after
+    // this has been called as it might not be valid anymore.
+    virtual void didCancel() = 0;
+};
+
+} // namespace WebKit
+
+#endif // WebExternalPopupMenuClient_h
diff --git a/public/webpage/WebFileChooserCompletion.h b/public/webpage/WebFileChooserCompletion.h
new file mode 100644
index 0000000..dc946f0
--- /dev/null
+++ b/public/webpage/WebFileChooserCompletion.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFileChooserCompletion_h
+#define WebFileChooserCompletion_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+template <typename T> class WebVector;
+
+// Gets called back when WebViewClient finished choosing a file.
+class WebFileChooserCompletion {
+public:
+    struct SelectedFileInfo {
+        // The actual path of the selected file.
+        WebString path;
+
+        // The display name of the file that is to be exposed as File.name in
+        // the DOM layer. If it is empty the base part of the |path| is used.
+        WebString displayName;
+    };
+
+    // Called with zero or more file names. Zero-lengthed vector means that
+    // the user cancelled or that file choosing failed. The callback instance
+    // is destroyed when this method is called.
+    virtual void didChooseFile(const WebVector<WebString>& fileNames) = 0;
+
+    // Called with zero or more files, given as a vector of SelectedFileInfo.
+    // Zero-lengthed vector means that the user cancelled or that file
+    // choosing failed. The callback instance is destroyed when this method
+    // is called.
+    // FIXME: Deprecate either one of the didChooseFile (and rename it to
+    // didChooseFile*s*).
+    virtual void didChooseFile(const WebVector<SelectedFileInfo>&) { }
+protected:
+    virtual ~WebFileChooserCompletion() {}
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFileChooserParams.h b/public/webpage/WebFileChooserParams.h
new file mode 100644
index 0000000..b92e39f
--- /dev/null
+++ b/public/webpage/WebFileChooserParams.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2010, 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFileChooserParams_h
+#define WebFileChooserParams_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include "WebFileChooserCompletion.h"
+
+namespace WebKit {
+
+struct WebFileChooserParams {
+    // If |multiSelect| is true, the dialog allows the user to select multiple files.
+    bool multiSelect;
+    // If |directory| is true, the dialog allows the user to select a directory.
+    bool directory;
+    // If |saveAs| is true, the dialog allows the user to select a possibly
+    // non-existent file. This can be used for a "Save As" dialog.
+    bool saveAs;
+    // |title| is the title for a file chooser dialog. It can be an empty string.
+    WebString title;
+    // |initialValue| is a filename which the dialog should select by default.
+    // It can be an empty string.
+    WebString initialValue;
+    // This contains MIME type strings such as "audio/*" "text/plain" or file
+    // extensions beginning with a period (.) such as ".mp3" ".txt".
+    // The dialog may restrict selectable files to files with the specified MIME
+    // types or file extensions.
+    // This list comes from an 'accept' attribute value of an INPUT element, and
+    // it contains only lower-cased MIME type strings and file extensions.
+    WebVector<WebString> acceptTypes;
+    // |selectedFiles| has filenames which a file upload control already selected.
+    // A WebViewClient implementation may ask a user to select
+    //  - removing a file from the selected files,
+    //  - appending other files, or
+    //  - replacing with other files
+    // before opening a file chooser dialog.
+    WebVector<WebString> selectedFiles;
+    // See http://www.w3.org/TR/html-media-capture/ for the semantics of the
+    // capture attribute. This string will either be empty (meaning the feature
+    // is disabled) or one of the following values:
+    //  - filesystem (default)
+    //  - camera
+    //  - camcorder
+    //  - microphone
+    WebString capture;
+
+    WebFileChooserParams()
+        : multiSelect(false)
+        , directory(false)
+        , saveAs(false)
+    {
+    }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFileError.h b/public/webpage/WebFileError.h
new file mode 100644
index 0000000..771e98b
--- /dev/null
+++ b/public/webpage/WebFileError.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebFileError.h"
diff --git a/public/webpage/WebFileInfo.h b/public/webpage/WebFileInfo.h
new file mode 100644
index 0000000..0ed4347
--- /dev/null
+++ b/public/webpage/WebFileInfo.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebFileInfo.h"
diff --git a/public/webpage/WebFileSystemCallbacks.h b/public/webpage/WebFileSystemCallbacks.h
new file mode 100644
index 0000000..2e67662
--- /dev/null
+++ b/public/webpage/WebFileSystemCallbacks.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebFileSystemCallbacks.h"
diff --git a/public/webpage/WebFileSystemEntry.h b/public/webpage/WebFileSystemEntry.h
new file mode 100644
index 0000000..6e4ba40
--- /dev/null
+++ b/public/webpage/WebFileSystemEntry.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebFileSystemEntry.h"
diff --git a/public/webpage/WebFileUtilities.h b/public/webpage/WebFileUtilities.h
new file mode 100644
index 0000000..5fcda94
--- /dev/null
+++ b/public/webpage/WebFileUtilities.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebFileUtilities.h"
diff --git a/public/webpage/WebFileWriter.h b/public/webpage/WebFileWriter.h
new file mode 100644
index 0000000..e2a534b
--- /dev/null
+++ b/public/webpage/WebFileWriter.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFileWriter_h
+#define WebFileWriter_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+class WebURL;
+
+class WebFileWriter {
+public:
+    virtual ~WebFileWriter() { }
+
+    // Only one write or one truncate operation can be in progress at a time.
+    // These functions are asynchronous and will report results through the WebFileWriter's associated WebFileWriterClient.
+    virtual void write(long long position, const WebURL& blobURL) = 0;
+    virtual void truncate(long long length) = 0;
+
+    // Cancel will attempt to abort a running write or truncate.  However, it may not be possible to cancel an in-progress action, or the call may have come in too late.  Partial writes are possible.
+    // Do not call cancel when there is no write or truncate in progress.
+    virtual void cancel() = 0;
+};
+    
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFileWriterClient.h b/public/webpage/WebFileWriterClient.h
new file mode 100644
index 0000000..b41cf51
--- /dev/null
+++ b/public/webpage/WebFileWriterClient.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFileWriterClient_h
+#define WebFileWriterClient_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebFileError.h"
+
+namespace WebKit {
+
+class WebFileWriterClient {
+public:
+    // Called for each chunk of a write, to indicate progress.
+    // On the final chunk, when the write is finished, complete will be true.
+    virtual void didWrite(long long bytes, bool complete) = 0;
+
+    // Called once when the truncate completes successfully.
+    virtual void didTruncate() = 0;
+
+    // Called if the write or truncate fails, or if it is cancelled before the write or truncate completes.  Completion of an operation will be signalled exactly once, either by didFail, didTruncate, or didWrite(..., true).
+    virtual void didFail(WebFileError) = 0;
+
+protected:
+    virtual ~WebFileWriterClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFindOptions.h b/public/webpage/WebFindOptions.h
new file mode 100644
index 0000000..f76bd94
--- /dev/null
+++ b/public/webpage/WebFindOptions.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFindOptions_h
+#define WebFindOptions_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+// Options used when performing a find-in-page query.
+struct WebFindOptions {
+    // Whether to search forward or backward within the page.
+    bool forward;
+
+    // Whether search should be case-sensitive.
+    bool matchCase;
+
+    // Whether this operation is the first request or a follow-up.
+    bool findNext;
+
+    WebFindOptions()
+        : forward(true)
+        , matchCase(false)
+        , findNext(false) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFont.h b/public/webpage/WebFont.h
new file mode 100644
index 0000000..5d2d1a4
--- /dev/null
+++ b/public/webpage/WebFont.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFont_h
+#define WebFont_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebColor.h"
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+struct WebFontDescription;
+struct WebFloatPoint;
+struct WebFloatRect;
+struct WebPoint;
+struct WebRect;
+struct WebTextRun;
+
+class WebFont {
+public:
+    virtual ~WebFont() { }
+
+    WEBKIT_EXPORT static WebFont* create(const WebFontDescription&);
+
+    virtual WebFontDescription fontDescription() const = 0;
+
+    virtual int ascent() const = 0;
+    virtual int descent() const = 0;
+    virtual int height() const = 0;
+    virtual int lineSpacing() const = 0;
+    virtual float xHeight() const = 0;
+
+    // Draws the text run to the given canvas. The text is positioned at the
+    // given left-hand point at the baseline.
+    //
+    // The text will be clipped to the given clip rect. |canvasIsOpaque| is
+    // used to control whether subpixel antialiasing is possible. If there is a
+    // possibility the area drawn could be semi-transparent, subpixel
+    // antialiasing will be disabled.
+    //
+    // |from| and |to| allow the caller to specify a subrange of the given text
+    // run to draw. If |to| is -1, the entire run will be drawn.
+    virtual void drawText(WebCanvas*, const WebTextRun&, const WebFloatPoint& leftBaseline, WebColor,
+                          const WebRect& clip, bool canvasIsOpaque,
+                          int from = 0, int to = -1) const = 0;
+
+    // Measures the width in pixels of the given text run.
+    virtual int calculateWidth(const WebTextRun&) const = 0;
+
+    // Returns the character offset corresponding to the given horizontal pixel
+    // position as measured from from the left of the run.
+    virtual int offsetForPosition(const WebTextRun&, float position) const = 0;
+
+    // Returns the rectangle representing the selection rect for the subrange
+    // |from| -> |to| of the given text run. You can use -1 for |to| to specify
+    // the entire run (this will do something similar to calling width()).
+    //
+    // The rect will be positioned as if the text was drawn at the given
+    // |leftBaseline| position. |height| indicates the height of the selection
+    // rect you want, typically this will just be the height() of this font.
+    //
+    // To get the pixel offset of some character (the opposite of
+    // offsetForPosition()), pass in a |leftBaseline| = (0, 0), |from| = 0, and
+    // |to| = the character you want. The right edge of the resulting selection
+    // rect will tell you the right side of the character.
+    virtual WebFloatRect selectionRectForText(const WebTextRun&, const WebFloatPoint& leftBaseline,
+                                              int height, int from = 0, int to = -1) const = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFontCache.h b/public/webpage/WebFontCache.h
new file mode 100644
index 0000000..0a46236
--- /dev/null
+++ b/public/webpage/WebFontCache.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFontCache_h
+#define WebFontCache_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// An interface to query and configure WebKit's font cache.
+class WebFontCache {
+public:
+    // Returns the number of items in the font data cache.
+    WEBKIT_EXPORT static size_t fontDataCount();
+
+    // Returns the number of inactive items in the font data cache.
+    WEBKIT_EXPORT static size_t inactiveFontDataCount();
+
+    // Clears the cache.
+    WEBKIT_EXPORT static void clear();
+
+    // Purges inactive font data.
+    WEBKIT_EXPORT static void prune();
+
+private:
+    WebFontCache();  // Not intended to be instanced.
+};
+
+}  // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFontDescription.h b/public/webpage/WebFontDescription.h
new file mode 100644
index 0000000..145fd59
--- /dev/null
+++ b/public/webpage/WebFontDescription.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFontDescription_h
+#define WebFontDescription_h
+
+#include "../platform/WebString.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class FontDescription; }
+#endif
+
+namespace WebKit {
+
+struct WebFontDescription {
+    enum GenericFamily {
+        GenericFamilyNone,
+        GenericFamilyStandard,
+        GenericFamilySerif,
+        GenericFamilySansSerif,
+        GenericFamilyMonospace,
+        GenericFamilyCursive,
+        GenericFamilyFantasy
+    };
+
+    enum Smoothing {
+        SmoothingAuto,
+        SmoothingNone,
+        SmoothingGrayscale,
+        SmoothingSubpixel
+    };
+
+    enum Weight { 
+        Weight100,
+        Weight200,
+        Weight300,
+        Weight400,
+        Weight500,
+        Weight600,
+        Weight700,
+        Weight800,
+        Weight900,
+        WeightNormal = Weight400,
+        WeightBold = Weight700
+    };
+
+    WebFontDescription()
+        : genericFamily(GenericFamilyNone)
+        , size(0)
+        , italic(false)
+        , smallCaps(false)
+        , weight(WeightNormal)
+        , smoothing(SmoothingAuto)
+        , letterSpacing(0)
+        , wordSpacing(0)
+    {
+    }
+
+    WebString family;
+    GenericFamily genericFamily;
+    float size;
+    bool italic;
+    bool smallCaps;
+    Weight weight;
+    Smoothing smoothing;
+
+    short letterSpacing;
+    short wordSpacing;
+
+#if WEBKIT_IMPLEMENTATION
+    WebFontDescription(const WebCore::FontDescription&, short fontLetterSpacing, short fontWordSpacing);
+
+    operator WebCore::FontDescription() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFormControlElement.h b/public/webpage/WebFormControlElement.h
new file mode 100644
index 0000000..1be6610
--- /dev/null
+++ b/public/webpage/WebFormControlElement.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFormControlElement_h
+#define WebFormControlElement_h
+
+#include "../platform/WebString.h"
+#include "WebElement.h"
+#include "WebFormElement.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLFormControlElement; }
+#endif
+
+namespace WebKit {
+
+// Provides readonly access to some properties of a DOM form control element node.
+class WebFormControlElement : public WebElement {
+public:
+    WebFormControlElement() : WebElement() { }
+    WebFormControlElement(const WebFormControlElement& e) : WebElement(e) { }
+
+    WebFormControlElement& operator=(const WebFormControlElement& e)
+    {
+        WebElement::assign(e);
+        return *this;
+    }
+    void assign(const WebFormControlElement& e) { WebElement::assign(e); }
+
+    WEBKIT_EXPORT bool isEnabled() const;
+    WEBKIT_EXPORT bool isReadOnly() const;
+    WEBKIT_EXPORT WebString formControlName() const;
+    WEBKIT_EXPORT WebString formControlType() const;
+
+    WEBKIT_EXPORT void dispatchFormControlChangeEvent();
+
+    // Returns the name that should be used for the specified |element| when
+    // storing autofill data.  This is either the field name or its id, an empty
+    // string if it has no name and no id.
+    WEBKIT_EXPORT WebString nameForAutofill() const;
+
+    WEBKIT_EXPORT WebFormElement form() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebFormControlElement(const WTF::PassRefPtr<WebCore::HTMLFormControlElement>&);
+    WebFormControlElement& operator=(const WTF::PassRefPtr<WebCore::HTMLFormControlElement>&);
+    operator WTF::PassRefPtr<WebCore::HTMLFormControlElement>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFormElement.h b/public/webpage/WebFormElement.h
new file mode 100644
index 0000000..b5f1c3a
--- /dev/null
+++ b/public/webpage/WebFormElement.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFormElement_h
+#define WebFormElement_h
+
+#include "../platform/WebVector.h"
+#include "WebElement.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLFormElement; }
+#endif
+
+namespace WebKit {
+
+    class WebInputElement;
+    class WebFormControlElement;
+
+    // A container for passing around a reference to a form element.  Provides
+    // some information about the form.
+    class WebFormElement : public WebElement {
+    public:
+        ~WebFormElement() { reset(); }
+
+        WebFormElement() : WebElement() { }
+        WebFormElement(const WebFormElement& element) : WebElement(element) { }
+
+        WebFormElement& operator=(const WebFormElement& element)
+        {
+            WebElement::assign(element);
+            return *this;
+        }
+        void assign(const WebFormElement& element) { WebElement::assign(element); }
+
+        WEBKIT_EXPORT bool autoComplete() const;
+        WEBKIT_EXPORT WebString action() const;
+        WEBKIT_EXPORT WebString name() const;
+        WEBKIT_EXPORT WebString method() const;
+        WEBKIT_EXPORT bool wasUserSubmitted() const;
+        WEBKIT_EXPORT void submit();
+        // FIXME: Deprecate and replace with WebVector<WebElement>.
+        WEBKIT_EXPORT void getNamedElements(const WebString&, WebVector<WebNode>&);
+        WEBKIT_EXPORT void getFormControlElements(WebVector<WebFormControlElement>&) const;
+
+        enum AutocompleteResult {
+            AutocompleteResultSuccess,
+            AutocompleteResultErrorDisabled,
+            AutocompleteResultErrorCancel,
+            AutocompleteResultErrorInvalid,
+        };
+        WEBKIT_EXPORT void finishRequestAutocomplete(WebFormElement::AutocompleteResult);
+
+#if WEBKIT_IMPLEMENTATION
+        WebFormElement(const WTF::PassRefPtr<WebCore::HTMLFormElement>&);
+        WebFormElement& operator=(const WTF::PassRefPtr<WebCore::HTMLFormElement>&);
+        operator WTF::PassRefPtr<WebCore::HTMLFormElement>() const;
+#endif
+    };
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFrame.h b/public/webpage/WebFrame.h
new file mode 100644
index 0000000..4d7d1e2
--- /dev/null
+++ b/public/webpage/WebFrame.h
@@ -0,0 +1,660 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFrame_h
+#define WebFrame_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebFileSystem.h"
+#include "../platform/WebFileSystemType.h"
+#include "../platform/WebMessagePortChannel.h"
+#include "../platform/WebReferrerPolicy.h"
+#include "../platform/WebURL.h"
+#include "WebIconURL.h"
+#include "WebNode.h"
+#include "WebURLLoaderOptions.h"
+
+struct NPObject;
+
+namespace v8 {
+class Context;
+class Function;
+class Object;
+class Value;
+template <class T> class Handle;
+template <class T> class Local;
+}
+
+namespace WebKit {
+
+class WebData;
+class WebDataSource;
+class WebDocument;
+class WebElement;
+class WebFormElement;
+class WebHistoryItem;
+class WebInputElement;
+class WebPerformance;
+class WebRange;
+class WebSecurityOrigin;
+class WebString;
+class WebURL;
+class WebURLLoader;
+class WebURLRequest;
+class WebView;
+struct WebConsoleMessage;
+struct WebFindOptions;
+struct WebFloatPoint;
+struct WebFloatRect;
+struct WebPoint;
+struct WebPrintParams;
+struct WebRect;
+struct WebScriptSource;
+struct WebSize;
+struct WebURLLoaderOptions;
+
+template <typename T> class WebVector;
+
+class WebFrame {
+public:
+    // Control of renderTreeAsText output
+    enum RenderAsTextControl {
+        RenderAsTextNormal = 0,
+        RenderAsTextDebug = 1 << 0,
+        RenderAsTextPrinting = 1 << 1
+    };
+    typedef unsigned RenderAsTextControls;
+
+    // Returns the number of live WebFrame objects, used for leak checking.
+    WEBKIT_EXPORT static int instanceCount();
+
+    // Returns the WebFrame associated with the current V8 context. This
+    // function can return 0 if the context is associated with a Document that
+    // is not currently being displayed in a Frame.
+    WEBKIT_EXPORT static WebFrame* frameForCurrentContext();
+
+    // Returns the frame corresponding to the given context. This can return 0
+    // if the context is detached from the frame, or if the context doesn't
+    // correspond to a frame (e.g., workers).
+    WEBKIT_EXPORT static WebFrame* frameForContext(v8::Handle<v8::Context>);
+
+    // Returns the frame inside a given frame or iframe element. Returns 0 if
+    // the given element is not a frame, iframe or if the frame is empty.
+    WEBKIT_EXPORT static WebFrame* fromFrameOwnerElement(const WebElement&);
+
+
+    // Basic properties ---------------------------------------------------
+
+    // The unique name of this frame.
+    virtual WebString uniqueName() const = 0;
+
+    // The name of this frame. If no name is given, empty string is returned.
+    virtual WebString assignedName() const = 0;
+
+    // Sets the name of this frame. For child frames (frames that are not a
+    // top-most frame) the actual name may have a suffix appended to make the
+    // frame name unique within the hierarchy.
+    virtual void setName(const WebString&) = 0;
+
+    // A globally unique identifier for this frame.
+    virtual long long identifier() const = 0;
+
+    // The urls of the given combination types of favicon (if any) specified by
+    // the document loaded in this frame. The iconTypesMask is a bit-mask of
+    // WebIconURL::Type values, used to select from the available set of icon
+    // URLs
+    virtual WebVector<WebIconURL> iconURLs(int iconTypesMask) const = 0;
+
+
+    // Geometry -----------------------------------------------------------
+
+    // NOTE: These routines do not force page layout so their results may
+    // not be accurate if the page layout is out-of-date.
+
+    // If set to false, do not draw scrollbars on this frame's view.
+    virtual void setCanHaveScrollbars(bool) = 0;
+
+    // The scroll offset from the top-left corner of the frame in pixels.
+    virtual WebSize scrollOffset() const = 0;
+    virtual void setScrollOffset(const WebSize&) = 0;
+
+    // The minimum and maxium scroll positions in pixels.
+    virtual WebSize minimumScrollOffset() const = 0;
+    virtual WebSize maximumScrollOffset() const = 0;
+
+    // The size of the contents area.
+    virtual WebSize contentsSize() const = 0;
+
+    // Returns true if the contents (minus scrollbars) has non-zero area.
+    virtual bool hasVisibleContent() const = 0;
+
+    // Returns the visible content rect (minus scrollbars, in absolute coordinate)
+    virtual WebRect visibleContentRect() const = 0;
+
+    virtual bool hasHorizontalScrollbar() const = 0;
+    virtual bool hasVerticalScrollbar() const = 0;
+
+
+    // Hierarchy ----------------------------------------------------------
+
+    // Returns the containing view.
+    virtual WebView* view() const = 0;
+
+    // Returns the frame that opened this frame or 0 if there is none.
+    virtual WebFrame* opener() const = 0;
+
+    // Sets the frame that opened this one or 0 if there is none.
+    virtual void setOpener(const WebFrame*) = 0;
+
+    // Reset the frame that opened this frame to 0.
+    // This is executed between layout tests runs
+    void clearOpener() { setOpener(0); }
+
+    // Returns the parent frame or 0 if this is a top-most frame.
+    virtual WebFrame* parent() const = 0;
+
+    // Returns the top-most frame in the hierarchy containing this frame.
+    virtual WebFrame* top() const = 0;
+
+    // Returns the first/last child frame.
+    virtual WebFrame* firstChild() const = 0;
+    virtual WebFrame* lastChild() const = 0;
+
+    // Returns the next/previous sibling frame.
+    virtual WebFrame* nextSibling() const = 0;
+    virtual WebFrame* previousSibling() const = 0;
+
+    // Returns the next/previous frame in "frame traversal order"
+    // optionally wrapping around.
+    virtual WebFrame* traverseNext(bool wrap) const = 0;
+    virtual WebFrame* traversePrevious(bool wrap) const = 0;
+
+    // Returns the child frame identified by the given name.
+    virtual WebFrame* findChildByName(const WebString& name) const = 0;
+
+    // Returns the child frame identified by the given xpath expression.
+    virtual WebFrame* findChildByExpression(const WebString& xpath) const = 0;
+
+
+    // Content ------------------------------------------------------------
+
+    virtual WebDocument document() const = 0;
+
+    virtual WebPerformance performance() const = 0;
+
+
+    // Scripting ----------------------------------------------------------
+
+    // Returns a NPObject corresponding to this frame's DOMWindow.
+    virtual NPObject* windowObject() const = 0;
+
+    // Binds a NPObject as a property of this frame's DOMWindow.
+    virtual void bindToWindowObject(const WebString& name, NPObject*) = 0;
+    virtual void bindToWindowObject(
+        const WebString& name, NPObject*, void*) = 0;
+
+    // Executes script in the context of the current page.
+    virtual void executeScript(const WebScriptSource&) = 0;
+
+    // Executes JavaScript in a new world associated with the web frame.
+    // The script gets its own global scope and its own prototypes for
+    // intrinsic JavaScript objects (String, Array, and so-on). It also
+    // gets its own wrappers for all DOM nodes and DOM constructors.
+    // extensionGroup is an embedder-provided specifier that controls which
+    // v8 extensions are loaded into the new context - see
+    // WebKit::registerExtension for the corresponding specifier.
+    //
+    // worldID must be > 0 (as 0 represents the main world).
+    virtual void executeScriptInIsolatedWorld(
+        int worldID, const WebScriptSource* sources, unsigned numSources,
+        int extensionGroup) = 0;
+
+    // Associates an isolated world (see above for description) with a security
+    // origin. XMLHttpRequest instances used in that world will be considered
+    // to come from that origin, not the frame's.
+    virtual void setIsolatedWorldSecurityOrigin(
+        int worldID, const WebSecurityOrigin&) = 0;
+
+    // Associates a content security policy with an isolated world. This policy
+    // should be used when evaluating script in the isolated world, and should
+    // also replace a protected resource's CSP when evaluating resources
+    // injected into the DOM.
+    //
+    // FIXME: Setting this simply bypasses the protected resource's CSP. It
+    //     doesn't yet restrict the isolated world to the provided policy.
+    virtual void setIsolatedWorldContentSecurityPolicy(
+        int worldID, const WebString&) = 0;
+
+    // Logs to the console associated with this frame.
+    virtual void addMessageToConsole(const WebConsoleMessage&) = 0;
+
+    // Calls window.gc() if it is defined.
+    virtual void collectGarbage() = 0;
+
+    // Check if the scripting URL represents a mixed content condition relative
+    // to this frame.
+    virtual bool checkIfRunInsecureContent(const WebURL&) const = 0;
+
+    // Executes script in the context of the current page and returns the value
+    // that the script evaluated to.
+    virtual v8::Handle<v8::Value> executeScriptAndReturnValue(
+        const WebScriptSource&) = 0;
+
+    // worldID must be > 0 (as 0 represents the main world).
+    virtual void executeScriptInIsolatedWorld(
+        int worldID, const WebScriptSource* sourcesIn, unsigned numSources,
+        int extensionGroup, WebVector<v8::Local<v8::Value> >* results) = 0;
+
+    // Call the function with the given receiver and arguments, bypassing
+    // canExecute().
+    virtual v8::Handle<v8::Value> callFunctionEvenIfScriptDisabled(
+        v8::Handle<v8::Function>,
+        v8::Handle<v8::Object>,
+        int argc,
+        v8::Handle<v8::Value> argv[]) = 0;
+
+    // Returns the V8 context for associated with the main world and this
+    // frame. There can be many V8 contexts associated with this frame, one for
+    // each isolated world and one for the main world. If you don't know what
+    // the "main world" or an "isolated world" is, then you probably shouldn't
+    // be calling this API.
+    virtual v8::Local<v8::Context> mainWorldScriptContext() const = 0;
+
+    // Creates an instance of file system object.
+    virtual v8::Handle<v8::Value> createFileSystem(WebFileSystemType,
+        const WebString& name,
+        const WebString& rootURL) = 0;
+    // Creates an instance of serializable file system object.
+    // FIXME: Remove this API after we have a better way of creating serialized
+    // file system object.
+    virtual v8::Handle<v8::Value> createSerializableFileSystem(WebFileSystemType,
+        const WebString& name,
+        const WebString& rootURL) = 0;
+    // Creates an instance of file or directory entry object.
+    virtual v8::Handle<v8::Value> createFileEntry(WebFileSystemType,
+        const WebString& fileSystemName,
+        const WebString& fileSystemRootURL,
+        const WebString& filePath,
+        bool isDirectory) = 0;
+
+    // Navigation ----------------------------------------------------------
+
+    // Reload the current document.
+    // True |ignoreCache| explicitly bypasses caches.
+    // False |ignoreCache| revalidates any existing cache entries.
+    virtual void reload(bool ignoreCache = false) = 0;
+
+    // This is used for situations where we want to reload a different URL because of a redirect.
+    virtual void reloadWithOverrideURL(const WebURL& overrideUrl, bool ignoreCache = false) = 0;
+
+    // Load the given URL.
+    virtual void loadRequest(const WebURLRequest&) = 0;
+
+    // Load the given history state, corresponding to a back/forward
+    // navigation.
+    virtual void loadHistoryItem(const WebHistoryItem&) = 0;
+
+    // Loads the given data with specific mime type and optional text
+    // encoding.  For HTML data, baseURL indicates the security origin of
+    // the document and is used to resolve links.  If specified,
+    // unreachableURL is reported via WebDataSource::unreachableURL.  If
+    // replace is false, then this data will be loaded as a normal
+    // navigation.  Otherwise, the current history item will be replaced.
+    virtual void loadData(const WebData& data,
+                          const WebString& mimeType,
+                          const WebString& textEncoding,
+                          const WebURL& baseURL,
+                          const WebURL& unreachableURL = WebURL(),
+                          bool replace = false) = 0;
+
+    // This method is short-hand for calling LoadData, where mime_type is
+    // "text/html" and text_encoding is "UTF-8".
+    virtual void loadHTMLString(const WebData& html,
+                                const WebURL& baseURL,
+                                const WebURL& unreachableURL = WebURL(),
+                                bool replace = false) = 0;
+
+    // Returns true if the current frame is busy loading content.
+    virtual bool isLoading() const = 0;
+
+    // Stops any pending loads on the frame and its children.
+    virtual void stopLoading() = 0;
+
+    // Returns the data source that is currently loading.  May be null.
+    virtual WebDataSource* provisionalDataSource() const = 0;
+
+    // Returns the data source that is currently loaded.
+    virtual WebDataSource* dataSource() const = 0;
+
+    // Returns the previous history item.  Check WebHistoryItem::isNull()
+    // before using.
+    virtual WebHistoryItem previousHistoryItem() const = 0;
+
+    // Returns the current history item.  Check WebHistoryItem::isNull()
+    // before using.
+    virtual WebHistoryItem currentHistoryItem() const = 0;
+
+    // View-source rendering mode.  Set this before loading an URL to cause
+    // it to be rendered in view-source mode.
+    virtual void enableViewSourceMode(bool) = 0;
+    virtual bool isViewSourceModeEnabled() const = 0;
+
+    // Sets the referrer for the given request to be the specified URL or
+    // if that is null, then it sets the referrer to the referrer that the
+    // frame would use for subresources.  NOTE: This method also filters
+    // out invalid referrers (e.g., it is invalid to send a HTTPS URL as
+    // the referrer for a HTTP request).
+    virtual void setReferrerForRequest(WebURLRequest&, const WebURL&) = 0;
+
+    // Called to associate the WebURLRequest with this frame.  The request
+    // will be modified to inherit parameters that allow it to be loaded.
+    // This method ends up triggering WebFrameClient::willSendRequest.
+    // DEPRECATED: Please use createAssociatedURLLoader instead.
+    virtual void dispatchWillSendRequest(WebURLRequest&) = 0;
+
+    // Returns a WebURLLoader that is associated with this frame.  The loader
+    // will, for example, be cancelled when WebFrame::stopLoading is called.
+    // FIXME: stopLoading does not yet cancel an associated loader!!
+    virtual WebURLLoader* createAssociatedURLLoader(const WebURLLoaderOptions& = WebURLLoaderOptions()) = 0;
+
+    // Called from within WebFrameClient::didReceiveDocumentData to commit
+    // data for the frame that will be used to construct the frame's
+    // document.
+    virtual void commitDocumentData(const char* data, size_t length) = 0;
+
+    // Returns the number of registered unload listeners.
+    virtual unsigned unloadListenerCount() const = 0;
+
+    // Returns true if this frame is in the process of opening a new frame
+    // with a suppressed opener.
+    virtual bool willSuppressOpenerInNewFrame() const = 0;
+
+
+    // Editing -------------------------------------------------------------
+
+    // Replaces the selection with the given text.
+    virtual void replaceSelection(const WebString& text) = 0;
+
+    virtual void insertText(const WebString& text) = 0;
+
+    virtual void setMarkedText(const WebString& text, unsigned location, unsigned length) = 0;
+    virtual void unmarkText() = 0;
+    virtual bool hasMarkedText() const = 0;
+
+    virtual WebRange markedRange() const = 0;
+
+    // Returns the frame rectangle in window coordinate space of the given text
+    // range.
+    virtual bool firstRectForCharacterRange(unsigned location, unsigned length, WebRect&) const = 0;
+
+    // Returns the index of a character in the Frame's text stream at the given
+    // point. The point is in the window coordinate space. Will return
+    // WTF::notFound if the point is invalid.
+    virtual size_t characterIndexForPoint(const WebPoint&) const = 0;
+
+    // Supports commands like Undo, Redo, Cut, Copy, Paste, SelectAll,
+    // Unselect, etc. See EditorCommand.cpp for the full list of supported
+    // commands.
+    virtual bool executeCommand(const WebString&, const WebNode& = WebNode()) = 0;
+    virtual bool executeCommand(const WebString&, const WebString& value, const WebNode& = WebNode()) = 0;
+    virtual bool isCommandEnabled(const WebString&) const = 0;
+
+    // Spell-checking support.
+    virtual void enableContinuousSpellChecking(bool) = 0;
+    virtual bool isContinuousSpellCheckingEnabled() const = 0;
+    virtual void requestTextChecking(const WebElement&) = 0;
+    virtual void replaceMisspelledRange(const WebString&) = 0;
+    virtual void removeSpellingMarkers() = 0;
+
+    // Selection -----------------------------------------------------------
+
+    virtual bool hasSelection() const = 0;
+
+    virtual WebRange selectionRange() const = 0;
+
+    virtual WebString selectionAsText() const = 0;
+    virtual WebString selectionAsMarkup() const = 0;
+
+    // Expands the selection to a word around the caret and returns
+    // true. Does nothing and returns false if there is no caret or
+    // there is ranged selection.
+    virtual bool selectWordAroundCaret() = 0;
+
+    // DEPRECATED: Use moveRangeSelection/moveCaretSelection.
+    virtual void selectRange(const WebPoint& base, const WebPoint& extent) = 0;
+    virtual void moveCaretSelectionTowardsWindowPoint(const WebPoint&) = 0;
+
+    virtual void selectRange(const WebRange&) = 0;
+
+    // Move the current selection to the provided window point/points. If the
+    // current selection is editable, the new selection will be restricted to
+    // the root editable element.
+    virtual void moveRangeSelection(const WebPoint& base, const WebPoint& extent) = 0;
+    virtual void moveCaretSelection(const WebPoint&) = 0;
+
+    // Printing ------------------------------------------------------------
+
+    // Reformats the WebFrame for printing. WebPrintParams specifies the printable
+    // content size, paper size, printable area size, printer DPI and print
+    // scaling option. If constrainToNode node is specified, then only the given node
+    // is printed (for now only plugins are supported), instead of the entire frame.
+    // Returns the number of pages that can be printed at the given
+    // page size. The out param useBrowserOverlays specifies whether the browser
+    // process should use its overlays (header, footer, margins etc) or whether
+    // the renderer controls this.
+    virtual int printBegin(const WebPrintParams&,
+                           const WebNode& constrainToNode = WebNode(),
+                           bool* useBrowserOverlays = 0) = 0;
+
+    // Returns the page shrinking factor calculated by webkit (usually
+    // between 1/1.25 and 1/2). Returns 0 if the page number is invalid or
+    // not in printing mode.
+    virtual float getPrintPageShrink(int page) = 0;
+
+    // Prints one page, and returns the calculated page shrinking factor
+    // (usually between 1/1.25 and 1/2).  Returns 0 if the page number is
+    // invalid or not in printing mode.
+    virtual float printPage(int pageToPrint, WebCanvas*) = 0;
+
+    // Reformats the WebFrame for screen display.
+    virtual void printEnd() = 0;
+
+    // If the frame contains a full-frame plugin or the given node refers to a
+    // plugin whose content indicates that printed output should not be scaled,
+    // return true, otherwise return false.
+    virtual bool isPrintScalingDisabledForPlugin(const WebNode& = WebNode()) = 0;
+
+    // CSS3 Paged Media ----------------------------------------------------
+
+    // Returns true if page box (margin boxes and page borders) is visible.
+    virtual bool isPageBoxVisible(int pageIndex) = 0;
+
+    // Returns true if the page style has custom size information.
+    virtual bool hasCustomPageSizeStyle(int pageIndex) = 0;
+
+    // Returns the preferred page size and margins in pixels, assuming 96
+    // pixels per inch. pageSize, marginTop, marginRight, marginBottom,
+    // marginLeft must be initialized to the default values that are used if
+    // auto is specified.
+    virtual void pageSizeAndMarginsInPixels(int pageIndex,
+                                            WebSize& pageSize,
+                                            int& marginTop,
+                                            int& marginRight,
+                                            int& marginBottom,
+                                            int& marginLeft) = 0;
+
+    // Returns the value for a page property that is only defined when printing.
+    // printBegin must have been called before this method.
+    virtual WebString pageProperty(const WebString& propertyName, int pageIndex) = 0;
+
+    // Find-in-page --------------------------------------------------------
+
+    // Searches a frame for a given string.
+    //
+    // If a match is found, this function will select it (scrolling down to
+    // make it visible if needed) and fill in selectionRect with the
+    // location of where the match was found (in window coordinates).
+    //
+    // If no match is found, this function clears all tickmarks and
+    // highlighting.
+    //
+    // Returns true if the search string was found, false otherwise.
+    virtual bool find(int identifier,
+                      const WebString& searchText,
+                      const WebFindOptions& options,
+                      bool wrapWithinFrame,
+                      WebRect* selectionRect) = 0;
+
+    // Notifies the frame that we are no longer interested in searching.
+    // This will abort any asynchronous scoping effort already under way
+    // (see the function scopeStringMatches for details) and erase all
+    // tick-marks and highlighting from the previous search.  If
+    // clearSelection is true, it will also make sure the end state for the
+    // find operation does not leave a selection.  This can occur when the
+    // user clears the search string but does not close the find box.
+    virtual void stopFinding(bool clearSelection) = 0;
+
+    // Counts how many times a particular string occurs within the frame.
+    // It also retrieves the location of the string and updates a vector in
+    // the frame so that tick-marks and highlighting can be drawn.  This
+    // function does its work asynchronously, by running for a certain
+    // time-slice and then scheduling itself (co-operative multitasking) to
+    // be invoked later (repeating the process until all matches have been
+    // found).  This allows multiple frames to be searched at the same time
+    // and provides a way to cancel at any time (see
+    // cancelPendingScopingEffort).  The parameter searchText specifies
+    // what to look for and |reset| signals whether this is a brand new
+    // request or a continuation of the last scoping effort.
+    virtual void scopeStringMatches(int identifier,
+                                    const WebString& searchText,
+                                    const WebFindOptions& options,
+                                    bool reset) = 0;
+
+    // Cancels any outstanding requests for scoping string matches on a frame.
+    virtual void cancelPendingScopingEffort() = 0;
+
+    // This function is called on the main frame during the scoping effort
+    // to keep a running tally of the accumulated total match-count for all
+    // frames.  After updating the count it will notify the WebViewClient
+    // about the new count.
+    virtual void increaseMatchCount(int count, int identifier) = 0;
+
+    // This function is called on the main frame to reset the total number
+    // of matches found during the scoping effort.
+    virtual void resetMatchCount() = 0;
+
+    // Returns a counter that is incremented when the find-in-page markers are
+    // changed on any frame. Switching the active marker doesn't change the
+    // current version. Should be called only on the main frame.
+    virtual int findMatchMarkersVersion() const = 0;
+
+    // Returns the bounding box of the active find-in-page match marker or an
+    // empty rect if no such marker exists. The rect is returned in find-in-page
+    // coordinates whatever frame the active marker is.
+    // Should be called only on the main frame.
+    virtual WebFloatRect activeFindMatchRect() = 0;
+
+    // Swaps the contents of the provided vector with the bounding boxes of the
+    // find-in-page match markers from all frames. The bounding boxes are returned
+    // in find-in-page coordinates. This method should be called only on the main frame.
+    virtual void findMatchRects(WebVector<WebFloatRect>&) = 0;
+
+    // Selects the find-in-page match in the appropriate frame closest to the
+    // provided point in find-in-page coordinates. Returns the ordinal of such
+    // match or -1 if none could be found. If not null, selectionRect is set to
+    // the bounding box of the selected match in window coordinates.
+    // This method should be called only on the main frame.
+    virtual int selectNearestFindMatch(const WebFloatPoint&,
+                                       WebRect* selectionRect) = 0;
+
+    // OrientationChange event ---------------------------------------------
+
+    // Orientation is the interface orientation in degrees.
+    // Some examples are:
+    //  0 is straight up; -90 is when the device is rotated 90 clockwise;
+    //  90 is when rotated counter clockwise.
+    virtual void sendOrientationChangeEvent(int orientation) = 0;
+
+    // Events --------------------------------------------------------------
+
+    // Dispatches a message event on the current DOMWindow in this WebFrame.
+    virtual void dispatchMessageEventWithOriginCheck(
+        const WebSecurityOrigin& intendedTargetOrigin,
+        const WebDOMEvent&) = 0;
+
+
+    // Utility -------------------------------------------------------------
+
+    // Returns the contents of this frame as a string.  If the text is
+    // longer than maxChars, it will be clipped to that length.  WARNING:
+    // This function may be slow depending on the number of characters
+    // retrieved and page complexity.  For a typically sized page, expect
+    // it to take on the order of milliseconds.
+    //
+    // If there is room, subframe text will be recursively appended. Each
+    // frame will be separated by an empty line.
+    virtual WebString contentAsText(size_t maxChars) const = 0;
+
+    // Returns HTML text for the contents of this frame.  This is generated
+    // from the DOM.
+    virtual WebString contentAsMarkup() const = 0;
+
+    // Returns a text representation of the render tree.  This method is used
+    // to support layout tests.
+    virtual WebString renderTreeAsText(RenderAsTextControls toShow = RenderAsTextNormal) const = 0;
+
+    // Calls markerTextForListItem() defined in WebCore/rendering/RenderTreeAsText.h.
+    virtual WebString markerTextForListItem(const WebElement&) const = 0;
+
+    // Prints all of the pages into the canvas, with page boundaries drawn as
+    // one pixel wide blue lines. This method exists to support layout tests.
+    virtual void printPagesWithBoundaries(WebCanvas*, const WebSize&) = 0;
+
+    // Returns the bounds rect for current selection. If selection is performed
+    // on transformed text, the rect will still bound the selection but will
+    // not be transformed itself. If no selection is present, the rect will be
+    // empty ((0,0), (0,0)).
+    virtual WebRect selectionBoundsRect() const = 0;
+
+    // Only for testing purpose:
+    // Returns true if selection.anchorNode has a marker on range from |from| with |length|.
+    virtual bool selectionStartHasSpellingMarkerFor(int from, int length) const = 0;
+
+    // Dumps the layer tree, used by the accelerated compositor, in
+    // text form. This is used only by layout tests.
+    virtual WebString layerTreeAsText(bool showDebugInfo = false) const = 0;
+
+protected:
+    ~WebFrame() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebFrameClient.h b/public/webpage/WebFrameClient.h
new file mode 100644
index 0000000..53607d9
--- /dev/null
+++ b/public/webpage/WebFrameClient.h
@@ -0,0 +1,438 @@
+/*
+ * Copyright (C) 2011, 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFrameClient_h
+#define WebFrameClient_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebFileSystem.h"
+#include "../platform/WebFileSystemType.h"
+#include "../platform/WebURLError.h"
+#include "../platform/WebURLRequest.h"
+#include "WebDOMMessageEvent.h"
+#include "WebIconURL.h"
+#include "WebNavigationPolicy.h"
+#include "WebNavigationType.h"
+#include "WebSecurityOrigin.h"
+#include "WebStorageQuotaType.h"
+#include "WebTextDirection.h"
+#include <v8.h>
+
+namespace WebKit {
+
+class WebApplicationCacheHost;
+class WebApplicationCacheHostClient;
+class WebCachedURLRequest;
+class WebCookieJar;
+class WebDataSource;
+class WebDOMEvent;
+class WebFormElement;
+class WebFrame;
+class WebMediaPlayer;
+class WebMediaPlayerClient;
+class WebNode;
+class WebPlugin;
+class WebRTCPeerConnectionHandler;
+class WebSharedWorker;
+class WebSharedWorkerClient;
+class WebSocketStreamHandle;
+class WebStorageQuotaCallbacks;
+class WebString;
+class WebURL;
+class WebURLLoader;
+class WebURLResponse;
+class WebWorker;
+struct WebPluginParams;
+struct WebRect;
+struct WebSize;
+struct WebURLError;
+
+class WebFrameClient {
+public:
+    // Factory methods -----------------------------------------------------
+
+    // May return null.
+    virtual WebPlugin* createPlugin(WebFrame*, const WebPluginParams&) { return 0; }
+
+    // May return null.
+    virtual WebSharedWorker* createSharedWorker(WebFrame*, const WebURL&, const WebString&, unsigned long long) { return 0; }
+
+    // May return null.
+    virtual WebMediaPlayer* createMediaPlayer(WebFrame*, const WebURL&, WebMediaPlayerClient*) { return 0; }
+
+    // May return null.
+    virtual WebApplicationCacheHost* createApplicationCacheHost(WebFrame*, WebApplicationCacheHostClient*) { return 0; }
+
+
+    // Services ------------------------------------------------------------
+
+    // A frame specific cookie jar.  May return null, in which case
+    // WebKitPlatformSupport::cookieJar() will be called to access cookies.
+    virtual WebCookieJar* cookieJar(WebFrame*) { return 0; }
+
+
+    // General notifications -----------------------------------------------
+
+    // Indicates that another page has accessed the DOM of the initial empty
+    // document of a main frame. After this, it is no longer safe to show a
+    // pending navigation's URL, because a URL spoof is possible.
+    virtual void didAccessInitialDocument(WebFrame*) { }
+
+    // A child frame was created in this frame. This is called when the frame
+    // is created and initialized.
+    virtual void didCreateFrame(WebFrame* parent, WebFrame* child) { }
+
+    // This frame set its opener to null, disowning it.
+    // See http://html.spec.whatwg.org/#dom-opener.
+    virtual void didDisownOpener(WebFrame*) { }
+
+    // This frame has been detached from the view, but has not been closed yet.
+    virtual void frameDetached(WebFrame*) { }
+
+    // This frame is about to be closed. This is called after frameDetached,
+    // when the document is being unloaded, due to new one committing.
+    virtual void willClose(WebFrame*) { }
+
+    // This frame's name has changed.
+    virtual void didChangeName(WebFrame*, const WebString&) { }
+
+    // Load commands -------------------------------------------------------
+
+    // The client should handle the navigation externally.
+    virtual void loadURLExternally(
+        WebFrame*, const WebURLRequest&, WebNavigationPolicy) { }
+    virtual void loadURLExternally(
+        WebFrame*, const WebURLRequest&, WebNavigationPolicy, const WebString& downloadName) { }
+
+
+    // Navigational queries ------------------------------------------------
+
+    // The client may choose to alter the navigation policy.  Otherwise,
+    // defaultPolicy should just be returned.
+    virtual WebNavigationPolicy decidePolicyForNavigation(
+        WebFrame*, const WebURLRequest&, WebNavigationType,
+        WebNavigationPolicy defaultPolicy, bool isRedirect) { return defaultPolicy; }
+
+    // Returns an error corresponding to canHandledRequest() returning false.
+    virtual WebURLError cannotHandleRequestError(
+        WebFrame*, const WebURLRequest& request) { return WebURLError(); }
+
+    // Returns an error corresponding to a user cancellation event.
+    virtual WebURLError cancelledError(
+        WebFrame*, const WebURLRequest& request) { return WebURLError(); }
+
+    // Notify that a URL cannot be handled.
+    virtual void unableToImplementPolicyWithError(
+        WebFrame*, const WebURLError&) { }
+
+
+    // Navigational notifications ------------------------------------------
+
+    // A form submission has been requested, but the page's submit event handler
+    // hasn't yet had a chance to run (and possibly alter/interrupt the submit.)
+    virtual void willSendSubmitEvent(WebFrame*, const WebFormElement&) { }
+
+    // A form submission is about to occur.
+    virtual void willSubmitForm(WebFrame*, const WebFormElement&) { }
+
+    // A client-side redirect will occur.  This may correspond to a <META
+    // refresh> or some script activity.
+    virtual void willPerformClientRedirect(
+        WebFrame*, const WebURL& from, const WebURL& to,
+        double interval, double fireTime) { }
+
+    // A client-side redirect was cancelled.
+    virtual void didCancelClientRedirect(WebFrame*) { }
+
+    // A client-side redirect completed.
+    virtual void didCompleteClientRedirect(WebFrame*, const WebURL& fromURL) { }
+
+    // A datasource has been created for a new navigation.  The given
+    // datasource will become the provisional datasource for the frame.
+    virtual void didCreateDataSource(WebFrame*, WebDataSource*) { }
+
+    // A new provisional load has been started.
+    virtual void didStartProvisionalLoad(WebFrame*) { }
+
+    // The provisional load was redirected via a HTTP 3xx response.
+    virtual void didReceiveServerRedirectForProvisionalLoad(WebFrame*) { }
+
+    // The provisional load failed.
+    virtual void didFailProvisionalLoad(WebFrame*, const WebURLError&) { }
+
+    // Notifies the client to commit data for the given frame.  The client
+    // may optionally prevent default processing by setting preventDefault
+    // to true before returning.  If default processing is prevented, then
+    // it is up to the client to manually call commitDocumentData on the
+    // WebFrame.  It is only valid to call commitDocumentData within a call
+    // to didReceiveDocumentData.  If commitDocumentData is not called,
+    // then an empty document will be loaded.
+    virtual void didReceiveDocumentData(
+        WebFrame*, const char* data, size_t length, bool& preventDefault) { }
+
+    // The provisional datasource is now committed.  The first part of the
+    // response body has been received, and the encoding of the response
+    // body is known.
+    virtual void didCommitProvisionalLoad(WebFrame*, bool isNewNavigation) { }
+
+    // The window object for the frame has been cleared of any extra
+    // properties that may have been set by script from the previously
+    // loaded document.
+    virtual void didClearWindowObject(WebFrame*) { }
+
+    // The document element has been created.
+    virtual void didCreateDocumentElement(WebFrame*) { }
+
+    // The page title is available.
+    virtual void didReceiveTitle(WebFrame* frame, const WebString& title, WebTextDirection direction) { }
+
+    // The icon for the page have changed.
+    virtual void didChangeIcon(WebFrame*, WebIconURL::Type) { }
+
+    // The frame's document finished loading.
+    virtual void didFinishDocumentLoad(WebFrame*) { }
+
+    // The 'load' event was dispatched.
+    virtual void didHandleOnloadEvents(WebFrame*) { }
+
+    // The frame's document or one of its subresources failed to load.
+    virtual void didFailLoad(WebFrame*, const WebURLError&) { }
+
+    // The frame's document and all of its subresources succeeded to load.
+    virtual void didFinishLoad(WebFrame*) { }
+
+    // The navigation resulted in no change to the documents within the page.
+    // For example, the navigation may have just resulted in scrolling to a
+    // named anchor or a PopState event may have been dispatched.
+    virtual void didNavigateWithinPage(WebFrame*, bool isNewNavigation) { }
+
+    // The navigation resulted in scrolling the page to a named anchor instead
+    // of downloading a new document.
+    virtual void didChangeLocationWithinPage(WebFrame*) { }
+
+    // Called upon update to scroll position, document state, and other
+    // non-navigational events related to the data held by WebHistoryItem.
+    // WARNING: This method may be called very frequently.
+    virtual void didUpdateCurrentHistoryItem(WebFrame*) { }
+
+
+    // Low-level resource notifications ------------------------------------
+
+    // An element will request a resource.
+    virtual void willRequestResource(WebFrame*, const WebCachedURLRequest&) { }
+
+    // A request is about to be sent out, and the client may modify it.  Request
+    // is writable, and changes to the URL, for example, will change the request
+    // made.  If this request is the result of a redirect, then redirectResponse
+    // will be non-null and contain the response that triggered the redirect.
+    virtual void willSendRequest(
+        WebFrame*, unsigned identifier, WebURLRequest&,
+        const WebURLResponse& redirectResponse) { }
+
+    // Response headers have been received for the resource request given
+    // by identifier.
+    virtual void didReceiveResponse(
+        WebFrame*, unsigned identifier, const WebURLResponse&) { }
+
+    virtual void didChangeResourcePriority(
+        WebFrame*, unsigned identifier, const WebKit::WebURLRequest::Priority&) { }
+
+    // The resource request given by identifier succeeded.
+    virtual void didFinishResourceLoad(
+        WebFrame*, unsigned identifier) { }
+
+    // The resource request given by identifier failed.
+    virtual void didFailResourceLoad(
+        WebFrame*, unsigned identifier, const WebURLError&) { }
+
+    // The specified request was satified from WebCore's memory cache.
+    virtual void didLoadResourceFromMemoryCache(
+        WebFrame*, const WebURLRequest&, const WebURLResponse&) { }
+
+    // This frame has displayed inactive content (such as an image) from an
+    // insecure source.  Inactive content cannot spread to other frames.
+    virtual void didDisplayInsecureContent(WebFrame*) { }
+
+    // The indicated security origin has run active content (such as a
+    // script) from an insecure source.  Note that the insecure content can
+    // spread to other frames in the same origin.
+    virtual void didRunInsecureContent(WebFrame*, const WebSecurityOrigin&, const WebURL& insecureURL) { }
+
+    // A reflected XSS was encountered in the page and suppressed.
+    virtual void didDetectXSS(WebFrame*, const WebURL&, bool didBlockEntirePage) { }
+
+    // Script notifications ------------------------------------------------
+
+    // Script in the page tried to allocate too much memory.
+    virtual void didExhaustMemoryAvailableForScript(WebFrame*) { }
+
+    // Notifies that a new script context has been created for this frame.
+    // This is similar to didClearWindowObject but only called once per
+    // frame context.
+    virtual void didCreateScriptContext(WebFrame*, v8::Handle<v8::Context>, int extensionGroup, int worldId) { }
+
+    // WebKit is about to release its reference to a v8 context for a frame.
+    virtual void willReleaseScriptContext(WebFrame*, v8::Handle<v8::Context>, int worldId) { }
+
+    // Geometry notifications ----------------------------------------------
+
+    // The frame's document finished the initial layout of a page.
+    virtual void didFirstLayout(WebFrame*) { }
+
+    // The frame's document finished the initial non-empty layout of a page.
+    virtual void didFirstVisuallyNonEmptyLayout(WebFrame*) { }
+
+    // The size of the content area changed.
+    virtual void didChangeContentsSize(WebFrame*, const WebSize&) { }
+
+    // The main frame scrolled.
+    virtual void didChangeScrollOffset(WebFrame*) { }
+
+    // If the frame is loading an HTML document, this will be called to
+    // notify that the <body> will be attached soon.
+    virtual void willInsertBody(WebFrame*) { }
+
+    // Find-in-page notifications ------------------------------------------
+
+    // Notifies how many matches have been found so far, for a given
+    // identifier.  |finalUpdate| specifies whether this is the last update
+    // (all frames have completed scoping).
+    virtual void reportFindInPageMatchCount(
+        int identifier, int count, bool finalUpdate) { }
+
+    // Notifies what tick-mark rect is currently selected.   The given
+    // identifier lets the client know which request this message belongs
+    // to, so that it can choose to ignore the message if it has moved on
+    // to other things.  The selection rect is expected to have coordinates
+    // relative to the top left corner of the web page area and represent
+    // where on the screen the selection rect is currently located.
+    virtual void reportFindInPageSelection(
+        int identifier, int activeMatchOrdinal, const WebRect& selection) { }
+
+    // FileSystem ----------------------------------------------------
+
+    // Requests to open a FileSystem.
+    // |size| indicates how much storage space (in bytes) the caller expects
+    // to need.
+    // WebFileSystemCallbacks::didOpenFileSystem() must be called with
+    // a name and root path for the requested FileSystem when the operation
+    // is completed successfully. WebFileSystemCallbacks::didFail() must be
+    // called otherwise. The create bool is for indicating whether or not to
+    // create root path for file systems if it do not exist.
+    virtual void openFileSystem(
+        WebFrame*, WebFileSystemType, long long size,
+        bool create, WebFileSystemCallbacks*) { }
+
+    // Deletes FileSystem.
+    // WebFileSystemCallbacks::didSucceed() must be called when the operation
+    // is completed successfully. WebFileSystemCallbacks::didFail() must be
+    // called otherwise.
+    // All in-flight operations and following operations may fail after the
+    // FileSystem is deleted.
+    virtual void deleteFileSystem(
+        WebFrame*, WebFileSystemType, WebFileSystemCallbacks*) { }
+
+    // Quota ---------------------------------------------------------
+
+    // Queries the origin's storage usage and quota information.
+    // WebStorageQuotaCallbacks::didQueryStorageUsageAndQuota will be called
+    // with the current usage and quota information for the origin. When
+    // an error occurs WebStorageQuotaCallbacks::didFail is called with an
+    // error code.
+    // The callbacks object is deleted when the callback method is called
+    // and does not need to be (and should not be) deleted manually.
+    virtual void queryStorageUsageAndQuota(
+        WebFrame*, WebStorageQuotaType, WebStorageQuotaCallbacks*) { }
+
+    // Requests a new quota size for the origin's storage.
+    // |newQuotaInBytes| indicates how much storage space (in bytes) the
+    // caller expects to need.
+    // WebStorageQuotaCallbacks::didGrantStorageQuota will be called when
+    // a new quota is granted. WebStorageQuotaCallbacks::didFail
+    // is called with an error code otherwise.
+    // Note that the requesting quota size may not always be granted and
+    // a smaller amount of quota than requested might be returned.
+    // The callbacks object is deleted when the callback method is called
+    // and does not need to be (and should not be) deleted manually.
+    virtual void requestStorageQuota(
+        WebFrame*, WebStorageQuotaType,
+        unsigned long long newQuotaInBytes,
+        WebStorageQuotaCallbacks*) { }
+
+    // WebSocket -----------------------------------------------------
+
+    // A WebSocket object is going to open new stream connection.
+    virtual void willOpenSocketStream(WebSocketStreamHandle*) { }
+
+    // MediaStream -----------------------------------------------------
+
+    // A new WebRTCPeerConnectionHandler is created.
+    virtual void willStartUsingPeerConnectionHandler(WebFrame*, WebRTCPeerConnectionHandler*) { }
+
+    // Messages ------------------------------------------------------
+
+    // Notifies the embedder that a postMessage was issued on this frame, and
+    // gives the embedder a chance to handle it instead of WebKit. Returns true
+    // if the embedder handled it.
+    virtual bool willCheckAndDispatchMessageEvent(
+        WebFrame* sourceFrame,
+        WebFrame* targetFrame,
+        WebSecurityOrigin target,
+        WebDOMMessageEvent event) { return false; }
+
+    // Asks the embedder if a specific user agent should be used for the given
+    // URL. Non-empty strings indicate an override should be used. Otherwise,
+    // Platform::current()->userAgent() will be called to provide one.
+    virtual WebString userAgentOverride(WebFrame*, const WebURL& url) { return WebString(); }
+
+    // Asks the embedder what value the network stack will send for the DNT
+    // header. An empty string indicates that no DNT header will be send.
+    virtual WebString doNotTrackValue(WebFrame*) { return WebString(); }
+
+    // WebGL ------------------------------------------------------
+
+    // Asks the embedder whether WebGL is allowed for the given WebFrame.
+    // This call is placed here instead of WebPermissionClient because this
+    // class is implemented in content/, and putting it here avoids adding
+    // more public content/ APIs.
+    virtual bool allowWebGL(WebFrame*, bool defaultValue) { return defaultValue; }
+
+    // Notifies the client that a WebGL context was lost on this page with the
+    // given reason (one of the GL_ARB_robustness status codes; see
+    // Extensions3D.h in WebCore/platform/graphics).
+    virtual void didLoseWebGLContext(WebFrame*, int) { }
+
+protected:
+    ~WebFrameClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebGeolocationClient.h b/public/webpage/WebGeolocationClient.h
new file mode 100644
index 0000000..1dfb0cd
--- /dev/null
+++ b/public/webpage/WebGeolocationClient.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebGeolocationClient_h
+#define WebGeolocationClient_h
+
+namespace WebKit {
+class WebGeolocationController;
+class WebGeolocationPermissionRequest;
+class WebGeolocationPosition;
+
+class WebGeolocationClient {
+public:
+    virtual ~WebGeolocationClient() {}
+
+    virtual void startUpdating() = 0;
+    virtual void stopUpdating() = 0;
+    virtual void setEnableHighAccuracy(bool) = 0;
+    virtual void geolocationDestroyed() = 0;
+    virtual bool lastPosition(WebGeolocationPosition&) = 0;
+
+    virtual void requestPermission(const WebGeolocationPermissionRequest&) = 0;
+    virtual void cancelPermissionRequest(const WebGeolocationPermissionRequest&) = 0;
+
+    // The controller is valid until geolocationDestroyed() is invoked.
+    // Ownership of the WebGeolocationController is transferred to the client.
+    virtual void setController(WebGeolocationController*) = 0;
+};
+
+} // namespace WebKit
+
+#endif // WebGeolocationClient_h
diff --git a/public/webpage/WebGeolocationClientMock.h b/public/webpage/WebGeolocationClientMock.h
new file mode 100644
index 0000000..06d8b1d
--- /dev/null
+++ b/public/webpage/WebGeolocationClientMock.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2010, Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebGeolocationClientMock_h
+#define WebGeolocationClientMock_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivateOwnPtr.h"
+#include "WebGeolocationClient.h"
+
+namespace WebCore {
+class GeolocationClientMock;
+}
+
+namespace WebKit {
+class WebGeolocationPosition;
+class WebString;
+
+class WebGeolocationClientMock : public WebGeolocationClient {
+public:
+    WEBKIT_EXPORT static WebGeolocationClientMock* create();
+    ~WebGeolocationClientMock() { reset(); }
+
+    WEBKIT_EXPORT void setPosition(double latitude, double longitude, double accuracy);
+    WEBKIT_EXPORT void setPositionUnavailableError(const WebString& message);
+    WEBKIT_EXPORT void setPermission(bool);
+    WEBKIT_EXPORT int numberOfPendingPermissionRequests() const;
+    WEBKIT_EXPORT void resetMock();
+
+    virtual void startUpdating();
+    virtual void stopUpdating();
+    virtual void setEnableHighAccuracy(bool);
+
+    virtual void geolocationDestroyed();
+    virtual void setController(WebGeolocationController*);
+
+    virtual void requestPermission(const WebGeolocationPermissionRequest&);
+    virtual void cancelPermissionRequest(const WebGeolocationPermissionRequest&);
+
+    virtual bool lastPosition(WebGeolocationPosition& webPosition);
+
+private:
+    WebGeolocationClientMock();
+    WEBKIT_EXPORT void reset();
+
+    WebPrivateOwnPtr<WebCore::GeolocationClientMock> m_clientMock;
+};
+}
+
+#endif // WebGeolocationClientMock_h
diff --git a/public/webpage/WebGeolocationController.h b/public/webpage/WebGeolocationController.h
new file mode 100644
index 0000000..ea56c35
--- /dev/null
+++ b/public/webpage/WebGeolocationController.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebGeolocationController_h
+#define WebGeolocationController_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebNonCopyable.h"
+
+namespace WebCore { class GeolocationController; }
+
+namespace WebKit {
+
+class WebGeolocationPosition;
+class WebGeolocationError;
+
+// Note that the WebGeolocationController is invalid after the
+// WebGeolocationClient::geolocationDestroyed() has been received.
+class WebGeolocationController : public WebNonCopyable {
+public:
+    WEBKIT_EXPORT void positionChanged(const WebGeolocationPosition&);
+    WEBKIT_EXPORT void errorOccurred(const WebGeolocationError&);
+
+#if WEBKIT_IMPLEMENTATION
+    WebGeolocationController(WebCore::GeolocationController* c)
+        : m_private(c)
+    {
+    }
+
+    WebCore::GeolocationController* controller() const { return m_private; }
+#endif
+
+private:
+    // No implementation for the default constructor. Declared private to ensure that no instances
+    // can be created by the consumers of Chromium WebKit.
+    WebGeolocationController();
+
+    WebCore::GeolocationController* m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebGeolocationController_h
diff --git a/public/webpage/WebGeolocationError.h b/public/webpage/WebGeolocationError.h
new file mode 100644
index 0000000..046b5e6
--- /dev/null
+++ b/public/webpage/WebGeolocationError.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebGeolocationError_h
+#define WebGeolocationError_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+#if WEBKIT_IMPLEMENTATION
+#include <wtf/PassRefPtr.h>
+#endif
+
+namespace WebCore { class GeolocationError; }
+
+namespace WebKit {
+
+class WebString;
+
+class WebGeolocationError {
+public:
+    enum Error {
+        ErrorPermissionDenied,
+        ErrorPositionUnavailable
+    };
+
+    WebGeolocationError(Error code, const WebString& message) { assign(code, message); }
+    WebGeolocationError(const WebGeolocationError& other) { assign(other); }
+    ~WebGeolocationError() { reset(); }
+
+    WEBKIT_EXPORT void assign(Error code, const WebString& message);
+    WEBKIT_EXPORT void assign(const WebGeolocationError&);
+    WEBKIT_EXPORT void reset();
+
+#if WEBKIT_IMPLEMENTATION
+    WebGeolocationError(WTF::PassRefPtr<WebCore::GeolocationError>);
+    WebGeolocationError& operator=(WTF::PassRefPtr<WebCore::GeolocationError>);
+    operator WTF::PassRefPtr<WebCore::GeolocationError>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::GeolocationError> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebGeolocationError_h
diff --git a/public/webpage/WebGeolocationPermissionRequest.h b/public/webpage/WebGeolocationPermissionRequest.h
new file mode 100644
index 0000000..e689a86
--- /dev/null
+++ b/public/webpage/WebGeolocationPermissionRequest.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebGeolocationPermissionRequest_h
+#define WebGeolocationPermissionRequest_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace WebCore {
+class Geolocation;
+}
+
+namespace WebKit {
+class WebSecurityOrigin;
+
+// WebGeolocationPermissionRequest encapsulates a WebCore Geolocation object and represents
+// a request from WebCore for permission to be determined for that Geolocation object.
+// The underlying Geolocation object is guaranteed to be valid until the invocation of
+// either  WebGeolocationPermissionRequest::setIsAllowed (request complete) or
+// WebGeolocationClient::cancelPermissionRequest (request cancelled).
+class WebGeolocationPermissionRequest {
+public:
+    WEBKIT_EXPORT WebSecurityOrigin securityOrigin() const;
+    WEBKIT_EXPORT void setIsAllowed(bool);
+
+#if WEBKIT_IMPLEMENTATION
+    WebGeolocationPermissionRequest(WebCore::Geolocation* geolocation)
+        : m_private(geolocation)
+    {
+    }
+
+    WebCore::Geolocation* geolocation() const { return m_private; }
+#endif
+
+private:
+    WebCore::Geolocation* m_private;
+};
+}
+
+#endif // WebGeolocationPermissionRequest_h
diff --git a/public/webpage/WebGeolocationPermissionRequestManager.h b/public/webpage/WebGeolocationPermissionRequestManager.h
new file mode 100644
index 0000000..4291e24
--- /dev/null
+++ b/public/webpage/WebGeolocationPermissionRequestManager.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebGeolocationPermissionRequestManager_h
+#define WebGeolocationPermissionRequestManager_h
+
+#include "../platform/WebNonCopyable.h"
+#include "../platform/WebPrivateOwnPtr.h"
+
+namespace WebKit {
+
+class WebGeolocationPermissionRequest;
+class WebGeolocationPermissionRequestManagerPrivate;
+
+// This class is used to map between integer identifiers and WebGeolocationPermissionRequest
+// instances. The intended usage is that on WebGeolocationClient::requestPermission(),
+// the implementer can call add() to associate an id with the WebGeolocationPermissionRequest object.
+// Once the permission request has been decided, the second remove() method can be used to
+// find the request. On WebGeolocationClient::cancelPermissionRequest, the first remove() method will
+// remove the association with the id.
+class WebGeolocationPermissionRequestManager : public WebNonCopyable {
+public:
+    WebGeolocationPermissionRequestManager() { init(); }
+    ~WebGeolocationPermissionRequestManager() { reset(); }
+
+    WEBKIT_EXPORT int add(const WebKit::WebGeolocationPermissionRequest&);
+    WEBKIT_EXPORT bool remove(const WebKit::WebGeolocationPermissionRequest&, int&);
+    WEBKIT_EXPORT bool remove(int, WebKit::WebGeolocationPermissionRequest&);
+
+private:
+    WEBKIT_EXPORT void init();
+    WEBKIT_EXPORT void reset();
+
+    WebPrivateOwnPtr<WebGeolocationPermissionRequestManagerPrivate> m_private;
+    int m_lastId;
+};
+
+}
+
+#endif // WebGeolocationPermissionRequestManager_h
+
diff --git a/public/webpage/WebGeolocationPosition.h b/public/webpage/WebGeolocationPosition.h
new file mode 100644
index 0000000..64e8f97
--- /dev/null
+++ b/public/webpage/WebGeolocationPosition.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebGeolocationPosition_h
+#define WebGeolocationPosition_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+#if WEBKIT_IMPLEMENTATION
+#include <wtf/PassRefPtr.h>
+#endif
+
+namespace WebCore { class GeolocationPosition; }
+
+namespace WebKit {
+
+class WebGeolocationPosition {
+public:
+    WebGeolocationPosition() {}
+    WebGeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+    {
+        assign(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed);
+    }
+    WebGeolocationPosition(const WebGeolocationPosition& other) { assign(other); }
+    ~WebGeolocationPosition() { reset(); }
+
+    WEBKIT_EXPORT void assign(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed);
+    WEBKIT_EXPORT void assign(const WebGeolocationPosition&);
+    WEBKIT_EXPORT void reset();
+
+#if WEBKIT_IMPLEMENTATION
+    WebGeolocationPosition(WTF::PassRefPtr<WebCore::GeolocationPosition>);
+    WebGeolocationPosition& operator=(WTF::PassRefPtr<WebCore::GeolocationPosition>);
+    operator WTF::PassRefPtr<WebCore::GeolocationPosition>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::GeolocationPosition> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebGeolocationPosition_h
diff --git a/public/webpage/WebGlyphCache.h b/public/webpage/WebGlyphCache.h
new file mode 100644
index 0000000..a417077
--- /dev/null
+++ b/public/webpage/WebGlyphCache.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebGlyphCache_h
+#define WebGlyphCache_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// An interface to query WebKit's glyph cache (which maps unicode characters to
+// glyphs in particular fonts).
+class WebGlyphCache {
+public:
+    // Returns the number of pages in the glyph cache.
+    WEBKIT_EXPORT static size_t pageCount();
+
+private:
+    WebGlyphCache();  // Not intended to be instanced.
+};
+
+}  // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebHelperPlugin.h b/public/webpage/WebHelperPlugin.h
new file mode 100644
index 0000000..b10ffa5
--- /dev/null
+++ b/public/webpage/WebHelperPlugin.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebHelperPlugin_h
+#define WebHelperPlugin_h
+
+#include "../platform/WebCommon.h"
+#include "WebWidget.h"
+
+namespace WebKit {
+
+class WebFrameClient;
+class WebPlugin;
+class WebWidgetClient;
+
+class WebHelperPlugin : public WebWidget {
+public:
+    WEBKIT_EXPORT static WebHelperPlugin* create(WebWidgetClient*);
+
+    virtual void initializeFrame(WebFrameClient*) = 0;
+
+    // The returned pointer may be 0 even if initialization was successful.
+    // For example, if the plugin cannot be found or the plugin is disabled.
+    // If not 0, the returned pointer is valid for the lifetime of this object.
+    virtual WebPlugin* getPlugin() = 0;
+
+protected:
+    ~WebHelperPlugin() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebHistoryItem.h b/public/webpage/WebHistoryItem.h
new file mode 100644
index 0000000..e3d198a
--- /dev/null
+++ b/public/webpage/WebHistoryItem.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebHistoryItem_h
+#define WebHistoryItem_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace WebCore { class HistoryItem; }
+
+namespace WebKit {
+class WebHTTPBody;
+class WebString;
+class WebSerializedScriptValue;
+struct WebPoint;
+template <typename T> class WebVector;
+
+// Represents a frame-level navigation entry in session history.  A
+// WebHistoryItem is a node in a tree.
+//
+// Copying a WebHistoryItem is cheap.
+//
+class WebHistoryItem {
+public:
+    ~WebHistoryItem() { reset(); }
+
+    WebHistoryItem() { }
+    WebHistoryItem(const WebHistoryItem& h) { assign(h); }
+    WebHistoryItem& operator=(const WebHistoryItem& h)
+    {
+        assign(h);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void initialize();
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebHistoryItem&);
+
+    bool isNull() const { return m_private.isNull(); }
+
+    WEBKIT_EXPORT WebString urlString() const;
+    WEBKIT_EXPORT void setURLString(const WebString&);
+
+    WEBKIT_EXPORT WebString originalURLString() const;
+    WEBKIT_EXPORT void setOriginalURLString(const WebString&);
+
+    WEBKIT_EXPORT WebString referrer() const;
+    WEBKIT_EXPORT void setReferrer(const WebString&);
+
+    WEBKIT_EXPORT WebString target() const;
+    WEBKIT_EXPORT void setTarget(const WebString&);
+
+    WEBKIT_EXPORT WebString parent() const;
+    WEBKIT_EXPORT void setParent(const WebString&);
+
+    WEBKIT_EXPORT WebString title() const;
+    WEBKIT_EXPORT void setTitle(const WebString&);
+
+    WEBKIT_EXPORT WebString alternateTitle() const;
+    WEBKIT_EXPORT void setAlternateTitle(const WebString&);
+
+    WEBKIT_EXPORT double lastVisitedTime() const;
+    WEBKIT_EXPORT void setLastVisitedTime(double);
+
+    WEBKIT_EXPORT WebPoint scrollOffset() const;
+    WEBKIT_EXPORT void setScrollOffset(const WebPoint&);
+
+    WEBKIT_EXPORT float pageScaleFactor() const;
+    WEBKIT_EXPORT void setPageScaleFactor(float);
+
+    WEBKIT_EXPORT bool isTargetItem() const;
+    WEBKIT_EXPORT void setIsTargetItem(bool);
+
+    WEBKIT_EXPORT int visitCount() const;
+    WEBKIT_EXPORT void setVisitCount(int);
+
+    WEBKIT_EXPORT WebVector<WebString> documentState() const;
+    WEBKIT_EXPORT void setDocumentState(const WebVector<WebString>&);
+
+    WEBKIT_EXPORT long long itemSequenceNumber() const;
+    WEBKIT_EXPORT void setItemSequenceNumber(long long);
+
+    WEBKIT_EXPORT long long documentSequenceNumber() const;
+    WEBKIT_EXPORT void setDocumentSequenceNumber(long long);
+
+    WEBKIT_EXPORT WebSerializedScriptValue stateObject() const;
+    WEBKIT_EXPORT void setStateObject(const WebSerializedScriptValue&);
+
+    WEBKIT_EXPORT WebString httpContentType() const;
+    WEBKIT_EXPORT void setHTTPContentType(const WebString&);
+
+    WEBKIT_EXPORT WebHTTPBody httpBody() const;
+    WEBKIT_EXPORT void setHTTPBody(const WebHTTPBody&);
+
+    WEBKIT_EXPORT WebVector<WebHistoryItem> children() const;
+    WEBKIT_EXPORT void setChildren(const WebVector<WebHistoryItem>&);
+    WEBKIT_EXPORT void appendToChildren(const WebHistoryItem&);
+
+    WEBKIT_EXPORT WebVector<WebString> getReferencedFilePaths() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebHistoryItem(const WTF::PassRefPtr<WebCore::HistoryItem>&);
+    WebHistoryItem& operator=(const WTF::PassRefPtr<WebCore::HistoryItem>&);
+    operator WTF::PassRefPtr<WebCore::HistoryItem>() const;
+#endif
+
+private:
+    void ensureMutable();
+    WebPrivatePtr<WebCore::HistoryItem> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebHitTestResult.h b/public/webpage/WebHitTestResult.h
new file mode 100644
index 0000000..b129aad
--- /dev/null
+++ b/public/webpage/WebHitTestResult.h
@@ -0,0 +1,86 @@
+/*
+* Copyright (C) 2012 Google 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 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 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 WebHitTestResult_h
+#define WebHitTestResult_h
+
+#include "../platform/WebPrivateOwnPtr.h"
+
+namespace WebCore {
+class HitTestResult;
+}
+
+namespace WebKit {
+
+class WebElement;
+class WebNode;
+class WebURL;
+struct WebPoint;
+
+// Properties of a hit test result, i.e. properties of the nodes at a given point
+// (the hit point) on the page. Both urls may be populated at the same time, for
+// example in the instance of an <img> inside an <a>.
+class WebHitTestResult {
+public:
+    WebHitTestResult() { }
+    WebHitTestResult(const WebHitTestResult& info) { assign(info); }
+    ~WebHitTestResult() { reset(); }
+
+    WEBKIT_EXPORT void assign(const WebHitTestResult&);
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT bool isNull() const;
+
+    // The node that was hit (only one for point-based tests).
+    WEBKIT_EXPORT WebNode node() const;
+
+    // Coordinates of the point that was hit. Relative to the node.
+    WEBKIT_EXPORT WebPoint localPoint() const;
+
+    // If a link (eg. anchor or area tag) is hit, return the element.
+    // Return null otheriwse.
+    WEBKIT_EXPORT WebElement urlElement() const;
+
+    // If an image is hit, return the image source. Return empty otherwise.
+    WEBKIT_EXPORT WebURL absoluteImageURL() const;
+
+    // If an link is hit, return the link url source. Return empty otherwise.
+    WEBKIT_EXPORT WebURL absoluteLinkURL() const;
+
+    // Return whether an editable input element was hit.
+    WEBKIT_EXPORT bool isContentEditable() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebHitTestResult(const WebCore::HitTestResult&);
+    WebHitTestResult& operator=(const WebCore::HitTestResult&);
+    operator WebCore::HitTestResult() const;
+#endif
+
+protected:
+    WebPrivateOwnPtr<WebCore::HitTestResult> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebIconLoadingCompletion.h b/public/webpage/WebIconLoadingCompletion.h
new file mode 100644
index 0000000..b6229aa
--- /dev/null
+++ b/public/webpage/WebIconLoadingCompletion.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebIconLoadingCompletion_h
+#define WebIconLoadingCompletion_h
+
+namespace WebKit {
+
+class WebData;
+class WebString;
+
+// Gets called back when WebViewClient finished loading an icon.
+class WebIconLoadingCompletion {
+public:
+    // Called with the loaded icon data, which is an image data stream
+    // WebCore can decode, such as PNG. A null WebData means a failure of
+    // loading. The callback instance is destroyed when this method is called.
+    virtual void didLoadIcon(const WebData&) = 0;
+
+protected:
+    virtual ~WebIconLoadingCompletion() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebIconURL.h b/public/webpage/WebIconURL.h
new file mode 100644
index 0000000..e718372
--- /dev/null
+++ b/public/webpage/WebIconURL.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebIconURL_h
+#define WebIconURL_h
+
+#if WEBKIT_IMPLEMENTATION
+#include "core/dom/IconURL.h"
+#endif
+#include "../platform/WebURL.h"
+
+namespace WebKit {
+
+class WebIconURL {
+public:
+    enum Type {
+        TypeInvalid = 0,
+        TypeFavicon = 1 << 0,
+        TypeTouch = 1 << 1,
+        TypeTouchPrecomposed = 1 << 2
+    };
+
+    WebIconURL()
+        : m_iconType(TypeInvalid)
+    {
+    }
+
+    WebIconURL(const WebURL& url, Type type)
+        : m_iconType(type)
+        , m_iconURL(url)
+    {
+    }
+
+    Type iconType() const
+    {
+        return m_iconType;
+    }
+
+    const WebURL& iconURL() const
+    {
+        return m_iconURL;
+    }
+
+#if WEBKIT_IMPLEMENTATION
+    WebIconURL(const WebCore::IconURL& iconURL)
+        : m_iconType(static_cast<Type>(iconURL.m_iconType))
+        , m_iconURL(iconURL.m_iconURL)
+    {
+    }
+#endif
+
+private:
+    Type m_iconType;
+    WebURL m_iconURL;
+};
+
+}
+
+#endif // WebIconURL_h
diff --git a/public/webpage/WebImageCache.h b/public/webpage/WebImageCache.h
new file mode 100644
index 0000000..b766488
--- /dev/null
+++ b/public/webpage/WebImageCache.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebImageCache_h
+#define WebImageCache_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// An interface to query and configure WebKit's image cache.
+//
+// Methods of this interface can be called on any thread.
+//
+// Methods of this interface can be only be used after WebKit::initialize()
+// and before WebKit::shutdown() is called.
+
+class WebImageCache {
+public:
+    // Sets the capacities of the image cache, evicting objects as necessary.
+    WEBKIT_EXPORT static void setCacheLimitInBytes(size_t);
+
+    // Clears the cache (as much as possible; some resources may not be
+    // cleared if they are actively referenced).
+    WEBKIT_EXPORT static void clear();
+
+    // Returns the number of bytes used by the cache.
+    WEBKIT_EXPORT static size_t memoryUsageInBytes();
+
+    // Returns the number of cached entries.
+    WEBKIT_EXPORT static unsigned cacheEntries();
+
+private:
+    WebImageCache();  // Not intended to be instanced.
+};
+
+}  // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebImageDecoder.h b/public/webpage/WebImageDecoder.h
new file mode 100644
index 0000000..da8f46b
--- /dev/null
+++ b/public/webpage/WebImageDecoder.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebImageDecoder_h
+#define WebImageDecoder_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebImage.h"
+#include "../platform/WebNonCopyable.h"
+
+namespace WebCore { class ImageDecoder; }
+
+namespace WebKit {
+
+typedef WebCore::ImageDecoder WebImageDecoderPrivate;
+class WebData;
+
+class WebImageDecoder : public WebNonCopyable {
+public:
+    enum Type {
+        TypeBMP,
+        TypeICO
+    };
+
+    ~WebImageDecoder() { reset(); }
+
+    explicit WebImageDecoder(Type type) { init(type); }
+
+    // Sets data contents for underlying decoder. All the API methods
+    // require that setData() is called prior to their use.
+    WEBKIT_EXPORT void setData(const WebData& data, bool allDataReceived);
+
+    // Deletes owned decoder.
+    WEBKIT_EXPORT void reset();
+
+    // Returns true if image decoding failed.
+    WEBKIT_EXPORT bool isFailed() const;
+    
+    // Returns true if size information is available for the decoder.
+    WEBKIT_EXPORT bool isSizeAvailable() const;
+
+    // Returns the size of the image.
+    WEBKIT_EXPORT WebSize size() const;
+
+    // Gives frame count for the image. For multiple frames, decoder scans the image data for the count.
+    WEBKIT_EXPORT size_t frameCount() const;
+
+    // Returns if the frame at given index is completely decoded.
+    WEBKIT_EXPORT bool isFrameCompleteAtIndex(int index) const;
+
+    // Creates and returns WebImage from buffer at the index.
+    WEBKIT_EXPORT WebImage getFrameAtIndex(int index) const;
+
+private:
+    // Creates type-specific decoder.
+    WEBKIT_EXPORT void init(Type type);
+
+    WebImageDecoderPrivate* m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebInbandTextTrack.h b/public/webpage/WebInbandTextTrack.h
new file mode 100644
index 0000000..cebdf20
--- /dev/null
+++ b/public/webpage/WebInbandTextTrack.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInbandTextTrack_h
+#define WebInbandTextTrack_h
+
+namespace WebKit {
+
+class WebString;
+class WebInbandTextTrackClient;
+
+class WebInbandTextTrack {
+public:
+    enum Kind {
+        KindSubtitles,
+        KindCaptions,
+        KindDescriptions,
+        KindChapters,
+        KindMetadata,
+        KindNone
+    };
+
+    enum Mode {
+        ModeDisabled,
+        ModeHidden,
+        ModeShowing
+    };
+
+    virtual ~WebInbandTextTrack() {}
+
+    virtual void setClient(WebInbandTextTrackClient*) = 0;
+    virtual WebInbandTextTrackClient* client() = 0;
+
+    virtual void setMode(Mode) = 0;
+    virtual Mode mode() const = 0;
+
+    virtual Kind kind() const = 0;
+    virtual bool isClosedCaptions() const = 0;
+
+    virtual WebString label() const = 0;
+    virtual WebString language() const = 0;
+    virtual bool isDefault() const = 0;
+
+    virtual int textTrackIndex() const = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebInbandTextTrackClient.h b/public/webpage/WebInbandTextTrackClient.h
new file mode 100644
index 0000000..dea4043
--- /dev/null
+++ b/public/webpage/WebInbandTextTrackClient.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInbandTextTrackClient_h
+#define WebInbandTextTrackClient_h
+
+namespace WebKit {
+
+class WebString;
+
+class WebInbandTextTrackClient {
+public:
+    virtual ~WebInbandTextTrackClient() {}
+
+    virtual void addWebVTTCue(double start,
+                              double end,
+                              const WebString& id,
+                              const WebString& content,
+                              const WebString& settings) = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebInputElement.h b/public/webpage/WebInputElement.h
new file mode 100644
index 0000000..e509b84
--- /dev/null
+++ b/public/webpage/WebInputElement.h
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInputElement_h
+#define WebInputElement_h
+
+#include "WebFormControlElement.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLInputElement; }
+#endif
+
+namespace WebKit {
+
+    class WebNodeCollection;
+    class WebTextFieldDecoratorClient;
+
+    // Provides readonly access to some properties of a DOM input element node.
+    class WebInputElement : public WebFormControlElement {
+    public:
+        enum SpeechInputState {
+            Idle,
+            Recording,
+            Recognizing,
+        };
+
+        WebInputElement() : WebFormControlElement() { }
+        WebInputElement(const WebInputElement& element) : WebFormControlElement(element) { }
+
+        WebInputElement& operator=(const WebInputElement& element)
+        {
+            WebFormControlElement::assign(element);
+            return *this;
+        }
+        void assign(const WebInputElement& element) { WebFormControlElement::assign(element); }
+
+        // This returns true for all of textfield-looking types such as text,
+        // password, search, email, url, and number.
+        WEBKIT_EXPORT bool isTextField() const;
+        // This returns true only for type=text.
+        WEBKIT_EXPORT bool isText() const;
+        WEBKIT_EXPORT bool isPasswordField() const;
+        WEBKIT_EXPORT bool isImageButton() const;
+        WEBKIT_EXPORT bool isRadioButton() const;
+        WEBKIT_EXPORT bool isCheckbox() const;
+        WEBKIT_EXPORT bool autoComplete() const;
+        WEBKIT_EXPORT int maxLength() const;
+        WEBKIT_EXPORT bool isActivatedSubmit() const;
+        WEBKIT_EXPORT void setActivatedSubmit(bool);
+        WEBKIT_EXPORT int size() const;
+        WEBKIT_EXPORT void setValue(const WebString&, bool sendChangeEvent = false);
+        WEBKIT_EXPORT void setChecked(bool, bool sendChangeEvent = false);
+        WEBKIT_EXPORT WebString value() const;
+        // This returns the non-sanitized, exact value inside the text field.
+        WEBKIT_EXPORT WebString editingValue() const;
+        // Sets the value inside the text field without being sanitized.
+        // Can't be used if a renderer doesn't exist or on a non text field type.
+        // Caret will be moved to the end.
+        WEBKIT_EXPORT void setEditingValue(const WebString&);
+        WEBKIT_EXPORT void setSuggestedValue(const WebString&);
+        WEBKIT_EXPORT WebString suggestedValue() const;
+        WEBKIT_EXPORT void setPlaceholder(const WebString&);
+        WEBKIT_EXPORT WebString placeholder() const;
+        WEBKIT_EXPORT bool isAutofilled() const;
+        WEBKIT_EXPORT void setAutofilled(bool);
+        WEBKIT_EXPORT void setSelectionRange(int, int);
+        WEBKIT_EXPORT int selectionStart() const;
+        WEBKIT_EXPORT int selectionEnd() const;
+        WEBKIT_EXPORT bool isValidValue(const WebString&) const;
+        WEBKIT_EXPORT bool isChecked() const;
+        WEBKIT_EXPORT bool isMultiple() const;
+
+        WEBKIT_EXPORT WebNodeCollection dataListOptions() const;
+
+        // Return the localized value for this input type.
+        WEBKIT_EXPORT WebString localizeValue(const WebString&) const;
+
+        WEBKIT_EXPORT bool isSpeechInputEnabled() const;
+        WEBKIT_EXPORT SpeechInputState getSpeechInputState() const;
+        WEBKIT_EXPORT void startSpeechInput();
+        WEBKIT_EXPORT void stopSpeechInput();
+
+        // Exposes the default value of the maxLength attribute.
+        WEBKIT_EXPORT static int defaultMaxLength();
+
+        // Returns the direction of the text in this element.
+        WEBKIT_EXPORT WebString directionForFormData() const;
+
+        // Return the decoration added by the specified decorator if one exists.
+        WEBKIT_EXPORT WebElement decorationElementFor(WebTextFieldDecoratorClient*);
+
+#if WEBKIT_IMPLEMENTATION
+        WebInputElement(const WTF::PassRefPtr<WebCore::HTMLInputElement>&);
+        WebInputElement& operator=(const WTF::PassRefPtr<WebCore::HTMLInputElement>&);
+        operator WTF::PassRefPtr<WebCore::HTMLInputElement>() const;
+#endif
+    };
+
+    WEBKIT_EXPORT WebInputElement* toWebInputElement(WebElement*);
+
+    inline const WebInputElement* toWebInputElement(const WebElement* element)
+    {
+        return toWebInputElement(const_cast<WebElement*>(element));
+    }
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebInputEvent.h b/public/webpage/WebInputEvent.h
new file mode 100644
index 0000000..a0e4582
--- /dev/null
+++ b/public/webpage/WebInputEvent.h
@@ -0,0 +1,494 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInputEvent_h
+#define WebInputEvent_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebRect.h"
+#include "WebTouchPoint.h"
+
+#include <string.h>
+
+namespace WebKit {
+
+// The classes defined in this file are intended to be used with
+// WebWidget's handleInputEvent method.  These event types are cross-
+// platform and correspond closely to WebCore's Platform*Event classes.
+//
+// WARNING! These classes must remain PODs (plain old data).  They are
+// intended to be "serializable" by copying their raw bytes, so they must
+// not contain any non-bit-copyable member variables!
+//
+// Furthermore, the class members need to be packed so they are aligned
+// properly and don't have paddings/gaps, otherwise memory check tools
+// like Valgrind will complain about uninitialized memory usage when
+// transferring these classes over the wire.
+
+#pragma pack(push, 4)
+
+// WebInputEvent --------------------------------------------------------------
+
+class WebInputEvent {
+public:
+    WebInputEvent(unsigned sizeParam = sizeof(WebInputEvent))
+    {
+        memset(this, 0, sizeParam);
+        timeStampSeconds = 0.0;
+        size = sizeParam;
+        type = Undefined;
+        modifiers = 0;
+    }
+
+    // When we use an input method (or an input method editor), we receive
+    // two events for a keypress. The former event is a keydown, which
+    // provides a keycode, and the latter is a textinput, which provides
+    // a character processed by an input method. (The mapping from a
+    // keycode to a character code is not trivial for non-English
+    // keyboards.)
+    // To support input methods, Safari sends keydown events to WebKit for
+    // filtering. WebKit sends filtered keydown events back to Safari,
+    // which sends them to input methods.
+    // Unfortunately, it is hard to apply this design to Chrome because of
+    // our multiprocess architecture. An input method is running in a
+    // browser process. On the other hand, WebKit is running in a renderer
+    // process. So, this design results in increasing IPC messages.
+    // To support input methods without increasing IPC messages, Chrome
+    // handles keyboard events in a browser process and send asynchronous
+    // input events (to be translated to DOM events) to a renderer
+    // process.
+    // This design is mostly the same as the one of Windows and Mac Carbon.
+    // So, for what it's worth, our Linux and Mac front-ends emulate our
+    // Windows front-end. To emulate our Windows front-end, we can share
+    // our back-end code among Windows, Linux, and Mac.
+    // TODO(hbono): Issue 18064: remove the KeyDown type since it isn't
+    // used in Chrome any longer.
+
+    enum Type {
+        Undefined = -1,
+
+        // WebMouseEvent
+        MouseDown,
+        MouseUp,
+        MouseMove,
+        MouseEnter,
+        MouseLeave,
+        ContextMenu,
+
+        // WebMouseWheelEvent
+        MouseWheel,
+
+        // WebKeyboardEvent
+        RawKeyDown,
+        KeyDown,
+        KeyUp,
+        Char,
+
+        // WebGestureEvent
+        GestureScrollBegin,
+        GestureScrollEnd,
+        GestureScrollUpdate,
+        GestureScrollUpdateWithoutPropagation,
+        GestureFlingStart,
+        GestureFlingCancel,
+        GestureTap,
+        GestureTapUnconfirmed,
+        GestureTapDown,
+        GestureTapCancel,
+        GestureDoubleTap,
+        GestureTwoFingerTap,
+        GestureLongPress,
+        GestureLongTap,
+        GesturePinchBegin,
+        GesturePinchEnd,
+        GesturePinchUpdate,
+
+        // WebTouchEvent
+        TouchStart,
+        TouchMove,
+        TouchEnd,
+        TouchCancel,
+    };
+
+    enum Modifiers {
+        // modifiers for all events:
+        ShiftKey         = 1 << 0,
+        ControlKey       = 1 << 1,
+        AltKey           = 1 << 2,
+        MetaKey          = 1 << 3,
+
+        // modifiers for keyboard events:
+        IsKeyPad         = 1 << 4,
+        IsAutoRepeat     = 1 << 5,
+
+        // modifiers for mouse events:
+        LeftButtonDown   = 1 << 6,
+        MiddleButtonDown = 1 << 7,
+        RightButtonDown  = 1 << 8,
+
+        // Toggle modifiers for all events. Danger: these are not reflected
+        // into WebCore, so round-tripping from WebInputEvent to a WebCore
+        // event and back will not preserve these flags.
+        CapsLockOn       = 1 << 9,
+        NumLockOn        = 1 << 10,
+
+        // Left/right modifiers for keyboard events.
+        IsLeft           = 1 << 11,
+        IsRight          = 1 << 12,
+
+        // Last input event to be sent for the current vsync interval. If this
+        // flag is set, the sender guarantees that no more input events will be
+        // delivered until the next vsync and the receiver can schedule
+        // rendering accordingly. If it isn't set, the receiver should not make
+        // any assumptions about the delivery times of future input events
+        // w.r.t. vsync.
+        IsLastInputEventForCurrentVSync = 1 << 13,
+    };
+
+    static const int InputModifiers = ShiftKey | ControlKey | AltKey | MetaKey;
+
+    double timeStampSeconds; // Seconds since epoch.
+    unsigned size; // The size of this structure, for serialization.
+    Type type;
+    int modifiers;
+
+    // Returns true if the WebInputEvent |type| is a mouse event.
+    static bool isMouseEventType(int type)
+    {
+        return type == MouseDown
+            || type == MouseUp
+            || type == MouseMove
+            || type == MouseEnter
+            || type == MouseLeave
+            || type == ContextMenu;
+    }
+
+    // Returns true if the WebInputEvent |type| is a keyboard event.
+    static bool isKeyboardEventType(int type)
+    {
+        return type == RawKeyDown
+            || type == KeyDown
+            || type == KeyUp
+            || type == Char;
+    }
+
+    // Returns true if the WebInputEvent |type| is a touch event.
+    static bool isTouchEventType(int type)
+    {
+        return type == TouchStart
+            || type == TouchMove
+            || type == TouchEnd
+            || type == TouchCancel;
+    }
+
+    // Returns true if the WebInputEvent |type| should be handled as user gesture.
+    static bool isUserGestureEventType(int type)
+    {
+        return isKeyboardEventType(type)
+            || type == MouseDown
+            || type == MouseUp
+            || type == TouchStart
+            || type == TouchEnd;
+    }
+
+    // Returns true if the WebInputEvent is a gesture event.
+    static bool isGestureEventType(int type)
+    {
+        return type == GestureScrollBegin
+            || type == GestureScrollEnd
+            || type == GestureScrollUpdate
+            || type == GestureScrollUpdateWithoutPropagation
+            || type == GestureFlingStart
+            || type == GestureFlingCancel
+            || type == GesturePinchBegin
+            || type == GesturePinchEnd
+            || type == GesturePinchUpdate
+            || type == GestureTap
+            || type == GestureTapUnconfirmed
+            || type == GestureTapDown
+            || type == GestureTapCancel
+            || type == GestureDoubleTap
+            || type == GestureTwoFingerTap
+            || type == GestureLongPress
+            || type == GestureLongTap;
+    }
+};
+
+// WebKeyboardEvent -----------------------------------------------------------
+
+class WebKeyboardEvent : public WebInputEvent {
+public:
+    // Caps on string lengths so we can make them static arrays and keep
+    // them PODs.
+    static const size_t textLengthCap = 4;
+
+    // http://www.w3.org/TR/DOM-Level-3-Events/keyset.html lists the
+    // identifiers.  The longest is 18 characters, so we round up to the
+    // next multiple of 4.
+    static const size_t keyIdentifierLengthCap = 20;
+
+    // |windowsKeyCode| is the Windows key code associated with this key
+    // event.  Sometimes it's direct from the event (i.e. on Windows),
+    // sometimes it's via a mapping function.  If you want a list, see
+    // WebCore/platform/chromium/KeyboardCodes* . Note that this should
+    // ALWAYS store the non-locational version of a keycode as this is
+    // what is returned by the Windows API. For example, it should
+    // store VK_SHIFT instead of VK_RSHIFT. The location information
+    // should be stored in |modifiers|.
+    int windowsKeyCode;
+
+    // The actual key code genenerated by the platform.  The DOM spec runs
+    // on Windows-equivalent codes (thus |windowsKeyCode| above) but it
+    // doesn't hurt to have this one around.
+    int nativeKeyCode;
+
+    // This identifies whether this event was tagged by the system as being
+    // a "system key" event (see
+    // http://msdn.microsoft.com/en-us/library/ms646286(VS.85).aspx for
+    // details). Other platforms don't have this concept, but it's just
+    // easier to leave it always false than ifdef.
+    // See comment at the top of the file for why an int is used here.
+    bool isSystemKey;
+
+    // |text| is the text generated by this keystroke.  |unmodifiedText| is
+    // |text|, but unmodified by an concurrently-held modifiers (except
+    // shift).  This is useful for working out shortcut keys.  Linux and
+    // Windows guarantee one character per event.  The Mac does not, but in
+    // reality that's all it ever gives.  We're generous, and cap it a bit
+    // longer.
+    WebUChar text[textLengthCap];
+    WebUChar unmodifiedText[textLengthCap];
+
+    // This is a string identifying the key pressed.
+    char keyIdentifier[keyIdentifierLengthCap];
+
+    WebKeyboardEvent(unsigned sizeParam = sizeof(WebKeyboardEvent))
+        : WebInputEvent(sizeParam)
+        , windowsKeyCode(0)
+        , nativeKeyCode(0)
+        , isSystemKey(false)
+    {
+        memset(&text, 0, sizeof(text));
+        memset(&unmodifiedText, 0, sizeof(unmodifiedText));
+        memset(&keyIdentifier, 0, sizeof(keyIdentifier));
+    }
+
+    // Sets keyIdentifier based on the value of windowsKeyCode.  This is
+    // handy for generating synthetic keyboard events.
+    WEBKIT_EXPORT void setKeyIdentifierFromWindowsKeyCode();
+
+    static int windowsKeyCodeWithoutLocation(int keycode);
+    static int locationModifiersFromWindowsKeyCode(int keycode);
+};
+
+// WebMouseEvent --------------------------------------------------------------
+
+class WebMouseEvent : public WebInputEvent {
+public:
+    // These values defined for WebCore::MouseButton
+    enum Button {
+        ButtonNone = -1,
+        ButtonLeft,
+        ButtonMiddle,
+        ButtonRight
+    };
+
+    Button button;
+    int x;
+    int y;
+    int windowX;
+    int windowY;
+    int globalX;
+    int globalY;
+    int movementX;
+    int movementY;
+    int clickCount;
+
+    WebMouseEvent(unsigned sizeParam = sizeof(WebMouseEvent))
+        : WebInputEvent(sizeParam)
+        , button(ButtonNone)
+        , x(0)
+        , y(0)
+        , windowX(0)
+        , windowY(0)
+        , globalX(0)
+        , globalY(0)
+        , movementX(0)
+        , movementY(0)
+        , clickCount(0)
+    {
+    }
+};
+
+// WebMouseWheelEvent ---------------------------------------------------------
+
+class WebMouseWheelEvent : public WebMouseEvent {
+public:
+    enum Phase {
+        PhaseNone        = 0,
+        PhaseBegan       = 1 << 0,
+        PhaseStationary  = 1 << 1,
+        PhaseChanged     = 1 << 2,
+        PhaseEnded       = 1 << 3,
+        PhaseCancelled   = 1 << 4,
+        PhaseMayBegin    = 1 << 5,
+    };
+
+    float deltaX;
+    float deltaY;
+    float wheelTicksX;
+    float wheelTicksY;
+
+    float accelerationRatioX;
+    float accelerationRatioY;
+
+    // See comment at the top of the file for why an int is used here.
+    int scrollByPage;
+
+    // See comment at the top of the file for why an int is used here.
+    int hasPreciseScrollingDeltas;
+    Phase phase;
+    Phase momentumPhase;
+
+    WebMouseWheelEvent(unsigned sizeParam = sizeof(WebMouseWheelEvent))
+        : WebMouseEvent(sizeParam)
+        , deltaX(0.0f)
+        , deltaY(0.0f)
+        , wheelTicksX(0.0f)
+        , wheelTicksY(0.0f)
+        , accelerationRatioX(1.0f)
+        , accelerationRatioY(1.0f)
+        , scrollByPage(false)
+        , hasPreciseScrollingDeltas(false)
+        , phase(PhaseNone)
+        , momentumPhase(PhaseNone)
+    {
+    }
+};
+
+// WebGestureEvent --------------------------------------------------------------
+
+class WebGestureEvent : public WebInputEvent {
+public:
+    enum SourceDevice {
+        Touchpad,
+        Touchscreen,
+    };
+
+    int x;
+    int y;
+    int globalX;
+    int globalY;
+    SourceDevice sourceDevice;
+
+    union {
+        struct {
+            int tapCount;
+            float width;
+            float height;
+        } tap;
+
+        struct {
+            float width;
+            float height;
+        } tapDown;
+
+        struct {
+            float width;
+            float height;
+        } longPress;
+
+        struct {
+            float firstFingerWidth;
+            float firstFingerHeight;
+        } twoFingerTap;
+
+        struct {
+            float deltaX;
+            float deltaY;
+            float velocityX;
+            float velocityY;
+        } scrollUpdate;
+
+        struct {
+            float velocityX;
+            float velocityY;
+        } flingStart;
+
+        struct {
+            float scale;
+        } pinchUpdate;
+    } data;
+
+    WebGestureEvent(unsigned sizeParam = sizeof(WebGestureEvent))
+        : WebInputEvent(sizeParam)
+        , x(0)
+        , y(0)
+        , globalX(0)
+        , globalY(0)
+    {
+        memset(&data, 0, sizeof(data));
+    }
+};
+
+// WebTouchEvent --------------------------------------------------------------
+
+class WebTouchEvent : public WebInputEvent {
+public:
+    // Maximum number of simultaneous touches supported on
+    // Ash/Aura.
+    enum { touchesLengthCap = 12 };
+
+    unsigned touchesLength;
+    // List of all touches which are currently down.
+    WebTouchPoint touches[touchesLengthCap];
+
+    unsigned changedTouchesLength;
+    // List of all touches whose state has changed since the last WebTouchEvent
+    WebTouchPoint changedTouches[touchesLengthCap];
+
+    unsigned targetTouchesLength;
+    // List of all touches which are currently down and are targeting the event recipient.
+    WebTouchPoint targetTouches[touchesLengthCap];
+
+    WebTouchEvent(unsigned sizeParam = sizeof(WebTouchEvent))
+        : WebInputEvent(sizeParam)
+        , touchesLength(0)
+        , changedTouchesLength(0)
+        , targetTouchesLength(0)
+    {
+    }
+};
+
+#pragma pack(pop)
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebKit.h b/public/webpage/WebKit.h
new file mode 100644
index 0000000..0d83122
--- /dev/null
+++ b/public/webpage/WebKit.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebKit_h
+#define WebKit_h
+
+#include "../platform/Platform.h"
+
+namespace WebKit {
+
+// Must be called on the thread that will be the main WebKit thread before
+// using any other WebKit APIs. The provided Platform; must be
+// non-null and must remain valid until the current thread calls shutdown.
+WEBKIT_EXPORT void initialize(Platform*);
+
+// Must be called on the thread that will be the main WebKit thread before
+// using any other WebKit APIs. The provided Platform must be
+// non-null and must remain valid until the current thread calls shutdown.
+//
+// This is a special variant of initialize that does not intitialize V8.
+WEBKIT_EXPORT void initializeWithoutV8(Platform*);
+
+// Once shutdown, the Platform passed to initialize will no longer
+// be accessed. No other WebKit objects should be in use when this function is
+// called. Any background threads created by WebKit are promised to be
+// terminated by the time this function returns.
+WEBKIT_EXPORT void shutdown();
+
+// Alters the rendering of content to conform to a fixed set of rules.
+WEBKIT_EXPORT void setLayoutTestMode(bool);
+WEBKIT_EXPORT bool layoutTestMode();
+
+// Enables the named log channel. See WebCore/platform/Logging.h for details.
+WEBKIT_EXPORT void enableLogChannel(const char*);
+
+// Purge the plugin list cache. If |reloadPages| is true, any pages
+// containing plugins will be reloaded after refreshing the plugin list.
+WEBKIT_EXPORT void resetPluginCache(bool reloadPages);
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebLabelElement.h b/public/webpage/WebLabelElement.h
new file mode 100644
index 0000000..4a20bac
--- /dev/null
+++ b/public/webpage/WebLabelElement.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebLabelElement_h
+#define WebLabelElement_h
+
+#include "WebElement.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLLabelElement; }
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+
+// Provides readonly access to some properties of a DOM label element node.
+class WebLabelElement : public WebElement {
+public:
+    WebLabelElement() : WebElement() { }
+    WebLabelElement(const WebLabelElement& element) : WebElement(element) { }
+
+    WebLabelElement& operator=(const WebLabelElement& element)
+    {
+        WebElement::assign(element);
+        return *this;
+    }
+
+    void assign(const WebLabelElement& element) { WebElement::assign(element); }
+
+    WEBKIT_EXPORT WebElement correspondingControl();
+
+#if WEBKIT_IMPLEMENTATION
+    WebLabelElement(const WTF::PassRefPtr<WebCore::HTMLLabelElement>&);
+    WebLabelElement& operator=(const WTF::PassRefPtr<WebCore::HTMLLabelElement>&);
+    operator WTF::PassRefPtr<WebCore::HTMLLabelElement>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMediaPlayer.h b/public/webpage/WebMediaPlayer.h
new file mode 100644
index 0000000..2125248
--- /dev/null
+++ b/public/webpage/WebMediaPlayer.h
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMediaPlayer_h
+#define WebMediaPlayer_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebString.h"
+#include "WebTimeRange.h"
+
+namespace WebKit {
+
+class WebAudioSourceProvider;
+class WebAudioSourceProviderClient;
+class WebMediaPlayerClient;
+class WebMediaSource;
+class WebString;
+class WebURL;
+struct WebRect;
+struct WebSize;
+class WebGraphicsContext3D;
+
+class WebMediaPlayer {
+public:
+    enum NetworkState {
+        NetworkStateEmpty,
+        NetworkStateIdle,
+        NetworkStateLoading,
+        NetworkStateLoaded,
+        NetworkStateFormatError,
+        NetworkStateNetworkError,
+        NetworkStateDecodeError,
+    };
+
+    enum ReadyState {
+        ReadyStateHaveNothing,
+        ReadyStateHaveMetadata,
+        ReadyStateHaveCurrentData,
+        ReadyStateHaveFutureData,
+        ReadyStateHaveEnoughData,
+    };
+
+    enum Preload {
+        PreloadNone,
+        PreloadMetaData,
+        PreloadAuto,
+    };
+
+    // Represents synchronous exceptions that can be thrown from the Encrypted
+    // Media methods. This is different from the asynchronous MediaKeyError.
+    enum MediaKeyException {
+        MediaKeyExceptionNoError,
+        MediaKeyExceptionInvalidPlayerState,
+        MediaKeyExceptionKeySystemNotSupported,
+    };
+
+    enum CORSMode {
+        CORSModeUnspecified,
+        CORSModeAnonymous,
+        CORSModeUseCredentials,
+    };
+
+    virtual ~WebMediaPlayer() {}
+
+    virtual void load(const WebURL&, CORSMode) = 0;
+    virtual void load(const WebURL&, WebMediaSource*, CORSMode) = 0;
+
+    // Playback controls.
+    virtual void play() = 0;
+    virtual void pause() = 0;
+    virtual bool supportsFullscreen() const = 0;
+    virtual bool supportsSave() const = 0;
+    virtual void seek(double seconds) = 0;
+    virtual void setRate(double rate)  = 0;
+    virtual void setVolume(double volume) = 0;
+    virtual void setPreload(Preload) { };
+    virtual const WebTimeRanges& buffered() = 0;
+    virtual double maxTimeSeekable() const = 0;
+
+    virtual void paint(WebCanvas*, const WebRect&, unsigned char alpha) = 0;
+
+    // True if the loaded media has a playable video/audio track.
+    virtual bool hasVideo() const = 0;
+    virtual bool hasAudio() const = 0;
+
+    // Dimension of the video.
+    virtual WebSize naturalSize() const = 0;
+
+    // Getters of playback state.
+    virtual bool paused() const = 0;
+    virtual bool seeking() const = 0;
+    virtual double duration() const = 0;
+    virtual double currentTime() const = 0;
+
+    // Internal states of loading and network.
+    virtual NetworkState networkState() const = 0;
+    virtual ReadyState readyState() const = 0;
+
+    virtual bool didLoadingProgress() const = 0;
+
+    virtual bool hasSingleSecurityOrigin() const = 0;
+    virtual bool didPassCORSAccessCheck() const = 0;
+
+    virtual double mediaTimeForTimeValue(double timeValue) const = 0;
+
+    virtual unsigned decodedFrameCount() const = 0;
+    virtual unsigned droppedFrameCount() const = 0;
+    virtual unsigned audioDecodedByteCount() const = 0;
+    virtual unsigned videoDecodedByteCount() const = 0;
+
+    // Do a GPU-GPU textures copy if possible.
+    virtual bool copyVideoTextureToPlatformTexture(WebGraphicsContext3D*, unsigned texture, unsigned level, unsigned internalFormat, unsigned type, bool premultiplyAlpha, bool flipY) { return false; }
+
+    virtual WebAudioSourceProvider* audioSourceProvider() { return 0; }
+
+    // Returns whether keySystem is supported. If true, the result will be
+    // reported by an event.
+    virtual MediaKeyException generateKeyRequest(const WebString& keySystem, const unsigned char* initData, unsigned initDataLength) { return MediaKeyExceptionKeySystemNotSupported; }
+    virtual MediaKeyException addKey(const WebString& keySystem, const unsigned char* key, unsigned keyLength, const unsigned char* initData, unsigned initDataLength, const WebString& sessionId) { return MediaKeyExceptionKeySystemNotSupported; }
+    virtual MediaKeyException cancelKeyRequest(const WebString& keySystem, const WebString& sessionId) { return MediaKeyExceptionKeySystemNotSupported; }
+
+    // Instruct WebMediaPlayer to enter/exit fullscreen.
+    virtual void enterFullscreen() { }
+    virtual void exitFullscreen() { }
+    // Returns true if the player can enter fullscreen.
+    virtual bool canEnterFullscreen() const { return false; }
+
+    // Deprecated methods to-be-deleted
+    // FIXME: Remove once Chromium no longer overrides
+    virtual void cancelLoad() { }
+    virtual int dataRate() const { return 0; }
+    virtual void setVisible(bool) { }
+    virtual void setSize(const WebSize&) { }
+    virtual unsigned long long totalBytes() const { return 0; }
+    virtual bool totalBytesKnown() { return false; }
+    enum MovieLoadType {
+        MovieLoadTypeUnknown,
+        MovieLoadTypeDownload,
+        MovieLoadTypeStoredStream,
+        MovieLoadTypeLiveStream,
+    };
+    virtual MovieLoadType movieLoadType() const { return MovieLoadTypeUnknown; }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMediaPlayerAction.h b/public/webpage/WebMediaPlayerAction.h
new file mode 100644
index 0000000..192704f
--- /dev/null
+++ b/public/webpage/WebMediaPlayerAction.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMediaPlayerAction_h
+#define WebMediaPlayerAction_h
+
+namespace WebKit {
+
+struct WebMediaPlayerAction {
+    enum Type {
+        Unknown,
+        Play,
+        Mute,
+        Loop,
+        Controls
+    };
+
+    Type type;
+    bool enable;
+
+    WebMediaPlayerAction()
+        : type(Unknown), enable(false) { }
+    WebMediaPlayerAction(Type type, bool enable)
+        : type(type), enable(enable) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMediaPlayerClient.h b/public/webpage/WebMediaPlayerClient.h
new file mode 100644
index 0000000..0622f96
--- /dev/null
+++ b/public/webpage/WebMediaPlayerClient.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMediaPlayerClient_h
+#define WebMediaPlayerClient_h
+
+#include "WebMediaPlayer.h"
+
+namespace WebKit {
+
+class WebFrame;
+class WebInbandTextTrack;
+class WebLayer;
+class WebMediaSource;
+class WebPlugin;
+class WebRequest;
+class WebURL;
+
+class WebMediaPlayerClient {
+public:
+    enum MediaKeyErrorCode {
+        MediaKeyErrorCodeUnknown = 1,
+        MediaKeyErrorCodeClient,
+        MediaKeyErrorCodeService,
+        MediaKeyErrorCodeOutput,
+        MediaKeyErrorCodeHardwareChange,
+        MediaKeyErrorCodeDomain,
+        UnknownError = MediaKeyErrorCodeUnknown,
+        ClientError = MediaKeyErrorCodeClient,
+        ServiceError = MediaKeyErrorCodeService,
+        OutputError = MediaKeyErrorCodeOutput,
+        HardwareChangeError = MediaKeyErrorCodeHardwareChange,
+        DomainError = MediaKeyErrorCodeDomain,
+    };
+
+    virtual void networkStateChanged() = 0;
+    virtual void readyStateChanged() = 0;
+    virtual void timeChanged() = 0;
+    virtual void repaint() = 0;
+    virtual void durationChanged() = 0;
+    virtual void sizeChanged() = 0;
+    virtual void setOpaque(bool) = 0;
+    virtual double volume() const = 0;
+    virtual void playbackStateChanged() = 0;
+    virtual WebMediaPlayer::Preload preload() const = 0;
+    virtual void keyAdded(const WebString& keySystem, const WebString& sessionId) = 0;
+    virtual void keyError(const WebString& keySystem, const WebString& sessionId, MediaKeyErrorCode, unsigned short systemCode) = 0;
+    virtual void keyMessage(const WebString& keySystem, const WebString& sessionId, const unsigned char* message, unsigned messageLength, const WebURL& defaultURL) = 0;
+    virtual void keyNeeded(const WebString& keySystem, const WebString& sessionId, const unsigned char* initData, unsigned initDataLength) = 0;
+    // The returned pointer is valid until closeHelperPlugin() is called.
+    // Returns 0 if the plugin could not be instantiated.
+    virtual WebPlugin* createHelperPlugin(const WebString& pluginType, WebFrame*) = 0;
+    virtual void closeHelperPlugin() = 0;
+    virtual bool needsWebLayerForVideo() const = 0;
+    virtual void setWebLayer(WebLayer*) = 0;
+    virtual void addTextTrack(WebInbandTextTrack*) = 0;
+    virtual void removeTextTrack(WebInbandTextTrack*) = 0;
+
+protected:
+    ~WebMediaPlayerClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMediaSource.h b/public/webpage/WebMediaSource.h
new file mode 100644
index 0000000..424a687
--- /dev/null
+++ b/public/webpage/WebMediaSource.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMediaSource_h
+#define WebMediaSource_h
+
+#include "../platform/WebURL.h"
+#include "WebTimeRange.h"
+
+namespace WebKit {
+
+class WebMediaSourceClient;
+
+class WebMediaSource {
+public:
+    virtual ~WebMediaSource() { };
+    virtual void open(WebMediaSourceClient*) = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMediaSourceClient.h b/public/webpage/WebMediaSourceClient.h
new file mode 100644
index 0000000..4492414
--- /dev/null
+++ b/public/webpage/WebMediaSourceClient.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMediaSourceClient_h
+#define WebMediaSourceClient_h
+
+#include "../platform/WebString.h"
+#include "WebTimeRange.h"
+
+namespace WebKit {
+
+class WebSourceBuffer;
+
+class WebMediaSourceClient {
+public:
+    enum AddStatus {
+        AddStatusOk,
+        AddStatusNotSupported,
+        AddStatusReachedIdLimit
+    };
+
+    enum EndOfStreamStatus {
+        EndOfStreamStatusNoError,
+        EndOfStreamStatusNetworkError,
+        EndOfStreamStatusDecodeError,
+    };
+
+    virtual ~WebMediaSourceClient() { }
+
+    virtual AddStatus addSourceBuffer(const WebString& type, const WebVector<WebString>& codecs, WebSourceBuffer**) = 0;
+    virtual double duration() = 0;
+    virtual void setDuration(double) = 0;
+    virtual void endOfStream(EndOfStreamStatus) = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMediaStreamRegistry.h b/public/webpage/WebMediaStreamRegistry.h
new file mode 100644
index 0000000..0843b39
--- /dev/null
+++ b/public/webpage/WebMediaStreamRegistry.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMediaStreamRegistry_h
+#define WebMediaStreamRegistry_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+class WebMediaStream;
+class WebURL;
+
+class WebMediaStreamRegistry {
+public:
+    WEBKIT_EXPORT static WebMediaStream lookupMediaStreamDescriptor(const WebURL&);
+};
+
+} // namespace WebKit
+
+#endif // WebMediaStreamRegistry_h
diff --git a/public/webpage/WebMemoryUsageInfo.h b/public/webpage/WebMemoryUsageInfo.h
new file mode 100644
index 0000000..1168a2c
--- /dev/null
+++ b/public/webpage/WebMemoryUsageInfo.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebMemoryUsageInfo_h
+#define WebMemoryUsageInfo_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+struct WebMemoryUsageInfo {
+    WebMemoryUsageInfo(const WebString& allocator, size_t allocated)
+        : allocatorName(allocator)
+        , allocatedBytes(allocated)
+    {
+    }
+
+    WebMemoryUsageInfo()
+        : allocatedBytes(0)
+    {
+    }
+
+    WebString allocatorName;
+    size_t allocatedBytes;
+};
+
+} // namespace WebKit
+
+#endif // WebMemoryUsageInfo_h
diff --git a/public/webpage/WebMenuItemInfo.h b/public/webpage/WebMenuItemInfo.h
new file mode 100644
index 0000000..eef2528
--- /dev/null
+++ b/public/webpage/WebMenuItemInfo.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebMenuItemInfo_h
+#define WebMenuItemInfo_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include "WebTextDirection.h"
+
+namespace WebKit {
+
+struct WebMenuItemInfo {
+    enum Type {
+        Option,
+        CheckableOption,
+        Group,
+        Separator,
+        SubMenu
+    };
+
+    WebMenuItemInfo() 
+        : type(Option)
+        , action(0)
+        , textDirection(WebTextDirectionDefault)
+        , hasTextDirectionOverride(false)
+        , enabled(false)
+        , checked(false)
+    {
+    }
+
+    WebString label;
+    WebString toolTip;
+    Type type;
+    unsigned action;
+    WebTextDirection textDirection;
+    WebVector<WebMenuItemInfo> subMenuItems;
+    bool hasTextDirectionOverride;
+    bool enabled;
+    bool checked;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebMessagePortChannel.h b/public/webpage/WebMessagePortChannel.h
new file mode 100644
index 0000000..2941674
--- /dev/null
+++ b/public/webpage/WebMessagePortChannel.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebMessagePortChannel.h"
diff --git a/public/webpage/WebMessagePortChannelClient.h b/public/webpage/WebMessagePortChannelClient.h
new file mode 100644
index 0000000..14fbe2f
--- /dev/null
+++ b/public/webpage/WebMessagePortChannelClient.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebMessagePortChannelClient.h"
diff --git a/public/webpage/WebNavigationPolicy.h b/public/webpage/WebNavigationPolicy.h
new file mode 100644
index 0000000..54bee9d
--- /dev/null
+++ b/public/webpage/WebNavigationPolicy.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNavigationPolicy_h
+#define WebNavigationPolicy_h
+
+namespace WebKit {
+
+enum WebNavigationPolicy {
+    WebNavigationPolicyIgnore,
+    WebNavigationPolicyDownload,
+    WebNavigationPolicyCurrentTab,
+    WebNavigationPolicyNewBackgroundTab,
+    WebNavigationPolicyNewForegroundTab,
+    WebNavigationPolicyNewWindow,
+    WebNavigationPolicyNewPopup,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNavigationType.h b/public/webpage/WebNavigationType.h
new file mode 100644
index 0000000..8ca8dc6
--- /dev/null
+++ b/public/webpage/WebNavigationType.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNavigationType_h
+#define WebNavigationType_h
+
+namespace WebKit {
+
+enum WebNavigationType {
+    WebNavigationTypeLinkClicked,
+    WebNavigationTypeFormSubmitted,
+    WebNavigationTypeBackForward,
+    WebNavigationTypeReload,
+    WebNavigationTypeFormResubmitted,
+    WebNavigationTypeOther
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNetworkStateNotifier.h b/public/webpage/WebNetworkStateNotifier.h
new file mode 100644
index 0000000..0069c30
--- /dev/null
+++ b/public/webpage/WebNetworkStateNotifier.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNetworkStateNotifier_h
+#define WebNetworkStateNotifier_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebNetworkStateNotifier {
+public:
+    WEBKIT_EXPORT static void setOnLine(bool);
+
+private:
+    WebNetworkStateNotifier();
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNode.h b/public/webpage/WebNode.h
new file mode 100644
index 0000000..8028804
--- /dev/null
+++ b/public/webpage/WebNode.h
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNode_h
+#define WebNode_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebString.h"
+#include "WebExceptionCode.h"
+
+namespace WebCore { class Node; }
+
+namespace WebKit {
+class WebDOMEvent;
+class WebDOMEventListener;
+class WebDOMEventListenerPrivate;
+class WebDocument;
+class WebElement;
+class WebFrame;
+class WebNodeList;
+class WebPluginContainer;
+
+// Provides access to some properties of a DOM node.
+class WebNode {
+public:
+    virtual ~WebNode() { reset(); }
+
+    WebNode() { }
+    WebNode(const WebNode& n) { assign(n); }
+    WebNode& operator=(const WebNode& n)
+    {
+        assign(n);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebNode&);
+
+    WEBKIT_EXPORT bool equals(const WebNode&) const;
+    // Required for using WebNodes in std maps.  Note the order used is
+    // arbitrary and should not be expected to have any specific meaning.
+    WEBKIT_EXPORT bool lessThan(const WebNode&) const;
+
+    bool isNull() const { return m_private.isNull(); }
+
+    enum NodeType {
+        ElementNode = 1,
+        AttributeNode = 2,
+        TextNode = 3,
+        CDataSectionNode = 4,
+        // EntityReferenceNodes are deprecated and impossible to create in WebKit.
+        EntityNode = 6,
+        ProcessingInstructionsNode = 7,
+        CommentNode = 8,
+        DocumentNode = 9,
+        DocumentTypeNode = 10,
+        DocumentFragmentNode = 11,
+        NotationNode = 12,
+        XPathNamespaceNode = 13,
+        ShadowRootNode = 14
+    };
+
+    WEBKIT_EXPORT NodeType nodeType() const;
+    WEBKIT_EXPORT WebNode parentNode() const;
+    WEBKIT_EXPORT WebString nodeName() const;
+    WEBKIT_EXPORT WebString nodeValue() const;
+    WEBKIT_EXPORT bool setNodeValue(const WebString&);
+    WEBKIT_EXPORT WebDocument document() const;
+    WEBKIT_EXPORT WebNode firstChild() const;
+    WEBKIT_EXPORT WebNode lastChild() const;
+    WEBKIT_EXPORT WebNode previousSibling() const;
+    WEBKIT_EXPORT WebNode nextSibling() const;
+    WEBKIT_EXPORT bool hasChildNodes() const;
+    WEBKIT_EXPORT WebNodeList childNodes();
+    WEBKIT_EXPORT bool appendChild(const WebNode& child);
+    WEBKIT_EXPORT WebString createMarkup() const;
+    WEBKIT_EXPORT bool isLink() const;
+    WEBKIT_EXPORT bool isTextNode() const;
+    WEBKIT_EXPORT bool isFocusable() const;
+    WEBKIT_EXPORT bool isContentEditable() const;
+    WEBKIT_EXPORT bool isElementNode() const;
+    // addEventListener only works with a small set of eventTypes.
+    WEBKIT_EXPORT void addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture);
+    WEBKIT_EXPORT bool dispatchEvent(const WebDOMEvent&);
+    WEBKIT_EXPORT void simulateClick();
+    WEBKIT_EXPORT WebNodeList getElementsByTagName(const WebString&) const;
+    WEBKIT_EXPORT WebElement querySelector(const WebString&, WebExceptionCode&) const;
+    WEBKIT_EXPORT WebElement rootEditableElement() const;
+    WEBKIT_EXPORT bool focused() const;
+    WEBKIT_EXPORT bool remove();
+
+    // Returns true if the node has a non-empty bounding box in layout.
+    // This does not 100% guarantee the user can see it, but is pretty close.
+    // Note: This method only works properly after layout has occurred.
+    WEBKIT_EXPORT bool hasNonEmptyBoundingBox() const;
+    WEBKIT_EXPORT WebPluginContainer* pluginContainer() const;
+    WEBKIT_EXPORT WebElement shadowHost() const;
+
+    template<typename T> T to()
+    {
+        T res;
+        res.WebNode::assign(*this);
+        return res;
+    }
+
+    template<typename T> const T toConst() const
+    {
+        T res;
+        res.WebNode::assign(*this);
+        return res;
+    }
+
+#if WEBKIT_IMPLEMENTATION
+    WebNode(const WTF::PassRefPtr<WebCore::Node>&);
+    WebNode& operator=(const WTF::PassRefPtr<WebCore::Node>&);
+    operator WTF::PassRefPtr<WebCore::Node>() const;
+#endif
+
+#if WEBKIT_IMPLEMENTATION
+    template<typename T> T* unwrap()
+    {
+        return static_cast<T*>(m_private.get());
+    }
+
+    template<typename T> const T* constUnwrap() const
+    {
+        return static_cast<const T*>(m_private.get());
+    }
+#endif
+
+protected:
+    WebPrivatePtr<WebCore::Node> m_private;
+};
+
+inline bool operator==(const WebNode& a, const WebNode& b)
+{
+    return a.equals(b);
+}
+
+inline bool operator!=(const WebNode& a, const WebNode& b)
+{
+    return !(a == b);
+}
+
+inline bool operator<(const WebNode& a, const WebNode& b)
+{
+    return a.lessThan(b);
+}
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNodeCollection.h b/public/webpage/WebNodeCollection.h
new file mode 100644
index 0000000..004cc08
--- /dev/null
+++ b/public/webpage/WebNodeCollection.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNodeCollection_h
+#define WebNodeCollection_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebCore { class HTMLCollection; }
+#if WEBKIT_IMPLEMENTATION
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+class WebNode;
+
+// Provides readonly access to some properties of a DOM node.
+class WebNodeCollection {
+public:
+    ~WebNodeCollection() { reset(); }
+
+    WebNodeCollection() : m_private(0), m_current(0) { }
+    WebNodeCollection(const WebNodeCollection& n) : m_private(0) { assign(n); }
+    WebNodeCollection& operator=(const WebNodeCollection& n)
+    {
+        assign(n);
+        return *this;
+    }
+
+    bool isNull() const { return !m_private; }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebNodeCollection&);
+
+    WEBKIT_EXPORT unsigned length() const;
+    WEBKIT_EXPORT WebNode nextItem() const;
+    WEBKIT_EXPORT WebNode firstItem() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebNodeCollection(const WTF::PassRefPtr<WebCore::HTMLCollection>&);
+#endif
+
+private:
+    void assign(WebCore::HTMLCollection*);
+    WebCore::HTMLCollection* m_private;
+    mutable unsigned m_current;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNodeList.h b/public/webpage/WebNodeList.h
new file mode 100644
index 0000000..c0137d9
--- /dev/null
+++ b/public/webpage/WebNodeList.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNodeList_h
+#define WebNodeList_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebCore { class NodeList; }
+#if WEBKIT_IMPLEMENTATION
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+class WebNode;
+
+// Provides readonly access to some properties of a DOM node.
+class WebNodeList {
+public:
+    ~WebNodeList() { reset(); }
+
+    WebNodeList() : m_private(0) { }
+    WebNodeList(const WebNodeList& n) : m_private(0) { assign(n); }
+    WebNodeList& operator=(const WebNodeList& n)
+    {
+        assign(n);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebNodeList&);
+
+    WEBKIT_EXPORT unsigned length() const;
+    WEBKIT_EXPORT WebNode item(size_t) const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebNodeList(const WTF::PassRefPtr<WebCore::NodeList>&);
+#endif
+
+private:
+    void assign(WebCore::NodeList*);
+    WebCore::NodeList* m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNotification.h b/public/webpage/WebNotification.h
new file mode 100644
index 0000000..7d4e055
--- /dev/null
+++ b/public/webpage/WebNotification.h
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNotification_h
+#define WebNotification_h
+
+#include "../platform/WebCommon.h"
+#include "WebTextDirection.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class Notification; }
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WTF {
+class AtomicString;
+}
+
+namespace WebKit {
+
+class WebNotificationPrivate;
+class WebURL;
+class WebString;
+
+// Represents access to a desktop notification.
+class WebNotification {
+public:
+    WebNotification() : m_private(0) { }
+    WebNotification(const WebNotification& other) : m_private(0) { assign(other); }
+
+    ~WebNotification() { reset(); }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebNotification&);
+
+    WebNotification& operator=(const WebNotification& other)
+    {
+        assign(other);
+        return *this;
+    }
+
+    // Operators required to put WebNotification in an ordered map.
+    bool equals(const WebNotification& other) const { return m_private == other.m_private; }
+    WEBKIT_EXPORT bool lessThan(const WebNotification& other) const;
+
+    // Is the notification HTML vs. icon-title-text?
+    WEBKIT_EXPORT bool isHTML() const;
+
+    // If HTML, the URL which contains the contents of the notification.
+    WEBKIT_EXPORT WebURL url() const;
+
+    WEBKIT_EXPORT WebURL iconURL() const;
+    WEBKIT_EXPORT WebString title() const;
+    WEBKIT_EXPORT WebString body() const;
+    WEBKIT_EXPORT WebTextDirection direction() const;
+
+    WEBKIT_EXPORT WebString replaceId() const;
+
+    // Called if the presenter goes out of scope before the notification does.
+    WEBKIT_EXPORT void detachPresenter();
+
+    // Called to indicate the notification has been displayed.
+    WEBKIT_EXPORT void dispatchDisplayEvent();
+
+    // Called to indicate an error has occurred with this notification.
+    WEBKIT_EXPORT void dispatchErrorEvent(const WebString& errorMessage);
+
+    // Called to indicate the notification has been closed.  If it was
+    // closed by the user (as opposed to automatically by the system),
+    // the byUser parameter will be true.
+    WEBKIT_EXPORT void dispatchCloseEvent(bool byUser);
+
+    // Called to indicate the notification was clicked on.
+    WEBKIT_EXPORT void dispatchClickEvent();
+
+#if WEBKIT_IMPLEMENTATION
+    WebNotification(const WTF::PassRefPtr<WebCore::Notification>&);
+    WebNotification& operator=(const WTF::PassRefPtr<WebCore::Notification>&);
+    operator WTF::PassRefPtr<WebCore::Notification>() const;
+#endif
+
+private:
+    void assign(WebNotificationPrivate*);
+    void dispatchEvent(const WTF::AtomicString& type);
+    WebNotificationPrivate* m_private;
+};
+
+inline bool operator==(const WebNotification& a, const WebNotification& b)
+{
+    return a.equals(b);
+}
+
+inline bool operator!=(const WebNotification& a, const WebNotification& b)
+{
+    return !a.equals(b);
+}
+
+inline bool operator<(const WebNotification& a, const WebNotification& b)
+{
+    return a.lessThan(b);
+}
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNotificationPermissionCallback.h b/public/webpage/WebNotificationPermissionCallback.h
new file mode 100644
index 0000000..07e85ee
--- /dev/null
+++ b/public/webpage/WebNotificationPermissionCallback.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNotificationPermissionCallback_h
+#define WebNotificationPermissionCallback_h
+
+namespace WebKit {
+
+// Callback object used with WebNotificationPresenter.
+class WebNotificationPermissionCallback {
+public:
+    // Method to be invoked when the async permission request involving
+    // this object has been completed.
+    virtual void permissionRequestComplete() = 0;
+
+protected:
+    // This object is to be destroyed after the callback is invoked;
+    // it should not be directly destroyed.
+    ~WebNotificationPermissionCallback() {}
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebNotificationPresenter.h b/public/webpage/WebNotificationPresenter.h
new file mode 100644
index 0000000..84d0c1a
--- /dev/null
+++ b/public/webpage/WebNotificationPresenter.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebNotificationPresenter_h
+#define WebNotificationPresenter_h
+
+#include "../platform/WebString.h"
+#include "WebNotificationPermissionCallback.h"
+#include "WebSecurityOrigin.h"
+
+namespace WebKit {
+
+class WebDocument;
+class WebNotification;
+
+// Provides the services to show desktop notifications to the user.
+class WebNotificationPresenter {
+public:
+    enum Permission {
+        PermissionAllowed,     // User has allowed permission to the origin.
+        PermissionNotAllowed,  // User has not taken an action on the origin (defaults to not allowed).
+        PermissionDenied       // User has explicitly denied permission from the origin.
+    };
+
+    // Shows a notification.
+    virtual bool show(const WebNotification&) = 0;
+
+    // Cancels a notification previously shown, and removes it if being shown.
+    virtual void cancel(const WebNotification&) = 0;
+
+    // Indiciates that the notification object subscribed to events for a previously shown notification is
+    // being destroyed.  Does _not_ remove the notification if being shown, but detaches it from receiving events.
+    virtual void objectDestroyed(const WebNotification&) = 0;
+
+    // Checks the permission level for the given origin.
+    virtual Permission checkPermission(const WebSecurityOrigin&) = 0;
+
+    // Requests permission for a given origin.  This operation is asynchronous and the callback provided
+    // will be invoked when the permission decision is made.  Callback pointer must remain
+    // valid until called.
+    virtual void requestPermission(const WebSecurityOrigin&, WebNotificationPermissionCallback*) = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebOptionElement.h b/public/webpage/WebOptionElement.h
new file mode 100644
index 0000000..7c6f52a
--- /dev/null
+++ b/public/webpage/WebOptionElement.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebOptionElement_h
+#define WebOptionElement_h
+
+#include "../platform/WebVector.h"
+#include "WebElement.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLOptionElement; }
+#endif
+
+namespace WebKit {
+
+// Provides readonly access to some properties of a DOM option element node.
+class WebOptionElement : public WebElement {
+public:
+    WebOptionElement() : WebElement() { }
+    WebOptionElement(const WebOptionElement& element) : WebElement(element) { }
+
+    WebOptionElement& operator=(const WebOptionElement& element)
+    {
+        WebElement::assign(element);
+        return *this;
+    }
+    void assign(const WebOptionElement& element) { WebElement::assign(element); }
+
+    WEBKIT_EXPORT void setValue(const WebString&);
+    WEBKIT_EXPORT WebString value() const;
+
+    WEBKIT_EXPORT int index() const;
+    WEBKIT_EXPORT WebString text() const;
+    WEBKIT_EXPORT bool defaultSelected() const;
+    WEBKIT_EXPORT void setDefaultSelected(bool);
+    WEBKIT_EXPORT WebString label() const;
+    WEBKIT_EXPORT bool isEnabled() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebOptionElement(const WTF::PassRefPtr<WebCore::HTMLOptionElement>&);
+    WebOptionElement& operator=(const WTF::PassRefPtr<WebCore::HTMLOptionElement>&);
+    operator WTF::PassRefPtr<WebCore::HTMLOptionElement>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPageOverlay.h b/public/webpage/WebPageOverlay.h
new file mode 100644
index 0000000..6a7e519
--- /dev/null
+++ b/public/webpage/WebPageOverlay.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Google 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 GOOGLE 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 GOOGLE 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 WebPageOverlay_h
+#define WebPageOverlay_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebRect.h"
+
+namespace WebKit {
+
+class WebPageOverlay {
+public:
+    // Paints page overlay contents.
+    virtual void paintPageOverlay(WebCanvas*) = 0;
+
+protected:
+    virtual ~WebPageOverlay() { }
+};
+
+} // namespace WebKit
+
+#endif // WebPageOverlay_h
diff --git a/public/webpage/WebPagePopup.h b/public/webpage/WebPagePopup.h
new file mode 100644
index 0000000..8d7d037
--- /dev/null
+++ b/public/webpage/WebPagePopup.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPagePopup_h
+#define WebPagePopup_h
+
+#include "../platform/WebCommon.h"
+#include "WebWidget.h"
+
+namespace WebKit {
+
+class WebWidgetClient;
+
+class WebPagePopup : public WebWidget {
+public:
+    WEBKIT_EXPORT static WebPagePopup* create(WebWidgetClient*);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPageSerializer.h b/public/webpage/WebPageSerializer.h
new file mode 100644
index 0000000..57298ae
--- /dev/null
+++ b/public/webpage/WebPageSerializer.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPageSerializer_h
+#define WebPageSerializer_h
+
+#include "../platform/WebCString.h"
+#include "../platform/WebCommon.h"
+#include "../platform/WebURL.h"
+
+namespace WebKit {
+class WebFrame;
+class WebPageSerializerClient;
+class WebString;
+class WebView;
+template <typename T> class WebVector;
+
+// Get html data by serializing all frames of current page with lists
+// which contain all resource links that have local copy.
+class WebPageSerializer {
+public:
+    struct Resource {
+        WebURL url;
+        WebCString mimeType;
+        WebCString data;
+    };
+
+    // Serializes all the frames from the WebView, retrieves the page's
+    // resources (such as images and CSS) and adds them to the passed vector.
+    // The first resource in that vector is the top frame contents.
+    // Note that this also strips-out any script tag or link to JavaScript.
+    WEBKIT_EXPORT static void serialize(WebView*, WebVector<Resource>*);
+
+    // Serializes the WebView contents to a MHTML representation.
+    WEBKIT_EXPORT static WebCString serializeToMHTML(WebView*);
+
+    // Similar to serializeToMHTML but uses binary encoding for the MHTML parts.
+    // This results in a smaller MHTML file but it might not be supported by other browsers.
+    WEBKIT_EXPORT static WebCString serializeToMHTMLUsingBinaryEncoding(WebView*);
+
+    // IMPORTANT:
+    // The API below is an older implementation of a pageserialization that
+    // will be removed soon.
+
+
+    // This function will find out all frames and serialize them to HTML data.
+    // We have a data buffer to temporary saving generated html data. We will
+    // sequentially call WebPageSeriazlierClient once the data buffer is full.
+    //
+    // Return false means no available frame has been serialized, otherwise
+    // return true.
+    //
+    // The parameter frame specifies which frame need to be serialized.
+    // The parameter recursive specifies whether we need to
+    // serialize all sub frames of the specified frame or not.
+    // The parameter client specifies the pointer of interface
+    // WebPageSerializerClient providing a sink interface to receive the
+    // individual chunks of data to be saved.
+    // The parameter links contain original URLs of all saved links.
+    // The parameter localPaths contain corresponding local file paths of all
+    // saved links, which matched with vector:links one by one.
+    // The parameter localDirectoryName is relative path of directory which
+    // contain all saved auxiliary files included all sub frames and resources.
+    WEBKIT_EXPORT static bool serialize(WebFrame*,
+                                        bool recursive,
+                                        WebPageSerializerClient*,
+                                        const WebVector<WebURL>& links,
+                                        const WebVector<WebString>& localPaths,
+                                        const WebString& localDirectoryName);
+
+    // Retrieve all the resource for the passed view, including the main frame
+    // and sub-frames. Returns true if all resources were retrieved
+    // successfully.
+    WEBKIT_EXPORT static bool retrieveAllResources(WebView*,
+                                                   const WebVector<WebCString>& supportedSchemes,
+                                                   WebVector<WebURL>* resources,
+                                                   WebVector<WebURL>* frames);
+
+    // FIXME: The following are here for unit testing purposes. Consider
+    // changing the unit tests instead.
+
+    // Generate the META for charset declaration.
+    WEBKIT_EXPORT static WebString generateMetaCharsetDeclaration(const WebString& charset);
+    // Generate the MOTW declaration.
+    WEBKIT_EXPORT static WebString generateMarkOfTheWebDeclaration(const WebURL&);
+    // Generate the default base tag declaration.
+    WEBKIT_EXPORT static WebString generateBaseTagDeclaration(const WebString& baseTarget);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPageSerializerClient.h b/public/webpage/WebPageSerializerClient.h
new file mode 100644
index 0000000..c30ddbc
--- /dev/null
+++ b/public/webpage/WebPageSerializerClient.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPageSerializerClient_h
+#define WebPageSerializerClient_h
+
+namespace WebKit {
+class WebCString;
+class WebURL;
+
+// This class is used for providing sink interface that can be used to receive
+// the individual chunks of data to be saved.
+class WebPageSerializerClient {
+public:
+    // This enum indicates  This sink interface can receive the individual chunks
+    // of serialized data to be saved, so we use values of following enum
+    // definition to indicate the serialization status of serializing all html
+    // content. If current frame is not complete serialized, call
+    // didSerializeDataForFrame with URL of current frame, data, data length and
+    // flag CurrentFrameIsNotFinished.
+    // If current frame is complete serialized, call didSerializeDataForFrame
+    // with URL of current frame, data, data length and flag
+    // CurrentFrameIsFinished.
+    // If all frames of page are complete serialized, call
+    // didSerializeDataForFrame with empty URL, empty data, 0 and flag
+    // AllFramesAreFinished.
+    enum PageSerializationStatus {
+        CurrentFrameIsNotFinished,
+        CurrentFrameIsFinished,
+        AllFramesAreFinished,
+    };
+
+    // Receive the individual chunks of serialized and encoded data to be saved.
+    // The parameter frameURL specifies what frame the data belongs. The
+    // parameter data contains the available data for saving. The parameter
+    // status indicates the status of data serialization.
+    virtual void didSerializeDataForFrame(const WebURL& frameURL,
+                                          const WebCString& data,
+                                          PageSerializationStatus status) = 0;
+    WebPageSerializerClient() { }
+
+protected:
+    virtual ~WebPageSerializerClient() { }
+};
+
+}  // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPageVisibilityState.h b/public/webpage/WebPageVisibilityState.h
new file mode 100644
index 0000000..8eb867f
--- /dev/null
+++ b/public/webpage/WebPageVisibilityState.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPageVisibilityState_h
+#define WebPageVisibilityState_h
+
+namespace WebKit {
+
+// The following enum should be consistent with the PageVisibilityState enum
+// defined in WebCore.
+enum WebPageVisibilityState {
+    WebPageVisibilityStateVisible,
+    WebPageVisibilityStateHidden,
+    WebPageVisibilityStatePrerender,
+    WebPageVisibilityStatePreview
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPasswordFormData.h b/public/webpage/WebPasswordFormData.h
new file mode 100644
index 0000000..954bbc9
--- /dev/null
+++ b/public/webpage/WebPasswordFormData.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPasswordFormData_h
+#define WebPasswordFormData_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+#include "../platform/WebVector.h"
+#include "WebFormElement.h"
+
+namespace WebKit {
+
+struct WebPasswordFormData {
+    // If the provided form is suitable for password completion, isValid() will
+    // return true;
+    WEBKIT_EXPORT WebPasswordFormData(const WebFormElement&);
+
+    // If creation failed, return false.
+    bool isValid() const { return action.isValid(); }
+
+    // The action target of the form. This is the primary data used by the
+    // PasswordManager for form autofill; that is, the action of the saved
+    // credentials must match the action of the form on the page to be autofilled.
+    // If this is empty / not available, it will result in a "restricted"
+    // IE-like autofill policy, where we wait for the user to type in his
+    // username before autofilling the password. In these cases, after successful
+    // login the action URL will automatically be assigned by the
+    // PasswordManager.
+    //
+    // When parsing an HTML form, this must always be set.
+    WebURL action;
+
+    // The "Realm" for the sign-on (scheme, host, port for SCHEME_HTML, and
+    // contains the HTTP realm for dialog-based forms).
+    // The signon_realm is effectively the primary key used for retrieving
+    // data from the database, so it must not be empty.
+    WebString signonRealm;
+
+    // The URL (minus query parameters) containing the form. This is the primary
+    // data used by the PasswordManager to decide (in longest matching prefix
+    // fashion) whether or not a given PasswordForm result from the database is a
+    // good fit for a particular form on a page, so it must not be empty.
+    WebURL origin;
+
+    // The name of the submit button used. Optional; only used in scoring
+    // of PasswordForm results from the database to make matches as tight as
+    // possible.
+    //
+    // When parsing an HTML form, this must always be set.
+    WebString submitElement;
+
+    // The name of the username input element. Optional (improves scoring).
+    //
+    // When parsing an HTML form, this must always be set.
+    WebString userNameElement;
+
+    // The username. Optional.
+    //
+    // When parsing an HTML form, this is typically empty unless the site
+    // has implemented some form of autofill.
+    WebString userNameValue;
+
+    // If the form has more than one field which could possibly contain the
+    // username, the extra are placed here. Used for autofill in cases where
+    // our heuristics for determining the username are wrong. Optional.
+    //
+    // When parsing an HTML form, this is typically empty.
+    WebVector<WebString> possibleUserNames;
+
+    // The name of the password input element, Optional (improves scoring).
+    //
+    // When parsing an HTML form, this must always be set.
+    WebString passwordElement;
+
+    // The password. Required.
+    //
+    // When parsing an HTML form, this is typically empty.
+    WebString passwordValue;
+
+    // Value of shouldAutocomplete for the password element.
+    bool passwordShouldAutocomplete;
+
+    // If the form was a change password form, the name of the
+    // 'old password' input element. Optional.
+    WebString oldPasswordElement;
+
+    // The old password. Optional.
+    WebString oldPasswordValue;
+
+    WebPasswordFormData()
+        : passwordShouldAutocomplete(false)
+    {
+    }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPerformance.h b/public/webpage/WebPerformance.h
new file mode 100644
index 0000000..5b5df2c
--- /dev/null
+++ b/public/webpage/WebPerformance.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPerformance_h
+#define WebPerformance_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "WebNavigationType.h"
+
+namespace WebCore { class Performance; }
+
+namespace WebKit {
+
+class WebPerformance {
+public:
+    ~WebPerformance() { reset(); }
+
+    WebPerformance() { }
+
+    WebPerformance(const WebPerformance& p) { assign(p); }
+
+    WebPerformance& operator=(const WebPerformance& p)
+    {
+        assign(p);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebPerformance&);
+
+    // This only returns one of {Other|Reload|BackForward}.
+    // Form submits and link clicks all fall under other.
+    WEBKIT_EXPORT WebNavigationType navigationType() const;
+
+    WEBKIT_EXPORT double navigationStart() const;
+    WEBKIT_EXPORT double unloadEventEnd() const;
+    WEBKIT_EXPORT double redirectStart() const;
+    WEBKIT_EXPORT double redirectEnd() const;
+    WEBKIT_EXPORT unsigned short redirectCount() const;
+    WEBKIT_EXPORT double fetchStart() const;
+    WEBKIT_EXPORT double domainLookupStart() const;
+    WEBKIT_EXPORT double domainLookupEnd() const;
+    WEBKIT_EXPORT double connectStart() const;
+    WEBKIT_EXPORT double connectEnd() const;
+    WEBKIT_EXPORT double requestStart() const;
+    WEBKIT_EXPORT double responseStart() const;
+    WEBKIT_EXPORT double responseEnd() const;
+    WEBKIT_EXPORT double domLoading() const;
+    WEBKIT_EXPORT double domInteractive() const;
+    WEBKIT_EXPORT double domContentLoadedEventStart() const;
+    WEBKIT_EXPORT double domContentLoadedEventEnd() const;
+    WEBKIT_EXPORT double domComplete() const;
+    WEBKIT_EXPORT double loadEventStart() const;
+    WEBKIT_EXPORT double loadEventEnd() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebPerformance(const WTF::PassRefPtr<WebCore::Performance>&);
+    WebPerformance& operator=(const WTF::PassRefPtr<WebCore::Performance>&);
+    operator WTF::PassRefPtr<WebCore::Performance>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::Performance> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPermissionClient.h b/public/webpage/WebPermissionClient.h
new file mode 100644
index 0000000..0b6414b
--- /dev/null
+++ b/public/webpage/WebPermissionClient.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPermissionClient_h
+#define WebPermissionClient_h
+
+namespace WebKit {
+
+class WebDocument;
+class WebFrame;
+class WebSecurityOrigin;
+class WebString;
+class WebURL;
+
+class WebPermissionClient {
+public:
+    // Controls whether access to Web Databases is allowed for this frame.
+    virtual bool allowDatabase(WebFrame*, const WebString& name, const WebString& displayName, unsigned long estimatedSize) { return true; }
+
+    // Controls whether access to File System is allowed for this frame.
+    virtual bool allowFileSystem(WebFrame*) { return true; }
+
+    // Controls whether images are allowed for this frame.
+    virtual bool allowImage(WebFrame* frame, bool enabledPerSettings, const WebURL& imageURL) { return enabledPerSettings; }
+
+    // Controls whether access to Indexed DB are allowed for this frame.
+    virtual bool allowIndexedDB(WebFrame*, const WebString& name, const WebSecurityOrigin&) { return true; }
+
+    // Controls whether plugins are allowed for this frame.
+    virtual bool allowPlugins(WebFrame*, bool enabledPerSettings) { return enabledPerSettings; }
+
+    // Controls whether scripts are allowed to execute for this frame.
+    virtual bool allowScript(WebFrame*, bool enabledPerSettings) { return enabledPerSettings; }
+
+    // Controls whether scripts loaded from the given URL are allowed to execute for this frame.
+    virtual bool allowScriptFromSource(WebFrame*, bool enabledPerSettings, const WebURL& scriptURL) { return enabledPerSettings; }
+
+    // Controls whether insecrure content is allowed to display for this frame.
+    virtual bool allowDisplayingInsecureContent(WebFrame*, bool enabledPerSettings, const WebSecurityOrigin&, const WebURL&) { return enabledPerSettings; }
+
+    // Controls whether insecrure scripts are allowed to execute for this frame.
+    virtual bool allowRunningInsecureContent(WebFrame*, bool enabledPerSettings, const WebSecurityOrigin&, const WebURL&) { return enabledPerSettings; }
+
+    // Controls whether the given script extension should run in a new script
+    // context in this frame. If extensionGroup is 0, the script context is the
+    // frame's main context. Otherwise, it is a context created by
+    // WebFrame::executeScriptInIsolatedWorld with that same extensionGroup
+    // value.
+    virtual bool allowScriptExtension(WebFrame*, const WebString& extensionName, int extensionGroup) { return true; }
+
+    virtual bool allowScriptExtension(WebFrame* webFrame, const WebString& extensionName, int extensionGroup, int worldId)
+    {
+        return allowScriptExtension(webFrame, extensionName, extensionGroup);
+    }
+
+    // Controls whether HTML5 Web Storage is allowed for this frame.
+    // If local is true, then this is for local storage, otherwise it's for session storage.
+    virtual bool allowStorage(WebFrame*, bool local) { return true; }
+
+    // Controls whether access to read the clipboard is allowed for this frame.
+    virtual bool allowReadFromClipboard(WebFrame*, bool defaultValue) { return defaultValue; }
+
+    // Controls whether access to write the clipboard is allowed for this frame.
+    virtual bool allowWriteToClipboard(WebFrame*, bool defaultValue) { return defaultValue; }
+
+    // Controls whether enabling Web Components API for this frame.
+    virtual bool allowWebComponents(const WebDocument&, bool defaultValue) { return defaultValue; }
+
+    // Controls whether enabling HTML notifications for this frame.
+    virtual bool allowHTMLNotifications(const WebDocument&) { return true; }
+
+    // Controls whether to enable MutationEvents for this document.
+    // The common use case of this method is actually to selectively disable MutationEvents,
+    // but it's been named for consistency with the rest of the interface.
+    virtual bool allowMutationEvents(const WebDocument&, bool defaultValue) { return defaultValue; }
+
+    // Controls whether pushState and related History APIs are enabled for this frame.
+    virtual bool allowPushState(const WebDocument&) { return true; }
+
+    // Notifies the client that the frame would have instantiated a plug-in if plug-ins were enabled.
+    virtual void didNotAllowPlugins(WebFrame*) { }
+
+    // Notifies the client that the frame would have executed script if script were enabled.
+    virtual void didNotAllowScript(WebFrame*) { }
+
+protected:
+    ~WebPermissionClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPlugin.h b/public/webpage/WebPlugin.h
new file mode 100644
index 0000000..daf962a
--- /dev/null
+++ b/public/webpage/WebPlugin.h
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2009, 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPlugin_h
+#define WebPlugin_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+#include "WebDragOperation.h"
+#include "WebDragStatus.h"
+
+struct NPObject;
+struct _NPP;
+
+namespace WebKit {
+
+class WebDataSource;
+class WebDragData;
+class WebFrame;
+class WebInputEvent;
+class WebPluginContainer;
+class WebURLResponse;
+struct WebCursorInfo;
+struct WebPluginParams;
+struct WebPrintParams;
+struct WebPoint;
+struct WebRect;
+struct WebURLError;
+template <typename T> class WebVector;
+
+class WebPlugin {
+public:
+    virtual bool initialize(WebPluginContainer*) = 0;
+    virtual void destroy() = 0;
+
+    virtual WebPluginContainer* container() const { return 0; }
+
+    virtual NPObject* scriptableObject() = 0;
+    virtual struct _NPP* pluginNPP() { return 0; }
+
+    // Returns true if the form submission value is successfully obtained
+    // from the plugin. The value would be associated with the name attribute
+    // of the corresponding object element.
+    virtual bool getFormValue(WebString&) { return false; }
+    virtual bool supportsKeyboardFocus() const { return false; }
+    virtual bool supportsEditCommands() const { return false; }
+
+    virtual bool canProcessDrag() const { return false; }
+
+    virtual void paint(WebCanvas*, const WebRect&) = 0;
+
+    // Coordinates are relative to the containing window.
+    virtual void updateGeometry(
+        const WebRect& frameRect, const WebRect& clipRect,
+        const WebVector<WebRect>& cutOutsRects, bool isVisible) = 0;
+
+    virtual void updateFocus(bool) = 0;
+    virtual void updateVisibility(bool) = 0;
+
+    virtual bool acceptsInputEvents() = 0;
+    virtual bool handleInputEvent(const WebInputEvent&, WebCursorInfo&) = 0;
+
+    virtual bool handleDragStatusUpdate(WebDragStatus, const WebDragData&, WebDragOperationsMask, const WebPoint& position, const WebPoint& screenPosition) { return false; }
+
+    virtual void didReceiveResponse(const WebURLResponse&) = 0;
+    virtual void didReceiveData(const char* data, int dataLength) = 0;
+    virtual void didFinishLoading() = 0;
+    virtual void didFailLoading(const WebURLError&) = 0;
+
+    // Called in response to WebPluginContainer::loadFrameRequest
+    virtual void didFinishLoadingFrameRequest(
+        const WebURL&, void* notifyData) = 0;
+    virtual void didFailLoadingFrameRequest(
+        const WebURL&, void* notifyData, const WebURLError&) = 0;
+
+    // Printing interface.
+    // Whether the plugin supports its own paginated print. The other print
+    // interface methods are called only if this method returns true.
+    virtual bool supportsPaginatedPrint() { return false; }
+    // Returns true if the printed content should not be scaled to
+    // the printer's printable area.
+    virtual bool isPrintScalingDisabled() { return false; }
+
+    // Sets up printing with the specified printParams. Returns the number of
+    // pages to be printed at these settings.
+    virtual int printBegin(const WebPrintParams& printParams) { return 0; }
+
+    // Prints the page specified by pageNumber (0-based index) into the supplied canvas.
+    virtual bool printPage(int pageNumber, WebCanvas* canvas) { return false; }
+    // Ends the print operation.
+    virtual void printEnd() { }
+
+    virtual bool hasSelection() const { return false; }
+    virtual WebString selectionAsText() const { return WebString(); }
+    virtual WebString selectionAsMarkup() const { return WebString(); }
+
+    virtual bool executeEditCommand(const WebString& name) { return false; }
+    virtual bool executeEditCommand(const WebString& name, const WebString& value) { return false; }
+
+    // If the given position is over a link, returns the absolute url.
+    // Otherwise an empty url is returned.
+    virtual WebURL linkAtPosition(const WebPoint& position) const { return WebURL(); }
+
+    // Used for zooming of full page plugins.
+    virtual void setZoomLevel(double level, bool textOnly) { }
+
+    // Find interface.
+    // Start a new search.  The plugin should search for a little bit at a time so that it
+    // doesn't block the thread in case of a large document.  The results, along with the
+    // find's identifier, should be sent asynchronously to WebFrameClient's reportFindInPage* methods.
+    // Returns true if the search started, or false if the plugin doesn't support search.
+    virtual bool startFind(const WebString& searchText, bool caseSensitive, int identifier) { return false; }
+    // Tells the plugin to jump forward or backward in the list of find results.
+    virtual void selectFindResult(bool forward) { }
+    // Tells the plugin that the user has stopped the find operation.
+    virtual void stopFind() { }
+
+    // View rotation types.
+    enum RotationType {
+        RotationType90Clockwise,
+        RotationType90Counterclockwise
+    };
+    // Whether the plugin can rotate the view of its content.
+    virtual bool canRotateView() { return false; }
+    // Rotates the plugin's view of its content.
+    virtual void rotateView(RotationType type) { }
+
+    virtual bool isPlaceholder() { return true; }
+
+protected:
+    ~WebPlugin() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPluginAction.h b/public/webpage/WebPluginAction.h
new file mode 100644
index 0000000..89f12ed
--- /dev/null
+++ b/public/webpage/WebPluginAction.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPluginAction_h
+#define WebPluginAction_h
+
+namespace WebKit {
+
+struct WebPluginAction {
+    enum Type {
+        Unknown,
+        Rotate90Clockwise,
+        Rotate90Counterclockwise
+    };
+
+    Type type;
+    bool enable;
+
+    WebPluginAction()
+        : type(Unknown), enable(false) { }
+    WebPluginAction(Type type, bool enable)
+        : type(type), enable(enable) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPluginContainer.h b/public/webpage/WebPluginContainer.h
new file mode 100644
index 0000000..0e25adf
--- /dev/null
+++ b/public/webpage/WebPluginContainer.h
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPluginContainer_h
+#define WebPluginContainer_h
+
+#include "../platform/WebCommon.h"
+
+struct NPObject;
+
+namespace WebKit {
+
+class WebElement;
+class WebPlugin;
+class WebString;
+class WebURL;
+class WebURLRequest;
+class WebLayer;
+struct WebPoint;
+struct WebRect;
+
+class WebPluginContainer {
+public:
+    enum TouchEventRequestType {
+        TouchEventRequestTypeNone,
+        TouchEventRequestTypeRaw,
+        TouchEventRequestTypeSynthesizedMouse,
+    };
+
+    // Returns the element containing this plugin.
+    virtual WebElement element() = 0;
+
+    virtual void invalidate() = 0;
+    virtual void invalidateRect(const WebRect&) = 0;
+    virtual void scrollRect(int dx, int dy, const WebRect&) = 0;
+
+    // Causes the container to report its current geometry via
+    // WebPlugin::updateGeometry.
+    virtual void reportGeometry() = 0;
+
+    // Allow the plugin to pass script objects to the browser. The container
+    // tracks ownership of script objects in order to allow browser references
+    // to them to be dropped when clearScriptObjects is called.
+    virtual void allowScriptObjects() = 0;
+
+    // Drop any references to script objects allocated by the plugin.
+    // These are objects derived from WebPlugin::scriptableObject.  This is
+    // called when the plugin is being destroyed or if it needs to be
+    // re-initialized.
+    virtual void clearScriptObjects() = 0;
+
+    // Returns the scriptable object associated with the DOM element
+    // containing the plugin.
+    virtual NPObject* scriptableObjectForElement() = 0;
+
+    // Executes a "javascript:" URL on behalf of the plugin in the context
+    // of the frame containing the plugin.  Returns the result of script
+    // execution, if any.
+    virtual WebString executeScriptURL(const WebURL&, bool popupsAllowed) = 0;
+
+    // Loads an URL in the specified frame (or the frame containing this
+    // plugin if target is empty).  If notifyNeeded is true, then upon
+    // completion, WebPlugin::didFinishLoadingFrameRequest is called if the
+    // load was successful or WebPlugin::didFailLoadingFrameRequest is
+    // called if the load failed.  The given notifyData is passed along to
+    // the callback.
+    virtual void loadFrameRequest(
+        const WebURLRequest&, const WebString& target, bool notifyNeeded, void* notifyData) = 0;
+
+    // Notifies that the zoom level has changed.
+    // Note, this does NOT affect pageScaleFactor or pageZoomFactor
+    virtual void zoomLevelChanged(double zoomLevel) = 0;
+
+    // Determines whether the given rectangle in this plugin is above all other
+    // content. The rectangle is in the plugin's coordinate system.
+    virtual bool isRectTopmost(const WebRect&) = 0;
+
+    // Notifies when the plugin changes the kind of touch-events it accepts.
+    virtual void requestTouchEventType(TouchEventRequestType) = 0;
+
+    // Notifies when the plugin starts/stops accepting wheel events. Without
+    // calling the function with true, the container might not always able to
+    // receive wheel events in some cases (such as when threaded compositing
+    // is in use but a scroll bar is not in use).
+    virtual void setWantsWheelEvents(bool) = 0;
+
+    // Converts view's window coordinates to plugin's local coordinates.
+    virtual WebPoint windowToLocalPoint(const WebPoint&) = 0;
+
+    // Converts plugin's local coordinate to view's window coordinates.
+    virtual WebPoint localToWindowPoint(const WebPoint&) = 0;
+
+    virtual WebPlugin* plugin() = 0;
+    virtual void setPlugin(WebPlugin*) = 0;
+
+    virtual float deviceScaleFactor() = 0;
+    virtual float pageScaleFactor() = 0;
+    virtual float pageZoomFactor() = 0;
+
+    // Sets the layer representing the plugin for compositing. The
+    // WebPluginContainer does *not* take ownership.
+    virtual void setWebLayer(WebLayer*) = 0;
+
+protected:
+    ~WebPluginContainer() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPluginDocument.h b/public/webpage/WebPluginDocument.h
new file mode 100644
index 0000000..d7aa0d2
--- /dev/null
+++ b/public/webpage/WebPluginDocument.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPluginDocument_h
+#define WebPluginDocument_h
+
+#include "WebDocument.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class PluginDocument; }
+#endif
+
+namespace WebKit {
+class WebPlugin;
+
+// Wraps a WebDocument for full page plugins.
+class WebPluginDocument : public WebDocument {
+public:
+    WebPluginDocument() { }
+    WebPluginDocument(const WebPluginDocument& e) : WebDocument(e) { }
+
+    WebPluginDocument& operator=(const WebPluginDocument& e)
+    {
+        WebNode::assign(e);
+        return *this;
+    }
+    void assign(const WebPluginDocument& d) { WebNode::assign(d); }
+
+    WEBKIT_EXPORT WebPlugin* plugin();
+
+#if WEBKIT_IMPLEMENTATION
+    WebPluginDocument(const WTF::PassRefPtr<WebCore::PluginDocument>&);
+    WebPluginDocument& operator=(const WTF::PassRefPtr<WebCore::PluginDocument>&);
+    operator WTF::PassRefPtr<WebCore::PluginDocument>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPluginListBuilder.h b/public/webpage/WebPluginListBuilder.h
new file mode 100644
index 0000000..6c0614d
--- /dev/null
+++ b/public/webpage/WebPluginListBuilder.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebPluginListBuilder.h"
diff --git a/public/webpage/WebPluginParams.h b/public/webpage/WebPluginParams.h
new file mode 100644
index 0000000..af92acf
--- /dev/null
+++ b/public/webpage/WebPluginParams.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPluginParams_h
+#define WebPluginParams_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+
+struct WebPluginParams {
+    WebURL url;
+    WebString mimeType;
+    WebVector<WebString> attributeNames;
+    WebVector<WebString> attributeValues;
+    bool loadManually;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPluginScrollbar.h b/public/webpage/WebPluginScrollbar.h
new file mode 100644
index 0000000..7715b45
--- /dev/null
+++ b/public/webpage/WebPluginScrollbar.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012 Google 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 WebPluginScrollbar_h
+#define WebPluginScrollbar_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebScrollbar.h"
+
+namespace WebKit {
+
+class WebInputEvent;
+class WebPluginContainer;
+class WebPluginScrollbarClient;
+struct WebRect;
+
+class WebPluginScrollbar : public WebScrollbar {
+public:
+    // Creates a WebPluginScrollbar for use by a plugin. The plugin container and
+    // client are guaranteed to outlive this object.
+    WEBKIT_EXPORT static WebPluginScrollbar* createForPlugin(WebScrollbar::Orientation,
+                                                             WebPluginContainer*,
+                                                             WebPluginScrollbarClient*);
+
+    virtual ~WebPluginScrollbar() { }
+
+    // Gets the thickness of the scrollbar in pixels.
+    WEBKIT_EXPORT static int defaultThickness();
+
+    // Sets the rectangle of the scrollbar.
+    virtual void setLocation(const WebRect&) = 0;
+
+    // Sets the size of the scrollable region in pixels, i.e. if a document is
+    // 800x10000 pixels and the viewport is 1000x1000 pixels, then setLocation
+    // for the vertical scrollbar would have passed in a rectangle like:
+    //            (800 - defaultThickness(), 0) (defaultThickness() x 10000)
+    // and setDocumentSize(10000)
+    virtual void setDocumentSize(int) = 0;
+
+    // Sets the current value.
+    virtual void setValue(int position) = 0;
+
+    // Scroll back or forward with the given granularity.
+    virtual void scroll(ScrollDirection, ScrollGranularity, float multiplier) = 0;
+
+    // Paint the given rectangle.
+    virtual void paint(WebCanvas*, const WebRect&) = 0;
+
+    // Returns true iff the given event was used.
+    virtual bool handleInputEvent(const WebInputEvent&) = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPluginScrollbarClient.h b/public/webpage/WebPluginScrollbarClient.h
new file mode 100644
index 0000000..bc5a124
--- /dev/null
+++ b/public/webpage/WebPluginScrollbarClient.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Google 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 WebPluginScrollbarClient_h
+#define WebPluginScrollbarClient_h
+
+namespace WebKit {
+
+class WebPluginScrollbar;
+struct WebRect;
+template <typename T> class WebVector;
+
+class WebPluginScrollbarClient {
+public:
+    virtual void valueChanged(WebPluginScrollbar*) = 0;
+    virtual void overlayChanged(WebPluginScrollbar*) = 0;
+    virtual void invalidateScrollbarRect(WebPluginScrollbar*, const WebRect&) = 0;
+    virtual void getTickmarks(WebPluginScrollbar*, WebVector<WebRect>*) const = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPopupMenu.h b/public/webpage/WebPopupMenu.h
new file mode 100644
index 0000000..2acd53e
--- /dev/null
+++ b/public/webpage/WebPopupMenu.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPopupMenu_h
+#define WebPopupMenu_h
+
+#include "../platform/WebCommon.h"
+#include "WebWidget.h"
+
+namespace WebKit {
+
+class WebWidgetClient;
+
+class WebPopupMenu : public WebWidget {
+public:
+    WEBKIT_EXPORT static WebPopupMenu* create(WebWidgetClient*);
+
+    // Sets the minimum height of a popup listbox row.
+    WEBKIT_EXPORT static void setMinimumRowHeight(int);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPopupMenuInfo.h b/public/webpage/WebPopupMenuInfo.h
new file mode 100644
index 0000000..45339ac
--- /dev/null
+++ b/public/webpage/WebPopupMenuInfo.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPopupMenuInfo_h
+#define WebPopupMenuInfo_h
+
+#include "../platform/WebVector.h"
+#include "WebMenuItemInfo.h"
+
+namespace WebKit {
+
+// Describes the contents of a popup menu.
+struct WebPopupMenuInfo {
+    int itemHeight;
+    int itemFontSize;
+    int selectedIndex;
+    WebVector<WebMenuItemInfo> items;
+    bool rightAligned;
+    bool allowMultipleSelection;
+};
+
+}
+
+#endif
diff --git a/public/webpage/WebPopupType.h b/public/webpage/WebPopupType.h
new file mode 100644
index 0000000..1a84dd6
--- /dev/null
+++ b/public/webpage/WebPopupType.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPopupType_h
+#define WebPopupType_h
+
+namespace WebKit {
+
+enum WebPopupType {
+    WebPopupTypeNone, // Not a popup.
+    WebPopupTypeSelect, // An HTML select (combo-box) popup.
+    WebPopupTypeSuggestion, // An autofill/autocomplete popup.
+    WebPopupTypePage, // An HTML-capable popup.
+    WebPopupTypeHelperPlugin, // An off-screen helper plugin.
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPrerendererClient.h b/public/webpage/WebPrerendererClient.h
new file mode 100644
index 0000000..3f73fed
--- /dev/null
+++ b/public/webpage/WebPrerendererClient.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPrerendererClient_h
+#define WebPrerendererClient_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebPrerender;
+
+class WebPrerendererClient {
+public:
+    virtual void willAddPrerender(WebPrerender*) = 0;
+};
+
+} // namespace WebPrerendererClient_h
+
+#endif // WebPrerendererClient_h
diff --git a/public/webpage/WebPrintParams.h b/public/webpage/WebPrintParams.h
new file mode 100644
index 0000000..d79260a
--- /dev/null
+++ b/public/webpage/WebPrintParams.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPrintParams_h
+#define WebPrintParams_h
+
+#include "../platform/WebRect.h"
+#include "../platform/WebSize.h"
+#include "WebPrintScalingOption.h"
+
+namespace WebKit {
+
+struct WebPrintParams {
+    // Specifies printable content rect in points (a point is 1/72 of an inch).
+    WebRect printContentArea;
+
+    // Specifies the selected printer default printable area details in
+    // points.
+    WebRect printableArea;
+
+    // Specifies the selected printer default paper size in points.
+    WebSize paperSize;
+
+    // Specifies user selected DPI for printing.
+    int printerDPI;
+
+    // Specifies whether to reduce/enlarge/retain the print contents to fit the
+    // printable area. (This is used only by plugin printing).
+    WebPrintScalingOption printScalingOption;
+
+    WebPrintParams()
+        : printerDPI(72)
+        , printScalingOption(WebPrintScalingOptionFitToPrintableArea) { }
+
+    WebPrintParams(const WebSize& paperSize)
+        : printContentArea(WebRect(0, 0, paperSize.width, paperSize.height))
+        , printableArea(WebRect(0, 0, paperSize.width, paperSize.height))
+        , paperSize(paperSize)
+        , printerDPI(72)
+        , printScalingOption(WebPrintScalingOptionSourceSize) { }
+
+    WebPrintParams(const WebRect& printContentArea, const WebRect& printableArea, const WebSize& paperSize, int printerDPI, WebPrintScalingOption printScalingOption)
+        : printContentArea(printContentArea)
+        , printableArea(printableArea)
+        , paperSize(paperSize)
+        , printerDPI(printerDPI)
+        , printScalingOption(printScalingOption) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebPrintScalingOption.h b/public/webpage/WebPrintScalingOption.h
new file mode 100644
index 0000000..95dbb89
--- /dev/null
+++ b/public/webpage/WebPrintScalingOption.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebPrintScalingOption_h
+#define WebPrintScalingOption_h
+
+namespace WebKit {
+
+enum WebPrintScalingOption {
+    WebPrintScalingOptionNone, // Prints the upper left of a page without scaling. Crop the page contents that don't fit on the paper.
+    WebPrintScalingOptionFitToPrintableArea, // Reduces or enlarges each page to fit the printable area of the selected printer paper size.
+    WebPrintScalingOptionSourceSize, // Print output page size is same as the actual source page size. Do not scale/center/fit to printable area.
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebRange.h b/public/webpage/WebRange.h
new file mode 100644
index 0000000..18cfc54
--- /dev/null
+++ b/public/webpage/WebRange.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebRange_h
+#define WebRange_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebVector.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class Range; }
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+
+struct WebFloatQuad;
+class WebFrame;
+class WebNode;
+class WebRangePrivate;
+class WebString;
+
+// Provides readonly access to some properties of a DOM range.
+class WebRange {
+public:
+    ~WebRange() { reset(); }
+
+    WebRange() : m_private(0) { }
+    WebRange(const WebRange& r) : m_private(0) { assign(r); }
+    WebRange& operator=(const WebRange& r)
+    {
+        assign(r);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebRange&);
+
+    bool isNull() const { return !m_private; }
+
+    WEBKIT_EXPORT int startOffset() const;
+    WEBKIT_EXPORT int endOffset() const;
+    WEBKIT_EXPORT WebNode startContainer(int& exceptionCode) const;
+    WEBKIT_EXPORT WebNode endContainer(int& exceptionCode) const;
+
+    WEBKIT_EXPORT WebString toHTMLText() const;
+    WEBKIT_EXPORT WebString toPlainText() const;
+
+    WEBKIT_EXPORT WebRange expandedToParagraph() const;
+
+    WEBKIT_EXPORT static WebRange fromDocumentRange(WebFrame*, int start, int length);
+
+    WEBKIT_EXPORT WebVector<WebFloatQuad> textQuads() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebRange(const WTF::PassRefPtr<WebCore::Range>&);
+    WebRange& operator=(const WTF::PassRefPtr<WebCore::Range>&);
+    operator WTF::PassRefPtr<WebCore::Range>() const;
+#endif
+
+private:
+    void assign(WebRangePrivate*);
+    WebRangePrivate* m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebRuntimeFeatures.h b/public/webpage/WebRuntimeFeatures.h
new file mode 100644
index 0000000..fb91764
--- /dev/null
+++ b/public/webpage/WebRuntimeFeatures.h
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebRuntimeFeatures_h
+#define WebRuntimeFeatures_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+// This class is used to enable runtime features of Blink.
+// All features are disabled by default.
+// Most clients should call enableStableFeatures() to enable
+// features Blink has made API commitments to.
+class WebRuntimeFeatures {
+public:
+    WEBKIT_EXPORT static void enableStableFeatures(bool);
+    WEBKIT_EXPORT static void enableExperimentalFeatures(bool);
+    WEBKIT_EXPORT static void enableTestOnlyFeatures(bool);
+
+    // FIXME: Delete after removing all callers in Content.
+    static void enableFullScreenAPI(bool enable) { enableFullscreen(enable); }
+    static void enableIndexedDatabase(bool enable) { enableIndexedDB(enable); }
+
+    WEBKIT_EXPORT static void enableApplicationCache(bool);
+    WEBKIT_EXPORT static bool isApplicationCacheEnabled();
+
+    WEBKIT_EXPORT static void enableCanvasPath(bool);
+    WEBKIT_EXPORT static bool isCanvasPathEnabled();
+
+    WEBKIT_EXPORT static void enableCSSCompositing(bool);
+    WEBKIT_EXPORT static bool isCSSCompositingEnabled();
+
+    WEBKIT_EXPORT static void enableCSSExclusions(bool);
+    WEBKIT_EXPORT static bool isCSSExclusionsEnabled();
+
+    WEBKIT_EXPORT static void enableCSSRegions(bool);
+    WEBKIT_EXPORT static bool isCSSRegionsEnabled();
+
+    WEBKIT_EXPORT static void enableCSSTouchAction(bool);
+    WEBKIT_EXPORT static bool isCSSTouchActionEnabled();
+
+    WEBKIT_EXPORT static void enableCustomDOMElements(bool);
+    WEBKIT_EXPORT static bool isCustomDOMElementsEnabled();
+
+    WEBKIT_EXPORT static void enableDatabase(bool);
+    WEBKIT_EXPORT static bool isDatabaseEnabled();
+
+    WEBKIT_EXPORT static void enableDeviceMotion(bool);
+    WEBKIT_EXPORT static bool isDeviceMotionEnabled();
+
+    WEBKIT_EXPORT static void enableDeviceOrientation(bool);
+    WEBKIT_EXPORT static bool isDeviceOrientationEnabled();
+
+    WEBKIT_EXPORT static void enableDialogElement(bool);
+    WEBKIT_EXPORT static bool isDialogElementEnabled();
+
+    WEBKIT_EXPORT static void enableDirectoryUpload(bool);
+    WEBKIT_EXPORT static bool isDirectoryUploadEnabled();
+
+    WEBKIT_EXPORT static void enableEncryptedMedia(bool);
+    WEBKIT_EXPORT static bool isEncryptedMediaEnabled();
+
+    WEBKIT_EXPORT static void enableLegacyEncryptedMedia(bool);
+    WEBKIT_EXPORT static bool isLegacyEncryptedMediaEnabled();
+
+    WEBKIT_EXPORT static void enableExperimentalCanvasFeatures(bool);
+    WEBKIT_EXPORT static bool isExperimentalCanvasFeaturesEnabled();
+
+    WEBKIT_EXPORT static void enableExperimentalContentSecurityPolicyFeatures(bool);
+    WEBKIT_EXPORT static bool isExperimentalContentSecurityPolicyFeaturesEnabled();
+
+    WEBKIT_EXPORT static void enableExperimentalShadowDOM(bool);
+    WEBKIT_EXPORT static bool isExperimentalShadowDOMEnabled();
+
+    WEBKIT_EXPORT static void enableExperimentalWebSocket(bool);
+    WEBKIT_EXPORT static bool isExperimentalWebSocketEnabled();
+
+    WEBKIT_EXPORT static void enableFileSystem(bool);
+    WEBKIT_EXPORT static bool isFileSystemEnabled();
+
+    WEBKIT_EXPORT static void enableFontLoadEvents(bool);
+    WEBKIT_EXPORT static bool isFontLoadEventsEnabled();
+
+    WEBKIT_EXPORT static void enableFullscreen(bool);
+    WEBKIT_EXPORT static bool isFullscreenEnabled();
+
+    WEBKIT_EXPORT static void enableGamepad(bool);
+    WEBKIT_EXPORT static bool isGamepadEnabled();
+
+    WEBKIT_EXPORT static void enableGeolocation(bool);
+    WEBKIT_EXPORT static bool isGeolocationEnabled();
+
+    WEBKIT_EXPORT static void enableIMEAPI(bool);
+    WEBKIT_EXPORT static bool isIMEAPIEnabled();
+
+    WEBKIT_EXPORT static void enableIndexedDB(bool);
+    WEBKIT_EXPORT static bool isIndexedDBEnabled();
+
+    WEBKIT_EXPORT static void enableInputTypeWeek(bool);
+    WEBKIT_EXPORT static bool isInputTypeWeekEnabled();
+
+    WEBKIT_EXPORT static void enableJavaScriptI18NAPI(bool);
+    WEBKIT_EXPORT static bool isJavaScriptI18NAPIEnabled();
+
+    WEBKIT_EXPORT static void enableLazyLayout(bool);
+    WEBKIT_EXPORT static bool isLazyLayoutEnabled();
+
+    WEBKIT_EXPORT static void enableLocalStorage(bool);
+    WEBKIT_EXPORT static bool isLocalStorageEnabled();
+
+    WEBKIT_EXPORT static void enableMediaPlayer(bool);
+    WEBKIT_EXPORT static bool isMediaPlayerEnabled();
+
+    WEBKIT_EXPORT static void enableMediaSource(bool);
+    WEBKIT_EXPORT static bool isMediaSourceEnabled();
+
+    WEBKIT_EXPORT static void enableWebKitMediaSource(bool);
+    WEBKIT_EXPORT static bool isWebKitMediaSourceEnabled();
+
+    WEBKIT_EXPORT static void enableMediaStream(bool);
+    WEBKIT_EXPORT static bool isMediaStreamEnabled();
+
+    WEBKIT_EXPORT static void enableNotifications(bool);
+    WEBKIT_EXPORT static bool isNotificationsEnabled();
+
+    WEBKIT_EXPORT static void enablePagePopup(bool);
+    WEBKIT_EXPORT static bool isPagePopupEnabled();
+
+    WEBKIT_EXPORT static void enableParseSVGAsHTML(bool);
+    WEBKIT_EXPORT static bool isParseSVGAsHTMLEnabled();
+
+    WEBKIT_EXPORT static void enablePeerConnection(bool);
+    WEBKIT_EXPORT static bool isPeerConnectionEnabled();
+
+    WEBKIT_EXPORT static void enableQuota(bool);
+    WEBKIT_EXPORT static bool isQuotaEnabled();
+
+    WEBKIT_EXPORT static void enableRequestAutocomplete(bool);
+    WEBKIT_EXPORT static bool isRequestAutocompleteEnabled();
+
+    WEBKIT_EXPORT static void enableScriptedSpeech(bool);
+    WEBKIT_EXPORT static bool isScriptedSpeechEnabled();
+
+    WEBKIT_EXPORT static void enableSeamlessIFrames(bool);
+    WEBKIT_EXPORT static bool isSeamlessIFramesEnabled();
+
+    WEBKIT_EXPORT static void enableSessionStorage(bool);
+    WEBKIT_EXPORT static bool isSessionStorageEnabled();
+
+    WEBKIT_EXPORT static void enableSpeechInput(bool);
+    WEBKIT_EXPORT static bool isSpeechInputEnabled();
+
+    WEBKIT_EXPORT static void enableSpeechSynthesis(bool);
+    WEBKIT_EXPORT static bool isSpeechSynthesisEnabled();
+
+    WEBKIT_EXPORT static void enableStyleScoped(bool);
+    WEBKIT_EXPORT static bool isStyleScopedEnabled();
+
+    WEBKIT_EXPORT static void enableTouch(bool);
+    WEBKIT_EXPORT static bool isTouchEnabled();
+
+    WEBKIT_EXPORT static void enableVideoTrack(bool);
+    WEBKIT_EXPORT static bool isVideoTrackEnabled();
+
+    WEBKIT_EXPORT static void enableWebAudio(bool);
+    WEBKIT_EXPORT static bool isWebAudioEnabled();
+
+    WEBKIT_EXPORT static void enableWebGLDraftExtensions(bool);
+    WEBKIT_EXPORT static bool isWebGLDraftExtensionsEnabled();
+
+    WEBKIT_EXPORT static void enableWebMIDI(bool);
+    WEBKIT_EXPORT static bool isWebMIDIEnabled();
+
+    WEBKIT_EXPORT static void enableWebPInAcceptHeader(bool);
+    WEBKIT_EXPORT static bool isWebPInAcceptHeaderEnabled();
+
+    WEBKIT_EXPORT static void enableDataListElement(bool);
+    WEBKIT_EXPORT static bool isDataListElementEnabled();
+
+    WEBKIT_EXPORT static void enableInputTypeColor(bool);
+    WEBKIT_EXPORT static bool isInputTypeColorEnabled();
+
+private:
+    WebRuntimeFeatures();
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebScopedMicrotaskSuppression.h b/public/webpage/WebScopedMicrotaskSuppression.h
new file mode 100644
index 0000000..21562bd
--- /dev/null
+++ b/public/webpage/WebScopedMicrotaskSuppression.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScopedMicrotaskSuppression_h
+#define WebScopedMicrotaskSuppression_h
+
+#include "../platform/WebPrivateOwnPtr.h"
+
+namespace WebKit {
+
+// This class wraps V8RecursionScope::BypassMicrotaskCheckpoint. Please
+// see V8RecursionScope.h for full usage. Short story: Embedder calls into
+// script contexts which also host page script must do one of two things:
+//
+//   1. If the call may cause any page/author script to run, it must be
+//      captured for pre/post work (e.g. inspector instrumentation/microtask
+//      delivery) and thus be invoked through WebFrame (e.g. executeScript*,
+//      callFunction*).
+//   2. If the call will not cause any page/author script to run, the call
+//      should be made directly via the v8 context, but the callsite must be
+//      accompanied by a stack allocated WebScopedMicrotaskSuppression, e.g.:
+//
+//        ...
+//        {
+//            WebKit::WebScopedMicrotaskSuppression suppression;
+//            func->Call(global, argv, args);
+//        }
+//        ...
+//
+class WebScopedMicrotaskSuppression {
+public:
+    WebScopedMicrotaskSuppression() { initialize(); }
+    ~WebScopedMicrotaskSuppression() { reset(); }
+
+private:
+    WEBKIT_EXPORT void initialize();
+    WEBKIT_EXPORT void reset();
+
+#ifndef NDEBUG
+    class Impl;
+    WebPrivateOwnPtr<Impl> m_impl;
+#endif
+};
+
+} // WebKit
+
+#endif
diff --git a/public/webpage/WebScopedUserGesture.h b/public/webpage/WebScopedUserGesture.h
new file mode 100644
index 0000000..0401dbc
--- /dev/null
+++ b/public/webpage/WebScopedUserGesture.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScopedUserGesture_h
+#define WebScopedUserGesture_h
+
+#include "../platform/WebPrivateOwnPtr.h"
+
+namespace WebCore {
+class UserGestureIndicator;
+}
+
+namespace WebKit {
+
+class WebUserGestureToken;
+
+// An instance of this class, while kept alive, will indicate that we are in
+// the context of a known user gesture. To use, create one, perform whatever
+// actions were done under color of a known user gesture, and then delete it.
+// Usually this will be done on the stack.
+//
+// SECURITY WARNING: Do not create several instances of this class for the same
+// user gesture. Doing so might enable malicious code to work around certain
+// restrictions such as opening multiple windows.
+// Instead, obtain the current WebUserGestureToken from the
+// WebUserGestureIndicator, and use this token to create a
+// WebScopedUserGesture. If the token was alrady consumed, the new
+// WebScopedUserGesture will not indicate that we are in the context of a user
+// gesture.
+class WebScopedUserGesture {
+public:
+    explicit WebScopedUserGesture(const WebUserGestureToken& token) { initializeWithToken(token); }
+    WebScopedUserGesture() { initialize(); }
+    ~WebScopedUserGesture() { reset(); }
+
+private:
+    WEBKIT_EXPORT void initialize();
+    WEBKIT_EXPORT void initializeWithToken(const WebUserGestureToken&);
+    WEBKIT_EXPORT void reset();
+
+    WebPrivateOwnPtr<WebCore::UserGestureIndicator> m_indicator;
+};
+
+} // namespace WebKit
+
+#endif // WebScopedUserGesture_h
diff --git a/public/webpage/WebScreenInfo.h b/public/webpage/WebScreenInfo.h
new file mode 100644
index 0000000..136f139
--- /dev/null
+++ b/public/webpage/WebScreenInfo.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebScreenInfo.h"
diff --git a/public/webpage/WebScriptController.h b/public/webpage/WebScriptController.h
new file mode 100644
index 0000000..b5a2ec3
--- /dev/null
+++ b/public/webpage/WebScriptController.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScriptController_h
+#define WebScriptController_h
+
+#include "../platform/WebCommon.h"
+
+namespace v8 {
+class Extension;
+}
+
+namespace WebKit {
+
+class WebScriptController {
+public:
+    // Registers a v8 extension to be available on webpages. Will only affect
+    // v8 contexts initialized after this call. Takes ownership of the
+    // v8::Extension object passed.
+    WEBKIT_EXPORT static void registerExtension(v8::Extension*);
+
+    // Enables special settings which are only applicable if V8 is executed
+    // in the single thread which must be the main thread.
+    // FIXME: make a try to dynamically detect when this condition is broken
+    // and automatically switch off single thread mode.
+    WEBKIT_EXPORT static void enableV8SingleThreadMode();
+
+    // Process any pending JavaScript console messages.
+    WEBKIT_EXPORT static void flushConsoleMessages();
+
+private:
+    WebScriptController();
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebScriptSource.h b/public/webpage/WebScriptSource.h
new file mode 100644
index 0000000..baf082c
--- /dev/null
+++ b/public/webpage/WebScriptSource.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScriptSource_h
+#define WebScriptSource_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+
+namespace WebKit {
+
+struct WebScriptSource {
+    WebString code;
+    WebURL url;
+    int startLine;
+
+    WebScriptSource(const WebString& code)
+        : code(code), startLine(1) { }
+    WebScriptSource(const WebString& code, const WebURL& url)
+        : code(code), url(url), startLine(1) { }
+    WebScriptSource(const WebString& code, const WebURL& url, int startLine)
+        : code(code), url(url), startLine(startLine) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSearchableFormData.h b/public/webpage/WebSearchableFormData.h
new file mode 100644
index 0000000..041e494
--- /dev/null
+++ b/public/webpage/WebSearchableFormData.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSearchableFormData_h
+#define WebSearchableFormData_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebURL.h"
+#include "WebInputElement.h"
+
+namespace WebKit {
+class WebFormElement;
+
+// SearchableFormData encapsulates a URL and encoding of an INPUT field that
+// corresponds to a searchable form request.
+class WebSearchableFormData {
+public:
+    // If the provided form is suitable for automated searching, isValid()
+    // will return false.
+    WEBKIT_EXPORT WebSearchableFormData(const WebFormElement&, const WebInputElement& selectedInputElement = WebInputElement());
+
+    bool isValid() { return m_url.isValid(); }
+
+    // URL for the searchable form request.
+    const WebURL& url() const
+    {
+        return m_url;
+    }
+
+    // Encoding used to encode the form parameters; never empty.
+    const WebString& encoding() const
+    {
+        return m_encoding;
+    }
+
+private:
+    WebURL m_url;
+    WebString m_encoding;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSecurityOrigin.h b/public/webpage/WebSecurityOrigin.h
new file mode 100644
index 0000000..b511c8b
--- /dev/null
+++ b/public/webpage/WebSecurityOrigin.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSecurityOrigin_h
+#define WebSecurityOrigin_h
+
+#include "../platform/WebCommon.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class SecurityOrigin; }
+namespace WTF { template <typename T> class PassRefPtr; }
+#endif
+
+namespace WebKit {
+
+class WebSecurityOriginPrivate;
+class WebString;
+class WebURL;
+
+class WebSecurityOrigin {
+public:
+    ~WebSecurityOrigin() { reset(); }
+
+    WebSecurityOrigin() : m_private(0) { }
+    WebSecurityOrigin(const WebSecurityOrigin& s) : m_private(0) { assign(s); }
+    WebSecurityOrigin& operator=(const WebSecurityOrigin& s)
+    {
+        assign(s);
+        return *this;
+    }
+
+    WEBKIT_EXPORT static WebSecurityOrigin createFromDatabaseIdentifier(const WebString& databaseIdentifier);
+    WEBKIT_EXPORT static WebSecurityOrigin createFromString(const WebString&);
+    WEBKIT_EXPORT static WebSecurityOrigin create(const WebURL&);
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebSecurityOrigin&);
+
+    bool isNull() const { return !m_private; }
+
+    WEBKIT_EXPORT WebString protocol() const;
+    WEBKIT_EXPORT WebString host() const;
+    WEBKIT_EXPORT unsigned short port() const;
+
+    // A unique WebSecurityOrigin is the least privileged WebSecurityOrigin.
+    WEBKIT_EXPORT bool isUnique() const;
+
+    // Returns true if this WebSecurityOrigin can script objects in the given
+    // SecurityOrigin. For example, call this function before allowing
+    // script from one security origin to read or write objects from
+    // another SecurityOrigin.
+    WEBKIT_EXPORT bool canAccess(const WebSecurityOrigin&) const;
+
+    // Returns true if this WebSecurityOrigin can read content retrieved from
+    // the given URL. For example, call this function before allowing script
+    // from a given security origin to receive contents from a given URL.
+    WEBKIT_EXPORT bool canRequest(const WebURL&) const;
+
+    // Returns a string representation of the WebSecurityOrigin.  The empty
+    // WebSecurityOrigin is represented by "null".  The representation of a
+    // non-empty WebSecurityOrigin resembles a standard URL.
+    WEBKIT_EXPORT WebString toString() const;
+
+    // Returns a string representation of this WebSecurityOrigin that can
+    // be used as a file.  Should be used in storage APIs only.
+    WEBKIT_EXPORT WebString databaseIdentifier() const;
+
+    // Returns true if this WebSecurityOrigin can access usernames and 
+    // passwords stored in password manager.
+    WEBKIT_EXPORT bool canAccessPasswordManager() const;
+
+    // Allows this WebSecurityOrigin access to local resources.
+    WEBKIT_EXPORT void grantLoadLocalResources() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebSecurityOrigin(const WTF::PassRefPtr<WebCore::SecurityOrigin>&);
+    WebSecurityOrigin& operator=(const WTF::PassRefPtr<WebCore::SecurityOrigin>&);
+    operator WTF::PassRefPtr<WebCore::SecurityOrigin>() const;
+    WebCore::SecurityOrigin* get() const;
+#endif
+
+private:
+    void assign(WebSecurityOriginPrivate*);
+    WebSecurityOriginPrivate* m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSecurityPolicy.h b/public/webpage/WebSecurityPolicy.h
new file mode 100644
index 0000000..dafd00e
--- /dev/null
+++ b/public/webpage/WebSecurityPolicy.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSecurityPolicy_h
+#define WebSecurityPolicy_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebReferrerPolicy.h"
+
+namespace WebKit {
+
+class WebString;
+class WebURL;
+
+class WebSecurityPolicy {
+public:
+    // Registers a URL scheme to be treated as a local scheme (i.e., with the
+    // same security rules as those applied to "file" URLs). This means that
+    // normal pages cannot link to or access URLs of this scheme.
+    WEBKIT_EXPORT static void registerURLSchemeAsLocal(const WebString&);
+
+    // Registers a URL scheme to be treated as a noAccess scheme. This means
+    // that pages loaded with this URL scheme cannot access pages loaded with
+    // any other URL scheme.
+    WEBKIT_EXPORT static void registerURLSchemeAsNoAccess(const WebString&);
+
+    // Registers a URL scheme to be treated as display-isolated. This means
+    // that pages cannot display these URLs unless they are from the same
+    // scheme. For example, pages in other origin cannot create iframes or
+    // hyperlinks to URLs with the scheme.
+    WEBKIT_EXPORT static void registerURLSchemeAsDisplayIsolated(const WebString&);
+
+    // Registers a URL scheme to not generate mixed content warnings when
+    // included by an HTTPS page.
+    WEBKIT_EXPORT static void registerURLSchemeAsSecure(const WebString&);
+
+    // Registers a non-HTTP URL scheme which can be sent CORS requests.
+    WEBKIT_EXPORT static void registerURLSchemeAsCORSEnabled(const WebString&);
+
+    // Registers a URL scheme whose resources can be loaded regardless of a page's Content Security Policy.
+    WEBKIT_EXPORT static void registerURLSchemeAsBypassingContentSecurityPolicy(const WebString&);
+
+    // Registers a URL scheme as strictly empty documents, allowing them to
+    // commit synchronously.
+    WEBKIT_EXPORT static void registerURLSchemeAsEmptyDocument(const WebString&);
+
+    // Support for whitelisting access to origins beyond the same-origin policy.
+    WEBKIT_EXPORT static void addOriginAccessWhitelistEntry(
+        const WebURL& sourceOrigin, const WebString& destinationProtocol,
+        const WebString& destinationHost, bool allowDestinationSubdomains);
+    WEBKIT_EXPORT static void removeOriginAccessWhitelistEntry(
+        const WebURL& sourceOrigin, const WebString& destinationProtocol,
+        const WebString& destinationHost, bool allowDestinationSubdomains);
+    WEBKIT_EXPORT static void resetOriginAccessWhitelists();
+
+    // Returns whether the url should be allowed to see the referrer
+    // based on their respective protocols.
+    // FIXME: remove this function once the chromium side has landed.
+    WEBKIT_EXPORT static bool shouldHideReferrer(const WebURL&, const WebString& referrer);
+
+    // Returns the referrer modified according to the referrer policy for a
+    // navigation to a given URL. If the referrer returned is empty, the
+    // referrer header should be omitted.
+    WEBKIT_EXPORT static WebString generateReferrerHeader(WebReferrerPolicy, const WebURL&, const WebString& referrer);
+
+    // Registers an URL scheme to not allow manipulation of the loaded page
+    // by bookmarklets or javascript: URLs typed in the omnibox.
+    WEBKIT_EXPORT static void registerURLSchemeAsNotAllowingJavascriptURLs(const WebString&);
+
+private:
+    WebSecurityPolicy();
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSelectElement.h b/public/webpage/WebSelectElement.h
new file mode 100644
index 0000000..d3fc9b8
--- /dev/null
+++ b/public/webpage/WebSelectElement.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSelectElement_h
+#define WebSelectElement_h
+
+#include "../platform/WebVector.h"
+#include "WebFormControlElement.h"
+#include "WebOptionElement.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class HTMLSelectElement; }
+#endif
+
+namespace WebKit {
+
+// Provides readonly access to some properties of a DOM select element node.
+class WebSelectElement : public WebFormControlElement {
+public:
+    WebSelectElement() : WebFormControlElement() { }
+    WebSelectElement(const WebSelectElement& element) : WebFormControlElement(element) { }
+
+    WebSelectElement& operator=(const WebSelectElement& element)
+    {
+        WebFormControlElement::assign(element);
+        return *this;
+    }
+    void assign(const WebSelectElement& element) { WebFormControlElement::assign(element); }
+
+    WEBKIT_EXPORT void setValue(const WebString&);
+    WEBKIT_EXPORT WebString value() const;
+    WEBKIT_EXPORT WebVector<WebElement> listItems() const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebSelectElement(const WTF::PassRefPtr<WebCore::HTMLSelectElement>&);
+    WebSelectElement& operator=(const WTF::PassRefPtr<WebCore::HTMLSelectElement>&);
+    operator WTF::PassRefPtr<WebCore::HTMLSelectElement>() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSerializedScriptValue.h b/public/webpage/WebSerializedScriptValue.h
new file mode 100644
index 0000000..0958318
--- /dev/null
+++ b/public/webpage/WebSerializedScriptValue.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSerializedScriptValue_h
+#define WebSerializedScriptValue_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace WebCore { class SerializedScriptValue; }
+
+namespace v8 {
+class Value;
+template <class T> class Handle;
+}
+
+namespace WebKit {
+class WebString;
+
+// FIXME: Should this class be in platform?
+class WebSerializedScriptValue {
+public:
+    ~WebSerializedScriptValue() { reset(); }
+
+    WebSerializedScriptValue() { }
+    WebSerializedScriptValue(const WebSerializedScriptValue& d) { assign(d); }
+    WebSerializedScriptValue& operator=(const WebSerializedScriptValue& d)
+    {
+        assign(d);
+        return *this;
+    }
+
+    WEBKIT_EXPORT static WebSerializedScriptValue fromString(const WebString&);
+
+    WEBKIT_EXPORT static WebSerializedScriptValue serialize(v8::Handle<v8::Value>);
+
+    // Create a WebSerializedScriptValue that represents a serialization error.
+    WEBKIT_EXPORT static WebSerializedScriptValue createInvalid();
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebSerializedScriptValue&);
+
+    bool isNull() const { return m_private.isNull(); }
+
+    // Returns a string representation of the WebSerializedScriptValue.
+    WEBKIT_EXPORT WebString toString() const;
+
+    // Convert the serialized value to a parsed v8 value.
+    WEBKIT_EXPORT v8::Handle<v8::Value> deserialize();
+
+#if WEBKIT_IMPLEMENTATION
+    WebSerializedScriptValue(const WTF::PassRefPtr<WebCore::SerializedScriptValue>&);
+    WebSerializedScriptValue& operator=(const WTF::PassRefPtr<WebCore::SerializedScriptValue>&);
+    operator WTF::PassRefPtr<WebCore::SerializedScriptValue>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::SerializedScriptValue> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSettings.h b/public/webpage/WebSettings.h
new file mode 100644
index 0000000..6854fb7
--- /dev/null
+++ b/public/webpage/WebSettings.h
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSettings_h
+#define WebSettings_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebSize.h"
+#include <unicode/uscript.h>
+
+namespace WebKit {
+
+class WebString;
+class WebURL;
+
+// WebSettings is owned by the WebView and allows code to modify the settings for
+// the WebView's page without any knowledge of WebCore itself.  For the most part,
+// these functions have a 1:1 mapping with the methods in WebCore/page/Settings.h.
+class WebSettings {
+public:
+    enum EditingBehavior {
+        EditingBehaviorMac,
+        EditingBehaviorWin,
+        EditingBehaviorUnix,
+        EditingBehaviorAndroid
+    };
+
+    virtual bool scrollAnimatorEnabled() const = 0;
+    virtual bool touchEditingEnabled() const = 0;
+    virtual bool viewportEnabled() const = 0;
+    virtual void setAccelerated2dCanvasEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingFor3DTransformsEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingForAnimationEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingForCanvasEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingForFixedPositionEnabled(bool)  = 0;
+    virtual void setAcceleratedCompositingForOverflowScrollEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingForTransitionEnabled(bool)  = 0;
+    virtual void setAcceleratedCompositingForPluginsEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingForScrollableFramesEnabled(bool) = 0;
+    virtual void setAcceleratedCompositingForVideoEnabled(bool) = 0;
+    virtual void setAcceleratedFiltersEnabled(bool) = 0;
+    virtual void setAllowDisplayOfInsecureContent(bool) = 0;
+    virtual void setAllowFileAccessFromFileURLs(bool) = 0;
+    virtual void setAllowCustomScrollbarInMainFrame(bool) = 0;
+    virtual void setAllowRunningOfInsecureContent(bool) = 0;
+    virtual void setAllowScriptsToCloseWindows(bool) = 0;
+    virtual void setAllowUniversalAccessFromFileURLs(bool) = 0;
+    virtual void setAntialiased2dCanvasEnabled(bool) = 0;
+    virtual void setAsynchronousSpellCheckingEnabled(bool) = 0;
+    virtual void setAutoZoomFocusedNodeToLegibleScale(bool) = 0;
+    virtual void setAuthorAndUserStylesEnabled(bool) = 0;
+    virtual void setCaretBrowsingEnabled(bool) = 0;
+    virtual void setCompositedScrollingForFramesEnabled(bool) = 0;
+    virtual void setCookieEnabled(bool) = 0;
+    virtual void setCursiveFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setDNSPrefetchingEnabled(bool) = 0;
+    virtual void setDOMPasteAllowed(bool) = 0;
+    virtual void setDefaultFixedFontSize(int) = 0;
+    virtual void setDefaultFontSize(int) = 0;
+    virtual void setDefaultTextEncodingName(const WebString&) = 0;
+    virtual void setDefaultVideoPosterURL(const WebString&) = 0;
+    void setDeferred2dCanvasEnabled(bool) { } // temporary stub
+    virtual void setDeferredImageDecodingEnabled(bool) = 0;
+    virtual void setDeviceSupportsMouse(bool) = 0;
+    virtual void setDeviceSupportsTouch(bool) = 0;
+    virtual void setDoubleTapToZoomEnabled(bool) = 0;
+    virtual void setDownloadableBinaryFontsEnabled(bool) = 0;
+    virtual void setEditableLinkBehaviorNeverLive() = 0;
+    virtual void setEditingBehavior(EditingBehavior) = 0;
+    virtual void setEnableScrollAnimator(bool) = 0;
+    virtual void setEnableTouchAdjustment(bool) = 0;
+    virtual void setExperimentalCSSCustomFilterEnabled(bool) = 0;
+    virtual void setExperimentalCSSGridLayoutEnabled(bool) = 0;
+    virtual void setCSSStickyPositionEnabled(bool) = 0;
+    virtual void setExperimentalWebGLEnabled(bool) = 0;
+    virtual void setExperimentalWebSocketEnabled(bool) = 0;
+    virtual void setPinchVirtualViewportEnabled(bool) = 0;
+    virtual void setFantasyFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setFixedFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setFixedPositionCreatesStackingContext(bool) = 0;
+    virtual void setFontRenderingModeNormal() = 0;
+    virtual void setForceCompositingMode(bool) = 0;
+    virtual void setFullScreenEnabled(bool) = 0;
+    virtual void setGestureTapHighlightEnabled(bool) = 0;
+    virtual void setHyperlinkAuditingEnabled(bool) = 0;
+    virtual void setImagesEnabled(bool) = 0;
+    virtual void setJavaEnabled(bool) = 0;
+    virtual void setJavaScriptCanAccessClipboard(bool) = 0;
+    virtual void setJavaScriptCanOpenWindowsAutomatically(bool) = 0;
+    virtual void setJavaScriptEnabled(bool) = 0;
+    virtual void setLayoutFallbackWidth(int) = 0;
+    virtual void setLoadsImagesAutomatically(bool) = 0;
+    virtual void setLoadWithOverviewMode(bool) = 0;
+    virtual void setLocalStorageEnabled(bool) = 0;
+    virtual void setMediaPlaybackRequiresUserGesture(bool) = 0;
+    virtual void setMemoryInfoEnabled(bool) = 0;
+    virtual void setMinimumAccelerated2dCanvasSize(int) = 0;
+    virtual void setMinimumFontSize(int) = 0;
+    virtual void setMinimumLogicalFontSize(int) = 0;
+    virtual void setMockScrollbarsEnabled(bool) = 0;
+    virtual void setNeedsSiteSpecificQuirks(bool) = 0;
+    virtual void setOfflineWebApplicationCacheEnabled(bool) = 0;
+    virtual void setOpenGLMultisamplingEnabled(bool) = 0;
+    virtual void setPasswordEchoDurationInSeconds(double) = 0;
+    virtual void setPasswordEchoEnabled(bool) = 0;
+    virtual void setPerTilePaintingEnabled(bool) = 0;
+    virtual void setPictographFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setPluginsEnabled(bool) = 0;
+    virtual void setPrivilegedWebGLExtensionsEnabled(bool) = 0;
+    virtual void setRenderVSyncNotificationEnabled(bool) = 0;
+    virtual void setSansSerifFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setSelectTrailingWhitespaceEnabled(bool) = 0;
+    virtual void setSelectionIncludesAltImageText(bool) = 0;
+    virtual void setSerifFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setShouldPrintBackgrounds(bool) = 0;
+    virtual void setShouldRespectImageOrientation(bool) = 0;
+    virtual void setShowDebugBorders(bool) = 0;
+    virtual void setShowFPSCounter(bool) = 0;
+    virtual void setShowPaintRects(bool) = 0;
+    virtual void setShrinksStandaloneImagesToFit(bool) = 0;
+    virtual void setSmartInsertDeleteEnabled(bool) = 0;
+    virtual void setSpatialNavigationEnabled(bool) = 0;
+    virtual void setStandardFontFamily(const WebString&, UScriptCode = USCRIPT_COMMON) = 0;
+    virtual void setSupportDeprecatedTargetDensityDPI(bool) = 0;
+    virtual void setSupportsMultipleWindows(bool) = 0;
+    virtual void setSyncXHRInDocumentsEnabled(bool) = 0;
+    virtual void setTextAreasAreResizable(bool) = 0;
+    virtual void setTextAutosizingEnabled(bool) = 0;
+    virtual void setTextAutosizingFontScaleFactor(float) = 0;
+    virtual void setTextDirectionSubmenuInclusionBehaviorNeverIncluded() { } // FIXME: Remove once its caller is gone from Chromium
+    virtual void setThreadedHTMLParser(bool) = 0;
+    virtual void setTouchDragDropEnabled(bool) = 0;
+    virtual void setTouchEditingEnabled(bool) = 0;
+    virtual void setUnifiedTextCheckerEnabled(bool) = 0;
+    virtual void setUnsafePluginPastingEnabled(bool) = 0;
+    virtual void setUserStyleSheetLocation(const WebURL&) = 0;
+    virtual void setUsesEncodingDetector(bool) = 0;
+    virtual void setUseWideViewport(bool) = 0;
+    virtual void setValidationMessageTimerMagnification(int) = 0;
+    virtual void setViewportEnabled(bool) = 0;
+    virtual void setVisualWordMovementEnabled(bool) = 0;
+    virtual void setWebAudioEnabled(bool) = 0;
+    virtual void setWebGLErrorsToConsoleEnabled(bool) = 0;
+    virtual void setWebSecurityEnabled(bool) = 0;
+    virtual void setXSSAuditorEnabled(bool) = 0;
+
+    // DEPRECATED: Delete after Chromium-side calls deleted.
+    void setApplyPageScaleFactorInCompositor(bool enabled) { }
+    void setApplyDefaultDeviceScaleFactorInCompositor(bool enabled) { }
+    void setFixedElementsLayoutRelativeToFrame(bool) { }
+    void setInitializeAtMinimumPageScale(bool enabled) { setLoadWithOverviewMode(enabled); }
+
+protected:
+    ~WebSettings() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSharedWorker.h b/public/webpage/WebSharedWorker.h
new file mode 100644
index 0000000..5340ca5
--- /dev/null
+++ b/public/webpage/WebSharedWorker.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSharedWorker_h
+#define WebSharedWorker_h
+
+#include "../platform/WebCommon.h"
+#include "WebContentSecurityPolicy.h"
+
+namespace WebCore {
+class ScriptExecutionContext;
+}
+
+namespace WebKit {
+
+class WebString;
+class WebMessagePortChannel;
+class WebSharedWorkerClient;
+class WebURL;
+
+// This is the interface to a SharedWorker thread.
+// Since SharedWorkers communicate entirely through MessagePorts this interface only contains APIs for starting up a SharedWorker.
+class WebSharedWorker {
+public:
+    // Invoked from the worker thread to instantiate a WebSharedWorker that interacts with the WebKit worker components.
+    WEBKIT_EXPORT static WebSharedWorker* create(WebSharedWorkerClient*);
+
+    virtual ~WebSharedWorker() {};
+
+    // Returns false if the thread hasn't been started yet (script loading has not taken place).
+    // FIXME(atwilson): Remove this when we move the initial script loading into the worker process.
+    virtual bool isStarted() = 0;
+
+    virtual void startWorkerContext(const WebURL& scriptURL,
+                                    const WebString& name,
+                                    const WebString& userAgent,
+                                    const WebString& sourceCode,
+                                    const WebString& contentSecurityPolicy,
+                                    WebContentSecurityPolicyType,
+                                    long long scriptResourceAppCacheID) = 0;
+
+    class ConnectListener {
+    public:
+        // Invoked once the connect event has been sent so the caller can free this object.
+        virtual void connected() = 0;
+    };
+
+    // Sends a connect event to the SharedWorker context. The listener is invoked when this async operation completes.
+    virtual void connect(WebMessagePortChannel*, ConnectListener*) = 0;
+
+    // Invoked to shutdown the worker when there are no more associated documents.
+    virtual void terminateWorkerContext() = 0;
+
+    // Notification when the WebCommonWorkerClient is destroyed.
+    virtual void clientDestroyed() = 0;
+
+    virtual void pauseWorkerContextOnStart() { }
+    virtual void resumeWorkerContext() { }
+    virtual void attachDevTools() { }
+    virtual void reattachDevTools(const WebString& savedState) { }
+    virtual void detachDevTools() { }
+    virtual void dispatchDevToolsMessage(const WebString&) { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSharedWorkerClient.h b/public/webpage/WebSharedWorkerClient.h
new file mode 100644
index 0000000..6f10d5d
--- /dev/null
+++ b/public/webpage/WebSharedWorkerClient.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSharedWorkerClient_h
+#define WebSharedWorkerClient_h
+
+#include "../platform/WebMessagePortChannel.h"
+#include "WebCommonWorkerClient.h"
+
+namespace WebKit {
+
+class WebNotificationPresenter;
+class WebString;
+class WebWorker;
+
+// Provides an interface back to the in-page script object for a worker.
+// All functions are expected to be called back on the thread that created
+// the Worker object, unless noted.
+class WebSharedWorkerClient : public WebCommonWorkerClient {
+public:
+    virtual void postMessageToWorkerObject(
+        const WebString&,
+        const WebMessagePortChannelArray&) = 0;
+
+    virtual void confirmMessageFromWorkerObject(bool hasPendingActivity) = 0;
+    virtual void reportPendingActivity(bool hasPendingActivity) = 0;
+
+    virtual void postExceptionToWorkerObject(
+        const WebString& errorString, int lineNumber,
+        const WebString& sourceURL) = 0;
+
+    // FIXME: the two below are for compatibility only and should be removed
+    // once Chromium is updated to remove message destination parameter
+    // <http://webkit.org/b/37155> and the message type parameter
+    // <http://webkit.org/b/66371>.
+    virtual void postConsoleMessageToWorkerObject(int, int sourceIdentifier, int, int messageLevel,
+                                                  const WebString& message, int lineNumber, const WebString& sourceURL) = 0;
+    virtual void postConsoleMessageToWorkerObject(int sourceIdentifier, int, int messageLevel,
+                                                  const WebString& message, int lineNumber, const WebString& sourceURL)
+    {
+        postConsoleMessageToWorkerObject(0, sourceIdentifier, 0, messageLevel,
+                                         message, lineNumber, sourceURL);
+    }
+
+    virtual void postConsoleMessageToWorkerObject(int sourceIdentifier, int messageLevel,
+                                                  const WebString& message, int lineNumber, const WebString& sourceURL)
+    {
+        postConsoleMessageToWorkerObject(0, sourceIdentifier, messageLevel,
+                                         message, lineNumber, sourceURL);
+    }
+
+    virtual void workerContextClosed() = 0;
+    virtual void workerContextDestroyed() = 0;
+
+    // Returns the notification presenter for this worker context. Pointer
+    // is owned by the object implementing WebCommonWorkerClient.
+    virtual WebNotificationPresenter* notificationPresenter() = 0;
+
+    // Called on the main webkit thread in the worker process during initialization.
+    virtual WebApplicationCacheHost* createApplicationCacheHost(WebApplicationCacheHostClient*) = 0;
+
+    virtual void dispatchDevToolsMessage(const WebString&) { }
+    virtual void saveDevToolsAgentState(const WebString&) { }
+
+protected:
+    ~WebSharedWorkerClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSharedWorkerRepository.h b/public/webpage/WebSharedWorkerRepository.h
new file mode 100644
index 0000000..a5014f7
--- /dev/null
+++ b/public/webpage/WebSharedWorkerRepository.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSharedWorkerRepository_h
+#define WebSharedWorkerRepository_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebString;
+class WebSharedWorker;
+class WebURL;
+
+class WebSharedWorkerRepository {
+public:
+    // Unique identifier for the parent document of a worker (unique within a given process).
+    typedef unsigned long long DocumentID;
+
+    // Tracks a newly-created SharedWorker via the repository.
+    virtual void addSharedWorker(WebSharedWorker*, DocumentID) = 0;
+
+    // Invoked when a document has been detached. DocumentID can be re-used after documentDetached() is invoked.
+    virtual void documentDetached(DocumentID) = 0;
+
+    // Returns true if the passed document is associated with any SharedWorkers.
+    virtual bool hasSharedWorkers(DocumentID) = 0;
+};
+
+// Initializes shared worker support.
+WEBKIT_EXPORT void setSharedWorkerRepository(WebSharedWorkerRepository*);
+
+} // namespace WebKit
+
+#endif // WebSharedWorkerRepository_h
diff --git a/public/webpage/WebSocket.h b/public/webpage/WebSocket.h
new file mode 100644
index 0000000..5cbad07
--- /dev/null
+++ b/public/webpage/WebSocket.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2011, 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSocket_h
+#define WebSocket_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace WebCore { class WebSocketChannel; }
+
+namespace WebKit {
+
+class WebArrayBuffer;
+class WebDocument;
+class WebString;
+class WebURL;
+class WebSocketClient;
+
+class WebSocket {
+public:
+    enum CloseEventCode {
+        CloseEventCodeNotSpecified = -1,
+        CloseEventCodeNormalClosure = 1000,
+        CloseEventCodeGoingAway = 1001,
+        CloseEventCodeProtocolError = 1002,
+        CloseEventCodeUnsupportedData = 1003,
+        CloseEventCodeFrameTooLarge = 1004,
+        CloseEventCodeNoStatusRcvd = 1005,
+        CloseEventCodeAbnormalClosure = 1006,
+        CloseEventCodeInvalidFramePayloadData = 1007,
+        CloseEventCodePolicyViolation = 1008,
+        CloseEventCodeMessageTooBig = 1009,
+        CloseEventCodeMandatoryExt = 1010,
+        CloseEventCodeInternalError = 1011,
+        CloseEventCodeTLSHandshake = 1015,
+        CloseEventCodeMinimumUserDefined = 3000,
+        CloseEventCodeMaximumUserDefined = 4999
+    };
+
+    enum BinaryType {
+        BinaryTypeBlob = 0,
+        BinaryTypeArrayBuffer = 1
+    };
+
+    WEBKIT_EXPORT static WebSocket* create(const WebDocument&, WebSocketClient*);
+    virtual ~WebSocket() { }
+
+    // These functions come from binaryType attribute of the WebSocket API
+    // specification. It specifies binary object type for receiving binary
+    // frames representation. Receiving text frames are always mapped to
+    // WebString type regardless of this attribute.
+    // Default type is BinaryTypeBlob. But currently it is not supported.
+    // Set BinaryTypeArrayBuffer here ahead of using binary communication.
+    // See also, The WebSocket API - http://www.w3.org/TR/websockets/ .
+    virtual BinaryType binaryType() const = 0;
+    virtual bool setBinaryType(BinaryType) = 0;
+
+    virtual void connect(const WebURL&, const WebString& protocol) = 0;
+    virtual WebString subprotocol() = 0;
+    virtual WebString extensions() = 0;
+    virtual bool sendText(const WebString&) = 0;
+    virtual bool sendArrayBuffer(const WebArrayBuffer&) = 0;
+    virtual unsigned long bufferedAmount() const = 0;
+    virtual void close(int code, const WebString& reason) = 0;
+    virtual void fail(const WebString& reason) = 0;
+    virtual void disconnect() = 0;
+};
+
+} // namespace WebKit
+
+#endif // WebSocket_h
diff --git a/public/webpage/WebSocketClient.h b/public/webpage/WebSocketClient.h
new file mode 100644
index 0000000..3d26518
--- /dev/null
+++ b/public/webpage/WebSocketClient.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2011, 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSocketClient_h
+#define WebSocketClient_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebArrayBuffer;
+class WebString;
+
+class WebSocketClient {
+public:
+    enum ClosingHandshakeCompletionStatus {
+        ClosingHandshakeIncomplete,
+        ClosingHandshakeComplete
+    };
+
+    virtual ~WebSocketClient() { }
+    virtual void didConnect() { }
+    virtual void didReceiveMessage(const WebString& message) { }
+    virtual void didReceiveArrayBuffer(const WebArrayBuffer& arrayBuffer) { }
+    virtual void didReceiveMessageError() { }
+    virtual void didUpdateBufferedAmount(unsigned long bufferedAmount) { }
+    virtual void didStartClosingHandshake() { }
+    virtual void didClose(unsigned long bufferedAmount, ClosingHandshakeCompletionStatus, unsigned short code, const WebString& reason) { }
+};
+
+} // namespace WebKit
+
+#endif // WebSocketClient_h
diff --git a/public/webpage/WebSourceBuffer.h b/public/webpage/WebSourceBuffer.h
new file mode 100644
index 0000000..064626c
--- /dev/null
+++ b/public/webpage/WebSourceBuffer.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSourceBuffer_h
+#define WebSourceBuffer_h
+
+#include "WebTimeRange.h"
+
+namespace WebKit {
+
+class WebSourceBuffer {
+public:
+    virtual ~WebSourceBuffer() { }
+
+    virtual WebTimeRanges buffered() = 0;
+    virtual void append(const unsigned char* data, unsigned length) = 0;
+    virtual void abort() = 0;
+    virtual bool setTimestampOffset(double) = 0;
+    virtual void removedFromMediaSource() = 0;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebSpeechGrammar.h b/public/webpage/WebSpeechGrammar.h
new file mode 100644
index 0000000..b1de20a
--- /dev/null
+++ b/public/webpage/WebSpeechGrammar.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebSpeechGrammar_h
+#define WebSpeechGrammar_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebURL.h"
+
+namespace WebCore {
+class SpeechGrammar;
+}
+
+namespace WebKit {
+
+class WebSpeechGrammar {
+public:
+    WebSpeechGrammar() { }
+    WebSpeechGrammar(const WebSpeechGrammar& grammar) { assign(grammar); }
+    ~WebSpeechGrammar() { reset(); }
+
+    WEBKIT_EXPORT WebURL src() const;
+    WEBKIT_EXPORT float weight() const;
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebSpeechGrammar&);
+
+#if WEBKIT_IMPLEMENTATION
+    WebSpeechGrammar(const WTF::PassRefPtr<WebCore::SpeechGrammar>&);
+    WebSpeechGrammar& operator=(const WTF::PassRefPtr<WebCore::SpeechGrammar>&);
+#endif
+
+private:
+    WebPrivatePtr<WebCore::SpeechGrammar> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechGrammar_h
diff --git a/public/webpage/WebSpeechInputController.h b/public/webpage/WebSpeechInputController.h
new file mode 100644
index 0000000..8320283
--- /dev/null
+++ b/public/webpage/WebSpeechInputController.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSpeechInputController_h
+#define WebSpeechInputController_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+struct WebRect;
+class WebSecurityOrigin;
+class WebString;
+
+// Provides an embedder API called by WebKit.
+class WebSpeechInputController {
+public:
+    // Starts speech recognition. Speech will get recorded until the endpointer detects silence,
+    // runs to the limit or stopRecording is called. Progress indications and the recognized
+    // text are returned via the listener interface. elementRect is the position
+    // of the element where the user clicked in the RootView coordinate system.
+    virtual bool startRecognition(int requestId, const WebRect& elementRect, const WebString& language, const WebString& grammar, const WebSecurityOrigin& origin)
+    {
+        WEBKIT_ASSERT_NOT_REACHED();
+        return false;
+    }
+
+    // Cancels an ongoing recognition and discards any audio recorded so far. No partial
+    // recognition results are returned to the listener.
+    virtual void cancelRecognition(int) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+    // Stops audio recording and performs recognition with the audio recorded until now
+    // (does not discard audio). This is an optional call and is typically invoked if the user
+    // wants to stop recording audio as soon as they finished speaking. Otherwise, the speech
+    // recording 'endpointer' should detect silence in the input and stop recording automatically.
+    // Call startRecognition() to record audio and recognize speech again.
+    virtual void stopRecording(int) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+protected:
+    virtual ~WebSpeechInputController() { }
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechInputController_h
diff --git a/public/webpage/WebSpeechInputListener.h b/public/webpage/WebSpeechInputListener.h
new file mode 100644
index 0000000..091f984
--- /dev/null
+++ b/public/webpage/WebSpeechInputListener.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSpeechInputListener_h
+#define WebSpeechInputListener_h
+
+#include "WebSpeechInputResult.h"
+
+namespace WebKit {
+
+class WebString;
+
+// Provides a WebKit API called by the embedder.
+// A typical sequence of calls to the listener would be
+//   1 call to didCompleteRecording
+//   0 or more calls to setRecognitionResult
+//   1 call to didCompleteRecognition
+class WebSpeechInputListener {
+public:
+    // Informs that audio recording has completed and recognition is underway. This gets invoked
+    // irrespective of whether recording was stopped automatically by the 'endpointer' or if
+    // WebSpeechInputController::stopRecording() was called.
+    // Typically after this call the listener would update the UI to reflect that recognition is
+    // in progress.
+    virtual void didCompleteRecording(int) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+    // Gives results from speech recognition, either partial or the final results.
+    // This method can potentially get called multiple times if there are partial results
+    // available as the user keeps speaking. If the speech could not be recognized properly
+    // or if there was any other errors in the process, this method may never be called.
+    virtual void setRecognitionResult(int, const WebSpeechInputResultArray&) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+    // Informs that speech recognition has completed. This gets invoked irrespective of whether
+    // recognition was succesful or not, whether setRecognitionResult() was invoked or not. The
+    // handler typically frees up any temporary resources allocated and waits for the next speech
+    // recognition request.
+    virtual void didCompleteRecognition(int) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+protected:
+    ~WebSpeechInputListener() { }
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechInputListener_h
diff --git a/public/webpage/WebSpeechInputResult.h b/public/webpage/WebSpeechInputResult.h
new file mode 100644
index 0000000..f9e6581
--- /dev/null
+++ b/public/webpage/WebSpeechInputResult.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 Google 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 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 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 WebSpeechInputResult_h
+#define WebSpeechInputResult_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+
+namespace WebCore {
+class SpeechInputResult;
+}
+
+namespace WebKit {
+
+// This class holds one speech recognition result including the text and other related
+// fields, as received from the embedder.
+class WebSpeechInputResult {
+public:
+    WebSpeechInputResult() { }
+    WebSpeechInputResult(const WebSpeechInputResult& other) { assign(other); }
+    ~WebSpeechInputResult() { reset(); }
+
+    WebSpeechInputResult& operator=(const WebSpeechInputResult& other)
+    {
+        assign(other);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void assign(const WebString& utterance, double confidence);
+    WEBKIT_EXPORT void assign(const WebSpeechInputResult& other);
+    WEBKIT_EXPORT void reset();
+
+#if WEBKIT_IMPLEMENTATION
+    WebSpeechInputResult(const WTF::PassRefPtr<WebCore::SpeechInputResult>&);
+    operator WTF::PassRefPtr<WebCore::SpeechInputResult>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::SpeechInputResult> m_private;
+};
+
+typedef WebVector<WebSpeechInputResult> WebSpeechInputResultArray;
+
+} // namespace WebKit
+
+#endif // WebSpeechInputResult_h
diff --git a/public/webpage/WebSpeechRecognitionHandle.h b/public/webpage/WebSpeechRecognitionHandle.h
new file mode 100644
index 0000000..4a2f6f6
--- /dev/null
+++ b/public/webpage/WebSpeechRecognitionHandle.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebSpeechRecognitionHandle_h
+#define WebSpeechRecognitionHandle_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+
+namespace WebCore {
+class SpeechRecognition;
+}
+
+namespace WebKit {
+
+class WebSpeechRecognitionResult;
+class WebString;
+
+// WebSpeechRecognitionHandle is used by WebSpeechRecognizer to identify a
+// recognition session, and by WebSpeechRecognizerClient to route
+// recognition events.
+class WebSpeechRecognitionHandle {
+public:
+    ~WebSpeechRecognitionHandle() { reset(); }
+    WebSpeechRecognitionHandle() { }
+
+    WebSpeechRecognitionHandle(const WebSpeechRecognitionHandle& other) { assign(other); }
+    WebSpeechRecognitionHandle& operator=(const WebSpeechRecognitionHandle& other)
+    {
+        assign(other);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    WEBKIT_EXPORT void assign(const WebSpeechRecognitionHandle&);
+
+    // Comparison functions are provided so that WebSpeechRecognitionHandle objects
+    // can be stored in a hash map.
+    WEBKIT_EXPORT bool equals(const WebSpeechRecognitionHandle&) const;
+    WEBKIT_EXPORT bool lessThan(const WebSpeechRecognitionHandle&) const;
+
+#if WEBKIT_IMPLEMENTATION
+    WebSpeechRecognitionHandle(const WTF::PassRefPtr<WebCore::SpeechRecognition>&);
+    WebSpeechRecognitionHandle& operator=(const WTF::PassRefPtr<WebCore::SpeechRecognition>&);
+    operator WTF::PassRefPtr<WebCore::SpeechRecognition>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::SpeechRecognition> m_private;
+};
+
+inline bool operator==(const WebSpeechRecognitionHandle& a, const WebSpeechRecognitionHandle& b)
+{
+    return a.equals(b);
+}
+
+inline bool operator!=(const WebSpeechRecognitionHandle& a, const WebSpeechRecognitionHandle& b)
+{
+    return !(a == b);
+}
+
+inline bool operator<(const WebSpeechRecognitionHandle& a, const WebSpeechRecognitionHandle& b)
+{
+    return a.lessThan(b);
+}
+
+} // namespace WebKit
+
+#endif // WebSpeechRecognitionHandle_h
diff --git a/public/webpage/WebSpeechRecognitionParams.h b/public/webpage/WebSpeechRecognitionParams.h
new file mode 100644
index 0000000..9bd105e
--- /dev/null
+++ b/public/webpage/WebSpeechRecognitionParams.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebSpeechRecognitionParams_h
+#define WebSpeechRecognitionParams_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include "WebSecurityOrigin.h"
+#include "WebSpeechGrammar.h"
+
+namespace WebKit {
+
+class WebSpeechGrammar;
+
+class WebSpeechRecognitionParams {
+public:
+    WebSpeechRecognitionParams(const WebVector<WebSpeechGrammar>& grammars, const WebString& language, bool continuous, bool interimResults, unsigned long maxAlternatives, const WebSecurityOrigin& origin)
+        : m_grammars(grammars)
+        , m_language(language)
+        , m_continuous(continuous)
+        , m_interimResults(interimResults)
+        , m_maxAlternatives(maxAlternatives)
+        , m_origin(origin)
+    {
+    }
+
+    const WebVector<WebSpeechGrammar>& grammars() const { return m_grammars; }
+    const WebString& language() const { return m_language; }
+    bool continuous() const { return m_continuous; }
+    bool interimResults() const { return m_interimResults; }
+    unsigned long maxAlternatives() const { return m_maxAlternatives; }
+    const WebSecurityOrigin& origin() const { return m_origin; }
+
+private:
+    WebVector<WebSpeechGrammar> m_grammars;
+    WebString m_language;
+    bool m_continuous;
+    bool m_interimResults;
+    unsigned long m_maxAlternatives;
+    WebSecurityOrigin m_origin;
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechRecognitionParams_h
diff --git a/public/webpage/WebSpeechRecognitionResult.h b/public/webpage/WebSpeechRecognitionResult.h
new file mode 100644
index 0000000..0c38105
--- /dev/null
+++ b/public/webpage/WebSpeechRecognitionResult.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebSpeechRecognitionResult_h
+#define WebSpeechRecognitionResult_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPrivatePtr.h"
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+
+namespace WebCore {
+class SpeechRecognitionResult;
+}
+
+namespace WebKit {
+
+class WebSpeechRecognitionResult {
+public:
+    WebSpeechRecognitionResult() { }
+    WebSpeechRecognitionResult(const WebSpeechRecognitionResult& result) { assign(result); }
+    ~WebSpeechRecognitionResult() { reset(); }
+
+    WEBKIT_EXPORT void assign(const WebVector<WebString>& transcripts, const WebVector<float>& confidences, bool final);
+    WEBKIT_EXPORT void assign(const WebSpeechRecognitionResult&);
+    WEBKIT_EXPORT void reset();
+
+#if WEBKIT_IMPLEMENTATION
+    operator WTF::PassRefPtr<WebCore::SpeechRecognitionResult>() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::SpeechRecognitionResult> m_private;
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechRecognitionResult_h
diff --git a/public/webpage/WebSpeechRecognizer.h b/public/webpage/WebSpeechRecognizer.h
new file mode 100644
index 0000000..4631f8a
--- /dev/null
+++ b/public/webpage/WebSpeechRecognizer.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebSpeechRecognizer_h
+#define WebSpeechRecognizer_h
+
+#include "../platform/WebCommon.h"
+#include "WebSpeechRecognitionHandle.h"
+
+namespace WebKit {
+
+class WebSpeechGrammar;
+class WebSpeechRecognitionParams;
+class WebSpeechRecognizerClient;
+
+// Interface for speech recognition, to be implemented by the embedder.
+class WebSpeechRecognizer {
+public:
+    // Start speech recognition for the specified handle using the specified parameters. Notifications on progress, results, and errors will be sent via the client.
+    virtual void start(const WebSpeechRecognitionHandle&, const WebSpeechRecognitionParams&, WebSpeechRecognizerClient*) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+    // Stop speech recognition for the specified handle, returning any results for the audio recorded so far. Notifications and errors are sent via the client.
+    virtual void stop(const WebSpeechRecognitionHandle&, WebSpeechRecognizerClient*) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+    // Abort speech recognition for the specified handle, discarding any recorded audio. Notifications and errors are sent via the client.
+    virtual void abort(const WebSpeechRecognitionHandle&, WebSpeechRecognizerClient*) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+protected:
+    virtual ~WebSpeechRecognizer() { }
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechRecognizer_h
diff --git a/public/webpage/WebSpeechRecognizerClient.h b/public/webpage/WebSpeechRecognizerClient.h
new file mode 100644
index 0000000..d32451e
--- /dev/null
+++ b/public/webpage/WebSpeechRecognizerClient.h
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER OR
+ * 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 WebSpeechRecognizerClient_h
+#define WebSpeechRecognizerClient_h
+
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+
+class WebSpeechRecognitionResult;
+class WebSpeechRecognitionHandle;
+class WebString;
+
+// A client for reporting progress on speech recognition for a specific handle.
+class WebSpeechRecognizerClient {
+public:
+    enum ErrorCode {
+        OtherError = 0,
+        NoSpeechError = 1,
+        AbortedError = 2,
+        AudioCaptureError = 3,
+        NetworkError = 4,
+        NotAllowedError = 5,
+        ServiceNotAllowedError = 6,
+        BadGrammarError = 7,
+        LanguageNotSupportedError = 8
+    };
+
+    // These methods correspond to the events described in the spec:
+    // http://speech-javascript-api-spec.googlecode.com/git/speechapi.html#speechreco-events
+
+    // To be called when the embedder has started to capture audio.
+    virtual void didStartAudio(const WebSpeechRecognitionHandle&) = 0;
+
+    // To be called when some sound, possibly speech, has been detected.
+    // This is expected to be called after didStartAudio.
+    virtual void didStartSound(const WebSpeechRecognitionHandle&) = 0;
+
+    // To be called when sound is no longer detected.
+    // This is expected to be called after didEndSpeech.
+    virtual void didEndSound(const WebSpeechRecognitionHandle&) = 0;
+
+    // To be called when audio capture has stopped.
+    // This is expected to be called after didEndSound.
+    virtual void didEndAudio(const WebSpeechRecognitionHandle&) = 0;
+
+    // To be called when the speech recognizer provides new results.
+    // - newFinalResults contains zero or more final results that are new since
+    // the last time the function was called.
+    // - currentInterimResults contains zero or more inteirm results that
+    // replace the interim results that were reported the last time this
+    // function was called.
+    virtual void didReceiveResults(const WebSpeechRecognitionHandle&, const WebVector<WebSpeechRecognitionResult>& newFinalResults, const WebVector<WebSpeechRecognitionResult>& currentInterimResults) = 0;
+
+    // To be called when the speech recognizer returns a final result with no
+    // recognizion hypothesis.
+    virtual void didReceiveNoMatch(const WebSpeechRecognitionHandle&, const WebSpeechRecognitionResult&) = 0;
+
+    // To be called when a speech recognition error occurs.
+    virtual void didReceiveError(const WebSpeechRecognitionHandle&, const WebString& message, ErrorCode) = 0;
+
+    // To be called when the recognizer has begun to listen to the audio with
+    // the intention of recognizing.
+    virtual void didStart(const WebSpeechRecognitionHandle&) = 0;
+
+    // To be called when the recognition session has ended. This must always be
+    // called, no matter the reason for the end.
+    virtual void didEnd(const WebSpeechRecognitionHandle&) = 0;
+
+protected:
+    virtual ~WebSpeechRecognizerClient() {}
+};
+
+} // namespace WebKit
+
+#endif // WebSpeechRecognizerClient_h
diff --git a/public/webpage/WebSpellCheckClient.h b/public/webpage/WebSpellCheckClient.h
new file mode 100644
index 0000000..110a491
--- /dev/null
+++ b/public/webpage/WebSpellCheckClient.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSpellCheckClient_h
+#define WebSpellCheckClient_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include "WebTextCheckingType.h"
+
+namespace WebKit {
+
+class WebString;
+class WebTextCheckingCompletion;
+struct WebTextCheckingResult;
+
+class WebSpellCheckClient {
+public:
+    // The client should perform spell-checking on the given text. If the
+    // text contains a misspelled word, then upon return misspelledOffset
+    // will point to the start of the misspelled word, and misspelledLength
+    // will indicates its length. Otherwise, if there was not a spelling
+    // error, then upon return misspelledLength is 0. If optional_suggestions
+    // is given, then it will be filled with suggested words (not a cheap step).
+    virtual void spellCheck(const WebString& text,
+                            int& misspelledOffset,
+                            int& misspelledLength,
+                            WebVector<WebString>* optionalSuggestions) { }
+
+    // The client should perform spell-checking on the given text. This function will
+    // enumerate all misspellings at once.
+    virtual void checkTextOfParagraph(const WebString&,
+                                      WebTextCheckingTypeMask mask,
+                                      WebVector<WebTextCheckingResult>* results) { }
+
+    // Requests asynchronous spelling and grammar checking, whose result should be
+    // returned by passed completion object.
+    virtual void requestCheckingOfText(const WebString& textToCheck,
+                                       const WebVector<uint32_t>& markersInText,
+                                       const WebVector<unsigned>& markerOffsets,
+                                       WebTextCheckingCompletion* completionCallback) { }
+
+    // Computes an auto-corrected replacement for a misspelled word. If no
+    // replacement is found, then an empty string is returned.
+    virtual WebString autoCorrectWord(const WebString& misspelledWord) { return WebString(); }
+
+    // Show or hide the spelling UI.
+    virtual void showSpellingUI(bool show) { }
+
+    // Returns true if the spelling UI is showing.
+    virtual bool isShowingSpellingUI() { return false; }
+
+    // Update the spelling UI with the given word.
+    virtual void updateSpellingUIWithMisspelledWord(const WebString& word) { }
+
+protected:
+    ~WebSpellCheckClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebStorageEventDispatcher.h b/public/webpage/WebStorageEventDispatcher.h
new file mode 100644
index 0000000..e7b4399
--- /dev/null
+++ b/public/webpage/WebStorageEventDispatcher.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebStorageEventDispatcher_h
+#define WebStorageEventDispatcher_h
+
+#include "../platform/WebString.h"
+
+namespace WebKit {
+
+class WebStorageArea;
+class WebStorageNamespace;
+class WebURL;
+
+class WebStorageEventDispatcher {
+public:
+    // Dispatch a local storage event to appropiate documents.
+    WEBKIT_EXPORT static void dispatchLocalStorageEvent(
+            const WebString& key, const WebString& oldValue,
+            const WebString& newValue, const WebURL& origin,
+            const WebURL& pageUrl, WebStorageArea* sourceAreaInstance,
+            bool originatedInProcess);
+
+    // Dispatch a session storage event to appropiate documents.
+    WEBKIT_EXPORT static void dispatchSessionStorageEvent(
+            const WebString& key, const WebString& oldValue,
+            const WebString& newValue, const WebURL& origin,
+            const WebURL& pageUrl, const WebStorageNamespace&,
+            WebStorageArea* sourceAreaInstance, bool originatedInProcess);
+
+ private:
+    WebStorageEventDispatcher() { }
+};
+
+} // namespace WebKit
+
+#endif // WebStorageEventDispatcher_h
diff --git a/public/webpage/WebStorageNamespace.h b/public/webpage/WebStorageNamespace.h
new file mode 100644
index 0000000..43f99d7
--- /dev/null
+++ b/public/webpage/WebStorageNamespace.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../platform/WebStorageNamespace.h"
diff --git a/public/webpage/WebStorageQuotaCallbacks.h b/public/webpage/WebStorageQuotaCallbacks.h
new file mode 100644
index 0000000..ee7dc5e
--- /dev/null
+++ b/public/webpage/WebStorageQuotaCallbacks.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebStorageQuotaCallbacks_h
+#define WebStorageQuotaCallbacks_h
+
+#include "WebStorageQuotaError.h"
+
+namespace WebKit {
+
+class WebStorageQuotaCallbacks {
+public:
+    // Callback for WebFrameClient::queryStorageUsageAndQuota.
+    virtual void didQueryStorageUsageAndQuota(unsigned long long usageInBytes, unsigned long long quotaInBytes) = 0;
+
+    // Callback for WebFrameClient::requestStorageQuota.
+    // This may return a smaller amount of quota than the requested.
+    virtual void didGrantStorageQuota(unsigned long long grantedQuotaInBytes) = 0;
+
+    virtual void didFail(WebStorageQuotaError) = 0;
+
+protected:
+    virtual ~WebStorageQuotaCallbacks() { }
+};
+
+} // namespace WebKit
+
+#endif // WebStorageQuotaCallbacks_h
diff --git a/public/webpage/WebStorageQuotaError.h b/public/webpage/WebStorageQuotaError.h
new file mode 100644
index 0000000..d2c44c5
--- /dev/null
+++ b/public/webpage/WebStorageQuotaError.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebStorageQuotaError_h
+#define WebStorageQuotaError_h
+
+namespace WebKit {
+
+// The error code used for WebStorageQuota.
+enum WebStorageQuotaError {
+    WebStorageQuotaErrorNotSupported = 9,
+    WebStorageQuotaErrorInvalidModification = 13,
+    WebStorageQuotaErrorInvalidAccess = 15,
+    WebStorageQuotaErrorAbort = 20,
+};
+
+} // namespace WebKit
+
+#endif // WebStorageQuotaError_h
diff --git a/public/webpage/WebStorageQuotaType.h b/public/webpage/WebStorageQuotaType.h
new file mode 100644
index 0000000..b18caf8
--- /dev/null
+++ b/public/webpage/WebStorageQuotaType.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebStorageQuotaType_h
+#define WebStorageQuotaType_h
+
+namespace WebKit {
+
+enum WebStorageQuotaType {
+    WebStorageQuotaTypeTemporary,
+    WebStorageQuotaTypePersistent,
+};
+
+} // namespace WebKit
+
+#endif // WebStorageQuotaType_h
diff --git a/public/webpage/WebSurroundingText.h b/public/webpage/WebSurroundingText.h
new file mode 100644
index 0000000..39dfc8f
--- /dev/null
+++ b/public/webpage/WebSurroundingText.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2012 Google 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 WebSurroundingText_h
+#define WebSurroundingText_h
+
+#include "../platform/WebPrivateOwnPtr.h"
+#include "../platform/WebString.h"
+#include "WebNode.h"
+#include "WebRange.h"
+
+namespace WebCore {
+class SurroundingText;
+}
+
+namespace WebKit {
+
+class WebHitTestResult;
+class WebNode;
+struct WebPoint;
+
+class WebSurroundingText {
+public:
+    WebSurroundingText() { }
+    ~WebSurroundingText() { reset(); }
+
+    WEBKIT_EXPORT bool isNull() const;
+    WEBKIT_EXPORT void reset();
+
+    // Initializes the object to get the surrounding text centered in the position relative to a provided node.
+    // The maximum length of the contents retrieved is defined by maxLength.
+    WEBKIT_EXPORT void initialize(const WebNode&, const WebPoint&, size_t maxLength);
+
+    // Surrounding text content retrieved.
+    WEBKIT_EXPORT WebString textContent() const;
+
+    // Offset in the text content of the initial hit position (or provided offset in the node).
+    WEBKIT_EXPORT size_t hitOffsetInTextContent() const;
+
+    // Convert start/end positions in the content text string into a WebKit text range.
+    WEBKIT_EXPORT WebRange rangeFromContentOffsets(size_t startOffsetInContent, size_t endOffsetInContent);
+
+protected:
+    WebPrivateOwnPtr<WebCore::SurroundingText> m_private;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTestingSupport.h b/public/webpage/WebTestingSupport.h
new file mode 100644
index 0000000..1cb7c2c
--- /dev/null
+++ b/public/webpage/WebTestingSupport.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2011 Google 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 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 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 WebTestingSupport_h
+#define WebTestingSupport_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebFrame;
+
+class WebTestingSupport {
+public:
+    WEBKIT_EXPORT static void injectInternalsObject(WebFrame*);
+    WEBKIT_EXPORT static void resetInternalsObject(WebFrame*);
+};
+
+}
+
+#endif
diff --git a/public/webpage/WebTextAffinity.h b/public/webpage/WebTextAffinity.h
new file mode 100644
index 0000000..1224f61
--- /dev/null
+++ b/public/webpage/WebTextAffinity.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextAffinity_h
+#define WebTextAffinity_h
+
+namespace WebKit {
+
+// These constants specify the preferred direction of selection.
+enum WebTextAffinity {
+    WebTextAffinityUpstream,   // The selection is moving toward the top of the document.
+    WebTextAffinityDownstream, // The selection is moving toward the bottom of the document.
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextCheckingCompletion.h b/public/webpage/WebTextCheckingCompletion.h
new file mode 100644
index 0000000..8bad8a8
--- /dev/null
+++ b/public/webpage/WebTextCheckingCompletion.h
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextCheckingCompletion_h
+#define WebTextCheckingCompletion_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+struct WebTextCheckingResult;
+template <typename T> class WebVector;
+
+// Gets called back when WebViewClient finished an asynchronous spell checking.
+class WebTextCheckingCompletion {
+public:
+    virtual void didFinishCheckingText(const WebVector<WebTextCheckingResult>&) = 0;
+    virtual void didCancelCheckingText() { };
+protected:
+    ~WebTextCheckingCompletion() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextCheckingResult.h b/public/webpage/WebTextCheckingResult.h
new file mode 100644
index 0000000..3520445
--- /dev/null
+++ b/public/webpage/WebTextCheckingResult.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextCheckingResult_h
+#define WebTextCheckingResult_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebString.h"
+#include "WebTextCheckingType.h"
+
+namespace WebCore {
+struct TextCheckingResult;
+}
+
+namespace WebKit {
+
+// A checked entry of text checking.
+struct WebTextCheckingResult {
+    WebTextCheckingResult()
+        : type(WebTextCheckingTypeSpelling)
+        , location(0)
+        , length(0)
+        , hash(0)
+    {
+    }
+
+    WebTextCheckingResult(WebTextCheckingType type, int location, int length, const WebString& replacement = WebString(), uint32_t hash = 0)
+        : type(type)
+        , location(location)
+        , length(length)
+        , replacement(replacement)
+        , hash(hash)
+    {
+    }
+
+#if WEBKIT_IMPLEMENTATION
+    operator WebCore::TextCheckingResult() const;
+#endif
+
+    WebTextCheckingType type;
+    int location;
+    int length;
+    WebString replacement;
+    uint32_t hash;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextCheckingType.h b/public/webpage/WebTextCheckingType.h
new file mode 100644
index 0000000..3c8dfca
--- /dev/null
+++ b/public/webpage/WebTextCheckingType.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextCheckingType_h
+#define WebTextCheckingType_h
+
+namespace WebKit {
+
+enum WebTextCheckingType {
+    WebTextCheckingTypeSpelling = 1 << 1,
+    WebTextCheckingTypeGrammar  = 1 << 2,
+};
+
+typedef unsigned WebTextCheckingTypeMask;
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextDirection.h b/public/webpage/WebTextDirection.h
new file mode 100644
index 0000000..3d51296
--- /dev/null
+++ b/public/webpage/WebTextDirection.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextDirection_h
+#define WebTextDirection_h
+
+namespace WebKit {
+
+// Represents text directions (or writing directions) of a DOM node.
+enum WebTextDirection {
+    WebTextDirectionDefault,  // Natural writing direction ("inherit")
+    WebTextDirectionLeftToRight,
+    WebTextDirectionRightToLeft,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextFieldDecoratorClient.h b/public/webpage/WebTextFieldDecoratorClient.h
new file mode 100644
index 0000000..fd615c8
--- /dev/null
+++ b/public/webpage/WebTextFieldDecoratorClient.h
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextFieldDecoratorClient_h
+#define WebTextFieldDecoratorClient_h
+
+#include "../platform/WebCString.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class TextFieldDecorator; }
+#endif
+
+namespace WebKit {
+
+class WebInputElement;
+
+class WebTextFieldDecoratorClient {
+public:
+    // The function should return true if the specified input element should
+    // have a decoration icon. This function is called whenever a text field is
+    // created, and should not take much time.
+    virtual bool shouldAddDecorationTo(const WebInputElement&) = 0;
+    // Returns true if the decoration should be visible when it's created.
+    virtual bool visibleByDefault() = 0;
+
+    // Image resource name for the normal state. The image is stretched to
+    // font-size x font-size square. The function must return an existing
+    // resource name.
+    virtual WebCString imageNameForNormalState() = 0;
+    // Image resource name for the disabled state. If this function returns an
+    // empty string, imageNameForNormalState() is used even for the disabled
+    // state.
+    virtual WebCString imageNameForDisabledState() = 0;
+    // Image resource name for the read only state. If this function returns an
+    // empty string, the image same as imageNameForDisabledState() is used.
+    virtual WebCString imageNameForReadOnlyState() = 0;
+    // Image resource name for when the imaged is being hovered over. If this
+    // function returns an empty string, imageNameForNormalState() is used
+    // instead.
+    virtual WebCString imageNameForHoverState() {return WebCString();}
+
+    // This is called when the decoration icon is clicked.
+    virtual void handleClick(WebInputElement&) = 0;
+    // This is called when the input element loses its renderer. An
+    // implementation of this function should not do something which updates
+    // state of WebKit objects.
+    virtual void willDetach(const WebInputElement&) = 0;
+
+#if WEBKIT_IMPLEMENTATION
+    bool isClientFor(WebCore::TextFieldDecorator*);
+#endif
+
+    virtual ~WebTextFieldDecoratorClient() { }
+};
+
+}
+
+#endif // WebTextFieldDecoratorClient_h
diff --git a/public/webpage/WebTextInputInfo.h b/public/webpage/WebTextInputInfo.h
new file mode 100644
index 0000000..bde84ee
--- /dev/null
+++ b/public/webpage/WebTextInputInfo.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2011 Google 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 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 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 WebTextInputInfo_h
+#define WebTextInputInfo_h
+
+#include "../platform/WebString.h"
+#include "WebTextInputType.h"
+
+namespace WebKit {
+
+struct WebTextInputInfo {
+    WebTextInputType type;
+
+    // The value of the currently focused input field.
+    WebString value;
+
+    // The cursor position of the current selection start, or the caret position
+    // if nothing is selected.
+    int selectionStart;
+
+    // The cursor position of the current selection end, or the caret position
+    // if nothing is selected.
+    int selectionEnd;
+
+    // The start position of the current composition, or -1 if there is none.
+    int compositionStart;
+
+    // The end position of the current composition, or -1 if there is none.
+    int compositionEnd;
+
+    WEBKIT_EXPORT bool equals(const WebTextInputInfo&) const;
+
+    WebTextInputInfo()
+        : type(WebTextInputTypeNone)
+        , selectionStart(0)
+        , selectionEnd(0)
+        , compositionStart(-1)
+        , compositionEnd(-1)
+    {
+    }
+};
+
+inline bool operator==(const WebTextInputInfo& a, const WebTextInputInfo& b)
+{
+    return a.equals(b);
+}
+
+inline bool operator!=(const WebTextInputInfo& a, const WebTextInputInfo& b)
+{
+    return !(a == b);
+}
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextInputType.h b/public/webpage/WebTextInputType.h
new file mode 100644
index 0000000..fea0c45
--- /dev/null
+++ b/public/webpage/WebTextInputType.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextInputType_h
+#define WebTextInputType_h
+
+namespace WebKit {
+
+enum WebTextInputType {
+    // Input caret is not in an editable node, no input method shall be used.
+    WebTextInputTypeNone,
+
+    // Input caret is in a normal editable node, any input method can be used.
+    WebTextInputTypeText,
+
+    // Input caret is in a specific input field, and input method may be used
+    // only if it's suitable for the specific input field.
+    WebTextInputTypePassword,
+    WebTextInputTypeSearch,
+    WebTextInputTypeEmail,
+    WebTextInputTypeNumber,
+    WebTextInputTypeTelephone,
+    WebTextInputTypeURL,
+
+    // FIXME: Remove these types once Date like types are not
+    // seen as Text. For now they also exist in WebTextInputType
+    WebTextInputTypeDate,
+    WebTextInputTypeDateTime,
+    WebTextInputTypeDateTimeLocal,
+    WebTextInputTypeMonth,
+    WebTextInputTypeTime,
+    WebTextInputTypeWeek,
+    WebTextInputTypeTextArea,
+
+    // Input caret is in a contenteditable node (not an INPUT field).
+    WebTextInputTypeContentEditable,
+
+    // The focused node is date time field. The date time field does not have
+    // input caret but it is necessary to distinguish from WebTextInputTypeNone
+    // for on-screen keyboard.
+    WebTextInputTypeDateTimeField,
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTextRun.h b/public/webpage/WebTextRun.h
new file mode 100644
index 0000000..d19ea2e
--- /dev/null
+++ b/public/webpage/WebTextRun.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTextRun_h
+#define WebTextRun_h
+
+#include "../platform/WebString.h"
+
+#if WEBKIT_IMPLEMENTATION
+namespace WebCore { class TextRun; }
+#endif
+
+namespace WebKit {
+
+struct WebTextRun {
+    WebTextRun(const WebString& t, bool isRTL, bool hasDirectionalOverride)
+        : text(t)
+        , rtl(isRTL)
+        , directionalOverride(hasDirectionalOverride)
+    {
+    }
+    WebTextRun()
+        : rtl(false)
+        , directionalOverride(false)
+    {
+    }
+
+    WebString text;
+    bool rtl;
+    bool directionalOverride;
+
+#if WEBKIT_IMPLEMENTATION
+    // The resulting WebCore::TextRun will refer to the text in this
+    // struct, so "this" must outlive the WebCore text run.
+    operator WebCore::TextRun() const;
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTimeRange.h b/public/webpage/WebTimeRange.h
new file mode 100644
index 0000000..03def2a
--- /dev/null
+++ b/public/webpage/WebTimeRange.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTimeRange_h
+#define WebTimeRange_h
+
+#include "../platform/WebVector.h"
+
+namespace WebKit {
+
+struct WebTimeRange {
+    WebTimeRange() : start(0), end(0) { }
+    WebTimeRange(float s, float e) : start(s), end(e) { }
+
+    float start;
+    float end;
+};
+
+typedef WebVector<WebTimeRange> WebTimeRanges;
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebTouchPoint.h b/public/webpage/WebTouchPoint.h
new file mode 100644
index 0000000..bfad695
--- /dev/null
+++ b/public/webpage/WebTouchPoint.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebTouchPoint_h
+#define WebTouchPoint_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebPoint.h"
+
+namespace WebKit {
+
+class WebTouchPoint {
+public:
+    WebTouchPoint()
+        : id(0)
+        , state(StateUndefined)
+        , radiusX(0)
+        , radiusY(0)
+        , rotationAngle(0)
+        , force(0)
+    {
+    }
+
+    enum State {
+        StateUndefined,
+        StateReleased,
+        StatePressed,
+        StateMoved,
+        StateStationary,
+        StateCancelled,
+    };
+
+    int id;
+    State state;
+    WebPoint screenPosition;
+    WebPoint position;
+
+    int radiusX;
+    int radiusY;
+    float rotationAngle;
+    float force;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebURLLoaderOptions.h b/public/webpage/WebURLLoaderOptions.h
new file mode 100644
index 0000000..d32b0ce
--- /dev/null
+++ b/public/webpage/WebURLLoaderOptions.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2009, 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebURLLoaderOptions_h
+#define WebURLLoaderOptions_h
+
+namespace WebKit {
+
+struct WebURLLoaderOptions {
+
+    enum CrossOriginRequestPolicy {
+        CrossOriginRequestPolicyDeny,
+        CrossOriginRequestPolicyUseAccessControl,
+        CrossOriginRequestPolicyAllow
+    };
+
+    WebURLLoaderOptions()
+        : untrustedHTTP(false)
+        , sniffContent(false)
+        , allowCredentials(false)
+        , forcePreflight(false)
+        , exposeAllResponseHeaders(false)
+        , crossOriginRequestPolicy(CrossOriginRequestPolicyDeny)
+        { }
+
+    bool untrustedHTTP; // Whether to validate the method and headers as if this was an XMLHttpRequest.
+    bool sniffContent; // Whether to sniff content.
+    bool allowCredentials; // Whether to send HTTP credentials and cookies with the request.
+    bool forcePreflight; // If policy is to use access control, whether to force a preflight for GET, HEAD, and POST requests.
+    bool exposeAllResponseHeaders; // If policy is to use access control, whether to expose non-whitelisted response headers to the client.
+    CrossOriginRequestPolicy crossOriginRequestPolicy;
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebUserGestureIndicator.h b/public/webpage/WebUserGestureIndicator.h
new file mode 100644
index 0000000..d4ff05f
--- /dev/null
+++ b/public/webpage/WebUserGestureIndicator.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebUserGestureIndicator_h
+#define WebUserGestureIndicator_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebUserGestureToken;
+
+class WebUserGestureIndicator {
+public:
+    // Returns true if a user gesture is currently being processed.
+    WEBKIT_EXPORT static bool isProcessingUserGesture();
+
+    // Returns true if a consumable gesture exists and has been successfully consumed.
+    WEBKIT_EXPORT static bool consumeUserGesture();
+
+    // Returns a token for the currently active user gesture. It can be used to
+    // continue processing the user gesture later on using a
+    // WebScopedUserGesture.
+    WEBKIT_EXPORT static WebUserGestureToken currentUserGestureToken();
+};
+
+}
+
+#endif // WebUserGestureIndicator_h
diff --git a/public/webpage/WebUserGestureToken.h b/public/webpage/WebUserGestureToken.h
new file mode 100644
index 0000000..9506ef9
--- /dev/null
+++ b/public/webpage/WebUserGestureToken.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebUserGestureToken_h
+#define WebUserGestureToken_h
+
+#include "../platform/WebPrivatePtr.h"
+
+namespace WebCore {
+class UserGestureToken;
+}
+
+namespace WebKit {
+
+// A WebUserGestureToken allows for storing the user gesture state of the
+// currently active context and reinstantiating it later on to continue
+// processing the user gesture in case it was not consumed meanwhile.
+class WebUserGestureToken {
+public:
+    WebUserGestureToken() { }
+    WebUserGestureToken(const WebUserGestureToken& other) { assign(other); }
+    WebUserGestureToken& operator=(const WebUserGestureToken& other)
+    {
+        assign(other);
+        return *this;
+    }
+    ~WebUserGestureToken() { reset(); }
+
+    WEBKIT_EXPORT bool hasGestures() const;
+    bool isNull() const { return m_token.isNull(); }
+
+#if WEBKIT_IMPLEMENTATION
+    explicit WebUserGestureToken(PassRefPtr<WebCore::UserGestureToken>);
+    operator PassRefPtr<WebCore::UserGestureToken>() const;
+#endif
+
+private:
+    WEBKIT_EXPORT void assign(const WebUserGestureToken&);
+    WEBKIT_EXPORT void reset();
+
+    WebPrivatePtr<WebCore::UserGestureToken> m_token;
+};
+
+} // namespace WebKit
+
+#endif // WebUserGestureToken_h
diff --git a/public/webpage/WebUserMediaClient.h b/public/webpage/WebUserMediaClient.h
new file mode 100644
index 0000000..bbdea18
--- /dev/null
+++ b/public/webpage/WebUserMediaClient.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebUserMediaClient_h
+#define WebUserMediaClient_h
+
+namespace WebKit {
+
+class WebMediaStreamSource;
+class WebUserMediaRequest;
+template <typename T> class WebVector;
+
+class WebUserMediaClient {
+public:
+    virtual ~WebUserMediaClient() { }
+
+    virtual void requestUserMedia(const WebUserMediaRequest&, const WebVector<WebMediaStreamSource>& audioSources, const WebVector<WebMediaStreamSource>& videoSources) { }
+
+    virtual void cancelUserMediaRequest(const WebUserMediaRequest&) = 0;
+};
+
+} // namespace WebKit
+
+#endif // WebUserMediaClient_h
diff --git a/public/webpage/WebUserMediaRequest.h b/public/webpage/WebUserMediaRequest.h
new file mode 100644
index 0000000..d6af651
--- /dev/null
+++ b/public/webpage/WebUserMediaRequest.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebUserMediaRequest_h
+#define WebUserMediaRequest_h
+
+#include "WebSecurityOrigin.h"
+#include "public/platform/WebCommon.h"
+#include "public/platform/WebPrivatePtr.h"
+#include "public/platform/WebString.h"
+
+namespace WebCore {
+class UserMediaRequest;
+}
+
+namespace WebKit {
+class WebDocument;
+class WebMediaConstraints;
+class WebMediaStream;
+class WebMediaStreamSource;
+template <typename T> class WebVector;
+
+class WebUserMediaRequest {
+public:
+    WebUserMediaRequest() { }
+    WebUserMediaRequest(const WebUserMediaRequest& request) { assign(request); }
+    ~WebUserMediaRequest() { reset(); }
+
+    WebUserMediaRequest& operator=(const WebUserMediaRequest& other)
+    {
+        assign(other);
+        return *this;
+    }
+
+    WEBKIT_EXPORT void reset();
+    bool isNull() const { return m_private.isNull(); }
+    WEBKIT_EXPORT bool equals(const WebUserMediaRequest&) const;
+    WEBKIT_EXPORT void assign(const WebUserMediaRequest&);
+
+    WEBKIT_EXPORT bool audio() const;
+    WEBKIT_EXPORT bool video() const;
+    WEBKIT_EXPORT WebMediaConstraints audioConstraints() const;
+    WEBKIT_EXPORT WebMediaConstraints videoConstraints() const;
+
+    WEBKIT_EXPORT WebSecurityOrigin securityOrigin() const;
+    WEBKIT_EXPORT WebDocument ownerDocument() const;
+
+    WEBKIT_EXPORT void requestSucceeded(const WebMediaStream&);
+
+    WEBKIT_EXPORT void requestFailed(const WebString& description = WebString());
+    WEBKIT_EXPORT void requestFailedConstraint(const WebString& constraintName, const WebString& description = WebString());
+
+#if WEBKIT_IMPLEMENTATION
+    WebUserMediaRequest(const PassRefPtr<WebCore::UserMediaRequest>&);
+    operator WebCore::UserMediaRequest*() const;
+#endif
+
+private:
+    WebPrivatePtr<WebCore::UserMediaRequest> m_private;
+};
+
+inline bool operator==(const WebUserMediaRequest& a, const WebUserMediaRequest& b)
+{
+    return a.equals(b);
+}
+
+} // namespace WebKit
+
+#endif // WebUserMediaRequest_h
diff --git a/public/webpage/WebValidationMessageClient.h b/public/webpage/WebValidationMessageClient.h
new file mode 100644
index 0000000..6ba1555
--- /dev/null
+++ b/public/webpage/WebValidationMessageClient.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2013 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebValidationMessageClient_h
+#define WebValidationMessageClient_h
+
+#include "WebTextDirection.h"
+
+namespace WebKit {
+
+class WebString;
+struct WebRect;
+
+// Client interface to handle form validation message UI.
+class WebValidationMessageClient {
+public:
+    // Show a notification popup for the specified form vaidation messages
+    // besides the anchor rectangle. An implementation of this function should
+    // not hide the popup until hideValidationMessage call.
+    virtual void showValidationMessage(const WebRect& anchorInScreen, const WebString& mainText, const WebString& supplementalText, WebTextDirection hint) { }
+
+    // Hide notifation popup for form validation messages.
+    virtual void hideValidationMessage() { }
+
+
+protected:
+    virtual ~WebValidationMessageClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebView.h b/public/webpage/WebView.h
new file mode 100644
index 0000000..8997ef4
--- /dev/null
+++ b/public/webpage/WebView.h
@@ -0,0 +1,507 @@
+/*
+ * Copyright (C) 2009, 2010, 2011, 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebView_h
+#define WebView_h
+
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+#include "WebDragOperation.h"
+#include "WebPageVisibilityState.h"
+#include "WebWidget.h"
+
+namespace WebKit {
+
+class WebAccessibilityObject;
+class WebAutofillClient;
+class WebDevToolsAgent;
+class WebDevToolsAgentClient;
+class WebDragData;
+class WebFrame;
+class WebFrameClient;
+class WebGraphicsContext3D;
+class WebHitTestResult;
+class WebNode;
+class WebPageOverlay;
+class WebPermissionClient;
+class WebPrerendererClient;
+class WebRange;
+class WebSettings;
+class WebSpellCheckClient;
+class WebString;
+class WebTextFieldDecoratorClient;
+class WebValidationMessageClient;
+class WebViewBenchmarkSupport;
+class WebViewClient;
+struct WebActiveWheelFlingParameters;
+struct WebMediaPlayerAction;
+struct WebPluginAction;
+struct WebPoint;
+
+class WebView : public WebWidget {
+public:
+    WEBKIT_EXPORT static const double textSizeMultiplierRatio;
+    WEBKIT_EXPORT static const double minTextSizeMultiplier;
+    WEBKIT_EXPORT static const double maxTextSizeMultiplier;
+    WEBKIT_EXPORT static const float minPageScaleFactor;
+    WEBKIT_EXPORT static const float maxPageScaleFactor;
+
+    // Controls which frames user content is injected into.
+    enum UserContentInjectIn {
+        UserContentInjectInAllFrames,
+        UserContentInjectInTopFrameOnly
+    };
+
+    // Controls which documents user styles are injected into.
+    enum UserStyleInjectionTime {
+        UserStyleInjectInExistingDocuments,
+        UserStyleInjectInSubsequentDocuments
+    };
+
+
+    // Initialization ------------------------------------------------------
+
+    // Creates a WebView that is NOT yet initialized.  You will need to
+    // call initializeMainFrame to finish the initialization.  It is valid
+    // to pass null client pointers.
+    WEBKIT_EXPORT static WebView* create(WebViewClient*);
+
+    // After creating a WebView, you should immediately call this method.
+    // You can optionally modify the settings before calling this method.
+    // The WebFrameClient will receive events for the main frame and any
+    // child frames.  It is valid to pass a null WebFrameClient pointer.
+    virtual void initializeMainFrame(WebFrameClient*) = 0;
+
+    virtual void initializeHelperPluginFrame(WebFrameClient*) = 0;
+
+    // Initializes the various client interfaces.
+    virtual void setAutofillClient(WebAutofillClient*) = 0;
+    virtual void setDevToolsAgentClient(WebDevToolsAgentClient*) = 0;
+    virtual void setPermissionClient(WebPermissionClient*) = 0;
+    virtual void setPrerendererClient(WebPrerendererClient*) = 0;
+    virtual void setSpellCheckClient(WebSpellCheckClient*) = 0;
+    virtual void setValidationMessageClient(WebValidationMessageClient*) = 0;
+    virtual void addTextFieldDecoratorClient(WebTextFieldDecoratorClient*) = 0;
+
+
+    // Options -------------------------------------------------------------
+
+    // The returned pointer is valid for the lifetime of the WebView.
+    virtual WebSettings* settings() = 0;
+
+    // Corresponds to the encoding of the main frame.  Setting the page
+    // encoding may cause the main frame to reload.
+    virtual WebString pageEncoding() const = 0;
+    virtual void setPageEncoding(const WebString&) = 0;
+
+    // Makes the WebView transparent.  This is useful if you want to have
+    // some custom background rendered behind it.
+    virtual bool isTransparent() const = 0;
+    virtual void setIsTransparent(bool) = 0;
+
+    // Controls whether pressing Tab key advances focus to links.
+    virtual bool tabsToLinks() const = 0;
+    virtual void setTabsToLinks(bool) = 0;
+
+    // Method that controls whether pressing Tab key cycles through page
+    // elements or inserts a '\t' char in the focused text area.
+    virtual bool tabKeyCyclesThroughElements() const = 0;
+    virtual void setTabKeyCyclesThroughElements(bool) = 0;
+
+    // Controls the WebView's active state, which may affect the rendering
+    // of elements on the page (i.e., tinting of input elements).
+    virtual bool isActive() const = 0;
+    virtual void setIsActive(bool) = 0;
+
+    // Allows disabling domain relaxation.
+    virtual void setDomainRelaxationForbidden(bool, const WebString& scheme) = 0;
+
+
+    // Closing -------------------------------------------------------------
+
+    // Runs beforeunload handlers for the current page, returning false if
+    // any handler suppressed unloading.
+    virtual bool dispatchBeforeUnloadEvent() = 0;
+
+    // Runs unload handlers for the current page.
+    virtual void dispatchUnloadEvent() = 0;
+
+
+    // Frames --------------------------------------------------------------
+
+    virtual WebFrame* mainFrame() = 0;
+
+    // Returns the frame identified by the given name.  This method
+    // supports pseudo-names like _self, _top, and _blank.  It traverses
+    // the entire frame tree containing this tree looking for a frame that
+    // matches the given name.  If the optional relativeToFrame parameter
+    // is specified, then the search begins with the given frame and its
+    // children.
+    virtual WebFrame* findFrameByName(
+        const WebString& name, WebFrame* relativeToFrame = 0) = 0;
+
+
+    // Focus ---------------------------------------------------------------
+
+    virtual WebFrame* focusedFrame() = 0;
+    virtual void setFocusedFrame(WebFrame*) = 0;
+
+    // Focus the first (last if reverse is true) focusable node.
+    virtual void setInitialFocus(bool reverse) = 0;
+
+    // Clears the focused node (and selection if a text field is focused)
+    // to ensure that a text field on the page is not eating keystrokes we
+    // send it.
+    virtual void clearFocusedNode() = 0;
+
+    // Scrolls the node currently in focus into view.
+    virtual void scrollFocusedNodeIntoView() = 0;
+
+    // Scrolls the node currently in focus into |rect|, where |rect| is in
+    // window space.
+    virtual void scrollFocusedNodeIntoRect(const WebRect&) { }
+
+    // Advance the focus of the WebView forward to the next element or to the
+    // previous element in the tab sequence (if reverse is true).
+    virtual void advanceFocus(bool reverse) { }
+
+    // Animate a scale into the specified find-in-page rect.
+    virtual void zoomToFindInPageRect(const WebRect&) = 0;
+
+
+    // Zoom ----------------------------------------------------------------
+
+    // Returns the current zoom level.  0 is "original size", and each increment
+    // above or below represents zooming 20% larger or smaller to default limits
+    // of 300% and 50% of original size, respectively.  Only plugins use
+    // non whole-numbers, since they might choose to have specific zoom level so
+    // that fixed-width content is fit-to-page-width, for example.
+    virtual double zoomLevel() = 0;
+
+    // Changes the zoom level to the specified level, clamping at the limits
+    // noted above, and returns the current zoom level after applying the
+    // change.
+    //
+    // If |textOnly| is set, only the text will be zoomed; otherwise the entire
+    // page will be zoomed. You can only have either text zoom or full page zoom
+    // at one time.  Changing the mode while the page is zoomed will have odd
+    // effects.
+    virtual double setZoomLevel(bool textOnly, double zoomLevel) = 0;
+
+    // Updates the zoom limits for this view.
+    virtual void zoomLimitsChanged(double minimumZoomLevel,
+                                   double maximumZoomLevel) = 0;
+
+    // Helper functions to convert between zoom level and zoom factor.  zoom
+    // factor is zoom percent / 100, so 300% = 3.0.
+    WEBKIT_EXPORT static double zoomLevelToZoomFactor(double zoomLevel);
+    WEBKIT_EXPORT static double zoomFactorToZoomLevel(double factor);
+
+    // Sets the initial page scale to the given factor. This scale setting overrides
+    // page scale set in the page's viewport meta tag.
+    virtual void setInitialPageScaleOverride(float) = 0;
+
+    // Gets the scale factor of the page, where 1.0 is the normal size, > 1.0
+    // is scaled up, < 1.0 is scaled down.
+    virtual float pageScaleFactor() const = 0;
+
+    // Scales the page and the scroll offset by a given factor, while ensuring
+    // that the new scroll position does not go beyond the edge of the page.
+    virtual void setPageScaleFactorPreservingScrollOffset(float) = 0;
+
+    // Scales a page by a factor of scaleFactor and then sets a scroll position to (x, y).
+    // setPageScaleFactor() magnifies and shrinks a page without affecting layout.
+    // On the other hand, zooming affects layout of the page.
+    virtual void setPageScaleFactor(float scaleFactor, const WebPoint& origin) = 0;
+
+    // PageScaleFactor will be force-clamped between minPageScale and maxPageScale
+    // (and these values will persist until setPageScaleFactorLimits is called
+    // again).
+    virtual void setPageScaleFactorLimits(float minPageScale, float maxPageScale) = 0;
+
+    virtual float minimumPageScaleFactor() const = 0;
+    virtual float maximumPageScaleFactor() const = 0;
+
+    // Save the WebView's current scroll and scale state. Each call to this function
+    // overwrites the previously saved scroll and scale state.
+    virtual void saveScrollAndScaleState() = 0;
+
+    // Restore the previously saved scroll and scale state. After restoring the
+    // state, this function deletes any saved scroll and scale state.
+    virtual void restoreScrollAndScaleState() = 0;
+
+    // Reset any saved values for the scroll and scale state.
+    virtual void resetScrollAndScaleState() = 0;
+
+    // Prevent the web page from setting min/max scale via the viewport meta
+    // tag. This is an accessibility feature that lets folks zoom in to web
+    // pages even if the web page tries to block scaling.
+    virtual void setIgnoreViewportTagScaleLimits(bool) = 0;
+
+    // Returns the "preferred" contents size, defined as the preferred minimum width of the main document's contents
+    // and the minimum height required to display the main document without scrollbars.
+    // The returned size has the page zoom factor applied.
+    virtual WebSize contentsPreferredMinimumSize() = 0;
+
+    // FIXME(aelias): Delete this after Chromium switches to the other name.
+    void setIgnoreViewportTagMaximumScale(bool ignore) { setIgnoreViewportTagScaleLimits(ignore); }
+
+    // The ratio of the current device's screen DPI to the target device's screen DPI.
+    virtual float deviceScaleFactor() const = 0;
+
+    // Sets the ratio as computed by computePageScaleConstraints.
+    virtual void setDeviceScaleFactor(float) = 0;
+
+
+    // Fixed Layout --------------------------------------------------------
+
+    // In fixed layout mode, the layout of the page is independent of the
+    // view port size, given by WebWidget::size().
+
+    virtual bool isFixedLayoutModeEnabled() const = 0;
+    virtual void enableFixedLayoutMode(bool enable) = 0;
+
+    virtual WebSize fixedLayoutSize() const = 0;
+    virtual void setFixedLayoutSize(const WebSize&) = 0;
+
+
+    // Auto-Resize -----------------------------------------------------------
+
+    // In auto-resize mode, the view is automatically adjusted to fit the html
+    // content within the given bounds.
+    virtual void enableAutoResizeMode(
+        const WebSize& minSize,
+        const WebSize& maxSize) = 0;
+
+    // Turn off auto-resize.
+    virtual void disableAutoResizeMode() = 0;
+
+    // Media ---------------------------------------------------------------
+
+    // Performs the specified media player action on the node at the given location.
+    virtual void performMediaPlayerAction(
+        const WebMediaPlayerAction&, const WebPoint& location) = 0;
+
+    // Performs the specified plugin action on the node at the given location.
+    virtual void performPluginAction(
+        const WebPluginAction&, const WebPoint& location) = 0;
+
+
+    // Data exchange -------------------------------------------------------
+
+    // Do a hit test at given point and return the HitTestResult.
+    virtual WebHitTestResult hitTestResultAt(const WebPoint&) = 0;
+
+    // Copy to the clipboard the image located at a particular point in the
+    // WebView (if there is such an image)
+    virtual void copyImageAt(const WebPoint&) = 0;
+
+    // Notifies the WebView that a drag has terminated.
+    virtual void dragSourceEndedAt(
+        const WebPoint& clientPoint, const WebPoint& screenPoint,
+        WebDragOperation operation) = 0;
+
+    // Notifies the WebView that a drag is going on.
+    virtual void dragSourceMovedTo(
+        const WebPoint& clientPoint, const WebPoint& screenPoint,
+        WebDragOperation operation) = 0;
+
+    // Notfies the WebView that the system drag and drop operation has ended.
+    virtual void dragSourceSystemDragEnded() = 0;
+
+    // Callback methods when a drag-and-drop operation is trying to drop
+    // something on the WebView.
+    virtual WebDragOperation dragTargetDragEnter(
+        const WebDragData&,
+        const WebPoint& clientPoint, const WebPoint& screenPoint,
+        WebDragOperationsMask operationsAllowed,
+        int keyModifiers) = 0;
+    virtual WebDragOperation dragTargetDragOver(
+        const WebPoint& clientPoint, const WebPoint& screenPoint,
+        WebDragOperationsMask operationsAllowed,
+        int keyModifiers) = 0;
+    virtual void dragTargetDragLeave() = 0;
+    virtual void dragTargetDrop(
+        const WebPoint& clientPoint, const WebPoint& screenPoint,
+        int keyModifiers) = 0;
+
+    // Retrieves a list of spelling markers.
+    virtual void spellingMarkers(WebVector<uint32_t>* markers) = 0;
+
+
+    // Support for resource loading initiated by plugins -------------------
+
+    // Returns next unused request identifier which is unique within the
+    // parent Page.
+    virtual unsigned long createUniqueIdentifierForRequest() = 0;
+
+
+    // Developer tools -----------------------------------------------------
+
+    // Inspect a particular point in the WebView.  (x = -1 || y = -1) is a
+    // special case, meaning inspect the current page and not a specific
+    // point.
+    virtual void inspectElementAt(const WebPoint&) = 0;
+
+    // Settings used by the inspector.
+    virtual WebString inspectorSettings() const = 0;
+    virtual void setInspectorSettings(const WebString&) = 0;
+    virtual bool inspectorSetting(const WebString& key,
+                                  WebString* value) const = 0;
+    virtual void setInspectorSetting(const WebString& key,
+                                     const WebString& value) = 0;
+
+    // The embedder may optionally engage a WebDevToolsAgent.  This may only
+    // be set once per WebView.
+    virtual WebDevToolsAgent* devToolsAgent() = 0;
+
+
+    // Accessibility -------------------------------------------------------
+
+    // Returns the accessibility object for this view.
+    virtual WebAccessibilityObject accessibilityObject() = 0;
+
+
+    // Autofill  -----------------------------------------------------------
+
+    // Notifies the WebView that Autofill suggestions are available for a node.
+    // |itemIDs| is a vector of IDs for the menu items. A positive itemID is a
+    // unique ID for the Autofill entries. Other MenuItemIDs are defined in
+    // WebAutofillClient.h
+    virtual void applyAutofillSuggestions(
+        const WebNode&,
+        const WebVector<WebString>& names,
+        const WebVector<WebString>& labels,
+        const WebVector<WebString>& icons,
+        const WebVector<int>& itemIDs,
+        int separatorIndex = -1) = 0;
+
+    // Hides any popup (suggestions, selects...) that might be showing.
+    virtual void hidePopups() = 0;
+
+    virtual void selectAutofillSuggestionAtIndex(unsigned listIndex) = 0;
+
+
+    // Context menu --------------------------------------------------------
+
+    virtual void performCustomContextMenuAction(unsigned action) = 0;
+
+    // Shows a context menu for the currently focused element.
+    virtual void showContextMenu() = 0;
+
+
+    // Popup menu ----------------------------------------------------------
+
+    // Sets whether select popup menus should be rendered by the browser.
+    WEBKIT_EXPORT static void setUseExternalPopupMenus(bool);
+
+
+    // Visited link state --------------------------------------------------
+
+    // Tells all WebView instances to update the visited link state for the
+    // specified hash.
+    WEBKIT_EXPORT static void updateVisitedLinkState(unsigned long long hash);
+
+    // Tells all WebView instances to update the visited state for all
+    // their links.
+    WEBKIT_EXPORT static void resetVisitedLinkState();
+
+
+    // Custom colors -------------------------------------------------------
+
+    virtual void setScrollbarColors(unsigned inactiveColor,
+                                    unsigned activeColor,
+                                    unsigned trackColor) = 0;
+
+    virtual void setSelectionColors(unsigned activeBackgroundColor,
+                                    unsigned activeForegroundColor,
+                                    unsigned inactiveBackgroundColor,
+                                    unsigned inactiveForegroundColor) = 0;
+
+    // User scripts --------------------------------------------------------
+    WEBKIT_EXPORT static void addUserStyleSheet(const WebString& sourceCode,
+                                                const WebVector<WebString>& patterns,
+                                                UserContentInjectIn injectIn,
+                                                UserStyleInjectionTime injectionTime = UserStyleInjectInSubsequentDocuments);
+    WEBKIT_EXPORT static void removeAllUserContent();
+
+    // Modal dialog support ------------------------------------------------
+
+    // Call these methods before and after running a nested, modal event loop
+    // to suspend script callbacks and resource loads.
+    WEBKIT_EXPORT static void willEnterModalLoop();
+    WEBKIT_EXPORT static void didExitModalLoop();
+
+    // Called to inform the WebView that a wheel fling animation was started externally (for instance
+    // by the compositor) but must be completed by the WebView.
+    virtual void transferActiveWheelFlingAnimation(const WebActiveWheelFlingParameters&) = 0;
+
+    virtual bool setEditableSelectionOffsets(int start, int end) = 0;
+    virtual bool setCompositionFromExistingText(int compositionStart, int compositionEnd, const WebVector<WebCompositionUnderline>& underlines) = 0;
+    virtual void extendSelectionAndDelete(int before, int after) = 0;
+
+    virtual bool isSelectionEditable() const = 0;
+
+    virtual void setShowPaintRects(bool) = 0;
+    virtual void setShowFPSCounter(bool) = 0;
+    virtual void setContinuousPaintingEnabled(bool) = 0;
+
+    // Benchmarking support -------------------------------------------------
+
+    virtual WebViewBenchmarkSupport* benchmarkSupport() { return 0; }
+
+    // Visibility -----------------------------------------------------------
+
+    // Sets the visibility of the WebView.
+    virtual void setVisibilityState(WebPageVisibilityState visibilityState,
+                                    bool isInitialState) { }
+
+    // PageOverlay ----------------------------------------------------------
+
+    // Adds/removes page overlay to this WebView. These functions change the
+    // graphical appearance of the WebView. WebPageOverlay paints the
+    // contents of the page overlay. It also provides an z-order number for
+    // the page overlay. The z-order number defines the paint order the page
+    // overlays. Page overlays with larger z-order number will be painted after
+    // page overlays with smaller z-order number. That is, they appear above
+    // the page overlays with smaller z-order number. If two page overlays have
+    // the same z-order number, the later added one will be on top.
+    virtual void addPageOverlay(WebPageOverlay*, int /*z-order*/) = 0;
+    virtual void removePageOverlay(WebPageOverlay*) = 0;
+
+    // Testing functionality for TestRunner ---------------------------------
+
+protected:
+    ~WebView() {}
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebViewBenchmarkSupport.h b/public/webpage/WebViewBenchmarkSupport.h
new file mode 100644
index 0000000..b69cc76
--- /dev/null
+++ b/public/webpage/WebViewBenchmarkSupport.h
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebViewBenchmarkSupport_h
+#define WebViewBenchmarkSupport_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebSize.h"
+
+namespace WebKit {
+
+// Support for benchmarks accessing the WebView.
+class WebViewBenchmarkSupport {
+public:
+    enum PaintMode {
+        // Paint the entire page.
+        PaintModeEverything
+    };
+
+    // Client for creating canvases where multiple canvases
+    // may be used for layered rendering and sizes defined by the benchmark.
+    // Also contains reporting methods called by the WebViewBenchmarkSupport
+    // when painting is about to occur and when painting is complete.
+    class PaintClient {
+    public:
+        // Called by the WebViewBenchmarkSupport when painting is about to occur.
+        // PaintClient is expected to return an appropriately-sized canvas
+        // for the WebViewBenchmarkSupport to paint on.
+        virtual WebCanvas* willPaint(const WebSize&) { return 0; }
+
+        // Called by the WebViewBenchmarkSupport when painting is complete.
+        // The canvas will not be used after this call and can be destroyed
+        // if necessary.
+        virtual void didPaint(WebCanvas*) { }
+    protected:
+        virtual ~PaintClient() { }
+    };
+
+    // Paints the web view on canvases created from the client, using the given
+    // paint mode.
+    virtual void paint(PaintClient*, PaintMode) = 0;
+
+protected:
+    virtual ~WebViewBenchmarkSupport() { }
+};
+} // namespace WebKit
+
+#endif // WebViewBenchmarkSupport_h
diff --git a/public/webpage/WebViewClient.h b/public/webpage/WebViewClient.h
new file mode 100644
index 0000000..70a39e7
--- /dev/null
+++ b/public/webpage/WebViewClient.h
@@ -0,0 +1,397 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebViewClient_h
+#define WebViewClient_h
+
+#include "../platform/WebColor.h"
+#include "../platform/WebGraphicsContext3D.h"
+#include "../platform/WebString.h"
+#include "WebAccessibilityNotification.h"
+#include "WebContentDetectionResult.h"
+#include "WebDragOperation.h"
+#include "WebEditingAction.h"
+#include "WebFileChooserCompletion.h"
+#include "WebFileChooserParams.h"
+#include "WebPageVisibilityState.h"
+#include "WebPopupType.h"
+#include "WebTextAffinity.h"
+#include "WebTextDirection.h"
+#include "WebWidgetClient.h"
+
+namespace WebKit {
+
+class WebAccessibilityObject;
+class WebColorChooser;
+class WebColorChooserClient;
+class WebCompositorOutputSurface;
+class WebDateTimeChooserCompletion;
+class WebDeviceOrientationClient;
+class WebDragData;
+class WebElement;
+class WebExternalPopupMenu;
+class WebExternalPopupMenuClient;
+class WebFileChooserCompletion;
+class WebFrame;
+class WebGeolocationClient;
+class WebGeolocationService;
+class WebGestureEvent;
+class WebHelperPlugin;
+class WebHitTestResult;
+class WebIconLoadingCompletion;
+class WebImage;
+class WebInputElement;
+class WebKeyboardEvent;
+class WebNode;
+class WebNotificationPresenter;
+class WebRange;
+class WebSpeechInputController;
+class WebSpeechInputListener;
+class WebSpeechRecognizer;
+class WebStorageNamespace;
+class WebURL;
+class WebURLRequest;
+class WebUserMediaClient;
+class WebView;
+class WebWidget;
+struct WebConsoleMessage;
+struct WebContextMenuData;
+struct WebDateTimeChooserParams;
+struct WebPoint;
+struct WebPopupMenuInfo;
+struct WebRect;
+struct WebSize;
+struct WebWindowFeatures;
+
+// Since a WebView is a WebWidget, a WebViewClient is a WebWidgetClient.
+// Virtual inheritance allows an implementation of WebWidgetClient to be
+// easily reused as part of an implementation of WebViewClient.
+class WebViewClient : virtual public WebWidgetClient {
+public:
+    // Factory methods -----------------------------------------------------
+
+    // Create a new related WebView.  This method must clone its session storage
+    // so any subsequent calls to createSessionStorageNamespace conform to the
+    // WebStorage specification.
+    // The request parameter is only for the client to check if the request
+    // could be fulfilled.  The client should not load the request.
+    // The policy parameter indicates how the new view will be displayed in
+    // WebWidgetClient::show.
+    virtual WebView* createView(WebFrame* creator,
+                                const WebURLRequest& request,
+                                const WebWindowFeatures& features,
+                                const WebString& name,
+                                WebNavigationPolicy policy) {
+        return 0;
+    }
+
+    // Create a new WebPopupMenu.  In the second form, the client is
+    // responsible for rendering the contents of the popup menu.
+    virtual WebWidget* createPopupMenu(WebPopupType) { return 0; }
+    virtual WebWidget* createPopupMenu(const WebPopupMenuInfo&) { return 0; }
+    virtual WebExternalPopupMenu* createExternalPopupMenu(
+        const WebPopupMenuInfo&, WebExternalPopupMenuClient*) { return 0; }
+
+    // Create a session storage namespace object associated with this WebView.
+    virtual WebStorageNamespace* createSessionStorageNamespace(unsigned quota) { return 0; }
+
+
+    // Misc ----------------------------------------------------------------
+
+    // A new message was added to the console.
+    virtual void didAddMessageToConsole(
+        const WebConsoleMessage&, const WebString& sourceName, unsigned sourceLine) { }
+
+    // Called when script in the page calls window.print().  If frame is
+    // non-null, then it selects a particular frame, including its
+    // children, to print.  Otherwise, the main frame and its children
+    // should be printed.
+    virtual void printPage(WebFrame*) { }
+
+    // Called to retrieve the provider of desktop notifications.
+    virtual WebNotificationPresenter* notificationPresenter() { return 0; }
+
+    // Called to request an icon for the specified filenames.
+    // The icon is shown in a file upload control.
+    virtual bool queryIconForFiles(const WebVector<WebString>& filenames, WebIconLoadingCompletion*) { return false; }
+
+    // This method enumerates all the files in the path. It returns immediately
+    // and asynchronously invokes the WebFileChooserCompletion with all the
+    // files in the directory. Returns false if the WebFileChooserCompletion
+    // will never be called.
+    virtual bool enumerateChosenDirectory(const WebString& path, WebFileChooserCompletion*) { return false; }
+
+    // Creates the main WebFrame for the specified WebHelperPlugin.
+    // Called by WebHelperPlugin to provide the WebFrameClient interface for the WebFrame.
+    virtual void initializeHelperPluginWebFrame(WebHelperPlugin*) { }
+
+
+    // Navigational --------------------------------------------------------
+
+    // These notifications bracket any loading that occurs in the WebView.
+    virtual void didStartLoading() { }
+    virtual void didStopLoading() { }
+
+    // Notification that some progress was made loading the current page.
+    // loadProgress is a value between 0 (nothing loaded) and 1.0 (frame fully
+    // loaded).
+    virtual void didChangeLoadProgress(WebFrame*, double loadProgress) { }
+
+    // Editing -------------------------------------------------------------
+
+    // These methods allow the client to intercept and overrule editing
+    // operations.
+    virtual bool shouldBeginEditing(const WebRange&) { return true; }
+    virtual bool shouldEndEditing(const WebRange&) { return true; }
+    virtual bool shouldInsertNode(
+        const WebNode&, const WebRange&, WebEditingAction) { return true; }
+    virtual bool shouldInsertText(
+        const WebString&, const WebRange&, WebEditingAction) { return true; }
+    virtual bool shouldChangeSelectedRange(
+        const WebRange& from, const WebRange& to, WebTextAffinity,
+        bool stillSelecting) { return true; }
+    virtual bool shouldDeleteRange(const WebRange&) { return true; }
+    virtual bool shouldApplyStyle(const WebString& style, const WebRange&) { return true; }
+
+    virtual void didBeginEditing() { }
+    virtual void didCancelCompositionOnSelectionChange() { }
+    virtual void didChangeSelection(bool isSelectionEmpty) { }
+    virtual void didChangeContents() { }
+    virtual void didExecuteCommand(const WebString& commandName) { }
+    virtual void didEndEditing() { }
+    virtual void didChangeFormState(const WebNode&) { }
+
+    // This method is called in response to WebView's handleInputEvent()
+    // when the default action for the current keyboard event is not
+    // suppressed by the page, to give the embedder a chance to handle
+    // the keyboard event specially.
+    //
+    // Returns true if the keyboard event was handled by the embedder,
+    // indicating that the default action should be suppressed.
+    virtual bool handleCurrentKeyboardEvent() { return false; }
+
+    // Dialogs -------------------------------------------------------------
+
+    // This method opens the color chooser and returns a new WebColorChooser
+    // instance. If there is a WebColorChooser already from the last time this
+    // was called, it ends the color chooser by calling endChooser, and replaces
+    // it with the new one.
+    virtual WebColorChooser* createColorChooser(WebColorChooserClient*,
+                                                const WebColor&) { return 0; }
+
+    // This method returns immediately after showing the dialog. When the
+    // dialog is closed, it should call the WebFileChooserCompletion to
+    // pass the results of the dialog. Returns false if
+    // WebFileChooseCompletion will never be called.
+    virtual bool runFileChooser(const WebFileChooserParams&,
+                                WebFileChooserCompletion*) { return false; }
+
+    // Ask users to choose date/time for the specified parameters. When a user
+    // chooses a value, an implementation of this function should call
+    // WebDateTimeChooserCompletion::didChooseValue or didCancelChooser. If the
+    // implementation opened date/time chooser UI successfully, it should return
+    // true. This function is used only if ExternalDateTimeChooser is used.
+    virtual bool openDateTimeChooser(const WebDateTimeChooserParams&, WebDateTimeChooserCompletion*) { return false; }
+
+    // Displays a modal alert dialog containing the given message.  Returns
+    // once the user dismisses the dialog.
+    virtual void runModalAlertDialog(
+        WebFrame*, const WebString& message) { }
+
+    // Displays a modal confirmation dialog with the given message as
+    // description and OK/Cancel choices.  Returns true if the user selects
+    // 'OK' or false otherwise.
+    virtual bool runModalConfirmDialog(
+        WebFrame*, const WebString& message) { return false; }
+
+    // Displays a modal input dialog with the given message as description
+    // and OK/Cancel choices.  The input field is pre-filled with
+    // defaultValue.  Returns true if the user selects 'OK' or false
+    // otherwise.  Upon returning true, actualValue contains the value of
+    // the input field.
+    virtual bool runModalPromptDialog(
+        WebFrame*, const WebString& message, const WebString& defaultValue,
+        WebString* actualValue) { return false; }
+
+    // Displays a modal confirmation dialog containing the given message as
+    // description and OK/Cancel choices, where 'OK' means that it is okay
+    // to proceed with closing the view.  Returns true if the user selects
+    // 'OK' or false otherwise.
+    virtual bool runModalBeforeUnloadDialog(
+        WebFrame*, const WebString& message) { return true; }
+
+
+    // UI ------------------------------------------------------------------
+
+    // Called when script modifies window.status
+    virtual void setStatusText(const WebString&) { }
+
+    // Called when hovering over an anchor with the given URL.
+    virtual void setMouseOverURL(const WebURL&) { }
+
+    // Called when keyboard focus switches to an anchor with the given URL.
+    virtual void setKeyboardFocusURL(const WebURL&) { }
+
+    // Shows a context menu with commands relevant to a specific element on
+    // the given frame. Additional context data is supplied.
+    virtual void showContextMenu(WebFrame*, const WebContextMenuData&) { }
+
+    // Called when a drag-n-drop operation should begin.
+    virtual void startDragging(WebFrame*, const WebDragData&, WebDragOperationsMask, const WebImage&, const WebPoint& dragImageOffset) { }
+
+    // Called to determine if drag-n-drop operations may initiate a page
+    // navigation.
+    virtual bool acceptsLoadDrops() { return true; }
+
+    // Take focus away from the WebView by focusing an adjacent UI element
+    // in the containing window.
+    virtual void focusNext() { }
+    virtual void focusPrevious() { }
+
+    // Called when a new node gets focused.
+    virtual void focusedNodeChanged(const WebNode&) { }
+
+    virtual void numberOfWheelEventHandlersChanged(unsigned) { }
+
+    // Indicates two things:
+    //   1) This view may have a new layout now.
+    //   2) Calling layout() is a no-op.
+    // After calling WebWidget::layout(), expect to get this notification
+    // unless the view did not need a layout.
+    virtual void didUpdateLayout() { }
+
+    // Return true to swallow the input event if the embedder will start a disambiguation popup
+    virtual bool didTapMultipleTargets(const WebGestureEvent&, const WebVector<WebRect>& targetRects) { return false; }
+
+    // Session history -----------------------------------------------------
+
+    // Tells the embedder to navigate back or forward in session history by
+    // the given offset (relative to the current position in session
+    // history).
+    virtual void navigateBackForwardSoon(int offset) { }
+
+    // Returns the number of history items before/after the current
+    // history item.
+    virtual int historyBackListCount() { return 0; }
+    virtual int historyForwardListCount() { return 0; }
+
+    // Called to notify the embedder when a new history item is added.
+    virtual void didAddHistoryItem() { }
+
+
+    // Accessibility -------------------------------------------------------
+
+    // Notifies embedder about an accessibility notification.
+    virtual void postAccessibilityNotification(const WebAccessibilityObject&, WebAccessibilityNotification) { }
+
+
+    // Developer tools -----------------------------------------------------
+
+    // Called to notify the client that the inspector's settings were
+    // changed and should be saved.  See WebView::inspectorSettings.
+    virtual void didUpdateInspectorSettings() { }
+
+    virtual void didUpdateInspectorSetting(const WebString& key, const WebString& value) { }
+
+    // Geolocation ---------------------------------------------------------
+
+    // Access the embedder API for (client-based) geolocation client .
+    virtual WebGeolocationClient* geolocationClient() { return 0; }
+    // Access the embedder API for (non-client-based) geolocation services.
+    virtual WebGeolocationService* geolocationService() { return 0; }
+
+    // Speech --------------------------------------------------------------
+
+    // Access the embedder API for speech input services.
+    virtual WebSpeechInputController* speechInputController(
+        WebSpeechInputListener*) { return 0; }
+
+    // Access the embedder API for speech recognition services.
+    virtual WebSpeechRecognizer* speechRecognizer() { return 0; }
+
+    // Device Orientation --------------------------------------------------
+
+    // Access the embedder API for device orientation services.
+    virtual WebDeviceOrientationClient* deviceOrientationClient() { return 0; }
+
+    // Zoom ----------------------------------------------------------------
+
+    // Informs the browser that the zoom levels for this frame have changed from
+    // the default values.
+    virtual void zoomLimitsChanged(double minimumLevel, double maximumLevel) { }
+
+    // Informs the browser that the zoom level has changed as a result of an
+    // action that wasn't initiated by the client.
+    virtual void zoomLevelChanged() { }
+
+    // Registers a new URL handler for the given protocol.
+    virtual void registerProtocolHandler(const WebString& scheme,
+                                         const WebString& baseUrl,
+                                         const WebString& url,
+                                         const WebString& title) { }
+
+    // Visibility -----------------------------------------------------------
+
+    // Returns the current visibility of the WebView.
+    virtual WebPageVisibilityState visibilityState() const
+    {
+        return WebPageVisibilityStateVisible;
+    }
+
+    // Media Streams -------------------------------------------------------
+
+    virtual WebUserMediaClient* userMediaClient() { return 0; }
+
+
+    // Content detection ----------------------------------------------------
+
+    // Retrieves detectable content (e.g., email addresses, phone numbers)
+    // around a hit test result. The embedder should use platform-specific
+    // content detectors to analyze the region around the hit test result.
+    virtual WebContentDetectionResult detectContentAround(const WebHitTestResult&) { return WebContentDetectionResult(); }
+
+    // Schedules a new content intent with the provided url.
+    virtual void scheduleContentIntent(const WebURL&) { }
+
+    // Cancels any previously scheduled content intents that have not yet launched.
+    virtual void cancelScheduledContentIntents() { }
+
+    // Draggable regions ----------------------------------------------------
+
+    // Informs the browser that the draggable regions have been updated.
+    virtual void draggableRegionsChanged() { }
+
+protected:
+    ~WebViewClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebWidget.h b/public/webpage/WebWidget.h
new file mode 100644
index 0000000..c201b67
--- /dev/null
+++ b/public/webpage/WebWidget.h
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebWidget_h
+#define WebWidget_h
+
+#include "../platform/WebCanvas.h"
+#include "../platform/WebCommon.h"
+#include "../platform/WebRect.h"
+#include "../platform/WebSize.h"
+#include "WebCompositionUnderline.h"
+#include "WebTextDirection.h"
+#include "WebTextInputInfo.h"
+
+namespace WebKit {
+
+class WebInputEvent;
+class WebLayerTreeView;
+class WebMouseEvent;
+class WebString;
+struct WebPoint;
+struct WebRenderingStats;
+template <typename T> class WebVector;
+
+class WebWidget {
+public:
+    // This method closes and deletes the WebWidget.
+    virtual void close() { }
+
+    // Returns the current size of the WebWidget.
+    virtual WebSize size() { return WebSize(); }
+
+    // Used to group a series of resize events. For example, if the user
+    // drags a resizer then willStartLiveResize will be called, followed by a
+    // sequence of resize events, ending with willEndLiveResize when the user
+    // lets go of the resizer.
+    virtual void willStartLiveResize() { }
+
+    // Called to resize the WebWidget.
+    virtual void resize(const WebSize&) { }
+
+    // Ends a group of resize events that was started with a call to
+    // willStartLiveResize.
+    virtual void willEndLiveResize() { }
+
+    // Called to notify the WebWidget of entering/exiting fullscreen mode. The
+    // resize method may be called between will{Enter,Exit}FullScreen and
+    // did{Enter,Exit}FullScreen.
+    virtual void willEnterFullScreen() { }
+    virtual void didEnterFullScreen() { }
+    virtual void willExitFullScreen() { }
+    virtual void didExitFullScreen() { }
+
+    // Called to update imperative animation state. This should be called before
+    // paint, although the client can rate-limit these calls.
+    virtual void animate(double monotonicFrameBeginTime) { }
+
+    // Called to layout the WebWidget. This MUST be called before Paint,
+    // and it may result in calls to WebWidgetClient::didInvalidateRect.
+    virtual void layout() { }
+
+    // Called to toggle the WebWidget in or out of force compositing mode. This
+    // should be called before paint.
+    virtual void enterForceCompositingMode(bool enter) { }
+
+    // Called to notify the WebWidget that the widget has exited compositing
+    // mode and cannot reenter.
+    virtual void didExitCompositingMode() { }
+
+    enum PaintOptions {
+        // Attempt to fulfill the painting request by reading back from the
+        // compositor, assuming we're using a compositor to render.
+        ReadbackFromCompositorIfAvailable,
+
+        // Force the widget to rerender onto the canvas using software. This
+        // mode ignores 3d transforms and ignores GPU-resident content, such
+        // as video, canvas, and WebGL.
+        //
+        // Note: This option exists on OS(ANDROID) and will hopefully be
+        //       removed once the link disambiguation feature renders using
+        //       the compositor.
+        ForceSoftwareRenderingAndIgnoreGPUResidentContent,
+    };
+
+    // Called to paint the rectangular region within the WebWidget
+    // onto the specified canvas at (viewPort.x,viewPort.y). You MUST call
+    // Layout before calling this method. It is okay to call paint
+    // multiple times once layout has been called, assuming no other
+    // changes are made to the WebWidget (e.g., once events are
+    // processed, it should be assumed that another call to layout is
+    // warranted before painting again).
+    virtual void paint(WebCanvas*, const WebRect& viewPort, PaintOptions = ReadbackFromCompositorIfAvailable) { }
+
+    // Returns true if we've started tracking repaint rectangles.
+    virtual bool isTrackingRepaints() const { return false; }
+
+    // Indicates that the compositing surface associated with this WebWidget is
+    // ready to use.
+    virtual void setCompositorSurfaceReady() { }
+
+    // Temporary method for the embedder to notify the WebWidget that the widget
+    // has taken damage, e.g. due to a window expose. This method will be
+    // removed when the WebWidget inversion patch lands --- http://crbug.com/112837
+    virtual void setNeedsRedraw() { }
+
+    // Called to inform the WebWidget of a change in theme.
+    // Implementors that cache rendered copies of widgets need to re-render
+    // on receiving this message
+    virtual void themeChanged() { }
+
+    // Called to inform the WebWidget of an input event. Returns true if
+    // the event has been processed, false otherwise.
+    virtual bool handleInputEvent(const WebInputEvent&) { return false; }
+
+    // Called to inform the WebWidget of the mouse cursor's visibility.
+    virtual void setCursorVisibilityState(bool isVisible) { }
+
+    // Check whether the given point hits any registered touch event handlers.
+    virtual bool hasTouchEventHandlersAt(const WebPoint&) { return true; }
+
+    // Applies a scroll delta to the root layer, which is bundled with a page
+    // scale factor that may apply a CSS transform on the whole document (used
+    // for mobile-device pinch zooming). This is triggered by events sent to the
+    // compositor thread.
+    virtual void applyScrollAndScale(const WebSize& scrollDelta, float scaleFactor) { }
+
+    // Called to inform the WebWidget that mouse capture was lost.
+    virtual void mouseCaptureLost() { }
+
+    // Called to inform the WebWidget that it has gained or lost keyboard focus.
+    virtual void setFocus(bool) { }
+
+    // Called to inform the WebWidget of a new composition text.
+    // If selectionStart and selectionEnd has the same value, then it indicates
+    // the input caret position. If the text is empty, then the existing
+    // composition text will be cancelled.
+    // Returns true if the composition text was set successfully.
+    virtual bool setComposition(
+        const WebString& text,
+        const WebVector<WebCompositionUnderline>& underlines,
+        int selectionStart,
+        int selectionEnd) { return false; }
+
+    // Called to inform the WebWidget to confirm an ongoing composition.
+    // This method is same as confirmComposition(WebString());
+    // Returns true if there is an ongoing composition.
+    virtual bool confirmComposition() { return false; }
+
+    // Called to inform the WebWidget to confirm an ongoing composition with a
+    // new composition text. If the text is empty then the current composition
+    // text is confirmed. If there is no ongoing composition, then deletes the
+    // current selection and inserts the text. This method has no effect if
+    // there is no ongoing composition and the text is empty.
+    // Returns true if there is an ongoing composition or the text is inserted.
+    virtual bool confirmComposition(const WebString& text) { return false; }
+
+    // Fetches the character range of the current composition, also called the
+    // "marked range." Returns true and fills the out-paramters on success;
+    // returns false on failure.
+    virtual bool compositionRange(size_t* location, size_t* length) { return false; }
+
+    // Returns information about the current text input of this WebWidget.
+    virtual WebTextInputInfo textInputInfo() { return WebTextInputInfo(); }
+
+    // Returns the current text input type of this WebWidget.
+    // FIXME: Remove this method. It's redundant with textInputInfo().
+    virtual WebTextInputType textInputType() { return WebTextInputTypeNone; }
+
+    // Returns the anchor and focus bounds of the current selection.
+    // If the selection range is empty, it returns the caret bounds.
+    virtual bool selectionBounds(WebRect& anchor, WebRect& focus) const { return false; }
+
+    // Returns the text direction at the start and end bounds of the current selection.
+    // If the selection range is empty, it returns false.
+    virtual bool selectionTextDirection(WebTextDirection& start, WebTextDirection& end) const { return false; }
+
+    // Returns true if the selection range is nonempty and its anchor is first
+    // (i.e its anchor is its start).
+    virtual bool isSelectionAnchorFirst() const { return false; }
+
+    // Fetch the current selection range of this WebWidget. If there is no
+    // selection, it will output a 0-length range with the location at the
+    // caret. Returns true and fills the out-paramters on success; returns false
+    // on failure.
+    virtual bool caretOrSelectionRange(size_t* location, size_t* length) { return false; }
+
+    // Changes the text direction of the selected input node.
+    virtual void setTextDirection(WebTextDirection) { }
+
+    // Returns true if the WebWidget uses GPU accelerated compositing
+    // to render its contents.
+    virtual bool isAcceleratedCompositingActive() const { return false; }
+
+    // The WebLayerTreeView initialized on this WebWidgetClient will be going away and
+    // is no longer safe to access.
+    virtual void willCloseLayerTreeView() { }
+
+    // Calling WebWidgetClient::requestPointerLock() will result in one
+    // return call to didAcquirePointerLock() or didNotAcquirePointerLock().
+    virtual void didAcquirePointerLock() { }
+    virtual void didNotAcquirePointerLock() { }
+
+    // Pointer lock was held, but has been lost. This may be due to a
+    // request via WebWidgetClient::requestPointerUnlock(), or for other
+    // reasons such as the user exiting lock, window focus changing, etc.
+    virtual void didLosePointerLock() { }
+
+    // Informs the WebWidget that the resizer rect changed. Happens for example
+    // on mac, when a widget appears below the WebWidget without changing the
+    // WebWidget's size (WebWidget::resize() automatically checks the resizer
+    // rect.)
+    virtual void didChangeWindowResizerRect() { }
+
+    // The page background color. Can be used for filling in areas without
+    // content.
+    virtual WebColor backgroundColor() const { return 0xFFFFFFFF; /* SK_ColorWHITE */ }
+
+protected:
+    ~WebWidget() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebWidgetClient.h b/public/webpage/WebWidgetClient.h
new file mode 100644
index 0000000..14c818b
--- /dev/null
+++ b/public/webpage/WebWidgetClient.h
@@ -0,0 +1,184 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebWidgetClient_h
+#define WebWidgetClient_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebRect.h"
+#include "WebNavigationPolicy.h"
+#include "WebScreenInfo.h"
+#include "../platform/WebLayerTreeView.h"
+
+namespace WebKit {
+
+class WebGestureEvent;
+class WebString;
+class WebWidget;
+struct WebCursorInfo;
+struct WebSize;
+
+class WebWidgetClient {
+public:
+    // Called when a region of the WebWidget needs to be re-painted.
+    virtual void didInvalidateRect(const WebRect&) { }
+
+    // Called when a region of the WebWidget, given by clipRect, should be
+    // scrolled by the specified dx and dy amounts.
+    virtual void didScrollRect(int dx, int dy, const WebRect& clipRect) { }
+
+    // Called when the Widget has changed size as a result of an auto-resize.
+    virtual void didAutoResize(const WebSize& newSize) { }
+
+    // Called when the compositor is enabled or disabled. The parameter to
+    // didActivateCompositor() is meaningless.
+    // FIXME: Remove parameter from didActivateCompositor().
+    virtual void didActivateCompositor(int deprecated) { }
+    virtual void didDeactivateCompositor() { }
+
+    // Attempt to initialize compositing for this widget. If this is successful,
+    // layerTreeView() will return a valid WebLayerTreeView.
+    virtual void initializeLayerTreeView() { }
+
+    // Return a compositing view used for this widget. This is owned by the
+    // WebWidgetClient.
+    virtual WebLayerTreeView* layerTreeView() { return 0; }
+
+    // Sometimes the WebWidget enters a state where it will generate a sequence
+    // of invalidations that should not, by themselves, trigger the compositor
+    // to schedule a new frame. This call indicates to the embedder that it
+    // should suppress compositor scheduling temporarily.
+    virtual void suppressCompositorScheduling(bool enable) { }
+
+    // Indicates to the embedder that the compositor is about to begin a
+    // frame. This is primarily to signal to flow control mechanisms that a
+    // frame is beginning, not to perform actual painting work.
+    virtual void willBeginCompositorFrame() { }
+
+    // Indicates to the embedder that the WebWidget is ready for additional
+    // input.
+    virtual void didBecomeReadyForAdditionalInput() { }
+
+    // Called for compositing mode when a frame commit operation has finished.
+    virtual void didCommitCompositorFrame() { }
+
+    // Called for compositing mode when the draw commands for a WebKit-side
+    // frame have been issued.
+    virtual void didCommitAndDrawCompositorFrame() { }
+
+    // Called for compositing mode when swapbuffers has been posted in the GPU
+    // process.
+    virtual void didCompleteSwapBuffers() { }
+
+    // Called when a call to WebWidget::animate is required
+    virtual void scheduleAnimation() { }
+
+    // Called when the widget acquires or loses focus, respectively.
+    virtual void didFocus() { }
+    virtual void didBlur() { }
+
+    // Called when the cursor for the widget changes.
+    virtual void didChangeCursor(const WebCursorInfo&) { }
+
+    // Called when the widget should be closed.  WebWidget::close() should
+    // be called asynchronously as a result of this notification.
+    virtual void closeWidgetSoon() { }
+
+    // Called to show the widget according to the given policy.
+    virtual void show(WebNavigationPolicy) { }
+
+    // Called to block execution of the current thread until the widget is
+    // closed.
+    virtual void runModal() { }
+
+    // Called to enter/exit fullscreen mode. If enterFullScreen returns true,
+    // then WebWidget::{will,Did}EnterFullScreen should bound resizing the
+    // WebWidget into fullscreen mode. Similarly, when exitFullScreen is
+    // called, WebWidget::{will,Did}ExitFullScreen should bound resizing the
+    // WebWidget out of fullscreen mode.
+    virtual bool enterFullScreen() { return false; }
+    virtual void exitFullScreen() { }
+
+    // Called to get/set the position of the widget in screen coordinates.
+    virtual WebRect windowRect() { return WebRect(); }
+    virtual void setWindowRect(const WebRect&) { }
+
+    // Called when a tooltip should be shown at the current cursor position.
+    virtual void setToolTipText(const WebString&, WebTextDirection hint) { }
+
+    // Called to get the position of the resizer rect in window coordinates.
+    virtual WebRect windowResizerRect() { return WebRect(); }
+
+    // Called to get the position of the root window containing the widget
+    // in screen coordinates.
+    virtual WebRect rootWindowRect() { return WebRect(); }
+
+    // Called to query information about the screen where this widget is
+    // displayed.
+    virtual WebScreenInfo screenInfo() { return WebScreenInfo(); }
+
+    // Called to get the scale factor of the display.
+    virtual float deviceScaleFactor() { return 1; }
+
+    // When this method gets called, WebWidgetClient implementation should
+    // reset the input method by cancelling any ongoing composition.
+    virtual void resetInputMethod() { }
+
+    // Requests to lock the mouse cursor. If true is returned, the success
+    // result will be asynchronously returned via a single call to
+    // WebWidget::didAcquirePointerLock() or
+    // WebWidget::didNotAcquirePointerLock().
+    // If false, the request has been denied synchronously.
+    virtual bool requestPointerLock() { return false; }
+
+    // Cause the pointer lock to be released. This may be called at any time,
+    // including when a lock is pending but not yet acquired.
+    // WebWidget::didLosePointerLock() is called when unlock is complete.
+    virtual void requestPointerUnlock() { }
+
+    // Returns true iff the pointer is locked to this widget.
+    virtual bool isPointerLocked() { return false; }
+
+    // Called when a gesture event is handled.
+    virtual void didHandleGestureEvent(const WebGestureEvent& event, bool eventCancelled) { }
+
+    // Called to update if touch events should be sent.
+    virtual void hasTouchEventHandlers(bool) { }
+
+    // Called when WebKit programmatically scrolls.
+    virtual void didProgrammaticallyScroll(const WebPoint& scrollPoint) { }
+
+protected:
+    ~WebWidgetClient() { }
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebWindowFeatures.h b/public/webpage/WebWindowFeatures.h
new file mode 100644
index 0000000..7bd7ce5
--- /dev/null
+++ b/public/webpage/WebWindowFeatures.h
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebWindowFeatures_h
+#define WebWindowFeatures_h
+
+#include "../platform/WebCommon.h"
+#include "../platform/WebString.h"
+#include "../platform/WebVector.h"
+
+#if WEBKIT_IMPLEMENTATION
+#include "core/page/WindowFeatures.h"
+#endif
+
+namespace WebKit {
+
+struct WebWindowFeatures {
+    float x;
+    bool xSet;
+    float y;
+    bool ySet;
+    float width;
+    bool widthSet;
+    float height;
+    bool heightSet;
+
+    bool menuBarVisible;
+    bool statusBarVisible;
+    bool toolBarVisible;
+    bool locationBarVisible;
+    bool scrollbarsVisible;
+    bool resizable;
+
+    bool fullscreen;
+    bool dialog;
+    WebVector<WebString> additionalFeatures;
+
+    WebWindowFeatures()
+        : xSet(false)
+        , ySet(false)
+        , widthSet(false)
+        , heightSet(false)
+        , menuBarVisible(true)
+        , statusBarVisible(true)
+        , toolBarVisible(true)
+        , locationBarVisible(true)
+        , scrollbarsVisible(true)
+        , resizable(true)
+        , fullscreen(false)
+        , dialog(false)
+    {
+    }
+
+
+#if WEBKIT_IMPLEMENTATION
+    WebWindowFeatures(const WebCore::WindowFeatures& f)
+        : x(f.x)
+        , xSet(f.xSet)
+        , y(f.y)
+        , ySet(f.ySet)
+        , width(f.width)
+        , widthSet(f.widthSet)
+        , height(f.height)
+        , heightSet(f.heightSet)
+        , menuBarVisible(f.menuBarVisible)
+        , statusBarVisible(f.statusBarVisible)
+        , toolBarVisible(f.toolBarVisible)
+        , locationBarVisible(f.locationBarVisible)
+        , scrollbarsVisible(f.scrollbarsVisible)
+        , resizable(f.resizable)
+        , fullscreen(f.fullscreen)
+        , dialog(f.dialog)
+        , additionalFeatures(f.additionalFeatures)
+    {
+    }
+#endif
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/WebWorkerInfo.h b/public/webpage/WebWorkerInfo.h
new file mode 100644
index 0000000..d94b410
--- /dev/null
+++ b/public/webpage/WebWorkerInfo.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2012 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebWorkerInfo_h
+#define WebWorkerInfo_h
+
+#include "../platform/WebCommon.h"
+
+namespace WebKit {
+
+class WebWorkerInfo {
+public:
+    WEBKIT_EXPORT static unsigned dedicatedWorkerCount();
+};
+
+}
+#endif
diff --git a/public/webpage/android/WebInputEventFactory.h b/public/webpage/android/WebInputEventFactory.h
new file mode 100644
index 0000000..1e8435c
--- /dev/null
+++ b/public/webpage/android/WebInputEventFactory.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInputEventFactory_h
+#define WebInputEventFactory_h
+
+#include "../../platform/WebCommon.h"
+#include "../WebInputEvent.h"
+
+namespace WebKit {
+
+class WebKeyboardEvent;
+
+class WebInputEventFactory {
+public:
+    enum MouseEventType {
+        MouseEventTypeDown = 0,
+        MouseEventTypeUp,
+        MouseEventTypeMove,
+    };
+
+    enum MouseWheelDirectionType {
+        MouseWheelDirectionTypeUp = 0,
+        MouseWheelDirectionTypeDown,
+        MouseWheelDirectionTypeLeft,
+        MouseWheelDirectionTypeRight,
+    };
+
+    WEBKIT_EXPORT static WebKeyboardEvent keyboardEvent(WebInputEvent::Type,
+                                                        int modifiers,
+                                                        double timeStampSeconds,
+                                                        int keycode,
+                                                        WebUChar unicodeCharacter,
+                                                        bool isSystemKey);
+
+    WEBKIT_EXPORT static WebMouseEvent mouseEvent(MouseEventType,
+                                                  WebMouseEvent::Button,
+                                                  double timeStampSeconds,
+                                                  int windowX,
+                                                  int windowY,
+                                                  int modifiers,
+                                                  int clickCount);
+
+    WEBKIT_EXPORT static WebMouseWheelEvent mouseWheelEvent(MouseWheelDirectionType,
+                                                            double timeStampSeconds,
+                                                            int windowX,
+                                                            int windowY);
+
+    WEBKIT_EXPORT static WebGestureEvent gestureEvent(WebInputEvent::Type,
+                                                      double timeStampSeconds,
+                                                      int x,
+                                                      int y,
+                                                      float deltaX,
+                                                      float deltaY,
+                                                      int modifiers);
+
+    WEBKIT_EXPORT static WebGestureEvent gestureEvent(WebInputEvent::Type,
+                                                      double timeStampSeconds,
+                                                      int x,
+                                                      int y,
+                                                      int modifiers);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/android/WebSandboxSupport.h b/public/webpage/android/WebSandboxSupport.h
new file mode 100644
index 0000000..05ec35e
--- /dev/null
+++ b/public/webpage/android/WebSandboxSupport.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WEBKIT_MIGRATE_HEADERS_TO_PLATFORM
+#include "../../platform/android/WebSandboxSupport.h"
+#endif
diff --git a/public/webpage/default/WebRenderTheme.h b/public/webpage/default/WebRenderTheme.h
new file mode 100644
index 0000000..48b2e6a
--- /dev/null
+++ b/public/webpage/default/WebRenderTheme.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2009 Joel Stanley. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebRenderTheme_h
+#define WebRenderTheme_h
+
+#include "../../platform/WebCommon.h"
+
+namespace WebKit {
+
+// Set caret blink interval for text input areas.
+WEBKIT_EXPORT void setCaretBlinkInterval(double);
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/gtk/WebInputEventFactory.h b/public/webpage/gtk/WebInputEventFactory.h
new file mode 100644
index 0000000..d497a22
--- /dev/null
+++ b/public/webpage/gtk/WebInputEventFactory.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInputEventFactory_h
+#define WebInputEventFactory_h
+
+#include "../../platform/WebCommon.h"
+
+typedef struct _GdkEventButton GdkEventButton;
+typedef struct _GdkEventMotion GdkEventMotion;
+typedef struct _GdkEventCrossing GdkEventCrossing;
+typedef struct _GdkEventScroll GdkEventScroll;
+typedef struct _GdkEventKey GdkEventKey;
+
+namespace WebKit {
+
+class WebKeyboardEvent;
+class WebMouseEvent;
+class WebMouseWheelEvent;
+
+class WebInputEventFactory {
+public:
+    WEBKIT_EXPORT static WebKeyboardEvent keyboardEvent(const GdkEventKey*);
+    WEBKIT_EXPORT static WebKeyboardEvent keyboardEvent(wchar_t character, int state, double timeStampSeconds);
+    WEBKIT_EXPORT static WebMouseEvent mouseEvent(const GdkEventButton*);
+    WEBKIT_EXPORT static WebMouseEvent mouseEvent(const GdkEventMotion*);
+    WEBKIT_EXPORT static WebMouseEvent mouseEvent(const GdkEventCrossing*);
+    WEBKIT_EXPORT static WebMouseWheelEvent mouseWheelEvent(const GdkEventScroll*);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/linux/WebFontInfo.h b/public/webpage/linux/WebFontInfo.h
new file mode 100644
index 0000000..706b1bc
--- /dev/null
+++ b/public/webpage/linux/WebFontInfo.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../../platform/linux/WebFontInfo.h"
diff --git a/public/webpage/linux/WebFontRenderStyle.h b/public/webpage/linux/WebFontRenderStyle.h
new file mode 100644
index 0000000..aa67abb
--- /dev/null
+++ b/public/webpage/linux/WebFontRenderStyle.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2010 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 "../../platform/linux/WebFontRenderStyle.h"
diff --git a/public/webpage/linux/WebFontRendering.h b/public/webpage/linux/WebFontRendering.h
new file mode 100644
index 0000000..8903924
--- /dev/null
+++ b/public/webpage/linux/WebFontRendering.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebFontRendering_h
+#define WebFontRendering_h
+
+#include "../../platform/WebCommon.h"
+#include <SkFontHost.h>
+#include <SkPaint.h>
+
+namespace WebKit {
+
+class WebFontRendering {
+public:
+    // Set global font renderering preferences.
+
+    WEBKIT_EXPORT static void setHinting(SkPaint::Hinting);
+    WEBKIT_EXPORT static void setAutoHint(bool);
+    WEBKIT_EXPORT static void setUseBitmaps(bool);
+    WEBKIT_EXPORT static void setAntiAlias(bool);
+    WEBKIT_EXPORT static void setSubpixelRendering(bool);
+    WEBKIT_EXPORT static void setSubpixelPositioning(bool);
+    WEBKIT_EXPORT static void setLCDOrder(SkFontHost::LCDOrder);
+    WEBKIT_EXPORT static void setLCDOrientation(SkFontHost::LCDOrientation);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/linux/WebSandboxSupport.h b/public/webpage/linux/WebSandboxSupport.h
new file mode 100644
index 0000000..4a4e6f7
--- /dev/null
+++ b/public/webpage/linux/WebSandboxSupport.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WEBKIT_MIGRATE_HEADERS_TO_PLATFORM
+#include "../../platform/linux/WebSandboxSupport.h"
+#endif
diff --git a/public/webpage/mac/WebInputEventFactory.h b/public/webpage/mac/WebInputEventFactory.h
new file mode 100644
index 0000000..e153997
--- /dev/null
+++ b/public/webpage/mac/WebInputEventFactory.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInputEventFactory_h
+#define WebInputEventFactory_h
+
+#include "../../platform/WebCommon.h"
+
+#ifdef __OBJC__
+@class NSEvent;
+@class NSView;
+#else
+class NSEvent;
+class NSView;
+#endif
+
+namespace WebKit {
+
+class WebKeyboardEvent;
+class WebMouseEvent;
+class WebMouseWheelEvent;
+class WebGestureEvent;
+
+class WebInputEventFactory {
+public:
+    WEBKIT_EXPORT static WebKeyboardEvent keyboardEvent(NSEvent*);
+    WEBKIT_EXPORT static WebKeyboardEvent keyboardEvent(wchar_t character, int modifiers, double timeStampSeconds);
+    WEBKIT_EXPORT static WebMouseEvent mouseEvent(NSEvent*, NSView*);
+    WEBKIT_EXPORT static WebMouseWheelEvent mouseWheelEvent(NSEvent*, NSView*);
+    WEBKIT_EXPORT static WebGestureEvent gestureEvent(NSEvent *, NSView *);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/mac/WebSandboxSupport.h b/public/webpage/mac/WebSandboxSupport.h
new file mode 100644
index 0000000..41b99a7
--- /dev/null
+++ b/public/webpage/mac/WebSandboxSupport.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WEBKIT_MIGRATE_HEADERS_TO_PLATFORM
+#include "../../platform/mac/WebSandboxSupport.h"
+#endif
diff --git a/public/webpage/mac/WebScreenInfoFactory.h b/public/webpage/mac/WebScreenInfoFactory.h
new file mode 100644
index 0000000..9cde312
--- /dev/null
+++ b/public/webpage/mac/WebScreenInfoFactory.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScreenInfoFactory_h
+#define WebScreenInfoFactory_h
+
+#include "../../platform/WebCommon.h"
+
+#ifdef __OBJC__
+@class NSView;
+#else
+class NSView;
+#endif
+
+namespace WebKit {
+
+struct WebScreenInfo;
+
+class WebScreenInfoFactory {
+public:
+    WEBKIT_EXPORT static WebScreenInfo screenInfo(NSView*);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/mac/WebSubstringUtil.h b/public/webpage/mac/WebSubstringUtil.h
new file mode 100644
index 0000000..14f3c99
--- /dev/null
+++ b/public/webpage/mac/WebSubstringUtil.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebSubstringUtil_h
+#define WebSubstringUtil_h
+
+#include "../../platform/WebCommon.h"
+
+namespace WebKit {
+class WebFrame;
+}
+
+#if __OBJC__
+@class NSAttributedString;
+#else
+class NSAttributedString;
+#endif
+
+namespace WebKit {
+
+class WebSubstringUtil {
+public:
+    // Returns an autoreleased NSAttributedString that is a substring of the
+    // Frame at the given range, or nil on error.
+    WEBKIT_EXPORT static NSAttributedString* attributedSubstringInRange(WebFrame*,
+        size_t location,
+        size_t length);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/win/WebInputEventFactory.h b/public/webpage/win/WebInputEventFactory.h
new file mode 100644
index 0000000..620216a
--- /dev/null
+++ b/public/webpage/win/WebInputEventFactory.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebInputEventFactory_h
+#define WebInputEventFactory_h
+
+#include "../../platform/WebCommon.h"
+
+#include <windows.h>
+
+namespace WebKit {
+
+class WebKeyboardEvent;
+class WebMouseEvent;
+class WebMouseWheelEvent;
+
+class WebInputEventFactory {
+public:
+    WEBKIT_EXPORT static WebKeyboardEvent keyboardEvent(HWND, UINT, WPARAM, LPARAM);
+    WEBKIT_EXPORT static WebMouseEvent mouseEvent(HWND, UINT, WPARAM, LPARAM);
+    WEBKIT_EXPORT static WebMouseWheelEvent mouseWheelEvent(HWND, UINT, WPARAM, LPARAM);
+
+    // Windows only provides information on whether a click was a single or
+    // double click, while we need to know the click count past two. The
+    // WebInputEventFactory keeps internal state to allow it to synthesize
+    // that information. In some cases, like fast-running tests, that
+    // information is known to be stale and needs to be reset; that is the
+    // function of resetLastClickState().
+    WEBKIT_EXPORT static void resetLastClickState();
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/win/WebSandboxSupport.h b/public/webpage/win/WebSandboxSupport.h
new file mode 100644
index 0000000..acb574a
--- /dev/null
+++ b/public/webpage/win/WebSandboxSupport.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WEBKIT_MIGRATE_HEADERS_TO_PLATFORM
+#include "../../platform/win/WebSandboxSupport.h"
+#endif
diff --git a/public/webpage/win/WebScreenInfoFactory.h b/public/webpage/win/WebScreenInfoFactory.h
new file mode 100644
index 0000000..7c0d067
--- /dev/null
+++ b/public/webpage/win/WebScreenInfoFactory.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2009 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScreenInfoFactory_h
+#define WebScreenInfoFactory_h
+
+#include "../../platform/WebCommon.h"
+
+typedef struct HWND__* HWND;
+
+namespace WebKit {
+
+struct WebScreenInfo;
+
+class WebScreenInfoFactory {
+public:
+    WEBKIT_EXPORT static WebScreenInfo screenInfo(HWND);
+};
+
+} // namespace WebKit
+
+#endif
diff --git a/public/webpage/x11/WebScreenInfoFactory.h b/public/webpage/x11/WebScreenInfoFactory.h
new file mode 100644
index 0000000..f38f88a
--- /dev/null
+++ b/public/webpage/x11/WebScreenInfoFactory.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 Google 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:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * 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.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
+ * OWNER OR 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 WebScreenInfoFactory_h
+#define WebScreenInfoFactory_h
+
+#include "../../platform/WebCommon.h"
+
+typedef struct _XDisplay Display;
+
+namespace WebKit {
+
+struct WebScreenInfo;
+
+class WebScreenInfoFactory {
+public:
+    WEBKIT_EXPORT static WebScreenInfo screenInfo(Display*, int screenNumber);
+};
+
+} // namespace WebKit
+
+#endif
