aw_settings.cc revision 558790d6acca3451cf3a6b497803a5f07d0bec58
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/aw_settings.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/aw_contents.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/android/jni_android.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/android/jni_string.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_client.h"
1658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/AwSettings_jni.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/user_agent/user_agent.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "webkit/glue/webkit_glue.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ConvertJavaStringToUTF16;
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ScopedJavaLocalRef;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents)
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : WebContentsObserver(
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          reinterpret_cast<content::WebContents*>(web_contents)),
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aw_settings_(env, obj) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwSettings::~AwSettings() {
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  jobject obj = scoped_obj.obj();
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!obj) return;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Java_AwSettings_nativeAwSettingsGone(env, obj,
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       reinterpret_cast<jint>(this));
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::Destroy(JNIEnv* env, jobject obj) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete this;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents()) return NULL;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwContents* contents = AwContents::FromWebContents(web_contents());
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents) return NULL;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return contents->render_view_host_ext();
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rvhe) return;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rvhe->ResetScrollAndScaleState();
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AwSettings::UpdateEverything() {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(env);
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  jobject obj = scoped_obj.obj();
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!obj) return;
66b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Grab the lock and call UpdateEverythingLocked.
67b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Java_AwSettings_updateEverything(env, obj);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
70b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) {
71b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateInitialPageScaleLocked(env, obj);
72b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateWebkitPreferencesLocked(env, obj);
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateUserAgentLocked(env, obj);
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResetScrollAndScaleState(env, obj);
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdatePreferredSizeMode();
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateFormDataPreferencesLocked(env, obj);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
79b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) {
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents()) return;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
82b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jstring> str =
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getUserAgentLocked(env, obj);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ua_overidden = str.obj() != NULL;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (ua_overidden) {
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string override = base::android::ConvertJavaStringToUTF8(str);
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_contents()->SetUserAgentOverride(override);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const content::NavigationController& controller =
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents()->GetController();
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < controller.GetEntryCount(); ++i)
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
97b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents()) return;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!render_view_host_ext) return;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::RenderViewHost* render_view_host =
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents()->GetRenderViewHost();
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!render_view_host) return;
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebPreferences prefs = render_view_host->GetWebkitPreferences();
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.text_autosizing_enabled =
108b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (prefs.text_autosizing_enabled) {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    prefs.font_scale_factor = text_size_percent / 100.0f;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    prefs.force_enable_zoom = text_size_percent >= 130;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Use the default zoom level value when Text Autosizer is turned on.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    render_view_host_ext->SetTextZoomLevel(0);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    prefs.force_enable_zoom = false;
11858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    render_view_host_ext->SetTextZoomLevel(content::ZoomFactorToZoomLevel(
11958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch        text_size_percent / 100.0f));
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.standard_font_family_map[webkit_glue::kCommonScript] =
123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getStandardFontFamilyLocked(env, obj));
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.fixed_font_family_map[webkit_glue::kCommonScript] =
127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
128b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getFixedFontFamilyLocked(env, obj));
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.sans_serif_font_family_map[webkit_glue::kCommonScript] =
131b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
132b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.serif_font_family_map[webkit_glue::kCommonScript] =
135b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getSerifFontFamilyLocked(env, obj));
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.cursive_font_family_map[webkit_glue::kCommonScript] =
139b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
140b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.fantasy_font_family_map[webkit_glue::kCommonScript] =
143b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.default_encoding = ConvertJavaStringToUTF8(
147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.minimum_font_size = Java_AwSettings_getMinimumFontSizeLocked(env, obj);
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.minimum_logical_font_size =
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.default_font_size = Java_AwSettings_getDefaultFontSizeLocked(env, obj);
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.default_fixed_font_size =
157b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Blink's LoadsImagesAutomatically and ImagesEnabled must be
1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // set cris-cross to Android's. See
1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // https://code.google.com/p/chromium/issues/detail?id=224317#c26
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.loads_images_automatically =
1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Java_AwSettings_getImagesEnabledLocked(env, obj);
1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  prefs.images_enabled =
165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.javascript_enabled =
168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.allow_universal_access_from_file_urls =
171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.allow_file_access_from_file_urls =
174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
176b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.javascript_can_open_windows_automatically =
177b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
179b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.supports_multiple_windows =
180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.plugins_enabled = !Java_AwSettings_getPluginsDisabledLocked(env, obj);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.application_cache_enabled =
185b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAppCacheEnabledLocked(env, obj);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.local_storage_enabled =
188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDomStorageEnabledLocked(env, obj);
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
190b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.databases_enabled = Java_AwSettings_getDatabaseEnabledLocked(env, obj);
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs.double_tap_to_zoom_enabled = prefs.use_wide_viewport =
193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getUseWideViewportLocked(env, obj);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.initialize_at_minimum_page_scale =
196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
198b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.user_gesture_required_for_media_playback =
199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jstring> url =
202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
203b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.default_video_poster_url = url.obj() ?
204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      GURL(ConvertJavaStringToUTF8(url)) : GURL();
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  prefs.support_deprecated_target_density_dpi =
207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getSupportDeprecatedTargetDensityDPILocked(env, obj);
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
209ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // TODO(primiano): deferred image decoding seems to cause increased memory
210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // usage in WebView chromium after http://crrev.com/19838002  (at least on
211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // some tests, for instance +18MB on moz and moz2). Thus, deferred image
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // decoding is being disabled until the root of the problem is found.
213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // See http://crbug.com/262957 .
214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  prefs.deferred_image_decoding_enabled = false;
215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
216558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  prefs.password_echo_enabled =
217558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      Java_AwSettings_getPasswordEchoEnabled(env, obj);
218558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  render_view_host->UpdateWebkitPreferences(prefs);
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rvhe) return;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  float initial_page_scale_percent =
227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (initial_page_scale_percent == 0) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    rvhe->SetInitialPageScale(-1);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    float dip_scale = static_cast<float>(
232b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        Java_AwSettings_getDIPScaleLocked(env, obj));
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AwSettings::UpdatePreferredSizeMode() {
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (web_contents()->GetRenderViewHost()) {
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_contents()->GetRenderViewHost()->EnablePreferredSizeMode();
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void AwSettings::UpdateFormDataPreferencesLocked(JNIEnv* env, jobject obj) {
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!web_contents()) return;
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AwContents* contents = AwContents::FromWebContents(web_contents());
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!contents) return;
24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A single WebContents can normally have 0 to many RenderViewHost instances
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // associated with it.
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // This is important since there is only one RenderViewHostExt instance per
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // WebContents (and not one RVHExt per RVH, as you might expect) and updating
256c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // settings via RVHExt only ever updates the 'current' RVH.
257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // In android_webview we don't swap out the RVH on cross-site navigations, so
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we shouldn't have to deal with the multiple RVH per WebContents case. That
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // in turn means that the newly created RVH is always the 'current' RVH
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK.
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DCHECK(web_contents()->GetRenderViewHost() == render_view_host);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateEverything();
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) {
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  delete this;
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static jint Init(JNIEnv* env,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 jobject obj,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 jint web_contents) {
2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AwSettings* settings = new AwSettings(env, obj, web_contents);
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return reinterpret_cast<jint>(settings);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::android::ConvertUTF8ToJavaString(
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      env, content::GetUserAgent(GURL())).Release();
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RegisterAwSettings(JNIEnv* env) {
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RegisterNativesImpl(env) >= 0;
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace android_webview
287