aw_settings.cc revision 010d83a9304c5a91596085d917d248abff47903a
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"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "android_webview/common/aw_content_client.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "android_webview/native/aw_contents.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/android/jni_android.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/android/jni_string.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/supports_user_data.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_controller.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/navigation_entry.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/render_view_host.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/web_contents.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/content_switches.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "content/public/common/renderer_preferences.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "jni/AwSettings_jni.h"
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/gfx/font_render_params_linux.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ConvertJavaStringToUTF16;
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ConvertUTF8ToJavaString;
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using base::android::ScopedJavaLocalRef;
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing content::RendererPreferences;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace android_webview {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// TODO(boliu): Deduplicate with chrome/ code.
345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liucontent::RendererPreferencesHintingEnum GetRendererPreferencesHintingEnum(
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    gfx::FontRenderParams::Hinting hinting) {
365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (hinting) {
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::HINTING_NONE:
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_HINTING_NONE;
395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::HINTING_SLIGHT:
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_HINTING_SLIGHT;
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::HINTING_MEDIUM:
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_HINTING_MEDIUM;
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::HINTING_FULL:
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_HINTING_FULL;
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default:
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      NOTREACHED() << "Unhandled hinting style " << hinting;
475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_HINTING_SYSTEM_DEFAULT;
485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// TODO(boliu): Deduplicate with chrome/ code.
525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liucontent::RendererPreferencesSubpixelRenderingEnum
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuGetRendererPreferencesSubpixelRenderingEnum(
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    gfx::FontRenderParams::SubpixelRendering subpixel_rendering) {
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  switch (subpixel_rendering) {
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::SUBPIXEL_RENDERING_NONE:
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_NONE;
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::SUBPIXEL_RENDERING_RGB:
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_RGB;
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::SUBPIXEL_RENDERING_BGR:
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_BGR;
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::SUBPIXEL_RENDERING_VRGB:
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_VRGB;
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    case gfx::FontRenderParams::SUBPIXEL_RENDERING_VBGR:
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_VBGR;
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default:
675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      NOTREACHED() << "Unhandled subpixel rendering style "
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   << subpixel_rendering;
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      return content::RENDERER_PREFERENCES_SUBPIXEL_RENDERING_SYSTEM_DEFAULT;
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid PopulateFixedRendererPreferences(RendererPreferences* prefs) {
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->tap_multiple_targets_strategy =
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::TAP_MULTIPLE_TARGETS_STRATEGY_NONE;
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // TODO(boliu): Deduplicate with chrome/ code.
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const gfx::FontRenderParams& params = gfx::GetDefaultWebKitFontRenderParams();
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->should_antialias_text = params.antialiasing;
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->use_subpixel_positioning = params.subpixel_positioning;
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->hinting = GetRendererPreferencesHintingEnum(params.hinting);
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->use_autohinter = params.autohinter;
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->use_bitmaps = params.use_bitmaps;
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefs->subpixel_rendering =
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetRendererPreferencesSubpixelRenderingEnum(params.subpixel_rendering);
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid PopulateFixedWebPreferences(WebPreferences* web_prefs) {
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_prefs->shrinks_standalone_images_to_fit = false;
905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  web_prefs->should_clear_document_background = false;
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};  // namespace
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class AwSettingsUserData : public base::SupportsUserData::Data {
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {}
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static AwSettings* GetSettings(content::WebContents* web_contents) {
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!web_contents)
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return NULL;
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>(
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        web_contents->GetUserData(kAwSettingsUserDataKey));
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return data ? data->settings_ : NULL;
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AwSettings* settings_;
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)AwSettings::AwSettings(JNIEnv* env, jobject obj, jlong web_contents)
1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : WebContentsObserver(
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          reinterpret_cast<content::WebContents*>(web_contents)),
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      accelerated_2d_canvas_disabled_by_switch_(
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          CommandLine::ForCurrentProcess()->HasSwitch(
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              switches::kDisableAccelerated2dCanvas)),
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      renderer_prefs_initialized_(false),
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      aw_settings_(env, obj) {
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  reinterpret_cast<content::WebContents*>(web_contents)->
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwSettings::~AwSettings() {
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (web_contents()) {
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_contents()->SetUserData(kAwSettingsUserDataKey, NULL);
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  jobject obj = scoped_obj.obj();
1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!obj) return;
1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Java_AwSettings_nativeAwSettingsGone(env, obj,
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       reinterpret_cast<intptr_t>(this));
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::Destroy(JNIEnv* env, jobject obj) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delete this;
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) {
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return AwSettingsUserData::GetSettings(web_contents);
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents()) return NULL;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwContents* contents = AwContents::FromWebContents(web_contents());
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!contents) return NULL;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return contents->render_view_host_ext();
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!rvhe) return;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  rvhe->ResetScrollAndScaleState();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void AwSettings::UpdateEverything() {
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CHECK(env);
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  jobject obj = scoped_obj.obj();
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!obj) return;
165b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Grab the lock and call UpdateEverythingLocked.
166b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  Java_AwSettings_updateEverything(env, obj);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateEverythingLocked(JNIEnv* env, jobject obj) {
170b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateInitialPageScaleLocked(env, obj);
171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateWebkitPreferencesLocked(env, obj);
172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  UpdateUserAgentLocked(env, obj);
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResetScrollAndScaleState(env, obj);
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  UpdateFormDataPreferencesLocked(env, obj);
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  UpdateRendererPreferencesLocked(env, obj);
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
178b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateUserAgentLocked(JNIEnv* env, jobject obj) {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents()) return;
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
181b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jstring> str =
182b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getUserAgentLocked(env, obj);
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ua_overidden = str.obj() != NULL;
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (ua_overidden) {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::string override = base::android::ConvertJavaStringToUTF8(str);
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_contents()->SetUserAgentOverride(override);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const content::NavigationController& controller =
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents()->GetController();
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 0; i < controller.GetEntryCount(); ++i)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) {
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents()) return;
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!render_view_host_ext) return;
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::RenderViewHost* render_view_host =
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents()->GetRenderViewHost();
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!render_view_host) return;
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  render_view_host->UpdateWebkitPreferences(
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      render_view_host->GetWebkitPreferences());
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!rvhe) return;
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  float initial_page_scale_percent =
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (initial_page_scale_percent == 0) {
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rvhe->SetInitialPageScale(-1);
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  } else {
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    float dip_scale = static_cast<float>(
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        Java_AwSettings_getDIPScaleLocked(env, obj));
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f);
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AwSettings::UpdateFormDataPreferencesLocked(JNIEnv* env, jobject obj) {
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!web_contents()) return;
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AwContents* contents = AwContents::FromWebContents(web_contents());
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!contents) return;
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
2294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AwSettings::UpdateRendererPreferencesLocked(JNIEnv* env, jobject obj) {
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!web_contents()) return;
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool update_prefs = false;
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  RendererPreferences* prefs = web_contents()->GetMutableRendererPrefs();
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!renderer_prefs_initialized_) {
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    PopulateFixedRendererPreferences(prefs);
2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    renderer_prefs_initialized_ = true;
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    update_prefs = true;
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool video_overlay =
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      Java_AwSettings_getVideoOverlayForEmbeddedVideoEnabledLocked(env, obj);
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (video_overlay != prefs->use_video_overlay_for_embedded_encrypted_video) {
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    prefs->use_video_overlay_for_embedded_encrypted_video = video_overlay;
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    update_prefs = true;
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::RenderViewHost* host = web_contents()->GetRenderViewHost();
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (update_prefs && host)
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    host->SyncRendererPrefs();
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // A single WebContents can normally have 0 to many RenderViewHost instances
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // associated with it.
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // This is important since there is only one RenderViewHostExt instance per
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // WebContents (and not one RVHExt per RVH, as you might expect) and updating
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // settings via RVHExt only ever updates the 'current' RVH.
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // In android_webview we don't swap out the RVH on cross-site navigations, so
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // we shouldn't have to deal with the multiple RVH per WebContents case. That
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // in turn means that the newly created RVH is always the 'current' RVH
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK.
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(web_contents()->GetRenderViewHost() == render_view_host);
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  UpdateEverything();
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void AwSettings::WebContentsDestroyed() {
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  delete this;
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  CHECK(env);
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  jobject obj = scoped_obj.obj();
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!obj) return;
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Grab the lock and call PopulateWebPreferencesLocked.
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Java_AwSettings_populateWebPreferences(
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env, obj, reinterpret_cast<jlong>(web_prefs));
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void AwSettings::PopulateWebPreferencesLocked(
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    JNIEnv* env, jobject obj, jlong web_prefs_ptr) {
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!render_view_host_ext) return;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  WebPreferences* web_prefs = reinterpret_cast<WebPreferences*>(web_prefs_ptr);
2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  PopulateFixedWebPreferences(web_prefs);
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->text_autosizing_enabled =
294b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
296b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (web_prefs->text_autosizing_enabled) {
2980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    web_prefs->font_scale_factor = text_size_percent / 100.0f;
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_prefs->force_enable_zoom = text_size_percent >= 130;
300d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Use the default zoom factor value when Text Autosizer is turned on.
301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    render_view_host_ext->SetTextZoomFactor(1);
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else {
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    web_prefs->force_enable_zoom = false;
304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->standard_font_family_map[webkit_glue::kCommonScript] =
308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getStandardFontFamilyLocked(env, obj));
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] =
312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getFixedFontFamilyLocked(env, obj));
314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] =
316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->serif_font_family_map[webkit_glue::kCommonScript] =
320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
321b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getSerifFontFamilyLocked(env, obj));
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] =
324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] =
328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      ConvertJavaStringToUTF16(
329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->default_encoding = ConvertJavaStringToUTF8(
332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->minimum_font_size =
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Java_AwSettings_getMinimumFontSizeLocked(env, obj);
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->minimum_logical_font_size =
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->default_font_size =
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Java_AwSettings_getDefaultFontSizeLocked(env, obj);
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->default_fixed_font_size =
344b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Blink's LoadsImagesAutomatically and ImagesEnabled must be
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // set cris-cross to Android's. See
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // https://code.google.com/p/chromium/issues/detail?id=224317#c26
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->loads_images_automatically =
3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Java_AwSettings_getImagesEnabledLocked(env, obj);
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->images_enabled =
352b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->javascript_enabled =
355b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->allow_universal_access_from_file_urls =
358b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->allow_file_access_from_file_urls =
361b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->javascript_can_open_windows_automatically =
364b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->supports_multiple_windows =
367b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->plugins_enabled =
3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      !Java_AwSettings_getPluginsDisabledLocked(env, obj);
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->application_cache_enabled =
373b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getAppCacheEnabledLocked(env, obj);
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->local_storage_enabled =
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDomStorageEnabledLocked(env, obj);
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->databases_enabled =
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Java_AwSettings_getDatabaseEnabledLocked(env, obj);
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->wide_viewport_quirk = true;
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_prefs->use_wide_viewport =
383b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getUseWideViewportLocked(env, obj);
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  web_prefs->double_tap_to_zoom_enabled =
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Java_AwSettings_supportsDoubleTapZoomLocked(env, obj);
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->initialize_at_minimum_page_scale =
389b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->user_gesture_required_for_media_playback =
392b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
394b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ScopedJavaLocalRef<jstring> url =
395b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->default_video_poster_url = url.obj() ?
397b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      GURL(ConvertJavaStringToUTF8(url)) : GURL();
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Please see the corresponding Blink settings for bug references.
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->support_deprecated_target_density_dpi = support_quirks;
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks;
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->viewport_meta_layout_size_quirk = support_quirks;
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  web_prefs->viewport_meta_merge_content_quirk = support_quirks;
405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_prefs->viewport_meta_non_user_scalable_quirk = support_quirks;
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->viewport_meta_zero_values_quirk = support_quirks;
407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  web_prefs->clobber_user_agent_initial_scale_quirk = support_quirks;
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks;
4098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  web_prefs->report_screen_size_in_physical_pixels_quirk = support_quirks;
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  web_prefs->password_echo_enabled =
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Java_AwSettings_getPasswordEchoEnabledLocked(env, obj);
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  web_prefs->spatial_navigation_enabled =
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      Java_AwSettings_getSpatialNavigationLocked(env, obj);
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  web_prefs->accelerated_2d_canvas_enabled = true;
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (accelerated_2d_canvas_disabled_by_switch_ ||
418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      !Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          env, obj)) {
420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Any canvas smaller than this will fallback to software. Abusing this
421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // slightly to turn canvas off without changing
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // accelerated_2d_canvas_enabled, which also affects compositing mode.
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // Using 100M instead of max int to avoid overflows.
424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    web_prefs->minimum_accelerated_2d_canvas_size = 100 * 1000 * 1000;
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  web_prefs->allow_displaying_insecure_content =
4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      Java_AwSettings_getAllowDisplayingInsecureContentLocked(env, obj);
4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  web_prefs->allow_running_insecure_content =
4300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj);
4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)static jlong Init(JNIEnv* env,
434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  jobject obj,
435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  jlong web_contents) {
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AwSettings* settings = new AwSettings(env, obj, web_contents);
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return reinterpret_cast<intptr_t>(settings);
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return base::android::ConvertUTF8ToJavaString(env, GetUserAgent()).Release();
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RegisterAwSettings(JNIEnv* env) {
4450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return RegisterNativesImpl(env);
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace android_webview
449