Commit 56aca707 authored by boliu@chromium.org's avatar boliu@chromium.org

[Android WebView] Turn on accelerated canvas based on View.isHardwareAccelerated

In onAttachedToWindow, check that if the view is hardware accelerated,
then enable hardware accelerated 2d canvas. Similarly disable canvas on
detach.

Note that accelerated 2d canvas is still off by default, but this patch
adds a command line switch to turn it on.

BUG=332273

Review URL: https://codereview.chromium.org/140753006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@245648 0039d316-1c4b-4281-b951-d872f2087c98
parent e842c17b
......@@ -14,4 +14,6 @@ const char kTileMemoryMultiplier[] = "tile-memory-multiplier";
const char kNumGrallocBuffersPerWebview[] = "num-gralloc-buffers-per-webview";
const char kEnableAccelerated2dCanvas[] = "enable-accelerated-2d-canvas";
} // namespace switches
......@@ -20,6 +20,10 @@ extern const char kTileMemoryMultiplier[];
// Maximum number of gralloc allocations per webview.
extern const char kNumGrallocBuffersPerWebview[];
// Explicitly enable accelerated 2d canvas.
// TODO(boliu): Remove this switch once on by default.
extern const char kEnableAccelerated2dCanvas[];
} // namespace switches
#endif // ANDROID_WEBVIEW_COMMON_AW_SWITCHES_H_
......@@ -1550,6 +1550,8 @@ public class AwContents {
mContentViewCore.onAttachedToWindow();
nativeOnAttachedToWindow(mNativeAwContents, mContainerView.getWidth(),
mContainerView.getHeight());
mSettings.setEnableSupportedHardwareAcceleratedFeatures(
mContainerView.isHardwareAccelerated());
if (mComponentCallbacks != null) return;
mComponentCallbacks = new AwComponentCallbacks();
......@@ -1568,6 +1570,8 @@ public class AwContents {
mContentViewCore.onDetachedFromWindow();
mSettings.setEnableSupportedHardwareAcceleratedFeatures(false);
if (mComponentCallbacks != null) {
mContainerView.getContext().unregisterComponentCallbacks(mComponentCallbacks);
mComponentCallbacks = null;
......
......@@ -83,6 +83,7 @@ public class AwSettings {
private String mDefaultVideoPosterURL;
private float mInitialPageScalePercent = 0;
private boolean mSpatialNavigationEnabled; // Default depends on device features.
private boolean mEnableSupportedHardwareAcceleratedFeatures = false;
private final boolean mSupportLegacyQuirks;
......@@ -398,6 +399,20 @@ public class AwSettings {
return mSpatialNavigationEnabled;
}
void setEnableSupportedHardwareAcceleratedFeatures(boolean enable) {
synchronized (mAwSettingsLock) {
if (mEnableSupportedHardwareAcceleratedFeatures != enable) {
mEnableSupportedHardwareAcceleratedFeatures = enable;
mEventHandler.updateWebkitPreferencesLocked();
}
}
}
@CalledByNative
private boolean getEnableSupportedHardwareAcceleratedFeaturesLocked() {
return mEnableSupportedHardwareAcceleratedFeatures;
}
/**
* See {@link android.webkit.WebSettings#setNeedInitialFocus}.
*/
......
......@@ -8,6 +8,7 @@
#include "android_webview/browser/gpu_memory_buffer_factory_impl.h"
#include "android_webview/browser/in_process_view_renderer.h"
#include "android_webview/browser/scoped_allow_wait_for_legacy_web_view_api.h"
#include "android_webview/common/aw_switches.h"
#include "android_webview/lib/aw_browser_dependency_factory_impl.h"
#include "android_webview/native/aw_geolocation_permission_context.h"
#include "android_webview/native/aw_quota_manager_bridge_impl.h"
......@@ -66,7 +67,9 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) {
cl->AppendSwitch(switches::kDisableExperimentalWebGL);
cl->AppendSwitch(switches::kDisableSharedWorkers);
// Ganesh backed 2D-Canvas is not yet working and causes crashes.
// Ganesh backed 2D-Canvas integration is being implemented but not ready to
// be turned on by default yet.
if (!cl->HasSwitch(switches::kEnableAccelerated2dCanvas))
cl->AppendSwitch(switches::kDisableAccelerated2dCanvas);
// File system API not supported (requires some new API; internal bug 6930981)
......
......@@ -8,12 +8,14 @@
#include "android_webview/native/aw_contents.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/command_line.h"
#include "base/supports_user_data.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_switches.h"
#include "jni/AwSettings_jni.h"
#include "webkit/common/user_agent/user_agent.h"
#include "webkit/common/webpreferences.h"
......@@ -45,6 +47,9 @@ class AwSettingsUserData : public base::SupportsUserData::Data {
AwSettings::AwSettings(JNIEnv* env, jobject obj, jlong web_contents)
: WebContentsObserver(
reinterpret_cast<content::WebContents*>(web_contents)),
accelerated_2d_canvas_disabled_by_switch_(
CommandLine::ForCurrentProcess()->HasSwitch(
switches::kDisableAccelerated2dCanvas)),
aw_settings_(env, obj) {
reinterpret_cast<content::WebContents*>(web_contents)->
SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
......@@ -312,6 +317,11 @@ void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
Java_AwSettings_getPasswordEchoEnabledLocked(env, obj);
web_prefs->spatial_navigation_enabled =
Java_AwSettings_getSpatialNavigationLocked(env, obj);
web_prefs->accelerated_2d_canvas_enabled =
!accelerated_2d_canvas_disabled_by_switch_ &&
Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
env, obj);
}
static jlong Init(JNIEnv* env,
......
......@@ -50,6 +50,8 @@ class AwSettings : public content::WebContentsObserver {
virtual void WebContentsDestroyed(
content::WebContents* web_contents) OVERRIDE;
bool accelerated_2d_canvas_disabled_by_switch_;
JavaObjectWeakGlobalRef aw_settings_;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment