am d9b562d6: am 032a9065: Merge "Cherry-pick WebKit change 53541 to fix style in WebCore/bridge/Bridge" into eclair-mr2

Merge commit 'd9b562d65e56e563079a5a7778a41c98aa6cf1b5'

* commit 'd9b562d65e56e563079a5a7778a41c98aa6cf1b5':
  Cherry-pick WebKit change 53541 to fix style in WebCore/bridge/Bridge
diff --git a/Android.mk b/Android.mk
index b383867..6df03ae 100644
--- a/Android.mk
+++ b/Android.mk
@@ -72,6 +72,7 @@
 LOCAL_C_INCLUDES := \
 	$(JNI_H_INCLUDE) \
 	$(LOCAL_PATH)/WebKit/android/icu \
+	bionic/ \
 	external/ \
 	external/icu4c/common \
 	external/icu4c/i18n \
@@ -131,8 +132,7 @@
 	$(LOCAL_PATH)/WebKit/android/WebCoreSupport \
 	$(LOCAL_PATH)/WebKit/android/jni \
 	$(LOCAL_PATH)/WebKit/android/nav \
-	$(LOCAL_PATH)/WebKit/android/plugins \
-	$(LOCAL_PATH)/WebKit/android/stl
+	$(LOCAL_PATH)/WebKit/android/plugins
 
 LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \
 	$(LOCAL_PATH)/JavaScriptCore \
@@ -219,6 +219,7 @@
 LOCAL_CFLAGS += -fno-strict-aliasing
 LOCAL_CFLAGS += -include "WebCorePrefix.h"
 LOCAL_CFLAGS += -fvisibility=hidden
+LOCAL_CFLAGS += -D__SGI_STL_INTERNAL_PAIR_H
 
 ifeq ($(TARGET_ARCH),arm)
 LOCAL_CFLAGS += -Darm
@@ -264,6 +265,8 @@
 # We have to use the android version of libdl when we are not on the simulator
 ifneq ($(TARGET_SIMULATOR),true)
 LOCAL_SHARED_LIBRARIES += libdl
+LOCAL_C_INCLUDES += \
+	external/stlport
 endif
 
 # Build the list of static libraries
diff --git a/JavaScriptCore/wtf/Platform.h b/JavaScriptCore/wtf/Platform.h
index 18e2b5c..960b253 100644
--- a/JavaScriptCore/wtf/Platform.h
+++ b/JavaScriptCore/wtf/Platform.h
@@ -538,7 +538,7 @@
 
 #if PLATFORM(ANDROID)
 #define WTF_USE_PTHREADS 1
-#define WTF_PLATFORM_SGL 1
+#define WTF_PLATFORM_SKIA 1
 #define USE_SYSTEM_MALLOC 1
 #define ENABLE_MAC_JAVA_BRIDGE 1
 #define LOG_DISABLED 1
diff --git a/WebCore/platform/network/android/CookieClient.h b/JavaScriptCore/wtf/android/AndroidThreading.h
similarity index 75%
copy from WebCore/platform/network/android/CookieClient.h
copy to JavaScriptCore/wtf/android/AndroidThreading.h
index be2963e..27f548c 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/JavaScriptCore/wtf/android/AndroidThreading.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2009, The Android Open Source Project
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,24 +23,17 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef COOKIE_CLIENT_H
-#define COOKIE_CLIENT_H
+#ifndef AndroidThreading_h
+#define AndroidThreading_h
 
-#include "KURL.h"
-#include "PlatformString.h"
+namespace WTF {
 
-using namespace WebCore;
-
-namespace android {
-
-class CookieClient {
-
+// An interface to the embedding layer, which provides threading support.
+class AndroidThreading {
 public:
-    virtual ~CookieClient() {}
-    virtual void setCookies(const KURL& url, const String& value) = 0;
-    virtual String cookies(const KURL& url) = 0;
-    virtual bool cookiesEnabled() = 0;
+    static void scheduleDispatchFunctionsOnMainThread();
 };
 
-}
-#endif
+} // namespace WTF
+
+#endif // AndroidThreading_h
diff --git a/JavaScriptCore/wtf/android/MainThreadAndroid.cpp b/JavaScriptCore/wtf/android/MainThreadAndroid.cpp
index c28f953..5e5f7b1 100644
--- a/JavaScriptCore/wtf/android/MainThreadAndroid.cpp
+++ b/JavaScriptCore/wtf/android/MainThreadAndroid.cpp
@@ -26,25 +26,17 @@
 #include "config.h"
 #include "MainThread.h"
 
-#include "JavaSharedClient.h"
-
-using namespace android;
+#include "AndroidThreading.h"
 
 namespace WTF {
 
-// Callback in the main thread.
-static void timeoutFired(void*)
-{
-    dispatchFunctionsFromMainThread();
-}
-
 void initializeMainThreadPlatform()
 {
 }
 
 void scheduleDispatchFunctionsOnMainThread()
 {
-    JavaSharedClient::EnqueueFunctionPtr(timeoutFired, 0);
+    AndroidThreading::scheduleDispatchFunctionsOnMainThread();
 }
 
 } // namespace WTF
diff --git a/WebCore/Android.derived.jscbindings.mk b/WebCore/Android.derived.jscbindings.mk
index d7ca0a4..cc7ba28 100644
--- a/WebCore/Android.derived.jscbindings.mk
+++ b/WebCore/Android.derived.jscbindings.mk
@@ -289,6 +289,7 @@
 # page
 GEN := \
     $(intermediates)/page/JSBarInfo.h \
+    $(intermediates)/page/JSConnection.h \
     $(intermediates)/page/JSConsole.h \
     $(intermediates)/page/JSCoordinates.h \
     $(intermediates)/page/JSDOMSelection.h \
diff --git a/WebCore/Android.derived.v8bindings.mk b/WebCore/Android.derived.v8bindings.mk
index a9f403a..e3bd4ca 100644
--- a/WebCore/Android.derived.v8bindings.mk
+++ b/WebCore/Android.derived.v8bindings.mk
@@ -281,6 +281,7 @@
 # page
 GEN := \
     $(intermediates)/bindings/V8BarInfo.h \
+    $(intermediates)/bindings/V8Connection.h \
     $(intermediates)/bindings/V8Console.h \
     $(intermediates)/bindings/V8Coordinates.h \
     $(intermediates)/bindings/V8DOMSelection.h \
diff --git a/WebCore/Android.mk b/WebCore/Android.mk
index 0ab375b..7c3781a 100644
--- a/WebCore/Android.mk
+++ b/WebCore/Android.mk
@@ -326,6 +326,7 @@
 	\
 	page/BarInfo.cpp \
 	page/Chrome.cpp \
+	page/Connection.cpp \
 	page/Console.cpp \
 	page/ContextMenuController.cpp \
 	page/DOMSelection.cpp \
@@ -401,6 +402,8 @@
 	platform/android/GeolocationServiceBridge.cpp \
 	platform/android/KeyEventAndroid.cpp \
 	platform/android/LocalizedStringsAndroid.cpp \
+	platform/android/PlatformTouchEventAndroid.cpp \
+	platform/android/PlatformTouchPointAndroid.cpp \
 	platform/android/PopupMenuAndroid.cpp \
 	platform/android/RenderThemeAndroid.cpp \
 	platform/android/ScreenAndroid.cpp \
@@ -517,7 +520,7 @@
 	platform/network/ResourceRequestBase.cpp \
 	platform/network/ResourceResponseBase.cpp \
 	\
-	platform/network/android/Cookie.cpp \
+	platform/network/android/CookieJarAndroid.cpp \
 	platform/network/android/NetworkStateNotifierAndroid.cpp \
 	platform/network/android/ResourceHandleAndroid.cpp \
 	platform/network/android/ResourceRequestAndroid.cpp \
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 80ec313..386f29b 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -160,6 +160,85 @@
         * bridge/jni/jsc/JavaInstanceJSC.cpp: Copied from WebCore/bridge/jni/jni_instance.cpp.
         * bridge/jni/jsc/JavaInstanceJSC.h: Copied from WebCore/bridge/jni/jni_instance.h.
 
+2009-12-13  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=32499
+        Add client based Geolocation provider
+
+        Add first cut of a client based Geolocation provider. This is guarded by
+        ENABLE(CLIENT_BASED_GEOLOCATION) and is off by default for now. This adds a
+        GeolocationControllerClient interface that no-one currently implements,
+        but will in a subsequent patch.
+
+        * GNUmakefile.am:
+        * WebCore.base.exp:
+        * WebCore.gypi:
+        * WebCore.pro:
+        * WebCore.vcproj/WebCore.vcproj:
+        * WebCore.xcodeproj/project.pbxproj:
+        * WebCoreSources.bkl:
+        * page/Geolocation.cpp:
+        (WebCore::createGeopositionFromGeolocationPosition):
+        (WebCore::createPositionErrorFromGeolocationError):
+        (WebCore::Geolocation::Geolocation):
+        (WebCore::Geolocation::~Geolocation):
+        (WebCore::Geolocation::disconnectFrame):
+        (WebCore::Geolocation::lastPosition):
+        (WebCore::Geolocation::startRequest):
+        (WebCore::Geolocation::fatalErrorOccurred):
+        (WebCore::Geolocation::requestTimedOut):
+        (WebCore::Geolocation::clearWatch):
+        (WebCore::Geolocation::handleError):
+        (WebCore::Geolocation::positionChanged):
+        (WebCore::Geolocation::makeSuccessCallbacks):
+        (WebCore::Geolocation::errorOccurred):
+        (WebCore::Geolocation::geolocationServicePositionChanged):
+        (WebCore::Geolocation::geolocationServiceErrorOccurred):
+        (WebCore::Geolocation::startUpdating):
+        (WebCore::Geolocation::stopUpdating):
+        * page/Geolocation.h:
+        * page/GeolocationController.cpp: Added.
+        (WebCore::GeolocationController::GeolocationController):
+        (WebCore::GeolocationController::~GeolocationController):
+        (WebCore::GeolocationController::addObserver):
+        (WebCore::GeolocationController::removeObserver):
+        (WebCore::GeolocationController::positionChanged):
+        (WebCore::GeolocationController::errorOccurred):
+        (WebCore::GeolocationController::lastPosition):
+        * page/GeolocationController.h: Added.
+        * page/GeolocationControllerClient.h: Added.
+        (WebCore::GeolocationControllerClient::~GeolocationControllerClient):
+        * page/GeolocationError.h: Added.
+        (WebCore::GeolocationError::):
+        (WebCore::GeolocationError::create):
+        (WebCore::GeolocationError::code):
+        (WebCore::GeolocationError::message):
+        * page/GeolocationPosition.h: Added.
+        (WebCore::GeolocationPosition::create):
+        (WebCore::GeolocationPosition::timestamp):
+        (WebCore::GeolocationPosition::latitude):
+        (WebCore::GeolocationPosition::longitude):
+        (WebCore::GeolocationPosition::accuracy):
+        (WebCore::GeolocationPosition::altitude):
+        (WebCore::GeolocationPosition::altitudeAccuracy):
+        (WebCore::GeolocationPosition::heading):
+        (WebCore::GeolocationPosition::speed):
+        (WebCore::GeolocationPosition::canProvideAltitude):
+        (WebCore::GeolocationPosition::canProvideAltitudeAccuracy):
+        (WebCore::GeolocationPosition::canProvideHeading):
+        (WebCore::GeolocationPosition::canProvideSpeed):
+        (WebCore::GeolocationPosition::GeolocationPosition):
+        * page/Geoposition.h:
+        (WebCore::Geoposition::create):
+        * page/Page.cpp:
+        (WebCore::Page::Page):
+        * page/Page.h:
+        (WebCore::Page::geolocationController):
+        * svg/graphics/SVGImage.cpp:
+        (WebCore::SVGImage::dataChanged):
+
 2009-12-10  Alexey Proskuryakov  <ap@apple.com>
 
         Reviewed by Darin Adler.
diff --git a/WebCore/GNUmakefile.am b/WebCore/GNUmakefile.am
index fecc04c..c3e7c2e 100644
--- a/WebCore/GNUmakefile.am
+++ b/WebCore/GNUmakefile.am
@@ -1348,6 +1348,11 @@
 	WebCore/page/FrameView.h \
 	WebCore/page/Geolocation.cpp \
 	WebCore/page/Geolocation.h \
+	WebCore/page/GeolocationController.cpp \
+	WebCore/page/GeolocationController.h \
+	WebCore/page/GeolocationControllerClient.h \
+	WebCore/page/GeolocationError.h \
+	WebCore/page/GeolocationPosition.h \
 	WebCore/page/Geoposition.h \
 	WebCore/page/HaltablePlugin.h \
 	WebCore/page/History.cpp \
diff --git a/WebCore/WebCore.base.exp b/WebCore/WebCore.base.exp
index 8df5524..c29629a 100644
--- a/WebCore/WebCore.base.exp
+++ b/WebCore/WebCore.base.exp
@@ -292,6 +292,7 @@
 __ZN7WebCore14ResourceHandle20forceContentSniffingEv
 __ZN7WebCore14ResourceLoader14cancelledErrorEv
 __ZN7WebCore14ResourceLoader19setShouldBufferDataEb
+__ZN7WebCore14SVGSMILElement13isSMILElementEPNS_4NodeE
 __ZN7WebCore14SecurityOrigin16createFromStringERKNS_6StringE
 __ZN7WebCore14SecurityOrigin18setLocalLoadPolicyENS0_15LocalLoadPolicyE
 __ZN7WebCore14SecurityOrigin18shouldHideReferrerERKNS_4KURLERKNS_6StringE
@@ -414,6 +415,7 @@
 __ZN7WebCore21JavaScriptDebugServer6sharedEv
 __ZN7WebCore21PlatformKeyboardEvent24disambiguateKeyDownEventENS0_4TypeEb
 __ZN7WebCore21PlatformKeyboardEventC1EP7NSEvent
+__ZN7WebCore21SVGDocumentExtensions21sampleAnimationAtTimeERKNS_6StringEPNS_14SVGSMILElementEd
 __ZN7WebCore21SerializedScriptValue11deserializeEPK15OpaqueJSContextPPK13OpaqueJSValue
 __ZN7WebCore21SerializedScriptValue6createEPK15OpaqueJSContextPK13OpaqueJSValuePS6_
 __ZN7WebCore21SerializedScriptValueD1Ev
@@ -495,7 +497,7 @@
 __ZN7WebCore4Page8goToItemEPNS_11HistoryItemENS_13FrameLoadTypeE
 __ZN7WebCore4Page9goForwardEv
 __ZN7WebCore4Page9initGroupEv
-__ZN7WebCore4PageC1EPNS_12ChromeClientEPNS_17ContextMenuClientEPNS_12EditorClientEPNS_10DragClientEPNS_15InspectorClientEPNS_18PluginHalterClientE
+__ZN7WebCore4PageC1EPNS_12ChromeClientEPNS_17ContextMenuClientEPNS_12EditorClientEPNS_10DragClientEPNS_15InspectorClientEPNS_18PluginHalterClientEPNS_27GeolocationControllerClientE
 __ZN7WebCore4PageD1Ev
 __ZN7WebCore4coreEP20NSURLProtectionSpace
 __ZN7WebCore5Cache11setDisabledEb
@@ -601,8 +603,10 @@
 __ZN7WebCore7nsColorERKNS_5ColorE
 __ZN7WebCore8Document11createRangeEv
 __ZN7WebCore8Document13removeMarkersENS_14DocumentMarker10MarkerTypeE
+__ZN7WebCore8Document13svgExtensionsEv
 __ZN7WebCore8Document14setFocusedNodeEN3WTF10PassRefPtrINS_4NodeEEE
 __ZN7WebCore8Document17getFocusableNodesERN3WTF6VectorINS1_6RefPtrINS_4NodeEEELm0EEE
+__ZN7WebCore8Document19accessSVGExtensionsEv
 __ZN7WebCore8Document22createDocumentFragmentEv
 __ZN7WebCore8Document23renderedRectsForMarkersENS_14DocumentMarker10MarkerTypeE
 __ZN7WebCore8Document24setShouldCreateRenderersEb
@@ -627,9 +631,9 @@
 __ZN7WebCore8Settings20setFantasyFontFamilyERKNS_12AtomicStringE
 __ZN7WebCore8Settings20setJavaScriptEnabledEb
 __ZN7WebCore8Settings20setXSSAuditorEnabledEb
+__ZN7WebCore8Settings21setShowRepaintCounterEb
 __ZN7WebCore8Settings21setStandardFontFamilyERKNS_12AtomicStringE
 __ZN7WebCore8Settings21setWebSecurityEnabledEb
-__ZN7WebCore8Settings21setShowRepaintCounterEb
 __ZN7WebCore8Settings22setLocalStorageEnabledEb
 __ZN7WebCore8Settings22setSansSerifFontFamilyERKNS_12AtomicStringE
 __ZN7WebCore8Settings22setShowsURLsInToolTipsEb
@@ -961,9 +965,9 @@
 __ZNK7WebCore8Document4bodyEv
 __ZNK7WebCore8Document6domainEv
 __ZNK7WebCore8IntPointcv8_NSPointEv
+__ZNK7WebCore8Position10downstreamENS0_27EditingBoundaryCrossingRuleE
 __ZNK7WebCore8Position25leadingWhitespacePositionENS_9EAffinityEb
 __ZNK7WebCore8Position26trailingWhitespacePositionENS_9EAffinityEb
-__ZNK7WebCore8Position10downstreamENS0_27EditingBoundaryCrossingRuleE
 __ZNK7WebCore8Position8upstreamENS0_27EditingBoundaryCrossingRuleE
 __ZNK7WebCore9DOMWindow27pendingUnloadEventListenersEv
 __ZNK7WebCore9FloatRectcv7_NSRectEv
@@ -982,10 +986,6 @@
 __ZTVN7WebCore17FileChooserClientE
 __ZTVN7WebCore17FrameLoaderClientE
 __ZTVN7WebCore25HistoryPropertyListWriterE
-__ZN7WebCore14SVGSMILElement13isSMILElementEPNS_4NodeE
-__ZN7WebCore21SVGDocumentExtensions21sampleAnimationAtTimeERKNS_6StringEPNS_14SVGSMILElementEd
-__ZN7WebCore8Document19accessSVGExtensionsEv
-__ZN7WebCore8Document13svgExtensionsEv
 _filenameByFixingIllegalCharacters
 _hasCaseInsensitiveSubstring
 _hasCaseInsensitiveSuffix
diff --git a/WebCore/WebCore.gypi b/WebCore/WebCore.gypi
index 4a37c79..0115a41 100644
--- a/WebCore/WebCore.gypi
+++ b/WebCore/WebCore.gypi
@@ -1785,6 +1785,11 @@
             'page/FrameView.h',
             'page/Geolocation.cpp',
             'page/Geolocation.h',
+            'page/GeolocationController.cpp'
+            'page/GeolocationController.h'
+            'page/GeolocationControllerClient.h'
+            'page/GeolocationError.h'
+            'page/GeolocationPosition.h'
             'page/Geoposition.h',
             'page/HaltablePlugin.h',
             'page/History.cpp',
diff --git a/WebCore/WebCore.pro b/WebCore/WebCore.pro
index e31c78c..b05a972 100644
--- a/WebCore/WebCore.pro
+++ b/WebCore/WebCore.pro
@@ -1160,6 +1160,7 @@
     page/FrameTree.cpp \
     page/FrameView.cpp \
     page/Geolocation.cpp \
+    page/GeolocationController.cpp \
     page/History.cpp \
     page/Location.cpp \
     page/MouseEventWithHitTestResults.cpp \
diff --git a/WebCore/WebCore.vcproj/WebCore.vcproj b/WebCore/WebCore.vcproj/WebCore.vcproj
index 09945f5..db19ea3 100644
--- a/WebCore/WebCore.vcproj/WebCore.vcproj
+++ b/WebCore/WebCore.vcproj/WebCore.vcproj
@@ -20645,6 +20645,26 @@
 			<File

 				RelativePath="..\page\Geolocation.cpp"

 				>

+				RelativePath="..\page\GeolocationController.cpp"
+				>
+			</File>
+			<File
+				RelativePath="..\page\GeolocationController.h"
+				>
+			</File>
+			<File
+				RelativePath="..\page\GeolocationControllerClient.h"
+				>
+			</File>
+			<File
+				RelativePath="..\page\GeolocationError.h"
+				>
+			</File>
+			<File
+				RelativePath="..\page\GeolocationPosition.h"
+				>
+			</File>
+			<File
 			</File>

 			<File

 				RelativePath="..\page\Geolocation.h"

diff --git a/WebCore/WebCore.xcodeproj/project.pbxproj b/WebCore/WebCore.xcodeproj/project.pbxproj
index 987136d..5b5d035 100644
--- a/WebCore/WebCore.xcodeproj/project.pbxproj
+++ b/WebCore/WebCore.xcodeproj/project.pbxproj
@@ -4190,6 +4190,11 @@
 		BC53C6080DA56C570021EB5D /* Gradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC53C6070DA56C570021EB5D /* Gradient.cpp */; };
 		BC53C60B0DA56CF10021EB5D /* GradientCG.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC53C60A0DA56CF10021EB5D /* GradientCG.cpp */; };
 		BC53C6920DA591140021EB5D /* CSSGradientValue.h in Headers */ = {isa = PBXBuildFile; fileRef = BC53C6910DA591140021EB5D /* CSSGradientValue.h */; };
+		BC56CB2110D5AC8000A77C64 /* GeolocationController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC56CB1C10D5AC8000A77C64 /* GeolocationController.cpp */; };
+		BC56CB2210D5AC8000A77C64 /* GeolocationController.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56CB1D10D5AC8000A77C64 /* GeolocationController.h */; };
+		BC56CB2310D5AC8000A77C64 /* GeolocationControllerClient.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56CB1E10D5AC8000A77C64 /* GeolocationControllerClient.h */; };
+		BC56CB2410D5AC8000A77C64 /* GeolocationError.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56CB1F10D5AC8000A77C64 /* GeolocationError.h */; };
+		BC56CB2510D5AC8000A77C64 /* GeolocationPosition.h in Headers */ = {isa = PBXBuildFile; fileRef = BC56CB2010D5AC8000A77C64 /* GeolocationPosition.h */; };
 		BC5823F50C0A98DF0053F1B5 /* JSHTMLElementCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC5823F40C0A98DF0053F1B5 /* JSHTMLElementCustom.cpp */; };
 		BC5825F30C0B89380053F1B5 /* JSCSSStyleDeclarationCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BC5825F20C0B89380053F1B5 /* JSCSSStyleDeclarationCustom.cpp */; };
 		BC588AF00BFA6CF900EE679E /* HTMLParserErrorCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = BC588AEF0BFA6CF900EE679E /* HTMLParserErrorCodes.h */; };
@@ -9358,6 +9363,11 @@
 		BC53C6070DA56C570021EB5D /* Gradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Gradient.cpp; sourceTree = "<group>"; };
 		BC53C60A0DA56CF10021EB5D /* GradientCG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GradientCG.cpp; sourceTree = "<group>"; };
 		BC53C6910DA591140021EB5D /* CSSGradientValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSGradientValue.h; sourceTree = "<group>"; };
+		BC56CB1C10D5AC8000A77C64 /* GeolocationController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GeolocationController.cpp; sourceTree = "<group>"; };
+		BC56CB1D10D5AC8000A77C64 /* GeolocationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeolocationController.h; sourceTree = "<group>"; };
+		BC56CB1E10D5AC8000A77C64 /* GeolocationControllerClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeolocationControllerClient.h; sourceTree = "<group>"; };
+		BC56CB1F10D5AC8000A77C64 /* GeolocationError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeolocationError.h; sourceTree = "<group>"; };
+		BC56CB2010D5AC8000A77C64 /* GeolocationPosition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeolocationPosition.h; sourceTree = "<group>"; };
 		BC5823F40C0A98DF0053F1B5 /* JSHTMLElementCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLElementCustom.cpp; sourceTree = "<group>"; };
 		BC5825F20C0B89380053F1B5 /* JSCSSStyleDeclarationCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCSSStyleDeclarationCustom.cpp; sourceTree = "<group>"; };
 		BC588AEF0BFA6CF900EE679E /* HTMLParserErrorCodes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HTMLParserErrorCodes.h; sourceTree = "<group>"; };
@@ -11278,6 +11288,11 @@
 				FE80D7B70E9C1F25000D6F75 /* Geolocation.cpp */,
 				FE80D7B80E9C1F25000D6F75 /* Geolocation.h */,
 				FE80D7B90E9C1F25000D6F75 /* Geolocation.idl */,
+				BC56CB1C10D5AC8000A77C64 /* GeolocationController.cpp */,
+				BC56CB1D10D5AC8000A77C64 /* GeolocationController.h */,
+				BC56CB1E10D5AC8000A77C64 /* GeolocationControllerClient.h */,
+				BC56CB1F10D5AC8000A77C64 /* GeolocationError.h */,
+				BC56CB2010D5AC8000A77C64 /* GeolocationPosition.h */,
 				FE80D7BB0E9C1F25000D6F75 /* Geoposition.h */,
 				FE80D7BC0E9C1F25000D6F75 /* Geoposition.idl */,
 				7693BACE106C2DCA007B0823 /* HaltablePlugin.h */,
@@ -18246,6 +18261,10 @@
 				7ADE722610CBBB9B006B3B3A /* ContextMenuSelectionHandler.h in Headers */,
 				0C3F1F5B10C8871200D72CE1 /* WebGLUniformLocation.h in Headers */,
 				0C45342810CDBBFA00869157 /* JSWebGLUniformLocation.h in Headers */,
+				BC56CB2210D5AC8000A77C64 /* GeolocationController.h in Headers */,
+				BC56CB2310D5AC8000A77C64 /* GeolocationControllerClient.h in Headers */,
+				BC56CB2410D5AC8000A77C64 /* GeolocationError.h in Headers */,
+				BC56CB2510D5AC8000A77C64 /* GeolocationPosition.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -20404,6 +20423,7 @@
 				599D1E3210C97D6E00E0EF12 /* jni_utility_private.cpp in Sources */,
 				0C3F1F5A10C8871200D72CE1 /* WebGLUniformLocation.cpp in Sources */,
 				0C45342710CDBBFA00869157 /* JSWebGLUniformLocation.cpp in Sources */,
+				BC56CB2110D5AC8000A77C64 /* GeolocationController.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/WebCore/WebCoreSources.bkl b/WebCore/WebCoreSources.bkl
index 3201bfa..1254b06 100644
--- a/WebCore/WebCoreSources.bkl
+++ b/WebCore/WebCoreSources.bkl
@@ -777,6 +777,7 @@
         page/FrameTree.cpp
         page/FrameView.cpp
         page/Geolocation.cpp
+        page/GeolocationController.cpp
         page/History.cpp
         page/Location.cpp
         page/MouseEventWithHitTestResults.cpp
diff --git a/WebCore/bindings/js/JSEventCustom.cpp b/WebCore/bindings/js/JSEventCustom.cpp
index 7b951bd..04ceec5 100644
--- a/WebCore/bindings/js/JSEventCustom.cpp
+++ b/WebCore/bindings/js/JSEventCustom.cpp
@@ -78,7 +78,7 @@
 #include "SVGZoomEvent.h"
 #endif
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 #include "JSTouchEvent.h"
 #include "TouchEvent.h"
 #endif
@@ -118,7 +118,7 @@
 #endif
         else if (event->isCompositionEvent())
             wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, CompositionEvent, event);
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
         else if (event->isTouchEvent())
             wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, TouchEvent, event);
 #endif
diff --git a/WebCore/bindings/js/ScriptController.cpp b/WebCore/bindings/js/ScriptController.cpp
index 89f2345..8d34f88 100644
--- a/WebCore/bindings/js/ScriptController.cpp
+++ b/WebCore/bindings/js/ScriptController.cpp
@@ -247,7 +247,7 @@
             // keyboard events
             || type == eventNames().keydownEvent || type == eventNames().keypressEvent
             || type == eventNames().keyupEvent
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
             // touch events
             || type == eventNames().touchstartEvent || type == eventNames().touchmoveEvent
             || type == eventNames().touchendEvent || type == eventNames().touchcancelEvent
diff --git a/WebCore/bindings/v8/ChildThreadDOMData.h b/WebCore/bindings/v8/ChildThreadDOMData.h
index 173a5e8..dfb85e8 100644
--- a/WebCore/bindings/v8/ChildThreadDOMData.h
+++ b/WebCore/bindings/v8/ChildThreadDOMData.h
@@ -39,9 +39,6 @@
     class ChildThreadDOMData : public DOMData {
     public:
         ChildThreadDOMData();
-#if PLATFORM(ANDROID)
-        virtual ~ChildThreadDOMData() { }
-#endif
 
         DOMDataStore& getStore();
 
diff --git a/WebCore/bindings/v8/DOMData.cpp b/WebCore/bindings/v8/DOMData.cpp
index 54bcc55..ec9a938 100644
--- a/WebCore/bindings/v8/DOMData.cpp
+++ b/WebCore/bindings/v8/DOMData.cpp
@@ -44,6 +44,10 @@
 {
 }
 
+DOMData::~DOMData()
+{
+}
+
 DOMData* DOMData::getCurrent()
 {
     if (WTF::isMainThread())
diff --git a/WebCore/bindings/v8/DOMData.h b/WebCore/bindings/v8/DOMData.h
index 7bf9f91..4947e82 100644
--- a/WebCore/bindings/v8/DOMData.h
+++ b/WebCore/bindings/v8/DOMData.h
@@ -45,9 +45,7 @@
     class DOMData : public Noncopyable {
     public:
         DOMData();
-#if PLATFORM(ANDROID)
-        virtual ~DOMData() { }
-#endif
+        virtual ~DOMData();
 
         static DOMData* getCurrent();
         virtual DOMDataStore& getStore() = 0;
diff --git a/WebCore/bindings/v8/DOMObjectsInclude.h b/WebCore/bindings/v8/DOMObjectsInclude.h
index 6ed14be..bded7f2 100644
--- a/WebCore/bindings/v8/DOMObjectsInclude.h
+++ b/WebCore/bindings/v8/DOMObjectsInclude.h
@@ -229,6 +229,7 @@
 #endif // SVG
 
 #if PLATFORM(ANDROID)
+#include "Connection.h"
 // TODO: Upstream TOUCH_EVENTS guard.
 #if ENABLE(TOUCH_EVENTS)
 #include "Touch.h"
diff --git a/WebCore/bindings/v8/V8GCController.cpp b/WebCore/bindings/v8/V8GCController.cpp
index e08cf66..b478636 100644
--- a/WebCore/bindings/v8/V8GCController.cpp
+++ b/WebCore/bindings/v8/V8GCController.cpp
@@ -239,16 +239,6 @@
 
 typedef Vector<GrouperItem> GrouperList;
 
-#if PLATFORM(ANDROID)
-// Android's implementation of std::sort seems unable to do the necessary
-// template matching to pick up operator< for GrouperItem, so we have to
-// manually pass a comparison function.
-static bool compareGrouperItem(const GrouperItem& a, const GrouperItem& b)
-{
-    return a < b;
-}
-#endif
-
 class ObjectGrouperVisitor : public DOMWrapperMap<Node>::Visitor {
 public:
     ObjectGrouperVisitor()
@@ -295,11 +285,7 @@
     void applyGrouping()
     {
         // Group by sorting by the group id.
-#if PLATFORM(ANDROID)
-        std::sort(m_grouper.begin(), m_grouper.end(), compareGrouperItem);
-#else
         std::sort(m_grouper.begin(), m_grouper.end());
-#endif
 
         // FIXME Should probably work in iterators here, but indexes were easier for my simple mind.
         for (size_t i = 0; i < m_grouper.size(); ) {
diff --git a/WebCore/bindings/v8/V8Index.cpp b/WebCore/bindings/v8/V8Index.cpp
index 9686dc6..ea13d2f 100644
--- a/WebCore/bindings/v8/V8Index.cpp
+++ b/WebCore/bindings/v8/V8Index.cpp
@@ -447,6 +447,7 @@
 #include "V8PositionError.h"
 
 #if PLATFORM(ANDROID)
+#include "V8Connection.h"
 // TODO: Upstream these guards to webkit.org
 #if ENABLE(TOUCH_EVENTS)
 #include "V8Touch.h"
diff --git a/WebCore/bindings/v8/V8Index.h b/WebCore/bindings/v8/V8Index.h
index d786aab..a3aebdf 100644
--- a/WebCore/bindings/v8/V8Index.h
+++ b/WebCore/bindings/v8/V8Index.h
@@ -512,6 +512,8 @@
 #else
 #define DOM_OBJECT_TOUCH_EVENT_TYPES(V)
 #endif
+#define DOM_OBJECT_CONNECTION_TYPES(V)                                  \
+    V(CONNECTION, Connection)
 #endif
 
 #if PLATFORM(ANDROID)
@@ -535,6 +537,7 @@
     DOM_OBJECT_INSPECTOR_TYPES(V)                                       \
     DOM_OBJECT_GEOLOCATION_TYPES(V)                                     \
     DOM_OBJECT_TOUCH_EVENT_TYPES(V)                                     \
+    DOM_OBJECT_CONNECTION_TYPES(V)                                      \
     DOM_OBJECT_VOIDCALLBACK_TYPES(V)
 #endif
 
diff --git a/WebCore/config.h b/WebCore/config.h
index 8fbed4f..6fa1f40 100644
--- a/WebCore/config.h
+++ b/WebCore/config.h
@@ -80,7 +80,6 @@
 #define WEBCORE_NAVIGATOR_VENDOR "Google Inc."
 // This must be defined before we include FastMalloc.h, below.
 #define USE_SYSTEM_MALLOC 1
-#define ANDROID_MOBILE      // change can be merged back to WebKit.org for MOBILE
 #define LOG_DISABLED 1
 #include <wtf/Assertions.h>
 // Central place to set which optional features Android uses.
diff --git a/WebCore/dom/Document.cpp b/WebCore/dom/Document.cpp
index 85966d7..d031853 100644
--- a/WebCore/dom/Document.cpp
+++ b/WebCore/dom/Document.cpp
@@ -171,12 +171,10 @@
 #include "SVGStyleElement.h"
 #endif
 
-#if ENABLE(TOUCH_EVENTS) // Android
-#include "TouchEvent.h"
 #if PLATFORM(ANDROID)
+// FIXME: We shouldn't be including this from WebCore!
 #include "WebViewCore.h"
 #endif
-#endif
 
 #ifdef ANDROID_META_SUPPORT
 #include "Settings.h"
@@ -191,6 +189,11 @@
 #include "TimeCounter.h"
 #endif
 
+#if ENABLE(TOUCH_EVENTS)
+#include "ChromeClient.h"
+#include "TouchEvent.h"
+#endif
+
 #if ENABLE(WML)
 #include "WMLDocument.h"
 #include "WMLElement.h"
@@ -371,9 +374,6 @@
     , m_hasOpenDatabases(false)
 #endif
     , m_usingGeolocation(false)
-#ifdef ANDROID_MOBILE
-    , mExtraLayoutDelay(0)
-#endif
 #if ENABLE(WML)
     , m_containsWMLContent(false)
 #endif
@@ -431,6 +431,7 @@
     m_processingLoadEvent = false;
     m_startTime = currentTime();
     m_overMinimumLayoutThreshold = false;
+    m_extraLayoutDelay = 0;
     
     initSecurityContext();
     initDNSPrefetch();
@@ -1486,17 +1487,6 @@
         FrameView* view = m_frame->view();
         if (view)
             view->detachCustomScrollbars();
-
-#if ENABLE(TOUCH_EVENTS) // Android
-        // clean up for the top document
-        if (!m_frame->ownerElement()) {
-            m_touchEventListeners.clear();
-#if PLATFORM(ANDROID)
-            if (view)
-                android::WebViewCore::getWebViewCore(view)->needTouchEvents(false);
-#endif
-        }
-#endif
     }
 
     // indicate destruction mode,  i.e. attached() but renderer == 0
@@ -1880,13 +1870,13 @@
 int Document::minimumLayoutDelay()
 {
     if (m_overMinimumLayoutThreshold)
-        return 0;
+        return m_extraLayoutDelay;
     
     int elapsed = elapsedTime();
     m_overMinimumLayoutThreshold = elapsed > cLayoutScheduleThreshold;
     
     // We'll want to schedule the timer to fire at the minimum layout threshold.
-    return max(0, cLayoutScheduleThreshold - elapsed);
+    return max(0, cLayoutScheduleThreshold - elapsed) + m_extraLayoutDelay;
 }
 
 int Document::elapsedTime() const
@@ -2259,7 +2249,8 @@
         
         String key(buffer.substring(keyBegin, keyEnd - keyBegin));
         String value(buffer.substring(valueBegin, valueEnd - valueBegin));
-        frame()->settings()->setMetadataSettings(key, value);
+        if (frame())
+            frame()->settings()->setMetadataSettings(key, value);
     }
 }
 #endif
@@ -3063,7 +3054,7 @@
     else if (eventType == "SVGZoomEvents")
         event = SVGZoomEvent::create();
 #endif
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
     else if (eventType == "TouchEvent")
         event = TouchEvent::create();
 #endif
@@ -3103,6 +3094,14 @@
         addListenerType(TRANSITIONEND_LISTENER);
     else if (eventType == eventNames().beforeloadEvent)
         addListenerType(BEFORELOAD_LISTENER);
+    else if (eventType == eventNames().touchstartEvent
+             || eventType == eventNames().touchmoveEvent
+             || eventType == eventNames().touchendEvent
+             || eventType == eventNames().touchcancelEvent) {
+         addListenerType(TOUCH_LISTENER);
+         if (Page* page = this->page())
+             page->chrome()->client()->needTouchEvents(true);
+    }
 }
 
 CSSStyleDeclaration* Document::getOverrideStyle(Element*, const String&)
@@ -4674,38 +4673,6 @@
     m_haveExplicitlyDisabledDNSPrefetch = true;
 }
 
-#if ENABLE(TOUCH_EVENTS) // Android
-void Document::addTouchEventListener(Node* node)
-{
-    // Note: we only keep track of touch listener in the top frame
-    if (m_frame && m_frame->tree()->parent()) {
-        m_frame->page()->mainFrame()->document()->addTouchEventListener(node);
-    } else {
-#if PLATFORM(ANDROID)
-        if (m_frame && m_frame->view() && m_touchEventListeners.isEmpty())
-            android::WebViewCore::getWebViewCore(m_frame->view())->needTouchEvents(true);
-#endif
-        m_touchEventListeners.add(node, 0);
-    }
-}
-
-void Document::removeTouchEventListener(Node* node)
-{
-    // Note: we only keep track of touch listener in the top frame
-    if (m_frame && m_frame->tree()->parent()) {
-        m_frame->page()->mainFrame()->document()->removeTouchEventListener(node);
-    } else {
-#if PLATFORM(ANDROID)
-        if (m_frame && m_frame->view() && m_touchEventListeners.size() == 1 &&
-                m_touchEventListeners.contains(node))
-            android::WebViewCore::getWebViewCore(m_frame->view())->needTouchEvents(false);
-#endif
-        m_touchEventListeners.remove(node);
-    }
-}
-
-#endif
-
 void Document::reportException(const String& errorMessage, int lineNumber, const String& sourceURL)
 {
     if (DOMWindow* window = domWindow())
diff --git a/WebCore/dom/Document.h b/WebCore/dom/Document.h
index 3d0582c..b24063a 100644
--- a/WebCore/dom/Document.h
+++ b/WebCore/dom/Document.h
@@ -252,6 +252,12 @@
     DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectstart);
+#if ENABLE(TOUCH_EVENTS)
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
+#endif
 
     DocumentType* doctype() const { return m_docType.get(); }
 
@@ -523,6 +529,10 @@
     void setParsing(bool);
     bool parsing() const { return m_bParsing; }
     int minimumLayoutDelay();
+
+    // This method is used by Android.
+    void setExtraLayoutDelay(int delay) { m_extraLayoutDelay = delay; }
+
     bool shouldScheduleLayout();
     int elapsedTime() const;
     
@@ -620,7 +630,8 @@
         ANIMATIONSTART_LISTENER              = 0x200,
         ANIMATIONITERATION_LISTENER          = 0x400,
         TRANSITIONEND_LISTENER               = 0x800,
-        BEFORELOAD_LISTENER                  = 0x1000
+        BEFORELOAD_LISTENER                  = 0x1000,
+        TOUCH_LISTENER                       = 0x2000
     };
 
     bool hasListenerType(ListenerType listenerType) const { return (m_listenerTypes & listenerType); }
@@ -815,11 +826,6 @@
     void updateFocusAppearanceSoon();
     void cancelFocusAppearanceUpdate();
         
-#ifdef ANDROID_MOBILE
-    void setExtraLayoutDelay(int delay) { mExtraLayoutDelay = delay; }
-    int extraLayoutDelay() { return mExtraLayoutDelay; }
-#endif
-
     // FF method for accessing the selection added for compatability.
     DOMSelection* getSelection() const;
     
@@ -938,17 +944,6 @@
 
     void clearXMLVersion() { m_xmlVersion = String(); }
 
-#if ENABLE(TOUCH_EVENTS) // Android
-public:
-    typedef HashMap<Node*, unsigned > TouchListenerMap;
-
-    void addTouchEventListener(Node*);
-    void removeTouchEventListener(Node*);
-    const TouchListenerMap& touchEventListeners() const { return m_touchEventListeners; }
-
-private:
-    TouchListenerMap m_touchEventListeners;
-#endif  // ENABLE(TOUCH_EVENTS)
 
 private:
     virtual bool isDocument() const { return true; }
@@ -1091,9 +1086,11 @@
     typedef std::pair<Vector<DocumentMarker>, Vector<IntRect> > MarkerMapVectorPair;
     typedef HashMap<RefPtr<Node>, MarkerMapVectorPair*> MarkerMap;
     MarkerMap m_markers;
+
 #if !PLATFORM(ANDROID)
     mutable AXObjectCache* m_axObjectCache;
 #endif
+    
     Timer<Document> m_updateFocusAppearanceTimer;
 
     Element* m_cssTarget;
@@ -1103,6 +1100,10 @@
     HashSet<RefPtr<HistoryItem> > m_associatedHistoryItems;
     double m_startTime;
     bool m_overMinimumLayoutThreshold;
+    // This is used to increase the minimum delay between re-layouts. It is set
+    // using setExtraLayoutDelay to modify the minimum delay used at different
+    // points during the lifetime of the Document.
+    int m_extraLayoutDelay;
 
     Vector<std::pair<ScriptElementData*, CachedResourceHandle<CachedScript> > > m_scriptsToExecuteSoon;
     Timer<Document> m_executeScriptSoonTimer;
@@ -1115,7 +1116,7 @@
 #if ENABLE(XBL)
     OwnPtr<XBLBindingManager> m_bindingManager; // The access point through which documents and elements communicate with XBL.
 #endif
-    
+
     typedef HashMap<AtomicStringImpl*, HTMLMapElement*> ImageMapsByName;
     ImageMapsByName m_imageMapsByName;
 
@@ -1195,10 +1196,6 @@
     
     bool m_usingGeolocation;
 
-#ifdef ANDROID_MOBILE
-    int mExtraLayoutDelay;
-#endif
-
 #if ENABLE(WML)
     bool m_containsWMLContent;
 #endif
diff --git a/WebCore/dom/Document.idl b/WebCore/dom/Document.idl
index e54add0..69417c8 100644
--- a/WebCore/dom/Document.idl
+++ b/WebCore/dom/Document.idl
@@ -284,12 +284,6 @@
         attribute [DontEnum] EventListener onscroll;
         attribute [DontEnum] EventListener onselect;
         attribute [DontEnum] EventListener onsubmit;
-#if ENABLE_TOUCH_EVENTS
-        attribute [DontEnum] EventListener ontouchstart;
-        attribute [DontEnum] EventListener ontouchend;
-        attribute [DontEnum] EventListener ontouchmove;
-        attribute [DontEnum] EventListener ontouchcancel;
-#endif
 
         // attribute [DontEnum] EventListener oncanplay;
         // attribute [DontEnum] EventListener oncanplaythrough;
@@ -326,6 +320,12 @@
         attribute [DontEnum] EventListener onreset;
         attribute [DontEnum] EventListener onsearch;
         attribute [DontEnum] EventListener onselectstart;
+#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
+        attribute [DontEnum] EventListener ontouchstart;
+        attribute [DontEnum] EventListener ontouchmove;
+        attribute [DontEnum] EventListener ontouchend;
+        attribute [DontEnum] EventListener ontouchcancel;
+#endif
 #endif
 #endif
     };
diff --git a/WebCore/dom/Element.h b/WebCore/dom/Element.h
index 97d3eb4..ce25d70 100644
--- a/WebCore/dom/Element.h
+++ b/WebCore/dom/Element.h
@@ -88,7 +88,12 @@
     DEFINE_ATTRIBUTE_EVENT_LISTENER(reset);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(search);
     DEFINE_ATTRIBUTE_EVENT_LISTENER(selectstart);
-
+#if ENABLE(TOUCH_EVENTS)
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
+    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
+#endif
     const AtomicString& getIDAttribute() const;
     bool hasAttribute(const QualifiedName&) const;
     const AtomicString& getAttribute(const QualifiedName&) const;
diff --git a/WebCore/dom/Element.idl b/WebCore/dom/Element.idl
index c24ef65..4a223bb 100644
--- a/WebCore/dom/Element.idl
+++ b/WebCore/dom/Element.idl
@@ -167,12 +167,6 @@
         attribute [DontEnum] EventListener onscroll;
         attribute [DontEnum] EventListener onselect;
         attribute [DontEnum] EventListener onsubmit;
-#if ENABLE_TOUCH_EVENTS
-        attribute [DontEnum] EventListener ontouchstart;
-        attribute [DontEnum] EventListener ontouchend;
-        attribute [DontEnum] EventListener ontouchmove;
-        attribute [DontEnum] EventListener ontouchcancel;
-#endif
 
         // attribute [DontEnum] EventListener oncanplay;
         // attribute [DontEnum] EventListener oncanplaythrough;
@@ -209,6 +203,12 @@
         attribute [DontEnum] EventListener onreset;
         attribute [DontEnum] EventListener onsearch;
         attribute [DontEnum] EventListener onselectstart;
+#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
+        attribute [DontEnum] EventListener ontouchstart;
+        attribute [DontEnum] EventListener ontouchmove;
+        attribute [DontEnum] EventListener ontouchend;
+        attribute [DontEnum] EventListener ontouchcancel;
+#endif
 #endif
 #endif
     };
diff --git a/WebCore/dom/Event.cpp b/WebCore/dom/Event.cpp
index eda44b0..be2b37b 100644
--- a/WebCore/dom/Event.cpp
+++ b/WebCore/dom/Event.cpp
@@ -180,20 +180,20 @@
 }
 #endif
 
-#if ENABLE(TOUCH_EVENTS) // Android
-bool Event::isTouchEvent() const
-{
-    return false;
-}
-#endif
-
 #if ENABLE(WORKERS)
 bool Event::isErrorEvent() const
 {
     return false;
 }
 #endif
-    
+
+#if ENABLE(TOUCH_EVENTS)
+bool Event::isTouchEvent() const
+{
+    return false;
+}
+#endif
+
 bool Event::storesResultAsString() const
 {
     return false;
diff --git a/WebCore/dom/Event.h b/WebCore/dom/Event.h
index 7ec85a7..4624663 100644
--- a/WebCore/dom/Event.h
+++ b/WebCore/dom/Event.h
@@ -123,12 +123,12 @@
 #if ENABLE(DOM_STORAGE)
         virtual bool isStorageEvent() const;
 #endif
-#if ENABLE(TOUCH_EVENTS) // Android
-        virtual bool isTouchEvent() const;
-#endif
 #if ENABLE(WORKERS)
         virtual bool isErrorEvent() const;
 #endif
+#if ENABLE(TOUCH_EVENTS)
+        virtual bool isTouchEvent() const;
+#endif
         
         bool propagationStopped() const { return m_propagationStopped; }
 
diff --git a/WebCore/dom/EventNames.h b/WebCore/dom/EventNames.h
index 63460a5..c8c3291 100644
--- a/WebCore/dom/EventNames.h
+++ b/WebCore/dom/EventNames.h
@@ -95,14 +95,6 @@
     macro(storage) \
     macro(submit) \
     macro(textInput) \
-/* #if ENABLE(TOUCH_EVENTS) // Android */ \
-    macro(touchstart) \
-    macro(touchmove) \
-    macro(touchend) \
-    macro(touchcancel) \
-    macro(touchlongpress) \
-    macro(touchdoubletap) \
-/* #endif */ \
     macro(unload) \
     macro(updateready) \
     macro(zoom) \
@@ -154,6 +146,15 @@
     \
     macro(orientationchange) \
     \
+    macro(touchstart) \
+    macro(touchmove) \
+    macro(touchend) \
+    macro(touchcancel) \
+/* #if PLATFORM(ANDROID) */ \
+    macro(touchlongpress) \
+    macro(touchdoubletap) \
+/* #endif */ \
+    \
 // end of DOM_EVENT_NAMES_FOR_EACH
 
     class EventNames : public Noncopyable {
diff --git a/WebCore/dom/Node.cpp b/WebCore/dom/Node.cpp
index 4ae83de..c2d5281 100644
--- a/WebCore/dom/Node.cpp
+++ b/WebCore/dom/Node.cpp
@@ -101,6 +101,10 @@
 #include "HTMLNoScriptElement.h"
 #endif
 
+#if ENABLE(TOUCH_EVENTS)
+#include "ChromeClient.h"
+#endif
+
 #define DUMP_NODE_STATISTICS 0
 
 using namespace std;
@@ -2422,16 +2426,8 @@
 
     if (Document* document = this->document())
         document->addListenerTypeIfNeeded(eventType);
-    updateSVGElementInstancesAfterEventListenerChange(this);
 
-#if ENABLE(TOUCH_EVENTS) // Android
-    if (this->document() &&
-            (eventType == eventNames().touchstartEvent ||
-             eventType == eventNames().touchendEvent ||
-             eventType == eventNames().touchmoveEvent ||
-             eventType == eventNames().touchcancelEvent))
-        this->document()->addTouchEventListener(this);
-#endif
+    updateSVGElementInstancesAfterEventListenerChange(this);
     return true;
 }
 
@@ -2442,13 +2438,17 @@
 
     updateSVGElementInstancesAfterEventListenerChange(this);
 
-#if ENABLE(TOUCH_EVENTS) // Android
-    if (this->document() &&
-            (eventType == eventNames().touchstartEvent ||
-             eventType == eventNames().touchendEvent ||
-             eventType == eventNames().touchmoveEvent ||
-             eventType == eventNames().touchcancelEvent))
-        this->document()->removeTouchEventListener(this);
+#if ENABLE(TOUCH_EVENTS)
+    if (Document* document = this->document()) {
+        if (document->page()
+            && (eventType == eventNames().touchstartEvent
+                || eventType == eventNames().touchmoveEvent
+                || eventType == eventNames().touchendEvent
+                || eventType == eventNames().touchcancelEvent))
+            // Note the corresponding needTouchEvents(true) is called in Document::addListenerTypeIfNeeded().
+            document->page()->chrome()->client()->needTouchEvents(false);
+
+   }
 #endif
     return true;
 }
diff --git a/WebCore/dom/Node.h b/WebCore/dom/Node.h
index 7da8634..ebf275a 100644
--- a/WebCore/dom/Node.h
+++ b/WebCore/dom/Node.h
@@ -565,13 +565,6 @@
      */
     virtual bool disabled() const;
 
-#if ENABLE(TOUCH_EVENTS) // Android
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
-    DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
-#endif
-
     using TreeShared<Node>::ref;
     using TreeShared<Node>::deref;
 
diff --git a/WebCore/dom/Touch.cpp b/WebCore/dom/Touch.cpp
index 561a786..41d5c19 100644
--- a/WebCore/dom/Touch.cpp
+++ b/WebCore/dom/Touch.cpp
@@ -25,7 +25,7 @@
 
 #include "config.h"
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 
 #include "Touch.h"
 
@@ -40,7 +40,7 @@
     FrameView* frameView = frame->view();
     if (!frameView)
         return 0;
-    return frameView->scrollX();
+    return frameView->scrollX() / frame->pageZoomFactor();
 }
 
 static int contentsY(Frame* frame)
@@ -50,7 +50,7 @@
     FrameView* frameView = frame->view();
     if (!frameView)
         return 0;
-    return frameView->scrollY();
+    return frameView->scrollY() / frame->pageZoomFactor();
 }
 
 Touch::Touch(Frame* frame, EventTarget* target, unsigned identifier, 
diff --git a/WebCore/dom/Touch.h b/WebCore/dom/Touch.h
index 62822fb..cf39faf 100644
--- a/WebCore/dom/Touch.h
+++ b/WebCore/dom/Touch.h
@@ -26,7 +26,7 @@
 #ifndef TOUCH_H_
 #define TOUCH_H_
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 
 #include "EventTarget.h"
 #include "Frame.h"
@@ -36,41 +36,41 @@
 
 namespace WebCore {
 
-    class Touch : public RefCounted<Touch> {
-    public:
-        static PassRefPtr<Touch> create(Frame* frame, EventTarget* target,
-                unsigned identifier, int screenX, int screenY, int pageX, int pageY)
-        {
-            return adoptRef(new Touch(frame, target, identifier, screenX, 
-                    screenY, pageX, pageY));
-        }
+class Touch : public RefCounted<Touch> {
+public:
+    static PassRefPtr<Touch> create(Frame* frame, EventTarget* target,
+            unsigned identifier, int screenX, int screenY, int pageX, int pageY)
+    {
+        return adoptRef(new Touch(frame, target, identifier, screenX, 
+                screenY, pageX, pageY));
+    }
 
-        void updateLocation(int screenX, int screenY, int pageX, int pageY);
+    void updateLocation(int screenX, int screenY, int pageX, int pageY);
 
-        Frame* frame() const { return m_frame.get(); }
-        EventTarget* target() const { return m_target.get(); }
-        unsigned identifier() const { return m_identifier; }
-        int clientX() const { return m_clientX; }
-        int clientY() const { return m_clientY; }
-        int screenX() const { return m_screenX; }
-        int screenY() const { return m_screenY; }
-        int pageX() const { return m_pageX; }
-        int pageY() const { return m_pageY; }
+    Frame* frame() const { return m_frame.get(); }
+    EventTarget* target() const { return m_target.get(); }
+    unsigned identifier() const { return m_identifier; }
+    int clientX() const { return m_clientX; }
+    int clientY() const { return m_clientY; }
+    int screenX() const { return m_screenX; }
+    int screenY() const { return m_screenY; }
+    int pageX() const { return m_pageX; }
+    int pageY() const { return m_pageY; }
 
-    private:
-        Touch(Frame* frame, EventTarget* target, unsigned identifier,
-                int screenX, int screenY, int pageX, int pageY);
+private:
+    Touch(Frame* frame, EventTarget* target, unsigned identifier,
+            int screenX, int screenY, int pageX, int pageY);
 
-        RefPtr<Frame> m_frame;
-        RefPtr<EventTarget> m_target;
-        unsigned m_identifier;
-        int m_clientX;
-        int m_clientY;
-        int m_screenX;
-        int m_screenY;
-        int m_pageX;
-        int m_pageY;
-    };
+    RefPtr<Frame> m_frame;
+    RefPtr<EventTarget> m_target;
+    unsigned m_identifier;
+    int m_clientX;
+    int m_clientY;
+    int m_screenX;
+    int m_screenY;
+    int m_pageX;
+    int m_pageY;
+};
 
 } // namespace WebCore
 
diff --git a/WebCore/dom/TouchEvent.cpp b/WebCore/dom/TouchEvent.cpp
index 7ce856f..1fbba6c 100644
--- a/WebCore/dom/TouchEvent.cpp
+++ b/WebCore/dom/TouchEvent.cpp
@@ -25,7 +25,7 @@
 
 #include "config.h"
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 
 #include "TouchEvent.h"
 
@@ -33,20 +33,24 @@
 
 TouchEvent::TouchEvent(TouchList* touches, TouchList* targetTouches,
         TouchList* changedTouches, const AtomicString& type, 
-        PassRefPtr<AbstractView> view, int screenX, int screenY, int pageX, int pageY)
+        PassRefPtr<AbstractView> view, int screenX, int screenY, int pageX, int pageY,
+        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey)
     : MouseRelatedEvent(type, true, true, view, 0, screenX, screenY, pageX, pageY,
-                        false, false, false, false)
+                        ctrlKey, altKey, shiftKey, metaKey)
     , m_touches(touches)
     , m_targetTouches(targetTouches)
     , m_changedTouches(changedTouches)
+#if PLATFORM(ANDROID)
     , m_longPressPrevented(false)
     , m_doubleTapPrevented(false)
+#endif
 {
 }
 
 void TouchEvent::initTouchEvent(TouchList* touches, TouchList* targetTouches,
         TouchList* changedTouches, const AtomicString& type, 
-        PassRefPtr<AbstractView> view, int screenX, int screenY, int clientX, int clientY)
+        PassRefPtr<AbstractView> view, int screenX, int screenY, int clientX, int clientY,
+        bool ctrlKey, bool altKey, bool shiftKey, bool metaKey)
 {
     if (dispatched())
         return;
@@ -55,6 +59,10 @@
 
     m_screenX = screenX;
     m_screenY = screenY;
+    m_ctrlKey = ctrlKey;
+    m_altKey = altKey;
+    m_shiftKey = shiftKey;
+    m_metaKey = metaKey;
     initCoordinates(clientX, clientY);
 }
 
diff --git a/WebCore/dom/TouchEvent.h b/WebCore/dom/TouchEvent.h
index 6b7d384..abc1ee2 100644
--- a/WebCore/dom/TouchEvent.h
+++ b/WebCore/dom/TouchEvent.h
@@ -26,61 +26,69 @@
 #ifndef TouchEvent_h
 #define TouchEvent_h
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 
 #include "MouseRelatedEvent.h"
 #include "TouchList.h"
 
 namespace WebCore {
 
-    class TouchEvent : public MouseRelatedEvent {
-    public:
-        static PassRefPtr<TouchEvent> create()
-        {
-            return adoptRef(new TouchEvent);
-        }
-        static PassRefPtr<TouchEvent> create(TouchList* touches, 
-                TouchList* targetTouches, TouchList* changedTouches, 
-                const AtomicString& type, PassRefPtr<AbstractView> view,
-                int screenX, int screenY, int pageX, int pageY)
-        {
-            return adoptRef(new TouchEvent(touches, targetTouches, changedTouches,
-                    type, view, screenX, screenY, pageX, pageY));
-        }
+class TouchEvent : public MouseRelatedEvent {
+public:
+    static PassRefPtr<TouchEvent> create()
+    {
+        return adoptRef(new TouchEvent);
+    }
+    static PassRefPtr<TouchEvent> create(TouchList* touches, 
+            TouchList* targetTouches, TouchList* changedTouches, 
+            const AtomicString& type, PassRefPtr<AbstractView> view,
+            int screenX, int screenY, int pageX, int pageY,
+            bool ctrlKey, bool altKey, bool shiftKey, bool metaKey)
+    {
+        return adoptRef(new TouchEvent(touches, targetTouches, changedTouches,
+                type, view, screenX, screenY, pageX, pageY,
+                ctrlKey, altKey, shiftKey, metaKey));
+    }
 
-        void initTouchEvent(TouchList* touches, TouchList* targetTouches,
-                TouchList* changedTouches, const AtomicString& type, 
-                PassRefPtr<AbstractView> view, int screenX, int screenY, 
-                int clientX, int clientY);
+    void initTouchEvent(TouchList* touches, TouchList* targetTouches,
+            TouchList* changedTouches, const AtomicString& type, 
+            PassRefPtr<AbstractView> view, int screenX, int screenY, 
+            int clientX, int clientY,
+            bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
 
-        TouchList* touches() const {return m_touches.get();}
-        TouchList* targetTouches() const {return m_targetTouches.get();}
-        TouchList* changedTouches() const {return m_changedTouches.get();}
+    TouchList* touches() const { return m_touches.get(); }
+    TouchList* targetTouches() const { return m_targetTouches.get(); }
+    TouchList* changedTouches() const { return m_changedTouches.get(); }
 
-        bool longPressPrevented() const { return m_longPressPrevented; }
-        void preventLongPress() { m_longPressPrevented = true; }
-        void setLongPressPrevented(bool prevented) { m_longPressPrevented = prevented; }
+#if PLATFORM(ANDROID)
+    bool longPressPrevented() const { return m_longPressPrevented; }
+    void preventLongPress() { m_longPressPrevented = true; }
+    void setLongPressPrevented(bool prevented) { m_longPressPrevented = prevented; }
 
-        bool doubleTapPrevented() const { return m_doubleTapPrevented; }
-        void preventDoubleTap() { m_doubleTapPrevented = true; }
-        void setDoubleTapPrevented(bool prevented) { m_doubleTapPrevented = prevented; }
+    bool doubleTapPrevented() const { return m_doubleTapPrevented; }
+    void preventDoubleTap() { m_doubleTapPrevented = true; }
+    void setDoubleTapPrevented(bool prevented) { m_doubleTapPrevented = prevented; }
+#endif
 
-    private:
-        TouchEvent() {}
-        TouchEvent(TouchList* touches, TouchList* targetTouches,
-                TouchList* changedTouches, const AtomicString& type,
-                PassRefPtr<AbstractView>, int screenX, int screenY, int pageX,
-                int pageY);
+private:
+    TouchEvent() {}
+    TouchEvent(TouchList* touches, TouchList* targetTouches,
+            TouchList* changedTouches, const AtomicString& type,
+            PassRefPtr<AbstractView>, int screenX, int screenY, int pageX,
+            int pageY,
+            bool ctrlKey, bool altKey, bool shiftKey, bool metaKey);
 
-        virtual bool isTouchEvent() const {return true;}
+    virtual bool isTouchEvent() const { return true; }
 
-        RefPtr<TouchList> m_touches;
-        RefPtr<TouchList> m_targetTouches;
-        RefPtr<TouchList> m_changedTouches;
+    RefPtr<TouchList> m_touches;
+    RefPtr<TouchList> m_targetTouches;
+    RefPtr<TouchList> m_changedTouches;
 
-        bool m_longPressPrevented;
-        bool m_doubleTapPrevented;
-    };
+#if PLATFORM(ANDROID)
+    bool m_longPressPrevented;
+    bool m_doubleTapPrevented;
+#endif
+};
 
 } // namespace WebCore
 
diff --git a/WebCore/dom/TouchEvent.idl b/WebCore/dom/TouchEvent.idl
index b7148b0..010c36f 100644
--- a/WebCore/dom/TouchEvent.idl
+++ b/WebCore/dom/TouchEvent.idl
@@ -32,6 +32,10 @@
         readonly attribute TouchList touches;
         readonly attribute TouchList targetTouches;
         readonly attribute TouchList changedTouches;
+        readonly attribute boolean ctrlKey;
+        readonly attribute boolean shiftKey;
+        readonly attribute boolean altKey;
+        readonly attribute boolean metaKey;
 
         void initTouchEvent(in TouchList touches,
                             in TouchList targetTouches,
@@ -41,6 +45,10 @@
                             in long screenX, 
                             in long screenY, 
                             in long clientX, 
-                            in long clientY);
+                            in long clientY,
+                            in boolean ctrlKey,
+                            in boolean altKey,
+                            in boolean shiftKey,
+                            in boolean metaKey);
     };
 }
diff --git a/WebCore/dom/TouchList.cpp b/WebCore/dom/TouchList.cpp
index 78b588e..4167e42 100644
--- a/WebCore/dom/TouchList.cpp
+++ b/WebCore/dom/TouchList.cpp
@@ -25,7 +25,7 @@
 
 #include "config.h"
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 
 #include "TouchList.h"
 
diff --git a/WebCore/dom/TouchList.h b/WebCore/dom/TouchList.h
index fa5fc80..f5033c9 100644
--- a/WebCore/dom/TouchList.h
+++ b/WebCore/dom/TouchList.h
@@ -26,7 +26,7 @@
 #ifndef TOUCHLIST_H_
 #define TOUCHLIST_H_
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
 
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
@@ -34,24 +34,24 @@
 
 namespace WebCore {
 
-    class TouchList : public RefCounted<TouchList> {
-    public:
-        static PassRefPtr<TouchList> create()
-        {
-            return adoptRef(new TouchList);
-        }
+class TouchList : public RefCounted<TouchList> {
+public:
+    static PassRefPtr<TouchList> create()
+    {
+        return adoptRef(new TouchList);
+    }
 
-        unsigned length() const { return m_values.size(); }
+    unsigned length() const { return m_values.size(); }
 
-        Touch* item (unsigned);
+    Touch* item(unsigned);
 
-        void append(const PassRefPtr<Touch> touch) { m_values.append(touch); }
+    void append(const PassRefPtr<Touch> touch) { m_values.append(touch); }
 
-    private:
-        TouchList() {}
+private:
+    TouchList() {}
 
-        Vector<RefPtr<Touch> > m_values;
-    };
+    Vector<RefPtr<Touch> > m_values;
+};
 
 } // namespace WebCore
 
diff --git a/WebCore/html/HTMLAttributeNames.in b/WebCore/html/HTMLAttributeNames.in
index c989dbd..967b695 100644
--- a/WebCore/html/HTMLAttributeNames.in
+++ b/WebCore/html/HTMLAttributeNames.in
@@ -199,12 +199,10 @@
 onsuspend
 onsubmit
 ontimeupdate
-/* #if ENABLE(TOUCH_EVENTS) // Android */
 ontouchstart
 ontouchmove
 ontouchend
 ontouchcancel
-/* #endif */
 onunload
 onvolumechange
 onwaiting
diff --git a/WebCore/html/HTMLElement.cpp b/WebCore/html/HTMLElement.cpp
index af15f6e..a4fc52a 100644
--- a/WebCore/html/HTMLElement.cpp
+++ b/WebCore/html/HTMLElement.cpp
@@ -218,20 +218,18 @@
         setAttributeEventListener(eventNames().webkitAnimationEndEvent, createAttributeEventListener(this, attr));
     } else if (attr->name() == onwebkittransitionendAttr) {
         setAttributeEventListener(eventNames().webkitTransitionEndEvent, createAttributeEventListener(this, attr));
-#if ENABLE(TOUCH_EVENTS) // Android
-    } else if (attr->name() == ontouchstartAttr) {
-        setAttributeEventListener(eventNames().touchstartEvent, createAttributeEventListener(this, attr));
-    } else if (attr->name() == ontouchendAttr) {
-        setAttributeEventListener(eventNames().touchendEvent, createAttributeEventListener(this, attr));
-    } else if (attr->name() == ontouchmoveAttr) {
-        setAttributeEventListener(eventNames().touchmoveEvent, createAttributeEventListener(this, attr));
-    } else if (attr->name() == ontouchcancelAttr) {
-        setAttributeEventListener(eventNames().touchcancelEvent, createAttributeEventListener(this, attr));
-#endif
     } else if (attr->name() == oninputAttr) {
         setAttributeEventListener(eventNames().inputEvent, createAttributeEventListener(this, attr));
     } else if (attr->name() == oninvalidAttr) {
         setAttributeEventListener(eventNames().invalidEvent, createAttributeEventListener(this, attr));
+    } else if (attr->name() == ontouchstartAttr) {
+        setAttributeEventListener(eventNames().touchstartEvent, createAttributeEventListener(this, attr));
+    } else if (attr->name() == ontouchmoveAttr) {
+        setAttributeEventListener(eventNames().touchmoveEvent, createAttributeEventListener(this, attr));
+    } else if (attr->name() == ontouchendAttr) {
+        setAttributeEventListener(eventNames().touchendEvent, createAttributeEventListener(this, attr));
+    } else if (attr->name() == ontouchcancelAttr) {
+        setAttributeEventListener(eventNames().touchcancelEvent, createAttributeEventListener(this, attr));
     }
 }
 
diff --git a/WebCore/html/HTMLInputElement.cpp b/WebCore/html/HTMLInputElement.cpp
index 163424d..acfe51f 100644
--- a/WebCore/html/HTMLInputElement.cpp
+++ b/WebCore/html/HTMLInputElement.cpp
@@ -340,11 +340,11 @@
         // double's fractional part size is DBL_MAN_DIG-bit.  If the current
         // value is greater than step*2^DBL_MANT_DIG, the following fmod() makes
         // no sense.
-        if (doubleValue / pow(2, DBL_MANT_DIG) > step)
+        if (doubleValue / pow(2.0, DBL_MANT_DIG) > step)
             return false;
         double remainder = fmod(doubleValue, step);
         // Accepts errors in lower 7-bit.
-        double acceptableError = step / pow(2, DBL_MANT_DIG - 7);
+        double acceptableError = step / pow(2.0, DBL_MANT_DIG - 7);
         return acceptableError < remainder && remainder < (step - acceptableError);
     }
     // Non-RANGE types should be rejected by getAllowedValueStep().
diff --git a/WebCore/html/HTMLTextAreaElement.cpp b/WebCore/html/HTMLTextAreaElement.cpp
index 8d8208d..0e8350c 100644
--- a/WebCore/html/HTMLTextAreaElement.cpp
+++ b/WebCore/html/HTMLTextAreaElement.cpp
@@ -95,7 +95,7 @@
 
 void HTMLTextAreaElement::restoreFormControlState(const String& state)
 {
-    setDefaultValue(state);
+    setValue(state);
 }
 
 void HTMLTextAreaElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
diff --git a/WebCore/html/HTMLTokenizer.cpp b/WebCore/html/HTMLTokenizer.cpp
index 3ca6958..a552442 100644
--- a/WebCore/html/HTMLTokenizer.cpp
+++ b/WebCore/html/HTMLTokenizer.cpp
@@ -1849,11 +1849,7 @@
         printf("Beginning timer write at time %d\n", m_doc->elapsedTime());
 #endif
 
-#ifdef ANDROID_MOBILE
-    if (m_doc->view() && m_doc->view()->layoutPending() && !m_doc->minimumLayoutDelay() && !m_doc->extraLayoutDelay()) {
-#else
     if (m_doc->view() && m_doc->view()->layoutPending() && !m_doc->minimumLayoutDelay()) {
-#endif
         // Restart the timer and let layout win.  This is basically a way of ensuring that the layout
         // timer has higher priority than our timer.
         m_timer.startOneShot(0);
diff --git a/WebCore/loader/CachedImage.cpp b/WebCore/loader/CachedImage.cpp
index a91f126..780d7ee 100644
--- a/WebCore/loader/CachedImage.cpp
+++ b/WebCore/loader/CachedImage.cpp
@@ -252,7 +252,7 @@
     }
 #endif
     m_image = BitmapImage::create(this);
-#if PLATFORM(SGL)
+#if PLATFORM(ANDROID)
     m_image->setURL(url());
 #endif
 }
diff --git a/WebCore/loader/FrameLoader.cpp b/WebCore/loader/FrameLoader.cpp
index 4a6ca3d..e07ee92 100644
--- a/WebCore/loader/FrameLoader.cpp
+++ b/WebCore/loader/FrameLoader.cpp
@@ -1743,12 +1743,7 @@
 
 // This does the same kind of work that didOpenURL does, except it relies on the fact
 // that a higher level already checked that the URLs match and the scrolling is the right thing to do.
-#if PLATFORM(ANDROID)
-// TODO: Upstream to webkit.org
-void FrameLoader::loadInSameDocument(const KURL& url, SerializedScriptValue* stateObject, bool isNewNavigation, bool suppressAddToHistory)
-#else
 void FrameLoader::loadInSameDocument(const KURL& url, SerializedScriptValue* stateObject, bool isNewNavigation)
-#endif
 {
     // If we have a state object, we cannot also be a new navigation.
     ASSERT(!stateObject || (stateObject && !isNewNavigation));
@@ -1756,12 +1751,7 @@
     // Update the data source's request with the new URL to fake the URL change
     m_frame->document()->setURL(url);
     documentLoader()->replaceRequestURLForSameDocumentNavigation(url);
-#if PLATFORM(ANDROID)
-    // TODO: Upstream to webkit.org
-    if (isNewNavigation && !shouldTreatURLAsSameAsCurrent(url) && !stateObject && !suppressAddToHistory) {
-#else
     if (isNewNavigation && !shouldTreatURLAsSameAsCurrent(url) && !stateObject) {
-#endif
         // NB: must happen after replaceRequestURLForSameDocumentNavigation(), since we add 
         // based on the current request. Must also happen before we openURL and displace the 
         // scroll position, since adding the BF item will save away scroll state.
@@ -3478,14 +3468,7 @@
         return;
 
     bool isRedirect = m_quickRedirectComing || policyChecker()->loadType() == FrameLoadTypeRedirectWithLockedBackForwardList;    
-#ifdef ANDROID_USER_GESTURE
-    // Do not add history items for a fragment scroll not initiated by the
-    // user. http://bugs.webkit.org/show_bug.cgi?id=30224
-    bool isUserInitiated = isProcessingUserGesture() || request.getUserGesture();
-    loadInSameDocument(request.url(), 0, !isRedirect, !isUserInitiated);
-#else
     loadInSameDocument(request.url(), 0, !isRedirect);
-#endif
 }
 
 bool FrameLoader::shouldScrollToAnchor(bool isFormSubmission, FrameLoadType loadType, const KURL& url)
@@ -3773,12 +3756,7 @@
     history()->setCurrentItem(item);
         
     // loadInSameDocument() actually changes the URL and notifies load delegates of a "fake" load
-#if PLATFORM(ANDROID)
-    // TODO: Upstream to webkit.org
-    loadInSameDocument(item->url(), item->stateObject(), false, false);
-#else
     loadInSameDocument(item->url(), item->stateObject(), false);
-#endif
 
     // Restore user view state from the current history item here since we don't do a normal load.
     // Even though we just manually set the current history item, this ASSERT verifies nothing 
diff --git a/WebCore/loader/FrameLoader.h b/WebCore/loader/FrameLoader.h
index 03a1175..875736f 100644
--- a/WebCore/loader/FrameLoader.h
+++ b/WebCore/loader/FrameLoader.h
@@ -439,12 +439,7 @@
 
     Frame* loadSubframe(HTMLFrameOwnerElement*, const KURL&, const String& name, const String& referrer);
 
-#if PLATFORM(ANDROID)
-    // TODO: Upstream to webkit.org
-    void loadInSameDocument(const KURL&, SerializedScriptValue* stateObject, bool isNewNavigation, bool suppressAddToHistory);
-#else
     void loadInSameDocument(const KURL&, SerializedScriptValue* stateObject, bool isNewNavigation);
-#endif
 
     void provisionalLoadStarted();
 
diff --git a/WebCore/page/ChromeClient.h b/WebCore/page/ChromeClient.h
index 117953c..b28473b 100644
--- a/WebCore/page/ChromeClient.h
+++ b/WebCore/page/ChromeClient.h
@@ -225,6 +225,10 @@
         virtual void willPopUpMenu(NSMenu *) { }
 #endif
 
+#if ENABLE(TOUCH_EVENTS)
+        virtual void needTouchEvents(bool, bool force = false) = 0;
+#endif
+
     protected:
         virtual ~ChromeClient() { }
     };
diff --git a/WebKit/android/stl/limits b/WebCore/page/Connection.cpp
similarity index 78%
rename from WebKit/android/stl/limits
rename to WebCore/page/Connection.cpp
index 672e605..ffbb838 100644
--- a/WebKit/android/stl/limits
+++ b/WebCore/page/Connection.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2010, The Android Open Source Project
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -13,7 +13,7 @@
  * 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 APPLE COMPUTER, INC. OR
+ * 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
@@ -23,9 +23,17 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef __ANDROID_LIMITS
-#define __ANDROID_LIMITS
+#include "config.h"
 
-#include <limits.h>
+#include "Connection.h"
 
-#endif // __ANDROID_LIMITS
+#include "NetworkStateNotifier.h"
+
+namespace WebCore {
+
+Connection::ConnectionType Connection::type() const
+{
+    return networkStateNotifier().type();
+}
+
+};
\ No newline at end of file
diff --git a/WebCore/platform/network/android/CookieClient.h b/WebCore/page/Connection.h
similarity index 69%
copy from WebCore/platform/network/android/CookieClient.h
copy to WebCore/page/Connection.h
index be2963e..837a36f 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/WebCore/page/Connection.h
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2010, The Android Open Source Project
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,24 +23,32 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef COOKIE_CLIENT_H
-#define COOKIE_CLIENT_H
+#ifndef Connection_h
+#define Connection_h
 
-#include "KURL.h"
-#include "PlatformString.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefCounted.h>
 
-using namespace WebCore;
+namespace WebCore {
 
-namespace android {
-
-class CookieClient {
-
+class Connection : public RefCounted<Connection> {
 public:
-    virtual ~CookieClient() {}
-    virtual void setCookies(const KURL& url, const String& value) = 0;
-    virtual String cookies(const KURL& url) = 0;
-    virtual bool cookiesEnabled() = 0;
+    enum ConnectionType {
+        Unknown = 0,
+        Ethernet = 1,
+        WiFi = 2,
+        Cell_2G = 3,
+        Cell_3G = 4,
+    };
+
+    static PassRefPtr<Connection> create() { return adoptRef(new Connection()); }
+
+    ConnectionType type() const;
+
+private:
+    Connection() { }
 };
 
-}
-#endif
+} // namespace WebCore
+
+#endif // Connection_h
diff --git a/WebCore/platform/network/android/CookieClient.h b/WebCore/page/Connection.idl
similarity index 74%
copy from WebCore/platform/network/android/CookieClient.h
copy to WebCore/page/Connection.idl
index be2963e..b4cfbd1 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/WebCore/page/Connection.idl
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2010, The Android Open Source Project
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,24 +23,16 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef COOKIE_CLIENT_H
-#define COOKIE_CLIENT_H
+ module core {
 
-#include "KURL.h"
-#include "PlatformString.h"
+    interface Connection {
+        readonly attribute unsigned short type;
 
-using namespace WebCore;
-
-namespace android {
-
-class CookieClient {
-
-public:
-    virtual ~CookieClient() {}
-    virtual void setCookies(const KURL& url, const String& value) = 0;
-    virtual String cookies(const KURL& url) = 0;
-    virtual bool cookiesEnabled() = 0;
-};
+        const unsigned short UNKNOWN = 0;
+        const unsigned short ETHERNET = 1;
+        const unsigned short WIFI = 2;
+        const unsigned short CELL_2G = 3;
+        const unsigned short CELL_3G = 4;
+    };
 
 }
-#endif
diff --git a/WebCore/page/DOMWindow.h b/WebCore/page/DOMWindow.h
index 5e2d990..0aee619 100644
--- a/WebCore/page/DOMWindow.h
+++ b/WebCore/page/DOMWindow.h
@@ -322,13 +322,12 @@
         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkitanimationend, webkitAnimationEnd);
         DEFINE_MAPPED_ATTRIBUTE_EVENT_LISTENER(webkittransitionend, webkitTransitionEnd);
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if ENABLE(TOUCH_EVENTS)
         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
-        DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchmove);
+        DEFINE_ATTRIBUTE_EVENT_LISTENER(touchend);
         DEFINE_ATTRIBUTE_EVENT_LISTENER(touchcancel);
 #endif
-
         void captureEvents();
         void releaseEvents();
 
diff --git a/WebCore/page/DOMWindow.idl b/WebCore/page/DOMWindow.idl
index c4b08c6..cfc9401 100644
--- a/WebCore/page/DOMWindow.idl
+++ b/WebCore/page/DOMWindow.idl
@@ -206,12 +206,6 @@
             raises(DOMException);
 
         // Events
-#if ENABLE_TOUCH_EVENTS
-        attribute EventListener ontouchstart;
-        attribute EventListener ontouchend;
-        attribute EventListener ontouchmove;
-        attribute EventListener ontouchcancel;
-#endif
 
         attribute EventListener onabort;
         attribute EventListener onbeforeunload;
@@ -296,6 +290,12 @@
 #if defined(ENABLE_ORIENTATION_EVENTS) && ENABLE_ORIENTATION_EVENTS
         attribute EventListener onorientationchange;
 #endif
+#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
+        attribute [DontEnum] EventListener ontouchstart;
+        attribute [DontEnum] EventListener ontouchmove;
+        attribute [DontEnum] EventListener ontouchend;
+        attribute [DontEnum] EventListener ontouchcancel;
+#endif
 
         // EventTarget interface
         [Custom] void addEventListener(in DOMString type,
@@ -466,9 +466,6 @@
         attribute WheelEventConstructor WheelEvent;
         attribute MessageEventConstructor MessageEvent;
         attribute EventExceptionConstructor EventException;
-#if ENABLE_TOUCH_EVENTS
-        attribute TouchEventConstructor TouchEvent;
-#endif
 
         attribute WebKitCSSKeyframeRuleConstructor WebKitCSSKeyframeRule;
         attribute WebKitCSSKeyframesRuleConstructor WebKitCSSKeyframesRule;
@@ -576,6 +573,10 @@
 #endif
 #endif
 
+#if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
+        attribute TouchEventConstructor TouchEvent;
+#endif
+
 #endif // defined(LANGUAGE_JAVASCRIPT)
 
 #if defined(V8_BINDING) && V8_BINDING
diff --git a/WebCore/page/EventHandler.cpp b/WebCore/page/EventHandler.cpp
index 8b6b602..a7dc13a 100644
--- a/WebCore/page/EventHandler.cpp
+++ b/WebCore/page/EventHandler.cpp
@@ -56,6 +56,7 @@
 #include "Page.h"
 #include "PlatformKeyboardEvent.h"
 #include "PlatformWheelEvent.h"
+#include "PluginView.h"
 #include "RenderFrameSet.h"
 #include "RenderTextControlSingleLine.h"
 #include "RenderView.h"
@@ -74,9 +75,9 @@
 #include "SVGUseElement.h"
 #endif
 
-#if ENABLE(TOUCH_EVENTS) // Android
-#include "TouchEvent.h"
+#if ENABLE(TOUCH_EVENTS)
 #include "PlatformTouchEvent.h"
+#include "TouchEvent.h"
 #endif
 
 #if defined(ANDROID_PLUGINS)
@@ -207,8 +208,16 @@
     m_lastScrollbarUnderMouse = 0;
     m_clickCount = 0;
     m_clickNode = 0;
-#if ENABLE(TOUCH_EVENTS) // Android
-    m_touch = 0;
+#if ENABLE(TOUCH_EVENTS)
+    m_touchEventTarget = 0;
+    if (Document* doc = m_frame->document()) {
+        if (Page* page = doc->page()) {
+            // We are clearing event handlers, which includes any touch
+            // event handlers so force webkit to tell the chrome client to
+            // stop forwarding the events.
+            page->chrome()->client()->needTouchEvents(false, true);
+        }
+    }
 #endif
     m_frameSetBeingResized = 0;
 #if ENABLE(DRAG_SUPPORT)
@@ -2546,131 +2555,6 @@
     return scrollbar->mouseDown(mev.event());
 }
 
-#if ENABLE(TOUCH_EVENTS) // Android
-int EventHandler::handleTouchEvent(const PlatformTouchEvent& e)
-{
-    // only handle the touch event in the top frame handler
-    if (m_frame->tree()->parent(true))
-        return m_frame->tree()->parent()->eventHandler()->handleTouchEvent(e);
-
-    Document* doc = m_frame->document();
-    if (!doc)
-        return 0;
-
-    RenderObject* docRenderer = doc->renderer();
-    if (!docRenderer)
-        return 0;
-
-    if (doc->touchEventListeners().size() == 0)
-        return 0;
-
-    TouchEventType type = e.eventType();
-    if (type == TouchEventStart || type == TouchEventLongPress || type == TouchEventDoubleTap) {
-        Frame* frame = m_frame;
-        IntPoint vPoint = frame->view()->windowToContents(e.pos());
-        HitTestRequest request(HitTestRequest::ReadOnly);
-        HitTestResult result(vPoint);
-        frame->contentRenderer()->layer()->hitTest(request, result);
-        Node* node = result.innerNode();
-        if (node) {
-            RenderObject* target = node->renderer();
-            while (target && target->isWidget()) {
-                Widget* widget = static_cast<RenderWidget*>(target)->widget();
-                if (widget->isFrameView()) {
-                    frame = static_cast<FrameView*>(widget)->frame();
-                    vPoint = frame->view()->windowToContents(e.pos());
-                    HitTestResult ret(vPoint);
-                    frame->contentRenderer()->layer()->hitTest(request, ret);
-                    node = ret.innerNode();
-                    if (!node)
-                        break;
-                    else
-                        target = node->renderer();
-                } else
-                    // plugin view??
-                    break;
-            }
-        }
-
-        if (!node) {
-            // reset to the top document node
-            node = doc;
-            frame = m_frame;
-            vPoint = frame->view()->windowToContents(e.pos());
-        }
-
-        m_touch = Touch::create(frame, node, 0,
-                e.x(), e.y(), vPoint.x(), vPoint.y());
-    } else if (m_touch) {
-        if ((type == TouchEventMove) && (e.x() == m_touch->screenX()) &&
-                (e.y() == m_touch->screenY())) {
-            // don't trigger the event if it hasn't really moved
-            return 0;
-        }
-
-        IntPoint vPoint = m_touch->frame()->view()->windowToContents(e.pos());
-        m_touch->updateLocation(e.x(), e.y(), vPoint.x(), vPoint.y());
-    } else {
-        return 0;
-    }
-
-    RefPtr<TouchList> touchList = TouchList::create();
-    touchList->append(m_touch);
-    // For TouchEventEnd, touches and targetTouches are empty list
-    RefPtr<TouchList> emptyList = TouchList::create();
-    RefPtr<TouchEvent> te;
-    switch(type) {
-        case TouchEventStart:
-            te = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(),
-                    eventNames().touchstartEvent, m_touch->frame()->document()->defaultView(),
-                    m_touch->screenX(), m_touch->screenY(), m_touch->pageX(), m_touch->pageY());
-            break;
-
-        case TouchEventEnd:
-            te = TouchEvent::create(emptyList.get(), emptyList.get(), touchList.get(),
-                    eventNames().touchendEvent, m_touch->frame()->document()->defaultView(),
-                    m_touch->screenX(), m_touch->screenY(), m_touch->pageX(), m_touch->pageY());
-            break;
-
-        case TouchEventMove:
-            te = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(),
-                    eventNames().touchmoveEvent, m_touch->frame()->document()->defaultView(),
-                    m_touch->screenX(), m_touch->screenY(), m_touch->pageX(), m_touch->pageY());
-            break;
-
-        case TouchEventCancel:
-            te = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(),
-                    eventNames().touchcancelEvent, m_touch->frame()->document()->defaultView(),
-                    m_touch->screenX(), m_touch->screenY(), m_touch->pageX(), m_touch->pageY());
-            break;
-
-        case TouchEventLongPress:
-            te = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(),
-                    eventNames().touchlongpressEvent, m_touch->frame()->document()->defaultView(),
-                    m_touch->screenX(), m_touch->screenY(), m_touch->pageX(), m_touch->pageY());
-            break;
-
-        case TouchEventDoubleTap:
-            te = TouchEvent::create(touchList.get(), touchList.get(), touchList.get(),
-                    eventNames().touchdoubletapEvent, m_touch->frame()->document()->defaultView(),
-                    m_touch->screenX(), m_touch->screenY(), m_touch->pageX(), m_touch->pageY());
-            break;
-
-        default:
-            return false;
-    }
-    ExceptionCode ec = 0;
-    m_touch->target()->dispatchEvent(te.get(), ec);
-    if (type == TouchEventEnd || type == TouchEventCancel)
-        m_touch = 0;
-    if (type == TouchEventLongPress || type == TouchEventDoubleTap)
-        return 0;
-    return (te->defaultPrevented() ? preventTouch : 0)
-            | (te->longPressPrevented() ? preventLongPress : 0)
-            | (te->doubleTapPrevented() ? preventDoubleTap : 0);
-}
-#endif
-
 // If scrollbar (under mouse) is different from last, send a mouse exited. Set
 // last to scrollbar if setLast is true; else set last to 0.
 void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setLast)
@@ -2683,4 +2567,209 @@
     }
 }
 
+#if ENABLE(TOUCH_EVENTS)
+#if PLATFORM(ANDROID)
+// TODO(benm): On Android we return an int back to Java to signify whether the default actions
+// for longpress/doubletap in the Browser should be prevented. I think that before upstreaming
+// to webkit.org we can refactor the Java side to not require this.
+int EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
+#else
+bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
+#endif
+{
+    RefPtr<TouchList> touches = TouchList::create();
+    RefPtr<TouchList> pressedTouches = TouchList::create();
+    RefPtr<TouchList> releasedTouches = TouchList::create();
+    RefPtr<TouchList> movedTouches = TouchList::create();
+    RefPtr<TouchList> targetTouches = TouchList::create();
+    RefPtr<TouchList> cancelTouches = TouchList::create();
+
+    const Vector<PlatformTouchPoint>& points = event.touchPoints();
+    AtomicString* eventName = 0;
+
+    for (int i = 0; i < points.size(); ++i) {
+        const PlatformTouchPoint& point = points[i];
+        IntPoint framePoint = documentPointForWindowPoint(m_frame, point.pos());
+        HitTestResult result = hitTestResultAtPoint(framePoint, /*allowShadowContent*/ false);
+        Node* target = result.innerNode();
+
+        // Touch events should not go to text nodes
+        if (target && target->isTextNode())
+            target = target->parentNode();
+
+        Document* doc = target->document();
+        if (!doc)
+            continue;
+        if (!doc->hasListenerType(Document::TOUCH_LISTENER))
+            continue;
+
+        int adjustedPageX = lroundf(framePoint.x() / m_frame->pageZoomFactor());
+        int adjustedPageY = lroundf(framePoint.y() / m_frame->pageZoomFactor());
+
+        if ( (event.type() == TouchStart
+#if PLATFORM(ANDROID)
+            || event.type() == TouchDoubleTap
+            || event.type() == TouchLongPress
+#endif
+            ) && !i) {
+            m_touchEventTarget = target;
+            m_firstTouchScreenPos = point.screenPos();
+            m_firstTouchPagePos = framePoint;
+        }
+
+        RefPtr<Touch> touch = Touch::create(m_frame, m_touchEventTarget.get(), point.id(),
+                                            point.screenPos().x(), point.screenPos().y(),
+                                            adjustedPageX, adjustedPageY);
+
+        if (point.state() == PlatformTouchPoint::TouchReleased)
+            releasedTouches->append(touch);
+        else if (point.state() == PlatformTouchPoint::TouchCancelled)
+            cancelTouches->append(touch);
+        else {
+            if (point.state() == PlatformTouchPoint::TouchPressed)
+                pressedTouches->append(touch);
+            else {
+                touches->append(touch);
+                if (m_touchEventTarget == target)
+                    targetTouches->append(touch);
+                if (point.state() == PlatformTouchPoint::TouchMoved)
+                    movedTouches->append(touch);
+            }
+        }
+    }
+
+    if (!m_touchEventTarget)
+#if PLATFORM(ANDROID)
+        return 0;
+#else
+        return false;
+#endif
+
+    bool defaultPrevented = false;
+#if PLATFORM(ANDROID)
+    // TODO (benm): We should be able to remove this prior to upstreaming once Java side refactorings to make
+    // preventDeault work better are complete.
+    bool longPressPrevented = false;
+    bool doubleTapPrevented = false;
+#endif
+
+    if (event.type() == TouchCancel) {
+        eventName = &eventNames().touchcancelEvent;
+        RefPtr<TouchEvent> cancelEv =
+            TouchEvent::create(TouchList::create().get(), TouchList::create().get(), cancelTouches.get(),
+                                                   *eventName, m_touchEventTarget->document()->defaultView(),
+                                                   m_firstTouchScreenPos.x(), m_firstTouchScreenPos.y(),
+                                                   m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
+                                                   event.ctrlKey(), event.altKey(), event.shiftKey(),
+                                                   event.metaKey());
+
+            ExceptionCode ec = 0;
+            m_touchEventTarget->dispatchEvent(cancelEv.get(), ec);
+            defaultPrevented |= cancelEv->defaultPrevented();
+    }
+
+    if (releasedTouches->length() > 0) {
+        eventName = &eventNames().touchendEvent;
+
+        RefPtr<TouchEvent> endEv =
+            TouchEvent::create(touches.get(), targetTouches.get(), releasedTouches.get(),
+                                                   *eventName, m_touchEventTarget->document()->defaultView(),
+                                                   m_firstTouchScreenPos.x(), m_firstTouchScreenPos.y(),
+                                                   m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
+                                                   event.ctrlKey(), event.altKey(), event.shiftKey(),
+                                                   event.metaKey());
+
+        ExceptionCode ec = 0;
+        m_touchEventTarget->dispatchEvent(endEv.get(), ec);
+        defaultPrevented |= endEv->defaultPrevented();
+    }
+
+    if (pressedTouches->length() > 0) {
+        // Add pressed touchpoints to touches and targetTouches.
+        for (int i = 0; i < pressedTouches->length(); ++i) {
+            touches->append(pressedTouches->item(i));
+            if (m_touchEventTarget == pressedTouches->item(i)->target())
+                targetTouches->append(pressedTouches->item(i));
+        }
+
+#if PLATFORM(ANDROID)
+        if (event.type() == TouchLongPress) {
+            eventName = &eventNames().touchlongpressEvent;
+            RefPtr<TouchEvent> longpressEv =
+                TouchEvent::create(touches.get(), targetTouches.get(), pressedTouches.get(),
+                                                       *eventName, m_touchEventTarget->document()->defaultView(),
+                                                       m_firstTouchScreenPos.x(), m_firstTouchScreenPos.y(),
+                                                       m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
+                                                       event.ctrlKey(), event.altKey(), event.shiftKey(),
+                                                       event.metaKey());
+
+            ExceptionCode ec = 0;
+            m_touchEventTarget->dispatchEvent(longpressEv.get(), ec);
+            defaultPrevented |= longpressEv->defaultPrevented();
+        } else if (event.type() == TouchDoubleTap) {
+            eventName = &eventNames().touchdoubletapEvent;
+            RefPtr<TouchEvent> doubleTapEv =
+                TouchEvent::create(touches.get(), targetTouches.get(), pressedTouches.get(),
+                                                       *eventName, m_touchEventTarget->document()->defaultView(),
+                                                       m_firstTouchScreenPos.x(), m_firstTouchScreenPos.y(),
+                                                       m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
+                                                       event.ctrlKey(), event.altKey(), event.shiftKey(),
+                                                       event.metaKey());
+
+            ExceptionCode ec = 0;
+            m_touchEventTarget->dispatchEvent(doubleTapEv.get(), ec);
+            defaultPrevented |= doubleTapEv->defaultPrevented();
+        } else {
+#endif
+            eventName = &eventNames().touchstartEvent;
+            RefPtr<TouchEvent> startEv =
+                TouchEvent::create(touches.get(), targetTouches.get(), pressedTouches.get(),
+                                                       *eventName, m_touchEventTarget->document()->defaultView(),
+                                                       m_firstTouchScreenPos.x(), m_firstTouchScreenPos.y(),
+                                                       m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
+                                                       event.ctrlKey(), event.altKey(), event.shiftKey(),
+                                                       event.metaKey());
+            ExceptionCode ec = 0;
+            m_touchEventTarget->dispatchEvent(startEv.get(), ec);
+            defaultPrevented |= startEv->defaultPrevented();
+#if PLATFORM(ANDROID)
+            longPressPrevented |= startEv->longPressPrevented();
+            doubleTapPrevented |= startEv->doubleTapPrevented();
+        }
+#endif
+    }
+
+    if (movedTouches->length() > 0) {
+        eventName = &eventNames().touchmoveEvent;
+        RefPtr<TouchEvent> moveEv =
+            TouchEvent::create(touches.get(), targetTouches.get(), movedTouches.get(),
+                                                   *eventName, m_touchEventTarget->document()->defaultView(),
+                                                   m_firstTouchScreenPos.x(), m_firstTouchScreenPos.y(),
+                                                   m_firstTouchPagePos.x(), m_firstTouchPagePos.y(),
+                                                   event.ctrlKey(), event.altKey(), event.shiftKey(),
+                                                   event.metaKey());
+        ExceptionCode ec = 0;
+        m_touchEventTarget->dispatchEvent(moveEv.get(), ec);
+        defaultPrevented |= moveEv->defaultPrevented();
+    }
+
+
+    if (event.type() == TouchEnd || event.type() == TouchCancel)
+        m_touchEventTarget = 0;
+
+#if PLATFORM(ANDROID)
+    // TODO (benm): We should be able to remove this prior to upstreaming  once Java side refactorings to make
+    // preventDefault work better are complete.
+    if (event.type() == TouchLongPress || event.type() == TouchDoubleTap)
+        return 0;
+
+    return (defaultPrevented ? preventTouch : 0)
+            | (longPressPrevented ? preventLongPress : 0)
+            | (doubleTapPrevented ? preventDoubleTap : 0);
+#else
+    return defaultPrevented;
+#endif
+}
+#endif
+
 }
diff --git a/WebCore/page/EventHandler.h b/WebCore/page/EventHandler.h
index 0da44f2..8ccd761 100644
--- a/WebCore/page/EventHandler.h
+++ b/WebCore/page/EventHandler.h
@@ -52,6 +52,7 @@
 class MouseEventWithHitTestResults;
 class Node;
 class PlatformKeyboardEvent;
+class PlatformTouchEvent;
 class PlatformWheelEvent;
 class RenderLayer;
 class RenderObject;
@@ -60,11 +61,8 @@
 class String;
 class SVGElementInstance;
 class TextEvent;
+class TouchEvent;
 class Widget;
-#if ENABLE(TOUCH_EVENTS) // Android
-class PlatformTouchEvent;
-class Touch;
-#endif
     
 #if ENABLE(DRAG_SUPPORT)
 extern const int LinkDragHysteresis;
@@ -75,13 +73,16 @@
 
 enum HitTestScrollbars { ShouldHitTestScrollbars, DontHitTestScrollbars };
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#if PLATFORM(ANDROID)
+// TODO (benm): I think with some Java refactoring we can remove this before upstreaming to webkit.org.
+#if ENABLE(TOUCH_EVENTS)
 enum TouchResultMask {
     preventTouch        = 1 << 0,
     preventLongPress    = 1 << 1,
     preventDoubleTap    = 1 << 2,
 };
 #endif
+#endif
 
 class EventHandler : public Noncopyable {
 public:
@@ -151,11 +152,6 @@
     bool handleMouseReleaseEvent(const PlatformMouseEvent&);
     bool handleWheelEvent(PlatformWheelEvent&);
 
-#if ENABLE(TOUCH_EVENTS) // Android
-    // See TouchResultMask for the return value options
-    int handleTouchEvent(const PlatformTouchEvent&);
-#endif
-
 #if ENABLE(CONTEXT_MENUS)
     bool sendContextMenuEvent(const PlatformMouseEvent&);
 #endif
@@ -208,6 +204,14 @@
     static NSEvent *currentNSEvent();
 #endif
 
+#if ENABLE(TOUCH_EVENTS)
+#if PLATFORM(ANDROID)
+    int handleTouchEvent(const PlatformTouchEvent&);
+#else
+    bool handleTouchEvent(const PlatformTouchEvent&);
+#endif
+#endif
+
 private:
 #if ENABLE(DRAG_SUPPORT)
     enum DragAndDropHandleType {
@@ -389,9 +393,6 @@
 
     int m_clickCount;
     RefPtr<Node> m_clickNode;
-#if ENABLE(TOUCH_EVENTS) // Android
-    RefPtr<Touch> m_touch;
-#endif
 
 #if ENABLE(DRAG_SUPPORT)
     RefPtr<Node> m_dragTarget;
@@ -418,6 +419,12 @@
     bool m_sendingEventToSubview;
     int m_activationEventNumber;
 #endif
+#if ENABLE(TOUCH_EVENTS)
+    RefPtr<Node> m_touchEventTarget;
+    IntPoint m_firstTouchScreenPos;
+    IntPoint m_firstTouchPagePos;
+#endif
+
 };
 
 } // namespace WebCore
diff --git a/WebCore/page/FrameView.cpp b/WebCore/page/FrameView.cpp
index b338017..b533bad 100644
--- a/WebCore/page/FrameView.cpp
+++ b/WebCore/page/FrameView.cpp
@@ -1151,11 +1151,7 @@
         m_frame->ownerRenderer()->setNeedsLayoutAndPrefWidthsRecalc();
 #endif
 
-#ifdef ANDROID_MOBILE
-    int delay = m_frame->document()->minimumLayoutDelay() + m_frame->document()->extraLayoutDelay();
-#else
     int delay = m_frame->document()->minimumLayoutDelay();
-#endif
     if (m_layoutTimer.isActive() && m_delayedLayout && !delay)
         unscheduleRelayout();
     if (m_layoutTimer.isActive())
@@ -1209,11 +1205,7 @@
             }
         }
     } else {
-#ifdef ANDROID_MOBILE
-        int delay = m_frame->document()->minimumLayoutDelay() + m_frame->document()->extraLayoutDelay();
-#else
         int delay = m_frame->document()->minimumLayoutDelay();
-#endif
         m_layoutRoot = relayoutRoot;
         m_delayedLayout = delay != 0;
         m_layoutTimer.startOneShot(delay * 0.001);
diff --git a/WebCore/page/Geolocation.cpp b/WebCore/page/Geolocation.cpp
index 5fbad47..f0578a8 100644
--- a/WebCore/page/Geolocation.cpp
+++ b/WebCore/page/Geolocation.cpp
@@ -39,10 +39,45 @@
 #include "SQLValue.h"
 #include <wtf/CurrentTime.h>
 
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+#include "Coordinates.h"
+#include "GeolocationController.h"
+#include "GeolocationError.h"
+#include "GeolocationPosition.h"
+#include "Geoposition.h"
+#include "PositionError.h"
+#endif
+
 namespace WebCore {
 
 static const char permissionDeniedErrorMessage[] = "User denied Geolocation";
 
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+
+static PassRefPtr<Geoposition> createGeoposition(GeolocationPosition* position)
+{
+    RefPtr<Coordinates> coordinates = Coordinates::create(position->latitude(), position->longitude(), position->canProvideAltitude(), position->altitude(), 
+                                                          position->accuracy(), position->canProvideAltitudeAccuracy(), position->altitudeAccuracy(),
+                                                          position->canProvideHeading(), position->heading(), position->canProvideSpeed(), position->speed());
+    return Geoposition::create(coordinates.release(), position->timestamp());
+}
+
+static PassRefPtr<PositionError> createPositionError(GeolocationError* error)
+{
+    PositionError::ErrorCode code = PositionError::POSITION_UNAVAILABLE;
+    switch (error->code()) {
+    case GeolocationError::PermissionDenied:
+        code = PositionError::PERMISSION_DENIED;
+        break;
+    case GeolocationError::PositionUnavailable:
+        code = PositionError::POSITION_UNAVAILABLE;
+        break;
+    }
+
+    return PositionError::create(code, error->message());
+}
+#endif
+
 Geolocation::GeoNotifier::GeoNotifier(Geolocation* geolocation, PassRefPtr<PositionCallback> successCallback, PassRefPtr<PositionErrorCallback> errorCallback, PassRefPtr<PositionOptions> options)
     : m_geolocation(geolocation)
     , m_successCallback(successCallback)
@@ -305,7 +340,9 @@
 Geolocation::Geolocation(Frame* frame)
     : EventListener(GeolocationEventListenerType)
     , m_frame(frame)
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
     , m_service(GeolocationService::create(this))
+#endif
     , m_allowGeolocation(Unknown)
     , m_shouldClearCache(false)
     , m_cachedPositionManager(new CachedPositionManager)
@@ -327,7 +364,7 @@
 
 void Geolocation::disconnectFrame()
 {
-    m_service->stopUpdating();
+    stopUpdating();
     if (m_frame && m_frame->document())
         m_frame->document()->setUsingGeolocation(false);
     m_frame = 0;
@@ -335,6 +372,24 @@
     delete m_cachedPositionManager;
 }
 
+Geoposition* Geolocation::lastPosition()
+{
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+    if (!m_frame)
+        return 0;
+
+    Page* page = m_frame->page();
+    if (!page)
+        return 0;
+
+    m_lastPosition = createGeoposition(page->geolocationController()->lastPosition());
+#else
+    m_lastPosition = m_service->lastPosition();
+#endif
+
+    return m_lastPosition.get();
+}
+
 void Geolocation::getCurrentPosition(PassRefPtr<PositionCallback> successCallback, PassRefPtr<PositionErrorCallback> errorCallback, PassRefPtr<PositionOptions> options)
 {
     RefPtr<GeoNotifier> notifier = startRequest(successCallback, errorCallback, options);
@@ -391,7 +446,7 @@
     m_watchers.remove(notifier);
 
     if (!hasListeners())
-        m_service->stopUpdating();
+        stopUpdating();
 }
 
 void Geolocation::requestTimedOut(GeoNotifier* notifier)
@@ -400,7 +455,7 @@
     m_oneShots.remove(notifier);
 
     if (!hasListeners())
-        m_service->stopUpdating();
+        stopUpdating();
 }
 
 void Geolocation::requestReturnedCachedPosition(GeoNotifier* notifier)
@@ -408,11 +463,11 @@
     // If this is a one-shot request, stop it.
     m_oneShots.remove(notifier);
     if (!hasListeners())
-        m_service->stopUpdating();
+        stopUpdating();
 
     // Otherwise, if the watch still exists, start the service to get updates.
     if (m_watchers.contains(notifier)) {
-        if (notifier->hasZeroTimeout() || m_service->startUpdating(notifier->m_options.get()))
+        if (notifier->hasZeroTimeout() || startUpdating(notifier->m_options.get()))
             notifier->startTimerIfNeeded();
         else
             notifier->setFatalError(PositionError::create(PositionError::POSITION_UNAVAILABLE, "Failed to start Geolocation service"));
@@ -436,7 +491,7 @@
     m_watchers.remove(watchId);
     
     if (!hasListeners())
-        m_service->stopUpdating();
+        stopUpdating();
 }
 
 void Geolocation::suspend()
@@ -497,7 +552,6 @@
         RefPtr<GeoNotifier> notifier = *it;
         ASSERT(notifier->m_successCallback);
         
-        notifier->m_timer.stop();
         notifier->m_successCallback->handleEvent(position);
     }
 }
@@ -554,7 +608,7 @@
     sendError(watchersCopy, error);
 
     if (!hasListeners())
-        m_service->stopUpdating();
+        stopUpdating();
 }
 
 void Geolocation::requestPermission()
@@ -575,12 +629,11 @@
     page->chrome()->requestGeolocationPermissionForFrame(m_frame, this);
 }
 
-void Geolocation::geolocationServicePositionChanged(GeolocationService* service)
+void Geolocation::positionChanged(PassRefPtr<Geoposition> newPosition)
 {
-    ASSERT_UNUSED(service, service == m_service);
-    ASSERT(m_service->lastPosition());
+    m_currentPosition = newPosition;
 
-    m_cachedPositionManager->setCachedPosition(m_service->lastPosition());
+    m_cachedPositionManager->setCachedPosition(m_currentPosition.get());
 
     // Stop all currently running timers.
     stopTimers();
@@ -599,7 +652,7 @@
 
 void Geolocation::makeSuccessCallbacks()
 {
-    ASSERT(m_service->lastPosition());
+    ASSERT(m_currentPosition);
     ASSERT(isAllowed());
     
     Vector<RefPtr<GeoNotifier> > oneShotsCopy;
@@ -613,23 +666,85 @@
     // further callbacks to these notifiers.
     m_oneShots.clear();
 
-    sendPosition(oneShotsCopy, m_service->lastPosition());
-    sendPosition(watchersCopy, m_service->lastPosition());
+    sendPosition(oneShotsCopy, m_currentPosition.get());
+    sendPosition(watchersCopy, m_currentPosition.get());
 
     if (!hasListeners())
-        m_service->stopUpdating();
+        stopUpdating();
+}
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+
+void Geolocation::setPosition(GeolocationPosition* position)
+{
+    positionChanged(createGeoposition(position));
+}
+
+void Geolocation::setError(GeolocationError* error)
+{
+    RefPtr<PositionError> positionError = createPositionError(error);
+    handleError(positionError.get());
+}
+
+#else
+
+void Geolocation::geolocationServicePositionChanged(GeolocationService* service)
+{
+    ASSERT_UNUSED(service, service == m_service);
+    ASSERT(m_service->lastPosition());
+
+    positionChanged(m_service->lastPosition());
 }
 
 void Geolocation::geolocationServiceErrorOccurred(GeolocationService* service)
 {
     ASSERT(service->lastError());
-    
+
     // Note that we do not stop timers here. For one-shots, the request is
     // cleared in handleError. For watchers, the spec requires that the timer is
     // not cleared.
     handleError(service->lastError());
 }
 
+#endif
+
+bool Geolocation::startUpdating(PositionOptions* options)
+{
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+    // FIXME: Pass options to client.
+    UNUSED_PARAM(options);
+
+    if (!m_frame)
+        return false;
+
+    Page* page = m_frame->page();
+    if (!page)
+        return false;
+
+    page->geolocationController()->addObserver(this);
+    return true;
+#else
+    return m_service->startUpdating(options);
+#endif
+}
+
+void Geolocation::stopUpdating()
+{
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+    if (!m_frame)
+        return;
+
+    Page* page = m_frame->page();
+    if (!page)
+        return;
+
+    page->geolocationController()->removeObserver(this);
+#else
+    m_service->stopUpdating();
+#endif
+
+}
+
 bool Geolocation::operator==(const EventListener& listener)
 {
     if (listener.type() != GeolocationEventListenerType)
diff --git a/WebCore/page/Geolocation.h b/WebCore/page/Geolocation.h
index fd9d560..5b5feb5 100644
--- a/WebCore/page/Geolocation.h
+++ b/WebCore/page/Geolocation.h
@@ -48,8 +48,16 @@
 class Frame;
 class CachedPositionManager;
 
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+class GeolocationPosition;
+class GeolocationError;
+#endif
 
-class Geolocation : public GeolocationServiceClient, public EventListener {
+class Geolocation : public EventListener
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
+    , public GeolocationServiceClient
+#endif
+{
 public:
     static PassRefPtr<Geolocation> create(Frame* frame) { return adoptRef(new Geolocation(frame)); }
 
@@ -57,7 +65,7 @@
 
     void disconnectFrame();
     
-    Geoposition* lastPosition() const { return m_service->lastPosition(); }
+    Geoposition* lastPosition();
 
     void getCurrentPosition(PassRefPtr<PositionCallback>, PassRefPtr<PositionErrorCallback>, PassRefPtr<PositionOptions>);
     int watchPosition(PassRefPtr<PositionCallback>, PassRefPtr<PositionErrorCallback>, PassRefPtr<PositionOptions>);
@@ -73,6 +81,11 @@
     void setShouldClearCache(bool shouldClearCache) { m_shouldClearCache = shouldClearCache; }
     bool shouldClearCache() const { return m_shouldClearCache; }
 
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+    void setPostion(GeolocationPosition*);
+    void setError(GeolocationError*);
+#endif
+
     static void setDatabasePath(String);
 
 private:
@@ -126,14 +139,20 @@
     void stopTimersForWatchers();
     void stopTimers();
     
+    void positionChanged(PassRefPtr<Geoposition>);
     void makeSuccessCallbacks();
     void handleError(PositionError*);
 
     void requestPermission();
 
+    bool startUpdating(PositionOptions*);
+    void stopUpdating();
+
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
     // GeolocationServiceClient
     virtual void geolocationServicePositionChanged(GeolocationService*);
     virtual void geolocationServiceErrorOccurred(GeolocationService*);
+#endif
 
     PassRefPtr<GeoNotifier> startRequest(PassRefPtr<PositionCallback>, PassRefPtr<PositionErrorCallback>, PassRefPtr<PositionOptions>);
 
@@ -151,7 +170,11 @@
     GeoNotifierSet m_oneShots;
     Watchers m_watchers;
     Frame* m_frame;
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
     OwnPtr<GeolocationService> m_service;
+#endif
+    RefPtr<Geoposition> m_lastPosition;
+    RefPtr<Geoposition> m_currentPosition;
 
     enum {
         Unknown,
diff --git a/WebCore/page/GeolocationController.cpp b/WebCore/page/GeolocationController.cpp
new file mode 100644
index 0000000..44eba6e
--- /dev/null
+++ b/WebCore/page/GeolocationController.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "GeolocationController.h"
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#include "GeolocationControllerClient.h"
+
+namespace WebCore {
+
+GeolocationController::GeolocationController(Page* page, GeolocationControllerClient* client)
+    : m_page(page)
+    , m_client(client)
+{
+}
+
+GeolocationController::~GeolocationController()
+{
+}
+
+void GeolocationController::addObserver(Geolocation* observer)
+{
+    ASSERT(!m_observers.contains(observer));
+
+    bool wasEmpty = m_observers.isEmpty();
+    m_observers.add(observer);
+    if (wasEmpty)
+        m_client->startUpdating();
+}
+
+void GeolocationController::removeObserver(Geolocation* observer)
+{
+    ASSERT(m_observers.contains(observer));
+
+    m_observers.remove(observer);
+    if (m_observers.isEmpty())
+        m_client->stopUpdating();
+}
+
+void GeolocationController::positionChanged(GeolocationPosition* position)
+{
+    HashSet<RefPtr<Geolocation> >::const_iterator end = m_observers.end();
+    for (HashSet<RefPtr<Geolocation> >::const_iterator it = m_observers.begin(); it != end; ++it)
+        (*it)->setPosition(position);
+}
+
+void GeolocationController::errorOccurred(GeolocationError* error)
+{
+    HashSet<RefPtr<Geolocation> >::const_iterator end = m_observers.end();
+    for (HashSet<RefPtr<Geolocation> >::const_iterator it = m_observers.begin(); it != end; ++it)
+        (*it)->setError(error);
+}
+
+GeolocationPosition* GeolocationController::lastPosition()
+{
+    return m_client->lastPosition();
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(CLIENT_BASED_GEOLOCATION)
diff --git a/WebCore/page/GeolocationController.h b/WebCore/page/GeolocationController.h
new file mode 100644
index 0000000..80f9ca8
--- /dev/null
+++ b/WebCore/page/GeolocationController.h
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GeolocationController_h
+#define GeolocationController_h
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#include "Geolocation.h"
+#include <wtf/HashSet.h>
+#include <wtf/Noncopyable.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class GeolocationControllerClient;
+class GeolocationError;
+class GeolocationPosition;
+class Page;
+
+class GeolocationController : public Noncopyable {
+public:
+    GeolocationController(Page*, GeolocationControllerClient*);
+    ~GeolocationController();
+
+    void addObserver(Geolocation*);
+    void removeObserver(Geolocation*);
+
+    void positionChanged(GeolocationPosition*);
+    void errorOccurred(GeolocationError*);
+
+    GeolocationPosition* lastPosition();
+
+private:
+    Page* m_page;
+    GeolocationControllerClient* m_client;
+
+    HashSet<RefPtr<Geolocation> > m_observers;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#endif // GeolocationController_h
diff --git a/WebCore/page/GeolocationControllerClient.h b/WebCore/page/GeolocationControllerClient.h
new file mode 100644
index 0000000..830c64b
--- /dev/null
+++ b/WebCore/page/GeolocationControllerClient.h
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GeolocationControllerClient_h
+#define GeolocationControllerClient_h
+
+namespace WebCore {
+
+class GeolocationPosition;
+
+class GeolocationControllerClient {
+public:
+    virtual void startUpdating() = 0;
+    virtual void stopUpdating() = 0;
+    virtual GeolocationPosition* lastPosition() = 0;
+
+protected:
+    virtual ~GeolocationControllerClient() { }
+};
+
+} // namespace WebCore
+
+#endif // GeolocationControllerClient_h
diff --git a/WebCore/page/GeolocationError.h b/WebCore/page/GeolocationError.h
new file mode 100644
index 0000000..9761ca6
--- /dev/null
+++ b/WebCore/page/GeolocationError.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GeolocationError_h
+#define GeolocationError_h
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#include "PlatformString.h"
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class GeolocationError : public RefCounted<GeolocationError> {
+public:
+    enum ErrorCode {
+        PermissionDenied,
+        PositionUnavailable
+    };
+
+    static PassRefPtr<GeolocationError> create(ErrorCode code, const String& message) { return adoptRef(new GeolocationError(code, message)); }
+
+    ErrorCode code() const { return m_code; }
+    const String& message() const { return m_message; }
+
+private:
+    GeolocationError(ErrorCode code, const String& message);
+
+    ErrorCode m_code;
+    String m_message; 
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#endif // GeolocationError_h
diff --git a/WebCore/page/GeolocationPosition.h b/WebCore/page/GeolocationPosition.h
new file mode 100644
index 0000000..c31e9c4
--- /dev/null
+++ b/WebCore/page/GeolocationPosition.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef GeolocationPosition_h
+#define GeolocationPosition_h
+
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+
+class GeolocationPosition : public RefCounted<GeolocationPosition> {
+public:
+    static PassRefPtr<GeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy) { return adoptRef(new GeolocationPosition(timestamp, latitude, longitude, accuracy)); }
+
+    static PassRefPtr<GeolocationPosition> create(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed) { return adoptRef(new GeolocationPosition(timestamp, latitude, longitude, accuracy, providesAltitude, altitude, providesAltitudeAccuracy, altitudeAccuracy, providesHeading, heading, providesSpeed, speed)); }
+
+    double timestamp() const { return m_timestamp; }
+
+    double latitude() const { return m_latitude; }
+    double longitude() const { return m_longitude; }
+    double accuracy() const { return m_accuracy; }
+    double altitude() const { return m_altitude; }
+    double altitudeAccuracy() const { return m_altitudeAccuracy; }
+    double heading() const { return m_heading; }
+    double speed() const { return m_speed; }
+
+    bool canProvideAltitude() const { return m_canProvideAltitude; }
+    bool canProvideAltitudeAccuracy() const { return m_canProvideAltitudeAccuracy; }
+    bool canProvideHeading() const { return m_canProvideHeading; }
+    bool canProvideSpeed() const { return m_canProvideSpeed; }
+
+private:
+    GeolocationPosition(double timestamp, double latitude, double longitude, double accuracy)
+        : m_timestamp(timestamp)
+        , m_latitude(latitude)
+        , m_longitude(longitude)
+        , m_accuracy(accuracy)
+        , m_altitude(0)
+        , m_altitudeAccuracy(0)
+        , m_heading(0)
+        , m_speed(0)
+        , m_canProvideAltitude(false)
+        , m_canProvideAltitudeAccuracy(false)
+        , m_canProvideHeading(false)
+        , m_canProvideSpeed(false)
+    {
+    }
+
+    GeolocationPosition(double timestamp, double latitude, double longitude, double accuracy, bool providesAltitude, double altitude, bool providesAltitudeAccuracy, double altitudeAccuracy, bool providesHeading, double heading, bool providesSpeed, double speed)
+        : m_timestamp(timestamp)
+        , m_latitude(latitude)
+        , m_longitude(longitude)
+        , m_accuracy(accuracy)
+        , m_altitude(altitude)
+        , m_altitudeAccuracy(altitudeAccuracy)
+        , m_heading(heading)
+        , m_speed(speed)
+        , m_canProvideAltitude(providesAltitude)
+        , m_canProvideAltitudeAccuracy(providesAltitudeAccuracy)
+        , m_canProvideHeading(providesHeading)
+        , m_canProvideSpeed(providesSpeed)
+    {
+    }
+
+    double m_timestamp;
+
+    double m_latitude;
+    double m_longitude;
+    double m_accuracy;
+    double m_altitude;
+    double m_altitudeAccuracy;
+    double m_heading;
+    double m_speed;
+
+    bool m_canProvideAltitude;
+    bool m_canProvideAltitudeAccuracy;
+    bool m_canProvideHeading;
+    bool m_canProvideSpeed;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(CLIENT_BASED_GEOLOCATION)
+
+#endif // GeolocationPosition_h
diff --git a/WebCore/page/Geoposition.h b/WebCore/page/Geoposition.h
index f3c703b..8b215b1 100644
--- a/WebCore/page/Geoposition.h
+++ b/WebCore/page/Geoposition.h
@@ -37,8 +37,11 @@
 
 class Geoposition : public RefCounted<Geoposition> {
 public:
-    static PassRefPtr<Geoposition> create(PassRefPtr<Coordinates> coordinates, DOMTimeStamp timestamp) { return adoptRef(new Geoposition(coordinates, timestamp)); }
-    
+    static PassRefPtr<Geoposition> create(PassRefPtr<Coordinates> coordinates, DOMTimeStamp timestamp)
+    {
+        return adoptRef(new Geoposition(coordinates, timestamp));
+    }
+
     DOMTimeStamp timestamp() const { return m_timestamp; }
     Coordinates* coords() const { return m_coordinates.get(); }
     
diff --git a/WebCore/page/Navigator.cpp b/WebCore/page/Navigator.cpp
index a4193fc..8563a0e 100644
--- a/WebCore/page/Navigator.cpp
+++ b/WebCore/page/Navigator.cpp
@@ -24,6 +24,9 @@
 #include "Navigator.h"
 
 #include "CookieJar.h"
+#if PLATFORM(ANDROID)
+#include "Connection.h"
+#endif
 #include "ExceptionCode.h"
 #include "Frame.h"
 #include "FrameLoader.h"
@@ -155,6 +158,15 @@
     return m_geolocation.get();
 }
 
+#if PLATFORM(ANDROID)
+Connection* Navigator::connection() const
+{
+    if (!m_connection)
+        m_connection = Connection::create();
+    return m_connection.get();
+}
+#endif
+
 #if ENABLE(DOM_STORAGE)
 void Navigator::getStorageUpdates()
 {
diff --git a/WebCore/page/Navigator.h b/WebCore/page/Navigator.h
index 107082b..9967fba 100644
--- a/WebCore/page/Navigator.h
+++ b/WebCore/page/Navigator.h
@@ -27,6 +27,9 @@
 
 namespace WebCore {
 
+#if PLATFORM(ANDROID)
+    class Connection;
+#endif
     class Frame;
     class Geolocation;
     class MimeTypeArray;
@@ -57,6 +60,10 @@
         // This is used for GC marking.
         Geolocation* optionalGeolocation() const { return m_geolocation.get(); }
 
+#if PLATFORM(ANDROID)
+        Connection* connection() const;
+#endif
+
 #if ENABLE(DOM_STORAGE)
         // Relinquishes the storage lock, if one exists.
         void getStorageUpdates();
@@ -71,6 +78,9 @@
         mutable RefPtr<PluginArray> m_plugins;
         mutable RefPtr<MimeTypeArray> m_mimeTypes;
         mutable RefPtr<Geolocation> m_geolocation;
+#if PLATFORM(ANDROID)
+        mutable RefPtr<Connection> m_connection;
+#endif
     };
 
 }
diff --git a/WebCore/page/Navigator.idl b/WebCore/page/Navigator.idl
index 99b22af..f3079de 100644
--- a/WebCore/page/Navigator.idl
+++ b/WebCore/page/Navigator.idl
@@ -39,6 +39,9 @@
         
         readonly attribute boolean onLine;
 
+        // ANDROID-only for now, upstreaming in progress.
+        readonly attribute Connection connection;
+
 #if defined(ENABLE_GEOLOCATION) && ENABLE_GEOLOCATION
         readonly attribute Geolocation geolocation;
 #endif
diff --git a/WebCore/page/Page.cpp b/WebCore/page/Page.cpp
index c4f33d6..1a035a5 100644
--- a/WebCore/page/Page.cpp
+++ b/WebCore/page/Page.cpp
@@ -77,6 +77,10 @@
 #include "WMLPageState.h"
 #endif
 
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+#include "GeolocationController.h"
+#endif
+
 namespace WebCore {
 
 static HashSet<Page*>* allPages;
@@ -101,7 +105,7 @@
         frames[i]->document()->dispatchWindowEvent(Event::create(eventName, false, false));
 }
 
-Page::Page(ChromeClient* chromeClient, ContextMenuClient* contextMenuClient, EditorClient* editorClient, DragClient* dragClient, InspectorClient* inspectorClient, PluginHalterClient* pluginHalterClient)
+Page::Page(ChromeClient* chromeClient, ContextMenuClient* contextMenuClient, EditorClient* editorClient, DragClient* dragClient, InspectorClient* inspectorClient, PluginHalterClient* pluginHalterClient, GeolocationControllerClient* geolocationControllerClient)
     : m_chrome(new Chrome(this, chromeClient))
     , m_dragCaretController(new SelectionController(0, true))
 #if ENABLE(DRAG_SUPPORT)
@@ -114,6 +118,9 @@
 #if ENABLE(INSPECTOR)
     , m_inspectorController(new InspectorController(this, inspectorClient))
 #endif
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+    , m_geolocationController(new GeolocationController(this, geolocationControllerClient))
+#endif
     , m_settings(new Settings(this))
     , m_progress(new ProgressTracker)
     , m_backForwardList(BackForwardList::create(this))
@@ -148,6 +155,10 @@
 #if !ENABLE(INSPECTOR)
     UNUSED_PARAM(inspectorClient);
 #endif
+#if !ENABLE(CLIENT_BASED_GEOLOCATION)
+    UNUSED_PARAM(geolocationControllerClient);
+#endif
+
     if (!allPages) {
         allPages = new HashSet<Page*>;
         
diff --git a/WebCore/page/Page.h b/WebCore/page/Page.h
index 4886464..40d96a7 100644
--- a/WebCore/page/Page.h
+++ b/WebCore/page/Page.h
@@ -54,6 +54,8 @@
     class EditorClient;
     class FocusController;
     class Frame;
+    class GeolocationController;
+    class GeolocationControllerClient;
     class HaltablePlugin;
     class InspectorClient;
     class InspectorController;
@@ -85,7 +87,7 @@
     public:
         static void setNeedsReapplyStyles();
 
-        Page(ChromeClient*, ContextMenuClient*, EditorClient*, DragClient*, InspectorClient*, PluginHalterClient*);
+        Page(ChromeClient*, ContextMenuClient*, EditorClient*, DragClient*, InspectorClient*, PluginHalterClient*, GeolocationControllerClient*);
         ~Page();
 
         RenderTheme* theme() const { return m_theme.get(); };
@@ -144,6 +146,9 @@
 #if ENABLE(INSPECTOR)
         InspectorController* inspectorController() const { return m_inspectorController.get(); }
 #endif
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+        GeolocationController* geolocationController() const { return m_geolocationController.get(); }
+#endif
         Settings* settings() const { return m_settings.get(); }
         ProgressTracker* progress() const { return m_progress.get(); }
 
@@ -250,6 +255,9 @@
 #if ENABLE(INSPECTOR)
         OwnPtr<InspectorController> m_inspectorController;
 #endif
+#if ENABLE(CLIENT_BASED_GEOLOCATION)
+        OwnPtr<GeolocationController> m_geolocationController;
+#endif
         OwnPtr<Settings> m_settings;
         OwnPtr<ProgressTracker> m_progress;
         
diff --git a/WebCore/platform/PlatformTouchEvent.h b/WebCore/platform/PlatformTouchEvent.h
index 6c8629c..78de894 100644
--- a/WebCore/platform/PlatformTouchEvent.h
+++ b/WebCore/platform/PlatformTouchEvent.h
@@ -1,67 +1,86 @@
 /*
- * Copyright 2008, The Android Open Source Project
- *
- * 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 APPLE COMPUTER, 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.
- */
+    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
 
 #ifndef PlatformTouchEvent_h
 #define PlatformTouchEvent_h
 
-#if ENABLE(TOUCH_EVENTS) // Android
+#include "PlatformTouchPoint.h"
+#include <wtf/Vector.h>
 
+#if ENABLE(TOUCH_EVENTS)
+
+#if PLATFORM(QT)
+QT_BEGIN_NAMESPACE
+class QTouchEvent;
+QT_END_NAMESPACE
+#endif
+
+#if PLATFORM(ANDROID)
 #include "IntPoint.h"
+#endif
 
 namespace WebCore {
 
-    enum TouchEventType {TouchEventStart, TouchEventMove, TouchEventEnd, TouchEventCancel, TouchEventLongPress, TouchEventDoubleTap};
+enum TouchEventType {
+    TouchStart
+    , TouchMove
+    , TouchEnd
+    , TouchCancel
+#if PLATFORM(ANDROID)
+    , TouchLongPress
+    , TouchDoubleTap
+#endif
+};
 
-    class PlatformTouchEvent {
-    public:
-        PlatformTouchEvent()
-            : m_eventType(TouchEventCancel)
-        {
-        }
+class PlatformTouchEvent {
+public:
+    PlatformTouchEvent()
+        : m_type(TouchStart)
+        , m_ctrlKey(false)
+        , m_altKey(false)
+        , m_shiftKey(false)
+        , m_metaKey(false)
+    {}
+#if PLATFORM(QT)
+    PlatformTouchEvent(QTouchEvent*);
+#elif PLATFORM(ANDROID)
+    PlatformTouchEvent(const IntPoint&, const IntPoint&, TouchEventType, PlatformTouchPoint::State);
+#endif
 
-        PlatformTouchEvent(const IntPoint& pos, const IntPoint& globalPos, TouchEventType eventType)
-            : m_position(pos)
-            , m_globalPosition(globalPos)
-            , m_eventType(eventType)
-        {
-        }
+    TouchEventType type() const { return m_type; }
+    const Vector<PlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
 
-        const IntPoint& pos() const { return m_position; }
-        int x() const { return m_position.x(); }
-        int y() const { return m_position.y(); }
-        int globalX() const { return m_globalPosition.x(); }
-        int globalY() const { return m_globalPosition.y(); }
-        TouchEventType eventType() const { return m_eventType; }
+    bool ctrlKey() const { return m_ctrlKey; }
+    bool altKey() const { return m_altKey; }
+    bool shiftKey() const { return m_shiftKey; }
+    bool metaKey() const { return m_metaKey; }
 
-    private:
-        IntPoint m_position;
-        IntPoint m_globalPosition;
-        TouchEventType m_eventType;
-    };
+private:
+    TouchEventType m_type;
+    Vector<PlatformTouchPoint> m_touchPoints;
+    bool m_ctrlKey;
+    bool m_altKey;
+    bool m_shiftKey;
+    bool m_metaKey;
+};
 
-} // namespace WebCore
+}
 
 #endif // ENABLE(TOUCH_EVENTS)
 
diff --git a/WebCore/platform/PlatformTouchPoint.h b/WebCore/platform/PlatformTouchPoint.h
new file mode 100644
index 0000000..339fe73
--- /dev/null
+++ b/WebCore/platform/PlatformTouchPoint.h
@@ -0,0 +1,69 @@
+/*
+    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#ifndef PlatformTouchPoint_h
+#define PlatformTouchPoint_h
+
+#include "IntPoint.h"
+#include <wtf/Platform.h>
+#include <wtf/Vector.h>
+
+#if ENABLE(TOUCH_EVENTS)
+
+#if PLATFORM(QT)
+#include <QTouchEvent>
+#endif
+
+namespace WebCore {
+
+class PlatformTouchEvent;
+
+class PlatformTouchPoint {
+public:
+    enum State {
+        TouchReleased,
+        TouchPressed,
+        TouchMoved,
+        TouchStationary,
+        TouchCancelled
+    };
+
+#if PLATFORM(QT)
+    PlatformTouchPoint(const QTouchEvent::TouchPoint&);
+#elif PLATFORM(ANDROID)
+    PlatformTouchPoint(const IntPoint&, const IntPoint&, State);
+#endif
+
+    int id() const { return m_id; }
+    State state() const { return m_state; }
+    IntPoint screenPos() const { return m_screenPos; }
+    IntPoint pos() const { return m_pos; }
+    
+private:
+    int m_id;
+    State m_state;
+    IntPoint m_screenPos;
+    IntPoint m_pos;
+};
+
+}
+
+#endif // ENABLE(TOUCH_EVENTS)
+
+#endif // PlatformTouchPoint_h
diff --git a/WebCore/platform/Timer.cpp b/WebCore/platform/Timer.cpp
index 4804540..ea3effd 100644
--- a/WebCore/platform/Timer.cpp
+++ b/WebCore/platform/Timer.cpp
@@ -37,11 +37,6 @@
 #include <wtf/HashSet.h>
 #include <wtf/Vector.h>
 
-#if PLATFORM(ANDROID)
-#include "stl_iterator_base.h"
-#include "heap.h"
-#endif
-
 using namespace std;
 
 namespace WebCore {
diff --git a/WebCore/platform/android/GeolocationServiceAndroid.cpp b/WebCore/platform/android/GeolocationServiceAndroid.cpp
index 43a8f5f..3ffb9b9 100644
--- a/WebCore/platform/android/GeolocationServiceAndroid.cpp
+++ b/WebCore/platform/android/GeolocationServiceAndroid.cpp
@@ -28,6 +28,7 @@
 
 #include "GeolocationServiceBridge.h"
 #include "Geoposition.h"
+#include "PlatformBridge.h"
 #include "PositionError.h"
 #include "PositionOptions.h"
 
@@ -83,8 +84,13 @@
     if (options->enableHighAccuracy())
         m_javaBridge->setEnableGps(true);
 
-    if (!haveJavaBridge)
-        m_javaBridge->start();
+    // We need only start the service when it's first created.
+    if (!haveJavaBridge) {
+        // If the browser is paused, don't start the service. It will be started
+        // when we get the call to resume.
+        if (!PlatformBridge::isWebViewPaused())
+            m_javaBridge->start();
+    }
 
     return true;
 }
diff --git a/WebCore/platform/android/PlatformBridge.h b/WebCore/platform/android/PlatformBridge.h
index 9adb314..a73abab 100644
--- a/WebCore/platform/android/PlatformBridge.h
+++ b/WebCore/platform/android/PlatformBridge.h
@@ -50,6 +50,10 @@
     // KeyGenerator
     static WTF::Vector<String> getSupportedKeyStrengthList();
     static String getSignedPublicKeyAndChallengeString(unsigned index, const String& challenge, const KURL&);
+    // Cookies
+    static void setCookies(const KURL&, const String& value);
+    static String cookies(const KURL&);
+    static bool cookiesEnabled();
     // These ids need to be in sync with the constants in BrowserFrame.java
     enum rawResId {
         NoDomain = 1,
@@ -67,6 +71,9 @@
     static void immediateRepaint(const FrameView* view);
 #endif // USE(ACCELERATED_COMPOSITING)
 
+    // Whether the WebView is paused.
+    static bool isWebViewPaused();
 };
+
 }
 #endif // PlatformBridge_h
diff --git a/WebCore/platform/network/android/CookieClient.h b/WebCore/platform/android/PlatformTouchEventAndroid.cpp
similarity index 75%
copy from WebCore/platform/network/android/CookieClient.h
copy to WebCore/platform/android/PlatformTouchEventAndroid.cpp
index be2963e..46d5c6f 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/WebCore/platform/android/PlatformTouchEventAndroid.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2010, The Android Open Source Project
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,24 +23,17 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef COOKIE_CLIENT_H
-#define COOKIE_CLIENT_H
+#include "config.h"
+#include "PlatformTouchEvent.h"
 
-#include "KURL.h"
-#include "PlatformString.h"
+#if ENABLE(TOUCH_EVENTS)
 
-using namespace WebCore;
+namespace WebCore {
 
-namespace android {
-
-class CookieClient {
-
-public:
-    virtual ~CookieClient() {}
-    virtual void setCookies(const KURL& url, const String& value) = 0;
-    virtual String cookies(const KURL& url) = 0;
-    virtual bool cookiesEnabled() = 0;
-};
+PlatformTouchEvent::PlatformTouchEvent(const IntPoint& pos, const IntPoint& globalPos, TouchEventType type, PlatformTouchPoint::State state) : m_type(type) {
+    m_touchPoints.append(PlatformTouchPoint(pos, globalPos, state));
+}
 
 }
+
 #endif
diff --git a/WebCore/platform/network/android/CookieClient.h b/WebCore/platform/android/PlatformTouchPointAndroid.cpp
similarity index 75%
copy from WebCore/platform/network/android/CookieClient.h
copy to WebCore/platform/android/PlatformTouchPointAndroid.cpp
index be2963e..cb22f5f 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/WebCore/platform/android/PlatformTouchPointAndroid.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007, The Android Open Source Project
+ * Copyright 2010, The Android Open Source Project
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -23,24 +23,15 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef COOKIE_CLIENT_H
-#define COOKIE_CLIENT_H
+#include "config.h"
+#include "PlatformTouchPoint.h"
 
-#include "KURL.h"
-#include "PlatformString.h"
+#if ENABLE(TOUCH_EVENTS)
 
-using namespace WebCore;
+namespace WebCore {
 
-namespace android {
-
-class CookieClient {
-
-public:
-    virtual ~CookieClient() {}
-    virtual void setCookies(const KURL& url, const String& value) = 0;
-    virtual String cookies(const KURL& url) = 0;
-    virtual bool cookiesEnabled() = 0;
-};
+PlatformTouchPoint::PlatformTouchPoint(const IntPoint& pos, const IntPoint& globalPos, State state) :m_id(0), m_state(state), m_screenPos(pos), m_pos(globalPos) {}
 
 }
+
 #endif
diff --git a/WebCore/platform/graphics/BitmapImage.h b/WebCore/platform/graphics/BitmapImage.h
index a07daf2..0031df6 100644
--- a/WebCore/platform/graphics/BitmapImage.h
+++ b/WebCore/platform/graphics/BitmapImage.h
@@ -148,7 +148,7 @@
     virtual bool getHBITMAPOfSize(HBITMAP, LPSIZE);
 #endif
 
-#if PLATFORM(SGL)
+#if PLATFORM(ANDROID)
     virtual void setURL(const String& str);
 #endif
 
diff --git a/WebCore/platform/graphics/FloatPoint.h b/WebCore/platform/graphics/FloatPoint.h
index 7d32bcf..45a1e83 100644
--- a/WebCore/platform/graphics/FloatPoint.h
+++ b/WebCore/platform/graphics/FloatPoint.h
@@ -100,7 +100,7 @@
     operator BPoint() const;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
     operator SkPoint() const;
     FloatPoint(const SkPoint&);
 #endif
diff --git a/WebCore/platform/graphics/FloatRect.h b/WebCore/platform/graphics/FloatRect.h
index 4b4694f..2dc854d 100644
--- a/WebCore/platform/graphics/FloatRect.h
+++ b/WebCore/platform/graphics/FloatRect.h
@@ -55,7 +55,7 @@
 class BRect;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
 struct SkRect;
 #endif
 
@@ -149,7 +149,7 @@
     operator BRect() const;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
     FloatRect(const SkRect&);
     operator SkRect() const;
 #endif
diff --git a/WebCore/platform/graphics/Gradient.cpp b/WebCore/platform/graphics/Gradient.cpp
index 77a0d21..204a2b6 100644
--- a/WebCore/platform/graphics/Gradient.cpp
+++ b/WebCore/platform/graphics/Gradient.cpp
@@ -161,7 +161,7 @@
     setPlatformGradientSpaceTransform(gradientSpaceTransformation);
 }
 
-#if !PLATFORM(SKIA)
+#if !(PLATFORM(SKIA) && !PLATFORM(ANDROID))
 void Gradient::setPlatformGradientSpaceTransform(const TransformationMatrix&)
 {
 }
diff --git a/WebCore/platform/graphics/Gradient.h b/WebCore/platform/graphics/Gradient.h
index 7f01251..011a2cd 100644
--- a/WebCore/platform/graphics/Gradient.h
+++ b/WebCore/platform/graphics/Gradient.h
@@ -46,13 +46,15 @@
 #elif PLATFORM(CAIRO)
 typedef struct _cairo_pattern cairo_pattern_t;
 typedef cairo_pattern_t* PlatformGradient;
-#elif PLATFORM(ANDROID) && PLATFORM(SGL)
+#elif PLATFORM(SKIA)
+#if PLATFORM(ANDROID)
 #include "SkShader.h"
 typedef class PlatformGradientRec* PlatformGradient;
-#elif PLATFORM(SKIA)
+#else
 class SkShader;
 typedef class SkShader* PlatformGradient;
 typedef class SkShader* PlatformPattern;
+#endif
 #else
 typedef void* PlatformGradient;
 #endif
@@ -86,13 +88,11 @@
         struct ColorStop;
         const Vector<ColorStop>& getStops() const;
 #else
-
-#if PLATFORM(ANDROID) && PLATFORM(SGL)
+#if PLATFORM(ANDROID)
         SkShader* getShader(SkShader::TileMode);
 #endif
         PlatformGradient platformGradient();
 #endif
-
         struct ColorStop {
             float stop;
             float red;
diff --git a/WebCore/platform/graphics/GraphicsContext.cpp b/WebCore/platform/graphics/GraphicsContext.cpp
index fee05ee..e80004f 100644
--- a/WebCore/platform/graphics/GraphicsContext.cpp
+++ b/WebCore/platform/graphics/GraphicsContext.cpp
@@ -518,7 +518,7 @@
     generator.fill(this, rect);
 }
 
-#if !PLATFORM(SKIA)
+#if !(PLATFORM(SKIA) && !PLATFORM(ANDROID))
 void GraphicsContext::setPlatformFillGradient(Gradient*)
 {
 }
@@ -536,7 +536,7 @@
 }
 #endif
 
-#if !PLATFORM(CG) && !PLATFORM(SKIA)
+#if !PLATFORM(CG) && !(PLATFORM(SKIA) && !PLATFORM(ANDROID))
 // Implement this if you want to go ahead and push the drawing mode into your native context
 // immediately.
 void GraphicsContext::setPlatformTextDrawingMode(int mode)
@@ -544,7 +544,7 @@
 }
 #endif
 
-#if !PLATFORM(QT) && !PLATFORM(CAIRO) && !PLATFORM(SKIA) && !PLATFORM(HAIKU)
+#if !PLATFORM(QT) && !PLATFORM(CAIRO) && !(PLATFORM(SKIA) && !PLATFORM(ANDROID)) && !PLATFORM(HAIKU)
 void GraphicsContext::setPlatformStrokeStyle(const StrokeStyle&)
 {
 }
diff --git a/WebCore/platform/graphics/GraphicsContext.h b/WebCore/platform/graphics/GraphicsContext.h
index 96a6221..ecf2101 100644
--- a/WebCore/platform/graphics/GraphicsContext.h
+++ b/WebCore/platform/graphics/GraphicsContext.h
@@ -46,12 +46,6 @@
 class QPainter;
 QT_END_NAMESPACE
 typedef QPainter PlatformGraphicsContext;
-#elif PLATFORM(SGL)
-namespace WebCore {
-class PlatformGraphicsContext;
-}
-class SkPaint;
-struct SkPoint;
 #elif PLATFORM(WX)
 class wxGCDC;
 class wxWindowDC;
@@ -72,7 +66,15 @@
     typedef wxWindowDC PlatformGraphicsContext;
 #endif
 #elif PLATFORM(SKIA)
+#if PLATFORM(ANDROID)
+namespace WebCore {
+class PlatformGraphicsContext;
+}
+class SkPaint;
+struct SkPoint;
+#else
 typedef class PlatformContextSkia PlatformGraphicsContext;
+#endif
 #elif PLATFORM(HAIKU)
 class BView;
 typedef BView PlatformGraphicsContext;
@@ -190,7 +192,7 @@
         void applyFillPattern();
 #endif
 
-#if PLATFORM(SGL)
+#if PLATFORM(ANDROID)
         // initialize a paint for bitmaps
         void setupBitmapPaint(SkPaint*);
         // initialize a paint for filling
@@ -204,7 +206,7 @@
         bool willFill() const;
         // returns true if there is a valid (non-transparent) stroke color
         bool willStroke() const;
-        
+
         // may return NULL, since we lazily allocate the path. This is the path
         // that is drawn by drawPath()
         const SkPath* getCurrPath() const;
diff --git a/WebCore/platform/graphics/Image.h b/WebCore/platform/graphics/Image.h
index aef6577..f25169b 100644
--- a/WebCore/platform/graphics/Image.h
+++ b/WebCore/platform/graphics/Image.h
@@ -148,7 +148,7 @@
     virtual bool getHBITMAPOfSize(HBITMAP, LPSIZE) { return false; }
 #endif
 
-#if PLATFORM(SGL)
+#if PLATFORM(ANDROID)
     virtual void setURL(const String& str) {}
 #endif
 
diff --git a/WebCore/platform/graphics/ImageSource.h b/WebCore/platform/graphics/ImageSource.h
index 19c7bf7..083c7b0 100644
--- a/WebCore/platform/graphics/ImageSource.h
+++ b/WebCore/platform/graphics/ImageSource.h
@@ -45,12 +45,14 @@
 #elif PLATFORM(CAIRO)
 struct _cairo_surface;
 typedef struct _cairo_surface cairo_surface_t;
-#elif PLATFORM(ANDROID) && PLATFORM(SGL)
+#elif PLATFORM(SKIA)
+#if PLATFORM(ANDROID)
 #include "SkString.h"
 class SkBitmapRef;
 class PrivateAndroidImageSourceRec;
-#elif PLATFORM(SKIA)
+#else
 class NativeImageSkia;
+#endif
 #elif PLATFORM(HAIKU)
 class BBitmap;
 #elif PLATFORM(WINCE)
@@ -70,14 +72,14 @@
 class ImageDecoderQt;
 typedef ImageDecoderQt* NativeImageSourcePtr;
 typedef QPixmap* NativeImagePtr;
-#elif PLATFORM(ANDROID)
-#if PLATFORM(SGL)
+#elif PLATFORM(SKIA)
+#if PLATFORM(ANDROID)
 class String;
 #ifdef ANDROID_ANIMATED_GIF
 class ImageDecoder;
 #endif
 struct NativeImageSourcePtr {
-    SkString m_url; 
+    SkString m_url;
     PrivateAndroidImageSourceRec* m_image;
 #ifdef ANDROID_ANIMATED_GIF
     ImageDecoder* m_gifDecoder;
@@ -85,7 +87,7 @@
 };
 typedef const Vector<char>* NativeBytePtr;
 typedef SkBitmapRef* NativeImagePtr;
-#elif PLATFORM(SKIA) // ANDROID
+#else
 class ImageDecoder;
 typedef ImageDecoder* NativeImageSourcePtr;
 typedef NativeImageSkia* NativeImagePtr;
@@ -101,8 +103,6 @@
 #endif
 #elif PLATFORM(CAIRO)
 typedef cairo_surface_t* NativeImagePtr;
-#elif PLATFORM(SKIA)
-typedef NativeImageSkia* NativeImagePtr;
 #elif PLATFORM(HAIKU)
 typedef BBitmap* NativeImagePtr;
 #elif PLATFORM(WINCE)
@@ -166,11 +166,9 @@
     bool frameIsCompleteAtIndex(size_t); // Whether or not the frame is completely decoded.
 
 #if PLATFORM(ANDROID)
-#if PLATFORM(SGL)
     void clearURL();
     void setURL(const String& url);
 #endif
-#endif
 private:
 #if PLATFORM(ANDROID)
     // FIXME: This is protected only to allow ImageSourceSkia to set ICO decoder
diff --git a/WebCore/platform/graphics/IntPoint.h b/WebCore/platform/graphics/IntPoint.h
index afbfb46..ab5f3ec 100644
--- a/WebCore/platform/graphics/IntPoint.h
+++ b/WebCore/platform/graphics/IntPoint.h
@@ -63,7 +63,7 @@
 class wxPoint;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
 struct SkPoint;
 struct SkIPoint;
 #endif
@@ -133,7 +133,7 @@
     operator wxPoint() const;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
     IntPoint(const SkIPoint&);
     operator SkIPoint() const;
     operator SkPoint() const;
diff --git a/WebCore/platform/graphics/IntRect.h b/WebCore/platform/graphics/IntRect.h
index cd912ff..97b21bc 100644
--- a/WebCore/platform/graphics/IntRect.h
+++ b/WebCore/platform/graphics/IntRect.h
@@ -57,7 +57,7 @@
 class wxRect;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
 struct SkRect;
 struct SkIRect;
 #endif
@@ -155,7 +155,7 @@
     operator CGRect() const;
 #endif
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
     IntRect(const SkIRect&);
     operator SkRect() const;
     operator SkIRect() const;
diff --git a/WebCore/platform/graphics/Path.h b/WebCore/platform/graphics/Path.h
index fef5ad2..6618fb7 100644
--- a/WebCore/platform/graphics/Path.h
+++ b/WebCore/platform/graphics/Path.h
@@ -39,9 +39,6 @@
 class QPainterPath;
 QT_END_NAMESPACE
 typedef QPainterPath PlatformPath;
-#elif PLATFORM(SGL)
-class SkPath;
-typedef SkPath PlatformPath;
 #elif PLATFORM(WX) && USE(WXGC)
 class wxGraphicsPath;
 typedef wxGraphicsPath PlatformPath;
diff --git a/WebCore/platform/graphics/Pattern.h b/WebCore/platform/graphics/Pattern.h
index 2f1192c..aa0a357 100644
--- a/WebCore/platform/graphics/Pattern.h
+++ b/WebCore/platform/graphics/Pattern.h
@@ -39,7 +39,7 @@
 #elif PLATFORM(CAIRO)
 #include <cairo.h>
 typedef cairo_pattern_t* PlatformPatternPtr;
-#elif PLATFORM(SKIA) || PLATFORM(SGL)
+#elif PLATFORM(SKIA)
 class SkShader;
 typedef SkShader* PlatformPatternPtr;
 #elif PLATFORM(QT)
diff --git a/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp b/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
index 6901f52..fa012b0 100644
--- a/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
+++ b/WebCore/platform/graphics/android/GraphicsLayerAndroid.cpp
@@ -337,6 +337,7 @@
     MLOG("(%x) setFinalOpacity: %.2f=>%.2f (%.2f)", this,
         opacity, clampedOpacity, m_opacity);
     GraphicsLayer::setOpacity(clampedOpacity);
+    m_contentLayer->setOpacity(clampedOpacity);
     askForSync();
 }
 
diff --git a/WebCore/platform/graphics/android/MediaPlayerPrivateAndroid.h b/WebCore/platform/graphics/android/MediaPlayerPrivateAndroid.h
index 29ef11c..19bfcd1 100644
--- a/WebCore/platform/graphics/android/MediaPlayerPrivateAndroid.h
+++ b/WebCore/platform/graphics/android/MediaPlayerPrivateAndroid.h
@@ -89,6 +89,7 @@
     void onPrepared(int duration, int width, int height);
     void onEnded();
     void onPosterFetched(SkBitmap*);
+    void onTimeupdate(int position);
 private:
     // Android-specific methods and fields.
     static MediaPlayerPrivateInterface* create(MediaPlayer* player);
@@ -107,6 +108,7 @@
     float m_currentTime;
 
     bool m_paused;
+    bool m_hasVideo;
     MediaPlayer::ReadyState m_readyState;
     MediaPlayer::NetworkState m_networkState;
 
diff --git a/WebCore/platform/graphics/skia/NativeImageSkia.cpp b/WebCore/platform/graphics/skia/NativeImageSkia.cpp
index 477be05..2411897 100644
--- a/WebCore/platform/graphics/skia/NativeImageSkia.cpp
+++ b/WebCore/platform/graphics/skia/NativeImageSkia.cpp
@@ -30,7 +30,7 @@
 
 #include "config.h"
 
-#if PLATFORM(SKIA)
+#if !PLATFORM(ANDROID)
 #include "skia/ext/image_operations.h"
 #endif
 
@@ -65,10 +65,11 @@
 
 SkBitmap NativeImageSkia::resizedBitmap(int w, int h) const
 {
-#if PLATFORM(SKIA)
+#if !PLATFORM(ANDROID)
     if (m_resizedImage.width() != w || m_resizedImage.height() != h)
         m_resizedImage = skia::ImageOperations::Resize(*this, skia::ImageOperations::RESIZE_LANCZOS3, w, h);
 #endif
+
     return m_resizedImage;
 }
 
diff --git a/WebCore/platform/graphics/transforms/TransformationMatrix.h b/WebCore/platform/graphics/transforms/TransformationMatrix.h
index 33f9afe..802ad3c 100644
--- a/WebCore/platform/graphics/transforms/TransformationMatrix.h
+++ b/WebCore/platform/graphics/transforms/TransformationMatrix.h
@@ -37,7 +37,7 @@
 #include <cairo.h>
 #elif PLATFORM(QT)
 #include <QTransform>
-#elif PLATFORM(SKIA) || PLATFORM(SGL)
+#elif PLATFORM(SKIA)
 #include <SkMatrix.h>
 #elif PLATFORM(WX) && USE(WXGC)
 #include <wx/graphics.h>
@@ -301,7 +301,7 @@
     operator cairo_matrix_t() const;
 #elif PLATFORM(QT)
     operator QTransform() const;
-#elif PLATFORM(SKIA) || PLATFORM(SGL)
+#elif PLATFORM(SKIA)
     operator SkMatrix() const;
 #elif PLATFORM(WX) && USE(WXGC)
     operator wxGraphicsMatrix() const;
diff --git a/WebCore/platform/image-decoders/ImageDecoder.h b/WebCore/platform/image-decoders/ImageDecoder.h
index 08f4aa2..535efa1 100644
--- a/WebCore/platform/image-decoders/ImageDecoder.h
+++ b/WebCore/platform/image-decoders/ImageDecoder.h
@@ -36,8 +36,7 @@
 #include <wtf/RefPtr.h>
 #include <wtf/Vector.h>
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
-// TODO(benm): ANDROID: Can we define PLATFORM(SKIA) instead of PLATFORM(SGL) before upstreaming?
+#if PLATFORM(SKIA)
 #include "NativeImageSkia.h"
 #elif PLATFORM(QT)
 #include <QImage>
@@ -58,7 +57,7 @@
             DisposeOverwriteBgcolor,   // Clear frame to transparent
             DisposeOverwritePrevious,  // Clear frame to previous framebuffer contents
         };
-#if (PLATFORM(SKIA) || PLATFORM(QT) || PLATFORM(SGL))
+#if PLATFORM(SKIA) || PLATFORM(QT)
         typedef uint32_t PixelData;
 #else
         typedef unsigned PixelData;
@@ -102,7 +101,7 @@
                 memcpy(getAddr(startX, destY), startAddr, rowBytes);
         }
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(ANDROID)
         NativeImageSkia& bitmap() { return m_bitmap; }
         const NativeImageSkia& bitmap() const { return m_bitmap; }
 #endif
@@ -148,7 +147,7 @@
 
         inline PixelData* getAddr(int x, int y)
         {
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
             return m_bitmap.getAddr32(x, y);
 #elif PLATFORM(QT)
             return reinterpret_cast<QRgb*>(m_image.scanLine(y)) + x;
@@ -173,7 +172,7 @@
             }
         }
 
-#if (PLATFORM(SKIA) || PLATFORM(SGL))
+#if PLATFORM(SKIA)
         NativeImageSkia m_bitmap;
 #elif PLATFORM(QT)
         mutable QImage m_image;
diff --git a/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp b/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp
index 6acaed5..96342fa 100644
--- a/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp
+++ b/WebCore/platform/image-decoders/skia/ImageDecoderSkia.cpp
@@ -26,8 +26,7 @@
 
 #include "config.h"
 #include "ImageDecoder.h"
-
-#if PLATFORM(SGL)
+#if PLATFORM(ANDROID)
 #include "SkBitmapRef.h"
 #endif
 
@@ -85,7 +84,7 @@
 
 NativeImagePtr RGBA32Buffer::asNewNativeImage() const
 {
-#if PLATFORM(SGL)
+#if PLATFORM(ANDROID)
     return new SkBitmapRef(m_bitmap);
 #else
     return new NativeImageSkia(m_bitmap);
diff --git a/WebCore/platform/network/NetworkStateNotifier.h b/WebCore/platform/network/NetworkStateNotifier.h
index a630ccd..d0463d4 100644
--- a/WebCore/platform/network/NetworkStateNotifier.h
+++ b/WebCore/platform/network/NetworkStateNotifier.h
@@ -27,6 +27,9 @@
 #define NetworkStateNotifier_h
 
 #include <wtf/Noncopyable.h>
+#if PLATFORM(ANDROID)
+#include "Connection.h"
+#endif
 
 #if PLATFORM(MAC)
 
@@ -54,9 +57,15 @@
     void setNetworkStateChangedFunction(void (*)());
     
     bool onLine() const { return m_isOnLine; }
+#if PLATFORM(ANDROID)
+    Connection::ConnectionType type() const { return m_type; }
+#endif
     
 private:    
     bool m_isOnLine;
+#if PLATFORM(ANDROID)
+    Connection::ConnectionType m_type;
+#endif
     void (*m_networkStateChangedFunction)();
 
     void updateState();
@@ -78,12 +87,13 @@
     HANDLE m_waitHandle;
     OVERLAPPED m_overlapped;
 
-#elif PLATFORM(ANDROID)
-public:
-	void networkStateChange(bool online);
-
 #elif PLATFORM(CHROMIUM)
     NetworkStateNotifierPrivate p;
+
+#elif PLATFORM(ANDROID)
+public:
+    void networkStateChange(bool online);
+    void networkTypeChange(Connection::ConnectionType type);
 #endif
 };
 
@@ -91,6 +101,9 @@
 
 inline NetworkStateNotifier::NetworkStateNotifier()
     : m_isOnLine(true)
+#if PLATFORM(ANDROID)
+    , m_type(Connection::Unknown)
+#endif
     , m_networkStateChangedFunction(0)
 {    
 }
diff --git a/WebCore/platform/network/ResourceHandle.h b/WebCore/platform/network/ResourceHandle.h
index e7f6092..b764add 100644
--- a/WebCore/platform/network/ResourceHandle.h
+++ b/WebCore/platform/network/ResourceHandle.h
@@ -170,7 +170,7 @@
     friend LRESULT __stdcall ResourceHandleWndProc(HWND, unsigned message, WPARAM, LPARAM);
 #endif
 
-#if PLATFORM(QT) || USE(CURL) || USE(SOUP) || defined(ANDROID)
+#if PLATFORM(QT) || USE(CURL) || USE(SOUP) || PLATFORM(ANDROID)
     ResourceHandleInternal* getInternal() { return d.get(); }
 #endif
 
diff --git a/WebCore/platform/network/ResourceHandleInternal.h b/WebCore/platform/network/ResourceHandleInternal.h
index f7135ee..328fc89 100644
--- a/WebCore/platform/network/ResourceHandleInternal.h
+++ b/WebCore/platform/network/ResourceHandleInternal.h
@@ -133,9 +133,6 @@
             , m_needsSiteSpecificQuirks(false)
             , m_currentMacChallenge(nil)
 #endif
-#if PLATFORM(ANDROID)
-            , m_loader(0)
-#endif
             , m_failureTimer(loader, &ResourceHandle::fireFailure)
         {
             const KURL& url = m_request.url();
diff --git a/WebCore/platform/network/android/AuthenticationChallenge.h b/WebCore/platform/network/android/AuthenticationChallenge.h
index e272d60..954bfd8 100644
--- a/WebCore/platform/network/android/AuthenticationChallenge.h
+++ b/WebCore/platform/network/android/AuthenticationChallenge.h
@@ -31,8 +31,6 @@
 
 namespace WebCore {
 
-class ResourceHandle;
-
 class AuthenticationChallenge : public AuthenticationChallengeBase {
 };
 
diff --git a/WebCore/platform/network/android/Cookie.cpp b/WebCore/platform/network/android/Cookie.cpp
deleted file mode 100644
index 3d10e4a..0000000
--- a/WebCore/platform/network/android/Cookie.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- */
-
-#include "config.h"
-
-#include "CookieClient.h"
-#include "JavaSharedClient.h"
-
-using namespace android;
-
-namespace WebCore {
-
-class Document;
-
-void setCookies(Document*, const KURL& url, const String& value)
-{
-    if (JavaSharedClient::GetCookieClient())
-        JavaSharedClient::GetCookieClient()->setCookies(url, value);
-}
-
-String cookies(const Document* , const KURL& url)
-{
-    if (JavaSharedClient::GetCookieClient())
-        return JavaSharedClient::GetCookieClient()->cookies(url);
-    return String();
-}
-
-bool cookiesEnabled(const Document* )
-{
-    if (JavaSharedClient::GetCookieClient())
-        return JavaSharedClient::GetCookieClient()->cookiesEnabled();
-    return false;
-}
-
-}
diff --git a/WebCore/platform/network/android/CookieClient.h b/WebCore/platform/network/android/CookieJarAndroid.cpp
similarity index 77%
copy from WebCore/platform/network/android/CookieClient.h
copy to WebCore/platform/network/android/CookieJarAndroid.cpp
index be2963e..ba4b5dc 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/WebCore/platform/network/android/CookieJarAndroid.cpp
@@ -23,24 +23,27 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef COOKIE_CLIENT_H
-#define COOKIE_CLIENT_H
+#include "config.h"
 
-#include "KURL.h"
-#include "PlatformString.h"
+#include "CookieJar.h"
 
-using namespace WebCore;
+#include "PlatformBridge.h"
 
-namespace android {
+namespace WebCore {
 
-class CookieClient {
+void setCookies(Document*, const KURL& url, const String& value)
+{
+    PlatformBridge::setCookies(url, value);
+}
 
-public:
-    virtual ~CookieClient() {}
-    virtual void setCookies(const KURL& url, const String& value) = 0;
-    virtual String cookies(const KURL& url) = 0;
-    virtual bool cookiesEnabled() = 0;
-};
+String cookies(const Document*, const KURL& url)
+{
+    return PlatformBridge::cookies(url);
+}
+
+bool cookiesEnabled(const Document*)
+{
+    return PlatformBridge::cookiesEnabled();
+}
 
 }
-#endif
diff --git a/WebCore/platform/network/android/NetworkStateNotifierAndroid.cpp b/WebCore/platform/network/android/NetworkStateNotifierAndroid.cpp
index 3aa5578..134e206 100644
--- a/WebCore/platform/network/android/NetworkStateNotifierAndroid.cpp
+++ b/WebCore/platform/network/android/NetworkStateNotifierAndroid.cpp
@@ -39,4 +39,15 @@
         m_networkStateChangedFunction();
 }
 
+void NetworkStateNotifier::networkTypeChange(Connection::ConnectionType type)
+{
+    if (m_type == type)
+        return;
+
+    m_type = type;
+
+    if (m_networkStateChangedFunction)
+        m_networkStateChangedFunction();
+}
+
 }
diff --git a/WebCore/plugins/android/PluginViewAndroid.cpp b/WebCore/plugins/android/PluginViewAndroid.cpp
index e10641d..0d02941 100644
--- a/WebCore/plugins/android/PluginViewAndroid.cpp
+++ b/WebCore/plugins/android/PluginViewAndroid.cpp
@@ -52,7 +52,9 @@
 #include "PlatformKeyboardEvent.h"
 #include "PluginMainThreadScheduler.h"
 #include "PluginPackage.h"
+#include "Touch.h"
 #include "TouchEvent.h"
+#include "TouchList.h"
 #include "android_graphics.h"
 #include "SkCanvas.h"
 #include "npruntime_impl.h"
@@ -206,11 +208,16 @@
 
     evt.data.touch.modifiers = 0;   // todo
 
-    // convert to coordinates that are relative to the plugin. The pageX / pageY
-    // values are the only values in the event that are consistently in frame
-    // coordinates despite their misleading name.
-    evt.data.touch.x = event->pageX() - m_npWindow.x;
-    evt.data.touch.y = event->pageY() - m_npWindow.y;
+    // In the event of a touchend (up) event, we must ask the changedTouch for the
+    // co-ordinates as there is no touch in touches anymore.
+    TouchList* touches = (evt.data.touch.action == kUp_ANPTouchAction) ?
+                              event->changedTouches() : event->touches();
+
+    // Convert to coordinates that are relative to the plugin.
+    // We only support single touch points at the moment, so we want to look at index 0 only.
+    IntPoint localPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(IntPoint(touches->item(0)->pageX(), touches->item(0)->pageY())));
+    evt.data.touch.x = localPos.x();
+    evt.data.touch.y = localPos.y();
 
     int16 ret = m_plugin->pluginFuncs()->event(m_instance, &evt);
     if (ignoreRet)
@@ -243,11 +250,11 @@
         SkANP::InitEvent(&evt, kMouse_ANPEventType);
         evt.data.mouse.action = isUp ? kUp_ANPMouseAction : kDown_ANPMouseAction;
 
-        // convert to coordinates that are relative to the plugin. The pageX / pageY
-        // values are the only values in the event that are consistently in frame
-        // coordinates despite their misleading name.
-        evt.data.mouse.x = event->pageX() - m_npWindow.x;
-        evt.data.mouse.y = event->pageY() - m_npWindow.y;
+        // Convert to coordinates that are relative to the plugin.
+        IntPoint localPos = roundedIntPoint(m_element->renderer()->absoluteToLocal(event->absoluteLocation()));
+        evt.data.mouse.x = localPos.x();
+        evt.data.mouse.y = localPos.y();
+
         if (isDown) {
             // The plugin needs focus to receive keyboard events
             if (Page* page = m_parentFrame->page())
diff --git a/WebCore/rendering/RenderBlockLineLayout.cpp b/WebCore/rendering/RenderBlockLineLayout.cpp
index 8517d6d..4d209de 100644
--- a/WebCore/rendering/RenderBlockLineLayout.cpp
+++ b/WebCore/rendering/RenderBlockLineLayout.cpp
@@ -852,6 +852,8 @@
         // and text align is auto, or justify or left in LTR, or right in RTL, we
         // will wrap text around screen width so that it doesn't need to scroll
         // horizontally when reading a paragraph.
+        // In case the line height is less than the font size, we skip
+        // the text wrapping since this will cause text overlapping.
         const Settings* settings = document()->settings();
         bool doTextWrap = settings && settings->layoutAlgorithm() == Settings::kLayoutFitColumnToScreen;
         if (doTextWrap) {
@@ -862,7 +864,10 @@
             // width as it may cause text to overlap.
             bool positioned = isPositioned();
             EFloat cssfloat = style()->floating();
+            const int lineHeight = style()->computedLineHeight();
+            const int fontSize = style()->fontSize();
             doTextWrap = autowrap && !positioned &&
+                    (fontSize <= lineHeight) &&
                     (((dir == LTR && cssfloat != FRIGHT) ||
                     (dir == RTL && cssfloat != FLEFT)) &&
                     ((ta == TAAUTO) || (ta == JUSTIFY) ||
diff --git a/WebCore/rendering/RenderPartObject.cpp b/WebCore/rendering/RenderPartObject.cpp
index f864c00..8e9118e 100644
--- a/WebCore/rendering/RenderPartObject.cpp
+++ b/WebCore/rendering/RenderPartObject.cpp
@@ -322,10 +322,15 @@
 #ifdef FLATTEN_IFRAME
     RenderPart::calcWidth();
     RenderPart::calcHeight();
+    // Calculate the styled dimensions by subtracting the border and padding.
+    int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
+    int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
+    int styleWidth = width() - extraWidth;
+    int styleHeight = height() - extraHeight;
     // Some IFrames have a width and/or height of 1 when they are meant to be
     // hidden. If that is the case, do not try to expand.
-    if (node()->hasTagName(iframeTag) && widget() && widget()->isFrameView()
-            && width() > 1 && height() > 1) {
+    if (node()->hasTagName(iframeTag) && widget() && widget()->isFrameView() &&
+            styleWidth > 1 && styleHeight > 1) {
         HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node());
         bool scrolling = element->scrollingMode() != ScrollbarAlwaysOff;
         bool widthIsFixed = style()->width().isFixed();
@@ -336,15 +341,11 @@
         if (scrolling || !widthIsFixed || !heightIsFixed) {
             FrameView* view = static_cast<FrameView*>(widget());
             RenderView* root = view ? view->frame()->contentRenderer() : NULL;
-            RenderPart* owner = view->frame()->ownerRenderer();
-            if (root && style()->visibility() != HIDDEN
-                    && (!owner || owner->style()->visibility() != HIDDEN)) {
+            if (root && style()->visibility() != HIDDEN) {
                 // Update the dimensions to get the correct minimum preferred
                 // width
                 updateWidgetPosition();
 
-                int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
-                int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
                 // Use the preferred width if it is larger and only if
                 // scrollbars are visible or the width style is not fixed.
                 if (scrolling || !widthIsFixed)
diff --git a/WebCore/svg/graphics/SVGImage.cpp b/WebCore/svg/graphics/SVGImage.cpp
index c4be11e..5f050a4 100644
--- a/WebCore/svg/graphics/SVGImage.cpp
+++ b/WebCore/svg/graphics/SVGImage.cpp
@@ -245,7 +245,7 @@
         // FIXME: If this SVG ends up loading itself, we might leak the world.
         // The comment said that the Cache code does not know about CachedImages
         // holding Frames and won't know to break the cycle. But 
-        m_page.set(new Page(m_chromeClient.get(), dummyContextMenuClient, dummyEditorClient, dummyDragClient, dummyInspectorClient, 0));
+        m_page.set(new Page(m_chromeClient.get(), dummyContextMenuClient, dummyEditorClient, dummyDragClient, dummyInspectorClient, 0, 0));
         m_page->settings()->setJavaScriptEnabled(false);
         m_page->settings()->setPluginsEnabled(false);
 
diff --git a/WebCore/svg/graphics/SVGPaintServer.cpp b/WebCore/svg/graphics/SVGPaintServer.cpp
index 728ff1b..6b81f72 100644
--- a/WebCore/svg/graphics/SVGPaintServer.cpp
+++ b/WebCore/svg/graphics/SVGPaintServer.cpp
@@ -38,7 +38,7 @@
 #include "SVGStyledElement.h"
 #include "SVGURIReference.h"
 
-#if PLATFORM(SKIA)
+#if PLATFORM(SKIA) && !PLATFORM(ANDROID)
 #include "PlatformContextSkia.h"
 #endif
 
@@ -184,7 +184,7 @@
         context->strokePath();
 }
 
-#if PLATFORM(SKIA)
+#if PLATFORM(SKIA) && !PLATFORM(ANDROID)
 void SVGPaintServer::teardown(GraphicsContext*& context, const RenderObject*, SVGPaintTargetType, bool) const
 {
     // FIXME: Move this into the GraphicsContext
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index 87b08a2..16ba925 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -32,7 +32,6 @@
 	android/RenderSkinCombo.cpp \
 	android/RenderSkinRadio.cpp \
 	android/TimeCounter.cpp \
-	android/sort.cpp \
 	\
 	android/benchmark/Intercept.cpp \
 	android/benchmark/MyJavaVM.cpp \
diff --git a/WebKit/android/TimeCounter.cpp b/WebKit/android/TimeCounter.cpp
index 61584a7..da09b07 100644
--- a/WebKit/android/TimeCounter.cpp
+++ b/WebKit/android/TimeCounter.cpp
@@ -37,6 +37,9 @@
 #include <utils/Log.h>
 #include <wtf/CurrentTime.h>
 
+#include <sys/time.h>
+#include <time.h>
+
 #if USE(JSC)
 #include "JSDOMWindow.h"
 #include <runtime/JSGlobalObject.h>
diff --git a/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp b/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
index f14c2c1..ffa96f8 100644
--- a/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
+++ b/WebKit/android/WebCoreSupport/ChromeClientAndroid.cpp
@@ -465,4 +465,14 @@
     m_quotaThreadCondition.signal();
 }
 
+#if ENABLE(TOUCH_EVENTS)
+void ChromeClientAndroid::needTouchEvents(bool needTouchEvents, bool force)
+{
+    FrameView* frameView = m_webFrame->page()->mainFrame()->view();
+    android::WebViewCore* core = android::WebViewCore::getWebViewCore(frameView);
+    if (core)
+        core->needTouchEvents(needTouchEvents, force);
+}
+#endif
+
 }
diff --git a/WebKit/android/WebCoreSupport/ChromeClientAndroid.h b/WebKit/android/WebCoreSupport/ChromeClientAndroid.h
index 45dd078..b61f9fd 100644
--- a/WebKit/android/WebCoreSupport/ChromeClientAndroid.h
+++ b/WebKit/android/WebCoreSupport/ChromeClientAndroid.h
@@ -136,6 +136,10 @@
 
 	virtual void populateVisitedLinks();
 
+#if ENABLE(TOUCH_EVENTS)
+        virtual void needTouchEvents(bool, bool);
+#endif
+
         // Methods used to request and provide Geolocation permissions.
         virtual void requestGeolocationPermissionForFrame(Frame*, Geolocation*);
         // Android-specific
diff --git a/WebCore/platform/network/android/CookieClient.h b/WebKit/android/WebCoreSupport/CookieClient.h
similarity index 96%
rename from WebCore/platform/network/android/CookieClient.h
rename to WebKit/android/WebCoreSupport/CookieClient.h
index be2963e..56d9382 100644
--- a/WebCore/platform/network/android/CookieClient.h
+++ b/WebKit/android/WebCoreSupport/CookieClient.h
@@ -26,8 +26,8 @@
 #ifndef COOKIE_CLIENT_H
 #define COOKIE_CLIENT_H
 
-#include "KURL.h"
-#include "PlatformString.h"
+#include <KURL.h>
+#include <PlatformString.h>
 
 using namespace WebCore;
 
diff --git a/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp b/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
index 00e973e..1bb8802 100644
--- a/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
+++ b/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp
@@ -121,7 +121,7 @@
 
 bool MediaPlayerPrivate::hasVideo() const
 {
-    return false;
+    return m_hasVideo;
 }
 
 void MediaPlayerPrivate::setVisible(bool visible)
@@ -282,6 +282,7 @@
     m_duration(6000),
     m_currentTime(0),
     m_paused(true),
+    m_hasVideo(false),
     m_readyState(MediaPlayer::HaveNothing),
     m_networkState(MediaPlayer::Empty),
     m_poster(0),
@@ -352,6 +353,7 @@
     m_duration = duration / 1000.0f;
     m_naturalSize = IntSize(width, height);
     m_naturalSizeUnknown = false;
+    m_hasVideo = true;
     m_player->durationChanged();
     m_player->sizeChanged();
 }
@@ -361,6 +363,7 @@
     m_player->timeChanged();
     m_paused = true;
     m_currentTime = 0;
+    m_hasVideo = false;
     m_networkState = MediaPlayer::Idle;
     m_readyState = MediaPlayer::HaveNothing;
 }
@@ -379,6 +382,11 @@
     }
 }
 
+void MediaPlayerPrivate::onTimeupdate(int position) {
+    m_currentTime = position / 1000.0f;
+    m_player->timeChanged();
+}
+
 }
 
 namespace android {
@@ -408,6 +416,13 @@
     player->onPosterFetched(posterNative);
 }
 
+static void OnTimeupdate(JNIEnv* env, jobject obj, int position, int pointer) {
+    if (pointer) {
+        WebCore::MediaPlayerPrivate* player = reinterpret_cast<WebCore::MediaPlayerPrivate*>(pointer);
+        player->onTimeupdate(position);
+    }
+}
+
 /*
  * JNI registration
  */
@@ -418,6 +433,8 @@
         (void*) OnEnded },
     { "nativeOnPosterFetched", "(Landroid/graphics/Bitmap;I)V",
         (void*) OnPosterFetched },
+    { "nativeOnTimeupdate", "(II)V",
+        (void*) OnTimeupdate },
 };
 
 int register_mediaplayer(JNIEnv* env)
diff --git a/WebKit/android/WebCoreSupport/PlatformBridge.cpp b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
index e93d3da..f36ecf7 100644
--- a/WebKit/android/WebCoreSupport/PlatformBridge.cpp
+++ b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
@@ -24,11 +24,14 @@
  */
 
 #include "config.h"
-#include "PlatformBridge.h"
+#include <PlatformBridge.h>
 
+#include "CookieClient.h"
 #include "JavaSharedClient.h"
 #include "KeyGeneratorClient.h"
 #include "WebViewCore.h"
+#include <wtf/android/AndroidThreading.h>
+#include <wtf/MainThread.h>
 
 using namespace android;
 
@@ -68,4 +71,65 @@
     return client->getSignedPublicKeyAndChallengeString(index, challenge, url);
 }
 
+void PlatformBridge::setCookies(const KURL& url, const String& value)
+{
+    CookieClient* client = JavaSharedClient::GetCookieClient();
+    if (!client)
+        return;
+
+    client->setCookies(url, value);
 }
+
+String PlatformBridge::cookies(const KURL& url)
+{
+    CookieClient* client = JavaSharedClient::GetCookieClient();
+    if (!client)
+        return String();
+
+    return client->cookies(url);
+}
+
+bool PlatformBridge::cookiesEnabled()
+{
+    CookieClient* client = JavaSharedClient::GetCookieClient();
+    if (!client)
+        return false;
+
+    return client->cookiesEnabled();
+}
+
+bool PlatformBridge::isWebViewPaused()
+{
+    return WebViewCore::isPaused();
+}
+
+}  // namespace WebCore
+
+
+// This is the implementation of AndroidThreading, which is declared in
+// JavaScriptCore/wtf/android/AndroidThreading.h. It is provided here, rather
+// than in its own source file, to avoid linker problems.
+//
+// By default, when building a shared library, the linker strips from static
+// libraries any compilation units which do not contain any code referenced from
+// that static library. Since
+// AndroidThreading::scheduleDispatchFunctionsOnMainThread is not referenced
+// from libwebcore.a, implementing it in its own compilation unit results in it
+// being stripped. This stripping can be avoided by using the linker option
+// --whole-archive for libwebcore.a, but this adds considerably to the size of
+// libwebcore.so.
+
+namespace WTF {
+
+// Callback in the main thread.
+static void timeoutFired(void*)
+{
+    dispatchFunctionsFromMainThread();
+}
+
+void AndroidThreading::scheduleDispatchFunctionsOnMainThread()
+{
+    JavaSharedClient::EnqueueFunctionPtr(timeoutFired, 0);
+}
+
+}  // namespace WTF
diff --git a/WebKit/android/icu/unicode/ucnv.cpp b/WebKit/android/icu/unicode/ucnv.cpp
index 6407a09..1963dd2 100644
--- a/WebKit/android/icu/unicode/ucnv.cpp
+++ b/WebKit/android/icu/unicode/ucnv.cpp
@@ -23,6 +23,15 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+// BEGIN android-added
+// Add config.h to avoid compiler error in uobject.h
+// ucnv.h includes uobject.h indirectly and uobjetcs.h defines new/delete.
+// new/delete are also defined in WebCorePrefix.h which auto included in Android make.
+//
+// config.h has to be on top of the include list.
+#include "config.h"
+// END android-added
+
 #include "EmojiFont.h"
 #include <icu4c/common/unicode/ucnv.h>
 
diff --git a/WebKit/android/jni/JavaBridge.cpp b/WebKit/android/jni/JavaBridge.cpp
index 842d841..9e83d6a 100644
--- a/WebKit/android/jni/JavaBridge.cpp
+++ b/WebKit/android/jni/JavaBridge.cpp
@@ -27,8 +27,11 @@
 
 #include <config.h>
 #include <wtf/Platform.h>
+#include <wtf/StdLibExtras.h>
 
+#include "AtomicString.h"
 #include "Cache.h"
+#include "Connection.h"
 #include "CookieClient.h"
 #include "JavaSharedClient.h"
 #include "KeyGeneratorClient.h"
@@ -96,12 +99,13 @@
     static void SharedTimerFired(JNIEnv* env, jobject);
     static void SetCacheSize(JNIEnv* env, jobject obj, jint bytes);
     static void SetNetworkOnLine(JNIEnv* env, jobject obj, jboolean online);
+    static void SetNetworkType(JNIEnv* env, jobject obj, jstring type, jstring subtype);
     static void SetDeferringTimers(JNIEnv* env, jobject obj, jboolean defer);
     static void ServiceFuncPtrQueue(JNIEnv*);
     static void UpdatePluginDirectories(JNIEnv* env, jobject obj, jobjectArray array, jboolean reload);
 
 private:
-    jobject     mJavaObject;
+    jweak       mJavaObject;
     jmethodID   mSetSharedTimer;
     jmethodID   mStopSharedTimer;
     jmethodID   mSetCookies;
@@ -118,7 +122,7 @@
 
 JavaBridge::JavaBridge(JNIEnv* env, jobject obj)
 {
-    mJavaObject = adoptGlobalRef(env, obj);
+    mJavaObject = env->NewWeakGlobalRef(obj);
     jclass clazz = env->GetObjectClass(obj);
 
     mSetSharedTimer = env->GetMethodID(clazz, "setSharedTimer", "(J)V");
@@ -152,7 +156,7 @@
 {
     if (mJavaObject) {
         JNIEnv* env = JSC::Bindings::getJNIEnv();
-        env->DeleteGlobalRef(mJavaObject);
+        env->DeleteWeakGlobalRef(mJavaObject);
         mJavaObject = 0;
     }
     
@@ -167,8 +171,6 @@
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return;
     env->CallVoidMethod(obj.get(), mSetSharedTimer, timemillis);
 }
 
@@ -177,8 +179,6 @@
 {    
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return;
     env->CallVoidMethod(obj.get(), mStopSharedTimer);
 }
 
@@ -186,13 +186,11 @@
 JavaBridge::setCookies(WebCore::KURL const& url, WebCore::String const& value)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return;
     const WebCore::String& urlStr = url.string();
     jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
     jstring jValueStr = env->NewString(value.characters(), value.length());
 
+    AutoJObject obj = getRealObject(env, mJavaObject);
     env->CallVoidMethod(obj.get(), mSetCookies, jUrlStr, jValueStr);
     env->DeleteLocalRef(jUrlStr);
     env->DeleteLocalRef(jValueStr);
@@ -203,10 +201,9 @@
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     const WebCore::String& urlStr = url.string();
-    AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return WebCore::String();
     jstring jUrlStr = env->NewString(urlStr.characters(), urlStr.length());
+
+    AutoJObject obj = getRealObject(env, mJavaObject);
     jstring string = (jstring)(env->CallObjectMethod(obj.get(), mCookies, jUrlStr));
     
     WebCore::String ret = to_string(env, string);
@@ -220,8 +217,6 @@
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return false;
     jboolean ret = env->CallBooleanMethod(obj.get(), mCookiesEnabled);
     return (ret != 0);
 }
@@ -232,8 +227,6 @@
     WTF::Vector<WebCore::String> directories;
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return directories;
     jobjectArray array = (jobjectArray)
             env->CallObjectMethod(obj.get(), mGetPluginDirectories);
     int count = env->GetArrayLength(array);
@@ -252,8 +245,6 @@
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return WebCore::String();
     jstring ret = (jstring)env->CallObjectMethod(obj.get(), mGetPluginSharedDataDirectory);
     WebCore::String path = to_string(env, ret);
     checkException(env);
@@ -276,8 +267,6 @@
     // environment is setup.
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return;
     env->CallVoidMethod(obj.get(), mSignalFuncPtrQueue);
 }
 
@@ -285,8 +274,6 @@
     WTF::Vector<WebCore::String> list;
     JNIEnv* env = JSC::Bindings::getJNIEnv();
     AutoJObject obj = getRealObject(env, mJavaObject);
-    if (!obj.get())
-        return list;
     jobjectArray array = (jobjectArray) env->CallObjectMethod(obj.get(),
             mGetKeyStrengthList);
     int count = env->GetArrayLength(array);
@@ -361,6 +348,29 @@
 	WebCore::networkStateNotifier().networkStateChange(online);
 }
 
+void JavaBridge::SetNetworkType(JNIEnv* env, jobject obj, jstring javatype, jstring javasubtype)
+{
+    DEFINE_STATIC_LOCAL(AtomicString, wifi, ("wifi"));
+    DEFINE_STATIC_LOCAL(AtomicString, mobile, ("mobile"));
+    DEFINE_STATIC_LOCAL(AtomicString, mobileSupl, ("mobile_supl"));
+    DEFINE_STATIC_LOCAL(AtomicString, gprs, ("gprs"));
+    DEFINE_STATIC_LOCAL(AtomicString, edge, ("edge"));
+    DEFINE_STATIC_LOCAL(AtomicString, umts, ("umts"));
+
+    String type = to_string(env, javatype);
+    String subtype = to_string(env, javasubtype);
+    Connection::ConnectionType connectionType = Connection::Unknown;
+    if (type == wifi)
+        connectionType = Connection::WiFi;
+    else if (type == mobile || type == mobileSupl) {
+        if (subtype == edge || subtype == gprs)
+            connectionType = Connection::Cell_2G;
+        else if (subtype == umts)
+            connectionType = Connection::Cell_3G;
+    }
+    WebCore::networkStateNotifier().networkTypeChange(connectionType);
+}
+
 void JavaBridge::ServiceFuncPtrQueue(JNIEnv*)
 {
     JavaSharedClient::ServiceFunctionPtrQueue();
@@ -400,6 +410,8 @@
         (void*) JavaBridge::SetCacheSize },
     { "setNetworkOnLine", "(Z)V",
         (void*) JavaBridge::SetNetworkOnLine },
+    { "setNetworkType", "(Ljava/lang/String;Ljava/lang/String;)V",
+        (void*) JavaBridge::SetNetworkType },
     { "nativeServiceFuncPtrQueue", "()V",
         (void*) JavaBridge::ServiceFuncPtrQueue },
     { "nativeUpdatePluginDirectories", "([Ljava/lang/String;Z)V",
diff --git a/WebKit/android/jni/JavaSharedClient.cpp b/WebKit/android/jni/JavaSharedClient.cpp
index b9ecff7..ce46570 100644
--- a/WebKit/android/jni/JavaSharedClient.cpp
+++ b/WebKit/android/jni/JavaSharedClient.cpp
@@ -102,24 +102,23 @@
     void JavaSharedClient::ServiceFunctionPtrQueue()
     {
         for (;;) {
-            void (*proc)(void*);
-            void* payload;
+            void (*proc)(void*) = 0;
+            void* payload = 0;
             const FuncPtrRec* rec;
             
             // we have to copy the proc/payload (if present). we do this so we
             // don't call the proc inside the mutex (possible deadlock!)
             gFuncPtrQMutex.acquire();
             rec = (const FuncPtrRec*)gFuncPtrQ.front();
-            if (NULL != rec) {
+            if (rec) {
                 proc = rec->fProc;
                 payload = rec->fPayload;
                 gFuncPtrQ.pop_front();
             }
             gFuncPtrQMutex.release();
             
-            if (NULL == rec) {
+            if (!rec)
                 break;
-            }
             proc(payload);
         }
     }
diff --git a/WebKit/android/jni/WebCoreFrameBridge.cpp b/WebKit/android/jni/WebCoreFrameBridge.cpp
index 567fb6f..9e1888d 100644
--- a/WebKit/android/jni/WebCoreFrameBridge.cpp
+++ b/WebKit/android/jni/WebCoreFrameBridge.cpp
@@ -171,8 +171,8 @@
 
 struct WebFrame::JavaBrowserFrame
 {
-    jobject     mObj;
-    jobject     mHistoryList; // WebBackForwardList object
+    jweak       mObj;
+    jweak       mHistoryList; // WebBackForwardList object
     jmethodID   mStartLoadingResource;
     jmethodID   mLoadStarted;
     jmethodID   mTransitionToCommitted;
@@ -212,8 +212,8 @@
 {
     jclass clazz = env->GetObjectClass(obj);
     mJavaFrame = new JavaBrowserFrame;
-    mJavaFrame->mObj = adoptGlobalRef(env, obj);
-    mJavaFrame->mHistoryList = adoptGlobalRef(env, historyList);
+    mJavaFrame->mObj = env->NewWeakGlobalRef(obj);
+    mJavaFrame->mHistoryList = env->NewWeakGlobalRef(historyList);
     mJavaFrame->mStartLoadingResource = env->GetMethodID(clazz, "startLoadingResource",
             "(ILjava/lang/String;Ljava/lang/String;Ljava/util/HashMap;[BJIZZZ)Landroid/webkit/LoadListener;");
     mJavaFrame->mLoadStarted = env->GetMethodID(clazz, "loadStarted",
@@ -281,8 +281,8 @@
 {
     if (mJavaFrame->mObj) {
         JNIEnv* env = getJNIEnv();
-        env->DeleteGlobalRef(mJavaFrame->mObj);
-        env->DeleteGlobalRef(mJavaFrame->mHistoryList);
+        env->DeleteWeakGlobalRef(mJavaFrame->mObj);
+        env->DeleteWeakGlobalRef(mJavaFrame->mHistoryList);
         mJavaFrame->mObj = 0;
     }
     delete mJavaFrame;
@@ -381,10 +381,6 @@
     WebCore::HTTPHeaderMap headers = request.httpHeaderFields();
 
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return 0;
-
     WebCore::String urlStr = request.url().string();
     int colon = urlStr.find(':');
     bool allLower = true;
@@ -405,6 +401,7 @@
         jMethodStr = env->NewString(method.characters(), method.length());
     jbyteArray jPostDataStr = NULL;
     WebCore::FormData* formdata = request.httpBody();
+    AutoJObject obj = mJavaFrame->frame(env);
     if (formdata) {
         // We can use the formdata->flatten() but it will result in two 
         // memcpys, first through loading up the vector with the form data
@@ -487,10 +484,10 @@
 
     jobject jLoadListener =
         env->CallObjectMethod(obj.get(), mJavaFrame->mStartLoadingResource,
-                                              (int)loader, jUrlStr, jMethodStr, jHeaderMap,
-                                              jPostDataStr, formdata ? formdata->identifier(): 0,
-                                              cacheMode, mainResource, request.getUserGesture(),
-                                              synchronous);
+                (int)loader, jUrlStr, jMethodStr, jHeaderMap,
+                jPostDataStr, formdata ? formdata->identifier(): 0,
+                cacheMode, mainResource, request.getUserGesture(),
+                synchronous);
 
     env->DeleteLocalRef(jUrlStr);
     env->DeleteLocalRef(jMethodStr);
@@ -515,13 +512,11 @@
 #endif
     LOGV("::WebCore:: reportError(%d, %s)", errorCode, description.ascii().data());
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
 
     jstring descStr = env->NewString((unsigned short*)description.characters(), description.length());
     jstring failUrl = env->NewString((unsigned short*)failingUrl.characters(), failingUrl.length());
-    env->CallVoidMethod(obj.get(), mJavaFrame->mReportError, errorCode, descStr, failUrl);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mReportError,
+            errorCode, descStr, failUrl);
     env->DeleteLocalRef(descStr);
     env->DeleteLocalRef(failUrl);
 }
@@ -547,9 +542,6 @@
         return;
 
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     WebCore::String urlString(url.string());
     // If this is the main frame and we already have a favicon in the database,
     // send it along with the page started notification.
@@ -562,7 +554,7 @@
     }
     jstring urlStr = env->NewString((unsigned short*)urlString.characters(), urlString.length());
 
-    env->CallVoidMethod(obj.get(), mJavaFrame->mLoadStarted, urlStr, favicon,
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mLoadStarted, urlStr, favicon,
             (int)loadType, isMainFrame);
     checkException(env);
     env->DeleteLocalRef(urlStr);
@@ -587,12 +579,9 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     WebCore::FrameLoadType loadType = frame->loader()->loadType();
     bool isMainFrame = (!frame->tree() || !frame->tree()->parent());
-    env->CallVoidMethod(obj.get(), mJavaFrame->mTransitionToCommitted,
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mTransitionToCommitted,
             (int)loadType, isMainFrame);
     checkException(env);
 }
@@ -604,9 +593,6 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     WebCore::FrameLoader* loader = frame->loader();
     const WebCore::KURL& url = loader->activeDocumentLoader()->url();
     if (url.isEmpty())
@@ -617,7 +603,7 @@
     WebCore::FrameLoadType loadType = loader->loadType();
     WebCore::String urlString(url.string());
     jstring urlStr = env->NewString((unsigned short*)urlString.characters(), urlString.length());
-    env->CallVoidMethod(obj.get(), mJavaFrame->mLoadFinished, urlStr,
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mLoadFinished, urlStr,
             (int)loadType, isMainFrame);
     checkException(env);
     env->DeleteLocalRef(urlStr);
@@ -666,12 +652,9 @@
     LOGV("setTitle(%s)", title.ascii().data());
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     jstring jTitleStr = env->NewString((unsigned short *)title.characters(), title.length());
 
-    env->CallVoidMethod(obj.get(), mJavaFrame->mSetTitle,
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetTitle,
                                         jTitleStr);
     checkException(env);
     env->DeleteLocalRef(jTitleStr);
@@ -685,11 +668,8 @@
 #endif
     LOGV("::WebCore:: windowObjectCleared");
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
 
-    env->CallVoidMethod(obj.get(), mJavaFrame->mWindowObjectCleared, (int)frame);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mWindowObjectCleared, (int)frame);
     checkException(env);
 }
 
@@ -700,11 +680,8 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     int progress = (int) (100 * newProgress);
-    env->CallVoidMethod(obj.get(), mJavaFrame->mSetProgress, progress);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mSetProgress, progress);
     checkException(env);
 }
 
@@ -722,14 +699,11 @@
 #endif
     LOG_ASSERT(icon, "DidReceiveIcon called without an image!");
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     jobject bitmap = webcoreImageToJavaBitmap(env, icon);
     if (!bitmap)
         return;
 
-    env->CallVoidMethod(obj.get(), mJavaFrame->mDidReceiveIcon, bitmap);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDidReceiveIcon, bitmap);
     env->DeleteLocalRef(bitmap);
     checkException(env);
 }
@@ -741,13 +715,10 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     jstring jUrlStr = env->NewString((unsigned short*)url.characters(),
             url.length());
 
-    env->CallVoidMethod(obj.get(),
+    env->CallVoidMethod(mJavaFrame->frame(env).get(),
             mJavaFrame->mDidReceiveTouchIconUrl, jUrlStr, precomposed);
     checkException(env);
 }
@@ -760,13 +731,9 @@
 #endif
     WebCore::String urlStr(url.string());
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
-
     jstring jUrlStr = env->NewString((unsigned short*)urlStr.characters(), urlStr.length());
 
-    env->CallVoidMethod(obj.get(), mJavaFrame->mUpdateVisitedHistory, jUrlStr, reload);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mUpdateVisitedHistory, jUrlStr, reload);
     checkException(env);
 }
 
@@ -790,14 +757,11 @@
     if (url.isEmpty())
         return true;
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return true;
     jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
 
     // check to see whether browser app wants to hijack url loading.
     // if browser app handles the url, we will return false to bail out WebCore loading
-    jboolean ret = env->CallBooleanMethod(obj.get(), mJavaFrame->mHandleUrl, jUrlStr);
+    jboolean ret = env->CallBooleanMethod(mJavaFrame->frame(env).get(), mJavaFrame->mHandleUrl, jUrlStr);
     checkException(env);
     return (ret == 0);
 }
@@ -809,13 +773,10 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return NULL;
-    jobject jobj = env->CallObjectMethod(obj.get(),
+    jobject obj = env->CallObjectMethod(mJavaFrame->frame(env).get(),
             mJavaFrame->mCreateWindow, dialog, userGesture);
-    if (jobj) {
-        WebCore::Frame* frame = GET_NATIVE_FRAME(env, jobj);
+    if (obj) {
+        WebCore::Frame* frame = GET_NATIVE_FRAME(env, obj);
         return frame;
     }
     return NULL;
@@ -828,10 +789,7 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), mJavaFrame->mRequestFocus);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mRequestFocus);
     checkException(env);
 }
 
@@ -843,10 +801,7 @@
 #endif
     assert(webViewCore);
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), mJavaFrame->mCloseWindow,
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mCloseWindow,
             webViewCore->getJavaObject().get());
 }
 
@@ -861,22 +816,16 @@
     TimeCounterAuto counter(TimeCounter::JavaCallbackTimeCounter);
 #endif
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return;
     PolicyFunctionWrapper* p = new PolicyFunctionWrapper;
     p->func = func;
-    env->CallVoidMethod(obj.get(), mJavaFrame->mDecidePolicyForFormResubmission, p);
+    env->CallVoidMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDecidePolicyForFormResubmission, p);
 }
 
 WebCore::String
 WebFrame::getRawResourceFilename(WebCore::PlatformBridge::rawResId id) const
 {
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return WebCore::String();
-    jstring ret = (jstring) env->CallObjectMethod(obj.get(),
+    jstring ret = (jstring) env->CallObjectMethod(mJavaFrame->frame(env).get(),
             mJavaFrame->mGetRawResFilename, (int)id);
 
     return to_string(env, ret);
@@ -886,10 +835,7 @@
 WebFrame::density() const
 {
     JNIEnv* env = getJNIEnv();
-    AutoJObject obj = mJavaFrame->frame(env);
-    if (!obj.get())
-        return 1.0;
-    jfloat dpi = env->CallFloatMethod(obj.get(), mJavaFrame->mDensity);
+    jfloat dpi = env->CallFloatMethod(mJavaFrame->frame(env).get(), mJavaFrame->mDensity);
     checkException(env);
     return dpi;
 }
@@ -925,7 +871,13 @@
     WebCore::DragClient*        dragC = new DragClientAndroid;
     InspectorClientAndroid* inspectorC = new InspectorClientAndroid;
     // Create a new page
-    WebCore::Page* page = new WebCore::Page(chromeC, contextMenuC, editorC, dragC, inspectorC, 0);
+    WebCore::Page* page = new WebCore::Page(chromeC,
+                                            contextMenuC,
+                                            editorC,
+                                            dragC,
+                                            inspectorC,
+                                            0, // PluginHalterClient
+                                            0); // GeolocationControllerClient
     // css files without explicit MIMETYPE is treated as generic text files in
     // the Java side. So we can't enforce CSS MIMETYPE.
     page->settings()->setEnforceCSSMIMETypeInStrictMode(false);
@@ -1223,8 +1175,21 @@
         JNIEnv* env = getJNIEnv();
         // JavaInstance creates a global ref to instance in its constructor.
         env->DeleteGlobalRef(m_instance->instance());
-        // Set the object to our WeakReference wrapper.
-        m_instance->setInstance(adoptGlobalRef(env, instance));
+        // Set the object to a weak reference.
+        m_instance->setInstance(env->NewWeakGlobalRef(instance));
+    }
+    ~WeakJavaInstance()
+    {
+        JNIEnv* env = getJNIEnv();
+        // Store the weak reference so we can delete it later.
+        jweak weak = m_instance->instance();
+        // The JavaInstance destructor attempts to delete the global ref stored
+        // in m_instance. Since we replaced it in our constructor with a weak
+        // reference, restore the global ref here so the vm will not complain.
+        m_instance->setInstance(env->NewGlobalRef(
+                getRealObject(env, m_instance->instance()).get()));
+        // Delete the weak reference.
+        env->DeleteWeakGlobalRef(weak);
     }
 
     virtual void virtualBegin()
@@ -1256,7 +1221,7 @@
 private:
     typedef JavaInstance INHERITED;
     jobject _realObject;
-    jobject _weakRef;
+    jweak   _weakRef;
 };
 
 static void AddJavascriptInterface(JNIEnv *env, jobject obj, jint nativeFramePointer,
@@ -1559,7 +1524,7 @@
     TimeCounterAuto counter(TimeCounter::NativeCallbackTimeCounter);
 #endif
     WebCore::Frame* pFrame = GET_NATIVE_FRAME(env, obj);
-    LOGE("Sending orientation: %d", orientation);
+    LOGV("Sending orientation: %d", orientation);
     pFrame->sendOrientationChangeEvent(orientation);
 }
 
diff --git a/WebKit/android/jni/WebCoreJni.cpp b/WebKit/android/jni/WebCoreJni.cpp
index aa3e2c7..ef33cc0 100644
--- a/WebKit/android/jni/WebCoreJni.cpp
+++ b/WebKit/android/jni/WebCoreJni.cpp
@@ -35,25 +35,10 @@
 
 namespace android {
 
-// Class, constructor, and get method on WeakReference
-jclass    gWeakRefClass;
-jmethodID gWeakRefInit;
-jmethodID gWeakRefGet;
-
-jobject adoptGlobalRef(JNIEnv* env, jobject obj)
-{
-    // Create a WeakReference object
-    jobject ref = env->NewObject(gWeakRefClass, gWeakRefInit, obj);
-    // Increment the ref count of the WeakReference
-    ref = env->NewGlobalRef(ref);
-    return ref;
-}
-
 AutoJObject getRealObject(JNIEnv* env, jobject obj)
 {
-    jobject real = env->CallObjectMethod(obj, gWeakRefGet);
-    if (!real)
-        LOGE("The real object has been deleted");
+    jobject real = env->NewLocalRef(obj);
+    LOG_ASSERT(real, "The real object has been deleted!");
     return AutoJObject(env, real);
 }
 
@@ -86,20 +71,4 @@
     return ret;
 }
 
-int register_webcorejni(JNIEnv* env) {
-    // Instantiate the WeakReference fields.
-    jclass weakRef = env->FindClass("java/lang/ref/WeakReference");
-    LOG_ASSERT(weakRef, "Could not find WeakReference");
-    android::gWeakRefClass = (jclass)env->NewGlobalRef(weakRef);
-    android::gWeakRefInit = env->GetMethodID(android::gWeakRefClass,
-            "<init>", "(Ljava/lang/Object;)V");
-    LOG_ASSERT(android::gWeakRefInit,
-            "Could not find constructor for WeakReference");
-    android::gWeakRefGet = env->GetMethodID(android::gWeakRefClass, "get",
-            "()Ljava/lang/Object;");
-    LOG_ASSERT(android::gWeakRefInit,
-            "Could not find get method for WeakReference");
-    return JNI_OK;
-}
-
 }
diff --git a/WebKit/android/jni/WebCoreJni.h b/WebKit/android/jni/WebCoreJni.h
index c1dd07c..1a1bfc0 100644
--- a/WebKit/android/jni/WebCoreJni.h
+++ b/WebKit/android/jni/WebCoreJni.h
@@ -61,14 +61,10 @@
     friend AutoJObject getRealObject(JNIEnv*, jobject);
 };
 
-// Get the real object stored in the WeakReference returned as an
+// Get the real object stored in the weak reference returned as an
 // AutoJObject.
 AutoJObject getRealObject(JNIEnv*, jobject);
 
-// Convert the given jobject to a WeakReference and create a new global
-// reference to that WeakReference.
-jobject adoptGlobalRef(JNIEnv*, jobject);
-
 // Helper method for check java exceptions. Returns true if an exception
 // occurred and logs the exception.
 bool checkException(JNIEnv* env);
diff --git a/WebKit/android/jni/WebCoreJniOnLoad.cpp b/WebKit/android/jni/WebCoreJniOnLoad.cpp
index f02e92a..2716a7e 100644
--- a/WebKit/android/jni/WebCoreJniOnLoad.cpp
+++ b/WebKit/android/jni/WebCoreJniOnLoad.cpp
@@ -79,7 +79,6 @@
 extern int register_webicondatabase(JNIEnv*);
 extern int register_websettings(JNIEnv*);
 extern int register_webview(JNIEnv*);
-extern int register_webcorejni(JNIEnv*);
 #if ENABLE(DATABASE)
 extern int register_webstorage(JNIEnv*);
 #endif
@@ -100,7 +99,6 @@
     { "JavaBridge", android::register_javabridge },
     { "WebFrame", android::register_webframe },
     { "WebCoreResourceLoader", android::register_resource_loader },
-    { "WebCoreJni", android::register_webcorejni },
     { "WebViewCore", android::register_webviewcore },
     { "WebHistory", android::register_webhistory },
     { "WebIconDatabase", android::register_webicondatabase },
@@ -191,8 +189,13 @@
     // Create the page with all the various clients
     ChromeClientAndroid* chrome = new ChromeClientAndroid;
     EditorClientAndroid* editor = new EditorClientAndroid;
-    Page* page = new Page(chrome, new ContextMenuClientAndroid, editor,
-            new DragClientAndroid, new InspectorClientAndroid, NULL);
+    Page* page = new Page(chrome,
+                          new ContextMenuClientAndroid,
+                          editor,
+                          new DragClientAndroid,
+                          new InspectorClientAndroid,
+                          0, // PluginHalterClient
+                          0); // GeolocationControllerClient
     editor->setPage(page);
 
     // Create MyWebFrame that intercepts network requests
diff --git a/WebKit/android/jni/WebHistory.cpp b/WebKit/android/jni/WebHistory.cpp
index 71cd416..76a310b 100644
--- a/WebKit/android/jni/WebHistory.cpp
+++ b/WebKit/android/jni/WebHistory.cpp
@@ -44,6 +44,7 @@
 #include "TextEncoding.h"
 #include "WebCoreFrameBridge.h"
 #include "WebCoreJni.h"
+#include "WebIconDatabase.h"
 #include "jni_utility.h"
 
 #include <JNIHelp.h>
@@ -226,7 +227,7 @@
 
 WebHistoryItem::WebHistoryItem(JNIEnv* env, jobject obj,
         WebCore::HistoryItem* item) : WebCore::AndroidWebHistoryBridge(item) {
-    m_object = adoptGlobalRef(env, obj);
+    m_object = env->NewWeakGlobalRef(obj);
     m_parent = 0;
 }
 
@@ -235,7 +236,7 @@
         JNIEnv* env = JSC::Bindings::getJNIEnv();
         if (!env)
             return;
-        env->DeleteGlobalRef(m_object);
+        env->DeleteWeakGlobalRef(m_object);
     }
 }
 
diff --git a/WebKit/android/jni/WebHistory.h b/WebKit/android/jni/WebHistory.h
index b961872..12bf00a 100644
--- a/WebKit/android/jni/WebHistory.h
+++ b/WebKit/android/jni/WebHistory.h
@@ -60,7 +60,7 @@
     WebHistoryItem* parent() const { return m_parent.get(); }
 private:
     RefPtr<WebHistoryItem> m_parent;
-    jobject m_object;
+    jweak m_object;
 };
 
 };
diff --git a/WebKit/android/jni/WebIconDatabase.cpp b/WebKit/android/jni/WebIconDatabase.cpp
index e15d179..20258a4 100644
--- a/WebKit/android/jni/WebIconDatabase.cpp
+++ b/WebKit/android/jni/WebIconDatabase.cpp
@@ -67,10 +67,6 @@
 // XXX: Called by the IconDatabase thread
 void WebIconDatabase::dispatchDidAddIconForPageURL(const WebCore::String& pageURL)
 {
-    // If there are no clients currently, drop this message.
-    if (mClients.size() == 0)
-        return;
-
     mNotificationsMutex.lock();
     mNotifications.append(pageURL);
     if (!mDeliveryRequested) {
@@ -83,23 +79,25 @@
 // Called in the WebCore thread
 void WebIconDatabase::RegisterForIconNotification(WebIconDatabaseClient* client)
 {
-    gIconDatabaseClient->mClientsMutex.lock();
+    WebIconDatabase* db = gIconDatabaseClient;
+    for (unsigned i = 0; i < db->mClients.size(); ++i) {
+        // Do not add the same client twice.
+        if (db->mClients[i] == client)
+            return;
+    }
     gIconDatabaseClient->mClients.append(client);
-    gIconDatabaseClient->mClientsMutex.unlock();
 }
 
 // Called in the WebCore thread
 void WebIconDatabase::UnregisterForIconNotification(WebIconDatabaseClient* client)
 {
     WebIconDatabase* db = gIconDatabaseClient;
-    db->mClientsMutex.lock();
     for (unsigned i = 0; i < db->mClients.size(); ++i) {
         if (db->mClients[i] == client) {
             db->mClients.remove(i);
             break;
         }
     }
-    db->mClientsMutex.unlock();
 }
 
 // Called in the WebCore thread
@@ -123,9 +121,7 @@
 
     // Swap the clients queue
     Vector<WebIconDatabaseClient*> clients;
-    mClientsMutex.lock();
     clients.swap(mClients);
-    mClientsMutex.unlock();
 
     for (unsigned i = 0; i < queue.size(); ++i) {
         for (unsigned j = 0; j < clients.size(); ++j) {
diff --git a/WebKit/android/jni/WebIconDatabase.h b/WebKit/android/jni/WebIconDatabase.h
index 743c5eb..c91c4ae 100644
--- a/WebKit/android/jni/WebIconDatabase.h
+++ b/WebKit/android/jni/WebIconDatabase.h
@@ -59,9 +59,8 @@
         // Deliver all the icon notifications
         void deliverNotifications();
 
-        // List of clients and a mutex to protect it.
+        // List of clients.
         Vector<WebIconDatabaseClient*> mClients;
-        android::Mutex                 mClientsMutex;
 
         // Queue of page urls that have received an icon.
         Vector<WebCore::String> mNotifications;
diff --git a/WebKit/android/jni/WebStorage.cpp b/WebKit/android/jni/WebStorage.cpp
index f175fd3..07e4880 100644
--- a/WebKit/android/jni/WebStorage.cpp
+++ b/WebKit/android/jni/WebStorage.cpp
@@ -93,9 +93,9 @@
         if (manifestOrigin.get() == 0)
             continue;
         if (manifestOrigin->isSameSchemeHostPort(securityOrigin.get())) {
-            int64_t size = 0;
-            WebCore::cacheStorage().cacheGroupSize(manifestUrls[i].string(), &size);
-            usage += size;
+            int64_t cacheSize = 0;
+            WebCore::cacheStorage().cacheGroupSize(manifestUrls[i].string(), &cacheSize);
+            usage += cacheSize;
         }
     }
     return usage;
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index 5d2b8bb..15cef2b 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -147,6 +147,8 @@
 
 namespace android {
 
+bool WebViewCore::s_isPaused = false;
+
 static SkTDArray<WebViewCore*> gInstanceList;
 
 void WebViewCore::addInstance(WebViewCore* inst) {
@@ -185,7 +187,7 @@
 // ----------------------------------------------------------------------------
 
 struct WebViewCore::JavaGlue {
-    jobject     m_obj;
+    jweak       m_obj;
     jmethodID   m_spawnScrollTo;
     jmethodID   m_scrollTo;
     jmethodID   m_scrollBy;
@@ -264,12 +266,13 @@
     m_screenWidth = 320;
     m_scale = 1;
     m_screenWidthScale = 1;
+    m_touchEventListenerCount = 0;
 
     LOG_ASSERT(m_mainFrame, "Uh oh, somehow a frameview was made without an initial frame!");
 
     jclass clazz = env->GetObjectClass(javaWebViewCore);
     m_javaGlue = new JavaGlue;
-    m_javaGlue->m_obj = adoptGlobalRef(env, javaWebViewCore);
+    m_javaGlue->m_obj = env->NewWeakGlobalRef(javaWebViewCore);
     m_javaGlue->m_spawnScrollTo = GetJMethod(env, clazz, "contentSpawnScrollTo", "(II)V");
     m_javaGlue->m_scrollTo = GetJMethod(env, clazz, "contentScrollTo", "(II)V");
     m_javaGlue->m_scrollBy = GetJMethod(env, clazz, "contentScrollBy", "(IIZ)V");
@@ -331,7 +334,7 @@
 
     if (m_javaGlue->m_obj) {
         JNIEnv* env = JSC::Bindings::getJNIEnv();
-        env->DeleteGlobalRef(m_javaGlue->m_obj);
+        env->DeleteWeakGlobalRef(m_javaGlue->m_obj);
         m_javaGlue->m_obj = 0;
     }
     delete m_javaGlue;
@@ -346,6 +349,9 @@
 
 WebViewCore* WebViewCore::getWebViewCore(const WebCore::ScrollView* view)
 {
+    if (!view)
+        return 0;
+
     WebFrameView* webFrameView = static_cast<WebFrameView*>(view->platformWidget());
     if (!webFrameView)
         return 0;
@@ -626,13 +632,11 @@
     DBG_NAV_LOG("call updateFrameCache");
     updateFrameCache();
     if (m_findIsUp) {
+        LOG_ASSERT(m_javaGlue->m_obj,
+                "A Java widget was not associated with this view bridge!");
         JNIEnv* env = JSC::Bindings::getJNIEnv();
-        AutoJObject obj = m_javaGlue->object(env);
-        // if it is called during DESTROY is handled, the real object of WebViewCore
-        // can be gone. Check before using it.
-        if (!obj.get())
-            return;
-        env->CallVoidMethod(obj.get(), m_javaGlue->m_sendFindAgain);
+        env->CallVoidMethod(m_javaGlue->object(env).get(),
+                m_javaGlue->m_sendFindAgain);
         checkException(env);
     }
 }
@@ -838,12 +842,9 @@
 //    LOGD("WebViewCore::scrollTo(%d %d)\n", x, y);
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), animate ? m_javaGlue->m_spawnScrollTo : m_javaGlue->m_scrollTo, x, y);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+            animate ? m_javaGlue->m_spawnScrollTo : m_javaGlue->m_scrollTo,
+            x, y);
     checkException(env);
 }
 
@@ -851,12 +852,7 @@
 {
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_sendNotifyProgressFinished);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_sendNotifyProgressFinished);
     checkException(env);
 }
 
@@ -864,12 +860,7 @@
 {
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(),
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
                         m_javaGlue->m_sendViewInvalidate,
                         rect.x(), rect.y(), rect.right(), rect.bottom());
     checkException(env);
@@ -880,12 +871,7 @@
     if (!(dx | dy))
         return;
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_scrollBy,
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_scrollBy,
         dx, dy, animate);
     checkException(env);
 }
@@ -915,12 +901,7 @@
 void WebViewCore::contentDraw()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_contentDraw);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_contentDraw);
     checkException(env);
 }
 
@@ -969,18 +950,14 @@
     WebCore::FrameLoadType loadType = loader->loadType();
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_didFirstLayout,
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_didFirstLayout,
             loadType == WebCore::FrameLoadTypeStandard
             // When redirect with locked history, we would like to reset the
             // scale factor. This is important for www.yahoo.com as it is
             // redirected to www.yahoo.com/?rs=1 on load.
             || loadType == WebCore::FrameLoadTypeRedirectWithLockedBackForwardList);
     checkException(env);
+
     DBG_NAV_LOG("call updateFrameCache");
     m_check_domtree_version = false;
     updateFrameCache();
@@ -993,12 +970,7 @@
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_updateViewport);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateViewport);
     checkException(env);
 }
 
@@ -1008,12 +980,7 @@
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_restoreScale, scale);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_restoreScale, scale);
     checkException(env);
 }
 
@@ -1023,29 +990,33 @@
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_restoreScreenWidthScale, scale);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+            m_javaGlue->m_restoreScreenWidthScale, scale);
     checkException(env);
 }
 
-void WebViewCore::needTouchEvents(bool need)
+void WebViewCore::needTouchEvents(bool need, bool force)
 {
     DEBUG_NAV_UI_LOGD("%s", __FUNCTION__);
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
 
 #if ENABLE(TOUCH_EVENTS) // Android
-    JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_needTouchEvents, need);
-    checkException(env);
+    bool needToUpdateJava = false;
+    if (need) {
+        if (++m_touchEventListenerCount == 1)
+            needToUpdateJava = true;
+    } else {
+        if (force)
+           m_touchEventListenerCount = 0;
+        else if (--m_touchEventListenerCount == 0)
+            needToUpdateJava = true;
+    }
+
+    if (needToUpdateJava || force) {
+        JNIEnv* env = JSC::Bindings::getJNIEnv();
+        env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_needTouchEvents, need);
+        checkException(env);
+    }
 #endif
 }
 
@@ -1055,12 +1026,7 @@
     LOG_ASSERT(m_javaGlue->m_obj, "A Java widget was not associated with this view bridge!");
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_requestKeyboard, showKeyboard,
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_requestKeyboard, showKeyboard,
             isTextView);
     checkException(env);
 }
@@ -1588,209 +1554,6 @@
     updateCacheOnNodeChange();
 }
 
-static int findTextBoxIndex(WebCore::Node* node, const WebCore::IntPoint& pt)
-{
-    if (!node->isTextNode()) {
-        DBG_NAV_LOGD("node=%p pt=(%d,%d) isText=false", node, pt.x(), pt.y());
-        return -2; // error
-    }
-    WebCore::RenderText* renderText = (WebCore::RenderText*) node->renderer();
-    if (!renderText) {
-        DBG_NAV_LOGD("node=%p pt=(%d,%d) renderText=0", node, pt.x(), pt.y());
-        return -3; // error
-    }
-    FloatPoint absPt = renderText->localToAbsolute();
-    WebCore::InlineTextBox *textBox = renderText->firstTextBox();
-    int globalX, globalY;
-    CacheBuilder::GetGlobalOffset(node, &globalX, &globalY);
-    int x = pt.x() - globalX;
-    int y = pt.y() - globalY;
-    do {
-        int textBoxStart = textBox->start();
-        int textBoxEnd = textBoxStart + textBox->len();
-        if (textBoxEnd <= textBoxStart) {
-            DBG_NAV_LOGD("textBoxStart=%d <= textBoxEnd=%d", textBoxStart,
-                textBoxEnd);
-            continue;
-        }
-        WebCore::IntRect bounds = textBox->selectionRect(absPt.x(), absPt.y(),
-            textBoxStart, textBoxEnd);
-        if (!bounds.contains(x, y)) {
-            DBG_NAV_LOGD("[absPt=(%g,%g) textBoxStart=%d textBoxEnd=%d]"
-                " !contains (x=%d, y=%d)",
-                absPt.x(), absPt.y(), textBoxStart, textBoxEnd, x, y);
-            continue;
-        }
-        int offset = textBox->offsetForPosition(x - absPt.x());
-#if DEBUG_NAV_UI
-        int prior = offset > 0 ? textBox->positionForOffset(offset - 1) : -1;
-        int current = textBox->positionForOffset(offset);
-        int next = textBox->positionForOffset(offset + 1);
-        DBG_NAV_LOGD("offset=%d pt.x=%d globalX=%d renderX=%g x=%d "
-            "textBox->x()=%d textBox->start()=%d prior=%d current=%d next=%d",
-            offset, pt.x(), globalX, absPt.x(), x,
-            textBox->x(), textBox->start(), prior, current, next
-            );
-#endif
-        return textBox->start() + offset;
-    } while ((textBox = textBox->nextTextBox()));
-    return -1; // couldn't find point, may have walked off end
-}
-
-static inline bool isPunctuation(UChar c)
-{
-    return WTF::Unicode::category(c) & (0
-        | WTF::Unicode::Punctuation_Dash
-        | WTF::Unicode::Punctuation_Open
-        | WTF::Unicode::Punctuation_Close
-        | WTF::Unicode::Punctuation_Connector
-        | WTF::Unicode::Punctuation_Other
-        | WTF::Unicode::Punctuation_InitialQuote
-        | WTF::Unicode::Punctuation_FinalQuote
-    );
-}
-
-static int centerX(const SkIRect& rect)
-{
-    return (rect.fLeft + rect.fRight) >> 1;
-}
-
-static int centerY(const SkIRect& rect)
-{
-    return (rect.fTop + rect.fBottom) >> 1;
-}
-
-static void ShowNode(Node* node)
-{
-#if DEBUG_NAV_UI
-    WebCore::Node* match = node->document();
-    int index = 1;
-    while (match != node && (match = match->traverseNextNode()))
-        index++;
-    if (match != node)
-        index = -1;
-    const char* name = "text";
-    WebCore::CString cstr;
-    if (!node->isTextNode()) {
-        cstr = node->localName().string().utf8();
-        name = cstr.data();
-    }
-    node->getRect();
-    const WebCore::IntRect& b = node->getRect();
-    DBG_NAV_LOGD("%s %p (%d) (%d,%d,w=%d,h=%d)", name, node, index,
-        b.x(), b.y(), b.width(), b.height());
-#endif
-}
-
-static WebCore::Node* ChildIsTextNode(WebCore::Node* node)
-{
-    WebCore::Node* child = node;
-    while (child && !child->isTextNode()) {
-        ShowNode(child);
-        child = child->traverseNextNode(node);
-    }
-    return child;
-}
-
-WebCore::String WebViewCore::getSelection(SkRegion* selRgn)
-{
-    SkRegion::Iterator iter(*selRgn);
-    // FIXME: switch this to use StringBuilder instead
-    WebCore::String result;
-    WebCore::Node* lastStartNode = 0;
-    int lastStartEnd = -1;
-    UChar lastChar = 0xffff;
-    for (; !iter.done(); iter.next()) {
-        const SkIRect& rect = iter.rect();
-        DBG_NAV_LOGD("rect=(%d, %d, %d, %d)", rect.fLeft, rect.fTop,
-            rect.fRight, rect.fBottom);
-        int cy = centerY(rect);
-        WebCore::IntPoint startPt, endPt;
-        WebCore::Node* node, * endNode;
-        for (int top = rect.fTop + 2; top != cy; top = cy) {
-            startPt = WebCore::IntPoint(rect.fLeft + 1, top);
-            WebCore::HitTestResult hitTestResult = m_mainFrame->eventHandler()->
-                hitTestResultAtPoint(startPt, false);
-            node = ChildIsTextNode(hitTestResult.innerNode());
-            if (node)
-                break;
-            DBG_NAV_LOGD("node=%p (%s)", node, top != cy ? "top+1" : "cy");
-        }
-        if (!node) {
-            DBG_NAV_LOG("!node");
-            return result;
-        }
-        for (int bottom = rect.fBottom - 1; bottom != cy; bottom = cy) {
-            for (int right = rect.fRight - 1; right != rect.fRight-2; --right) {
-                endPt = WebCore::IntPoint(right, bottom);
-                WebCore::HitTestResult hitTestResult = m_mainFrame->
-                    eventHandler()->hitTestResultAtPoint(endPt, false);
-                endNode = ChildIsTextNode(hitTestResult.innerNode());
-                if (endNode)
-                    break;
-                DBG_NAV_LOGD("!endNode=%p (%s) (right-%d)", node,
-                    bottom != cy ? "bottom-1" : "cy", rect.fRight - right);
-            }
-        }
-        if (!endNode) {
-            DBG_NAV_LOG("!endNode");
-            return result;
-        }
-        int start = findTextBoxIndex(node, startPt);
-        if (start < 0)
-            continue;
-        int end = findTextBoxIndex(endNode, endPt);
-        if (end < -1) // use node if endNode is not valid
-            endNode = node;
-        if (end <= 0)
-            end = static_cast<WebCore::Text*>(endNode)->dataImpl()->length();
-        DBG_NAV_LOGD("node=%p start=%d endNode=%p end=%d", node, start, endNode, end);
-        WebCore::Node* startNode = node;
-        do {
-            if (!node->isTextNode())
-                continue;
-            if (node->getRect().isEmpty())
-                continue;
-            WebCore::Text* textNode = static_cast<WebCore::Text*>(node);
-            WebCore::StringImpl* string = textNode->dataImpl();
-            if (!string->length())
-                continue;
-            const UChar* chars = string->characters();
-            int newLength = node == endNode ? end : string->length();
-            if (node == startNode) {
- #if DEBUG_NAV_UI
-                if (node == lastStartNode)
-                    DBG_NAV_LOGD("start=%d last=%d", start, lastStartEnd);
- #endif
-                if (node == lastStartNode && start < lastStartEnd)
-                    break; // skip rect if text overlaps already written text
-                lastStartNode = node;
-                lastStartEnd = newLength - start;
-            }
-            if (newLength < start) {
-                DBG_NAV_LOGD("newLen=%d < start=%d", newLength, start);
-                break;
-            }
-            if (!isPunctuation(chars[start]))
-                result.append(' ');
-            result.append(chars + start, newLength - start);
-            start = 0;
-        } while (node != endNode && (node = node->traverseNextNode()));
-    }
-    result = result.simplifyWhiteSpace().stripWhiteSpace();
-#if DUMP_NAV_CACHE
-    {
-        char buffer[256];
-        CacheBuilder::Debug debug;
-        debug.init(buffer, sizeof(buffer));
-        debug.print("copy: ");
-        debug.wideString(result);
-        DUMP_NAV_LOGD("%s", buffer);
-    }
-#endif
-    return result;
-}
-
 void WebViewCore::setSelection(int start, int end)
 {
     WebCore::Node* focus = currentFocus();
@@ -2072,11 +1835,6 @@
 
     // Create an array of java Strings for the drop down.
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
     jobjectArray labelArray = makeLabelArray(env, labels, count);
 
     // Create an array determining whether each item is enabled.
@@ -2101,11 +1859,15 @@
         }
         env->ReleaseIntArrayElements(selectedArray, selArray, 0);
 
-        env->CallVoidMethod(obj.get(), m_javaGlue->m_requestListBox, labelArray, enabledArray, selectedArray);
+        env->CallVoidMethod(m_javaGlue->object(env).get(),
+                m_javaGlue->m_requestListBox, labelArray, enabledArray,
+                selectedArray);
         env->DeleteLocalRef(selectedArray);
     } else {
         // Pass up the single selection.
-        env->CallVoidMethod(obj.get(), m_javaGlue->m_requestSingleListBox, labelArray, enabledArray, selectedCountOrSelection);
+        env->CallVoidMethod(m_javaGlue->object(env).get(),
+                m_javaGlue->m_requestSingleListBox, labelArray, enabledArray,
+                selectedCountOrSelection);
     }
 
     env->DeleteLocalRef(labelArray);
@@ -2165,29 +1927,47 @@
 #endif
 
 #if ENABLE(TOUCH_EVENTS) // Android
-    WebCore::TouchEventType type = WebCore::TouchEventCancel;
+    WebCore::TouchEventType type = WebCore::TouchStart;
+    WebCore::PlatformTouchPoint::State touchState = WebCore::PlatformTouchPoint::TouchPressed;
     switch (action) {
     case 0: // MotionEvent.ACTION_DOWN
-        type = WebCore::TouchEventStart;
+        type = WebCore::TouchStart;
         break;
     case 1: // MotionEvent.ACTION_UP
-        type = WebCore::TouchEventEnd;
+        type = WebCore::TouchEnd;
+        touchState = WebCore::PlatformTouchPoint::TouchReleased;
         break;
     case 2: // MotionEvent.ACTION_MOVE
-        type = WebCore::TouchEventMove;
+        type = WebCore::TouchMove;
+        touchState = WebCore::PlatformTouchPoint::TouchMoved;
         break;
     case 3: // MotionEvent.ACTION_CANCEL
-        type = WebCore::TouchEventCancel;
+        type = WebCore::TouchCancel;
+        touchState = WebCore::PlatformTouchPoint::TouchCancelled;
         break;
     case 0x100: // WebViewCore.ACTION_LONGPRESS
-        type = WebCore::TouchEventLongPress;
+        type = WebCore::TouchLongPress;
+        touchState = WebCore::PlatformTouchPoint::TouchPressed;
         break;
     case 0x200: // WebViewCore.ACTION_DOUBLETAP
-        type = WebCore::TouchEventDoubleTap;
+        type = WebCore::TouchDoubleTap;
+        touchState = WebCore::PlatformTouchPoint::TouchPressed;
+        break;
+    default:
+        type = WebCore::TouchCancel;
+        touchState = WebCore::PlatformTouchPoint::TouchCancelled;
         break;
     }
+
+    // Track previous touch and if stationary set the state.
     WebCore::IntPoint pt(x - m_scrollOffsetX, y - m_scrollOffsetY);
-    WebCore::PlatformTouchEvent te(pt, pt, type);
+
+    if (type == WebCore::TouchMove && pt == m_lastTouchPoint)
+        touchState = WebCore::PlatformTouchPoint::TouchStationary;
+
+    m_lastTouchPoint = pt;
+
+    WebCore::PlatformTouchEvent te(pt, pt, type, touchState);
     preventDefault = m_mainFrame->eventHandler()->handleTouchEvent(te);
 #endif
 
@@ -2325,14 +2105,11 @@
 
 void WebViewCore::addMessageToConsole(const WebCore::String& message, unsigned int lineNumber, const WebCore::String& sourceID) {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
     jstring jMessageStr = env->NewString((unsigned short *)message.characters(), message.length());
     jstring jSourceIDStr = env->NewString((unsigned short *)sourceID.characters(), sourceID.length());
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_addMessageToConsole, jMessageStr, lineNumber, jSourceIDStr);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+            m_javaGlue->m_addMessageToConsole, jMessageStr, lineNumber,
+            jSourceIDStr);
     env->DeleteLocalRef(jMessageStr);
     env->DeleteLocalRef(jSourceIDStr);
     checkException(env);
@@ -2341,14 +2118,9 @@
 void WebViewCore::jsAlert(const WebCore::String& url, const WebCore::String& text)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
     jstring jInputStr = env->NewString((unsigned short *)text.characters(), text.length());
     jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_jsAlert, jUrlStr, jInputStr);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsAlert, jUrlStr, jInputStr);
     env->DeleteLocalRef(jInputStr);
     env->DeleteLocalRef(jUrlStr);
     checkException(env);
@@ -2358,14 +2130,11 @@
 {
 #if ENABLE(DATABASE)
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
     jstring jDatabaseIdentifierStr = env->NewString((unsigned short *)databaseIdentifier.characters(), databaseIdentifier.length());
     jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_exceededDatabaseQuota, jUrlStr, jDatabaseIdentifierStr, currentQuota, estimatedSize);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+            m_javaGlue->m_exceededDatabaseQuota, jUrlStr,
+            jDatabaseIdentifierStr, currentQuota, estimatedSize);
     env->DeleteLocalRef(jDatabaseIdentifierStr);
     env->DeleteLocalRef(jUrlStr);
     checkException(env);
@@ -2376,12 +2145,8 @@
 {
 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_reachedMaxAppCacheSize, spaceNeeded);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+            m_javaGlue->m_reachedMaxAppCacheSize, spaceNeeded);
     checkException(env);
 #endif
 }
@@ -2390,25 +2155,15 @@
 {
     m_groupForVisitedLinks = group;
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_populateVisitedLinks);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_populateVisitedLinks);
     checkException(env);
 }
 
 void WebViewCore::geolocationPermissionsShowPrompt(const WebCore::String& origin)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
     jstring originString = env->NewString((unsigned short *)origin.characters(), origin.length());
-    env->CallVoidMethod(obj.get(),
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
                         m_javaGlue->m_geolocationPermissionsShowPrompt,
                         originString);
     env->DeleteLocalRef(originString);
@@ -2418,12 +2173,7 @@
 void WebViewCore::geolocationPermissionsHidePrompt()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(),
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
                         m_javaGlue->m_geolocationPermissionsHidePrompt);
     checkException(env);
 }
@@ -2431,14 +2181,9 @@
 bool WebViewCore::jsConfirm(const WebCore::String& url, const WebCore::String& text)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return false;
     jstring jInputStr = env->NewString((unsigned short *)text.characters(), text.length());
     jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
-    jboolean result = env->CallBooleanMethod(obj.get(), m_javaGlue->m_jsConfirm, jUrlStr, jInputStr);
+    jboolean result = env->CallBooleanMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsConfirm, jUrlStr, jInputStr);
     env->DeleteLocalRef(jInputStr);
     env->DeleteLocalRef(jUrlStr);
     checkException(env);
@@ -2448,16 +2193,10 @@
 bool WebViewCore::jsPrompt(const WebCore::String& url, const WebCore::String& text, const WebCore::String& defaultValue, WebCore::String& result)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return false;
-
     jstring jInputStr = env->NewString((unsigned short *)text.characters(), text.length());
     jstring jDefaultStr = env->NewString((unsigned short *)defaultValue.characters(), defaultValue.length());
     jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
-    jstring returnVal = (jstring) env->CallObjectMethod(obj.get(), m_javaGlue->m_jsPrompt, jUrlStr, jInputStr, jDefaultStr);
+    jstring returnVal = (jstring) env->CallObjectMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsPrompt, jUrlStr, jInputStr, jDefaultStr);
     // If returnVal is null, it means that the user cancelled the dialog.
     if (!returnVal)
         return false;
@@ -2473,14 +2212,9 @@
 bool WebViewCore::jsUnload(const WebCore::String& url, const WebCore::String& message)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return false;
     jstring jInputStr = env->NewString((unsigned short *)message.characters(), message.length());
     jstring jUrlStr = env->NewString((unsigned short *)url.characters(), url.length());
-    jboolean result = env->CallBooleanMethod(obj.get(), m_javaGlue->m_jsUnload, jUrlStr, jInputStr);
+    jboolean result = env->CallBooleanMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsUnload, jUrlStr, jInputStr);
     env->DeleteLocalRef(jInputStr);
     env->DeleteLocalRef(jUrlStr);
     checkException(env);
@@ -2490,12 +2224,7 @@
 bool WebViewCore::jsInterrupt()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return true;    // default to interrupt
-    jboolean result = env->CallBooleanMethod(obj.get(), m_javaGlue->m_jsInterrupt);
+    jboolean result = env->CallBooleanMethod(m_javaGlue->object(env).get(), m_javaGlue->m_jsInterrupt);
     checkException(env);
     return result;
 }
@@ -2510,12 +2239,7 @@
 WebViewCore::getWebViewJavaObject()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return 0;
-    return env->GetObjectField(obj.get(), gWebViewCoreFields.m_webView);
+    return env->GetObjectField(m_javaGlue->object(env).get(), gWebViewCoreFields.m_webView);
 }
 
 void WebViewCore::updateTextSelection() {
@@ -2527,12 +2251,7 @@
         return;
     RenderTextControl* rtc = static_cast<RenderTextControl*>(renderer);
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(),
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
             m_javaGlue->m_updateTextSelection, reinterpret_cast<int>(focusNode),
             rtc->selectionStart(), rtc->selectionEnd(), m_textGeneration);
     checkException(env);
@@ -2544,21 +2263,15 @@
     if (m_blockTextfieldUpdates)
         return;
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-
     if (changeToPassword) {
-        env->CallVoidMethod(obj.get(), m_javaGlue->m_updateTextfield,
+        env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateTextfield,
                 (int) ptr, true, 0, m_textGeneration);
         checkException(env);
         return;
     }
     int length = text.length();
     jstring string = env->NewString((unsigned short *) text.characters(), length);
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_updateTextfield,
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_updateTextfield,
             (int) ptr, false, string, m_textGeneration);
     env->DeleteLocalRef(string);
     checkException(env);
@@ -2567,13 +2280,8 @@
 void WebViewCore::clearTextEntry()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-    // if it is called during DESTROY is handled, the real object of WebViewCore
-    // can be gone. Check before using it.
-    if (!obj.get())
-        return;
-
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_clearTextEntry);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+        m_javaGlue->m_clearTextEntry);
 }
 
 void WebViewCore::setBackgroundColor(SkColor c)
@@ -2591,11 +2299,10 @@
 jclass WebViewCore::getPluginClass(const WebCore::String& libName, const char* className)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
 
     jstring libString = env->NewString(libName.characters(), libName.length());
     jstring classString = env->NewStringUTF(className);
-    jobject pluginClass = env->CallObjectMethod(obj.get(),
+    jobject pluginClass = env->CallObjectMethod(m_javaGlue->object(env).get(),
                                            m_javaGlue->m_getPluginClass,
                                            libString, classString);
     checkException(env);
@@ -2626,18 +2333,16 @@
 void WebViewCore::hideFullScreenPlugin()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_hideFullScreenPlugin);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+                        m_javaGlue->m_hideFullScreenPlugin);
     checkException(env);
 }
 
 void WebViewCore::updateFullScreenPlugin(int x, int y, int width, int height)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_updateFullScreenPlugin, x, y,
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+            m_javaGlue->m_updateFullScreenPlugin, x, y,
             width, height);
     checkException(env);
 }
@@ -2645,9 +2350,7 @@
 jobject WebViewCore::addSurface(jobject view, int x, int y, int width, int height)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-
-    jobject result = env->CallObjectMethod(obj.get(),
+    jobject result = env->CallObjectMethod(m_javaGlue->object(env).get(),
                                            m_javaGlue->m_addSurface,
                                            view, x, y, width, height);
     checkException(env);
@@ -2657,19 +2360,16 @@
 void WebViewCore::updateSurface(jobject childView, int x, int y, int width, int height)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_updateSurface, childView, x,
-                        y, width, height);
+    env->CallVoidMethod(m_javaGlue->object(env).get(),
+                        m_javaGlue->m_updateSurface, childView,
+                        x, y, width, height);
     checkException(env);
 }
 
 void WebViewCore::destroySurface(jobject childView)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue->object(env);
-
-    env->CallVoidMethod(obj.get(), m_javaGlue->m_destroySurface, childView);
+    env->CallVoidMethod(m_javaGlue->object(env).get(), m_javaGlue->m_destroySurface, childView);
     checkException(env);
 }
 
@@ -3100,20 +2800,6 @@
     viewImpl->setBackgroundColor((SkColor) color);
 }
 
-static jstring GetSelection(JNIEnv *env, jobject obj, jobject selRgn)
-{
-#ifdef ANDROID_INSTRUMENT
-    TimeCounterAuto counter(TimeCounter::WebViewCoreTimeCounter);
-#endif
-    WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
-    LOG_ASSERT(viewImpl, "viewImpl not set in %s", __FUNCTION__);
-    SkRegion* selectionRegion = GraphicsJNI::getNativeRegion(env, selRgn);
-    WebCore::String result = viewImpl->getSelection(selectionRegion);
-    if (!result.isEmpty())
-        return WebCoreStringToJString(env, result);
-    return 0;
-}
-
 static void DumpDomTree(JNIEnv *env, jobject obj, jboolean useFile)
 {
     WebViewCore* viewImpl = GET_NATIVE_VIEW(env, obj);
@@ -3240,6 +2926,8 @@
     SkANP::InitEvent(&event, kLifecycle_ANPEventType);
     event.data.lifecycle.action = kPause_ANPLifecycleAction;
     GET_NATIVE_VIEW(env, obj)->sendPluginEvent(event);
+
+    WebViewCore::setIsPaused(true);
 }
 
 static void Resume(JNIEnv* env, jobject obj)
@@ -3255,6 +2943,8 @@
     SkANP::InitEvent(&event, kLifecycle_ANPEventType);
     event.data.lifecycle.action = kResume_ANPLifecycleAction;
     GET_NATIVE_VIEW(env, obj)->sendPluginEvent(event);
+
+    WebViewCore::setIsPaused(false);
 }
 
 static void FreeMemory(JNIEnv* env, jobject obj)
@@ -3281,7 +2971,6 @@
         env->ReleaseStringChars(item, str);
         env->DeleteLocalRef(item);
     }
-    env->DeleteLocalRef(array);
 }
 
 // Notification from the UI thread that the plugin's full-screen surface has been discarded
@@ -3380,8 +3069,6 @@
         (void*) SplitContent },
     { "nativeSetBackgroundColor", "(I)V",
         (void*) SetBackgroundColor },
-    { "nativeGetSelection", "(Landroid/graphics/Region;)Ljava/lang/String;",
-        (void*) GetSelection },
     { "nativeRegisterURLSchemeAsLocal", "(Ljava/lang/String;)V",
         (void*) RegisterURLSchemeAsLocal },
     { "nativeDumpDomTree", "(Z)V",
diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h
index f1893ff..c662441 100644
--- a/WebKit/android/jni/WebViewCore.h
+++ b/WebKit/android/jni/WebViewCore.h
@@ -247,7 +247,6 @@
         WebCore::String retrieveHref(WebCore::Frame* frame, WebCore::Node* node);
         WebCore::String retrieveAnchorText(WebCore::Frame* frame, WebCore::Node* node);
         WebCore::String requestLabel(WebCore::Frame* , WebCore::Node* );
-        WebCore::String getSelection(SkRegion* );
 
         // Create a single picture to represent the drawn DOM (used by navcache)
         void recordPicture(SkPicture* picture);
@@ -376,7 +375,7 @@
         Node* cursorNodeIsPlugin();
 
         // Notify the Java side whether it needs to pass down the touch events
-        void needTouchEvents(bool);
+        void needTouchEvents(bool, bool);
 
         // Notify the Java side that webkit is requesting a keyboard
         void requestKeyboard(bool showKeyboard, bool isTextView);
@@ -454,6 +453,8 @@
         // field safely from our respective threads
         static Mutex gButtonMutex;
         WTF::Vector<Container> m_buttons;
+        static bool isPaused() { return s_isPaused; }
+        static void setIsPaused(bool isPaused) { s_isPaused = isPaused; }
         // end of shared members
 
         // internal functions
@@ -510,6 +511,7 @@
         unsigned m_domtree_version;
         bool m_check_domtree_version;
         PageGroup* m_groupForVisitedLinks;
+        static bool s_isPaused;
 
         SkTDArray<PluginWidgetAndroid*> m_plugins;
         WebCore::Timer<WebViewCore> m_pluginInvalTimer;
@@ -524,6 +526,11 @@
         bool handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* nodePtr);
         WebCore::HTMLAnchorElement* retrieveAnchorElement(WebCore::Frame* frame, WebCore::Node* node);
 
+#if ENABLE(TOUCH_EVENTS)
+        int m_touchEventListenerCount;
+        IntPoint m_lastTouchPoint;
+#endif
+
 #if DEBUG_NAV_UI
         uint32_t m_now;
 #endif
diff --git a/WebKit/android/nav/CachedRoot.cpp b/WebKit/android/nav/CachedRoot.cpp
index d9669bd..5805e5f 100644
--- a/WebKit/android/nav/CachedRoot.cpp
+++ b/WebKit/android/nav/CachedRoot.cpp
@@ -154,11 +154,11 @@
         }
         if (interestingType == false)
             return false;
-        if (mBoundsSlop.contains(rect) ||
+        if (!mDrawnOver.contains(rect) && (mBoundsSlop.contains(rect) ||
                 (mBounds.fLeft == rect.fLeft && mBounds.fRight == rect.fRight &&
                 mBounds.fTop >= rect.fTop && mBounds.fBottom <= rect.fBottom) ||
                 (mBounds.fTop == rect.fTop && mBounds.fBottom == rect.fBottom &&
-                mBounds.fLeft >= rect.fLeft && mBounds.fRight <= rect.fRight)) {
+                mBounds.fLeft >= rect.fLeft && mBounds.fRight <= rect.fRight))) {
             mDrawnOver.setEmpty();
             mAllDrawnIn.join(rect);
             DBG_NAV_LOGD("BoundsCheck (contains) rect={%d,%d,%d,%d}"
@@ -1125,8 +1125,8 @@
     checker.drawPicture(*mPicture);
     boundsCheck.checkLast();
     // was it not drawn or clipped out?
+    CachedNode* node = const_cast<CachedNode*>(best->mNode);
     if (boundsCheck.hidden()) { // if hidden, return false so that nav can try again
-        CachedNode* node = const_cast<CachedNode*>(best->mNode);
 #if DEBUG_NAV_UI
         const SkIRect& m = boundsCheck.mBounds;
         const SkIRect& s = boundsCheck.mBoundsSlop;
@@ -1177,12 +1177,14 @@
 #if DEBUG_NAV_UI
         const SkIRect& modded = boundsCheck.mBounds;
         DBG_NAV_LOGD("partially occluded node:%p (%d) old:{%d,%d,%d,%d}"
-            " new:{%d,%d,%d,%d}", best->mNode, best->mNode->index(),
+            " new:{%d,%d,%d,%d}", node, node->index(),
             orig.fLeft, orig.fTop, orig.fRight, orig.fBottom,
             base.fLeft, base.fTop, base.fRight, base.fBottom);
 #endif
         best->mMouseBounds = WebCore::IntRect(bounds.x() + base.fLeft - kMargin,
             bounds.y() + base.fTop - kMargin, base.width(), base.height());
+        node->clip(best->mMouseBounds);
+        return true;
     }
     return false;
 }
diff --git a/WebKit/android/nav/SelectText.cpp b/WebKit/android/nav/SelectText.cpp
index 9a9f8d2..d8b184a 100644
--- a/WebKit/android/nav/SelectText.cpp
+++ b/WebKit/android/nav/SelectText.cpp
@@ -35,14 +35,17 @@
 #include "SkPoint.h"
 #include "SkRect.h"
 #include "SkRegion.h"
+#include "SkUtils.h"
 
 class CommonCheck : public SkBounder {
 public:
     CommonCheck() : mMatrix(NULL), mPaint(NULL) {}
     
-    virtual void setUp(const SkPaint& paint, const SkMatrix& matrix, SkScalar y) {
+    virtual void setUp(const SkPaint& paint, const SkMatrix& matrix, SkScalar y,
+            const void* text) {
         mMatrix = &matrix;
         mPaint = &paint;
+        mText = static_cast<const uint16_t*>(text);
         mY = y;
         mBase = mBottom = mTop = INT_MAX;
     }
@@ -81,10 +84,11 @@
 protected:   
     const SkMatrix* mMatrix;
     const SkPaint* mPaint;
+    const uint16_t* mText;
+    SkScalar mY;
     int mBase;
     int mBottom;
     int mTop;
-    SkScalar mY;
 };
 
 class FirstCheck : public CommonCheck {
@@ -162,6 +166,8 @@
                     full.fRight = mLast.fLeft;
             }
             mSelectRegion->op(full, SkRegion::kUnion_Op);
+            DBG_NAV_LOGD("MultilineBuilder full=(%d,%d,r=%d,b=%d)",
+                full.fLeft, full.fTop, full.fRight, full.fBottom);
             mLast = full;
             mLastBase = base();
             if (mStart == mEnd)
@@ -178,6 +184,66 @@
     bool mCapture;
 };
 
+class TextExtractor : public CommonCheck {
+public:
+    TextExtractor(const SkRegion& region) : mSelectRegion(region),
+        mSkipFirstSpace(true) { // don't start with a space
+    }
+
+    virtual void setUp(const SkPaint& paint, const SkMatrix& matrix, SkScalar y,
+            const void* text) {
+        INHERITED::setUp(paint, matrix, y, text);
+        SkPaint charPaint = paint;
+        charPaint.setTextEncoding(SkPaint::kUTF8_TextEncoding);
+        mMinSpaceWidth = charPaint.measureText(" ", 1) * 3 / 4;
+    }
+
+    virtual bool onIRect(const SkIRect& rect, uint16_t glyphID) {
+        SkIRect full;
+        full.set(rect.fLeft, top(), rect.fRight, bottom());
+        if (mSelectRegion.contains(full)) {
+            if (!mSkipFirstSpace
+                    && ((mLast.fTop < top() && mLast.fBottom < top() + 2)
+                    || (mLast.fLeft < rect.fLeft // glyphs are LTR
+                    && mLast.fRight + mMinSpaceWidth < rect.fLeft))) {
+                DBG_NAV_LOGD("TextExtractor [%02x] append space", glyphID);
+                *mSelectText.append() = ' ';
+            } else
+                mSkipFirstSpace = false;
+            DBG_NAV_LOGD("TextExtractor [%02x] append full=(%d,%d,r=%d,b=%d)",
+                glyphID, full.fLeft, full.fTop, full.fRight, full.fBottom);
+            SkUnichar uni;
+            SkPaint utfPaint = *mPaint;
+            utfPaint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
+            utfPaint.glyphsToUnichars(&glyphID, 1, &uni);
+            if (uni) {
+                uint16_t chars[2];
+                size_t count = SkUTF16_FromUnichar(uni, chars);
+                *mSelectText.append() = chars[0];
+                if (count == 2)
+                    *mSelectText.append() = chars[1];
+            }
+            mLast = full;
+        } else
+            DBG_NAV_LOGD("TextExtractor [%02x] skip full=(%d,%d,r=%d,b=%d)",
+                glyphID, full.fLeft, full.fTop, full.fRight, full.fBottom);
+        return false;
+    }
+
+    WebCore::String text() {
+        return WebCore::String(mSelectText.begin(), mSelectText.count());
+    }
+
+protected:
+    const SkRegion& mSelectRegion;
+    SkTDArray<uint16_t> mSelectText;
+    SkIRect mLast;
+    SkScalar mMinSpaceWidth;
+    bool mSkipFirstSpace;
+private:
+    typedef CommonCheck INHERITED;
+};
+
 class TextCanvas : public SkCanvas {
 public:
 
@@ -218,14 +284,14 @@
 
     virtual void drawText(const void* text, size_t byteLength, SkScalar x, 
                           SkScalar y, const SkPaint& paint) {
-        mBounder.setUp(paint, getTotalMatrix(), y);
+        mBounder.setUp(paint, getTotalMatrix(), y, text);
         SkCanvas::drawText(text, byteLength, x, y, paint);
     }
 
     virtual void drawPosTextH(const void* text, size_t byteLength,
                               const SkScalar xpos[], SkScalar constY,
                               const SkPaint& paint) {
-        mBounder.setUp(paint, getTotalMatrix(), constY);
+        mBounder.setUp(paint, getTotalMatrix(), constY, text);
         SkCanvas::drawPosTextH(text, byteLength, xpos, constY, paint);
     }
 
@@ -262,3 +328,17 @@
     _check.offsetBounds(area.fLeft, area.fTop);
     return _check.bestBounds();
 }
+
+WebCore::String CopyPaste::text(const SkPicture& picture, const SkIRect& area,
+        const SkRegion& region) {
+    SkRegion copy = region;
+    copy.translate(-area.fLeft, -area.fTop);
+    const SkIRect& bounds = copy.getBounds();
+    DBG_NAV_LOGD("area=(%d, %d, %d, %d) region=(%d, %d, %d, %d)",
+        area.fLeft, area.fTop, area.fRight, area.fBottom,
+        bounds.fLeft, bounds.fTop, bounds.fRight, bounds.fBottom);
+    TextExtractor extractor(copy);
+    TextCanvas checker(&extractor, picture, area);
+    checker.drawPicture(const_cast<SkPicture&>(picture));
+    return extractor.text();
+}
diff --git a/WebKit/android/nav/SelectText.h b/WebKit/android/nav/SelectText.h
index 3365816..32d8311 100644
--- a/WebKit/android/nav/SelectText.h
+++ b/WebKit/android/nav/SelectText.h
@@ -26,6 +26,8 @@
 #ifndef SELECT_TEXT_H
 #define SELECT_TEXT_H
 
+#include "PlatformString.h"
+
 class SkPicture;
 struct SkIRect;
 struct SkIPoint;
@@ -37,6 +39,8 @@
         const SkIRect& selStart, const SkIRect& selEnd, SkRegion* region);
     static SkIRect findClosest(const SkPicture& , const SkIRect& area,
         int x, int y);
+    static WebCore::String text(const SkPicture& ,  const SkIRect& area,
+        const SkRegion& );
 };
 
 #endif
diff --git a/WebKit/android/nav/WebView.cpp b/WebKit/android/nav/WebView.cpp
index 1c98b87..0dccbee 100644
--- a/WebKit/android/nav/WebView.cpp
+++ b/WebKit/android/nav/WebView.cpp
@@ -34,6 +34,7 @@
 #include "CachedFrame.h"
 #include "CachedNode.h"
 #include "CachedRoot.h"
+#include "CString.h"
 #include "FindCanvas.h"
 #include "Frame.h"
 #include "GraphicsJNI.h"
@@ -98,7 +99,7 @@
 };
 
 struct JavaGlue {
-    jobject     m_obj;
+    jweak       m_obj;
     jmethodID   m_clearTextEntry;
     jmethodID   m_overrideLoading;
     jmethodID   m_scrollBy;
@@ -127,7 +128,7 @@
 {
     jclass clazz = env->FindClass("android/webkit/WebView");
  //   m_javaGlue = new JavaGlue;
-    m_javaGlue.m_obj = adoptGlobalRef(env, javaWebView);
+    m_javaGlue.m_obj = env->NewWeakGlobalRef(javaWebView);
     m_javaGlue.m_scrollBy = GetJMethod(env, clazz, "setContentScrollBy", "(IIZ)Z");
     m_javaGlue.m_clearTextEntry = GetJMethod(env, clazz, "clearTextEntry", "()V");
     m_javaGlue.m_overrideLoading = GetJMethod(env, clazz, "overrideLoading", "(Ljava/lang/String;)V");
@@ -173,7 +174,7 @@
     if (m_javaGlue.m_obj)
     {
         JNIEnv* env = JSC::Bindings::getJNIEnv();
-        env->DeleteGlobalRef(m_javaGlue.m_obj);
+        env->DeleteWeakGlobalRef(m_javaGlue.m_obj);
         m_javaGlue.m_obj = 0;
     }
     delete m_frameCacheUI;
@@ -214,12 +215,7 @@
 {
     DEBUG_NAV_UI_LOGD("%s", __FUNCTION__);
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_clearTextEntry);
+    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_clearTextEntry);
     checkException(env);
 }
 
@@ -646,12 +642,7 @@
 {
     LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return 0;
-    int result = env->CallIntMethod(obj.get(), m_javaGlue.m_getScaledMaxXScroll);
+    int result = env->CallIntMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getScaledMaxXScroll);
     checkException(env);
     return result;
 }
@@ -660,12 +651,7 @@
 {
     LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return 0;
-    int result = env->CallIntMethod(obj.get(), m_javaGlue.m_getScaledMaxYScroll);
+    int result = env->CallIntMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getScaledMaxYScroll);
     checkException(env);
     return result;
 }
@@ -674,12 +660,7 @@
 {
     LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    jobject jRect = env->CallObjectMethod(obj.get(), m_javaGlue.m_getVisibleRect);
+    jobject jRect = env->CallObjectMethod(m_javaGlue.object(env).get(), m_javaGlue.m_getVisibleRect);
     checkException(env);
     int left = (int) env->GetIntField(jRect, m_javaGlue.m_rectLeft);
     checkException(env);
@@ -946,7 +927,7 @@
     if (!root)
         return 0;
     const CachedFrame* frame = 0;
-    const CachedNode* result = slop ? findAt(root, rect, &frame, &rx, &ry) : 0;
+    const CachedNode* result = findAt(root, rect, &frame, &rx, &ry);
     if (!result) {
         DBG_NAV_LOGD("no nodes found root=%p", root);
         setNavBounds(rect);
@@ -998,13 +979,9 @@
 void overrideUrlLoading(const WebCore::String& url)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
     jstring jName = env->NewString((jchar*) url.characters(), url.length());
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_overrideLoading, jName);
+    env->CallVoidMethod(m_javaGlue.object(env).get(),
+            m_javaGlue.m_overrideLoading, jName);
     env->DeleteLocalRef(jName);
 }
 
@@ -1051,9 +1028,15 @@
         m_selEnd.fLeft, m_selEnd.fTop, m_selEnd.fRight, m_selEnd.fBottom);
 }
 
-const SkRegion& getSelection()
+const String getSelection()
 {
-    return m_selRegion;
+    WebCore::IntRect r;
+    getVisibleRect(&r);
+    SkIRect area;
+    area.set(r.x(), r.y(), r.right(), r.bottom());
+    String result = CopyPaste::text(*m_navPictureUI, area, m_selRegion);
+    DBG_NAV_LOGD("text=%s", result.latin1().data());
+    return result;
 }
 
 void drawSelectionRegion(SkCanvas* canvas)
@@ -1128,15 +1111,10 @@
 
 void sendMoveFocus(WebCore::Frame* framePtr, WebCore::Node* nodePtr)
 {
-    DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y);
+    DBG_NAV_LOGD("framePtr=%p nodePtr=%p", framePtr, nodePtr);
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_sendMoveFocus, (jint) framePtr,
-            (jint) nodePtr);
+    env->CallVoidMethod(m_javaGlue.object(env).get(),
+        m_javaGlue.m_sendMoveFocus, (jint) framePtr, (jint) nodePtr);
     checkException(env);
 }
 
@@ -1144,12 +1122,7 @@
 {
     DBG_NAV_LOGD("framePtr=%p nodePtr=%p x=%d y=%d", framePtr, nodePtr, x, y);
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_sendMoveMouse,
+    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_sendMoveMouse,
         (jint) framePtr, (jint) nodePtr, x, y);
     checkException(env);
 }
@@ -1158,12 +1131,8 @@
 {
     LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_sendMoveMouseIfLatest, disableFocusController);
+    env->CallVoidMethod(m_javaGlue.object(env).get(),
+            m_javaGlue.m_sendMoveMouseIfLatest, disableFocusController);
     checkException(env);
 }
 
@@ -1175,12 +1144,7 @@
         m_generation, framePtr, nodePtr, x, y);
     LOG_ASSERT(m_javaGlue.m_obj, "A WebView was not associated with this WebViewNative!");
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_sendMotionUp,
+    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_sendMotionUp,
         m_generation, (jint) framePtr, (jint) nodePtr, x, y);
     checkException(env);
 }
@@ -1249,12 +1213,7 @@
     LOG_ASSERT(m_javaGlue.m_obj, "A java object was not associated with this native WebView!");
 
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return false;
-    bool result = env->CallBooleanMethod(obj.get(),
+    bool result = env->CallBooleanMethod(m_javaGlue.object(env).get(),
         m_javaGlue.m_scrollBy, dx, dy, true);
     checkException(env);
     return result;
@@ -1291,49 +1250,30 @@
 void rebuildWebTextView()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_rebuildWebTextView);
+    env->CallVoidMethod(m_javaGlue.object(env).get(),
+            m_javaGlue.m_rebuildWebTextView);
     checkException(env);
 }
 
 void viewInvalidate()
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_viewInvalidate);
+    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_viewInvalidate);
     checkException(env);
 }
 
 void viewInvalidateRect(int l, int t, int r, int b)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
+    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_viewInvalidateRect, l, r, t, b);
     checkException(env);
 }
 
 void postInvalidateDelayed(int64_t delay, const WebCore::IntRect& bounds)
 {
     JNIEnv* env = JSC::Bindings::getJNIEnv();
-    AutoJObject obj = m_javaGlue.object(env);
-    // if it is called during or after DESTROY is handled, the real object of
-    // WebView can be gone. Check before using it.
-    if (!obj.get())
-        return;
-    env->CallVoidMethod(obj.get(), m_javaGlue.m_postInvalidateDelayed,
-            delay, bounds.x(), bounds.y(), bounds.right(), bounds.bottom());
+    env->CallVoidMethod(m_javaGlue.object(env).get(), m_javaGlue.m_postInvalidateDelayed,
+        delay, bounds.x(), bounds.y(), bounds.right(), bounds.bottom());
     checkException(env);
 }
 
@@ -2108,7 +2048,8 @@
 {
     WebView* view = GET_NATIVE_VIEW(env, obj);
     LOG_ASSERT(view, "view not set in %s", __FUNCTION__);
-    return GraphicsJNI::createRegion(env, new SkRegion(view->getSelection()));
+    String selection = view->getSelection();
+    return env->NewString((jchar*)selection.characters(), selection.length());
 }
 
 #ifdef ANDROID_DUMP_DISPLAY_TREE
@@ -2238,7 +2179,7 @@
         (void*) nativeFocusNodePointer },
     { "nativeGetCursorRingBounds", "()Landroid/graphics/Rect;",
         (void*) nativeGetCursorRingBounds },
-    { "nativeGetSelection", "()Landroid/graphics/Region;",
+    { "nativeGetSelection", "()Ljava/lang/String;",
         (void*) nativeGetSelection },
     { "nativeHasCursorNode", "()Z",
         (void*) nativeHasCursorNode },
diff --git a/WebKit/android/plugins/ANPSoundInterface.cpp b/WebKit/android/plugins/ANPSoundInterface.cpp
index 2e56e24..8e31d69 100644
--- a/WebKit/android/plugins/ANPSoundInterface.cpp
+++ b/WebKit/android/plugins/ANPSoundInterface.cpp
@@ -27,6 +27,7 @@
 #include "config.h"
 #include "android_npapi.h"
 
+#include "SkTypes.h"
 #include "media/AudioTrack.h"
 
 struct ANPAudioTrack {
diff --git a/WebKit/android/plugins/PluginWidgetAndroid.cpp b/WebKit/android/plugins/PluginWidgetAndroid.cpp
index 0fcdc3b..17443b7 100644
--- a/WebKit/android/plugins/PluginWidgetAndroid.cpp
+++ b/WebKit/android/plugins/PluginWidgetAndroid.cpp
@@ -28,6 +28,7 @@
 #include "Document.h"
 #include "Element.h"
 #include "Frame.h"
+#include "Page.h"
 #include "PluginPackage.h"
 #include "PluginView.h"
 #include "PluginWidgetAndroid.h"
@@ -38,6 +39,10 @@
 #include "WebViewCore.h"
 #include "jni_utility.h"
 
+#if ENABLE(TOUCH_EVENTS)
+#include "ChromeClient.h"
+#endif
+
 #define DEBUG_VISIBLE_RECTS 1 // temporary debug printfs and fixes
 
 PluginWidgetAndroid::PluginWidgetAndroid(WebCore::PluginView* view)
@@ -259,12 +264,18 @@
     }
 
     Document* doc = m_pluginView->getParentFrame()->document();
+#if ENABLE(TOUCH_EVENTS)
     if((m_eventFlags ^ flags) & kTouch_ANPEventFlag) {
-        if(flags & kTouch_ANPEventFlag)
-            doc->addTouchEventListener(m_pluginView->getElement());
-        else
-            doc->removeTouchEventListener(m_pluginView->getElement());
+        if (flags & kTouch_ANPEventFlag) {
+           if (Page* page = doc->page())
+               page->chrome()->client()->needTouchEvents(true, false);
+               doc->addListenerTypeIfNeeded(eventNames().touchstartEvent);
+       } else {
+           if (Page* page = doc->page())
+               page->chrome()->client()->needTouchEvents(false, false);
+       }
     }
+#endif
 
     m_eventFlags = flags;
 }
diff --git a/WebKit/android/sort.cpp b/WebKit/android/sort.cpp
deleted file mode 100644
index 9a8a535..0000000
--- a/WebKit/android/sort.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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.
- */
-
-#include "config.h"
-
-namespace std
-{
-    void sort(const void** start, const void** end, const void** temp, Comparator comp) 
-    {
-        size_t endlen = end - start;
-        size_t midlen = endlen / 2;
-        const void** mid = start + midlen;
-        if (midlen > 1)
-            sort(start, mid, temp, comp);
-        if (end - mid > 1)
-            sort(mid, end, temp, comp);
-        memcpy(temp, start, midlen * sizeof(*start));
-        size_t i = 0;
-        size_t j = midlen;
-        size_t off = 0;
-        while (i < midlen && j < endlen) 
-            start[off++] = (*comp)(start[j], temp[i]) ? start[j++] : temp[i++];
-        if (i < midlen)
-            memcpy(&start[off], &temp[i], (midlen - i) * sizeof(*start));
-    }
-
-    void sort(const void** start, const void** end, Comparator comp) {
-        if (end - start > 1) {
-            const void** temp = new sortType[(end - start) / 2];
-            sort(start, end, temp, comp);
-            delete[] temp;
-        }
-    }
-}
diff --git a/WebKit/android/stl/algorithm b/WebKit/android/stl/algorithm
deleted file mode 100644
index 131fe0d..0000000
--- a/WebKit/android/stl/algorithm
+++ /dev/null
@@ -1,277 +0,0 @@
-#ifdef __cplusplus
-
-/*
- *
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- *
- * Copyright (c) 1996-1998
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
- 
- // extracted from stl_algobase.h 
- // full STL is not compatible with the ARM build
- // a limited number of STL functions is used by webkit: swap, max, and min are 
- // included below for webkit compatibility
- 
-#ifdef __GLIBCPP_INTERNAL_ALGOBASE_H
-#error "real STL defined"
-#endif
-
-#ifndef __ANDROID_ALGORITHM
-#define __ANDROID_ALGORITHM
-
-#ifndef __ANDROID_LIMITS
-#include <limits>
-#endif
-
-#ifndef _CPP_UTILITY
-#include <utility>
-#endif
-
-#include <SkScalar.h> // for SK_ScalarNaN
-#ifdef PREFIX_FOR_WEBCORE
-#include <SkTSearch.h>
-#endif
-
-#include <float.h>
-#include <math.h>
-#include <stdint.h>
-#include <stddef.h>
-
-#ifndef WCHAR_MAX
-	#define WCHAR_MAX	0xFFFF
-#endif
-
-namespace std
-{
-  template<typename _Tp>
-    inline void
-    swap(_Tp& __a, _Tp& __b)
-    {
-      _Tp __tmp = __a;
-      __a = __b;
-      __b = __tmp;
-    }
-
-  template<typename _Tp>
-    inline void
-    reverse(_Tp* __first, _Tp* __last)
-    {
-      while(true)
-      {
-        if (__first == __last || __first == --__last)
-          return;
-        else
-        {
-          _Tp __tmp = *__first;
-          *__first = *__last;
-          *__last = __tmp;
-        }
-        ++__first;
-      }
-    }
-
-  #undef min
-  #undef max
-
-  template<typename _Tp>
-    inline const _Tp&
-    min(const _Tp& __a, const _Tp& __b)
-    {
-      return __b < __a ? __b : __a;
-    }
-
-  template<typename _Tp>
-    inline const _Tp&
-    max(const _Tp& __a, const _Tp& __b)
-    {
-      return  __a < __b ? __b : __a;
-    }
-    
-template <class _InputIter, class _OutputIter>
-inline _OutputIter copy(_InputIter __first, _InputIter __last,
-                        _OutputIter __result)
-{
-  for (size_t __n = __last - __first; __n > 0; --__n) {
-    *__result = *__first;
-    ++__first;
-    ++__result;
-  }
-  return __result;
-}
-
-template <class _ForwardIter, class _Tp>
-void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __value) {
-  for ( ; __first != __last; ++__first)
-    *__first = __value;
-}
-
-#ifndef UINTPTR_MAX
-#define UINTPTR_MAX	UINT32_MAX
-#endif
-
-#ifndef UINT32_MAX
-#define UINT32_MAX    (0xffffffff)
-#endif
-
-template <typename T> 
-struct numeric_limits {
-    /// Returns the minimum value for type T.
-    static inline T min (void)		{ return (T(0)); }
-    /// Returns the minimum value for type T.
-    static inline T max (void)		{ return (T(0)); }
-    static const bool is_signed = false;	///< True if the type is signed.
-    static const bool is_integer = false;	///< True if stores an exact value.
-    static const bool is_integral = false;	///< True if fixed size and cast-copyable.
-};
-
-template <typename T>
-struct numeric_limits<T*> {
-    static inline T* min (void)	{ return (NULL); }
-    static inline T* max (void)	{ return (UINTPTR_MAX); }
-    static const bool is_signed = false;
-    static const bool is_integer = true;
-    static const bool is_integral = true;
-};
-
-#define _NUMERIC_LIMITS(type, minVal, maxVal, quietNaN, bSigned, bInteger, bIntegral)	\
-template <>							\
-struct numeric_limits<type> {					\
-    static inline type infinity (void)	{ return (maxVal); }	\
-    static inline type min (void)	{ return (minVal); }	\
-    static inline type max (void)	{ return (maxVal); }	\
-    static inline type quiet_NaN() { return (quietNaN); } \
-    static const bool is_signed = bSigned;			\
-    static const bool is_integer = bInteger;			\
-    static const bool is_integral = bIntegral;			\
-}
-
-//--------------------------------------------------------------------------------------
-//		         type		    min		    max		    NaN     signed	integer	integral
-//--------------------------------------------------------------------------------------
-_NUMERIC_LIMITS (bool,		    false,		true,		0,      false,	true,	true);
-_NUMERIC_LIMITS (char,		    SCHAR_MIN,	SCHAR_MAX,	0,      true,	true,	true);
-_NUMERIC_LIMITS (int,		    INT_MIN,	INT_MAX,	0,      true,	true,	true);
-_NUMERIC_LIMITS (short,		    SHRT_MIN,	SHRT_MAX,	0,      true,	true,	true);
-_NUMERIC_LIMITS (long,		    LONG_MIN,	LONG_MAX,	0,      true,	true,	true);
-#if HAVE_THREE_CHAR_TYPES
-_NUMERIC_LIMITS (signed char,	SCHAR_MIN,	SCHAR_MAX,	0,      true,	true,	true);
-#endif
-_NUMERIC_LIMITS (unsigned char,	0,		    UCHAR_MAX,	0,      false,	true,	true);
-_NUMERIC_LIMITS (unsigned int,	0,		    UINT_MAX,	0,      false,	true,	true);
-_NUMERIC_LIMITS (unsigned short,0,		    USHRT_MAX,	0,      false,	true,	true);
-_NUMERIC_LIMITS (unsigned long,	0,		    ULONG_MAX,	0,      false,	true,	true);
-_NUMERIC_LIMITS (wchar_t,	    0,		    WCHAR_MAX,	0,      false,	true,	true);
-_NUMERIC_LIMITS (float,		    FLT_MIN,	FLT_MAX,  SK_ScalarNaN, true,	false,	true);
-_NUMERIC_LIMITS (double,	    DBL_MIN,	DBL_MAX,  SK_ScalarNaN, true,	false,	true);
-_NUMERIC_LIMITS (long double,	LDBL_MIN,	LDBL_MAX, SK_ScalarNaN, true,	false,	true);
-#ifdef HAVE_LONG_LONG
-_NUMERIC_LIMITS (long long,	    LLONG_MIN,	LLONG_MAX,	0,      true,	true,	true);
-_NUMERIC_LIMITS (unsigned long long,	0,	ULLONG_MAX,	0,      false,	true,	true);
-#endif
-//--------------------------------------------------------------------------------------
-
-using ::ptrdiff_t;
-
-typedef bool (* Comparator)(const void*, const void*);
-extern void sort(const void** start, const void** end, Comparator comp);
-
-#ifdef PREFIX_FOR_WEBCORE
-    typedef const void* sortType;
-
-    inline bool binary_search(const unsigned short* const base,
-                              const unsigned short* const end,
-                              short target)
-    {
-        return SkTSearch<unsigned short>(base, end - base, target, sizeof(unsigned short)) >= 0;
-    }
-
-    
-    template<typename P> inline void sort (P** start, P**end,
-        bool (* comp)(const P*, const P*))
-    {
-        sort((const void**) start, (const void**) end, (Comparator) comp);
-    }
-    
-    template<typename P> void sort(P* start, P* end,
-            bool (* comp)(const P&, const P&)) {
-        stable_sort(start, end, *comp);
-    }
-
-    template<typename P> inline void stable_sort(P** start, P** end,
-       bool (* comp)(P*, P*))
-    {
-        sort((const void**) start, (const void**) end, (Comparator) comp);
-    }
-    
-    template<typename P> inline void stable_sort(P** start, P** end,
-       bool (& comp)(const P*, const P*))
-    {
-        sort((const void**) start, (const void**) end, (Comparator) &comp);
-    }
-    
-    template<typename P> void stable_sort(P* start, P* end, P* temp,
-            bool (& comp)(const P&, const P&)) {
-        size_t endlen = end - start;
-        size_t midlen = endlen / 2;
-        P* mid = start + midlen;
-        if (midlen > 1)
-            stable_sort(start, mid, temp, comp);
-        if (end - mid > 1)
-            stable_sort(mid, end, temp, comp);
-        memcpy(temp, start, midlen * sizeof(*start));
-        size_t i = 0;
-        size_t j = midlen;
-        size_t off = 0;
-        while (i < midlen && j < endlen) {
-            P* dst = (comp)(start[j], temp[i]) ? &start[j++] : &temp[i++];
-            memcpy(&start[off++], dst, sizeof(*start));
-        }
-        if (i < midlen)
-            memcpy(&start[off], &temp[i], (midlen - i) * sizeof(*start));
-    }
-
-    template<typename P> void stable_sort(P* start, P* end,
-            bool (& comp)(const P&, const P&)) {
-        if (end - start > 1) {
-            size_t count = (end - start) / 2;
-            P* temp = static_cast<P*>(malloc(count * sizeof(P)));
-            stable_sort(start, end, temp, comp);
-            free(temp);
-        }
-    }
-
-    template<typename P> void stable_sort(P* start, P* end,
-            bool (& comp)(P, P)) {
-	stable_sort(start, end, (bool (&)(const P&, const P&))(comp));
-    }
-   
-    class ostream {
-        int this_class_intentionally_left_empty;
-    };
-#endif
-
-}
-
-#endif
-
-#endif // __cplusplus
-
diff --git a/WebKit/android/stl/concept_checks.h b/WebKit/android/stl/concept_checks.h
deleted file mode 100644
index 72cc138..0000000
--- a/WebKit/android/stl/concept_checks.h
+++ /dev/null
@@ -1,812 +0,0 @@
-/*
- * Copyright 2009, The Android Open Source Project
- * Copyright (c) 1999
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
-
-#ifndef __CONCEPT_CHECKS_H
-#define __CONCEPT_CHECKS_H
-
-/*
-  Use these macro like assertions, but they assert properties
-  on types (usually template arguments). In technical terms they
-  verify whether a type "models" a "concept".
-
-  This set of requirements and the terminology used here is derived
-  from the book "Generic Programming and the STL" by Matt Austern
-  (Addison Wesley). For further information please consult that
-  book. The requirements also are intended to match the ANSI/ISO C++
-  standard.
-
-  This file covers the basic concepts and the iterator concepts.
-  There are several other files that provide the requirements
-  for the STL containers:
-    container_concepts.h
-    sequence_concepts.h
-    assoc_container_concepts.h
-
-  Jeremy Siek, 1999
-
-  TO DO:
-    - some issues with regards to concept classification and mutability
-      including AssociativeContianer -> ForwardContainer
-      and SortedAssociativeContainer -> ReversibleContainer
-    - HashedAssociativeContainer
-    - Allocator
-    - Function Object Concepts
-
-  */
-
-#ifndef __STL_USE_CONCEPT_CHECKS
-
-// Some compilers lack the features that are necessary for concept checks.
-// On those compilers we define the concept check macros to do nothing.
-#define __STL_REQUIRES(__type_var, __concept) do {} while(0)
-#define __STL_CLASS_REQUIRES(__type_var, __concept) \
-  static int  __##__type_var##_##__concept
-#define __STL_CONVERTIBLE(__type_x, __type_y) do {} while(0)
-#define __STL_REQUIRES_SAME_TYPE(__type_x, __type_y) do {} while(0)
-#define __STL_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
-  static int  __##__type_x##__type_y##_require_same_type
-#define __STL_GENERATOR_CHECK(__func, __ret) do {} while(0)
-#define __STL_CLASS_GENERATOR_CHECK(__func, __ret) \
-  static int  __##__func##__ret##_generator_check
-#define __STL_UNARY_FUNCTION_CHECK(__func, __ret, __arg) do {} while(0)
-#define __STL_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
-  static int  __##__func##__ret##__arg##_unary_function_check
-#define __STL_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
-  do {} while(0)
-#define __STL_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
-  static int  __##__func##__ret##__first##__second##_binary_function_check
-#define __STL_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
-  do {} while(0)
-#define __STL_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
-  static int __##__opname##__ret##__first##__second##_require_binary_op
-
-#else /* __STL_USE_CONCEPT_CHECKS */
-
-// This macro tests whether the template argument "__type_var"
-// satisfies the requirements of "__concept".  Here is a list of concepts
-// that we know how to check:
-//       _Allocator
-//       _Assignable
-//       _DefaultConstructible
-//       _EqualityComparable
-//       _LessThanComparable
-//       _TrivialIterator
-//       _InputIterator
-//       _OutputIterator
-//       _ForwardIterator
-//       _BidirectionalIterator
-//       _RandomAccessIterator
-//       _Mutable_TrivialIterator
-//       _Mutable_ForwardIterator
-//       _Mutable_BidirectionalIterator
-//       _Mutable_RandomAccessIterator
-
-#define __STL_REQUIRES(__type_var, __concept) \
-do { \
-  void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\
-    ::__concept##_requirement_violation; __x = __x; } while (0)
-
-// Use this to check whether type X is convertible to type Y
-#define __STL_CONVERTIBLE(__type_x, __type_y) \
-do { \
-  void (*__x)( __type_x , __type_y ) = _STL_CONVERT_ERROR< __type_x , \
-  __type_y >::__type_X_is_not_convertible_to_type_Y; \
-  __x = __x; } while (0)
-
-// Use this to test whether two template arguments are the same type
-#define __STL_REQUIRES_SAME_TYPE(__type_x, __type_y) \
-do { \
-  void (*__x)( __type_x , __type_y ) = _STL_SAME_TYPE_ERROR< __type_x, \
-    __type_y  >::__type_X_not_same_as_type_Y; \
-  __x = __x; } while (0)
-
-
-// function object checks
-#define __STL_GENERATOR_CHECK(__func, __ret) \
-do { \
-  __ret (*__x)( __func&) = \
-     _STL_GENERATOR_ERROR< \
-  __func, __ret>::__generator_requirement_violation; \
-  __x = __x; } while (0)
-
-
-#define __STL_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
-do { \
-  __ret (*__x)( __func&, const __arg& ) = \
-     _STL_UNARY_FUNCTION_ERROR< \
-  __func, __ret, __arg>::__unary_function_requirement_violation; \
-  __x = __x; } while (0)
-
-
-#define __STL_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
-do { \
-  __ret (*__x)( __func&, const __first&, const __second& ) = \
-     _STL_BINARY_FUNCTION_ERROR< \
-  __func, __ret, __first, __second>::__binary_function_requirement_violation; \
-  __x = __x; } while (0)
-
-
-#define __STL_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
-    do { \
-  __ret (*__x)( __first&, __second& ) = _STL_BINARY##__opname##_ERROR< \
-    __ret, __first, __second>::__binary_operator_requirement_violation; \
-  __ret (*__y)( const __first&, const __second& ) = \
-    _STL_BINARY##__opname##_ERROR< __ret, __first, __second>:: \
-      __const_binary_operator_requirement_violation; \
-  __y = __y; __x = __x; } while (0)
-
-
-#ifdef __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
-
-#define __STL_CLASS_REQUIRES(__type_var, __concept)
-#define __STL_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y)
-#define __STL_CLASS_GENERATOR_CHECK(__func, __ret)
-#define __STL_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg)
-#define __STL_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second)
-#define __STL_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second)
-
-#else
-
-// Use this macro inside of template classes, where you would
-// like to place requirements on the template arguments to the class
-// Warning: do not pass pointers and such (e.g. T*) in as the __type_var,
-// since the type_var is used to construct identifiers. Instead typedef
-// the pointer type, then use the typedef name for the __type_var.
-#define __STL_CLASS_REQUIRES(__type_var, __concept) \
-  typedef void (* __func##__type_var##__concept)( __type_var ); \
-  template <__func##__type_var##__concept _Tp1> \
-  struct __dummy_struct_##__type_var##__concept { }; \
-  static __dummy_struct_##__type_var##__concept< \
-    __concept##_concept_specification< \
-      __type_var>::__concept##_requirement_violation>  \
-  __dummy_ptr_##__type_var##__concept
-
-
-#define __STL_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
-  typedef void (* __func_##__type_x##__type_y##same_type)( __type_x, \
-                                                            __type_y ); \
-  template < __func_##__type_x##__type_y##same_type _Tp1> \
-  struct __dummy_struct_##__type_x##__type_y##_same_type { }; \
-  static __dummy_struct_##__type_x##__type_y##_same_type< \
-    _STL_SAME_TYPE_ERROR<__type_x, __type_y>::__type_X_not_same_as_type_Y>  \
-  __dummy_ptr_##__type_x##__type_y##_same_type
-
-
-#define __STL_CLASS_GENERATOR_CHECK(__func, __ret) \
-  typedef __ret (* __f_##__func##__ret##_generator)( __func& ); \
-  template <__f_##__func##__ret##_generator _Tp1> \
-  struct __dummy_struct_##__func##__ret##_generator { }; \
-  static __dummy_struct_##__func##__ret##_generator< \
-    _STL_GENERATOR_ERROR< \
-      __func, __ret>::__generator_requirement_violation>  \
-  __dummy_ptr_##__func##__ret##_generator
-
-
-#define __STL_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
-  typedef __ret (* __f_##__func##__ret##__arg##_unary_check)( __func&, \
-                                                         const __arg& ); \
-  template <__f_##__func##__ret##__arg##_unary_check _Tp1> \
-  struct __dummy_struct_##__func##__ret##__arg##_unary_check { }; \
-  static __dummy_struct_##__func##__ret##__arg##_unary_check< \
-    _STL_UNARY_FUNCTION_ERROR< \
-      __func, __ret, __arg>::__unary_function_requirement_violation>  \
-  __dummy_ptr_##__func##__ret##__arg##_unary_check
-
-
-#define __STL_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
-  typedef __ret (* __f_##__func##__ret##__first##__second##_binary_check)( __func&, const __first&,\
-                                                    const __second& ); \
-  template <__f_##__func##__ret##__first##__second##_binary_check _Tp1> \
-  struct __dummy_struct_##__func##__ret##__first##__second##_binary_check { }; \
-  static __dummy_struct_##__func##__ret##__first##__second##_binary_check< \
-    _STL_BINARY_FUNCTION_ERROR<__func, __ret, __first, __second>:: \
-  __binary_function_requirement_violation>  \
-  __dummy_ptr_##__func##__ret##__first##__second##_binary_check
-
-
-#define __STL_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
-  typedef __ret (* __f_##__func##__ret##__first##__second##_binary_op)(const __first&, \
-                                                    const __second& ); \
-  template <__f_##__func##__ret##__first##__second##_binary_op _Tp1> \
-  struct __dummy_struct_##__func##__ret##__first##__second##_binary_op { }; \
-  static __dummy_struct_##__func##__ret##__first##__second##_binary_op< \
-    _STL_BINARY##__opname##_ERROR<__ret, __first, __second>:: \
-  __binary_operator_requirement_violation>  \
-  __dummy_ptr_##__func##__ret##__first##__second##_binary_op
-
-#endif
-
-/* helper class for finding non-const version of a type. Need to have
-   something to assign to etc. when testing constant iterators. */
-
-template <class _Tp>
-struct _Mutable_trait {
-  typedef _Tp _Type;
-};
-template <class _Tp>
-struct _Mutable_trait<const _Tp> {
-  typedef _Tp _Type;
-};
-
-
-/* helper function for avoiding compiler warnings about unused variables */
-template <class _Type>
-void __sink_unused_warning(_Type) { }
-
-template <class _TypeX, class _TypeY>
-struct _STL_CONVERT_ERROR {
-  static void
-  __type_X_is_not_convertible_to_type_Y(_TypeX __x, _TypeY) {
-    _TypeY __y = __x;
-    __sink_unused_warning(__y);
-  }
-};
-
-
-template <class _Type> struct __check_equal { };
-
-template <class _TypeX, class _TypeY>
-struct _STL_SAME_TYPE_ERROR {
-  static void
-  __type_X_not_same_as_type_Y(_TypeX , _TypeY ) { 
-    __check_equal<_TypeX> t1 = __check_equal<_TypeY>();
-  }
-};
-
-
-// Some Functon Object Checks
-
-template <class _Func, class _Ret>
-struct _STL_GENERATOR_ERROR {
-  static _Ret __generator_requirement_violation(_Func& __f) {
-    return __f();
-  }
-};
-
-template <class _Func>
-struct _STL_GENERATOR_ERROR<_Func, void> {
-  static void __generator_requirement_violation(_Func& __f) {
-    __f();
-  }
-};
-
-
-template <class _Func, class _Ret, class _Arg>
-struct _STL_UNARY_FUNCTION_ERROR {
-  static _Ret
-  __unary_function_requirement_violation(_Func& __f,
-                                          const _Arg& __arg) {
-    return __f(__arg);
-  }
-};
-
-template <class _Func, class _Arg>
-struct _STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg> {
-  static void
-  __unary_function_requirement_violation(_Func& __f,
-                                          const _Arg& __arg) {
-    __f(__arg);
-  }
-};
-
-template <class _Func, class _Ret, class _First, class _Second>
-struct _STL_BINARY_FUNCTION_ERROR {
-  static _Ret
-  __binary_function_requirement_violation(_Func& __f,
-                                          const _First& __first, 
-                                          const _Second& __second) {
-    return __f(__first, __second);
-  }
-};
-
-template <class _Func, class _First, class _Second>
-struct _STL_BINARY_FUNCTION_ERROR<_Func, void, _First, _Second> {
-  static void
-  __binary_function_requirement_violation(_Func& __f,
-                                          const _First& __first, 
-                                          const _Second& __second) {
-    __f(__first, __second);
-  }
-};
-
-
-#define __STL_DEFINE_BINARY_OP_CHECK(_OP, _NAME) \
-template <class _Ret, class _First, class _Second> \
-struct _STL_BINARY##_NAME##_ERROR { \
-  static _Ret \
-  __const_binary_operator_requirement_violation(const _First& __first,  \
-                                                const _Second& __second) { \
-    return __first _OP __second; \
-  } \
-  static _Ret \
-  __binary_operator_requirement_violation(_First& __first,  \
-                                          _Second& __second) { \
-    return __first _OP __second; \
-  } \
-}
-
-__STL_DEFINE_BINARY_OP_CHECK(==, _OP_EQUAL);
-__STL_DEFINE_BINARY_OP_CHECK(!=, _OP_NOT_EQUAL);
-__STL_DEFINE_BINARY_OP_CHECK(<, _OP_LESS_THAN);
-__STL_DEFINE_BINARY_OP_CHECK(<=, _OP_LESS_EQUAL);
-__STL_DEFINE_BINARY_OP_CHECK(>, _OP_GREATER_THAN);
-__STL_DEFINE_BINARY_OP_CHECK(>=, _OP_GREATER_EQUAL);
-__STL_DEFINE_BINARY_OP_CHECK(+, _OP_PLUS);
-__STL_DEFINE_BINARY_OP_CHECK(*, _OP_TIMES);
-__STL_DEFINE_BINARY_OP_CHECK(/, _OP_DIVIDE);
-__STL_DEFINE_BINARY_OP_CHECK(-, _OP_SUBTRACT);
-__STL_DEFINE_BINARY_OP_CHECK(%, _OP_MOD);
-// ...
-
-// TODO, add unary operators (prefix and postfix)
-
-/*
-  The presence of this class is just to trick EDG into displaying
-  these error messages before any other errors. Without the
-  classes, the errors in the functions get reported after
-  other class errors deep inside the library. The name
-  choice just makes for an eye catching error message :)
- */
-struct _STL_ERROR {
-
-  template <class _Type>
-  static _Type
-  __default_constructor_requirement_violation(_Type) {
-    return _Type();
-  }
-  template <class _Type>
-  static _Type
-  __assignment_operator_requirement_violation(_Type __a) {
-    __a = __a;
-    return __a;
-  }
-  template <class _Type>
-  static _Type
-  __copy_constructor_requirement_violation(_Type __a) {
-    _Type __c(__a);
-    return __c;
-  }
-  template <class _Type>
-  static _Type
-  __const_parameter_required_for_copy_constructor(_Type /* __a */, 
-                                                  const _Type& __b) {
-    _Type __c(__b);
-    return __c;
-  }
-  template <class _Type>
-  static _Type
-  __const_parameter_required_for_assignment_operator(_Type __a, 
-                                                     const _Type& __b) {
-    __a = __b;
-    return __a;
-  }
-  template <class _Type>
-  static _Type
-  __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
-    if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
-    return __b;
-  }
-  template <class _Type>
-  static _Type
-  __equality_comparable_requirement_violation(_Type __a, _Type __b) {
-    if (__a == __b || __a != __b) return __a;
-    return __b;
-  }
-  template <class _Iterator>
-  static void
-  __dereference_operator_requirement_violation(_Iterator __i) {
-    __sink_unused_warning(*__i);
-  }
-  template <class _Iterator>
-  static void
-  __dereference_operator_and_assignment_requirement_violation(_Iterator __i) {
-    *__i = *__i;
-  }
-  template <class _Iterator>
-  static void
-  __preincrement_operator_requirement_violation(_Iterator __i) {
-    ++__i;
-  }
-  template <class _Iterator>
-  static void
-  __postincrement_operator_requirement_violation(_Iterator __i) {
-    __i++;
-  }
-  template <class _Iterator>
-  static void
-  __predecrement_operator_requirement_violation(_Iterator __i) {
-    --__i;
-  }
-  template <class _Iterator>
-  static void
-  __postdecrement_operator_requirement_violation(_Iterator __i) {
-    __i--;
-  }
-  template <class _Iterator, class _Type>
-  static void
-  __postincrement_operator_and_assignment_requirement_violation(_Iterator __i,
-                                                                _Type __t) {
-    *__i++ = __t;
-  }
-  template <class _Iterator, class _Distance>
-  static _Iterator
-  __iterator_addition_assignment_requirement_violation(_Iterator __i, 
-                                                       _Distance __n) {
-    __i += __n;
-    return __i;
-  }
-  template <class _Iterator, class _Distance>
-  static _Iterator
-  __iterator_addition_requirement_violation(_Iterator __i, _Distance __n) {
-    __i = __i + __n;
-    __i = __n + __i;
-    return __i;
-  }
-  template <class _Iterator, class _Distance>
-  static _Iterator
-  __iterator_subtraction_assignment_requirement_violation(_Iterator __i,
-                                                          _Distance __n) {
-    __i -= __n;
-    return __i;
-  }
-  template <class _Iterator, class _Distance>
-  static _Iterator
-  __iterator_subtraction_requirement_violation(_Iterator __i, _Distance __n) {
-    __i = __i - __n;
-    return __i;
-  }
-  template <class _Iterator, class _Distance>
-  static _Distance
-  __difference_operator_requirement_violation(_Iterator __i, _Iterator __j,
-                                              _Distance __n) {
-    __n = __i - __j;
-    return __n;
-  }
-  template <class _Exp, class _Type, class _Distance>
-  static _Type
-  __element_access_operator_requirement_violation(_Exp __x, _Type*,
-                                                  _Distance __n) {
-    return __x[__n];
-  }
-  template <class _Exp, class _Type, class _Distance>
-  static void
-  __element_assignment_operator_requirement_violation(_Exp __x,
-                                                      _Type* __t,
-                                                      _Distance __n) {
-    __x[__n] = *__t;
-  }
-
-}; /* _STL_ERROR */
-
-/* Associated Type Requirements */
-
-__STL_BEGIN_NAMESPACE
-template <class _Iterator> struct iterator_traits;
-__STL_END_NAMESPACE
-
-template <class _Iter> 
-struct __value_type_type_definition_requirement_violation {
-  typedef typename __STD::iterator_traits<_Iter>::value_type value_type;
-};
-
-template <class _Iter> 
-struct __difference_type_type_definition_requirement_violation {
-  typedef typename __STD::iterator_traits<_Iter>::difference_type
-          difference_type;
-};
-
-template <class _Iter> 
-struct __reference_type_definition_requirement_violation {
-  typedef typename __STD::iterator_traits<_Iter>::reference reference;
-};
-
-template <class _Iter> 
-struct __pointer_type_definition_requirement_violation {
-  typedef typename __STD::iterator_traits<_Iter>::pointer pointer;
-};
-
-template <class _Iter> 
-struct __iterator_category_type_definition_requirement_violation {
-  typedef typename __STD::iterator_traits<_Iter>::iterator_category 
-          iterator_category;
-};
-
-/* Assignable Requirements */
-
-
-template <class _Type>
-struct _Assignable_concept_specification {
-  static void _Assignable_requirement_violation(_Type __a) {
-    _STL_ERROR::__assignment_operator_requirement_violation(__a);
-    _STL_ERROR::__copy_constructor_requirement_violation(__a);
-    _STL_ERROR::__const_parameter_required_for_copy_constructor(__a,__a);
-    _STL_ERROR::__const_parameter_required_for_assignment_operator(__a,__a);
-  }
-};
-
-/* DefaultConstructible Requirements */
-
-
-template <class _Type>
-struct _DefaultConstructible_concept_specification {
-  static void _DefaultConstructible_requirement_violation(_Type __a) {
-    _STL_ERROR::__default_constructor_requirement_violation(__a);
-  }
-};
-
-/* EqualityComparable Requirements */
-
-template <class _Type>
-struct _EqualityComparable_concept_specification {
-  static void _EqualityComparable_requirement_violation(_Type __a) {
-    _STL_ERROR::__equality_comparable_requirement_violation(__a, __a);
-  }
-};
-
-/* LessThanComparable Requirements */
-template <class _Type>
-struct _LessThanComparable_concept_specification {
-  static void _LessThanComparable_requirement_violation(_Type __a) {
-    _STL_ERROR::__less_than_comparable_requirement_violation(__a, __a);
-  }
-};
-
-/* TrivialIterator Requirements */
-
-template <class _TrivialIterator>
-struct _TrivialIterator_concept_specification {
-static void
-_TrivialIterator_requirement_violation(_TrivialIterator __i) {
-  typedef typename
-    __value_type_type_definition_requirement_violation<_TrivialIterator>::
-    value_type __T;
-  // Refinement of Assignable
-  _Assignable_concept_specification<_TrivialIterator>::
-    _Assignable_requirement_violation(__i);
-  // Refinement of DefaultConstructible
-  _DefaultConstructible_concept_specification<_TrivialIterator>::
-    _DefaultConstructible_requirement_violation(__i);
-  // Refinement of EqualityComparable
-  _EqualityComparable_concept_specification<_TrivialIterator>::
-    _EqualityComparable_requirement_violation(__i);
-  // Valid Expressions
-  _STL_ERROR::__dereference_operator_requirement_violation(__i);
-}
-};
-
-template <class _TrivialIterator>
-struct _Mutable_TrivialIterator_concept_specification {
-static void
-_Mutable_TrivialIterator_requirement_violation(_TrivialIterator __i) {
-  _TrivialIterator_concept_specification<_TrivialIterator>::
-    _TrivialIterator_requirement_violation(__i);
-  // Valid Expressions
-  _STL_ERROR::__dereference_operator_and_assignment_requirement_violation(__i);
-}
-};
-
-/* InputIterator Requirements */
-
-template <class _InputIterator>
-struct _InputIterator_concept_specification {
-static void
-_InputIterator_requirement_violation(_InputIterator __i) {
-  // Refinement of TrivialIterator
-  _TrivialIterator_concept_specification<_InputIterator>::
-    _TrivialIterator_requirement_violation(__i);
-  // Associated Types
-  __difference_type_type_definition_requirement_violation<_InputIterator>();
-  __reference_type_definition_requirement_violation<_InputIterator>();
-  __pointer_type_definition_requirement_violation<_InputIterator>();
-  __iterator_category_type_definition_requirement_violation<_InputIterator>();
-  // Valid Expressions
-  _STL_ERROR::__preincrement_operator_requirement_violation(__i);
-  _STL_ERROR::__postincrement_operator_requirement_violation(__i);
-}
-};
-
-/* OutputIterator Requirements */
-
-template <class _OutputIterator>
-struct _OutputIterator_concept_specification {
-static void
-_OutputIterator_requirement_violation(_OutputIterator __i) {
-  // Refinement of Assignable
-  _Assignable_concept_specification<_OutputIterator>::
-    _Assignable_requirement_violation(__i);
-  // Associated Types
-  __iterator_category_type_definition_requirement_violation<_OutputIterator>();
-  // Valid Expressions
-  _STL_ERROR::__dereference_operator_requirement_violation(__i);
-  _STL_ERROR::__preincrement_operator_requirement_violation(__i);
-  _STL_ERROR::__postincrement_operator_requirement_violation(__i);
-  _STL_ERROR::
-    __postincrement_operator_and_assignment_requirement_violation(__i, *__i);
-}
-};
-
-/* ForwardIterator Requirements */
-
-template <class _ForwardIterator>
-struct _ForwardIterator_concept_specification {
-static void
-_ForwardIterator_requirement_violation(_ForwardIterator __i) {
-  // Refinement of InputIterator
-  _InputIterator_concept_specification<_ForwardIterator>::
-    _InputIterator_requirement_violation(__i);
-}
-};
-
-template <class _ForwardIterator>
-struct _Mutable_ForwardIterator_concept_specification {
-static void
-_Mutable_ForwardIterator_requirement_violation(_ForwardIterator __i) {
-  _ForwardIterator_concept_specification<_ForwardIterator>::
-    _ForwardIterator_requirement_violation(__i);
-  // Refinement of OutputIterator
-  _OutputIterator_concept_specification<_ForwardIterator>::
-    _OutputIterator_requirement_violation(__i);
-}
-};
-
-/* BidirectionalIterator Requirements */
-
-template <class _BidirectionalIterator>
-struct _BidirectionalIterator_concept_specification {
-static void
-_BidirectionalIterator_requirement_violation(_BidirectionalIterator __i) {
-  // Refinement of ForwardIterator
-  _ForwardIterator_concept_specification<_BidirectionalIterator>::
-    _ForwardIterator_requirement_violation(__i);
-  // Valid Expressions
-  _STL_ERROR::__predecrement_operator_requirement_violation(__i);
-  _STL_ERROR::__postdecrement_operator_requirement_violation(__i);
-}
-};
-
-template <class _BidirectionalIterator>
-struct _Mutable_BidirectionalIterator_concept_specification {
-static void
-_Mutable_BidirectionalIterator_requirement_violation(
-       _BidirectionalIterator __i)
-{
-  _BidirectionalIterator_concept_specification<_BidirectionalIterator>::
-    _BidirectionalIterator_requirement_violation(__i);
-  // Refinement of mutable_ForwardIterator
-  _Mutable_ForwardIterator_concept_specification<_BidirectionalIterator>::
-    _Mutable_ForwardIterator_requirement_violation(__i);
-  typedef typename
-    __value_type_type_definition_requirement_violation<
-    _BidirectionalIterator>::value_type __T;
-  typename _Mutable_trait<__T>::_Type* __tmp_ptr = 0;
-  // Valid Expressions
-  _STL_ERROR::
-    __postincrement_operator_and_assignment_requirement_violation(__i,
-                                                                  *__tmp_ptr);
-}
-};
-
-/* RandomAccessIterator Requirements */
-
-template <class _RandAccIter>
-struct _RandomAccessIterator_concept_specification {
-static void
-_RandomAccessIterator_requirement_violation(_RandAccIter __i) {
-  // Refinement of BidirectionalIterator
-  _BidirectionalIterator_concept_specification<_RandAccIter>::
-    _BidirectionalIterator_requirement_violation(__i);
-  // Refinement of LessThanComparable
-  _LessThanComparable_concept_specification<_RandAccIter>::
-    _LessThanComparable_requirement_violation(__i);
-  typedef typename 
-        __value_type_type_definition_requirement_violation<_RandAccIter>
-        ::value_type
-    value_type;
-  typedef typename
-        __difference_type_type_definition_requirement_violation<_RandAccIter>
-        ::difference_type 
-    _Dist;
-  typedef typename _Mutable_trait<_Dist>::_Type _MutDist;
-
-  // Valid Expressions
-  _STL_ERROR::__iterator_addition_assignment_requirement_violation(__i,
-                                                                   _MutDist());
-  _STL_ERROR::__iterator_addition_requirement_violation(__i,
-                                                        _MutDist());
-  _STL_ERROR::
-    __iterator_subtraction_assignment_requirement_violation(__i,
-                                                            _MutDist());
-  _STL_ERROR::__iterator_subtraction_requirement_violation(__i,
-                                                           _MutDist());
-  _STL_ERROR::__difference_operator_requirement_violation(__i, __i,
-                                                          _MutDist());
-  typename _Mutable_trait<value_type>::_Type* __dummy_ptr = 0;
-  _STL_ERROR::__element_access_operator_requirement_violation(__i,
-                                                              __dummy_ptr,
-                                                              _MutDist());
-}
-};
-
-template <class _RandAccIter>
-struct _Mutable_RandomAccessIterator_concept_specification {
-static void
-_Mutable_RandomAccessIterator_requirement_violation(_RandAccIter __i)
-{
-  _RandomAccessIterator_concept_specification<_RandAccIter>::
-    _RandomAccessIterator_requirement_violation(__i);
-  // Refinement of mutable_BidirectionalIterator
-  _Mutable_BidirectionalIterator_concept_specification<_RandAccIter>::
-    _Mutable_BidirectionalIterator_requirement_violation(__i);
-  typedef typename
-        __value_type_type_definition_requirement_violation<_RandAccIter>
-        ::value_type
-    value_type;
-  typedef typename
-        __difference_type_type_definition_requirement_violation<_RandAccIter>
-        ::difference_type
-    _Dist;
-
-  typename _Mutable_trait<value_type>::_Type* __tmp_ptr = 0;
-  // Valid Expressions
-  _STL_ERROR::__element_assignment_operator_requirement_violation(__i,
-                  __tmp_ptr, _Dist());
-}
-};
-
-#define __STL_TYPEDEF_REQUIREMENT(__REQUIREMENT) \
-template <class Type> \
-struct __##__REQUIREMENT##__typedef_requirement_violation { \
-  typedef typename Type::__REQUIREMENT __REQUIREMENT; \
-}
-
-__STL_TYPEDEF_REQUIREMENT(value_type);
-__STL_TYPEDEF_REQUIREMENT(difference_type);
-__STL_TYPEDEF_REQUIREMENT(size_type);
-__STL_TYPEDEF_REQUIREMENT(reference);
-__STL_TYPEDEF_REQUIREMENT(const_reference);
-__STL_TYPEDEF_REQUIREMENT(pointer);
-__STL_TYPEDEF_REQUIREMENT(const_pointer);
-
-
-template <class _Alloc>
-struct _Allocator_concept_specification {
-static void
-_Allocator_requirement_violation(_Alloc __a) {
-  // Refinement of DefaultConstructible
-  _DefaultConstructible_concept_specification<_Alloc>::
-    _DefaultConstructible_requirement_violation(__a);
-  // Refinement of EqualityComparable
-  _EqualityComparable_concept_specification<_Alloc>::
-    _EqualityComparable_requirement_violation(__a);
-  // Associated Types
-  __value_type__typedef_requirement_violation<_Alloc>();
-  __difference_type__typedef_requirement_violation<_Alloc>();
-  __size_type__typedef_requirement_violation<_Alloc>();
-  __reference__typedef_requirement_violation<_Alloc>();
-  __const_reference__typedef_requirement_violation<_Alloc>();
-  __pointer__typedef_requirement_violation<_Alloc>();
-  __const_pointer__typedef_requirement_violation<_Alloc>();
-  typedef typename _Alloc::value_type _Tp;
-  //__STL_REQUIRES_SAME_TYPE(typename _Alloc::__STL_TEMPLATE rebind<_Tp>::other,
-  //                         _Alloc);
-}
-};
-
-#endif /* __STL_USE_CONCEPT_CHECKS */
-
-#endif /* __CONCEPT_CHECKS_H */
-
-// Local Variables:
-// mode:C++
-// End:
diff --git a/WebKit/android/stl/cstring b/WebKit/android/stl/cstring
deleted file mode 100644
index 77c9175..0000000
--- a/WebKit/android/stl/cstring
+++ /dev/null
@@ -1,128 +0,0 @@
-// -*- C++ -*- forwarding header.
-
-// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
-// Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library is free
-// software; you can redistribute it and/or modify it under the
-// terms of the GNU General Public License as published by the
-// Free Software Foundation; either version 2, or (at your option)
-// any later version.
-
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU General Public License for more details.
-
-// You should have received a copy of the GNU General Public License along
-// with this library; see the file COPYING.  If not, write to the Free
-// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-// USA.
-
-// As a special exception, you may use this file as part of a free software
-// library without restriction.  Specifically, if other files instantiate
-// templates or use macros or inline functions from this file, or you compile
-// this file and link it with other files to produce an executable, this
-// file does not by itself cause the resulting executable to be covered by
-// the GNU General Public License.  This exception does not however
-// invalidate any other reasons why the executable file might be covered by
-// the GNU General Public License.
-
-//
-// ISO C++ 14882: 20.4.6  C library
-//
-
-/** @file cstring
- *  This is a Standard C++ Library file.  You should @c #include this file
- *  in your programs, rather than any of the "*.h" implementation files.
- *
- *  This is the C++ version of the Standard C Library header @c string.h,
- *  and its contents are (mostly) the same as that header, but are all
- *  contained in the namespace @c std.
- */
-
-#ifndef _GLIBCXX_CSTRING
-#define _GLIBCXX_CSTRING 1
-
-#pragma GCC system_header
-
-#include <cstddef>
-
-#include <string.h>
-
-// Get rid of those macros defined in <string.h> in lieu of real functions.
-#undef memcpy
-#undef memmove
-#undef strcpy
-#undef strncpy
-#undef strcat
-#undef strncat
-#undef memcmp
-#undef strcmp
-#undef strcoll
-#undef strncmp
-#undef strxfrm
-#undef memchr
-#undef strchr
-#undef strcspn
-#undef strpbrk
-#undef strrchr
-#undef strspn
-#undef strstr
-#undef strtok
-#undef memset
-#undef strerror
-#undef strlen
-
-namespace std
-{
-  using ::memcpy;
-  using ::memmove;
-  using ::strcpy;
-  using ::strncpy;
-  using ::strcat;
-  using ::strncat;
-  using ::memcmp;
-  using ::strcmp;
-//  using ::strcoll;
-  using ::strncmp;
-//  using ::strxfrm;
-  using ::strcspn;
-  using ::strspn;
-  using ::strtok;
-  using ::memset;
-  using ::strerror;
-  using ::strlen;
-
-  using ::memchr;
-
-  inline void*
-  memchr(void* __p, int __c, size_t __n)
-  { return memchr(const_cast<const void*>(__p), __c, __n); }
-
-  using ::strchr;
-
-  inline char*
-  strchr(char* __s1, int __n)
-  { return __builtin_strchr(const_cast<const char*>(__s1), __n); }
-
-  using ::strpbrk;
-
-  inline char*
-  strpbrk(char* __s1, const char* __s2)
-  { return __builtin_strpbrk(const_cast<const char*>(__s1), __s2); }
-
-  using ::strrchr;
-
-  inline char*
-  strrchr(char* __s1, int __n)
-  { return __builtin_strrchr(const_cast<const char*>(__s1), __n); }
-
-  using ::strstr;
-
-  inline char*
-  strstr(char* __s1, const char* __s2)
-  { return __builtin_strstr(const_cast<const char*>(__s1), __s2); }
-}
-
-#endif
diff --git a/WebKit/android/stl/heap.h b/WebKit/android/stl/heap.h
deleted file mode 100644
index 70d2249..0000000
--- a/WebKit/android/stl/heap.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *
- * Copyright 2009, The Android Open Source Project
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- * Copyright (c) 1997
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
-
-#ifndef __SGI_STL_HEAP_H
-#define __SGI_STL_HEAP_H
-
-#include <concept_checks.h>
-#include <stl_config.h>
-#include <stl_heap.h>
-
-#ifdef __STL_USE_NAMESPACES
-
-using __STD::push_heap;
-using __STD::pop_heap;
-using __STD::make_heap;
-using __STD::sort_heap;
-
-#endif /* __STL_USE_NAMESPACES */
-
-
-#endif /* __SGI_STL_HEAP_H */
-
-// Local Variables:
-// mode:C++
-// End:
diff --git a/WebKit/android/stl/memory b/WebKit/android/stl/memory
deleted file mode 100644
index b224c33..0000000
--- a/WebKit/android/stl/memory
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 1997-1999
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- */
-
-//minimal file to get build to work
-
-#ifdef _CPP_MEMORY
-#error "real STL defined"
-#endif
-
-#ifndef __ANDROID_MEMORY
-#define __ANDROID_MEMORY
-//we good to do this?
-#define __STL_MEMBER_TEMPLATES
-
-#define __STL_NOTHROW
-
-/*#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \*/
-
-#if defined(__STL_MEMBER_TEMPLATES)
-template<class _Tp1> struct auto_ptr_ref {
-  _Tp1* _M_ptr;
-  auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {}
-};
-#endif
-
-namespace std {
-
-template <class _Tp> class auto_ptr {
-private:
-  _Tp* _M_ptr;
-
-public:
-  typedef _Tp element_type;
-
-  explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
-  auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
-
-#ifdef __STL_MEMBER_TEMPLATES
-  template <class _Tp1> auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
-    : _M_ptr(__a.release()) {}
-#endif /* __STL_MEMBER_TEMPLATES */
-
-  auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
-    if (&__a != this) {
-      delete _M_ptr;
-      _M_ptr = __a.release();
-    }
-    return *this;
-  }
-
-#ifdef __STL_MEMBER_TEMPLATES
-  template <class _Tp1>
-  auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
-    if (__a.get() != this->get()) {
-      delete _M_ptr;
-      _M_ptr = __a.release();
-    }
-    return *this;
-  }
-#endif /* __STL_MEMBER_TEMPLATES */
-
-  // Note: The C++ standard says there is supposed to be an empty throw
-  // specification here, but omitting it is standard conforming.  Its 
-  // presence can be detected only if _Tp::~_Tp() throws, but (17.4.3.6/2)
-  // this is prohibited.
-  ~auto_ptr() { delete _M_ptr; }
-
-  _Tp& operator*() const __STL_NOTHROW {
-    return *_M_ptr;
-  }
-  _Tp* operator->() const __STL_NOTHROW {
-    return _M_ptr;
-  }
-  _Tp* get() const __STL_NOTHROW {
-    return _M_ptr;
-  }
-  _Tp* release() __STL_NOTHROW {
-    _Tp* __tmp = _M_ptr;
-    _M_ptr = 0;
-    return __tmp;
-  }
-  void reset(_Tp* __p = 0) __STL_NOTHROW {
-    if (__p != _M_ptr) {
-      delete _M_ptr;
-      _M_ptr = __p;
-    }
-  }
-
-/*#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \*/
-#if defined(__STL_MEMBER_TEMPLATES)
-
-public:
-  auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
-    : _M_ptr(__ref._M_ptr) {}
-
-  auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW {
-    if (__ref._M_ptr != this->get()) {
-      delete _M_ptr;
-      _M_ptr = __ref._M_ptr;
-    }
-    return *this;
-  }
-
-  template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW 
-    { return auto_ptr_ref<_Tp1>(this->release()); }
-  template <class _Tp1> operator auto_ptr<_Tp1>() __STL_NOTHROW
-    { return auto_ptr<_Tp1>(this->release()); }
-
-#endif /* auto ptr conversions && member templates */
-
-};
-
-}   //namespace std
-
-#endif /* __ANDROID_MEMORY */
-
-
-// Local Variables:
-// mode:C++
-// End:
-
diff --git a/WebKit/android/stl/new.h b/WebKit/android/stl/new.h
deleted file mode 100644
index 599a890..0000000
--- a/WebKit/android/stl/new.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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 APPLE COMPUTER, 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.
- */
-
diff --git a/WebKit/android/stl/stl_config.h b/WebKit/android/stl/stl_config.h
deleted file mode 100644
index 448babc..0000000
--- a/WebKit/android/stl/stl_config.h
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- *
- * Copyright 2009, The Android Open Source Project
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- * Copyright (c) 1997
- * Silicon Graphics
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- */
-
-#ifndef __STL_CONFIG_H
-# define __STL_CONFIG_H
-
-// Flags:
-// * __STL_NO_BOOL: defined if the compiler doesn't have bool as a builtin
-//   type.
-// * __STL_HAS_WCHAR_T: defined if the compier has wchar_t as a builtin type.
-// * __STL_NO_DRAND48: defined if the compiler doesn't have the drand48 
-//   function.
-// * __STL_STATIC_TEMPLATE_MEMBER_BUG: defined if the compiler can't handle
-//   static members of template classes.
-// * __STL_STATIC_CONST_INIT_BUG: defined if the compiler can't handle a
-//   constant-initializer in the declaration of a static const data member
-//   of integer type.  (See section 9.4.2, paragraph 4, of the C++ standard.)
-// * __STL_CLASS_PARTIAL_SPECIALIZATION: defined if the compiler supports
-//   partial specialization of template classes.
-// * __STL_PARTIAL_SPECIALIZATION_SYNTAX: defined if the compiler 
-//   supports partial specialization syntax for full specialization of
-//   class templates.  (Even if it doesn't actually support partial 
-//   specialization itself.)
-// * __STL_FUNCTION_TMPL_PARTIAL_ORDER: defined if the compiler supports
-//   partial ordering of function templates.  (a.k.a partial specialization
-//   of function templates.)
-// * __STL_MEMBER_TEMPLATES: defined if the compiler supports template
-//   member functions of classes.
-// * __STL_MEMBER_TEMPLATE_CLASSES: defined if the compiler supports 
-//   nested classes that are member templates of other classes.
-// * __STL_TEMPLATE_FRIENDS: defined if the compiler supports templatized
-//   friend declarations.
-// * __STL_EXPLICIT_FUNCTION_TMPL_ARGS: defined if the compiler 
-//   supports calling a function template by providing its template
-//   arguments explicitly.
-// * __STL_LIMITED_DEFAULT_TEMPLATES: defined if the compiler is unable
-//   to handle default template parameters that depend on previous template
-//   parameters.
-// * __STL_NON_TYPE_TMPL_PARAM_BUG: defined if the compiler has trouble with
-//   function template argument deduction for non-type template parameters.
-// * __SGI_STL_NO_ARROW_OPERATOR: defined if the compiler is unable
-//   to support the -> operator for iterators.
-// * __STL_DEFAULT_CONSTRUCTOR_BUG: defined if T() does not work properly
-//   when T is a builtin type.
-// * __STL_USE_EXCEPTIONS: defined if the compiler (in the current compilation
-//   mode) supports exceptions.
-// * __STL_USE_NAMESPACES: defined if the compiler has the necessary
-//   support for namespaces.
-// * __STL_NO_EXCEPTION_HEADER: defined if the compiler does not have a
-//   standard-conforming header <exception>.
-// * __STL_NO_BAD_ALLOC: defined if the compiler does not have a <new>
-//   header, or if <new> does not contain a bad_alloc class.  If a bad_alloc
-//   class exists, it is assumed to be in namespace std.
-// * __STL_SGI_THREADS: defined if this is being compiled for an SGI IRIX
-//   system in multithreaded mode, using native SGI threads instead of 
-//   pthreads.
-// * __STL_WIN32THREADS: defined if this is being compiled on a WIN32
-//   compiler in multithreaded mode.
-// * __STL_PTHREADS: defined if we should use portable pthreads
-//   synchronization.
-// * __STL_UITHREADS: defined if we should use UI / solaris / UnixWare threads
-//   synchronization.  UIthreads are similar to pthreads, but are based 
-//   on an earlier version of the Posix threads standard.
-// * __STL_LONG_LONG if the compiler has long long and unsigned long long
-//   types.  (They're not in the C++ standard, but they are expected to be 
-//   included in the forthcoming C9X standard.)
-// * __STL_THREADS is defined if thread safety is needed.
-// * __STL_VOLATILE is defined to be "volatile" if threads are being
-//   used, and the empty string otherwise.
-// * __STL_USE_CONCEPT_CHECKS enables some extra compile-time error
-//   checking to make sure that user-defined template arguments satisfy
-//   all of the appropriate requirements.  This may result in more
-//   comprehensible error messages.  It incurs no runtime overhead.  This 
-//   feature requires member templates and partial specialization.
-// * __STL_NO_USING_CLAUSE_IN_CLASS: The compiler does not handle "using"
-//   clauses inside of class definitions.
-// * __STL_NO_FRIEND_TEMPLATE_CLASS: The compiler does not handle friend
-//   declaractions where the friend is a template class.
-// * __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE: The compiler does not
-//   support the use of a function pointer type as the argument
-//   for a template.
-// * __STL_MEMBER_TEMPLATE_KEYWORD: standard C++ requires the template
-//   keyword in a few new places (14.2.4).  This flag is set for
-//   compilers that support (and require) this usage.
-
-
-// User-settable macros that control compilation:
-// * __STL_USE_SGI_ALLOCATORS: if defined, then the STL will use older
-//   SGI-style allocators, instead of standard-conforming allocators,
-//   even if the compiler supports all of the language features needed
-//   for standard-conforming allocators.
-// * __STL_NO_NAMESPACES: if defined, don't put the library in namespace
-//   std, even if the compiler supports namespaces.
-// * __STL_NO_RELOPS_NAMESPACE: if defined, don't put the relational
-//   operator templates (>, <=. >=, !=) in namespace std::rel_ops, even
-//   if the compiler supports namespaces and partial ordering of
-//   function templates.
-// * __STL_ASSERTIONS: if defined, then enable runtime checking through the
-//   __stl_assert macro.
-// * _PTHREADS: if defined, use Posix threads for multithreading support.
-// * _UITHREADS:if defined, use SCO/Solaris/UI threads for multithreading 
-//   support
-// * _NOTHREADS: if defined, don't use any multithreading support.  
-// * _STL_NO_CONCEPT_CHECKS: if defined, disables the error checking that
-//   we get from __STL_USE_CONCEPT_CHECKS.
-// * __STL_USE_NEW_IOSTREAMS: if defined, then the STL will use new,
-//   standard-conforming iostreams (e.g. the <iosfwd> header).  If not
-//   defined, the STL will use old cfront-style iostreams (e.g. the
-//   <iostream.h> header).
-
-// Other macros defined by this file:
-
-// * bool, true, and false, if __STL_NO_BOOL is defined.
-// * typename, as a null macro if it's not already a keyword.
-// * explicit, as a null macro if it's not already a keyword.
-// * namespace-related macros (__STD, __STL_BEGIN_NAMESPACE, etc.)
-// * exception-related macros (__STL_TRY, __STL_UNWIND, etc.)
-// * __stl_assert, either as a test or as a null macro, depending on
-//   whether or not __STL_ASSERTIONS is defined.
-
-# if defined(_PTHREADS) && !defined(_NOTHREADS)
-#     define __STL_PTHREADS
-# endif
-
-# if defined(_UITHREADS) && !defined(_PTHREADS) && !defined(_NOTHREADS)
-#     define __STL_UITHREADS
-# endif
-
-# if defined(__sgi) && !defined(__GNUC__)
-#   include <standards.h>
-#   if !defined(_BOOL)
-#     define __STL_NO_BOOL
-#   endif
-#   if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
-#     define __STL_STATIC_CONST_INIT_BUG
-#   endif
-#   if defined(_WCHAR_T_IS_KEYWORD)
-#     define __STL_HAS_WCHAR_T 
-#   endif
-#   if !defined(_TYPENAME_IS_KEYWORD)
-#     define __STL_NEED_TYPENAME
-#   endif
-#   ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES
-#     define __STL_CLASS_PARTIAL_SPECIALIZATION
-#   endif
-#   if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
-#     define __STL_FUNCTION_TMPL_PARTIAL_ORDER
-#   endif
-#   ifdef _MEMBER_TEMPLATES
-#     define __STL_MEMBER_TEMPLATES
-#     define __STL_TEMPLATE_FRIENDS
-#     define __STL_MEMBER_TEMPLATE_CLASSES
-#   endif
-#   if defined(_MEMBER_TEMPLATE_KEYWORD)
-#     define __STL_MEMBER_TEMPLATE_KEYWORD
-#   endif
-#   if defined(_STANDARD_C_PLUS_PLUS)
-#     define __STL_EXPLICIT_FUNCTION_TMPL_ARGS
-#   endif
-#   if (_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32
-#     define __STL_MEMBER_TEMPLATE_KEYWORD
-#   endif
-#   if COMPILER_VERSION < 720 || (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32)
-#     define __STL_DEFAULT_CONSTRUCTOR_BUG
-#   endif
-#   if !defined(_EXPLICIT_IS_KEYWORD)
-#     define __STL_NEED_EXPLICIT
-#   endif
-#   ifdef __EXCEPTIONS
-#     define __STL_USE_EXCEPTIONS
-#   endif
-#   if (_COMPILER_VERSION >= 721) && defined(_NAMESPACES)
-#     define __STL_HAS_NAMESPACES
-#   endif 
-#   if (_COMPILER_VERSION < 721) || \
-    !defined(__STL_HAS_NAMESPACES) || defined(__STL_NO_NAMESPACES)
-#     define __STL_NO_EXCEPTION_HEADER
-#   endif
-#   if _COMPILER_VERSION < 730 || !defined(_STANDARD_C_PLUS_PLUS) || \
-      !defined(_NAMESPACES)
-#     define __STL_NO_BAD_ALLOC
-#   endif
-#   if !defined(_NOTHREADS) && !defined(__STL_PTHREADS)
-#     define __STL_SGI_THREADS
-#   endif
-#   if defined(_LONGLONG) && defined(_SGIAPI) && _SGIAPI
-#     define __STL_LONG_LONG
-#   endif
-#   if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS)
-#     define __STL_USE_NEW_IOSTREAMS
-#   endif
-#   if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS)
-#     define __STL_CAN_THROW_RANGE_ERRORS
-#   endif
-#   if _COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS)
-#     define __SGI_STL_USE_AUTO_PTR_CONVERSIONS
-#   endif
-# endif
-
-
-/*
- * Jochen Schlick '1999  - added new #defines (__STL)_UITHREADS (for 
- *                         providing SCO / Solaris / UI thread support)
- *                       - added the necessary defines for the SCO UDK 7 
- *                         compiler (and its template friend behavior)
- *                       - all UDK7 specific STL changes are based on the 
- *                         macro __USLC__ being defined
- */
-// SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x)
-# if defined(__USLC__)
-#     define __STL_HAS_WCHAR_T 
-#     define __STL_CLASS_PARTIAL_SPECIALIZATION
-#     define __STL_PARTIAL_SPECIALIZATION_SYNTAX
-#     define __STL_FUNCTION_TMPL_PARTIAL_ORDER
-#     define __STL_MEMBER_TEMPLATES
-#     define __STL_MEMBER_TEMPLATE_CLASSES
-#     define __STL_USE_EXCEPTIONS
-#     define __STL_HAS_NAMESPACES
-#     define __STL_USE_NAMESPACES
-#     define __STL_LONG_LONG
-#     if defined(_REENTRANT)
-#           define _UITHREADS     /* if      UnixWare < 7.0.1 */
-#           define __STL_UITHREADS
-//   use the following defines instead of the UI threads defines when
-//   you want to use POSIX threads
-//#         define _PTHREADS      /* only if UnixWare >=7.0.1 */
-//#         define __STL_PTHREADS
-#     endif
-# endif
-
-
-
-# ifdef __GNUC__
-#   if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
-#     define __STL_STATIC_TEMPLATE_MEMBER_BUG
-#   endif
-#   if __GNUC__ < 2 
-#     define __STL_NEED_TYPENAME
-#     define __STL_NEED_EXPLICIT
-#   endif
-#   if __GNUC__ == 2 && __GNUC_MINOR__ <= 8
-#     define __STL_NO_EXCEPTION_HEADER
-#     define __STL_NO_BAD_ALLOC
-#   endif
-#   if __GNUC__ == 2 && __GNUC_MINOR__ >= 8 || __GNUC__ > 2
-#     define __STL_CLASS_PARTIAL_SPECIALIZATION
-#     define __STL_FUNCTION_TMPL_PARTIAL_ORDER
-#     define __STL_EXPLICIT_FUNCTION_TMPL_ARGS
-#     define __STL_MEMBER_TEMPLATES
-#     define __STL_CAN_THROW_RANGE_ERRORS
-      //    g++ 2.8.1 supports member template functions, but not member
-      //    template nested classes.
-#     if __GNUC_MINOR__ >= 9 || __GNUC__ > 2
-#       define __STL_MEMBER_TEMPLATE_CLASSES
-#       define __STL_TEMPLATE_FRIENDS
-#       define __SGI_STL_USE_AUTO_PTR_CONVERSIONS
-#       define __STL_HAS_NAMESPACES
-//#       define __STL_USE_NEW_IOSTREAMS
-#     endif
-#   endif
-#   define __STL_DEFAULT_CONSTRUCTOR_BUG
-#   ifdef __EXCEPTIONS
-#     define __STL_USE_EXCEPTIONS
-#   endif
-#   ifdef _REENTRANT
-#     define __STL_PTHREADS
-#   endif
-#   if (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 95)
-#     define __STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
-#   endif
-# endif
-
-# if defined(__SUNPRO_CC) 
-#   define __STL_NO_BOOL
-#   define __STL_NEED_TYPENAME
-#   define __STL_NEED_EXPLICIT
-#   define __STL_USE_EXCEPTIONS
-#   ifdef _REENTRANT
-#     define __STL_PTHREADS
-#   endif
-#   define __SGI_STL_NO_ARROW_OPERATOR
-#   define __STL_PARTIAL_SPECIALIZATION_SYNTAX
-#   define __STL_NO_EXCEPTION_HEADER
-#   define __STL_NO_BAD_ALLOC
-# endif
-
-# if defined(__COMO__)
-#   define __STL_MEMBER_TEMPLATES
-#   define __STL_MEMBER_TEMPLATE_CLASSES
-#   define __STL_TEMPLATE_FRIENDS
-#   define __STL_CLASS_PARTIAL_SPECIALIZATION
-#   define __STL_USE_EXCEPTIONS
-#   define __STL_HAS_NAMESPACES
-# endif
-
-// Intel compiler, which uses the EDG front end.
-# if defined(__ICL)
-#   define __STL_LONG_LONG 
-#   define __STL_MEMBER_TEMPLATES
-#   define __STL_MEMBER_TEMPLATE_CLASSES
-#   define __STL_TEMPLATE_FRIENDS
-#   define __STL_FUNCTION_TMPL_PARTIAL_ORDER
-#   define __STL_CLASS_PARTIAL_SPECIALIZATION
-#   define __STL_NO_DRAND48
-#   define __STL_HAS_NAMESPACES
-#   define __STL_USE_EXCEPTIONS
-#   define __STL_MEMBER_TEMPLATE_KEYWORD
-#   ifdef _CPPUNWIND
-#     define __STL_USE_EXCEPTIONS
-#   endif
-#   ifdef _MT
-#     define __STL_WIN32THREADS
-#   endif
-# endif
-
-// Mingw32, egcs compiler using the Microsoft C runtime
-# if defined(__MINGW32__)
-#   define __STL_NO_DRAND48
-#   ifdef _MT
-#     define __STL_WIN32THREADS
-#   endif
-# endif
-
-// Cygwin32, egcs compiler on MS Windows
-# if defined(__CYGWIN__)
-#   define __STL_NO_DRAND48
-# endif
-
-
-
-// Microsoft compiler.
-# if defined(_MSC_VER) && !defined(__ICL) && !defined(__MWERKS__)
-#   define __STL_NO_DRAND48
-#   define __STL_STATIC_CONST_INIT_BUG
-#   define __STL_NEED_TYPENAME
-#   define __STL_NO_USING_CLAUSE_IN_CLASS
-#   define __STL_NO_FRIEND_TEMPLATE_CLASS
-#   if _MSC_VER < 1100  /* 1000 is version 4.0, 1100 is 5.0, 1200 is 6.0. */
-#     define __STL_NEED_EXPLICIT
-#     define __STL_NO_BOOL
-#     define __STL_NO_BAD_ALLOC
-#   endif
-#   if _MSC_VER > 1000
-#     include <yvals.h>
-#     define __STL_DONT_USE_BOOL_TYPEDEF
-#   endif
-#   define __STL_NON_TYPE_TMPL_PARAM_BUG
-#   define __SGI_STL_NO_ARROW_OPERATOR
-#   define __STL_DEFAULT_CONSTRUCTOR_BUG
-#   ifdef _CPPUNWIND
-#     define __STL_USE_EXCEPTIONS
-#   endif
-#   ifdef _MT
-#     define __STL_WIN32THREADS
-#   endif
-#   if _MSC_VER >= 1200
-#     define __STL_PARTIAL_SPECIALIZATION_SYNTAX
-#     define __STL_HAS_NAMESPACES
-#     define __STL_CAN_THROW_RANGE_ERRORS
-#     define NOMINMAX
-#     undef min
-#     undef max
-// disable warning 'initializers put in unrecognized initialization area'
-#     pragma warning ( disable : 4075 )
-// disable warning 'empty controlled statement found'
-#     pragma warning ( disable : 4390 )
-// disable warning 'debug symbol greater than 255 chars'
-#     pragma warning ( disable : 4786 )
-#   endif
-#   if _MSC_VER < 1100
-#     define __STL_NO_EXCEPTION_HEADER
-#     define __STL_NO_BAD_ALLOC
-#   endif
-    // Because of a Microsoft front end bug, we must not provide a
-    // namespace qualifier when declaring a friend function.
-#   define __STD_QUALIFIER
-# endif
-
-# if defined(__BORLANDC__)
-#     define __STL_NO_BAD_ALLOC
-#     define __STL_NO_DRAND48
-#     define __STL_DEFAULT_CONSTRUCTOR_BUG
-#   if __BORLANDC__ >= 0x540 /* C++ Builder 4.0 */
-#     define __STL_CLASS_PARTIAL_SPECIALIZATION
-#     define __STL_FUNCTION_TMPL_PARTIAL_ORDER
-#     define __STL_EXPLICIT_FUNCTION_TMPL_ARGS
-#     define __STL_MEMBER_TEMPLATES
-#     define __STL_TEMPLATE_FRIENDS
-#   else
-#     define __STL_NEED_TYPENAME
-#     define __STL_LIMITED_DEFAULT_TEMPLATES
-#     define __SGI_STL_NO_ARROW_OPERATOR
-#     define __STL_NON_TYPE_TMPL_PARAM_BUG
-#   endif
-#   ifdef _CPPUNWIND
-#     define __STL_USE_EXCEPTIONS
-#   endif
-#   ifdef __MT__
-#     define __STL_WIN32THREADS
-#   endif
-# endif
-
-# if defined(__STL_NO_BOOL) && !defined(__STL_DONT_USE_BOOL_TYPEDEF)
-    typedef int bool;
-#   define true 1
-#   define false 0
-# endif
-
-# ifdef __STL_NEED_TYPENAME
-#   define typename
-# endif
-
-# ifdef __STL_LIMITED_DEFAULT_TEMPLATES
-#   define __STL_DEPENDENT_DEFAULT_TMPL(_Tp)
-# else
-#   define __STL_DEPENDENT_DEFAULT_TMPL(_Tp) = _Tp
-# endif
-
-# ifdef __STL_MEMBER_TEMPLATE_KEYWORD
-#   define __STL_TEMPLATE template
-# else
-#   define __STL_TEMPLATE
-# endif
-
-# ifdef __STL_NEED_EXPLICIT
-#   define explicit
-# endif
-
-# ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
-#   define __STL_NULL_TMPL_ARGS <>
-# else
-#   define __STL_NULL_TMPL_ARGS
-# endif
-
-# if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \
-     || defined (__STL_PARTIAL_SPECIALIZATION_SYNTAX)
-#   define __STL_TEMPLATE_NULL template<>
-# else
-#   define __STL_TEMPLATE_NULL
-# endif
-
-// Use standard-conforming allocators if we have the necessary language
-// features.  __STL_USE_SGI_ALLOCATORS is a hook so that users can 
-// disable new-style allocators, and continue to use the same kind of
-// allocators as before, without having to edit library headers.
-# if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && \
-     defined(__STL_MEMBER_TEMPLATES) && \
-     defined(__STL_MEMBER_TEMPLATE_CLASSES) && \
-    !defined(__STL_NO_BOOL) && \
-    !defined(__STL_NON_TYPE_TMPL_PARAM_BUG) && \
-    !defined(__STL_LIMITED_DEFAULT_TEMPLATES) && \
-    !defined(__STL_USE_SGI_ALLOCATORS) 
-#   define __STL_USE_STD_ALLOCATORS
-# endif
-
-# ifndef __STL_DEFAULT_ALLOCATOR
-#   ifdef __STL_USE_STD_ALLOCATORS
-#     define __STL_DEFAULT_ALLOCATOR(T) allocator< T >
-#   else
-#     define __STL_DEFAULT_ALLOCATOR(T) alloc
-#   endif
-# endif
-
-// __STL_NO_NAMESPACES is a hook so that users can disable namespaces
-// without having to edit library headers.  __STL_NO_RELOPS_NAMESPACE is
-// a hook so that users can disable the std::rel_ops namespace, keeping 
-// the relational operator template in namespace std, without having to 
-// edit library headers.
-# if defined(__STL_HAS_NAMESPACES) && !defined(__STL_NO_NAMESPACES)
-#   define __STL_USE_NAMESPACES
-#   define __STD std
-#   define __STL_BEGIN_NAMESPACE namespace std {
-#   define __STL_END_NAMESPACE }
-#   if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) && \
-       !defined(__STL_NO_RELOPS_NAMESPACE)
-#     define __STL_USE_NAMESPACE_FOR_RELOPS
-#     define __STL_BEGIN_RELOPS_NAMESPACE namespace std { namespace rel_ops {
-#     define __STL_END_RELOPS_NAMESPACE } }
-#     define __STD_RELOPS std::rel_ops
-#   else /* Use std::rel_ops namespace */
-#     define __STL_USE_NAMESPACE_FOR_RELOPS
-#     define __STL_BEGIN_RELOPS_NAMESPACE namespace std {
-#     define __STL_END_RELOPS_NAMESPACE }
-#     define __STD_RELOPS std
-#   endif /* Use std::rel_ops namespace */
-# else
-#   define __STD 
-#   define __STL_BEGIN_NAMESPACE 
-#   define __STL_END_NAMESPACE 
-#   undef  __STL_USE_NAMESPACE_FOR_RELOPS
-#   define __STL_BEGIN_RELOPS_NAMESPACE 
-#   define __STL_END_RELOPS_NAMESPACE 
-#   define __STD_RELOPS 
-#   undef  __STL_USE_NAMESPACES
-# endif
-
-// Some versions of the EDG front end sometimes require an explicit
-// namespace spec where they shouldn't.  This macro facilitates that.
-// If the bug becomes irrelevant, then all uses of __STD_QUALIFIER
-// should be removed.  The 7.3 beta SGI compiler has this bug, but the
-// MR version is not expected to have it.
-
-# if defined(__STL_USE_NAMESPACES) && !defined(__STD_QUALIFIER)
-#   define __STD_QUALIFIER std::
-# else
-#   define __STD_QUALIFIER
-# endif
-
-# ifdef __STL_USE_EXCEPTIONS
-#   define __STL_TRY try
-#   define __STL_CATCH_ALL catch(...)
-#   define __STL_THROW(x) throw x
-#   define __STL_RETHROW throw
-#   define __STL_NOTHROW throw()
-#   define __STL_UNWIND(action) catch(...) { action; throw; }
-# else
-#   define __STL_TRY 
-#   define __STL_CATCH_ALL if (false)
-#   define __STL_THROW(x) 
-#   define __STL_RETHROW 
-#   define __STL_NOTHROW 
-#   define __STL_UNWIND(action) 
-# endif
-
-#ifdef __STL_ASSERTIONS
-# include <stdio.h>
-# define __stl_assert(expr) \
-    if (!(expr)) { fprintf(stderr, "%s:%d STL assertion failure: %s\n", \
-			  __FILE__, __LINE__, # expr); abort(); }
-#else
-# define __stl_assert(expr)
-#endif
-
-#if defined(__STL_WIN32THREADS) || defined(__STL_SGI_THREADS) \
-    || defined(__STL_PTHREADS)  || defined(__STL_UITHREADS)
-#   define __STL_THREADS
-#   define __STL_VOLATILE volatile
-#else
-#   define __STL_VOLATILE
-#endif
-
-#if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) \
-    && defined(__STL_MEMBER_TEMPLATES) \
-    && !defined(_STL_NO_CONCEPT_CHECKS)
-#  define __STL_USE_CONCEPT_CHECKS
-#endif
-
-
-#endif /* __STL_CONFIG_H */
-
-// Local Variables:
-// mode:C++
-// End:
diff --git a/WebKit/android/stl/stl_heap.h b/WebKit/android/stl/stl_heap.h
deleted file mode 100644
index 9e3cf13..0000000
--- a/WebKit/android/stl/stl_heap.h
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- *
- * Copyright 2009, The Android Open Source Project
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- * Copyright (c) 1997
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
-
-/* NOTE: This is an internal header file, included by other STL headers.
- *   You should not attempt to use it directly.
- */
-
-#ifndef __SGI_STL_INTERNAL_HEAP_H
-#define __SGI_STL_INTERNAL_HEAP_H
-
-__STL_BEGIN_NAMESPACE
-
-#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
-#pragma set woff 1209
-#endif
-
-// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap.
-
-template <class _RandomAccessIterator, class _Distance, class _Tp>
-void 
-__push_heap(_RandomAccessIterator __first,
-            _Distance __holeIndex, _Distance __topIndex, _Tp __value)
-{
-  _Distance __parent = (__holeIndex - 1) / 2;
-  while (__holeIndex > __topIndex && *(__first + __parent) < __value) {
-    *(__first + __holeIndex) = *(__first + __parent);
-    __holeIndex = __parent;
-    __parent = (__holeIndex - 1) / 2;
-  }    
-  *(__first + __holeIndex) = __value;
-}
-
-template <class _RandomAccessIterator, class _Distance, class _Tp>
-inline void 
-__push_heap_aux(_RandomAccessIterator __first,
-                _RandomAccessIterator __last, _Distance*, _Tp*)
-{
-  __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
-              _Tp(*(__last - 1)));
-}
-
-template <class _RandomAccessIterator>
-inline void 
-push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type,
-                 _LessThanComparable);
-  __push_heap_aux(__first, __last,
-                  __DISTANCE_TYPE(__first), __VALUE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator, class _Distance, class _Tp, 
-          class _Compare>
-void
-__push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
-            _Distance __topIndex, _Tp __value, _Compare __comp)
-{
-  _Distance __parent = (__holeIndex - 1) / 2;
-  while (__holeIndex > __topIndex && __comp(*(__first + __parent), __value)) {
-    *(__first + __holeIndex) = *(__first + __parent);
-    __holeIndex = __parent;
-    __parent = (__holeIndex - 1) / 2;
-  }
-  *(__first + __holeIndex) = __value;
-}
-
-template <class _RandomAccessIterator, class _Compare,
-          class _Distance, class _Tp>
-inline void 
-__push_heap_aux(_RandomAccessIterator __first,
-                _RandomAccessIterator __last, _Compare __comp,
-                _Distance*, _Tp*) 
-{
-  __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
-              _Tp(*(__last - 1)), __comp);
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline void 
-push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
-          _Compare __comp)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __push_heap_aux(__first, __last, __comp,
-                  __DISTANCE_TYPE(__first), __VALUE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator, class _Distance, class _Tp>
-void 
-__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
-              _Distance __len, _Tp __value)
-{
-  _Distance __topIndex = __holeIndex;
-  _Distance __secondChild = 2 * __holeIndex + 2;
-  while (__secondChild < __len) {
-    if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
-      __secondChild--;
-    *(__first + __holeIndex) = *(__first + __secondChild);
-    __holeIndex = __secondChild;
-    __secondChild = 2 * (__secondChild + 1);
-  }
-  if (__secondChild == __len) {
-    *(__first + __holeIndex) = *(__first + (__secondChild - 1));
-    __holeIndex = __secondChild - 1;
-  }
-  __push_heap(__first, __holeIndex, __topIndex, __value);
-}
-
-template <class _RandomAccessIterator, class _Tp, class _Distance>
-inline void 
-__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
-           _RandomAccessIterator __result, _Tp __value, _Distance*)
-{
-  *__result = *__first;
-  __adjust_heap(__first, _Distance(0), _Distance(__last - __first), __value);
-}
-
-template <class _RandomAccessIterator, class _Tp>
-inline void 
-__pop_heap_aux(_RandomAccessIterator __first, _RandomAccessIterator __last,
-               _Tp*)
-{
-  __pop_heap(__first, __last - 1, __last - 1, 
-             _Tp(*(__last - 1)), __DISTANCE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator>
-inline void pop_heap(_RandomAccessIterator __first, 
-                     _RandomAccessIterator __last)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type,
-                 _LessThanComparable);
-  __pop_heap_aux(__first, __last, __VALUE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator, class _Distance,
-          class _Tp, class _Compare>
-void
-__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
-              _Distance __len, _Tp __value, _Compare __comp)
-{
-  _Distance __topIndex = __holeIndex;
-  _Distance __secondChild = 2 * __holeIndex + 2;
-  while (__secondChild < __len) {
-    if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1))))
-      __secondChild--;
-    *(__first + __holeIndex) = *(__first + __secondChild);
-    __holeIndex = __secondChild;
-    __secondChild = 2 * (__secondChild + 1);
-  }
-  if (__secondChild == __len) {
-    *(__first + __holeIndex) = *(__first + (__secondChild - 1));
-    __holeIndex = __secondChild - 1;
-  }
-  __push_heap(__first, __holeIndex, __topIndex, __value, __comp);
-}
-
-template <class _RandomAccessIterator, class _Tp, class _Compare, 
-          class _Distance>
-inline void 
-__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
-           _RandomAccessIterator __result, _Tp __value, _Compare __comp,
-           _Distance*)
-{
-  *__result = *__first;
-  __adjust_heap(__first, _Distance(0), _Distance(__last - __first), 
-                __value, __comp);
-}
-
-template <class _RandomAccessIterator, class _Tp, class _Compare>
-inline void 
-__pop_heap_aux(_RandomAccessIterator __first,
-               _RandomAccessIterator __last, _Tp*, _Compare __comp)
-{
-  __pop_heap(__first, __last - 1, __last - 1, _Tp(*(__last - 1)), __comp,
-             __DISTANCE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline void 
-pop_heap(_RandomAccessIterator __first,
-         _RandomAccessIterator __last, _Compare __comp)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __pop_heap_aux(__first, __last, __VALUE_TYPE(__first), __comp);
-}
-
-template <class _RandomAccessIterator, class _Tp, class _Distance>
-void 
-__make_heap(_RandomAccessIterator __first,
-            _RandomAccessIterator __last, _Tp*, _Distance*)
-{
-  if (__last - __first < 2) return;
-  _Distance __len = __last - __first;
-  _Distance __parent = (__len - 2)/2;
-    
-  while (true) {
-    __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)));
-    if (__parent == 0) return;
-    __parent--;
-  }
-}
-
-template <class _RandomAccessIterator>
-inline void 
-make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type,
-                 _LessThanComparable);
-  __make_heap(__first, __last,
-              __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator, class _Compare,
-          class _Tp, class _Distance>
-void
-__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
-            _Compare __comp, _Tp*, _Distance*)
-{
-  if (__last - __first < 2) return;
-  _Distance __len = __last - __first;
-  _Distance __parent = (__len - 2)/2;
-    
-  while (true) {
-    __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)),
-                  __comp);
-    if (__parent == 0) return;
-    __parent--;
-  }
-}
-
-template <class _RandomAccessIterator, class _Compare>
-inline void 
-make_heap(_RandomAccessIterator __first, 
-          _RandomAccessIterator __last, _Compare __comp)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __make_heap(__first, __last, __comp,
-              __VALUE_TYPE(__first), __DISTANCE_TYPE(__first));
-}
-
-template <class _RandomAccessIterator>
-void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  __STL_REQUIRES(typename iterator_traits<_RandomAccessIterator>::value_type,
-                 _LessThanComparable);
-  while (__last - __first > 1)
-    pop_heap(__first, __last--);
-}
-
-template <class _RandomAccessIterator, class _Compare>
-void 
-sort_heap(_RandomAccessIterator __first,
-          _RandomAccessIterator __last, _Compare __comp)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _Mutable_RandomAccessIterator);
-  while (__last - __first > 1)
-    pop_heap(__first, __last--, __comp);
-}
-
-#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
-#pragma reset woff 1209
-#endif
-
-__STL_END_NAMESPACE
-
-#endif /* __SGI_STL_INTERNAL_HEAP_H */
-
-// Local Variables:
-// mode:C++
-// End:
diff --git a/WebKit/android/stl/stl_iterator_base.h b/WebKit/android/stl/stl_iterator_base.h
deleted file mode 100644
index 746d1d4..0000000
--- a/WebKit/android/stl/stl_iterator_base.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- *
- * Copyright 2009, The Android Open Source Project
- * Copyright (c) 1994
- * Hewlett-Packard Company
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Hewlett-Packard Company makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- *
- *
- * Copyright (c) 1996-1998
- * Silicon Graphics Computer Systems, Inc.
- *
- * Permission to use, copy, modify, distribute and sell this software
- * and its documentation for any purpose is hereby granted without fee,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.  Silicon Graphics makes no
- * representations about the suitability of this software for any
- * purpose.  It is provided "as is" without express or implied warranty.
- */
-
-/* NOTE: This is an internal header file, included by other STL headers.
- *   You should not attempt to use it directly.
- */
-
-#ifndef __SGI_STL_INTERNAL_ITERATOR_BASE_H
-#define __SGI_STL_INTERNAL_ITERATOR_BASE_H
-
-// This file contains all of the general iterator-related utilities.
-// The internal file stl_iterator.h contains predefined iterators, 
-// such as front_insert_iterator and istream_iterator.
-
-#include <concept_checks.h>
-
-struct input_iterator_tag {};
-struct output_iterator_tag {};
-struct forward_iterator_tag : public input_iterator_tag {};
-struct bidirectional_iterator_tag : public forward_iterator_tag {};
-struct random_access_iterator_tag : public bidirectional_iterator_tag {};
-
-// The base classes input_iterator, output_iterator, forward_iterator,
-// bidirectional_iterator, and random_access_iterator are not part of
-// the C++ standard.  (They have been replaced by struct iterator.)
-// They are included for backward compatibility with the HP STL.
-
-template <class _Tp, class _Distance> struct input_iterator {
-  typedef input_iterator_tag iterator_category;
-  typedef _Tp                value_type;
-  typedef _Distance          difference_type;
-  typedef _Tp*               pointer;
-  typedef _Tp&               reference;
-};
-
-struct output_iterator {
-  typedef output_iterator_tag iterator_category;
-  typedef void                value_type;
-  typedef void                difference_type;
-  typedef void                pointer;
-  typedef void                reference;
-};
-
-template <class _Tp, class _Distance> struct forward_iterator {
-  typedef forward_iterator_tag iterator_category;
-  typedef _Tp                  value_type;
-  typedef _Distance            difference_type;
-  typedef _Tp*                 pointer;
-  typedef _Tp&                 reference;
-};
-
-
-template <class _Tp, class _Distance> struct bidirectional_iterator {
-  typedef bidirectional_iterator_tag iterator_category;
-  typedef _Tp                        value_type;
-  typedef _Distance                  difference_type;
-  typedef _Tp*                       pointer;
-  typedef _Tp&                       reference;
-};
-
-template <class _Tp, class _Distance> struct random_access_iterator {
-  typedef random_access_iterator_tag iterator_category;
-  typedef _Tp                        value_type;
-  typedef _Distance                  difference_type;
-  typedef _Tp*                       pointer;
-  typedef _Tp&                       reference;
-};
-
-template <class _Category, class _Tp, class _Distance = ptrdiff_t,
-          class _Pointer = _Tp*, class _Reference = _Tp&>
-struct iterator {
-  typedef _Category  iterator_category;
-  typedef _Tp        value_type;
-  typedef _Distance  difference_type;
-  typedef _Pointer   pointer;
-  typedef _Reference reference;
-};
-
-template <class _Iterator>
-struct iterator_traits {
-  typedef typename _Iterator::iterator_category iterator_category;
-  typedef typename _Iterator::value_type        value_type;
-  typedef typename _Iterator::difference_type   difference_type;
-  typedef typename _Iterator::pointer           pointer;
-  typedef typename _Iterator::reference         reference;
-};
-
-template <class _Tp>
-struct iterator_traits<_Tp*> {
-  typedef random_access_iterator_tag iterator_category;
-  typedef _Tp                         value_type;
-  typedef ptrdiff_t                   difference_type;
-  typedef _Tp*                        pointer;
-  typedef _Tp&                        reference;
-};
-
-template <class _Tp>
-struct iterator_traits<const _Tp*> {
-  typedef random_access_iterator_tag iterator_category;
-  typedef _Tp                         value_type;
-  typedef ptrdiff_t                   difference_type;
-  typedef const _Tp*                  pointer;
-  typedef const _Tp&                  reference;
-};
-
-// The overloaded functions iterator_category, distance_type, and
-// value_type are not part of the C++ standard.  (They have been
-// replaced by struct iterator_traits.)  They are included for
-// backward compatibility with the HP STL.
-
-// We introduce internal names for these functions.
-
-template <class _Iter>
-inline typename iterator_traits<_Iter>::iterator_category
-__iterator_category(const _Iter&)
-{
-  typedef typename iterator_traits<_Iter>::iterator_category _Category;
-  return _Category();
-}
-
-template <class _Iter>
-inline typename iterator_traits<_Iter>::difference_type*
-__distance_type(const _Iter&)
-{
-  return static_cast<typename iterator_traits<_Iter>::difference_type*>(0);
-}
-
-template <class _Iter>
-inline typename iterator_traits<_Iter>::value_type*
-__value_type(const _Iter&)
-{
-  return static_cast<typename iterator_traits<_Iter>::value_type*>(0);
-}
-
-template <class _Iter>
-inline typename iterator_traits<_Iter>::iterator_category
-iterator_category(const _Iter& __i) { return __iterator_category(__i); }
-
-
-template <class _Iter>
-inline typename iterator_traits<_Iter>::difference_type*
-distance_type(const _Iter& __i) { return __distance_type(__i); }
-
-template <class _Iter>
-inline typename iterator_traits<_Iter>::value_type*
-value_type(const _Iter& __i) { return __value_type(__i); }
-
-#define __ITERATOR_CATEGORY(__i) __iterator_category(__i)
-#define __DISTANCE_TYPE(__i)     __distance_type(__i)
-#define __VALUE_TYPE(__i)        __value_type(__i)
-
-template <class _InputIterator, class _Distance>
-inline void __distance(_InputIterator __first, _InputIterator __last,
-                       _Distance& __n, input_iterator_tag)
-{
-  while (__first != __last) { ++__first; ++__n; }
-}
-
-template <class _RandomAccessIterator, class _Distance>
-inline void __distance(_RandomAccessIterator __first, 
-                       _RandomAccessIterator __last, 
-                       _Distance& __n, random_access_iterator_tag)
-{
-  __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator);
-  __n += __last - __first;
-}
-
-template <class _InputIterator, class _Distance>
-inline void distance(_InputIterator __first, 
-                     _InputIterator __last, _Distance& __n)
-{
-  __STL_REQUIRES(_InputIterator, _InputIterator);
-  __distance(__first, __last, __n, iterator_category(__first));
-}
-
-#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
-
-template <class _InputIterator>
-inline typename iterator_traits<_InputIterator>::difference_type
-__distance(_InputIterator __first, _InputIterator __last, input_iterator_tag)
-{
-  typename iterator_traits<_InputIterator>::difference_type __n = 0;
-  while (__first != __last) {
-    ++__first; ++__n;
-  }
-  return __n;
-}
-
-template <class _RandomAccessIterator>
-inline typename iterator_traits<_RandomAccessIterator>::difference_type
-__distance(_RandomAccessIterator __first, _RandomAccessIterator __last,
-           random_access_iterator_tag) {
-  __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator);
-  return __last - __first;
-}
-
-template <class _InputIterator>
-inline typename iterator_traits<_InputIterator>::difference_type
-distance(_InputIterator __first, _InputIterator __last) {
-  typedef typename iterator_traits<_InputIterator>::iterator_category 
-    _Category;
-  __STL_REQUIRES(_InputIterator, _InputIterator);
-  return __distance(__first, __last, _Category());
-}
-
-#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
-
-template <class _InputIter, class _Distance>
-inline void __advance(_InputIter& __i, _Distance __n, input_iterator_tag) {
-  while (__n--) ++__i;
-}
-
-#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
-#pragma set woff 1183
-#endif
-
-template <class _BidirectionalIterator, class _Distance>
-inline void __advance(_BidirectionalIterator& __i, _Distance __n, 
-                      bidirectional_iterator_tag) {
-  __STL_REQUIRES(_BidirectionalIterator, _BidirectionalIterator);
-  if (__n >= 0)
-    while (__n--) ++__i;
-  else
-    while (__n++) --__i;
-}
-
-#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
-#pragma reset woff 1183
-#endif
-
-template <class _RandomAccessIterator, class _Distance>
-inline void __advance(_RandomAccessIterator& __i, _Distance __n, 
-                      random_access_iterator_tag) {
-  __STL_REQUIRES(_RandomAccessIterator, _RandomAccessIterator);
-  __i += __n;
-}
-
-template <class _InputIterator, class _Distance>
-inline void advance(_InputIterator& __i, _Distance __n) {
-  __STL_REQUIRES(_InputIterator, _InputIterator);
-  __advance(__i, __n, iterator_category(__i));
-}
-
-#endif /* __SGI_STL_INTERNAL_ITERATOR_BASE_H */
-
-
-
-// Local Variables:
-// mode:C++
-// End:
diff --git a/WebKit/android/stl/strings.h b/WebKit/android/stl/strings.h
deleted file mode 100644
index 599a890..0000000
--- a/WebKit/android/stl/strings.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright 2007, The Android Open Source Project
- *
- * 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 APPLE COMPUTER, 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.
- */
-
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index d55548b..97b361a 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,18 @@
+2009-12-13  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=32499
+        Add client based Geolocation provider
+
+        Add first cut of a client based Geolocation provider. This is guarded by
+        ENABLE(CLIENT_BASED_GEOLOCATION) and is off by default for now. This adds a
+        GeolocationControllerClient interface that no-one currently implements,
+        but will in a subsequent patch.
+
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::WebViewImpl):
+
 2009-12-10  Mike Belshe  <mike@belshe.com>
 
         Unreviewed, build fix for chromium.
diff --git a/WebKit/chromium/src/WebViewImpl.cpp b/WebKit/chromium/src/WebViewImpl.cpp
index 357cdca..030c4bd 100644
--- a/WebKit/chromium/src/WebViewImpl.cpp
+++ b/WebKit/chromium/src/WebViewImpl.cpp
@@ -229,6 +229,7 @@
                         &m_editorClientImpl,
                         &m_dragClientImpl,
                         &m_inspectorClientImpl,
+                        0,
                         0));
 
     m_page->backForwardList()->setClient(&m_backForwardListClientImpl);
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index ac80deb..a72e2c9 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,18 @@
+2009-12-13  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=32499
+        Add client based Geolocation provider
+
+        Add first cut of a client based Geolocation provider. This is guarded by
+        ENABLE(CLIENT_BASED_GEOLOCATION) and is off by default for now. This adds a
+        GeolocationControllerClient interface that no-one currently implements,
+        but will in a subsequent patch.
+
+        * webkit/webkitwebview.cpp:
+        (webkit_web_view_init):
+
 2009-12-10  Gustavo Noronha Silva  <gustavo.noronha@collabora.co.uk>
 
         Reviewed by Xan Lopez.
diff --git a/WebKit/gtk/webkit/webkitwebview.cpp b/WebKit/gtk/webkit/webkitwebview.cpp
index bebd01a..211f671 100644
--- a/WebKit/gtk/webkit/webkitwebview.cpp
+++ b/WebKit/gtk/webkit/webkitwebview.cpp
@@ -2589,7 +2589,7 @@
     priv->imContext = gtk_im_multicontext_new();
 
     WebKit::InspectorClient* inspectorClient = new WebKit::InspectorClient(webView);
-    priv->corePage = new Page(new WebKit::ChromeClient(webView), new WebKit::ContextMenuClient(webView), new WebKit::EditorClient(webView), new WebKit::DragClient(webView), inspectorClient, 0);
+    priv->corePage = new Page(new WebKit::ChromeClient(webView), new WebKit::ContextMenuClient(webView), new WebKit::EditorClient(webView), new WebKit::DragClient(webView), inspectorClient, 0, 0);
 
     // We also add a simple wrapper class to provide the public
     // interface for the Web Inspector.
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index a92cf69..17c7470 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -7,6 +7,21 @@
 
         * Plugins/Hosted/ProxyInstance.h:
 
+2009-12-13  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=32499
+        Add client based Geolocation provider
+
+        Add first cut of a client based Geolocation provider. This is guarded by
+        ENABLE(CLIENT_BASED_GEOLOCATION) and is off by default for now. This adds a
+        GeolocationControllerClient interface that no-one currently implements,
+        but will in a subsequent patch.
+
+        * WebView/WebView.mm:
+        (-[WebView _commonInitializationWithFrameName:groupName:usesDocumentViews:]):
+
 2009-12-10  Jon Honeycutt  <jhoneycutt@apple.com>
 
         Mac build fix. Unreviewed.
diff --git a/WebKit/mac/WebView/WebView.mm b/WebKit/mac/WebView/WebView.mm
index 33ea069..ad8f33a 100644
--- a/WebKit/mac/WebView/WebView.mm
+++ b/WebKit/mac/WebView/WebView.mm
@@ -607,7 +607,7 @@
         didOneTimeInitialization = true;
     }
 
-    _private->page = new Page(new WebChromeClient(self), new WebContextMenuClient(self), new WebEditorClient(self), new WebDragClient(self), new WebInspectorClient(self), new WebPluginHalterClient(self));
+    _private->page = new Page(new WebChromeClient(self), new WebContextMenuClient(self), new WebEditorClient(self), new WebDragClient(self), new WebInspectorClient(self), new WebPluginHalterClient(self), 0);
 
     _private->page->settings()->setLocalStorageDatabasePath([[self preferences] _localStorageDatabasePath]);
 
diff --git a/WebKit/qt/Api/qwebpage.cpp b/WebKit/qt/Api/qwebpage.cpp
index ba6b9f3..50cbaf0 100644
--- a/WebKit/qt/Api/qwebpage.cpp
+++ b/WebKit/qt/Api/qwebpage.cpp
@@ -376,7 +376,7 @@
     contextMenuClient = new ContextMenuClientQt();
     editorClient = new EditorClientQt(q);
     page = new Page(chromeClient, contextMenuClient, editorClient,
-                    new DragClientQt(q), new InspectorClientQt(q), 0);
+                    new DragClientQt(q), new InspectorClientQt(q), 0, 0);
 
     settings = new QWebSettings(page->settings());
 
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index c6e7465..4d2467a 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -7,6 +7,21 @@
 
         * Api/qwebframe.cpp:
 
+2009-12-13  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=32499
+        Add client based Geolocation provider
+
+        Add first cut of a client based Geolocation provider. This is guarded by
+        ENABLE(CLIENT_BASED_GEOLOCATION) and is off by default for now. This adds a
+        GeolocationControllerClient interface that no-one currently implements,
+        but will in a subsequent patch.
+
+        * Api/qwebpage.cpp:
+        (QWebPagePrivate::QWebPagePrivate):
+
 2009-12-07  Benjamin Poulain  <benjamin.poulain@nokia.com>
 
         Reviewed by Kenneth Rohde Christiansen.
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index 95705a9..9ea12f6 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,18 @@
+2009-12-13  Sam Weinig  <sam@webkit.org>
+
+        Reviewed by Dan Bernstein.
+
+        Fix for https://bugs.webkit.org/show_bug.cgi?id=32499
+        Add client based Geolocation provider
+
+        Add first cut of a client based Geolocation provider. This is guarded by
+        ENABLE(CLIENT_BASED_GEOLOCATION) and is off by default for now. This adds a
+        GeolocationControllerClient interface that no-one currently implements,
+        but will in a subsequent patch.
+
+        * WebView.cpp:
+        (WebView::initWithFrame):
+
 2009-12-10  Jon Honeycutt  <jhoneycutt@apple.com>
 
         Pass more information about a plug-in to the PluginHalterDelegate
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index d98d390..aadf15e 100644
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -2394,7 +2394,7 @@
     if (SUCCEEDED(m_preferences->shouldUseHighResolutionTimers(&useHighResolutionTimer)))
         Settings::setShouldUseHighResolutionTimers(useHighResolutionTimer);
 
-    m_page = new Page(new WebChromeClient(this), new WebContextMenuClient(this), new WebEditorClient(this), new WebDragClient(this), new WebInspectorClient(this), new WebPluginHalterClient(this));
+    m_page = new Page(new WebChromeClient(this), new WebContextMenuClient(this), new WebEditorClient(this), new WebDragClient(this), new WebInspectorClient(this), new WebPluginHalterClient(this), 0);
 
     BSTR localStoragePath;
     if (SUCCEEDED(m_preferences->localStorageDatabasePath(&localStoragePath))) {