Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / android_webview / native / aw_settings.cc
index 13c7f08..43ea4ae 100644 (file)
@@ -5,27 +5,53 @@
 #include "android_webview/native/aw_settings.h"
 
 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
+#include "android_webview/common/aw_content_client.h"
 #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/macros.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 "content/public/common/renderer_preferences.h"
+#include "content/public/common/web_preferences.h"
 #include "jni/AwSettings_jni.h"
-#include "webkit/common/user_agent/user_agent.h"
-#include "webkit/common/webpreferences.h"
+#include "ui/gfx/font_render_params.h"
 
 using base::android::ConvertJavaStringToUTF16;
 using base::android::ConvertUTF8ToJavaString;
 using base::android::ScopedJavaLocalRef;
+using content::RendererPreferences;
+using content::WebPreferences;
 
 namespace android_webview {
 
+namespace {
+
+void PopulateFixedRendererPreferences(RendererPreferences* prefs) {
+  prefs->tap_multiple_targets_strategy =
+      content::TAP_MULTIPLE_TARGETS_STRATEGY_NONE;
+
+  // TODO(boliu): Deduplicate with chrome/ code.
+  CR_DEFINE_STATIC_LOCAL(const gfx::FontRenderParams, params,
+      (gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(true), NULL)));
+  prefs->should_antialias_text = params.antialiasing;
+  prefs->use_subpixel_positioning = params.subpixel_positioning;
+  prefs->hinting = params.hinting;
+  prefs->use_autohinter = params.autohinter;
+  prefs->use_bitmaps = params.use_bitmaps;
+  prefs->subpixel_rendering = params.subpixel_rendering;
+}
+
+void PopulateFixedWebPreferences(WebPreferences* web_prefs) {
+  web_prefs->shrinks_standalone_images_to_fit = false;
+  web_prefs->should_clear_document_background = false;
+}
+
+};  // namespace
+
 const void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
 
 class AwSettingsUserData : public base::SupportsUserData::Data {
@@ -35,7 +61,7 @@ class AwSettingsUserData : public base::SupportsUserData::Data {
   static AwSettings* GetSettings(content::WebContents* web_contents) {
     if (!web_contents)
       return NULL;
-    AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>(
+    AwSettingsUserData* data = static_cast<AwSettingsUserData*>(
         web_contents->GetUserData(kAwSettingsUserDataKey));
     return data ? data->settings_ : NULL;
   }
@@ -47,9 +73,7 @@ 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)),
+      renderer_prefs_initialized_(false),
       aw_settings_(env, obj) {
   reinterpret_cast<content::WebContents*>(web_contents)->
       SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
@@ -105,6 +129,7 @@ void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) {
   UpdateUserAgentLocked(env, obj);
   ResetScrollAndScaleState(env, obj);
   UpdateFormDataPreferencesLocked(env, obj);
+  UpdateRendererPreferencesLocked(env, obj);
 }
 
 void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) {
@@ -133,8 +158,7 @@ void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) {
   content::RenderViewHost* render_view_host =
       web_contents()->GetRenderViewHost();
   if (!render_view_host) return;
-  render_view_host->UpdateWebkitPreferences(
-      render_view_host->GetWebkitPreferences());
+  render_view_host->OnWebkitPreferencesChanged();
 }
 
 void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
@@ -160,6 +184,30 @@ void AwSettings::UpdateFormDataPreferencesLocked(JNIEnv* env, jobject obj) {
   contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
 }
 
+void AwSettings::UpdateRendererPreferencesLocked(JNIEnv* env, jobject obj) {
+  if (!web_contents()) return;
+
+  bool update_prefs = false;
+  RendererPreferences* prefs = web_contents()->GetMutableRendererPrefs();
+
+  if (!renderer_prefs_initialized_) {
+    PopulateFixedRendererPreferences(prefs);
+    renderer_prefs_initialized_ = true;
+    update_prefs = true;
+  }
+
+  bool video_overlay =
+      Java_AwSettings_getVideoOverlayForEmbeddedVideoEnabledLocked(env, obj);
+  if (video_overlay != prefs->use_video_overlay_for_embedded_encrypted_video) {
+    prefs->use_video_overlay_for_embedded_encrypted_video = video_overlay;
+    update_prefs = true;
+  }
+
+  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
+  if (update_prefs && host)
+    host->SyncRendererPrefs();
+}
+
 void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
   // A single WebContents can normally have 0 to many RenderViewHost instances
   // associated with it.
@@ -170,33 +218,33 @@ void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
   // we shouldn't have to deal with the multiple RVH per WebContents case. That
   // in turn means that the newly created RVH is always the 'current' RVH
   // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK.
-  DCHECK(web_contents()->GetRenderViewHost() == render_view_host);
+  DCHECK_EQ(render_view_host, web_contents()->GetRenderViewHost());
 
   UpdateEverything();
 }
 
-void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) {
+void AwSettings::WebContentsDestroyed() {
   delete this;
 }
 
-// static
-void AwSettings::PopulateFixedPreferences(WebPreferences* web_prefs) {
-  web_prefs->shrinks_standalone_images_to_fit = false;
-  web_prefs->should_clear_document_background = false;
-}
-
 void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
   JNIEnv* env = base::android::AttachCurrentThread();
   CHECK(env);
-
-  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
-  if (!render_view_host_ext) return;
-
   ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
   jobject obj = scoped_obj.obj();
   if (!obj) return;
+  // Grab the lock and call PopulateWebPreferencesLocked.
+  Java_AwSettings_populateWebPreferences(
+      env, obj, reinterpret_cast<jlong>(web_prefs));
+}
 
