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"
1117bd0998cb865093270d712b29b004829024d391Ben Murdoch#include "base/supports_user_data.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_client.h"
1758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/public/common/page_zoom.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/AwSettings_jni.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/common/user_agent/user_agent.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "webkit/glue/webkit_glue.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ConvertJavaStringToUTF16;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ScopedJavaLocalRef;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2917bd0998cb865093270d712b29b004829024d391Ben Murdochconst void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
3017bd0998cb865093270d712b29b004829024d391Ben Murdoch
3117bd0998cb865093270d712b29b004829024d391Ben Murdochclass AwSettingsUserData : public base::SupportsUserData::Data {
3217bd0998cb865093270d712b29b004829024d391Ben Murdoch public:
3317bd0998cb865093270d712b29b004829024d391Ben Murdoch  AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {}
3417bd0998cb865093270d712b29b004829024d391Ben Murdoch
3517bd0998cb865093270d712b29b004829024d391Ben Murdoch  static AwSettings* GetSettings(content::WebContents* web_contents) {
3617bd0998cb865093270d712b29b004829024d391Ben Murdoch    if (!web_contents)
3717bd0998cb865093270d712b29b004829024d391Ben Murdoch      return NULL;
3817bd0998cb865093270d712b29b004829024d391Ben Murdoch    AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>(
3917bd0998cb865093270d712b29b004829024d391Ben Murdoch        web_contents->GetUserData(kAwSettingsUserDataKey));
4017bd0998cb865093270d712b29b004829024d391Ben Murdoch    return data ? data->settings_ : NULL;
4117bd0998cb865093270d712b29b004829024d391Ben Murdoch  }
4217bd0998cb865093270d712b29b004829024d391Ben Murdoch
4317bd0998cb865093270d712b29b004829024d391Ben Murdoch private:
4417bd0998cb865093270d712b29b004829024d391Ben Murdoch  AwSettings* settings_;
4517bd0998cb865093270d712b29b004829024d391Ben Murdoch};
4617bd0998cb865093270d712b29b004829024d391Ben Murdoch
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents)
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : WebContentsObserver(
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          reinterpret_cast<content::WebContents*>(web_contents)),
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aw_settings_(env, obj) {
5117bd0998cb865093270d712b29b004829024d391Ben Murdoch  reinterpret_cast<content::WebContents*>(web_contents)->
5217bd0998cb865093270d712b29b004829024d391Ben Murdoch      SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwSettings::~AwSettings() {
5617bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (web_contents()) {
5717bd0998cb865093270d712b29b004829024d391Ben Murdoch    web_contents()->SetUserData(kAwSettingsUserDataKey, NULL);
5817bd0998cb865093270d712b29b004829024d391Ben Murdoch  }
5917bd0998cb865093270d712b29b004829024d391Ben Murdoch
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  jobject obj = scoped_obj.obj();
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!obj) return;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Java_AwSettings_nativeAwSettingsGone(env, obj,
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       reinterpret_cast<jint>(this));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::Destroy(JNIEnv* env, jobject obj) {
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete this;
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7217bd0998cb865093270d712b29b004829024d391Ben MurdochAwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) {
7317bd0998cb865093270d712b29b004829024d391Ben Murdoch  return AwSettingsUserData::GetSettings(web_contents);
7417bd0998cb865093270d712b29b004829024d391Ben Murdoch}
7517bd0998cb865093270d712b29b004829024d391Ben Murdoch
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents()) return NULL;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwContents* contents = AwContents::FromWebContents(web_contents());
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents) return NULL;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return contents->render_view_host_ext();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rvhe) return;
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rvhe->ResetScrollAndScaleState();
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AwSettings::UpdateEverything() {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(env);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  jobject obj = scoped_obj.obj();
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!obj) return;
95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Grab the lock and call UpdateEverythingLocked.
96b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Java_AwSettings_updateEverything(env, obj);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) {
100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateInitialPageScaleLocked(env, obj);
101b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateWebkitPreferencesLocked(env, obj);
102b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateUserAgentLocked(env, obj);
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResetScrollAndScaleState(env, obj);
10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateFormDataPreferencesLocked(env, obj);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) {
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents()) return;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jstring> str =
111b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getUserAgentLocked(env, obj);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ua_overidden = str.obj() != NULL;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (ua_overidden) {
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string override = base::android::ConvertJavaStringToUTF8(str);
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_contents()->SetUserAgentOverride(override);
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const content::NavigationController& controller =
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents()->GetController();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < controller.GetEntryCount(); ++i)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
125b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents()) return;
127c85cc835a1dd85051b4cd6465c2b41677c7b2e7cBen Murdoch  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
128c85cc835a1dd85051b4cd6465c2b41677c7b2e7cBen Murdoch  if (!render_view_host_ext) return;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::RenderViewHost* render_view_host =
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents()->GetRenderViewHost();
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!render_view_host) return;
13317bd0998cb865093270d712b29b004829024d391Ben Murdoch  render_view_host->UpdateWebkitPreferences(
13417bd0998cb865093270d712b29b004829024d391Ben Murdoch      render_view_host->GetWebkitPreferences());
13517bd0998cb865093270d712b29b004829024d391Ben Murdoch}
13617bd0998cb865093270d712b29b004829024d391Ben Murdoch
13717bd0998cb865093270d712b29b004829024d391Ben Murdochvoid AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
13817bd0998cb865093270d712b29b004829024d391Ben Murdoch  AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
13917bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (!rvhe) return;
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14117bd0998cb865093270d712b29b004829024d391Ben Murdoch  float initial_page_scale_percent =
14217bd0998cb865093270d712b29b004829024d391Ben Murdoch      Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
14317bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (initial_page_scale_percent == 0) {
14417bd0998cb865093270d712b29b004829024d391Ben Murdoch    rvhe->SetInitialPageScale(-1);
14517bd0998cb865093270d712b29b004829024d391Ben Murdoch  } else {
14617bd0998cb865093270d712b29b004829024d391Ben Murdoch    float dip_scale = static_cast<float>(
14717bd0998cb865093270d712b29b004829024d391Ben Murdoch        Java_AwSettings_getDIPScaleLocked(env, obj));
14817bd0998cb865093270d712b29b004829024d391Ben Murdoch    rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f);
14917bd0998cb865093270d712b29b004829024d391Ben Murdoch  }
15017bd0998cb865093270d712b29b004829024d391Ben Murdoch}
15117bd0998cb865093270d712b29b004829024d391Ben Murdoch
15217bd0998cb865093270d712b29b004829024d391Ben Murdochvoid AwSettings::UpdateFormDataPreferencesLocked(JNIEnv* env, jobject obj) {
15317bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (!web_contents()) return;
15417bd0998cb865093270d712b29b004829024d391Ben Murdoch  AwContents* contents = AwContents::FromWebContents(web_contents());
15517bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (!contents) return;
15617bd0998cb865093270d712b29b004829024d391Ben Murdoch
15717bd0998cb865093270d712b29b004829024d391Ben Murdoch  contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
15817bd0998cb865093270d712b29b004829024d391Ben Murdoch}
15917bd0998cb865093270d712b29b004829024d391Ben Murdoch
16017bd0998cb865093270d712b29b004829024d391Ben Murdochvoid AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
16117bd0998cb865093270d712b29b004829024d391Ben Murdoch  // A single WebContents can normally have 0 to many RenderViewHost instances
16217bd0998cb865093270d712b29b004829024d391Ben Murdoch  // associated with it.
16317bd0998cb865093270d712b29b004829024d391Ben Murdoch  // This is important since there is only one RenderViewHostExt instance per
16417bd0998cb865093270d712b29b004829024d391Ben Murdoch  // WebContents (and not one RVHExt per RVH, as you might expect) and updating
16517bd0998cb865093270d712b29b004829024d391Ben Murdoch  // settings via RVHExt only ever updates the 'current' RVH.
16617bd0998cb865093270d712b29b004829024d391Ben Murdoch  // In android_webview we don't swap out the RVH on cross-site navigations, so
16717bd0998cb865093270d712b29b004829024d391Ben Murdoch  // we shouldn't have to deal with the multiple RVH per WebContents case. That
16817bd0998cb865093270d712b29b004829024d391Ben Murdoch  // in turn means that the newly created RVH is always the 'current' RVH
16917bd0998cb865093270d712b29b004829024d391Ben Murdoch  // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK.
17017bd0998cb865093270d712b29b004829024d391Ben Murdoch  DCHECK(web_contents()->GetRenderViewHost() == render_view_host);
17117bd0998cb865093270d712b29b004829024d391Ben Murdoch
17217bd0998cb865093270d712b29b004829024d391Ben Murdoch  UpdateEverything();
17317bd0998cb865093270d712b29b004829024d391Ben Murdoch}
17417bd0998cb865093270d712b29b004829024d391Ben Murdoch
17517bd0998cb865093270d712b29b004829024d391Ben Murdochvoid AwSettings::WebContentsDestroyed(content::WebContents* web_contents) {
17617bd0998cb865093270d712b29b004829024d391Ben Murdoch  delete this;
17717bd0998cb865093270d712b29b004829024d391Ben Murdoch}
17817bd0998cb865093270d712b29b004829024d391Ben Murdoch
179f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.org// static
180f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.orgvoid AwSettings::PopulateFixedPreferences(WebPreferences* web_prefs) {
181f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.org  web_prefs->shrinks_standalone_images_to_fit = false;
182431571a3a769041c098e15fed32e0a980b3029d2Bo Liu  web_prefs->should_clear_document_background = false;
183f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.org}
184f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.org
18517bd0998cb865093270d712b29b004829024d391Ben Murdochvoid AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
18617bd0998cb865093270d712b29b004829024d391Ben Murdoch  JNIEnv* env = base::android::AttachCurrentThread();
18717bd0998cb865093270d712b29b004829024d391Ben Murdoch  CHECK(env);
18817bd0998cb865093270d712b29b004829024d391Ben Murdoch
18917bd0998cb865093270d712b29b004829024d391Ben Murdoch  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
19017bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (!render_view_host_ext) return;
19117bd0998cb865093270d712b29b004829024d391Ben Murdoch
19217bd0998cb865093270d712b29b004829024d391Ben Murdoch  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
19317bd0998cb865093270d712b29b004829024d391Ben Murdoch  jobject obj = scoped_obj.obj();
19417bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (!obj) return;
19517bd0998cb865093270d712b29b004829024d391Ben Murdoch
196f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.org  PopulateFixedPreferences(web_prefs);
197f1f5a614c72ca11541bdec079819d75c98464177boliu@chromium.org
19817bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->text_autosizing_enabled =
199b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
20217bd0998cb865093270d712b29b004829024d391Ben Murdoch  if (web_prefs->text_autosizing_enabled) {
20317bd0998cb865093270d712b29b004829024d391Ben Murdoch    web_prefs->font_scale_factor = text_size_percent / 100.0f;
20417bd0998cb865093270d712b29b004829024d391Ben Murdoch    web_prefs->force_enable_zoom = text_size_percent >= 130;
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Use the default zoom level value when Text Autosizer is turned on.
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    render_view_host_ext->SetTextZoomLevel(0);
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
20817bd0998cb865093270d712b29b004829024d391Ben Murdoch    web_prefs->force_enable_zoom = false;
20958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    render_view_host_ext->SetTextZoomLevel(content::ZoomFactorToZoomLevel(
21058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch        text_size_percent / 100.0f));
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21317bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->standard_font_family_map[webkit_glue::kCommonScript] =
214b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
215b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getStandardFontFamilyLocked(env, obj));
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
21717bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] =
218b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getFixedFontFamilyLocked(env, obj));
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22117bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] =
222b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22517bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->serif_font_family_map[webkit_glue::kCommonScript] =
226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
227b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getSerifFontFamilyLocked(env, obj));
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22917bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] =
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
231b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23317bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] =
234b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
235b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23717bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->default_encoding = ConvertJavaStringToUTF8(
238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24017bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->minimum_font_size =
24117bd0998cb865093270d712b29b004829024d391Ben Murdoch      Java_AwSettings_getMinimumFontSizeLocked(env, obj);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24317bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->minimum_logical_font_size =
244b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24617bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->default_font_size =
24717bd0998cb865093270d712b29b004829024d391Ben Murdoch      Java_AwSettings_getDefaultFontSizeLocked(env, obj);
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24917bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->default_fixed_font_size =
250b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Blink's LoadsImagesAutomatically and ImagesEnabled must be
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // set cris-cross to Android's. See
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // https://code.google.com/p/chromium/issues/detail?id=224317#c26
25517bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->loads_images_automatically =
2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Java_AwSettings_getImagesEnabledLocked(env, obj);
25717bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->images_enabled =
258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26017bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->javascript_enabled =
261b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26317bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->allow_universal_access_from_file_urls =
264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26617bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->allow_file_access_from_file_urls =
267b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26917bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->javascript_can_open_windows_automatically =
270b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27217bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->supports_multiple_windows =
273b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27517bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->plugins_enabled =
27617bd0998cb865093270d712b29b004829024d391Ben Murdoch      !Java_AwSettings_getPluginsDisabledLocked(env, obj);
277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
27817bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->application_cache_enabled =
279b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAppCacheEnabledLocked(env, obj);
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28117bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->local_storage_enabled =
282b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDomStorageEnabledLocked(env, obj);
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28417bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->databases_enabled =
28517bd0998cb865093270d712b29b004829024d391Ben Murdoch      Java_AwSettings_getDatabaseEnabledLocked(env, obj);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28717bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->wide_viewport_quirk = true;
28817bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->double_tap_to_zoom_enabled = web_prefs->use_wide_viewport =
289b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getUseWideViewportLocked(env, obj);
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29117bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->initialize_at_minimum_page_scale =
292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29417bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->user_gesture_required_for_media_playback =
295b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2973e35739886bcb31eef708caed3d7e45aa522b142Kristian Monsen  // Temporary setting, for K release only
2983e35739886bcb31eef708caed3d7e45aa522b142Kristian Monsen  // This is a fork from upstream chromium, and should go away once
2993e35739886bcb31eef708caed3d7e45aa522b142Kristian Monsen  // https://code.google.com/p/chromium/issues/detail?id=297216
3003e35739886bcb31eef708caed3d7e45aa522b142Kristian Monsen  // is implemented
30117bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->allow_running_insecure_content = true;
3023e35739886bcb31eef708caed3d7e45aa522b142Kristian Monsen
303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jstring> url =
304b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
30517bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->default_video_poster_url = url.obj() ?
306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      GURL(ConvertJavaStringToUTF8(url)) : GURL();
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3087879b4e35bc0616056661d21ed48d28e6cecd0a0Torne (Richard Coles)  bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
30917bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->support_deprecated_target_density_dpi = support_quirks;
31017bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks;
31117bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->viewport_meta_layout_size_quirk = support_quirks;
31292b481d04cc09465f5b62c36bc1155f95c83ab09Mikhail Naganov  web_prefs->viewport_meta_merge_quirk = support_quirks;
31317bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->viewport_meta_zero_values_quirk = support_quirks;
31417bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks;
315b76d682e577a78ae238af2584c91351331c8ea61Mikhail Naganov  web_prefs->report_screen_size_in_physical_pixels_quirk = support_quirks;
316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
31717bd0998cb865093270d712b29b004829024d391Ben Murdoch  web_prefs->password_echo_enabled =
318325e9a0b42e50545e2b581f7ad931c59f83b414ejoth@chromium.org      Java_AwSettings_getPasswordEchoEnabledLocked(env, obj);
319325e9a0b42e50545e2b581f7ad931c59f83b414ejoth@chromium.org  web_prefs->spatial_navigation_enabled =
320325e9a0b42e50545e2b581f7ad931c59f83b414ejoth@chromium.org      Java_AwSettings_getSpatialNavigationLocked(env, obj);
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static jint Init(JNIEnv* env,
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 jobject obj,
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 jint web_contents) {
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AwSettings* settings = new AwSettings(env, obj, web_contents);
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return reinterpret_cast<jint>(settings);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return base::android::ConvertUTF8ToJavaString(
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      env, content::GetUserAgent(GURL())).Release();
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RegisterAwSettings(JNIEnv* env) {
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RegisterNativesImpl(env) >= 0;
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace android_webview
340