summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorboliu <boliu@chromium.org>2015-08-14 08:57:48 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-14 15:58:50 +0000
commit7b59e502d7ce400a101705e063c11c2173a178ad (patch)
tree5e90d7fc1e70c3225630e681a3bd0b85c13d451d
parentb1256514fd77d87d64ac55afe14e9f1a94e88d34 (diff)
downloadchromium_src-7b59e502d7ce400a101705e063c11c2173a178ad.zip
chromium_src-7b59e502d7ce400a101705e063c11c2173a178ad.tar.gz
chromium_src-7b59e502d7ce400a101705e063c11c2173a178ad.tar.bz2
aw: Page visiblity behind switch
Enable page visibility behind a command line switch. There should be no change in behavior if enable-page-visibility switch is missing. When it's added: * Visibility is changed to (view visible) && (!attached or window visible) && (!onPause-ed) The existing implementation is simply !onPaused. * Pass page visibility signal into blink, and in turn, the compositor. BUG=520089 Review URL: https://codereview.chromium.org/1291653004 Cr-Commit-Position: refs/heads/master@{#343396}
-rw-r--r--android_webview/common/aw_switches.cc1
-rw-r--r--android_webview/common/aw_switches.h1
-rw-r--r--android_webview/java/src/org/chromium/android_webview/AwContents.java33
-rw-r--r--android_webview/renderer/aw_content_renderer_client.cc10
-rw-r--r--android_webview/renderer/aw_content_renderer_client.h1
5 files changed, 41 insertions, 5 deletions
diff --git a/android_webview/common/aw_switches.cc b/android_webview/common/aw_switches.cc
index 98b3b03..f9bc2fe 100644
--- a/android_webview/common/aw_switches.cc
+++ b/android_webview/common/aw_switches.cc
@@ -6,6 +6,7 @@
namespace switches {
+const char kEnablePageVisibility[] = "enable-page-visibility";
const char kUseInProcCommandBuffer[] = "use-in-proc-command-buffer";
} // namespace switches
diff --git a/android_webview/common/aw_switches.h b/android_webview/common/aw_switches.h
index 866bbe3..4dd4a6d 100644
--- a/android_webview/common/aw_switches.h
+++ b/android_webview/common/aw_switches.h
@@ -7,6 +7,7 @@
namespace switches {
+extern const char kEnablePageVisibility[];
extern const char kUseInProcCommandBuffer[];
} // namespace switches
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index a486243..3763bff 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -43,6 +43,7 @@ import android.widget.OverScroller;
import org.chromium.android_webview.permission.AwGeolocationCallback;
import org.chromium.android_webview.permission.AwPermissionRequest;
+import org.chromium.base.CommandLine;
import org.chromium.base.LocaleUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.TraceEvent;
@@ -106,6 +107,9 @@ public class AwContents implements SmartClipProvider,
private static final boolean FORCE_AUXILIARY_BITMAP_RENDERING =
"goldfish".equals(Build.HARDWARE);
+ // Matches kEnablePageVisibility.
+ private static final String ENABLE_PAGE_VISIBILITY = "enable-page-visibility";
+
/**
* WebKit hit test related data structure. These are used to implement
* getHitTestResult, requestFocusNodeHref, requestImageRef methods in WebView.
@@ -233,10 +237,15 @@ public class AwContents implements SmartClipProvider,
private final AwSettings mSettings;
private final ScrollAccessibilityHelper mScrollAccessibilityHelper;
+ // Visibility related state.
+ private final boolean mEnablePageVisibility;
private boolean mIsPaused;
private boolean mIsViewVisible;
private boolean mIsWindowVisible;
private boolean mIsAttachedToWindow;
+ // Visiblity state of |mContentViewCore|.
+ private boolean mIsContentViewCoreVisible;
+
private Bitmap mFavicon;
private boolean mHasRequestedVisitedHistoryFromClient;
// TODO(boliu): This should be in a global context, not per webview.
@@ -716,6 +725,7 @@ public class AwContents implements SmartClipProvider,
mScrollOffsetManager = dependencyFactory.createScrollOffsetManager(
new AwScrollOffsetManagerDelegate(), new OverScroller(mContext));
mScrollAccessibilityHelper = new ScrollAccessibilityHelper(mContainerView);
+ mEnablePageVisibility = CommandLine.getInstance().hasSwitch(ENABLE_PAGE_VISIBILITY);
setOverScrollMode(mContainerView.getOverScrollMode());
setScrollBarStyle(mInternalAccessAdapter.super_getScrollBarStyle());
@@ -963,7 +973,7 @@ public class AwContents implements SmartClipProvider,
installWebContentsObserver();
mSettings.setWebContents(webContents);
nativeSetDipScale(mNativeAwContents, (float) mDIPScale);
- mContentViewCore.onShow();
+ updateContentViewCoreVisibility();
// The native side object has been bound to this java instance, so now is the time to
// bind all the native->java relationships.
@@ -1763,7 +1773,7 @@ public class AwContents implements SmartClipProvider,
if (mIsPaused || isDestroyed()) return;
mIsPaused = true;
nativeSetIsPaused(mNativeAwContents, mIsPaused);
- mContentViewCore.onHide();
+ updateContentViewCoreVisibility();
}
/**
@@ -1774,7 +1784,7 @@ public class AwContents implements SmartClipProvider,
if (!mIsPaused || isDestroyed()) return;
mIsPaused = false;
nativeSetIsPaused(mNativeAwContents, mIsPaused);
- mContentViewCore.onShow();
+ updateContentViewCoreVisibility();
}
/**
@@ -2274,6 +2284,7 @@ public class AwContents implements SmartClipProvider,
private void setViewVisibilityInternal(boolean visible) {
mIsViewVisible = visible;
if (!isDestroyed()) nativeSetViewVisibility(mNativeAwContents, mIsViewVisible);
+ updateContentViewCoreVisibility();
}
private void setWindowVisibilityInternal(boolean visible) {
@@ -2281,6 +2292,22 @@ public class AwContents implements SmartClipProvider,
&& visible && !mIsWindowVisible;
mIsWindowVisible = visible;
if (!isDestroyed()) nativeSetWindowVisibility(mNativeAwContents, mIsWindowVisible);
+ updateContentViewCoreVisibility();
+ }
+
+ private void updateContentViewCoreVisibility() {
+ if (isDestroyed()) return;
+ boolean contentViewCoreVisible = !mIsPaused;
+ if (mEnablePageVisibility) {
+ contentViewCoreVisible = contentViewCoreVisible && mIsWindowVisible && mIsViewVisible;
+ }
+
+ if (contentViewCoreVisible && !mIsContentViewCoreVisible) {
+ mContentViewCore.onShow();
+ } else if (!contentViewCoreVisible && mIsContentViewCoreVisible) {
+ mContentViewCore.onHide();
+ }
+ mIsContentViewCoreVisible = contentViewCoreVisible;
}
/**
diff --git a/android_webview/renderer/aw_content_renderer_client.cc b/android_webview/renderer/aw_content_renderer_client.cc
index cf73e02..3fcc253 100644
--- a/android_webview/renderer/aw_content_renderer_client.cc
+++ b/android_webview/renderer/aw_content_renderer_client.cc
@@ -7,6 +7,7 @@
#include <vector>
#include "android_webview/common/aw_resource.h"
+#include "android_webview/common/aw_switches.h"
#include "android_webview/common/render_view_messages.h"
#include "android_webview/common/url_constants.h"
#include "android_webview/grit/aw_resources.h"
@@ -18,6 +19,7 @@
#include "android_webview/renderer/aw_render_frame_ext.h"
#include "android_webview/renderer/aw_render_view_ext.h"
#include "android_webview/renderer/print_render_frame_observer.h"
+#include "base/command_line.h"
#include "base/i18n/rtl.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/string_util.h"
@@ -47,8 +49,9 @@ using content::RenderThread;
namespace android_webview {
-AwContentRendererClient::AwContentRendererClient() {
-}
+AwContentRendererClient::AwContentRendererClient()
+ : enable_page_visibility_(base::CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kEnablePageVisibility)) {}
AwContentRendererClient::~AwContentRendererClient() {
}
@@ -171,6 +174,9 @@ void AwContentRendererClient::AddKeySystems(
bool AwContentRendererClient::ShouldOverridePageVisibilityState(
const content::RenderFrame* render_frame,
blink::WebPageVisibilityState* override_state) {
+ if (enable_page_visibility_)
+ return false;
+
// webview is always visible due to rendering requirements.
*override_state = blink::WebPageVisibilityStateVisible;
return true;
diff --git a/android_webview/renderer/aw_content_renderer_client.h b/android_webview/renderer/aw_content_renderer_client.h
index ab0c750..a6f1f02 100644
--- a/android_webview/renderer/aw_content_renderer_client.h
+++ b/android_webview/renderer/aw_content_renderer_client.h
@@ -44,6 +44,7 @@ class AwContentRendererClient : public content::ContentRendererClient {
private:
scoped_ptr<AwRenderProcessObserver> aw_render_process_observer_;
scoped_ptr<visitedlink::VisitedLinkSlave> visited_link_slave_;
+ const bool enable_page_visibility_;
};
} // namespace android_webview