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 --- WebKit/android/WebCoreSupport/PlatformBridge.cpp | 40 ++++++++++++++++++++++++ WebKit/android/jni/WebViewCore.cpp | 6 ++++ WebKit/android/jni/WebViewCore.h | 3 ++ 3 files changed, 49 insertions(+) create mode 100644 WebKit/android/WebCoreSupport/PlatformBridge.cpp (limited to 'WebKit/android') 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 @@ FILE* gRenderTreeFile = 0; namespace android { +bool WebViewCore::s_isPaused = false; + // ---------------------------------------------------------------------------- #define GET_NATIVE_VIEW(env, obj) ((WebViewCore*)env->GetIntField(obj, gWebViewCoreFields.m_nativeClass)) @@ -2979,6 +2981,8 @@ static void Pause(JNIEnv* env, jobject obj) 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 @@ static void Resume(JNIEnv* env, jobject obj) 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 @@ namespace android { // field safely from our respective threads static Mutex gButtonMutex; WTF::Vector 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 @@ namespace android { unsigned m_domtree_version; bool m_check_domtree_version; PageGroup* m_groupForVisitedLinks; + static bool s_isPaused; SkTDArray m_plugins; WebCore::Timer m_pluginInvalTimer; -- cgit v1.1