OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |