From e00e8a78374cdcf01a25bd6327d2b94944b2bc3f Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Sun, 11 Sep 2011 17:48:42 -0700 Subject: [PATCH] Pause WebKit drawing when WebView loses window focus. This prevents animations and other live page content from consuming too many resources while the user is interacting with a popup window. Bug 5300522 Change-Id: I40fb6d16d56b540c431172052a1ae7fead7109be --- core/java/android/webkit/WebSettings.java | 8 ++++---- core/java/android/webkit/WebView.java | 15 +++++++++++++++ core/java/android/webkit/WebViewCore.java | 4 ++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index 77f67765c44fd..9c44138f03e5c 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -643,10 +643,10 @@ public class WebSettings { /** * Set whether the WebView will enable smooth transition while panning or - * zooming. If it is true, WebView will choose a solution to maximize the - * performance. e.g. the WebView's content may not be updated during the - * transition. If it is false, WebView will keep its fidelity. The default - * value is false. + * zooming or while the window hosting the WebView does not have focus. + * If it is true, WebView will choose a solution to maximize the performance. + * e.g. the WebView's content may not be updated during the transition. + * If it is false, WebView will keep its fidelity. The default value is false. */ public void setEnableSmoothTransition(boolean enable) { mEnableSmoothTransition = enable; diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 47abbc2e6d2d5..065beb1e58a1d 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -908,6 +908,9 @@ public class WebView extends AbsoluteLayout // used for serializing asynchronously handled touch events. private final TouchEventQueue mTouchEventQueue = new TouchEventQueue(); + // Used to track whether picture updating was paused due to a window focus change. + private boolean mPictureUpdatePausedForFocusChange = false; + // Used to notify listeners of a new picture. private PictureListener mPictureListener; /** @@ -5570,8 +5573,20 @@ public class WebView extends AbsoluteLayout setActive(hasWindowFocus); if (hasWindowFocus) { JWebCoreJavaBridge.setActiveWebView(this); + if (mPictureUpdatePausedForFocusChange) { + WebViewCore.resumeUpdatePicture(mWebViewCore); + nativeSetIsScrolling(false); + mPictureUpdatePausedForFocusChange = false; + } } else { JWebCoreJavaBridge.removeActiveWebView(this); + final WebSettings settings = getSettings(); + if (settings != null && settings.enableSmoothTransition() && + mWebViewCore != null && !WebViewCore.isUpdatePicturePaused(mWebViewCore)) { + WebViewCore.pauseUpdatePicture(mWebViewCore); + nativeSetIsScrolling(true); + mPictureUpdatePausedForFocusChange = true; + } } super.onWindowFocusChanged(hasWindowFocus); } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index c61bd4868dce4..843a62405ef8a 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -2107,6 +2107,10 @@ public final class WebViewCore { } } + static boolean isUpdatePicturePaused(WebViewCore core) { + return core != null ? core.mDrawIsPaused : false; + } + ////////////////////////////////////////////////////////////////////////// private void restoreState(int index) {