aw_settings.cc 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  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. #include "android_webview/browser/aw_settings.h"
  5. #include <memory>
  6. #include "android_webview/browser/aw_browser_context.h"
  7. #include "android_webview/browser/aw_content_browser_client.h"
  8. #include "android_webview/browser/aw_contents.h"
  9. #include "android_webview/browser/aw_dark_mode.h"
  10. #include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
  11. #include "android_webview/browser_jni_headers/AwSettings_jni.h"
  12. #include "android_webview/common/aw_content_client.h"
  13. #include "android_webview/common/aw_features.h"
  14. #include "base/android/jni_android.h"
  15. #include "base/android/jni_string.h"
  16. #include "base/memory/raw_ptr.h"
  17. #include "base/supports_user_data.h"
  18. #include "components/viz/common/features.h"
  19. #include "content/public/browser/navigation_controller.h"
  20. #include "content/public/browser/navigation_entry.h"
  21. #include "content/public/browser/render_view_host.h"
  22. #include "content/public/browser/renderer_preferences_util.h"
  23. #include "content/public/browser/storage_partition.h"
  24. #include "content/public/browser/web_contents.h"
  25. #include "net/http/http_util.h"
  26. #include "services/network/public/mojom/network_context.mojom.h"
  27. #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h"
  28. #include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom.h"
  29. using base::android::ConvertJavaStringToUTF16;
  30. using base::android::ConvertUTF8ToJavaString;
  31. using base::android::JavaParamRef;
  32. using base::android::ScopedJavaLocalRef;
  33. using blink::web_pref::WebPreferences;
  34. namespace android_webview {
  35. namespace {
  36. void PopulateFixedWebPreferences(WebPreferences* web_prefs) {
  37. web_prefs->shrinks_standalone_images_to_fit = false;
  38. web_prefs->should_clear_document_background = false;
  39. web_prefs->viewport_meta_enabled = true;
  40. web_prefs->picture_in_picture_enabled = false;
  41. web_prefs->disable_accelerated_small_canvases = true;
  42. // WebView has historically not adjusted font scale for text autosizing.
  43. web_prefs->device_scale_adjustment = 1.0;
  44. }
  45. const void* const kAwSettingsUserDataKey = &kAwSettingsUserDataKey;
  46. } // namespace
  47. class AwSettingsUserData : public base::SupportsUserData::Data {
  48. public:
  49. explicit AwSettingsUserData(AwSettings* ptr) : settings_(ptr) {}
  50. static AwSettings* GetSettings(content::WebContents* web_contents) {
  51. if (!web_contents)
  52. return NULL;
  53. AwSettingsUserData* data = static_cast<AwSettingsUserData*>(
  54. web_contents->GetUserData(kAwSettingsUserDataKey));
  55. return data ? data->settings_.get() : NULL;
  56. }
  57. private:
  58. raw_ptr<AwSettings> settings_;
  59. };
  60. AwSettings::AwSettings(JNIEnv* env,
  61. jobject obj,
  62. content::WebContents* web_contents)
  63. : WebContentsObserver(web_contents),
  64. renderer_prefs_initialized_(false),
  65. javascript_can_open_windows_automatically_(false),
  66. allow_third_party_cookies_(false),
  67. allow_file_access_(false),
  68. enterprise_authentication_app_link_policy_enabled_(
  69. true), // TODO(b/222053757,ayushsha): Change this policy to be by
  70. // default false from next Android version(Maybe Android U).
  71. aw_settings_(env, obj) {
  72. web_contents->SetUserData(kAwSettingsUserDataKey,
  73. std::make_unique<AwSettingsUserData>(this));
  74. }
  75. AwSettings::~AwSettings() {
  76. if (web_contents()) {
  77. web_contents()->SetUserData(kAwSettingsUserDataKey, NULL);
  78. }
  79. JNIEnv* env = base::android::AttachCurrentThread();
  80. ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
  81. if (!scoped_obj)
  82. return;
  83. Java_AwSettings_nativeAwSettingsGone(env, scoped_obj,
  84. reinterpret_cast<intptr_t>(this));
  85. }
  86. bool AwSettings::GetJavaScriptCanOpenWindowsAutomatically() {
  87. return javascript_can_open_windows_automatically_;
  88. }
  89. bool AwSettings::GetAllowThirdPartyCookies() {
  90. return allow_third_party_cookies_;
  91. }
  92. void AwSettings::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
  93. delete this;
  94. }
  95. AwSettings* AwSettings::FromWebContents(content::WebContents* web_contents) {
  96. return AwSettingsUserData::GetSettings(web_contents);
  97. }
  98. bool AwSettings::GetAllowSniffingFileUrls() {
  99. JNIEnv* env = base::android::AttachCurrentThread();
  100. return Java_AwSettings_getAllowSniffingFileUrls(env);
  101. }
  102. AwSettings::RequestedWithHeaderMode
  103. AwSettings::GetDefaultRequestedWithHeaderMode() {
  104. if (base::FeatureList::IsEnabled(features::kWebViewXRequestedWithHeader)) {
  105. int configuredValue = features::kWebViewXRequestedWithHeaderMode.Get();
  106. switch (configuredValue) {
  107. case AwSettings::RequestedWithHeaderMode::CONSTANT_WEBVIEW:
  108. return AwSettings::RequestedWithHeaderMode::CONSTANT_WEBVIEW;
  109. case AwSettings::RequestedWithHeaderMode::NO_HEADER:
  110. return AwSettings::RequestedWithHeaderMode::NO_HEADER;
  111. default:
  112. // If the field trial config is broken for some reason, use the
  113. // package name, since the feature is still enabled.
  114. return AwSettings::RequestedWithHeaderMode::APP_PACKAGE_NAME;
  115. }
  116. } else {
  117. return AwSettings::RequestedWithHeaderMode::NO_HEADER;
  118. }
  119. }
  120. AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() {
  121. if (!web_contents())
  122. return NULL;
  123. AwContents* contents = AwContents::FromWebContents(web_contents());
  124. if (!contents)
  125. return NULL;
  126. return contents->render_view_host_ext();
  127. }
  128. void AwSettings::ResetScrollAndScaleState(JNIEnv* env,
  129. const JavaParamRef<jobject>& obj) {
  130. AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
  131. if (!rvhe)
  132. return;
  133. rvhe->ResetScrollAndScaleState();
  134. }
  135. void AwSettings::UpdateEverything() {
  136. JNIEnv* env = base::android::AttachCurrentThread();
  137. CHECK(env);
  138. ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
  139. if (!scoped_obj)
  140. return;
  141. // Grab the lock and call UpdateEverythingLocked.
  142. Java_AwSettings_updateEverything(env, scoped_obj);
  143. }
  144. void AwSettings::UpdateEverythingLocked(JNIEnv* env,
  145. const JavaParamRef<jobject>& obj) {
  146. UpdateInitialPageScaleLocked(env, obj);
  147. UpdateWebkitPreferencesLocked(env, obj);
  148. UpdateUserAgentLocked(env, obj);
  149. ResetScrollAndScaleState(env, obj);
  150. UpdateFormDataPreferencesLocked(env, obj);
  151. UpdateRendererPreferencesLocked(env, obj);
  152. UpdateOffscreenPreRasterLocked(env, obj);
  153. UpdateWillSuppressErrorStateLocked(env, obj);
  154. UpdateCookiePolicyLocked(env, obj);
  155. UpdateAllowFileAccessLocked(env, obj);
  156. }
  157. void AwSettings::UpdateUserAgentLocked(JNIEnv* env,
  158. const JavaParamRef<jobject>& obj) {
  159. if (!web_contents())
  160. return;
  161. ScopedJavaLocalRef<jstring> str =
  162. Java_AwSettings_getUserAgentLocked(env, obj);
  163. bool ua_overidden = !!str;
  164. if (ua_overidden) {
  165. std::string override = base::android::ConvertJavaStringToUTF8(str);
  166. web_contents()->SetUserAgentOverride(
  167. blink::UserAgentOverride::UserAgentOnly(override), true);
  168. }
  169. content::NavigationController& controller = web_contents()->GetController();
  170. for (int i = 0; i < controller.GetEntryCount(); ++i)
  171. controller.GetEntryAtIndex(i)->SetIsOverridingUserAgent(ua_overidden);
  172. }
  173. void AwSettings::UpdateWebkitPreferencesLocked(
  174. JNIEnv* env,
  175. const JavaParamRef<jobject>& obj) {
  176. if (!web_contents())
  177. return;
  178. AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
  179. if (!render_view_host_ext)
  180. return;
  181. web_contents()->OnWebPreferencesChanged();
  182. }
  183. void AwSettings::UpdateInitialPageScaleLocked(
  184. JNIEnv* env,
  185. const JavaParamRef<jobject>& obj) {
  186. AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
  187. if (!rvhe)
  188. return;
  189. float initial_page_scale_percent =
  190. Java_AwSettings_getInitialPageScalePercentLocked(env, obj);
  191. if (initial_page_scale_percent == 0) {
  192. rvhe->SetInitialPageScale(-1);
  193. } else {
  194. float dip_scale =
  195. static_cast<float>(Java_AwSettings_getDIPScaleLocked(env, obj));
  196. rvhe->SetInitialPageScale(initial_page_scale_percent / dip_scale / 100.0f);
  197. }
  198. }
  199. void AwSettings::UpdateWillSuppressErrorStateLocked(
  200. JNIEnv* env,
  201. const JavaParamRef<jobject>& obj) {
  202. AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt();
  203. if (!rvhe)
  204. return;
  205. bool suppress = Java_AwSettings_getWillSuppressErrorPageLocked(env, obj);
  206. rvhe->SetWillSuppressErrorPage(suppress);
  207. }
  208. void AwSettings::UpdateFormDataPreferencesLocked(
  209. JNIEnv* env,
  210. const JavaParamRef<jobject>& obj) {
  211. if (!web_contents())
  212. return;
  213. AwContents* contents = AwContents::FromWebContents(web_contents());
  214. if (!contents)
  215. return;
  216. contents->SetSaveFormData(Java_AwSettings_getSaveFormDataLocked(env, obj));
  217. }
  218. void AwSettings::UpdateRendererPreferencesLocked(
  219. JNIEnv* env,
  220. const JavaParamRef<jobject>& obj) {
  221. if (!web_contents())
  222. return;
  223. bool update_prefs = false;
  224. blink::RendererPreferences* prefs = web_contents()->GetMutableRendererPrefs();
  225. if (!renderer_prefs_initialized_) {
  226. content::UpdateFontRendererPreferencesFromSystemSettings(prefs);
  227. renderer_prefs_initialized_ = true;
  228. update_prefs = true;
  229. }
  230. if (prefs->accept_languages.compare(
  231. AwContentBrowserClient::GetAcceptLangsImpl())) {
  232. prefs->accept_languages = AwContentBrowserClient::GetAcceptLangsImpl();
  233. update_prefs = true;
  234. }
  235. if (update_prefs)
  236. web_contents()->SyncRendererPrefs();
  237. if (update_prefs) {
  238. // make sure to update accept languages when the network service is enabled
  239. AwBrowserContext* aw_browser_context =
  240. AwBrowserContext::FromWebContents(web_contents());
  241. // AndroidWebview does not use per-site storage partitions.
  242. content::StoragePartition* storage_partition =
  243. aw_browser_context->GetDefaultStoragePartition();
  244. std::string expanded_language_list =
  245. net::HttpUtil::ExpandLanguageList(prefs->accept_languages);
  246. storage_partition->GetNetworkContext()->SetAcceptLanguage(
  247. net::HttpUtil::GenerateAcceptLanguageHeader(expanded_language_list));
  248. }
  249. }
  250. void AwSettings::UpdateCookiePolicyLocked(JNIEnv* env,
  251. const JavaParamRef<jobject>& obj) {
  252. if (!web_contents())
  253. return;
  254. allow_third_party_cookies_ =
  255. Java_AwSettings_getAcceptThirdPartyCookiesLocked(env, obj);
  256. }
  257. void AwSettings::UpdateOffscreenPreRasterLocked(
  258. JNIEnv* env,
  259. const JavaParamRef<jobject>& obj) {
  260. AwContents* contents = AwContents::FromWebContents(web_contents());
  261. if (contents) {
  262. contents->SetOffscreenPreRaster(
  263. Java_AwSettings_getOffscreenPreRasterLocked(env, obj));
  264. }
  265. }
  266. void AwSettings::UpdateAllowFileAccessLocked(JNIEnv* env,
  267. const JavaParamRef<jobject>& obj) {
  268. if (!web_contents())
  269. return;
  270. allow_file_access_ = Java_AwSettings_getAllowFileAccess(env, obj);
  271. }
  272. void AwSettings::RenderViewHostChanged(content::RenderViewHost* old_host,
  273. content::RenderViewHost* new_host) {
  274. DCHECK_EQ(new_host, web_contents()->GetRenderViewHost());
  275. UpdateEverything();
  276. }
  277. void AwSettings::WebContentsDestroyed() {
  278. delete this;
  279. }
  280. void AwSettings::PopulateWebPreferences(WebPreferences* web_prefs) {
  281. JNIEnv* env = base::android::AttachCurrentThread();
  282. CHECK(env);
  283. ScopedJavaLocalRef<jobject> scoped_obj = aw_settings_.get(env);
  284. if (!scoped_obj)
  285. return;
  286. // Grab the lock and call PopulateWebPreferencesLocked.
  287. Java_AwSettings_populateWebPreferences(env, scoped_obj,
  288. reinterpret_cast<jlong>(web_prefs));
  289. }
  290. void AwSettings::PopulateWebPreferencesLocked(JNIEnv* env,
  291. const JavaParamRef<jobject>& obj,
  292. jlong web_prefs_ptr) {
  293. AwRenderViewHostExt* render_view_host_ext = GetAwRenderViewHostExt();
  294. if (!render_view_host_ext)
  295. return;
  296. WebPreferences* web_prefs = reinterpret_cast<WebPreferences*>(web_prefs_ptr);
  297. PopulateFixedWebPreferences(web_prefs);
  298. web_prefs->text_autosizing_enabled =
  299. Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
  300. int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
  301. if (web_prefs->text_autosizing_enabled) {
  302. web_prefs->font_scale_factor = text_size_percent / 100.0f;
  303. web_prefs->force_enable_zoom = text_size_percent >= 130;
  304. // Use the default zoom factor value when Text Autosizer is turned on.
  305. render_view_host_ext->SetTextZoomFactor(1);
  306. } else {
  307. web_prefs->force_enable_zoom = false;
  308. render_view_host_ext->SetTextZoomFactor(text_size_percent / 100.0f);
  309. }
  310. web_prefs->standard_font_family_map[blink::web_pref::kCommonScript] =
  311. ConvertJavaStringToUTF16(
  312. Java_AwSettings_getStandardFontFamilyLocked(env, obj));
  313. web_prefs->fixed_font_family_map[blink::web_pref::kCommonScript] =
  314. ConvertJavaStringToUTF16(
  315. Java_AwSettings_getFixedFontFamilyLocked(env, obj));
  316. web_prefs->sans_serif_font_family_map[blink::web_pref::kCommonScript] =
  317. ConvertJavaStringToUTF16(
  318. Java_AwSettings_getSansSerifFontFamilyLocked(env, obj));
  319. web_prefs->serif_font_family_map[blink::web_pref::kCommonScript] =
  320. ConvertJavaStringToUTF16(
  321. Java_AwSettings_getSerifFontFamilyLocked(env, obj));
  322. web_prefs->cursive_font_family_map[blink::web_pref::kCommonScript] =
  323. ConvertJavaStringToUTF16(
  324. Java_AwSettings_getCursiveFontFamilyLocked(env, obj));
  325. web_prefs->fantasy_font_family_map[blink::web_pref::kCommonScript] =
  326. ConvertJavaStringToUTF16(
  327. Java_AwSettings_getFantasyFontFamilyLocked(env, obj));
  328. web_prefs->default_encoding = ConvertJavaStringToUTF8(
  329. Java_AwSettings_getDefaultTextEncodingLocked(env, obj));
  330. web_prefs->minimum_font_size =
  331. Java_AwSettings_getMinimumFontSizeLocked(env, obj);
  332. web_prefs->minimum_logical_font_size =
  333. Java_AwSettings_getMinimumLogicalFontSizeLocked(env, obj);
  334. web_prefs->default_font_size =
  335. Java_AwSettings_getDefaultFontSizeLocked(env, obj);
  336. web_prefs->default_fixed_font_size =
  337. Java_AwSettings_getDefaultFixedFontSizeLocked(env, obj);
  338. // Blink's LoadsImagesAutomatically and ImagesEnabled must be
  339. // set cris-cross to Android's. See
  340. // https://code.google.com/p/chromium/issues/detail?id=224317#c26
  341. web_prefs->loads_images_automatically =
  342. Java_AwSettings_getImagesEnabledLocked(env, obj);
  343. web_prefs->images_enabled =
  344. Java_AwSettings_getLoadsImagesAutomaticallyLocked(env, obj);
  345. web_prefs->javascript_enabled =
  346. Java_AwSettings_getJavaScriptEnabledLocked(env, obj);
  347. web_prefs->allow_universal_access_from_file_urls =
  348. Java_AwSettings_getAllowUniversalAccessFromFileURLsLocked(env, obj);
  349. web_prefs->allow_file_access_from_file_urls =
  350. Java_AwSettings_getAllowFileAccessFromFileURLsLocked(env, obj);
  351. javascript_can_open_windows_automatically_ =
  352. Java_AwSettings_getJavaScriptCanOpenWindowsAutomaticallyLocked(env, obj);
  353. web_prefs->supports_multiple_windows =
  354. Java_AwSettings_getSupportMultipleWindowsLocked(env, obj);
  355. web_prefs->plugins_enabled = false;
  356. web_prefs->local_storage_enabled =
  357. Java_AwSettings_getDomStorageEnabledLocked(env, obj);
  358. web_prefs->databases_enabled =
  359. Java_AwSettings_getDatabaseEnabledLocked(env, obj);
  360. web_prefs->wide_viewport_quirk = true;
  361. web_prefs->use_wide_viewport =
  362. Java_AwSettings_getUseWideViewportLocked(env, obj);
  363. web_prefs->force_zero_layout_height =
  364. Java_AwSettings_getForceZeroLayoutHeightLocked(env, obj);
  365. const bool zero_layout_height_disables_viewport_quirk =
  366. Java_AwSettings_getZeroLayoutHeightDisablesViewportQuirkLocked(env, obj);
  367. web_prefs->viewport_enabled = !(zero_layout_height_disables_viewport_quirk &&
  368. web_prefs->force_zero_layout_height);
  369. web_prefs->double_tap_to_zoom_enabled =
  370. Java_AwSettings_supportsDoubleTapZoomLocked(env, obj);
  371. web_prefs->initialize_at_minimum_page_scale =
  372. Java_AwSettings_getLoadWithOverviewModeLocked(env, obj);
  373. web_prefs->autoplay_policy =
  374. Java_AwSettings_getMediaPlaybackRequiresUserGestureLocked(env, obj)
  375. ? blink::mojom::AutoplayPolicy::kUserGestureRequired
  376. : blink::mojom::AutoplayPolicy::kNoUserGestureRequired;
  377. ScopedJavaLocalRef<jstring> url =
  378. Java_AwSettings_getDefaultVideoPosterURLLocked(env, obj);
  379. web_prefs->default_video_poster_url =
  380. url.obj() ? GURL(ConvertJavaStringToUTF8(url)) : GURL();
  381. bool support_quirks = Java_AwSettings_getSupportLegacyQuirksLocked(env, obj);
  382. // Please see the corresponding Blink settings for bug references.
  383. web_prefs->support_deprecated_target_density_dpi = support_quirks;
  384. web_prefs->use_legacy_background_size_shorthand_behavior = support_quirks;
  385. web_prefs->viewport_meta_merge_content_quirk = support_quirks;
  386. web_prefs->viewport_meta_non_user_scalable_quirk = support_quirks;
  387. web_prefs->viewport_meta_zero_values_quirk = support_quirks;
  388. web_prefs->clobber_user_agent_initial_scale_quirk = support_quirks;
  389. web_prefs->ignore_main_frame_overflow_hidden_quirk = support_quirks;
  390. web_prefs->report_screen_size_in_physical_pixels_quirk = support_quirks;
  391. web_prefs->reuse_global_for_unowned_main_frame =
  392. Java_AwSettings_getAllowEmptyDocumentPersistenceLocked(env, obj);
  393. web_prefs->password_echo_enabled =
  394. Java_AwSettings_getPasswordEchoEnabledLocked(env, obj);
  395. web_prefs->spatial_navigation_enabled =
  396. Java_AwSettings_getSpatialNavigationLocked(env, obj);
  397. bool enable_supported_hardware_accelerated_features =
  398. Java_AwSettings_getEnableSupportedHardwareAcceleratedFeaturesLocked(env,
  399. obj);
  400. web_prefs->accelerated_2d_canvas_enabled =
  401. web_prefs->accelerated_2d_canvas_enabled &&
  402. enable_supported_hardware_accelerated_features;
  403. // Always allow webgl. Webview always requires access to the GPU even if
  404. // it only does software draws. WebGL will not show up in software draw so
  405. // there is no more brokenness for user. This makes it easier for apps that
  406. // want to start running webgl content before webview is first attached.
  407. // If strict mixed content checking is enabled then running should not be
  408. // allowed.
  409. DCHECK(!Java_AwSettings_getUseStricMixedContentCheckingLocked(env, obj) ||
  410. !Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj));
  411. web_prefs->allow_running_insecure_content =
  412. Java_AwSettings_getAllowRunningInsecureContentLocked(env, obj);
  413. web_prefs->strict_mixed_content_checking =
  414. Java_AwSettings_getUseStricMixedContentCheckingLocked(env, obj);
  415. web_prefs->fullscreen_supported =
  416. Java_AwSettings_getFullscreenSupportedLocked(env, obj);
  417. web_prefs->record_whole_document =
  418. Java_AwSettings_getRecordFullDocument(env, obj);
  419. // TODO(jww): This should be removed once sufficient warning has been given of
  420. // possible API breakage because of disabling insecure use of geolocation.
  421. web_prefs->allow_geolocation_on_insecure_origins =
  422. Java_AwSettings_getAllowGeolocationOnInsecureOrigins(env, obj);
  423. web_prefs->do_not_update_selection_on_mutating_selection_range =
  424. Java_AwSettings_getDoNotUpdateSelectionOnMutatingSelectionRange(env, obj);
  425. web_prefs->css_hex_alpha_color_enabled =
  426. Java_AwSettings_getCSSHexAlphaColorEnabledLocked(env, obj);
  427. // Keep spellcheck disabled on html elements unless the spellcheck="true"
  428. // attribute is explicitly specified. This "opt-in" behavior is for backward
  429. // consistency in apps that use WebView (see crbug.com/652314).
  430. web_prefs->spellcheck_enabled_by_default = false;
  431. web_prefs->scroll_top_left_interop_enabled =
  432. Java_AwSettings_getScrollTopLeftInteropEnabledLocked(env, obj);
  433. web_prefs->allow_mixed_content_upgrades =
  434. Java_AwSettings_getAllowMixedContentAutoupgradesLocked(env, obj);
  435. if (AwDarkMode* aw_dark_mode = AwDarkMode::FromWebContents(web_contents())) {
  436. aw_dark_mode->PopulateWebPreferences(
  437. web_prefs, Java_AwSettings_getForceDarkModeLocked(env, obj),
  438. Java_AwSettings_getForceDarkBehaviorLocked(env, obj),
  439. Java_AwSettings_isAlgorithmicDarkeningAllowedLocked(env, obj));
  440. }
  441. // WebView does not support WebAuthn yet.
  442. web_prefs->disable_webauthn = true;
  443. }
  444. bool AwSettings::IsForceDarkApplied(JNIEnv* env,
  445. const JavaParamRef<jobject>& obj) {
  446. if (AwDarkMode* aw_dark_mode = AwDarkMode::FromWebContents(web_contents())) {
  447. return aw_dark_mode->is_force_dark_applied();
  448. }
  449. return false;
  450. }
  451. void AwSettings::SetEnterpriseAuthenticationAppLinkPolicyEnabled(
  452. JNIEnv* env,
  453. const JavaParamRef<jobject>& obj,
  454. jboolean enabled) {
  455. enterprise_authentication_app_link_policy_enabled_ = enabled;
  456. }
  457. bool AwSettings::GetEnterpriseAuthenticationAppLinkPolicyEnabled(
  458. JNIEnv* env,
  459. const JavaParamRef<jobject>& obj) {
  460. return enterprise_authentication_app_link_policy_enabled();
  461. }
  462. bool AwSettings::GetAllowFileAccess() {
  463. return allow_file_access_;
  464. }
  465. static jlong JNI_AwSettings_Init(JNIEnv* env,
  466. const JavaParamRef<jobject>& obj,
  467. const JavaParamRef<jobject>& web_contents) {
  468. content::WebContents* contents =
  469. content::WebContents::FromJavaWebContents(web_contents);
  470. AwSettings* settings = new AwSettings(env, obj, contents);
  471. return reinterpret_cast<intptr_t>(settings);
  472. }
  473. static ScopedJavaLocalRef<jstring> JNI_AwSettings_GetDefaultUserAgent(
  474. JNIEnv* env) {
  475. return base::android::ConvertUTF8ToJavaString(env, GetUserAgent());
  476. }
  477. } // namespace android_webview