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

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

Issue 2863233002: [WebView] Move files from native to browser (Closed)
Patch Set: Created 3 years, 7 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "android_webview/native/aw_settings.h"
6
7 #include "android_webview/browser/aw_content_browser_client.h"
8 #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
9 #include "android_webview/common/aw_content_client.h"
10 #include "android_webview/native/aw_contents.h"
11 #include "base/android/jni_android.h"
12 #include "base/android/jni_string.h"
13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h"
15 #include "base/supports_user_data.h"
16 #include "content/public/browser/navigation_controller.h"
17 #include "content/public/browser/navigation_entry.h"
18 #include "content/public/browser/render_view_host.h"
19 #include "content/public/browser/web_contents.h"
20 #include "content/public/common/renderer_preferences.h"
21 #include "content/public/common/web_preferences.h"
22 #include "jni/AwSettings_jni.h"
23 #include "ui/gfx/font_render_params.h"
24
25 using base::android::ConvertJavaStringToUTF16;
26 using base::android::ConvertUTF8ToJavaString;
27 using base::android::JavaParamRef;
28 using base::android::ScopedJavaLocalRef;
29 using content::RendererPreferences;
30 using content::WebPreferences;
31
32 namespace android_webview {
33
34 namespace {
35
36 void PopulateFixedRendererPreferences(RendererPreferences* prefs) {
37 prefs->tap_multiple_targets_strategy =
38 content::TAP_MULTIPLE_TARGETS_STRATEGY_NONE;
39
40 // TODO(boliu): Deduplicate with chrome/ code.
41 CR_DEFINE_STATIC_LOCAL(const gfx::FontRenderParams, params,
42 (gfx::GetFontRenderParams(gfx::FontRenderParamsQuery(), NULL)));
43 prefs->should_antialias_text = params.antialiasing;
44 prefs->use_subpixel_positioning = params.subpixel_positioning;
45 prefs->hinting = params.hinting;
46 prefs->use_autohinter = params.autohinter;
47 prefs->use_bitmaps = params.use_bitmaps;
48 prefs->subpixel_rendering = params.subpixel_rendering;
49 }
50
51 void PopulateFixedWebPreferences(WebPreferences* web_prefs) {
52 web_prefs->shrinks_standalone_images_to_fit = false;
53 web_prefs->should_clear_document_background = false;
54 web_prefs->viewport_meta_enabled = true;
55 }
56
57 const void* const kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
58
59 }; // namespace
60
61 class AwSettingsUserData : public base::SupportsUserData::Data {
62 public:
63 explicit AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {}
64
65 static AwSettings* GetSettings(content::WebContents* web_contents) {
66 if (!web_contents)
67 return NULL;
68 AwSettingsUserData* data = static_cast<AwSettingsUserData*>(
69 web_contents->GetUserData(kAwSettingsUserDataKey));
70 return data ? data->settings_ : NULL;
71 }
72
73 private:
74 AwSettings* settings_;
75 };
76
77 AwSettings::AwSettings(JNIEnv* env,
78 jobject obj,
79 content::WebContents* web_contents)
80 : WebContentsObserver(web_contents),
81 renderer_prefs_initialized_(false),
82 aw_settings_(env, obj) {
83 web_contents->SetUserData(kAwSettingsUserDataKey,
84 base::MakeUnique<AwSettingsUserData>(this));
85 }
86
87 AwSettings::~AwSettings() {
88 if (web_contents()) {
89 web_contents()->SetUserData(kAwSettingsUserDataKey, NULL);
90 }
91
92 JNIEnv* env = base::android::AttachCurrentThread();
93 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
94 if (scoped_obj.is_null())
95 return;
96 Java_AwSettings_nativeAwSettingsGone(env, scoped_obj,
97 reinterpret_cast<intptr_t>(this));
98 }
99
100 void AwSettings::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
101 delete this;
102 }
103
104 AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) {
105 return AwSettingsUserData::GetSettings(web_contents);
106 }
107
108 AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
109 if (!web_contents()) return NULL;
110 AwContents* contents = AwContents::FromWebContents(web_contents());
111 if (!contents) return NULL;
112 return contents->render_view_host_ext();
113 }
114
115 void AwSettings::ResetScrollAndScaleState(JNIEnv* env,
116 const JavaParamRef<jobject>& obj) {
117 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
118 if (!rvhe) return;
119 rvhe->ResetScrollAndScaleState();
120 }
121
122 void AwSettings::UpdateEverything() {
123 JNIEnv* env = base::android::AttachCurrentThread();
124 CHECK(env);
125 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
126 if (scoped_obj.is_null())
127 return;
128 // Grab the lock and call UpdateEverythingLocked.
129 Java_AwSettings_updateEverything(env, scoped_obj);
130 }
131
132 void AwSettings::UpdateEverythingLocked(JNIEnv* env,
133 const JavaParamRef<jobject>& obj) {
134 UpdateInitialPageScaleLocked(env, obj);
135 UpdateWebkitPreferencesLocked(env, obj);
136 UpdateUserAgentLocked(env, obj);
137 ResetScrollAndScaleState(env, obj);
138 UpdateFormDataPreferencesLocked(env, obj);
139 UpdateRendererPreferencesLocked(env, obj);
140 UpdateOffscreenPreRasterLocked(env, obj);
141 }
142
143 void AwSettings::UpdateUserAgentLocked(JNIEnv* env,
144 const JavaParamRef<jobject>& obj) {
145 if (!web_contents()) return;
146
147 ScopedJavaLocalRef<jstring> str =
148 Java_AwSettings_getUserAgentLocked(env, obj);
149 bool ua_overidden = str.obj() != NULL;
150
151 if (ua_overidden) {
152 std::string override = base::android::ConvertJavaStringToUTF8(str);
153 web_contents()->SetUserAgentOverride(override);
154 }
155
156 const content::NavigationController& controller =
157 web_contents()->GetController();
158 for (int i = 0; i < controller.GetEntryCount(); ++i)
159 controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden);
160 }
161
162 void AwSettings::UpdateWebkitPreferencesLocked(
163 JNIEnv* env,
164 const JavaParamRef<jobject>& obj) {
165 if (!web_contents()) return;
166 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
167 if (!render_view_host_ext) return;
168
169 content::RenderViewHost* render_view_host =
170 web_contents()->GetRenderViewHost();
171 if (!render_view_host) return;
172 render_view_host->OnWebkitPreferencesChanged();
173 }
174
175 void AwSettings::UpdateInitialPageScaleLocked(
176 JNIEnv* env,
177 const JavaParamRef<jobject>& obj) {
178 AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
179 if (!rvhe) return;
180
181 float initial_page_scale_percent =
182 Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
183 if (initial_page_scale_percent == 0) {
184 rvhe->SetInitialPageScale(-1);
185 } else {
186 float dip_scale = static_cast<float>(
187 Java_AwSettings_getDIPScaleLocked(env, obj));
188 rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f);
189 }
190 }
191
192 void AwSettings::UpdateFormDataPreferencesLocked(
193 JNIEnv* env,
194 const JavaParamRef<jobject>& obj) {
195 if (!web_contents()) return;
196 AwContents* contents = AwContents::FromWebContents(web_contents());
197 if (!contents) return;
198
199 contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
200 }
201
202 void AwSettings::UpdateRendererPreferencesLocked(
203 JNIEnv* env,
204 const JavaParamRef<jobject>& obj) {
205 if (!web_contents()) return;
206
207 bool update_prefs = false;
208 RendererPreferences* prefs = web_contents()->GetMutableRendererPrefs();
209
210 if (!renderer_prefs_initialized_) {
211 PopulateFixedRendererPreferences(prefs);
212 renderer_prefs_initialized_ = true;
213 update_prefs = true;
214 }
215
216 if (prefs->accept_languages.compare(
217 AwContentBrowserClient::GetAcceptLangsImpl())) {
218 prefs->accept_languages = AwContentBrowserClient::GetAcceptLangsImpl();
219 update_prefs = true;
220 }
221
222 content::RenderViewHost* host = web_contents()->GetRenderViewHost();
223 if (update_prefs && host)
224 host->SyncRendererPrefs();
225 }
226
227 void AwSettings::UpdateOffscreenPreRasterLocked(
228 JNIEnv* env,
229 const JavaParamRef<jobject>& obj) {
230 AwContents* contents = AwContents::FromWebContents(web_contents());
231 if (contents) {
232 contents->SetOffscreenPreRaster(
233 Java_AwSettings_getOffscreenPreRasterLocked(env, obj));
234 }
235 }
236
237 void AwSettings::RenderViewHostChanged(content::RenderViewHost* old_host,
238 content::RenderViewHost* new_host) {
239 DCHECK_EQ(new_host, web_contents()->GetRenderViewHost());
240
241 UpdateEverything();
242 }
243
244 void AwSettings::WebContentsDestroyed() {
245 delete this;
246 }
247
248 void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
249 JNIEnv* env = base::android::AttachCurrentThread();
250 CHECK(env);
251 ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
252 if (scoped_obj.is_null())
253 return;
254 // Grab the lock and call PopulateWebPreferencesLocked.
255 Java_AwSettings_populateWebPreferences(env, scoped_obj,
256 reinterpret_cast<jlong>(web_prefs));
257 }
258
259 void AwSettings::PopulateWebPreferencesLocked(JNIEnv* env,
260 const JavaParamRef<jobject>& obj,
261 jlong web_prefs_ptr) {
262 AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
263 if (!render_view_host_ext) return;
264
265 WebPreferences* web_prefs = reinterpret_cast<WebPreferences*>(web_prefs_ptr);
266 PopulateFixedWebPreferences(web_prefs);
267
268 web_prefs->text_autosizing_enabled =
269 Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
270
271 int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
272 if (web_prefs->text_autosizing_enabled) {
273 web_prefs->font_scale_factor = text_size_percent / 100.0f;
274 web_prefs->force_enable_zoom = text_size_percent >= 130;
275 // Use the default zoom factor value when Text Autosizer is turned on.
276 render_view_host_ext->SetTextZoomFactor(1);
277 } else {
278 web_prefs->force_enable_zoom = false;
279 render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
280 }
281
282 web_prefs->standard_font_family_map[content::kCommonScript] =
283 ConvertJavaStringToUTF16(
284 Java_AwSettings_getStandardFontFamilyLocked(env, obj));
285
286 web_prefs->fixed_font_family_map[content::kCommonScript] =
287 ConvertJavaStringToUTF16(
288 Java_AwSettings_getFixedFontFamilyLocked(env, obj));
289
290 web_prefs->sans_serif_font_family_map[content::kCommonScript] =
291 ConvertJavaStringToUTF16(
292 Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
293
294 web_prefs->serif_font_family_map[content::kCommonScript] =
295 ConvertJavaStringToUTF16(
296 Java_AwSettings_getSerifFontFamilyLocked(env, obj));
297
298 web_prefs->cursive_font_family_map[content::kCommonScript] =
299 ConvertJavaStringToUTF16(
300 Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
301
302 web_prefs->fantasy_font_family_map[content::kCommonScript] =
303 ConvertJavaStringToUTF16(
304 Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
305
306 web_prefs->default_encoding = ConvertJavaStringToUTF8(
307 Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
308
309 web_prefs->minimum_font_size =
310 Java_AwSettings_getMinimumFontSizeLocked(env, obj);
311
312 web_prefs->minimum_logical_font_size =
313 Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
314
315 web_prefs->default_font_size =
316 Java_AwSettings_getDefaultFontSizeLocked(env, obj);
317
318 web_prefs->default_fixed_font_size =
319 Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
320
321 // Blink's LoadsImagesAutomatically and ImagesEnabled must be
322 // set cris-cross to Android's. See
323 // https://code.google.com/p/chromium/issues/detail?id=224317#c26
324 web_prefs->loads_images_automatically =
325 Java_AwSettings_getImagesEnabledLocked(env, obj);
326 web_prefs->images_enabled =
327 Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
328
329 web_prefs->javascript_enabled =
330 Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
331
332 web_prefs->allow_universal_access_from_file_urls =
333 Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
334
335 web_prefs->allow_file_access_from_file_urls =
336 Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
337
338 web_prefs->javascript_can_open_windows_automatically =
339 Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
340
341 web_prefs->supports_multiple_windows =
342 Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
343
344 web_prefs->plugins_enabled =
345 !Java_AwSettings_getPluginsDisabledLocked(env, obj);
346
347 web_prefs->application_cache_enabled =
348 Java_AwSettings_getAppCacheEnabledLocked(env, obj);
349
350 web_prefs->local_storage_enabled =
351 Java_AwSettings_getDomStorageEnabledLocked(env, obj);
352
353 web_prefs->databases_enabled =
354 Java_AwSettings_getDatabaseEnabledLocked(env, obj);
355
356 web_prefs->wide_viewport_quirk = true;
357 web_prefs->use_wide_viewport =
358 Java_AwSettings_getUseWideViewportLocked(env, obj);
359
360 web_prefs->force_zero_layout_height =
361 Java_AwSettings_getForceZeroLayoutHeightLocked(env, obj);
362
363 const bool zero_layout_height_disables_viewport_quirk =
364 Java_AwSettings_getZeroLayoutHeightDisablesViewportQuirkLocked(env, obj);
365 web_prefs->viewport_enabled = !(zero_layout_height_disables_viewport_quirk &&
366 web_prefs->force_zero_layout_height);
367
368 web_prefs->double_tap_to_zoom_enabled =
369 Java_AwSettings_supportsDoubleTapZoomLocked(env, obj);
370
371 web_prefs->initialize_at_minimum_page_scale =
372 Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
373
374 web_prefs->user_gesture_required_for_media_playback =
375 Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj);
376
377 ScopedJavaLocalRef<jstring> url =
378 Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
379 web_prefs->default_video_poster_url = url.obj() ?
380 GURL(ConvertJavaStringToUTF8(url)) : GURL();
381
382 bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
383 // Please see the corresponding Blink settings for bug references.
384 web_prefs->support_deprecated_target_density_dpi = support_quirks;
385 web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks;
386 web_prefs->viewport_meta_layout_size_quirk = support_quirks;
387 web_prefs->viewport_meta_merge_content_quirk = support_quirks;
388 web_prefs->viewport_meta_non_user_scalable_quirk = support_quirks;
389 web_prefs->viewport_meta_zero_values_quirk = support_quirks;
390 web_prefs->clobber_user_agent_initial_scale_quirk = support_quirks;
391 web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks;
392 web_prefs->report_screen_size_in_physical_pixels_quirk = support_quirks;
393
394 web_prefs->resue_global_for_unowned_main_frame =
395 Java_AwSettings_getAllowEmptyDocumentPersistenceLocked(env, obj);
396
397 web_prefs->password_echo_enabled =
398 Java_AwSettings_getPasswordEchoEnabledLocked(env, obj);
399 web_prefs->spatial_navigation_enabled =
400 Java_AwSettings_getSpatialNavigationLocked(env, obj);
401
402 bool enable_supported_hardware_accelerated_features =
403 Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(
404 env, obj);
405
406 bool accelerated_2d_canvas_enabled_by_switch =
407 web_prefs->accelerated_2d_canvas_enabled;
408 web_prefs->accelerated_2d_canvas_enabled = true;
409 if (!accelerated_2d_canvas_enabled_by_switch ||
410 !enable_supported_hardware_accelerated_features) {
411 // Any canvas smaller than this will fallback to software. Abusing this
412 // slightly to turn canvas off without changing
413 // accelerated_2d_canvas_enabled, which also affects compositing mode.
414 // Using 100M instead of max int to avoid overflows.
415 web_prefs->minimum_accelerated_2d_canvas_size = 100 * 1000 * 1000;
416 }
417 web_prefs->experimental_webgl_enabled =
418 web_prefs->experimental_webgl_enabled &&
419 enable_supported_hardware_accelerated_features;
420
421 // If strict mixed content checking is enabled then running should not be
422 // allowed.
423 DCHECK(!Java_AwSettings_getUseStricMixedContentCheckingLocked(env, obj) ||
424 !Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj));
425 web_prefs->allow_running_insecure_content =
426 Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj);
427 web_prefs->strict_mixed_content_checking =
428 Java_AwSettings_getUseStricMixedContentCheckingLocked(env, obj);
429
430 web_prefs->fullscreen_supported =
431 Java_AwSettings_getFullscreenSupportedLocked(env, obj);
432 web_prefs->record_whole_document =
433 Java_AwSettings_getRecordFullDocument(env, obj);
434
435 // TODO(jww): This should be removed once sufficient warning has been given of
436 // possible API breakage because of disabling insecure use of geolocation.
437 web_prefs->allow_geolocation_on_insecure_origins =
438 Java_AwSettings_getAllowGeolocationOnInsecureOrigins(env, obj);
439
440 web_prefs->do_not_update_selection_on_mutating_selection_range =
441 Java_AwSettings_getDoNotUpdateSelectionOnMutatingSelectionRange(env, obj);
442
443 // Keep spellcheck disabled on html elements unless the spellcheck="true"
444 // attribute is explicitly specified. This "opt-in" behavior is for backward
445 // consistency in apps that use WebView (see crbug.com/652314).
446 web_prefs->spellcheck_enabled_by_default = false;
447 }
448
449 static jlong Init(JNIEnv* env,
450 const JavaParamRef<jobject>& obj,
451 const JavaParamRef<jobject>& web_contents) {
452 content::WebContents* contents = content::WebContents::FromJavaWebContents(
453 web_contents);
454 AwSettings* settings = new AwSettings(env, obj, contents);
455 return reinterpret_cast<intptr_t>(settings);
456 }
457
458 static ScopedJavaLocalRef<jstring> GetDefaultUserAgent(
459 JNIEnv* env,
460 const JavaParamRef<jclass>& clazz) {
461 return base::android::ConvertUTF8ToJavaString(env, GetUserAgent());
462 }
463
464 bool RegisterAwSettings(JNIEnv* env) {
465 return RegisterNativesImpl(env);
466 }
467
468 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698