From 8ed98e2e3f77020f7a43bbd5427bc3dd12ba5743 Mon Sep 17 00:00:00 2001 From: Steve Block Date: Tue, 12 Jan 2010 00:18:58 +0000 Subject: 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 --- .../platform/android/GeolocationServiceAndroid.cpp | 10 ++++- WebCore/platform/android/PlatformBridge.h | 47 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 WebCore/platform/android/PlatformBridge.h (limited to 'WebCore/platform/android') 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 @@ bool GeolocationServiceAndroid::startUpdating(PositionOptions* options) 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 -- cgit v1.1