-  PopulateFixedPreferences(web_prefs);
+void AwSettings::PopulateWebPreferencesLocked(
+    JNIEnv* env, jobject obj, jlong web_prefs_ptr) {
+  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
+  if (!render_view_host_ext) return;
+
+  WebPreferences* web_prefs = reinterpret_cast<WebPreferences*>(web_prefs_ptr);
+  PopulateFixedWebPreferences(web_prefs);
 
   web_prefs->text_autosizing_enabled =
       Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
@@ -212,27 +260,27 @@ void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
     render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
   }
 
-  web_prefs->standard_font_family_map[webkit_glue::kCommonScript] =
+  web_prefs->standard_font_family_map[content::kCommonScript] =
       ConvertJavaStringToUTF16(
           Java_AwSettings_getStandardFontFamilyLocked(env, obj));
 
-  web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] =
+  web_prefs->fixed_font_family_map[content::kCommonScript] =
       ConvertJavaStringToUTF16(
           Java_AwSettings_getFixedFontFamilyLocked(env, obj));
 
-  web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] =
+  web_prefs->sans_serif_font_family_map[content::kCommonScript] =
       ConvertJavaStringToUTF16(
           Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
 
-  web_prefs->serif_font_family_map[webkit_glue::kCommonScript] =
+  web_prefs->serif_font_family_map[content::kCommonScript] =
       ConvertJavaStringToUTF16(
           Java_AwSettings_getSerifFontFamilyLocked(env, obj));
 
-  web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] =
+  web_prefs->cursive_font_family_map[content::kCommonScript] =
       ConvertJavaStringToUTF16(
           Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
 
-  web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] =
+  web_prefs->fantasy_font_family_map[content::kCommonScript] =
       ConvertJavaStringToUTF16(
           Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
 
@@ -287,9 +335,20 @@ void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
       Java_AwSettings_getDatabaseEnabledLocked(env, obj);
 
   web_prefs->wide_viewport_quirk = true;
-  web_prefs->double_tap_to_zoom_enabled = web_prefs->use_wide_viewport =
+  web_prefs->use_wide_viewport =
       Java_AwSettings_getUseWideViewportLocked(env, obj);
 
+  web_prefs->force_zero_layout_height =
+      Java_AwSettings_getForceZeroLayoutHeightLocked(env, obj);
+
+  const bool zero_layout_height_disables_viewport_quirk =
+      Java_AwSettings_getZeroLayoutHeightDisablesViewportQuirkLocked(env, obj);
+  web_prefs->viewport_enabled = !(zero_layout_height_disables_viewport_quirk &&
+                                  web_prefs->force_zero_layout_height);
+
+  web_prefs->double_tap_to_zoom_enabled =
+      Java_AwSettings_supportsDoubleTapZoomLocked(env, obj);
+
   web_prefs->initialize_at_minimum_page_scale =
       Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
 
@@ -318,10 +377,32 @@ void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
   web_prefs->spatial_navigation_enabled =
       Java_AwSettings_getSpatialNavigationLocked(env, obj);
 
-  web_prefs->accelerated_2d_canvas_enabled =
-      !accelerated_2d_canvas_disabled_by_switch_ &&
+  bool enable_supported_hardware_accelerated_features =
       Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
-          env, obj);
+                env, obj);
+
+  bool accelerated_2d_canvas_enabled_by_switch =
+      web_prefs->accelerated_2d_canvas_enabled;
+  web_prefs->accelerated_2d_canvas_enabled = true;
+  if (!accelerated_2d_canvas_enabled_by_switch ||
+      !enable_supported_hardware_accelerated_features) {
+    // Any canvas smaller than this will fallback to software. Abusing this
+    // slightly to turn canvas off without changing
+    // accelerated_2d_canvas_enabled, which also affects compositing mode.
+    // Using 100M instead of max int to avoid overflows.
+    web_prefs->minimum_accelerated_2d_canvas_size = 100 * 1000 * 1000;
+  }
+  web_prefs->experimental_webgl_enabled =
+      web_prefs->experimental_webgl_enabled &&
+      enable_supported_hardware_accelerated_features;
+
+  web_prefs->allow_displaying_insecure_content =
+      Java_AwSettings_getAllowDisplayingInsecureContentLocked(env, obj);
+  web_prefs->allow_running_insecure_content =
+      Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj);
+
+  web_prefs->fullscreen_supported =
+      Java_AwSettings_getFullscreenSupportedLocked(env, obj);
 }
 
 static jlong Init(JNIEnv* env,
@@ -332,12 +413,11 @@ static jlong Init(JNIEnv* env,
 }
 
 static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
-  return base::android::ConvertUTF8ToJavaString(
-      env, content::GetUserAgent(GURL())).Release();
+  return base::android::ConvertUTF8ToJavaString(env, GetUserAgent()).Release();
 }
 
 bool RegisterAwSettings(JNIEnv* env) {
-  return RegisterNativesImpl(env) >= 0;
+  return RegisterNativesImpl(env);
 }
 
 }  // namespace android_webview