Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(590)

Side by Side Diff: android_webview/native/aw_settings.cc

Issue 23619089: [Android WebView] Populate WebKit WebPreferences correctly in browser (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « android_webview/native/aw_settings.h ('k') | android_webview/native/webview_native.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/native/aw_settings.h" 5 #include "android_webview/native/aw_settings.h"
6 6
7 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h" 7 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
8 #include "android_webview/native/aw_contents.h" 8 #include "android_webview/native/aw_contents.h"
9 #include "base/android/jni_android.h" 9 #include "base/android/jni_android.h"
10 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
11 #include "base/supports_user_data.h"
11 #include "content/public/browser/navigation_controller.h" 12 #include "content/public/browser/navigation_controller.h"
12 #include "content/public/browser/navigation_entry.h" 13 #include "content/public/browser/navigation_entry.h"
13 #include "content/public/browser/render_view_host.h" 14 #include "content/public/browser/render_view_host.h"
14 #include "content/public/browser/web_contents.h" 15 #include "content/public/browser/web_contents.h"
15 #include "content/public/common/content_client.h" 16 #include "content/public/common/content_client.h"
16 #include "jni/AwSettings_jni.h" 17 #include "jni/AwSettings_jni.h"
17 #include "webkit/common/user_agent/user_agent.h" 18 #include "webkit/common/user_agent/user_agent.h"
18 #include "webkit/common/webpreferences.h" 19 #include "webkit/common/webpreferences.h"
19 #include "webkit/glue/webkit_glue.h" 20 #include "webkit/glue/webkit_glue.h"
20 21
22 #include "base/logging.h"
23
21 using base::android::ConvertJavaStringToUTF16; 24 using base::android::ConvertJavaStringToUTF16;
22 using base::android::ConvertUTF8ToJavaString; 25 using base::android::ConvertUTF8ToJavaString;
23 using base::android::ScopedJavaLocalRef; 26 using base::android::ScopedJavaLocalRef;
24 27
25 namespace android_webview { 28 namespace android_webview {
26 29
30 const void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
31
32 class AwSettingsUserData : public base::SupportsUserData::Data {
33 public:
34 AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {}
35
36 static AwSettings* GetSettings(content::WebContents* web_contents) {
37 if (!web_contents)
38 return NULL;
39 AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>(
40 web_contents->GetUserData(kAwSettingsUserDataKey));
41 return data ? data->settings_ : NULL;
42 }
43
44 private:
45 AwSettings* settings_;
46 };
47
27 AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents) 48 AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents)
28 : WebContentsObserver( 49 : WebContentsObserver(
29 reinterpret_cast<content::WebContents*>(web_contents)), 50 reinterpret_cast<content::WebContents*>(web_contents)),
30 aw_settings_(env, obj) { 51 aw_settings_(env, obj) {
52 reinterpret_cast<content::WebContents*>(web_contents)->
53 SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
31 } 54 }
32 55
33 AwSettings::~AwSettings() { 56 AwSettings::~AwSettings() {
joth 2013/09/25 12:04:01 if (web_contents()) web_contents()->SetUserData(
benm (inactive) 2013/09/25 16:00:56 Done.
34 JNIEnv* env = base::android::AttachCurrentThread(); 57 JNIEnv* env = base::android::AttachCurrentThread();
35 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); 58 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
36 jobject obj = scoped_obj.obj(); 59 jobject obj = scoped_obj.obj();
37 if (!obj) return; 60 if (!obj) return;
38 Java_AwSettings_nativeAwSettingsGone(env, obj, 61 Java_AwSettings_nativeAwSettingsGone(env, obj,
39 reinterpret_cast<jint>(this)); 62 reinterpret_cast<jint>(this));
40 } 63 }
41 64
42 void AwSettings::Destroy(JNIEnv* env, jobject obj) { 65 void AwSettings::Destroy(JNIEnv* env, jobject obj) {
43 delete this; 66 delete this;
44 } 67 }
45 68
69 AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) {
70 return AwSettingsUserData::GetSettings(web_contents);
71 }
72
73 void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
74
75 JNIEnv* env = base::android::AttachCurrentThread();
76 CHECK(env);
77
78 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
79 if (!render_view_host_ext) return;
80
81 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
82 jobject obj = scoped_obj.obj();
83 if (!obj) return;
84
85 web_prefs->text_autosizing_enabled =
86 Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
87
88 int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
89 if (web_prefs->text_autosizing_enabled) {
90 web_prefs->font_scale_factor = text_size_percent / 100.0f;
91 web_prefs->force_enable_zoom = text_size_percent >= 130;
92 // Use the default zoom level value when Text Autosizer is turned on.
93 render_view_host_ext->SetTextZoomLevel(0);
94 } else {
95 web_prefs->force_enable_zoom = false;
96 render_view_host_ext->SetTextZoomLevel(content::ZoomFactorToZoomLevel(
97 text_size_percent / 100.0f));
98 }
99
100 web_prefs->standard_font_family_map[webkit_glue::kCommonScript] =
101 ConvertJavaStringToUTF16(
102 Java_AwSettings_getStandardFontFamilyLocked(env, obj));
103
104 web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] =
105 ConvertJavaStringToUTF16(
106 Java_AwSettings_getFixedFontFamilyLocked(env, obj));
107
108 web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] =
109 ConvertJavaStringToUTF16(
110 Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
111
112 web_prefs->serif_font_family_map[webkit_glue::kCommonScript] =
113 ConvertJavaStringToUTF16(
114 Java_AwSettings_getSerifFontFamilyLocked(env, obj));
115
116 web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] =
117 ConvertJavaStringToUTF16(
118 Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
119
120 web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] =
121 ConvertJavaStringToUTF16(
122 Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
123
124 web_prefs->default_encoding = ConvertJavaStringToUTF8(
125 Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
126
127 web_prefs->minimum_font_size = Java_AwSettings_getMinimumFontSizeLocked(env, o bj);
128
129 web_prefs->minimum_logical_font_size =
130 Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
131
132 web_prefs->default_font_size = Java_AwSettings_getDefaultFontSizeLocked(env, o bj);
133
134 web_prefs->default_fixed_font_size =
135 Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
136 // Blink's LoadsImagesAutomatically and ImagesEnabled must be
137 // set cris-cross to Android's. See
138 // https://code.google.com/p/chromium/issues/detail?id=224317#c26
139 web_prefs->loads_images_automatically =
140 Java_AwSettings_getImagesEnabledLocked(env, obj);
141 web_prefs->images_enabled =
142 Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
143
144 web_prefs->javascript_enabled =
145 Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
146 LOG(ERROR) << "Set javascript pref to " << web_prefs->javascript_enabled;
147
148 web_prefs->allow_universal_access_from_file_urls =
149 Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
150
151 web_prefs->allow_file_access_from_file_urls =
152 Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
153
154 web_prefs->javascript_can_open_windows_automatically =
155 Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
156
157 web_prefs->supports_multiple_windows =
158 Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
159
160 web_prefs->plugins_enabled = !Java_AwSettings_getPluginsDisabledLocked(env, ob j);
161
162 web_prefs->application_cache_enabled =
163 Java_AwSettings_getAppCacheEnabledLocked(env, obj);
164
165 web_prefs->local_storage_enabled =
166 Java_AwSettings_getDomStorageEnabledLocked(env, obj);
167
168 web_prefs->databases_enabled = Java_AwSettings_getDatabaseEnabledLocked(env, o bj);
169
170 web_prefs->wide_viewport_quirk = true;
171 web_prefs->double_tap_to_zoom_enabled = web_prefs->use_wide_viewport =
172 Java_AwSettings_getUseWideViewportLocked(env, obj);
173
174 web_prefs->initialize_at_minimum_page_scale =
175 Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
176
177 web_prefs->user_gesture_required_for_media_playback =
178 Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
179
180 // Temporary setting, for K release only
181 // This is a fork from upstream chromium, and should go away once
182 // https://code.google.com/p/chromium/issues/detail?id=297216
183 // is implemented
184 web_prefs->allow_running_insecure_content = true;
185
186 ScopedJavaLocalRef<jstring> url =
187 Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
188 web_prefs->default_video_poster_url = url.obj() ?
189 GURL(ConvertJavaStringToUTF8(url)) : GURL();
190
191 bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
192 web_prefs->support_deprecated_target_density_dpi = support_quirks;
193 web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks;
194 web_prefs->viewport_meta_layout_size_quirk = support_quirks;
195 web_prefs->viewport_meta_zero_values_quirk = support_quirks;
196 web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks;
197
198 web_prefs->password_echo_enabled =
199 Java_AwSettings_getPasswordEchoEnabled(env, obj);
200 }
201
46 AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() { 202 AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
47 if (!web_contents()) return NULL; 203 if (!web_contents()) return NULL;
48 AwContents* contents = AwContents::FromWebContents(web_contents()); 204 AwContents* contents = AwContents::FromWebContents(web_contents());
49 if (!contents) return NULL; 205 if (!contents) return NULL;
50 return contents->render_view_host_ext(); 206 return contents->render_view_host_ext();
51 } 207 }
52 208
53 void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) { 209 void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) {
54 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); 210 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
55 if (!rvhe) return; 211 if (!rvhe) return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 } 243 }
88 244
89 const content::NavigationController& controller = 245 const content::NavigationController& controller =
90 web_contents()->GetController(); 246 web_contents()->GetController();
91 for (int i = 0; i < controller.GetEntryCount(); ++i) 247 for (int i = 0; i < controller.GetEntryCount(); ++i)
92 controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden); 248 controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden);
93 } 249 }
94 250
95 void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) { 251 void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) {
96 if (!web_contents()) return; 252 if (!web_contents()) return;
97 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
98 if (!render_view_host_ext) return;
99 253
100 content::RenderViewHost* render_view_host = 254 content::RenderViewHost* render_view_host =
101 web_contents()->GetRenderViewHost(); 255 web_contents()->GetRenderViewHost();
102 if (!render_view_host) return; 256 if (!render_view_host) return;
103 WebPreferences prefs = render_view_host->GetWebkitPreferences(); 257 render_view_host->UpdateWebkitPreferences(
258 render_view_host->GetWebkitPreferences());
104 259
105 prefs.text_autosizing_enabled =
106 Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
107
108 int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
109 if (prefs.text_autosizing_enabled) {
110 prefs.font_scale_factor = text_size_percent / 100.0f;
111 prefs.force_enable_zoom = text_size_percent >= 130;
112 // Use the default zoom factor value when Text Autosizer is turned on.
113 render_view_host_ext->SetTextZoomFactor(1);
114 } else {
115 prefs.force_enable_zoom = false;
116 render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
117 }
118
119 prefs.standard_font_family_map[webkit_glue::kCommonScript] =
120 ConvertJavaStringToUTF16(
121 Java_AwSettings_getStandardFontFamilyLocked(env, obj));
122
123 prefs.fixed_font_family_map[webkit_glue::kCommonScript] =
124 ConvertJavaStringToUTF16(
125 Java_AwSettings_getFixedFontFamilyLocked(env, obj));
126
127 prefs.sans_serif_font_family_map[webkit_glue::kCommonScript] =
128 ConvertJavaStringToUTF16(
129 Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
130
131 prefs.serif_font_family_map[webkit_glue::kCommonScript] =
132 ConvertJavaStringToUTF16(
133 Java_AwSettings_getSerifFontFamilyLocked(env, obj));
134
135 prefs.cursive_font_family_map[webkit_glue::kCommonScript] =
136 ConvertJavaStringToUTF16(
137 Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
138
139 prefs.fantasy_font_family_map[webkit_glue::kCommonScript] =
140 ConvertJavaStringToUTF16(
141 Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
142
143 prefs.default_encoding = ConvertJavaStringToUTF8(
144 Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
145
146 prefs.minimum_font_size = Java_AwSettings_getMinimumFontSizeLocked(env, obj);
147
148 prefs.minimum_logical_font_size =
149 Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
150
151 prefs.default_font_size = Java_AwSettings_getDefaultFontSizeLocked(env, obj);
152
153 prefs.default_fixed_font_size =
154 Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
155
156 // Blink's LoadsImagesAutomatically and ImagesEnabled must be
157 // set cris-cross to Android's. See
158 // https://code.google.com/p/chromium/issues/detail?id=224317#c26
159 prefs.loads_images_automatically =
160 Java_AwSettings_getImagesEnabledLocked(env, obj);
161 prefs.images_enabled =
162 Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
163
164 prefs.javascript_enabled =
165 Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
166
167 prefs.allow_universal_access_from_file_urls =
168 Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
169
170 prefs.allow_file_access_from_file_urls =
171 Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
172
173 prefs.javascript_can_open_windows_automatically =
174 Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
175
176 prefs.supports_multiple_windows =
177 Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
178
179 prefs.plugins_enabled = !Java_AwSettings_getPluginsDisabledLocked(env, obj);
180
181 prefs.application_cache_enabled =
182 Java_AwSettings_getAppCacheEnabledLocked(env, obj);
183
184 prefs.local_storage_enabled =
185 Java_AwSettings_getDomStorageEnabledLocked(env, obj);
186
187 prefs.databases_enabled = Java_AwSettings_getDatabaseEnabledLocked(env, obj);
188
189 prefs.wide_viewport_quirk = true;
190 prefs.double_tap_to_zoom_enabled = prefs.use_wide_viewport =
191 Java_AwSettings_getUseWideViewportLocked(env, obj);
192
193 prefs.initialize_at_minimum_page_scale =
194 Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
195
196 prefs.user_gesture_required_for_media_playback =
197 Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
198
199 ScopedJavaLocalRef<jstring> url =
200 Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
201 prefs.default_video_poster_url = url.obj() ?
202 GURL(ConvertJavaStringToUTF8(url)) : GURL();
203
204 bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
205 prefs.support_deprecated_target_density_dpi = support_quirks;
206 prefs.use_legacy_background_size_shorthand_behavior = support_quirks;
207 prefs.viewport_meta_layout_size_quirk = support_quirks;
208 prefs.viewport_meta_zero_values_quirk = support_quirks;
209
210 prefs.password_echo_enabled =
211 Java_AwSettings_getPasswordEchoEnabled(env, obj);
212
213 render_view_host->UpdateWebkitPreferences(prefs);
214 } 260 }
215 261
216 void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) { 262 void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
217 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); 263 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
218 if (!rvhe) return; 264 if (!rvhe) return;
219 265
220 float initial_page_scale_percent = 266 float initial_page_scale_percent =
221 Java_AwSettings_getInitialPageScalePercentLocked(env, obj); 267 Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
222 if (initial_page_scale_percent == 0) { 268 if (initial_page_scale_percent == 0) {
223 rvhe->SetInitialPageScale(-1); 269 rvhe->SetInitialPageScale(-1);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
265 static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) { 311 static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
266 return base::android::ConvertUTF8ToJavaString( 312 return base::android::ConvertUTF8ToJavaString(
267 env, content::GetUserAgent(GURL())).Release(); 313 env, content::GetUserAgent(GURL())).Release();
268 } 314 }
269 315
270 bool RegisterAwSettings(JNIEnv* env) { 316 bool RegisterAwSettings(JNIEnv* env) {
271 return RegisterNativesImpl(env) >= 0; 317 return RegisterNativesImpl(env) >= 0;
272 } 318 }
273 319
274 } // namespace android_webview 320 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/native/aw_settings.h ('k') | android_webview/native/webview_native.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698