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

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, 2 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
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
21 using base::android::ConvertJavaStringToUTF16; 22 using base::android::ConvertJavaStringToUTF16;
22 using base::android::ConvertUTF8ToJavaString; 23 using base::android::ConvertUTF8ToJavaString;
23 using base::android::ScopedJavaLocalRef; 24 using base::android::ScopedJavaLocalRef;
24 25
25 namespace android_webview { 26 namespace android_webview {
26 27
28 const void* kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
29
30 class AwSettingsUserData : public base::SupportsUserData::Data {
31 public:
32 AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {}
33
34 static AwSettings* GetSettings(content::WebContents* web_contents) {
35 if (!web_contents)
36 return NULL;
37 AwSettingsUserData* data = reinterpret_cast<AwSettingsUserData*>(
38 web_contents->GetUserData(kAwSettingsUserDataKey));
39 return data ? data->settings_ : NULL;
40 }
41
42 private:
43 AwSettings* settings_;
44 };
45
27 AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents) 46 AwSettings::AwSettings(JNIEnv* env, jobject obj, jint web_contents)
28 : WebContentsObserver( 47 : WebContentsObserver(
29 reinterpret_cast<content::WebContents*>(web_contents)), 48 reinterpret_cast<content::WebContents*>(web_contents)),
30 aw_settings_(env, obj) { 49 aw_settings_(env, obj) {
50 reinterpret_cast<content::WebContents*>(web_contents)->
51 SetUserData(kAwSettingsUserDataKey, new AwSettingsUserData(this));
31 } 52 }
32 53
33 AwSettings::~AwSettings() { 54 AwSettings::~AwSettings() {
55 if (web_contents()) {
56 web_contents()->SetUserData(kAwSettingsUserDataKey, NULL);
57 }
58
34 JNIEnv* env = base::android::AttachCurrentThread(); 59 JNIEnv* env = base::android::AttachCurrentThread();
35 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env); 60 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
36 jobject obj = scoped_obj.obj(); 61 jobject obj = scoped_obj.obj();
37 if (!obj) return; 62 if (!obj) return;
38 Java_AwSettings_nativeAwSettingsGone(env, obj, 63 Java_AwSettings_nativeAwSettingsGone(env, obj,
39 reinterpret_cast<jint>(this)); 64 reinterpret_cast<jint>(this));
40 } 65 }
41 66
42 void AwSettings::Destroy(JNIEnv* env, jobject obj) { 67 void AwSettings::Destroy(JNIEnv* env, jobject obj) {
43 delete this; 68 delete this;
44 } 69 }
45 70
71 AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) {
72 return AwSettingsUserData::GetSettings(web_contents);
73 }
74
46 AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() { 75 AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
47 if (!web_contents()) return NULL; 76 if (!web_contents()) return NULL;
48 AwContents* contents = AwContents::FromWebContents(web_contents()); 77 AwContents* contents = AwContents::FromWebContents(web_contents());
49 if (!contents) return NULL; 78 if (!contents) return NULL;
50 return contents->render_view_host_ext(); 79 return contents->render_view_host_ext();
51 } 80 }
52 81
53 void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) { 82 void AwSettings::ResetScrollAndScaleState(JNIEnv* env, jobject obj) {
54 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); 83 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
55 if (!rvhe) return; 84 if (!rvhe) return;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 } 122 }
94 123
95 void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) { 124 void AwSettings::UpdateWebkitPreferencesLocked(JNIEnv* env, jobject obj) {
96 if (!web_contents()) return; 125 if (!web_contents()) return;
97 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt(); 126 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
98 if (!render_view_host_ext) return; 127 if (!render_view_host_ext) return;
99 128
100 content::RenderViewHost* render_view_host = 129 content::RenderViewHost* render_view_host =
101 web_contents()->GetRenderViewHost(); 130 web_contents()->GetRenderViewHost();
102 if (!render_view_host) return; 131 if (!render_view_host) return;
103 WebPreferences prefs = render_view_host->GetWebkitPreferences(); 132 render_view_host->UpdateWebkitPreferences(
104 133 render_view_host->GetWebkitPreferences());
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 prefs.ignore_main_frame_overflow_hidden_quirk = support_quirks;
210
211 prefs.password_echo_enabled =
212 Java_AwSettings_getPasswordEchoEnabled(env, obj);
213
214 render_view_host->UpdateWebkitPreferences(prefs);
215 } 134 }
216 135
217 void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) { 136 void AwSettings::UpdateInitialPageScaleLocked(JNIEnv* env, jobject obj) {
218 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); 137 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
219 if (!rvhe) return; 138 if (!rvhe) return;
220 139
221 float initial_page_scale_percent = 140 float initial_page_scale_percent =
222 Java_AwSettings_getInitialPageScalePercentLocked(env, obj); 141 Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
223 if (initial_page_scale_percent == 0) { 142 if (initial_page_scale_percent == 0) {
224 rvhe->SetInitialPageScale(-1); 143 rvhe->SetInitialPageScale(-1);
(...skipping 24 matching lines...) Expand all
249 // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK. 168 // (since we only ever go from 0 to 1 RVH instances) and hence the DCHECK.
250 DCHECK(web_contents()->GetRenderViewHost() == render_view_host); 169 DCHECK(web_contents()->GetRenderViewHost() == render_view_host);
251 170
252 UpdateEverything(); 171 UpdateEverything();
253 } 172 }
254 173
255 void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) { 174 void AwSettings::WebContentsDestroyed(content::WebContents* web_contents) {
256 delete this; 175 delete this;
257 } 176 }
258 177
178 void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
179 JNIEnv* env = base::android::AttachCurrentThread();
180 CHECK(env);
181
182 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
183 if (!render_view_host_ext) return;
184
185 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
186 jobject obj = scoped_obj.obj();
187 if (!obj) return;
188
189 web_prefs->text_autosizing_enabled =
190 Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
191
192 int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
193 if (web_prefs->text_autosizing_enabled) {
194 web_prefs->font_scale_factor = text_size_percent / 100.0f;
195 web_prefs->force_enable_zoom = text_size_percent >= 130;
196 // Use the default zoom factor value when Text Autosizer is turned on.
197 render_view_host_ext->SetTextZoomFactor(1);
198 } else {
199 web_prefs->force_enable_zoom = false;
200 render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
201 }
202
203 web_prefs->standard_font_family_map[webkit_glue::kCommonScript] =
204 ConvertJavaStringToUTF16(
205 Java_AwSettings_getStandardFontFamilyLocked(env, obj));
206
207 web_prefs->fixed_font_family_map[webkit_glue::kCommonScript] =
208 ConvertJavaStringToUTF16(
209 Java_AwSettings_getFixedFontFamilyLocked(env, obj));
210
211 web_prefs->sans_serif_font_family_map[webkit_glue::kCommonScript] =
212 ConvertJavaStringToUTF16(
213 Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
214
215 web_prefs->serif_font_family_map[webkit_glue::kCommonScript] =
216 ConvertJavaStringToUTF16(
217 Java_AwSettings_getSerifFontFamilyLocked(env, obj));
218
219 web_prefs->cursive_font_family_map[webkit_glue::kCommonScript] =
220 ConvertJavaStringToUTF16(
221 Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
222
223 web_prefs->fantasy_font_family_map[webkit_glue::kCommonScript] =
224 ConvertJavaStringToUTF16(
225 Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
226
227 web_prefs->default_encoding = ConvertJavaStringToUTF8(
228 Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
229
230 web_prefs->minimum_font_size =
231 Java_AwSettings_getMinimumFontSizeLocked(env, obj);
232
233 web_prefs->minimum_logical_font_size =
234 Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
235
236 web_prefs->default_font_size =
237 Java_AwSettings_getDefaultFontSizeLocked(env, obj);
238
239 web_prefs->default_fixed_font_size =
240 Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
241
242 // Blink's LoadsImagesAutomatically and ImagesEnabled must be
243 // set cris-cross to Android's. See
244 // https://code.google.com/p/chromium/issues/detail?id=224317#c26
245 web_prefs->loads_images_automatically =
246 Java_AwSettings_getImagesEnabledLocked(env, obj);
247 web_prefs->images_enabled =
248 Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
249
250 web_prefs->javascript_enabled =
251 Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
252
253 web_prefs->allow_universal_access_from_file_urls =
254 Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
255
256 web_prefs->allow_file_access_from_file_urls =
257 Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
258
259 web_prefs->javascript_can_open_windows_automatically =
260 Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
261
262 web_prefs->supports_multiple_windows =
263 Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
264
265 web_prefs->plugins_enabled =
266 !Java_AwSettings_getPluginsDisabledLocked(env, obj);
267
268 web_prefs->application_cache_enabled =
269 Java_AwSettings_getAppCacheEnabledLocked(env, obj);
270
271 web_prefs->local_storage_enabled =
272 Java_AwSettings_getDomStorageEnabledLocked(env, obj);
273
274 web_prefs->databases_enabled =
275 Java_AwSettings_getDatabaseEnabledLocked(env, obj);
276
277 web_prefs->wide_viewport_quirk = true;
278 web_prefs->double_tap_to_zoom_enabled = web_prefs->use_wide_viewport =
279 Java_AwSettings_getUseWideViewportLocked(env, obj);
280
281 web_prefs->initialize_at_minimum_page_scale =
282 Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
283
284 web_prefs->user_gesture_required_for_media_playback =
285 Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
286
287 ScopedJavaLocalRef<jstring> url =
288 Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
289 web_prefs->default_video_poster_url = url.obj() ?
290 GURL(ConvertJavaStringToUTF8(url)) : GURL();
291
292 bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
293 web_prefs->support_deprecated_target_density_dpi = support_quirks;
294 web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks;
295 web_prefs->viewport_meta_layout_size_quirk = support_quirks;
296 web_prefs->viewport_meta_zero_values_quirk = support_quirks;
297 web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks;
298
299 web_prefs->password_echo_enabled =
300 Java_AwSettings_getPasswordEchoEnabled(env, obj);
301 }
302
259 static jint Init(JNIEnv* env, 303 static jint Init(JNIEnv* env,
260 jobject obj, 304 jobject obj,
261 jint web_contents) { 305 jint web_contents) {
262 AwSettings* settings = new AwSettings(env, obj, web_contents); 306 AwSettings* settings = new AwSettings(env, obj, web_contents);
263 return reinterpret_cast<jint>(settings); 307 return reinterpret_cast<jint>(settings);
264 } 308 }
265 309
266 static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) { 310 static jstring GetDefaultUserAgent(JNIEnv* env, jclass clazz) {
267 return base::android::ConvertUTF8ToJavaString( 311 return base::android::ConvertUTF8ToJavaString(
268 env, content::GetUserAgent(GURL())).Release(); 312 env, content::GetUserAgent(GURL())).Release();
269 } 313 }
270 314
271 bool RegisterAwSettings(JNIEnv* env) { 315 bool RegisterAwSettings(JNIEnv* env) {
272 return RegisterNativesImpl(env) >= 0; 316 return RegisterNativesImpl(env) >= 0;
273 } 317 }
274 318
275 } // namespace android_webview 319 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/native/aw_settings.h ('k') | android_webview/native/aw_web_preferences_populater_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698