diff options
author | boliu <boliu@chromium.org> | 2015-08-14 08:57:48 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-14 15:58:50 +0000 |
commit | 7b59e502d7ce400a101705e063c11c2173a178ad (patch) | |
tree | 5e90d7fc1e70c3225630e681a3bd0b85c13d451d | |
parent | b1256514fd77d87d64ac55afe14e9f1a94e88d34 (diff) | |
download | chromium_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}
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 |