summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2012-05-08 16:28:15 -0700
committerJohn Reck <jreck@google.com>2012-05-08 16:44:20 -0700
commit35caaaf726b8b17cec92747a1fe42dba44d6b775 (patch)
treedb677de6efc417f232ff8ca6f4c60049f08fec50
parent828c3a7d6b11b21de7ddfbe200eb62b3a0ef0c41 (diff)
downloadexternal_webkit-35caaaf726b8b17cec92747a1fe42dba44d6b775.zip
external_webkit-35caaaf726b8b17cec92747a1fe42dba44d6b775.tar.gz
external_webkit-35caaaf726b8b17cec92747a1fe42dba44d6b775.tar.bz2
Disable prerenders if we aren't focused
Bug: 6448418 Change-Id: I624d78a2b674cbd91ebe70008c70967101fbb12a
-rw-r--r--Source/WebKit/android/jni/WebViewCore.cpp21
-rw-r--r--Source/WebKit/android/jni/WebViewCore.h8
-rw-r--r--Source/WebKit/android/nav/WebView.cpp14
3 files changed, 41 insertions, 2 deletions
diff --git a/Source/WebKit/android/jni/WebViewCore.cpp b/Source/WebKit/android/jni/WebViewCore.cpp
index dddae43..5c7012f 100644
--- a/Source/WebKit/android/jni/WebViewCore.cpp
+++ b/Source/WebKit/android/jni/WebViewCore.cpp
@@ -444,6 +444,7 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
, m_forwardingTouchEvents(false)
#endif
, m_webRequestContext(0)
+ , m_prerenderEnabled(false)
{
ALOG_ASSERT(m_mainFrame, "Uh oh, somehow a frameview was made without an initial frame!");
@@ -739,10 +740,30 @@ void WebViewCore::paintContents(WebCore::GraphicsContext* gc, WebCore::IntRect&
view->platformWidget()->draw(gc, drawArea);
}
+void WebViewCore::setPrerenderingEnabled(bool enable)
+{
+ MutexLocker locker(m_prerenderLock);
+ m_prerenderEnabled = enable;
+}
+
+bool WebViewCore::prerenderingEnabled()
+{
+ MutexLocker locker(m_prerenderLock);
+ return m_prerenderEnabled;
+}
+
SkCanvas* WebViewCore::createPrerenderCanvas(PrerenderedInval* prerendered)
{
+ // Has WebView disabled prerenders (not attached, etc...)?
+ if (!prerenderingEnabled())
+ return 0;
+ // Does this WebView have focus?
+ if (!m_mainFrame->page()->focusController()->isActive())
+ return 0;
+ // Are we scrolling?
if (currentTimeMS() - m_scrollSetTime < PRERENDER_AFTER_SCROLL_DELAY)
return 0;
+ // Do we have anything to render?
if (prerendered->area.isEmpty())
return 0;
FloatRect scaleTemp(m_scrollOffsetX, m_scrollOffsetY, m_screenWidth, m_screenHeight);
diff --git a/Source/WebKit/android/jni/WebViewCore.h b/Source/WebKit/android/jni/WebViewCore.h
index 4603cb8..c8b10d8 100644
--- a/Source/WebKit/android/jni/WebViewCore.h
+++ b/Source/WebKit/android/jni/WebViewCore.h
@@ -50,6 +50,7 @@
#include <androidfw/KeycodeLabels.h>
#include <ui/PixelFormat.h>
#include <utils/threads.h>
+#include <wtf/Threading.h>
namespace WebCore {
class Color;
@@ -605,6 +606,8 @@ namespace android {
int m_lastGeneration; // last action using up to date cache
// end of shared members
+ void setPrerenderingEnabled(bool enable);
+
// internal functions
private:
enum InputType {
@@ -740,6 +743,8 @@ namespace android {
// called from destructor, to remove this from a global list
static void removeInstance(WebViewCore*);
+ bool prerenderingEnabled();
+
friend class ListBoxReply;
struct JavaGlue;
struct JavaGlue* m_javaGlue;
@@ -792,6 +797,9 @@ namespace android {
#endif
scoped_refptr<WebRequestContext> m_webRequestContext;
+
+ WTF::Mutex m_prerenderLock;
+ bool m_prerenderEnabled;
};
} // namespace android
diff --git a/Source/WebKit/android/nav/WebView.cpp b/Source/WebKit/android/nav/WebView.cpp
index 3822239..1e84a12 100644
--- a/Source/WebKit/android/nav/WebView.cpp
+++ b/Source/WebKit/android/nav/WebView.cpp
@@ -259,6 +259,9 @@ int drawGL(WebCore::IntRect& invScreenRect, WebCore::IntRect* invalRect,
if (!m_baseLayer)
return 0;
+ if (m_viewImpl)
+ m_viewImpl->setPrerenderingEnabled(!m_isDrawingPaused);
+
if (!m_glWebViewState) {
TilesManager::instance()->setHighEndGfx(m_isHighEndGfx);
m_glWebViewState = new GLWebViewState();
@@ -648,8 +651,15 @@ int setHwAccelerated(bool hwAccelerated) {
return 0;
}
- bool m_isDrawingPaused;
+void setDrawingPaused(bool isPaused)
+{
+ m_isDrawingPaused = isPaused;
+ if (m_viewImpl)
+ m_viewImpl->setPrerenderingEnabled(!isPaused);
+}
+
private: // local state for WebView
+ bool m_isDrawingPaused;
// private to getFrameCache(); other functions operate in a different thread
WebViewCore* m_viewImpl;
int m_generation; // associate unique ID with sent kit focus to match with ui
@@ -1167,7 +1177,7 @@ static int nativeGetBackgroundColor(JNIEnv* env, jobject obj, jint nativeView)
static void nativeSetPauseDrawing(JNIEnv *env, jobject obj, jint nativeView,
jboolean pause)
{
- reinterpret_cast<WebView*>(nativeView)->m_isDrawingPaused = pause;
+ reinterpret_cast<WebView*>(nativeView)->setDrawingPaused(pause);
}
static void nativeSetTextSelection(JNIEnv *env, jobject obj, jint nativeView,