1 // Copyright 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.
5 #include "content/public/renderer/web_preferences.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "third_party/WebKit/public/platform/WebString.h"
9 #include "third_party/WebKit/public/platform/WebURL.h"
10 #include "third_party/WebKit/public/web/WebKit.h"
11 #include "third_party/WebKit/public/web/WebNetworkStateNotifier.h"
12 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
13 #include "third_party/WebKit/public/web/WebSettings.h"
14 #include "third_party/WebKit/public/web/WebView.h"
15 #include "third_party/icu/source/common/unicode/uchar.h"
16 #include "third_party/icu/source/common/unicode/uscript.h"
17 #include "webkit/common/webpreferences.h"
19 using blink::WebNetworkStateNotifier
;
20 using blink::WebRuntimeFeatures
;
21 using blink::WebSettings
;
22 using blink::WebString
;
30 typedef void (*SetFontFamilyWrapper
)(blink::WebSettings
*,
31 const base::string16
&,
34 void setStandardFontFamilyWrapper(WebSettings
* settings
,
35 const base::string16
& font
,
37 settings
->setStandardFontFamily(font
, script
);
40 void setFixedFontFamilyWrapper(WebSettings
* settings
,
41 const base::string16
& font
,
43 settings
->setFixedFontFamily(font
, script
);
46 void setSerifFontFamilyWrapper(WebSettings
* settings
,
47 const base::string16
& font
,
49 settings
->setSerifFontFamily(font
, script
);
52 void setSansSerifFontFamilyWrapper(WebSettings
* settings
,
53 const base::string16
& font
,
55 settings
->setSansSerifFontFamily(font
, script
);
58 void setCursiveFontFamilyWrapper(WebSettings
* settings
,
59 const base::string16
& font
,
61 settings
->setCursiveFontFamily(font
, script
);
64 void setFantasyFontFamilyWrapper(WebSettings
* settings
,
65 const base::string16
& font
,
67 settings
->setFantasyFontFamily(font
, script
);
70 void setPictographFontFamilyWrapper(WebSettings
* settings
,
71 const base::string16
& font
,
73 settings
->setPictographFontFamily(font
, script
);
76 // If |scriptCode| is a member of a family of "similar" script codes, returns
77 // the script code in that family that is used by WebKit for font selection
78 // purposes. For example, USCRIPT_KATAKANA_OR_HIRAGANA and USCRIPT_JAPANESE are
79 // considered equivalent for the purposes of font selection. WebKit uses the
80 // script code USCRIPT_KATAKANA_OR_HIRAGANA. So, if |scriptCode| is
81 // USCRIPT_JAPANESE, the function returns USCRIPT_KATAKANA_OR_HIRAGANA. WebKit
82 // uses different scripts than the ones in Chrome pref names because the version
83 // of ICU included on certain ports does not have some of the newer scripts. If
84 // |scriptCode| is not a member of such a family, returns |scriptCode|.
85 UScriptCode
GetScriptForWebSettings(UScriptCode scriptCode
) {
87 case USCRIPT_HIRAGANA
:
88 case USCRIPT_KATAKANA
:
89 case USCRIPT_JAPANESE
:
90 return USCRIPT_KATAKANA_OR_HIRAGANA
;
92 return USCRIPT_HANGUL
;
98 void ApplyFontsFromMap(const webkit_glue::ScriptFontFamilyMap
& map
,
99 SetFontFamilyWrapper setter
,
100 WebSettings
* settings
) {
101 for (webkit_glue::ScriptFontFamilyMap::const_iterator it
= map
.begin();
104 int32 script
= u_getPropertyValueEnum(UCHAR_SCRIPT
, (it
->first
).c_str());
105 if (script
>= 0 && script
< USCRIPT_CODE_LIMIT
) {
106 UScriptCode code
= static_cast<UScriptCode
>(script
);
107 (*setter
)(settings
, it
->second
, GetScriptForWebSettings(code
));
114 void ApplyWebPreferences(const WebPreferences
& prefs
, WebView
* web_view
) {
115 WebSettings
* settings
= web_view
->settings();
116 ApplyFontsFromMap(prefs
.standard_font_family_map
,
117 setStandardFontFamilyWrapper
, settings
);
118 ApplyFontsFromMap(prefs
.fixed_font_family_map
,
119 setFixedFontFamilyWrapper
, settings
);
120 ApplyFontsFromMap(prefs
.serif_font_family_map
,
121 setSerifFontFamilyWrapper
, settings
);
122 ApplyFontsFromMap(prefs
.sans_serif_font_family_map
,
123 setSansSerifFontFamilyWrapper
, settings
);
124 ApplyFontsFromMap(prefs
.cursive_font_family_map
,
125 setCursiveFontFamilyWrapper
, settings
);
126 ApplyFontsFromMap(prefs
.fantasy_font_family_map
,
127 setFantasyFontFamilyWrapper
, settings
);
128 ApplyFontsFromMap(prefs
.pictograph_font_family_map
,
129 setPictographFontFamilyWrapper
, settings
);
130 settings
->setDefaultFontSize(prefs
.default_font_size
);
131 settings
->setDefaultFixedFontSize(prefs
.default_fixed_font_size
);
132 settings
->setMinimumFontSize(prefs
.minimum_font_size
);
133 settings
->setMinimumLogicalFontSize(prefs
.minimum_logical_font_size
);
134 settings
->setDefaultTextEncodingName(
135 base::ASCIIToUTF16(prefs
.default_encoding
));
136 settings
->setJavaScriptEnabled(prefs
.javascript_enabled
);
137 settings
->setWebSecurityEnabled(prefs
.web_security_enabled
);
138 settings
->setJavaScriptCanOpenWindowsAutomatically(
139 prefs
.javascript_can_open_windows_automatically
);
140 settings
->setLoadsImagesAutomatically(prefs
.loads_images_automatically
);
141 settings
->setImagesEnabled(prefs
.images_enabled
);
142 settings
->setPluginsEnabled(prefs
.plugins_enabled
);
143 settings
->setDOMPasteAllowed(prefs
.dom_paste_enabled
);
144 settings
->setNeedsSiteSpecificQuirks(prefs
.site_specific_quirks_enabled
);
145 settings
->setShrinksStandaloneImagesToFit(
146 prefs
.shrinks_standalone_images_to_fit
);
147 settings
->setUsesEncodingDetector(prefs
.uses_universal_detector
);
148 settings
->setTextAreasAreResizable(prefs
.text_areas_are_resizable
);
149 settings
->setAllowScriptsToCloseWindows(prefs
.allow_scripts_to_close_windows
);
150 settings
->setDownloadableBinaryFontsEnabled(prefs
.remote_fonts_enabled
);
151 settings
->setJavaScriptCanAccessClipboard(
152 prefs
.javascript_can_access_clipboard
);
153 WebRuntimeFeatures::enableXSLT(prefs
.xslt_enabled
);
154 settings
->setXSSAuditorEnabled(prefs
.xss_auditor_enabled
);
155 settings
->setDNSPrefetchingEnabled(prefs
.dns_prefetching_enabled
);
156 settings
->setLocalStorageEnabled(prefs
.local_storage_enabled
);
157 settings
->setSyncXHRInDocumentsEnabled(prefs
.sync_xhr_in_documents_enabled
);
158 WebRuntimeFeatures::enableDatabase(prefs
.databases_enabled
);
159 settings
->setOfflineWebApplicationCacheEnabled(
160 prefs
.application_cache_enabled
);
161 settings
->setCaretBrowsingEnabled(prefs
.caret_browsing_enabled
);
162 settings
->setHyperlinkAuditingEnabled(prefs
.hyperlink_auditing_enabled
);
163 settings
->setCookieEnabled(prefs
.cookie_enabled
);
165 // This setting affects the behavior of links in an editable region:
166 // clicking the link should select it rather than navigate to it.
167 // Safari uses the same default. It is unlikley an embedder would want to
168 // change this, since it would break existing rich text editors.
169 settings
->setEditableLinkBehaviorNeverLive();
171 settings
->setJavaEnabled(prefs
.java_enabled
);
173 // By default, allow_universal_access_from_file_urls is set to false and thus
174 // we mitigate attacks from local HTML files by not granting file:// URLs
175 // universal access. Only test shell will enable this.
176 settings
->setAllowUniversalAccessFromFileURLs(
177 prefs
.allow_universal_access_from_file_urls
);
178 settings
->setAllowFileAccessFromFileURLs(
179 prefs
.allow_file_access_from_file_urls
);
181 // Enable the web audio API if requested on the command line.
182 settings
->setWebAudioEnabled(prefs
.webaudio_enabled
);
184 // Enable experimental WebGL support if requested on command line
185 // and support is compiled in.
186 settings
->setExperimentalWebGLEnabled(prefs
.experimental_webgl_enabled
);
188 // Disable GL multisampling if requested on command line.
189 settings
->setOpenGLMultisamplingEnabled(prefs
.gl_multisampling_enabled
);
191 // Enable privileged WebGL extensions for Chrome extensions or if requested
193 settings
->setPrivilegedWebGLExtensionsEnabled(
194 prefs
.privileged_webgl_extensions_enabled
);
196 // Enable WebGL errors to the JS console if requested.
197 settings
->setWebGLErrorsToConsoleEnabled(
198 prefs
.webgl_errors_to_console_enabled
);
200 // Enables accelerated compositing for overflow scroll.
201 settings
->setAcceleratedCompositingForOverflowScrollEnabled(
202 prefs
.accelerated_compositing_for_overflow_scroll_enabled
);
204 // Enables accelerated compositing for scrollable frames if requested on
206 settings
->setAcceleratedCompositingForScrollableFramesEnabled(
207 prefs
.accelerated_compositing_for_scrollable_frames_enabled
);
209 // Enables composited scrolling for frames if requested on command line.
210 settings
->setCompositedScrollingForFramesEnabled(
211 prefs
.composited_scrolling_for_frames_enabled
);
213 // Uses the mock theme engine for scrollbars.
214 settings
->setMockScrollbarsEnabled(prefs
.mock_scrollbars_enabled
);
216 settings
->setLayerSquashingEnabled(prefs
.layer_squashing_enabled
);
218 settings
->setThreadedHTMLParser(prefs
.threaded_html_parser
);
220 // Display visualization of what has changed on the screen using an
221 // overlay of rects, if requested on the command line.
222 settings
->setShowPaintRects(prefs
.show_paint_rects
);
224 // Enable gpu-accelerated compositing if requested on the command line.
225 settings
->setAcceleratedCompositingEnabled(
226 prefs
.accelerated_compositing_enabled
);
228 // Enable gpu-accelerated 2d canvas if requested on the command line.
229 settings
->setAccelerated2dCanvasEnabled(prefs
.accelerated_2d_canvas_enabled
);
231 settings
->setMinimumAccelerated2dCanvasSize(
232 prefs
.minimum_accelerated_2d_canvas_size
);
234 // Disable antialiasing for 2d canvas if requested on the command line.
235 settings
->setAntialiased2dCanvasEnabled(
236 !prefs
.antialiased_2d_canvas_disabled
);
238 // Set MSAA sample count for 2d canvas if requested on the command line (or
239 // default value if not).
240 settings
->setAccelerated2dCanvasMSAASampleCount(
241 prefs
.accelerated_2d_canvas_msaa_sample_count
);
243 // Enable gpu-accelerated filters if requested on the command line.
244 settings
->setAcceleratedFiltersEnabled(prefs
.accelerated_filters_enabled
);
246 // Enable gesture tap highlight if requested on the command line.
247 settings
->setGestureTapHighlightEnabled(prefs
.gesture_tap_highlight_enabled
);
249 // Enabling accelerated layers from the command line enabled accelerated
250 // 3D CSS, Video, and Animations.
251 settings
->setAcceleratedCompositingFor3DTransformsEnabled(
252 prefs
.accelerated_compositing_for_3d_transforms_enabled
);
253 settings
->setAcceleratedCompositingForVideoEnabled(
254 prefs
.accelerated_compositing_for_video_enabled
);
255 settings
->setAcceleratedCompositingForAnimationEnabled(
256 prefs
.accelerated_compositing_for_animation_enabled
);
258 // Enabling accelerated plugins if specified from the command line.
259 settings
->setAcceleratedCompositingForPluginsEnabled(
260 prefs
.accelerated_compositing_for_plugins_enabled
);
262 // WebGL and accelerated 2D canvas are always gpu composited.
263 settings
->setAcceleratedCompositingForCanvasEnabled(
264 prefs
.experimental_webgl_enabled
|| prefs
.accelerated_2d_canvas_enabled
);
266 // Enable memory info reporting to page if requested on the command line.
267 settings
->setMemoryInfoEnabled(prefs
.memory_info_enabled
);
269 settings
->setAsynchronousSpellCheckingEnabled(
270 prefs
.asynchronous_spell_checking_enabled
);
271 settings
->setUnifiedTextCheckerEnabled(prefs
.unified_textchecker_enabled
);
273 for (webkit_glue::WebInspectorPreferences::const_iterator it
=
274 prefs
.inspector_settings
.begin();
275 it
!= prefs
.inspector_settings
.end();
277 web_view
->setInspectorSetting(WebString::fromUTF8(it
->first
),
278 WebString::fromUTF8(it
->second
));
281 // Tabs to link is not part of the settings. WebCore calls
282 // ChromeClient::tabsToLinks which is part of the glue code.
283 web_view
->setTabsToLinks(prefs
.tabs_to_links
);
285 settings
->setFullScreenEnabled(prefs
.fullscreen_enabled
);
286 settings
->setAllowDisplayOfInsecureContent(
287 prefs
.allow_displaying_insecure_content
);
288 settings
->setAllowRunningOfInsecureContent(
289 prefs
.allow_running_insecure_content
);
290 settings
->setPasswordEchoEnabled(prefs
.password_echo_enabled
);
291 settings
->setShouldPrintBackgrounds(prefs
.should_print_backgrounds
);
292 settings
->setShouldClearDocumentBackground(
293 prefs
.should_clear_document_background
);
294 settings
->setEnableScrollAnimator(prefs
.enable_scroll_animator
);
295 settings
->setVisualWordMovementEnabled(prefs
.visual_word_movement_enabled
);
297 settings
->setRegionBasedColumnsEnabled(prefs
.region_based_columns_enabled
);
299 WebRuntimeFeatures::enableLazyLayout(prefs
.lazy_layout_enabled
);
300 WebRuntimeFeatures::enableTouch(prefs
.touch_enabled
);
301 settings
->setMaxTouchPoints(prefs
.pointer_events_max_touch_points
);
302 settings
->setDeviceSupportsTouch(prefs
.device_supports_touch
);
303 settings
->setDeviceSupportsMouse(prefs
.device_supports_mouse
);
304 settings
->setEnableTouchAdjustment(prefs
.touch_adjustment_enabled
);
306 settings
->setFixedPositionCreatesStackingContext(
307 prefs
.fixed_position_creates_stacking_context
);
309 settings
->setDeferredImageDecodingEnabled(
310 prefs
.deferred_image_decoding_enabled
);
311 settings
->setShouldRespectImageOrientation(
312 prefs
.should_respect_image_orientation
);
314 settings
->setUnsafePluginPastingEnabled(false);
315 settings
->setEditingBehavior(
316 static_cast<WebSettings::EditingBehavior
>(prefs
.editing_behavior
));
318 settings
->setSupportsMultipleWindows(prefs
.supports_multiple_windows
);
320 settings
->setViewportEnabled(prefs
.viewport_enabled
);
321 settings
->setLoadWithOverviewMode(prefs
.initialize_at_minimum_page_scale
);
322 settings
->setViewportMetaEnabled(prefs
.viewport_meta_enabled
);
323 settings
->setMainFrameResizesAreOrientationChanges(
324 prefs
.main_frame_resizes_are_orientation_changes
);
326 settings
->setSmartInsertDeleteEnabled(prefs
.smart_insert_delete_enabled
);
328 settings
->setSpatialNavigationEnabled(prefs
.spatial_navigation_enabled
);
330 settings
->setSelectionIncludesAltImageText(true);
332 #if defined(OS_ANDROID)
333 settings
->setAllowCustomScrollbarInMainFrame(false);
334 settings
->setTextAutosizingEnabled(prefs
.text_autosizing_enabled
);
335 settings
->setAccessibilityFontScaleFactor(prefs
.font_scale_factor
);
336 settings
->setDeviceScaleAdjustment(prefs
.device_scale_adjustment
);
337 web_view
->setIgnoreViewportTagScaleLimits(prefs
.force_enable_zoom
);
338 settings
->setAutoZoomFocusedNodeToLegibleScale(true);
339 settings
->setDoubleTapToZoomEnabled(prefs
.double_tap_to_zoom_enabled
);
340 settings
->setMediaPlaybackRequiresUserGesture(
341 prefs
.user_gesture_required_for_media_playback
);
342 settings
->setMediaFullscreenRequiresUserGesture(
343 prefs
.user_gesture_required_for_media_fullscreen
);
344 settings
->setDefaultVideoPosterURL(
345 base::ASCIIToUTF16(prefs
.default_video_poster_url
.spec()));
346 settings
->setSupportDeprecatedTargetDensityDPI(
347 prefs
.support_deprecated_target_density_dpi
);
348 settings
->setUseLegacyBackgroundSizeShorthandBehavior(
349 prefs
.use_legacy_background_size_shorthand_behavior
);
350 settings
->setWideViewportQuirkEnabled(prefs
.wide_viewport_quirk
);
351 settings
->setUseWideViewport(prefs
.use_wide_viewport
);
352 settings
->setViewportMetaLayoutSizeQuirk(
353 prefs
.viewport_meta_layout_size_quirk
);
354 settings
->setViewportMetaMergeContentQuirk(
355 prefs
.viewport_meta_merge_content_quirk
);
356 settings
->setViewportMetaNonUserScalableQuirk(
357 prefs
.viewport_meta_non_user_scalable_quirk
);
358 settings
->setViewportMetaZeroValuesQuirk(
359 prefs
.viewport_meta_zero_values_quirk
);
360 settings
->setClobberUserAgentInitialScaleQuirk(
361 prefs
.clobber_user_agent_initial_scale_quirk
);
362 settings
->setIgnoreMainFrameOverflowHiddenQuirk(
363 prefs
.ignore_main_frame_overflow_hidden_quirk
);
364 settings
->setReportScreenSizeInPhysicalPixelsQuirk(
365 prefs
.report_screen_size_in_physical_pixels_quirk
);
366 settings
->setMainFrameClipsContent(false);
367 settings
->setShrinksStandaloneImagesToFit(false);
370 WebNetworkStateNotifier::setOnLine(prefs
.is_online
);
371 settings
->setExperimentalWebSocketEnabled(
372 prefs
.experimental_websocket_enabled
);
373 settings
->setPinchVirtualViewportEnabled(
374 prefs
.pinch_virtual_viewport_enabled
);
376 settings
->setPinchOverlayScrollbarThickness(
377 prefs
.pinch_overlay_scrollbar_thickness
);
378 settings
->setUseSolidColorScrollbars(prefs
.use_solid_color_scrollbars
);
379 settings
->setCompositorTouchHitTesting(prefs
.compositor_touch_hit_testing
);
382 } // namespace content