When starting the Geolocation service provider, check that the WebView is not already paused.

This fixes the following scenario ...
- The browser back stack contains a page which calls Geolocation::watchPosition form its onload handler.
- User presses the back button quickly and repeatedly until the browser goes to the background.
- The browser calls WebViewCore::Pause when it goes into the background, which suspends any Geolocation
  services in use. However, this call is made before the page which calls Geolocation::watchPosition has
  been loaded. WebKit later loads this page, which creates a new Geolocation object which is never paused.

With this fix, the new Geolocation object is not started when it is first created. It does nothing until
it is resumed when the Browser is brought back to the foreground.

Bug: 2363338
diff --git a/WebCore/platform/android/GeolocationServiceAndroid.cpp b/WebCore/platform/android/GeolocationServiceAndroid.cpp
index 9340053..6e83ab3 100644
--- a/WebCore/platform/android/GeolocationServiceAndroid.cpp
+++ b/WebCore/platform/android/GeolocationServiceAndroid.cpp
@@ -31,6 +31,7 @@
 
 #include "Frame.h"
 #include "Geoposition.h"
+#include "PlatformBridge.h"
 #include "PositionError.h"
 #include "PositionOptions.h"
 #include "WebViewCore.h"
@@ -312,8 +313,13 @@
     if (options && 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
new file mode 100644
index 0000000..dc8c235
--- /dev/null
+++ b/WebCore/platform/android/PlatformBridge.h
@@ -0,0 +1,47 @@
+/*
+ * 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
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PlatformBridge_h
+#define PlatformBridge_h
+
+namespace WebCore {
+
+// An interface to the embedding layer, which has the ability to answer
+// questions about the system and so on...
+// This is very similar to ChromiumBridge and the two are likely to converge
+// in the future.
+//
+// The methods in this class all need to reach across a JNI layer to the Java VM
+// where the embedder runs. The JNI machinery is currently all in WebKit/android
+// but the long term plan is to move to the WebKit API and share the bridge and its
+// implementation with Chromium. The JNI machinery will then move outside of WebKit,
+// similarly to how Chromium's IPC layer lives outside of WebKit.
+class PlatformBridge {
+public:
+    // Whether the WebView is paused.
+    static bool isWebViewPaused();
+};
+}
+#endif // PlatformBridge_h
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index a95f6a9..20bbd40 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -22,6 +22,7 @@
 	android/WebCoreSupport/EditorClientAndroid.cpp \
 	android/WebCoreSupport/FrameLoaderClientAndroid.cpp \
 	android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp \
+	android/WebCoreSupport/PlatformBridge.cpp \
 	android/WebCoreSupport/GeolocationPermissions.cpp \
 	\
 	android/RenderSkinAndroid.cpp \
diff --git a/WebKit/android/WebCoreSupport/PlatformBridge.cpp b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
new file mode 100644
index 0000000..2931b36
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
@@ -0,0 +1,40 @@
+/*
+ * 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
+ * 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 "PlatformBridge.h"
+
+#include "WebViewCore.h"
+
+using namespace android;
+
+namespace WebCore {
+
+bool PlatformBridge::isWebViewPaused()
+{
+    return WebViewCore::isPaused();
+}
+
+}
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index 1b3f3b6..1f56582 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -139,6 +139,8 @@
 
 namespace android {
 
+bool WebViewCore::s_isPaused = false;
+
 // ----------------------------------------------------------------------------
 
 #define GET_NATIVE_VIEW(env, obj) ((WebViewCore*)env->GetIntField(obj, gWebViewCoreFields.m_nativeClass))
@@ -2979,6 +2981,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)
@@ -2994,6 +2998,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)
diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h
index 21e45ef..eab22b4 100644
--- a/WebKit/android/jni/WebViewCore.h
+++ b/WebKit/android/jni/WebViewCore.h
@@ -439,6 +439,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
@@ -495,6 +497,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;