diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 4290046e5beff..5326b36457f24 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -857,8 +857,8 @@ void RenderViewHostImpl::RequestSetBounds(const gfx::Rect& bounds) {
 }
 
 void RenderViewHostImpl::SendWebPreferencesToRenderer() {
-  Send(new ViewMsg_UpdateWebPreferences(
-      GetRoutingID(), delegate_->GetOrCreateWebPreferences()));
+  if (auto& broadcast = GetAssociatedPageBroadcast())
+    broadcast->UpdateWebPreferences(delegate_->GetOrCreateWebPreferences());
 }
 
 void RenderViewHostImpl::OnHardwareConfigurationChanged() {
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 7f73d9755e7bd..474c064e2097d 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -664,7 +664,6 @@ mojom("mojo_bindings") {
     "//cc/mojom",
     "//components/variations:variations_mojom",
     "//content/public/common:interfaces",
-    "//content/public/common:web_preferences_mojom",
     "//ipc:mojom",
     "//ipc:mojom_constants",
     "//media/capture/mojom:video_capture",
diff --git a/content/common/agent_scheduling_group.mojom b/content/common/agent_scheduling_group.mojom
index e5aa8aad38876..19106e82059eb 100644
--- a/content/common/agent_scheduling_group.mojom
+++ b/content/common/agent_scheduling_group.mojom
@@ -6,7 +6,6 @@ module content.mojom;
 
 import "content/common/document_scoped_interface_bundle.mojom";
 import "content/common/native_types.mojom";
-import "content/public/common/web_preferences.mojom";
 import "ipc/constants.mojom";
 import "mojo/public/mojom/base/generic_pending_receiver.mojom";
 import "mojo/public/mojom/base/unguessable_token.mojom";
@@ -14,6 +13,7 @@ import "third_party/blink/public/mojom/frame/frame_owner_properties.mojom";
 import "third_party/blink/public/mojom/page/page.mojom";
 import "third_party/blink/public/mojom/page/widget.mojom";
 import "third_party/blink/public/mojom/renderer_preferences.mojom";
+import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom";
 import "third_party/blink/public/mojom/widget/visual_properties.mojom";
 
 // A View (i.e. a "main frame") can be created for a few different cases, these
@@ -32,7 +32,7 @@ struct CreateViewParams {
   blink.mojom.RendererPreferences renderer_preferences;
 
   // Preferences for this view.
-  WebPreferences web_preferences;
+  blink.mojom.WebPreferences web_preferences;
 
   // The ID of the view to be created.
   int32 view_id = IPC.mojom.kRoutingIdNone;
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 3f7794f80f67c..e89e812135749 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -94,10 +94,6 @@ IPC_STRUCT_TRAITS_END()
 
 // Messages sent from the browser to the renderer.
 
-// This passes a set of webkit preferences down to the renderer.
-IPC_MESSAGE_ROUTED1(ViewMsg_UpdateWebPreferences,
-                    blink::web_pref::WebPreferences)
-
 // Notification that a move or resize renderer's containing window has
 // started.
 IPC_MESSAGE_ROUTED0(ViewMsg_MoveOrResizeStarted)
diff --git a/content/public/common/BUILD.gn b/content/public/common/BUILD.gn
index 398f5ae7a1a69..dc190f1e9c965 100644
--- a/content/public/common/BUILD.gn
+++ b/content/public/common/BUILD.gn
@@ -393,35 +393,6 @@ mojom("renderer_type") {
   sources = [ "media_playback_renderer_type.mojom" ]
 }
 
-mojom("web_preferences_mojom") {
-  sources = [ "web_preferences.mojom" ]
-
-  public_deps = [
-    # This dependency is really a dependency for the typemaps, but we need
-    # it here so that we can override it correctly for the component build.
-    "//third_party/blink/public/mojom:mojom_platform",
-  ]
-
-  overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ]
-  component_deps = [ "//third_party/blink/public/common" ]
-
-  cpp_typemaps = [
-    {
-      types = [
-        {
-          mojom = "content.mojom.WebPreferences"
-          cpp = "::blink::web_pref::WebPreferences"
-        },
-      ]
-      traits_headers = [
-        "//third_party/blink/public/common/web_preferences/web_preferences.h",
-      ]
-      traits_private_headers = _common_param_traits_headers
-      traits_deps = _common_param_traits_deps
-    },
-  ]
-}
-
 mojom("service_names") {
   sources = [ "service_names.mojom" ]
 }
diff --git a/content/public/common/common_param_traits_macros.h b/content/public/common/common_param_traits_macros.h
index 52b53814fcc10..76cec143c1dc1 100644
--- a/content/public/common/common_param_traits_macros.h
+++ b/content/public/common/common_param_traits_macros.h
@@ -54,28 +54,8 @@ IPC_ENUM_TRAITS_MAX_VALUE(blink::mojom::ScrollRestorationType,
 IPC_ENUM_TRAITS_MAX_VALUE(blink::SecurityStyle, blink::SecurityStyle::kMaxValue)
 IPC_ENUM_TRAITS_MAX_VALUE(blink::mojom::PermissionStatus,
                           blink::mojom::PermissionStatus::LAST)
-IPC_ENUM_TRAITS_MAX_VALUE(blink::web_pref::EditingBehaviorType,
-                          blink::web_pref::kEditingLastBehavior)
 IPC_ENUM_TRAITS_MAX_VALUE(WindowOpenDisposition,
                           WindowOpenDisposition::MAX_VALUE)
-IPC_ENUM_TRAITS_MAX_VALUE(blink::mojom::V8CacheOptions,
-                          blink::mojom::V8CacheOptions::kMaxValue)
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(ui::PointerType,
-                              ui::POINTER_TYPE_FIRST,
-                              ui::POINTER_TYPE_LAST)
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(ui::HoverType,
-                              ui::HOVER_TYPE_FIRST,
-                              ui::HOVER_TYPE_LAST)
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::web_pref::ImageAnimationPolicy,
-                              blink::web_pref::kImageAnimationPolicyAllowed,
-                              blink::web_pref::kImageAnimationPolicyNoAnimation)
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::web_pref::ViewportStyle,
-                              blink::web_pref::ViewportStyle::kDefault,
-                              blink::web_pref::ViewportStyle::kTelevision)
-IPC_ENUM_TRAITS_MIN_MAX_VALUE(
-    blink::web_pref::AutoplayPolicy,
-    blink::web_pref::AutoplayPolicy::kNoUserGestureRequired,
-    blink::web_pref::AutoplayPolicy::kDocumentUserActivationRequired)
 IPC_ENUM_TRAITS_MIN_MAX_VALUE(blink::PreferredColorScheme,
                               blink::PreferredColorScheme::kDark,
                               blink::PreferredColorScheme::kMaxValue)
@@ -92,162 +72,6 @@ IPC_STRUCT_TRAITS_BEGIN(content::Referrer)
   IPC_STRUCT_TRAITS_MEMBER(policy)
 IPC_STRUCT_TRAITS_END()
 
-IPC_STRUCT_TRAITS_BEGIN(blink::web_pref::WebPreferences)
-  IPC_STRUCT_TRAITS_MEMBER(standard_font_family_map)
-  IPC_STRUCT_TRAITS_MEMBER(fixed_font_family_map)
-  IPC_STRUCT_TRAITS_MEMBER(serif_font_family_map)
-  IPC_STRUCT_TRAITS_MEMBER(sans_serif_font_family_map)
-  IPC_STRUCT_TRAITS_MEMBER(cursive_font_family_map)
-  IPC_STRUCT_TRAITS_MEMBER(fantasy_font_family_map)
-  IPC_STRUCT_TRAITS_MEMBER(default_font_size)
-  IPC_STRUCT_TRAITS_MEMBER(default_fixed_font_size)
-  IPC_STRUCT_TRAITS_MEMBER(minimum_font_size)
-  IPC_STRUCT_TRAITS_MEMBER(minimum_logical_font_size)
-  IPC_STRUCT_TRAITS_MEMBER(default_encoding)
-  IPC_STRUCT_TRAITS_MEMBER(context_menu_on_mouse_up)
-  IPC_STRUCT_TRAITS_MEMBER(javascript_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(web_security_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(loads_images_automatically)
-  IPC_STRUCT_TRAITS_MEMBER(images_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(plugins_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(dom_paste_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(shrinks_standalone_images_to_fit)
-  IPC_STRUCT_TRAITS_MEMBER(text_areas_are_resizable)
-  IPC_STRUCT_TRAITS_MEMBER(allow_scripts_to_close_windows)
-  IPC_STRUCT_TRAITS_MEMBER(remote_fonts_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(javascript_can_access_clipboard)
-  IPC_STRUCT_TRAITS_MEMBER(xslt_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(dns_prefetching_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(data_saver_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(data_saver_holdback_web_api_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(local_storage_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(databases_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(application_cache_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(tabs_to_links)
-  IPC_STRUCT_TRAITS_MEMBER(disable_ipc_flooding_protection)
-  IPC_STRUCT_TRAITS_MEMBER(hyperlink_auditing_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(allow_universal_access_from_file_urls)
-  IPC_STRUCT_TRAITS_MEMBER(allow_file_access_from_file_urls)
-  IPC_STRUCT_TRAITS_MEMBER(webgl1_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(webgl2_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(pepper_3d_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(record_whole_document)
-  IPC_STRUCT_TRAITS_MEMBER(flash_3d_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(flash_stage3d_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(flash_stage3d_baseline_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(privileged_webgl_extensions_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(webgl_errors_to_console_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(hide_scrollbars)
-  IPC_STRUCT_TRAITS_MEMBER(accelerated_2d_canvas_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(new_canvas_2d_api_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(antialiased_2d_canvas_disabled)
-  IPC_STRUCT_TRAITS_MEMBER(antialiased_clips_2d_canvas_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(accelerated_filters_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(deferred_filters_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(container_culling_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(allow_running_insecure_content)
-  IPC_STRUCT_TRAITS_MEMBER(disable_reading_from_canvas)
-  IPC_STRUCT_TRAITS_MEMBER(strict_mixed_content_checking)
-  IPC_STRUCT_TRAITS_MEMBER(strict_powerful_feature_restrictions)
-  IPC_STRUCT_TRAITS_MEMBER(allow_geolocation_on_insecure_origins)
-  IPC_STRUCT_TRAITS_MEMBER(strictly_block_blockable_mixed_content)
-  IPC_STRUCT_TRAITS_MEMBER(block_mixed_plugin_content)
-  IPC_STRUCT_TRAITS_MEMBER(enable_scroll_animator)
-  IPC_STRUCT_TRAITS_MEMBER(prefers_reduced_motion)
-  IPC_STRUCT_TRAITS_MEMBER(password_echo_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(should_clear_document_background)
-  IPC_STRUCT_TRAITS_MEMBER(touch_event_feature_detection_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(pointer_events_max_touch_points)
-  IPC_STRUCT_TRAITS_MEMBER(available_pointer_types)
-  IPC_STRUCT_TRAITS_MEMBER(primary_pointer_type)
-  IPC_STRUCT_TRAITS_MEMBER(available_hover_types)
-  IPC_STRUCT_TRAITS_MEMBER(primary_hover_type)
-  IPC_STRUCT_TRAITS_MEMBER(barrel_button_for_drag_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(sync_xhr_in_documents_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(number_of_cpu_cores)
-  IPC_STRUCT_TRAITS_MEMBER(editing_behavior)
-  IPC_STRUCT_TRAITS_MEMBER(supports_multiple_windows)
-  IPC_STRUCT_TRAITS_MEMBER(viewport_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(viewport_meta_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(shrinks_viewport_contents_to_fit)
-  IPC_STRUCT_TRAITS_MEMBER(viewport_style)
-  IPC_STRUCT_TRAITS_MEMBER(smooth_scroll_for_find_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(main_frame_resizes_are_orientation_changes)
-  IPC_STRUCT_TRAITS_MEMBER(initialize_at_minimum_page_scale)
-  IPC_STRUCT_TRAITS_MEMBER(smart_insert_delete_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(cookie_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(navigate_on_drag_drop)
-  IPC_STRUCT_TRAITS_MEMBER(spatial_navigation_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(v8_cache_options)
-  IPC_STRUCT_TRAITS_MEMBER(accelerated_video_decode_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(animation_policy)
-  IPC_STRUCT_TRAITS_MEMBER(user_gesture_required_for_presentation)
-  IPC_STRUCT_TRAITS_MEMBER(text_tracks_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_background_color)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_margin_percentage)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_text_color)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_text_size)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_text_shadow)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_font_family)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_font_style)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_font_variant)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_window_color)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_window_padding)
-  IPC_STRUCT_TRAITS_MEMBER(text_track_window_radius)
-  IPC_STRUCT_TRAITS_MEMBER(text_autosizing_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(double_tap_to_zoom_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(dont_send_key_events_to_javascript)
-  IPC_STRUCT_TRAITS_MEMBER(web_app_scope)
-  IPC_STRUCT_TRAITS_MEMBER(fullscreen_supported)
-#if defined(OS_ANDROID)
-  IPC_STRUCT_TRAITS_MEMBER(font_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(device_scale_adjustment)
-  IPC_STRUCT_TRAITS_MEMBER(force_enable_zoom)
-  IPC_STRUCT_TRAITS_MEMBER(default_video_poster_url)
-  IPC_STRUCT_TRAITS_MEMBER(support_deprecated_target_density_dpi)
-  IPC_STRUCT_TRAITS_MEMBER(use_legacy_background_size_shorthand_behavior)
-  IPC_STRUCT_TRAITS_MEMBER(wide_viewport_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(use_wide_viewport)
-  IPC_STRUCT_TRAITS_MEMBER(force_zero_layout_height)
-  IPC_STRUCT_TRAITS_MEMBER(viewport_meta_merge_content_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(viewport_meta_non_user_scalable_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(viewport_meta_zero_values_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(clobber_user_agent_initial_scale_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(ignore_main_frame_overflow_hidden_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(report_screen_size_in_physical_pixels_quirk)
-  IPC_STRUCT_TRAITS_MEMBER(reuse_global_for_unowned_main_frame)
-  IPC_STRUCT_TRAITS_MEMBER(spellcheck_enabled_by_default)
-  IPC_STRUCT_TRAITS_MEMBER(video_fullscreen_orientation_lock_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(video_rotate_to_fullscreen_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(embedded_media_experience_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(immersive_mode_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(css_hex_alpha_color_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(scroll_top_left_interop_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(disable_features_depending_on_viz)
-  IPC_STRUCT_TRAITS_MEMBER(disable_accelerated_small_canvases)
-  IPC_STRUCT_TRAITS_MEMBER(reenable_web_components_v0)
-#endif  // defined(OS_ANDROID)
-  IPC_STRUCT_TRAITS_MEMBER(force_dark_mode_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(default_minimum_page_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(default_maximum_page_scale_factor)
-  IPC_STRUCT_TRAITS_MEMBER(hide_download_ui)
-  IPC_STRUCT_TRAITS_MEMBER(presentation_receiver)
-  IPC_STRUCT_TRAITS_MEMBER(media_controls_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(do_not_update_selection_on_mutating_selection_range)
-  IPC_STRUCT_TRAITS_MEMBER(autoplay_policy)
-  IPC_STRUCT_TRAITS_MEMBER(preferred_color_scheme)
-  IPC_STRUCT_TRAITS_MEMBER(low_priority_iframes_threshold)
-  IPC_STRUCT_TRAITS_MEMBER(picture_in_picture_enabled)
-  IPC_STRUCT_TRAITS_MEMBER(translate_service_available)
-  IPC_STRUCT_TRAITS_MEMBER(network_quality_estimator_web_holdback)
-  IPC_STRUCT_TRAITS_MEMBER(lazy_frame_loading_distance_thresholds_px)
-  IPC_STRUCT_TRAITS_MEMBER(lazy_image_loading_distance_thresholds_px)
-  IPC_STRUCT_TRAITS_MEMBER(lazy_image_first_k_fully_load)
-  IPC_STRUCT_TRAITS_MEMBER(allow_mixed_content_upgrades)
-  IPC_STRUCT_TRAITS_MEMBER(always_show_focus)
-  IPC_STRUCT_TRAITS_MEMBER(touch_drag_drop_enabled)
-IPC_STRUCT_TRAITS_END()
-
 IPC_STRUCT_TRAITS_BEGIN(blink::mojom::WindowFeatures)
   IPC_STRUCT_TRAITS_MEMBER(x)
   IPC_STRUCT_TRAITS_MEMBER(has_x)
diff --git a/content/public/common/web_preferences.mojom b/content/public/common/web_preferences.mojom
deleted file mode 100644
index 9a353a75e52c1..0000000000000
--- a/content/public/common/web_preferences.mojom
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-module content.mojom;
-
-[Native]
-struct WebPreferences;
diff --git a/content/renderer/render_view_browsertest_mac.mm b/content/renderer/render_view_browsertest_mac.mm
index 233c51a0df5d6..36918c61d6cb5 100644
--- a/content/renderer/render_view_browsertest_mac.mm
+++ b/content/renderer/render_view_browsertest_mac.mm
@@ -87,7 +87,7 @@ TEST_F(RenderViewTest, MacTestCmdUp) {
   blink::WebFrameWidget* blink_widget =
       static_cast<blink::WebFrameWidget*>(widget->GetWebWidget());
 
-  view->OnUpdateWebPreferences(prefs);
+  view->SetBlinkPreferences(prefs);
 
   const int kMaxOutputCharacters = 1024;
   std::string output;
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 2a7f845f8f017..fec5e2312b716 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -584,7 +584,6 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) {
 
   bool handled = true;
   IPC_BEGIN_MESSAGE_MAP(RenderViewImpl, message)
-    IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
     IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
 
     // Page messages.
@@ -973,7 +972,7 @@ const blink::web_pref::WebPreferences& RenderViewImpl::GetBlinkPreferences() {
 
 void RenderViewImpl::SetBlinkPreferences(
     const blink::web_pref::WebPreferences& preferences) {
-  OnUpdateWebPreferences(preferences);
+  webview_->SetWebPreferences(preferences);
 }
 
 blink::WebView* RenderViewImpl::GetWebView() {
@@ -984,11 +983,6 @@ bool RenderViewImpl::GetContentStateImmediately() {
   return send_content_state_immediately_;
 }
 
-void RenderViewImpl::OnUpdateWebPreferences(
-    const blink::web_pref::WebPreferences& prefs) {
-  webview_->SetWebPreferences(prefs);
-}
-
 void RenderViewImpl::OnSetRendererPrefs(
     const blink::mojom::RendererPreferences& renderer_prefs) {
   std::string old_accept_languages = renderer_preferences_.accept_languages;
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 47b4a93f50bcc..f5d2a7ad743ff 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -281,7 +281,7 @@ class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient,
   FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnHandleKeyboardEvent);
   FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnImeTypeChanged);
   FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnNavStateChanged);
-  FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, OnUpdateWebPreferences);
+  FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, SetBlinkPreferences);
   FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
                            SetEditableSelectionAndComposition);
   FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, StaleNavigationsIgnored);
@@ -368,7 +368,6 @@ class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient,
   void OnSetRendererPrefs(
       const blink::mojom::RendererPreferences& renderer_prefs);
   void OnSuppressDialogsUntilSwapOut();
-  void OnUpdateWebPreferences(const blink::web_pref::WebPreferences& prefs);
 
   // Page message handlers -----------------------------------------------------
   void SetPageFrozen(bool frozen);
diff --git a/content/web_test/BUILD.gn b/content/web_test/BUILD.gn
index 45c6b8de38536..0bc812d7ce42d 100644
--- a/content/web_test/BUILD.gn
+++ b/content/web_test/BUILD.gn
@@ -33,14 +33,17 @@ mojom("web_test_common_mojom") {
     "common/web_test_bluetooth_fake_adapter_setter.mojom",
   ]
   public_deps = [
-    "//content/public/common:web_preferences_mojom",
     "//mojo/public/mojom/base",
     "//skia/public/mojom",
+    "//third_party/blink/public/mojom:mojom_platform",
     "//ui/accessibility:ax_enums_mojo",
     "//ui/gfx/geometry/mojom",
     "//url/mojom:url_mojom_gurl",
     "//url/mojom:url_mojom_origin",
   ]
+
+  overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ]
+  component_deps = [ "//third_party/blink/public/common" ]
 }
 
 static_library("web_test_common") {
diff --git a/content/web_test/common/web_test.mojom b/content/web_test/common/web_test.mojom
index 86f42aabc1d3a..c818f3220d335 100644
--- a/content/web_test/common/web_test.mojom
+++ b/content/web_test/common/web_test.mojom
@@ -4,12 +4,12 @@
 
 module content.mojom;
 
-import "content/public/common/web_preferences.mojom";
 import "mojo/public/mojom/base/file_path.mojom";
 import "mojo/public/mojom/base/values.mojom";
 import "mojo/public/mojom/base/string16.mojom";
 import "skia/public/mojom/bitmap.mojom";
 import "third_party/blink/public/mojom/permissions/permission_status.mojom";
+import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom";
 import "ui/gfx/geometry/mojom/geometry.mojom";
 import "url/mojom/url.mojom";
 
@@ -119,7 +119,7 @@ interface WebTestControlHost {
   PrintMessage(string message);
 
   // Update changed WebKit preferences.
-  OverridePreferences(WebPreferences web_preferences);
+  OverridePreferences(blink.mojom.WebPreferences web_preferences);
 
   // Trigger a reload navigation on the main WebView.
   Reload();
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn
index a0a8f30b6036f..df56c4f37e6e4 100644
--- a/third_party/blink/common/BUILD.gn
+++ b/third_party/blink/common/BUILD.gn
@@ -156,6 +156,7 @@ source_set("common") {
     "web_package/signed_exchange_consts.cc",
     "web_package/web_package_request_matcher.cc",
     "web_preferences/web_preferences.cc",
+    "web_preferences/web_preferences_mojom_traits.cc",
     "widget/device_emulation_params_mojom_traits.cc",
     "widget/screen_info_mojom_traits.cc",
     "widget/visual_properties_mojom_traits.cc",
diff --git a/third_party/blink/common/web_preferences/OWNERS b/third_party/blink/common/web_preferences/OWNERS
new file mode 100644
index 0000000000000..585fa06e4a181
--- /dev/null
+++ b/third_party/blink/common/web_preferences/OWNERS
@@ -0,0 +1,2 @@
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/third_party/blink/common/web_preferences/web_preferences.cc b/third_party/blink/common/web_preferences/web_preferences.cc
index 966b6231f589a..980bd49381ebc 100644
--- a/third_party/blink/common/web_preferences/web_preferences.cc
+++ b/third_party/blink/common/web_preferences/web_preferences.cc
@@ -197,7 +197,8 @@ WebPreferences::WebPreferences()
       presentation_receiver(false),
       media_controls_enabled(true),
       do_not_update_selection_on_mutating_selection_range(false),
-      autoplay_policy(AutoplayPolicy::kDocumentUserActivationRequired),
+      autoplay_policy(
+          web_pref::AutoplayPolicy::kDocumentUserActivationRequired),
       low_priority_iframes_threshold(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
       picture_in_picture_enabled(true),
       translate_service_available(false),
@@ -206,14 +207,19 @@ WebPreferences::WebPreferences()
       allow_mixed_content_upgrades(true),
       always_show_focus(false),
       touch_drag_drop_enabled(IsTouchDragDropEnabled()) {
-  standard_font_family_map[kCommonScript] =
+  standard_font_family_map[web_pref::kCommonScript] =
       base::ASCIIToUTF16("Times New Roman");
-  fixed_font_family_map[kCommonScript] = base::ASCIIToUTF16("Courier New");
-  serif_font_family_map[kCommonScript] = base::ASCIIToUTF16("Times New Roman");
-  sans_serif_font_family_map[kCommonScript] = base::ASCIIToUTF16("Arial");
-  cursive_font_family_map[kCommonScript] = base::ASCIIToUTF16("Script");
-  fantasy_font_family_map[kCommonScript] = base::ASCIIToUTF16("Impact");
-  pictograph_font_family_map[kCommonScript] =
+  fixed_font_family_map[web_pref::kCommonScript] =
+      base::ASCIIToUTF16("Courier New");
+  serif_font_family_map[web_pref::kCommonScript] =
+      base::ASCIIToUTF16("Times New Roman");
+  sans_serif_font_family_map[web_pref::kCommonScript] =
+      base::ASCIIToUTF16("Arial");
+  cursive_font_family_map[web_pref::kCommonScript] =
+      base::ASCIIToUTF16("Script");
+  fantasy_font_family_map[web_pref::kCommonScript] =
+      base::ASCIIToUTF16("Impact");
+  pictograph_font_family_map[web_pref::kCommonScript] =
       base::ASCIIToUTF16("Times New Roman");
 }
 
diff --git a/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
new file mode 100644
index 0000000000000..4cbfb72c25d1c
--- /dev/null
+++ b/third_party/blink/common/web_preferences/web_preferences_mojom_traits.cc
@@ -0,0 +1,532 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h"
+
+#include "base/strings/string_util.h"
+#include "build/build_config.h"
+#include "mojo/public/cpp/base/string16_mojom_traits.h"
+#include "third_party/blink/public/mojom/widget/screen_info.mojom.h"
+#include "url/mojom/url_gurl_mojom_traits.h"
+
+namespace mojo {
+
+// static
+blink::mojom::PointerType
+EnumTraits<blink::mojom::PointerType, ui::PointerType>::ToMojom(
+    ui::PointerType scheme) {
+  switch (scheme) {
+    case ui::PointerType::POINTER_TYPE_FIRST:
+      return blink::mojom::PointerType::kPointerFirstType;
+    case ui::PointerType::POINTER_TYPE_COARSE:
+      return blink::mojom::PointerType::kPointerCoarseType;
+    case ui::PointerType::POINTER_TYPE_FINE:
+      return blink::mojom::PointerType::kPointerFineType;
+  }
+  NOTREACHED();
+  return blink::mojom::PointerType::kMinValue;
+}
+
+// static
+bool EnumTraits<blink::mojom::PointerType, ui::PointerType>::FromMojom(
+    blink::mojom::PointerType input,
+    ui::PointerType* out) {
+  switch (input) {
+    case blink::mojom::PointerType::kPointerFirstType:
+      *out = ui::PointerType::POINTER_TYPE_FIRST;
+      return true;
+    case blink::mojom::PointerType::kPointerCoarseType:
+      *out = ui::PointerType::POINTER_TYPE_COARSE;
+      return true;
+    case blink::mojom::PointerType::kPointerFineType:
+      *out = ui::PointerType::POINTER_TYPE_FINE;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::HoverType EnumTraits<blink::mojom::HoverType,
+                                   ui::HoverType>::ToMojom(ui::HoverType type) {
+  switch (type) {
+    case ui::HoverType::HOVER_TYPE_FIRST:
+      return blink::mojom::HoverType::kHoverFirstType;
+    case ui::HoverType::HOVER_TYPE_HOVER:
+      return blink::mojom::HoverType::kHoverHoverType;
+  }
+  NOTREACHED();
+  return blink::mojom::HoverType::kMinValue;
+}
+
+// static
+bool EnumTraits<blink::mojom::HoverType, ui::HoverType>::FromMojom(
+    blink::mojom::HoverType input,
+    ui::HoverType* out) {
+  switch (input) {
+    case blink::mojom::HoverType::kHoverFirstType:
+      *out = ui::HoverType::HOVER_TYPE_FIRST;
+      return true;
+    case blink::mojom::HoverType::kHoverHoverType:
+      *out = ui::HoverType::HOVER_TYPE_HOVER;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::EditingBehavior EnumTraits<blink::mojom::EditingBehavior,
+                                         blink::web_pref::EditingBehaviorType>::
+    ToMojom(blink::web_pref::EditingBehaviorType behavior) {
+  switch (behavior) {
+    case blink::web_pref::EditingBehaviorType::kEditingMacBehavior:
+      return blink::mojom::EditingBehavior::kEditingMacBehavior;
+    case blink::web_pref::EditingBehaviorType::kEditingWindowsBehavior:
+      return blink::mojom::EditingBehavior::kEditingWindowsBehavior;
+    case blink::web_pref::EditingBehaviorType::kEditingUnixBehavior:
+      return blink::mojom::EditingBehavior::kEditingUnixBehavior;
+    case blink::web_pref::EditingBehaviorType::kEditingAndroidBehavior:
+      return blink::mojom::EditingBehavior::kEditingAndroidBehavior;
+    case blink::web_pref::EditingBehaviorType::kEditingChromeOSBehavior:
+      return blink::mojom::EditingBehavior::kEditingChromeOSBehavior;
+  }
+  NOTREACHED();
+  return blink::mojom::EditingBehavior::kMaxValue;
+}
+
+// static
+bool EnumTraits<blink::mojom::EditingBehavior,
+                blink::web_pref::EditingBehaviorType>::
+    FromMojom(blink::mojom::EditingBehavior input,
+              blink::web_pref::EditingBehaviorType* out) {
+  switch (input) {
+    case blink::mojom::EditingBehavior::kEditingMacBehavior:
+      *out = blink::web_pref::EditingBehaviorType::kEditingMacBehavior;
+      return true;
+    case blink::mojom::EditingBehavior::kEditingWindowsBehavior:
+      *out = blink::web_pref::EditingBehaviorType::kEditingWindowsBehavior;
+      return true;
+    case blink::mojom::EditingBehavior::kEditingUnixBehavior:
+      *out = blink::web_pref::EditingBehaviorType::kEditingUnixBehavior;
+      return true;
+    case blink::mojom::EditingBehavior::kEditingAndroidBehavior:
+      *out = blink::web_pref::EditingBehaviorType::kEditingAndroidBehavior;
+      return true;
+    case blink::mojom::EditingBehavior::kEditingChromeOSBehavior:
+      *out = blink::web_pref::EditingBehaviorType::kEditingChromeOSBehavior;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::ImageAnimationPolicy
+EnumTraits<blink::mojom::ImageAnimationPolicy,
+           blink::web_pref::ImageAnimationPolicy>::
+    ToMojom(blink::web_pref::ImageAnimationPolicy policy) {
+  switch (policy) {
+    case blink::web_pref::ImageAnimationPolicy::kImageAnimationPolicyAllowed:
+      return blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
+    case blink::web_pref::ImageAnimationPolicy::
+        kImageAnimationPolicyAnimateOnce:
+      return blink::mojom::ImageAnimationPolicy::
+          kImageAnimationPolicyAnimateOnce;
+    case blink::web_pref::ImageAnimationPolicy::
+        kImageAnimationPolicyNoAnimation:
+      return blink::mojom::ImageAnimationPolicy::
+          kImageAnimationPolicyNoAnimation;
+  }
+  NOTREACHED();
+  return blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation;
+}
+
+// static
+bool EnumTraits<blink::mojom::ImageAnimationPolicy,
+                blink::web_pref::ImageAnimationPolicy>::
+    FromMojom(blink::mojom::ImageAnimationPolicy input,
+              blink::web_pref::ImageAnimationPolicy* out) {
+  switch (input) {
+    case blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAllowed:
+      *out =
+          blink::web_pref::ImageAnimationPolicy::kImageAnimationPolicyAllowed;
+      return true;
+    case blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyAnimateOnce:
+      *out = blink::web_pref::ImageAnimationPolicy::
+          kImageAnimationPolicyAnimateOnce;
+      return true;
+    case blink::mojom::ImageAnimationPolicy::kImageAnimationPolicyNoAnimation:
+      *out = blink::web_pref::ImageAnimationPolicy::
+          kImageAnimationPolicyNoAnimation;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::ViewportStyle
+EnumTraits<blink::mojom::ViewportStyle, blink::web_pref::ViewportStyle>::
+    ToMojom(blink::web_pref::ViewportStyle style) {
+  switch (style) {
+    case blink::web_pref::ViewportStyle::kDefault:
+      return blink::mojom::ViewportStyle::kDefault;
+    case blink::web_pref::ViewportStyle::kMobile:
+      return blink::mojom::ViewportStyle::kMobile;
+    case blink::web_pref::ViewportStyle::kTelevision:
+      return blink::mojom::ViewportStyle::kTelevision;
+  }
+  NOTREACHED();
+  return blink::mojom::ViewportStyle::kLast;
+}
+
+// static
+bool EnumTraits<blink::mojom::ViewportStyle, blink::web_pref::ViewportStyle>::
+    FromMojom(blink::mojom::ViewportStyle input,
+              blink::web_pref::ViewportStyle* out) {
+  switch (input) {
+    case blink::mojom::ViewportStyle::kDefault:
+      *out = blink::web_pref::ViewportStyle::kDefault;
+      return true;
+    case blink::mojom::ViewportStyle::kMobile:
+      *out = blink::web_pref::ViewportStyle::kMobile;
+      return true;
+    case blink::mojom::ViewportStyle::kTelevision:
+      *out = blink::web_pref::ViewportStyle::kTelevision;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::AutoplayPolicy
+EnumTraits<blink::mojom::AutoplayPolicy, blink::web_pref::AutoplayPolicy>::
+    ToMojom(blink::web_pref::AutoplayPolicy style) {
+  switch (style) {
+    case blink::web_pref::AutoplayPolicy::kNoUserGestureRequired:
+      return blink::mojom::AutoplayPolicy::kNoUserGestureRequired;
+    case blink::web_pref::AutoplayPolicy::kUserGestureRequired:
+      return blink::mojom::AutoplayPolicy::kUserGestureRequired;
+    case blink::web_pref::AutoplayPolicy::kDocumentUserActivationRequired:
+      return blink::mojom::AutoplayPolicy::kDocumentUserActivationRequired;
+  }
+  NOTREACHED();
+  return blink::mojom::AutoplayPolicy::kNoUserGestureRequired;
+}
+
+// static
+bool EnumTraits<blink::mojom::AutoplayPolicy, blink::web_pref::AutoplayPolicy>::
+    FromMojom(blink::mojom::AutoplayPolicy input,
+              blink::web_pref::AutoplayPolicy* out) {
+  switch (input) {
+    case blink::mojom::AutoplayPolicy::kNoUserGestureRequired:
+      *out = blink::web_pref::AutoplayPolicy::kNoUserGestureRequired;
+      return true;
+    case blink::mojom::AutoplayPolicy::kUserGestureRequired:
+      *out = blink::web_pref::AutoplayPolicy::kUserGestureRequired;
+      return true;
+    case blink::mojom::AutoplayPolicy::kDocumentUserActivationRequired:
+      *out = blink::web_pref::AutoplayPolicy::kDocumentUserActivationRequired;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::PreferredColorScheme EnumTraits<
+    blink::mojom::PreferredColorScheme,
+    blink::PreferredColorScheme>::ToMojom(blink::PreferredColorScheme scheme) {
+  switch (scheme) {
+    case blink::PreferredColorScheme::kDark:
+      return blink::mojom::PreferredColorScheme::kDark;
+    case blink::PreferredColorScheme::kLight:
+      return blink::mojom::PreferredColorScheme::kLight;
+  }
+  NOTREACHED();
+  return blink::mojom::PreferredColorScheme::kLight;
+}
+
+// static
+bool EnumTraits<blink::mojom::PreferredColorScheme,
+                blink::PreferredColorScheme>::
+    FromMojom(blink::mojom::PreferredColorScheme input,
+              blink::PreferredColorScheme* out) {
+  switch (input) {
+    case blink::mojom::PreferredColorScheme::kDark:
+      *out = blink::PreferredColorScheme::kDark;
+      return true;
+    case blink::mojom::PreferredColorScheme::kLight:
+      *out = blink::PreferredColorScheme::kLight;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+blink::mojom::EffectiveConnectionType EnumTraits<
+    blink::mojom::EffectiveConnectionType,
+    net::EffectiveConnectionType>::ToMojom(net::EffectiveConnectionType type) {
+  switch (type) {
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN:
+      return blink::mojom::EffectiveConnectionType::
+          kEffectiveConnectionUnknownType;
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE:
+      return blink::mojom::EffectiveConnectionType::
+          kEffectiveConnectionOfflineType;
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
+      return blink::mojom::EffectiveConnectionType::
+          kEffectiveConnectionSlow2GType;
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G:
+      return blink::mojom::EffectiveConnectionType::kEffectiveConnection2GType;
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G:
+      return blink::mojom::EffectiveConnectionType::kEffectiveConnection3GType;
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G:
+      return blink::mojom::EffectiveConnectionType::kEffectiveConnection4GType;
+    case net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_LAST:
+      break;
+  }
+  NOTREACHED();
+  return blink::mojom::EffectiveConnectionType::kMaxValue;
+}
+
+// static
+bool EnumTraits<blink::mojom::EffectiveConnectionType,
+                net::EffectiveConnectionType>::
+    FromMojom(blink::mojom::EffectiveConnectionType input,
+              net::EffectiveConnectionType* out) {
+  switch (input) {
+    case blink::mojom::EffectiveConnectionType::kEffectiveConnectionUnknownType:
+      *out = net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
+      return true;
+    case blink::mojom::EffectiveConnectionType::kEffectiveConnectionOfflineType:
+      *out = net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_OFFLINE;
+      return true;
+    case blink::mojom::EffectiveConnectionType::kEffectiveConnectionSlow2GType:
+      *out = net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
+      return true;
+    case blink::mojom::EffectiveConnectionType::kEffectiveConnection2GType:
+      *out = net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_2G;
+      return true;
+    case blink::mojom::EffectiveConnectionType::kEffectiveConnection3GType:
+      *out = net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_3G;
+      return true;
+    case blink::mojom::EffectiveConnectionType::kEffectiveConnection4GType:
+      *out = net::EffectiveConnectionType::EFFECTIVE_CONNECTION_TYPE_4G;
+      return true;
+  }
+  NOTREACHED();
+  return false;
+}
+
+// static
+bool StructTraits<blink::mojom::WebPreferencesDataView,
+                  blink::web_pref::WebPreferences>::
+    Read(blink::mojom::WebPreferencesDataView data,
+         blink::web_pref::WebPreferences* out) {
+  if (!data.ReadStandardFontFamilyMap(&out->standard_font_family_map) ||
+      !data.ReadFixedFontFamilyMap(&out->fixed_font_family_map) ||
+      !data.ReadSerifFontFamilyMap(&out->serif_font_family_map) ||
+      !data.ReadSansSerifFontFamilyMap(&out->sans_serif_font_family_map) ||
+      !data.ReadCursiveFontFamilyMap(&out->cursive_font_family_map) ||
+      !data.ReadFantasyFontFamilyMap(&out->fantasy_font_family_map) ||
+      !data.ReadPictographFontFamilyMap(&out->pictograph_font_family_map) ||
+      !data.ReadLazyFrameLoadingDistanceThresholdsPx(
+          &out->lazy_frame_loading_distance_thresholds_px) ||
+      !data.ReadLazyImageLoadingDistanceThresholdsPx(
+          &out->lazy_image_loading_distance_thresholds_px) ||
+      !data.ReadLazyImageFirstKFullyLoad(&out->lazy_image_first_k_fully_load) ||
+      !data.ReadDefaultEncoding(&out->default_encoding) ||
+      !data.ReadTextTrackBackgroundColor(&out->text_track_background_color) ||
+      !data.ReadDefaultEncoding(&out->text_track_text_color) ||
+      !data.ReadTextTrackTextSize(&out->text_track_text_size) ||
+      !data.ReadTextTrackTextShadow(&out->text_track_text_shadow) ||
+      !data.ReadTextTrackFontFamily(&out->text_track_font_family) ||
+      !data.ReadTextTrackFontStyle(&out->text_track_font_style) ||
+      !data.ReadTextTrackFontVariant(&out->text_track_font_variant) ||
+      !data.ReadTextTrackWindowColor(&out->text_track_window_color) ||
+      !data.ReadTextTrackWindowPadding(&out->text_track_window_padding) ||
+      !data.ReadTextTrackWindowRadius(&out->text_track_window_radius) ||
+      !data.ReadPrimaryPointerType(&out->primary_pointer_type) ||
+      !data.ReadPrimaryHoverType(&out->primary_hover_type) ||
+      !data.ReadEditingBehavior(&out->editing_behavior) ||
+      !data.ReadViewportStyle(&out->viewport_style) ||
+      !data.ReadAnimationPolicy(&out->animation_policy) ||
+      !data.ReadAutoplayPolicy(&out->autoplay_policy) ||
+      !data.ReadPreferredColorScheme(&out->preferred_color_scheme) ||
+      !data.ReadLowPriorityIframesThreshold(
+          &out->low_priority_iframes_threshold) ||
+      !data.ReadNetworkQualityEstimatorWebHoldback(
+          &out->network_quality_estimator_web_holdback) ||
+      !data.ReadWebAppScope(&out->web_app_scope)
+#if defined(OS_ANDROID)
+      || !data.ReadDefaultVideoPosterUrl(&out->default_video_poster_url)
+#endif
+  )
+    return false;
+
+  out->default_font_size = data.default_font_size();
+  out->default_fixed_font_size = data.default_fixed_font_size();
+  out->minimum_font_size = data.minimum_font_size();
+  out->minimum_logical_font_size = data.minimum_logical_font_size();
+  out->context_menu_on_mouse_up = data.context_menu_on_mouse_up();
+  out->javascript_enabled = data.javascript_enabled();
+  out->web_security_enabled = data.web_security_enabled();
+  out->loads_images_automatically = data.loads_images_automatically();
+  out->images_enabled = data.images_enabled();
+  out->plugins_enabled = data.plugins_enabled();
+  out->dom_paste_enabled = data.dom_paste_enabled();
+  out->shrinks_standalone_images_to_fit =
+      data.shrinks_standalone_images_to_fit();
+  out->text_areas_are_resizable = data.text_areas_are_resizable();
+  out->allow_scripts_to_close_windows = data.allow_scripts_to_close_windows();
+  out->remote_fonts_enabled = data.remote_fonts_enabled();
+  out->javascript_can_access_clipboard = data.javascript_can_access_clipboard();
+  out->xslt_enabled = data.xslt_enabled();
+  out->dns_prefetching_enabled = data.dns_prefetching_enabled();
+  out->data_saver_enabled = data.data_saver_enabled();
+  out->data_saver_holdback_web_api_enabled =
+      data.data_saver_holdback_web_api_enabled();
+  out->local_storage_enabled = data.local_storage_enabled();
+  out->databases_enabled = data.databases_enabled();
+  out->application_cache_enabled = data.application_cache_enabled();
+  out->tabs_to_links = data.tabs_to_links();
+  out->disable_ipc_flooding_protection = data.disable_ipc_flooding_protection();
+  out->hyperlink_auditing_enabled = data.hyperlink_auditing_enabled();
+  out->allow_universal_access_from_file_urls =
+      data.allow_universal_access_from_file_urls();
+  out->allow_file_access_from_file_urls =
+      data.allow_file_access_from_file_urls();
+  out->webgl1_enabled = data.webgl1_enabled();
+  out->webgl2_enabled = data.webgl2_enabled();
+  out->pepper_3d_enabled = data.pepper_3d_enabled();
+  out->flash_3d_enabled = data.flash_3d_enabled();
+  out->flash_stage3d_enabled = data.flash_stage3d_enabled();
+  out->flash_stage3d_baseline_enabled = data.flash_stage3d_baseline_enabled();
+  out->privileged_webgl_extensions_enabled =
+      data.privileged_webgl_extensions_enabled();
+  out->webgl_errors_to_console_enabled = data.webgl_errors_to_console_enabled();
+  out->hide_scrollbars = data.hide_scrollbars();
+  out->accelerated_2d_canvas_enabled = data.accelerated_2d_canvas_enabled();
+  out->new_canvas_2d_api_enabled = data.new_canvas_2d_api_enabled();
+  out->antialiased_2d_canvas_disabled = data.antialiased_2d_canvas_disabled();
+  out->antialiased_clips_2d_canvas_enabled =
+      data.antialiased_clips_2d_canvas_enabled();
+  out->accelerated_filters_enabled = data.accelerated_filters_enabled();
+  out->deferred_filters_enabled = data.deferred_filters_enabled();
+  out->container_culling_enabled = data.container_culling_enabled();
+  out->allow_running_insecure_content = data.allow_running_insecure_content();
+  out->disable_reading_from_canvas = data.disable_reading_from_canvas();
+  out->strict_mixed_content_checking = data.strict_mixed_content_checking();
+  out->strict_powerful_feature_restrictions =
+      data.strict_powerful_feature_restrictions();
+  out->allow_geolocation_on_insecure_origins =
+      data.allow_geolocation_on_insecure_origins();
+  out->strictly_block_blockable_mixed_content =
+      data.strictly_block_blockable_mixed_content();
+  out->block_mixed_plugin_content = data.block_mixed_plugin_content();
+  out->password_echo_enabled = data.password_echo_enabled();
+  out->disable_reading_from_canvas = data.disable_reading_from_canvas();
+  out->should_clear_document_background =
+      data.should_clear_document_background();
+  out->enable_scroll_animator = data.enable_scroll_animator();
+  out->prefers_reduced_motion = data.prefers_reduced_motion();
+  out->touch_event_feature_detection_enabled =
+      data.touch_event_feature_detection_enabled();
+  out->pointer_events_max_touch_points = data.pointer_events_max_touch_points();
+  out->available_pointer_types = data.available_pointer_types();
+  out->available_hover_types = data.available_hover_types();
+  out->dont_send_key_events_to_javascript =
+      data.dont_send_key_events_to_javascript();
+  out->barrel_button_for_drag_enabled = data.barrel_button_for_drag_enabled();
+  out->sync_xhr_in_documents_enabled = data.sync_xhr_in_documents_enabled();
+  out->number_of_cpu_cores = data.number_of_cpu_cores();
+  out->supports_multiple_windows = data.supports_multiple_windows();
+  out->viewport_enabled = data.viewport_enabled();
+  out->viewport_meta_enabled = data.viewport_meta_enabled();
+  out->shrinks_viewport_contents_to_fit =
+      data.shrinks_viewport_contents_to_fit();
+  out->smooth_scroll_for_find_enabled = data.smooth_scroll_for_find_enabled();
+  out->main_frame_resizes_are_orientation_changes =
+      data.main_frame_resizes_are_orientation_changes();
+  out->initialize_at_minimum_page_scale =
+      data.initialize_at_minimum_page_scale();
+  out->smart_insert_delete_enabled = data.smart_insert_delete_enabled();
+  out->spatial_navigation_enabled = data.spatial_navigation_enabled();
+  out->navigate_on_drag_drop = data.navigate_on_drag_drop();
+  out->v8_cache_options = data.v8_cache_options();
+  out->record_whole_document = data.record_whole_document();
+  out->cookie_enabled = data.cookie_enabled();
+  out->accelerated_video_decode_enabled =
+      data.accelerated_video_decode_enabled();
+  out->user_gesture_required_for_presentation =
+      data.user_gesture_required_for_presentation();
+  out->text_tracks_enabled = data.text_tracks_enabled();
+  out->text_track_margin_percentage = data.text_track_margin_percentage();
+  out->immersive_mode_enabled = data.immersive_mode_enabled();
+  out->double_tap_to_zoom_enabled = data.double_tap_to_zoom_enabled();
+  out->fullscreen_supported = data.fullscreen_supported();
+  out->text_autosizing_enabled = data.text_autosizing_enabled();
+#if defined(OS_ANDROID)
+  out->font_scale_factor = data.font_scale_factor();
+  out->device_scale_adjustment = data.device_scale_adjustment();
+  out->force_enable_zoom = data.force_enable_zoom();
+  out->support_deprecated_target_density_dpi =
+      data.support_deprecated_target_density_dpi();
+  out->use_legacy_background_size_shorthand_behavior =
+      data.use_legacy_background_size_shorthand_behavior();
+  out->wide_viewport_quirk = data.wide_viewport_quirk();
+  out->use_wide_viewport = data.use_wide_viewport();
+  out->force_zero_layout_height = data.force_zero_layout_height();
+  out->viewport_meta_merge_content_quirk =
+      data.viewport_meta_merge_content_quirk();
+  out->viewport_meta_non_user_scalable_quirk =
+      data.viewport_meta_non_user_scalable_quirk();
+  out->viewport_meta_zero_values_quirk = data.viewport_meta_zero_values_quirk();
+  out->clobber_user_agent_initial_scale_quirk =
+      data.clobber_user_agent_initial_scale_quirk();
+  out->ignore_main_frame_overflow_hidden_quirk =
+      data.ignore_main_frame_overflow_hidden_quirk();
+  out->report_screen_size_in_physical_pixels_quirk =
+      data.report_screen_size_in_physical_pixels_quirk();
+  out->reuse_global_for_unowned_main_frame =
+      data.reuse_global_for_unowned_main_frame();
+  out->spellcheck_enabled_by_default = data.spellcheck_enabled_by_default();
+  out->video_fullscreen_orientation_lock_enabled =
+      data.video_fullscreen_orientation_lock_enabled();
+  out->video_rotate_to_fullscreen_enabled =
+      data.video_rotate_to_fullscreen_enabled();
+  out->embedded_media_experience_enabled =
+      data.embedded_media_experience_enabled();
+  out->css_hex_alpha_color_enabled = data.css_hex_alpha_color_enabled();
+  out->scroll_top_left_interop_enabled = data.scroll_top_left_interop_enabled();
+  out->disable_features_depending_on_viz =
+      data.disable_features_depending_on_viz();
+  out->disable_accelerated_small_canvases =
+      data.disable_accelerated_small_canvases();
+  out->reenable_web_components_v0 = data.reenable_web_components_v0();
+#endif
+  out->force_dark_mode_enabled = data.force_dark_mode_enabled();
+  out->default_minimum_page_scale_factor =
+      data.default_minimum_page_scale_factor();
+  out->default_maximum_page_scale_factor =
+      data.default_maximum_page_scale_factor();
+  out->hide_download_ui = data.hide_download_ui();
+  out->presentation_receiver = data.presentation_receiver();
+  out->media_controls_enabled = data.media_controls_enabled();
+  out->do_not_update_selection_on_mutating_selection_range =
+      data.do_not_update_selection_on_mutating_selection_range();
+  out->picture_in_picture_enabled = data.picture_in_picture_enabled();
+  out->translate_service_available = data.translate_service_available();
+  out->lazy_load_enabled = data.lazy_load_enabled();
+  out->allow_mixed_content_upgrades = data.allow_mixed_content_upgrades();
+  out->always_show_focus = data.always_show_focus();
+  out->touch_drag_drop_enabled = data.touch_drag_drop_enabled();
+  return true;
+}
+
+}  // namespace mojo
diff --git a/third_party/blink/public/common/web_preferences/OWNERS b/third_party/blink/public/common/web_preferences/OWNERS
new file mode 100644
index 0000000000000..585fa06e4a181
--- /dev/null
+++ b/third_party/blink/public/common/web_preferences/OWNERS
@@ -0,0 +1,2 @@
+per-file *_mojom_traits*.*=set noparent
+per-file *_mojom_traits*.*=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/third_party/blink/public/common/web_preferences/editing_behavior_types.h b/third_party/blink/public/common/web_preferences/editing_behavior_types.h
index 98624b7fa729e..7a92c3e59364f 100644
--- a/third_party/blink/public/common/web_preferences/editing_behavior_types.h
+++ b/third_party/blink/public/common/web_preferences/editing_behavior_types.h
@@ -43,8 +43,7 @@ enum EditingBehaviorType {
   kEditingWindowsBehavior,
   kEditingUnixBehavior,
   kEditingAndroidBehavior,
-  kEditingChromeOSBehavior,
-  kEditingLastBehavior
+  kEditingChromeOSBehavior
 };
 
 }  // namespace web_pref
diff --git a/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
new file mode 100644
index 0000000000000..50c48c07228b7
--- /dev/null
+++ b/third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h
@@ -0,0 +1,832 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_WEB_PREFERENCES_WEB_PREFERENCES_MOJOM_TRAITS_H_
+#define THIRD_PARTY_BLINK_PUBLIC_COMMON_WEB_PREFERENCES_WEB_PREFERENCES_MOJOM_TRAITS_H_
+
+#include "build/build_config.h"
+#include "mojo/public/cpp/bindings/struct_traits.h"
+#include "net/nqe/effective_connection_type.h"
+#include "third_party/blink/public/common/common_export.h"
+#include "third_party/blink/public/common/css/preferred_color_scheme.h"
+#include "third_party/blink/public/common/web_preferences/web_preferences.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom.h"
+#include "ui/base/pointer/pointer_device.h"
+
+namespace mojo {
+
+template <>
+struct BLINK_COMMON_EXPORT
+    EnumTraits<blink::mojom::PointerType, ui::PointerType> {
+  static blink::mojom::PointerType ToMojom(ui::PointerType type);
+
+  static bool FromMojom(blink::mojom::PointerType input, ui::PointerType* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::HoverType, ui::HoverType> {
+  static blink::mojom::HoverType ToMojom(ui::HoverType type);
+
+  static bool FromMojom(blink::mojom::HoverType input, ui::HoverType* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::PreferredColorScheme,
+                                      blink::PreferredColorScheme> {
+  static blink::mojom::PreferredColorScheme ToMojom(
+      blink::PreferredColorScheme scheme);
+
+  static bool FromMojom(blink::mojom::PreferredColorScheme input,
+                        blink::PreferredColorScheme* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::EditingBehavior,
+                                      blink::web_pref::EditingBehaviorType> {
+  static blink::mojom::EditingBehavior ToMojom(
+      blink::web_pref::EditingBehaviorType behavior);
+
+  static bool FromMojom(blink::mojom::EditingBehavior input,
+                        blink::web_pref::EditingBehaviorType* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::ImageAnimationPolicy,
+                                      blink::web_pref::ImageAnimationPolicy> {
+  static blink::mojom::ImageAnimationPolicy ToMojom(
+      blink::web_pref::ImageAnimationPolicy policy);
+
+  static bool FromMojom(blink::mojom::ImageAnimationPolicy input,
+                        blink::web_pref::ImageAnimationPolicy* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT
+    EnumTraits<blink::mojom::ViewportStyle, blink::web_pref::ViewportStyle> {
+  static blink::mojom::ViewportStyle ToMojom(
+      blink::web_pref::ViewportStyle style);
+
+  static bool FromMojom(blink::mojom::ViewportStyle input,
+                        blink::web_pref::ViewportStyle* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT
+    EnumTraits<blink::mojom::AutoplayPolicy, blink::web_pref::AutoplayPolicy> {
+  static blink::mojom::AutoplayPolicy ToMojom(
+      blink::web_pref::AutoplayPolicy policy);
+
+  static bool FromMojom(blink::mojom::AutoplayPolicy input,
+                        blink::web_pref::AutoplayPolicy* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT EnumTraits<blink::mojom::EffectiveConnectionType,
+                                      net::EffectiveConnectionType> {
+  static blink::mojom::EffectiveConnectionType ToMojom(
+      net::EffectiveConnectionType policy);
+
+  static bool FromMojom(blink::mojom::EffectiveConnectionType input,
+                        net::EffectiveConnectionType* out);
+};
+
+template <>
+struct BLINK_COMMON_EXPORT StructTraits<blink::mojom::WebPreferencesDataView,
+                                        blink::web_pref::WebPreferences> {
+  static const std::map<std::string, base::string16>& standard_font_family_map(
+      const blink::web_pref::WebPreferences& r) {
+    return r.standard_font_family_map;
+  }
+
+  static const std::map<std::string, base::string16>& fixed_font_family_map(
+      const blink::web_pref::WebPreferences& r) {
+    return r.fixed_font_family_map;
+  }
+
+  static const std::map<std::string, base::string16>& serif_font_family_map(
+      const blink::web_pref::WebPreferences& r) {
+    return r.serif_font_family_map;
+  }
+
+  static const std::map<std::string, base::string16>&
+  sans_serif_font_family_map(const blink::web_pref::WebPreferences& r) {
+    return r.sans_serif_font_family_map;
+  }
+
+  static const std::map<std::string, base::string16>& cursive_font_family_map(
+      const blink::web_pref::WebPreferences& r) {
+    return r.cursive_font_family_map;
+  }
+
+  static const std::map<std::string, base::string16>& fantasy_font_family_map(
+      const blink::web_pref::WebPreferences& r) {
+    return r.fantasy_font_family_map;
+  }
+
+  static const std::map<std::string, base::string16>&
+  pictograph_font_family_map(const blink::web_pref::WebPreferences& r) {
+    return r.pictograph_font_family_map;
+  }
+
+  static uint32_t default_font_size(const blink::web_pref::WebPreferences& r) {
+    return r.default_font_size;
+  }
+
+  static uint32_t default_fixed_font_size(
+      const blink::web_pref::WebPreferences& r) {
+    return r.default_fixed_font_size;
+  }
+
+  static uint32_t minimum_font_size(const blink::web_pref::WebPreferences& r) {
+    return r.minimum_font_size;
+  }
+
+  static uint32_t minimum_logical_font_size(
+      const blink::web_pref::WebPreferences& r) {
+    return r.minimum_logical_font_size;
+  }
+
+  static std::string default_encoding(
+      const blink::web_pref::WebPreferences& r) {
+    return r.default_encoding;
+  }
+
+  static bool context_menu_on_mouse_up(
+      const blink::web_pref::WebPreferences& r) {
+    return r.context_menu_on_mouse_up;
+  }
+
+  static bool javascript_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.javascript_enabled;
+  }
+
+  static bool web_security_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.web_security_enabled;
+  }
+
+  static bool loads_images_automatically(
+      const blink::web_pref::WebPreferences& r) {
+    return r.loads_images_automatically;
+  }
+
+  static bool images_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.images_enabled;
+  }
+
+  static bool plugins_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.plugins_enabled;
+  }
+
+  static bool dom_paste_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.dom_paste_enabled;
+  }
+
+  static bool shrinks_standalone_images_to_fit(
+      const blink::web_pref::WebPreferences& r) {
+    return r.shrinks_standalone_images_to_fit;
+  }
+
+  static bool text_areas_are_resizable(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_areas_are_resizable;
+  }
+
+  static bool allow_scripts_to_close_windows(
+      const blink::web_pref::WebPreferences& r) {
+    return r.allow_scripts_to_close_windows;
+  }
+
+  static bool remote_fonts_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.remote_fonts_enabled;
+  }
+
+  static bool javascript_can_access_clipboard(
+      const blink::web_pref::WebPreferences& r) {
+    return r.javascript_can_access_clipboard;
+  }
+
+  static bool xslt_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.xslt_enabled;
+  }
+
+  static bool dns_prefetching_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.dns_prefetching_enabled;
+  }
+
+  static bool data_saver_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.data_saver_enabled;
+  }
+
+  static bool data_saver_holdback_web_api_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.data_saver_holdback_web_api_enabled;
+  }
+
+  static bool local_storage_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.local_storage_enabled;
+  }
+
+  static bool databases_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.databases_enabled;
+  }
+
+  static bool application_cache_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.application_cache_enabled;
+  }
+
+  static bool tabs_to_links(const blink::web_pref::WebPreferences& r) {
+    return r.tabs_to_links;
+  }
+
+  static bool disable_ipc_flooding_protection(
+      const blink::web_pref::WebPreferences& r) {
+    return r.disable_ipc_flooding_protection;
+  }
+
+  static bool hyperlink_auditing_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.hyperlink_auditing_enabled;
+  }
+
+  static bool allow_universal_access_from_file_urls(
+      const blink::web_pref::WebPreferences& r) {
+    return r.allow_universal_access_from_file_urls;
+  }
+
+  static bool allow_file_access_from_file_urls(
+      const blink::web_pref::WebPreferences& r) {
+    return r.allow_file_access_from_file_urls;
+  }
+
+  static bool webgl1_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.webgl1_enabled;
+  }
+
+  static bool webgl2_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.webgl2_enabled;
+  }
+
+  static bool pepper_3d_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.pepper_3d_enabled;
+  }
+
+  static bool flash_3d_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.flash_3d_enabled;
+  }
+
+  static bool flash_stage3d_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.flash_stage3d_enabled;
+  }
+
+  static bool flash_stage3d_baseline_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.flash_stage3d_baseline_enabled;
+  }
+
+  static bool privileged_webgl_extensions_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.privileged_webgl_extensions_enabled;
+  }
+
+  static bool webgl_errors_to_console_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.webgl_errors_to_console_enabled;
+  }
+
+  static bool hide_scrollbars(const blink::web_pref::WebPreferences& r) {
+    return r.hide_scrollbars;
+  }
+
+  static bool accelerated_2d_canvas_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.accelerated_2d_canvas_enabled;
+  }
+
+  static bool new_canvas_2d_api_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.new_canvas_2d_api_enabled;
+  }
+
+  static bool antialiased_2d_canvas_disabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.antialiased_2d_canvas_disabled;
+  }
+
+  static bool antialiased_clips_2d_canvas_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.antialiased_clips_2d_canvas_enabled;
+  }
+
+  static bool accelerated_filters_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.accelerated_filters_enabled;
+  }
+
+  static bool deferred_filters_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.deferred_filters_enabled;
+  }
+
+  static bool container_culling_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.container_culling_enabled;
+  }
+
+  static bool allow_running_insecure_content(
+      const blink::web_pref::WebPreferences& r) {
+    return r.allow_running_insecure_content;
+  }
+
+  static bool disable_reading_from_canvas(
+      const blink::web_pref::WebPreferences& r) {
+    return r.disable_reading_from_canvas;
+  }
+
+  static bool strict_mixed_content_checking(
+      const blink::web_pref::WebPreferences& r) {
+    return r.strict_mixed_content_checking;
+  }
+
+  static bool strict_powerful_feature_restrictions(
+      const blink::web_pref::WebPreferences& r) {
+    return r.strict_powerful_feature_restrictions;
+  }
+
+  static bool allow_geolocation_on_insecure_origins(
+      const blink::web_pref::WebPreferences& r) {
+    return r.allow_geolocation_on_insecure_origins;
+  }
+
+  static bool strictly_block_blockable_mixed_content(
+      const blink::web_pref::WebPreferences& r) {
+    return r.strictly_block_blockable_mixed_content;
+  }
+
+  static bool block_mixed_plugin_content(
+      const blink::web_pref::WebPreferences& r) {
+    return r.block_mixed_plugin_content;
+  }
+
+  static bool password_echo_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.password_echo_enabled;
+  }
+
+  static bool should_clear_document_background(
+      const blink::web_pref::WebPreferences& r) {
+    return r.should_clear_document_background;
+  }
+
+  static bool enable_scroll_animator(const blink::web_pref::WebPreferences& r) {
+    return r.enable_scroll_animator;
+  }
+
+  static bool prefers_reduced_motion(const blink::web_pref::WebPreferences& r) {
+    return r.prefers_reduced_motion;
+  }
+
+  static bool touch_event_feature_detection_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.touch_event_feature_detection_enabled;
+  }
+
+  static uint32_t pointer_events_max_touch_points(
+      const blink::web_pref::WebPreferences& r) {
+    return r.pointer_events_max_touch_points;
+  }
+
+  static uint32_t available_pointer_types(
+      const blink::web_pref::WebPreferences& r) {
+    return r.available_pointer_types;
+  }
+
+  static ui::PointerType primary_pointer_type(
+      const blink::web_pref::WebPreferences& r) {
+    return r.primary_pointer_type;
+  }
+
+  static uint32_t available_hover_types(
+      const blink::web_pref::WebPreferences& r) {
+    return r.available_hover_types;
+  }
+
+  static ui::HoverType primary_hover_type(
+      const blink::web_pref::WebPreferences& r) {
+    return r.primary_hover_type;
+  }
+
+  static bool dont_send_key_events_to_javascript(
+      const blink::web_pref::WebPreferences& r) {
+    return r.dont_send_key_events_to_javascript;
+  }
+
+  static bool barrel_button_for_drag_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.barrel_button_for_drag_enabled;
+  }
+
+  static bool sync_xhr_in_documents_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.sync_xhr_in_documents_enabled;
+  }
+
+  static uint32_t number_of_cpu_cores(
+      const blink::web_pref::WebPreferences& r) {
+    return r.number_of_cpu_cores;
+  }
+
+  static blink::web_pref::EditingBehaviorType editing_behavior(
+      const blink::web_pref::WebPreferences& r) {
+    return r.editing_behavior;
+  }
+
+  static bool supports_multiple_windows(
+      const blink::web_pref::WebPreferences& r) {
+    return r.supports_multiple_windows;
+  }
+
+  static bool viewport_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.viewport_enabled;
+  }
+
+  static bool viewport_meta_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.viewport_meta_enabled;
+  }
+
+  static bool shrinks_viewport_contents_to_fit(
+      const blink::web_pref::WebPreferences& r) {
+    return r.shrinks_viewport_contents_to_fit;
+  }
+
+  static blink::web_pref::ViewportStyle viewport_style(
+      const blink::web_pref::WebPreferences& r) {
+    return r.viewport_style;
+  }
+
+  static bool smooth_scroll_for_find_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.smooth_scroll_for_find_enabled;
+  }
+
+  static bool main_frame_resizes_are_orientation_changes(
+      const blink::web_pref::WebPreferences& r) {
+    return r.main_frame_resizes_are_orientation_changes;
+  }
+
+  static bool initialize_at_minimum_page_scale(
+      const blink::web_pref::WebPreferences& r) {
+    return r.initialize_at_minimum_page_scale;
+  }
+
+  static bool smart_insert_delete_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.smart_insert_delete_enabled;
+  }
+
+  static bool spatial_navigation_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.spatial_navigation_enabled;
+  }
+
+  static bool navigate_on_drag_drop(const blink::web_pref::WebPreferences& r) {
+    return r.navigate_on_drag_drop;
+  }
+
+  static const blink::mojom::V8CacheOptions& v8_cache_options(
+      const blink::web_pref::WebPreferences& r) {
+    return r.v8_cache_options;
+  }
+
+  static bool record_whole_document(const blink::web_pref::WebPreferences& r) {
+    return r.record_whole_document;
+  }
+
+  static bool cookie_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.cookie_enabled;
+  }
+
+  static bool accelerated_video_decode_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.accelerated_video_decode_enabled;
+  }
+
+  static blink::web_pref::ImageAnimationPolicy animation_policy(
+      const blink::web_pref::WebPreferences& r) {
+    return r.animation_policy;
+  }
+
+  static bool user_gesture_required_for_presentation(
+      const blink::web_pref::WebPreferences& r) {
+    return r.user_gesture_required_for_presentation;
+  }
+
+  static bool text_tracks_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.text_tracks_enabled;
+  }
+
+  static const std::string& text_track_background_color(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_background_color;
+  }
+
+  static const std::string& text_track_text_color(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_text_color;
+  }
+
+  static const std::string& text_track_text_size(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_text_size;
+  }
+
+  static const std::string& text_track_text_shadow(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_text_shadow;
+  }
+
+  static const std::string& text_track_font_family(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_font_family;
+  }
+
+  static const std::string& text_track_font_style(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_font_style;
+  }
+
+  static const std::string& text_track_font_variant(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_font_variant;
+  }
+
+  static const std::string& text_track_window_color(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_window_color;
+  }
+
+  static const std::string& text_track_window_padding(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_window_padding;
+  }
+
+  static const std::string& text_track_window_radius(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_window_radius;
+  }
+
+  static float text_track_margin_percentage(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_track_margin_percentage;
+  }
+
+  static bool immersive_mode_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.immersive_mode_enabled;
+  }
+
+  static bool double_tap_to_zoom_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.double_tap_to_zoom_enabled;
+  }
+
+  static bool fullscreen_supported(const blink::web_pref::WebPreferences& r) {
+    return r.fullscreen_supported;
+  }
+
+  static bool text_autosizing_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.text_autosizing_enabled;
+  }
+
+  static const GURL& web_app_scope(const ::blink::web_pref::WebPreferences& r) {
+    return r.web_app_scope;
+  }
+
+#if defined(OS_ANDROID)
+  static float font_scale_factor(const blink::web_pref::WebPreferences& r) {
+    return r.font_scale_factor;
+  }
+
+  static float device_scale_adjustment(
+      const blink::web_pref::WebPreferences& r) {
+    return r.device_scale_adjustment;
+  }
+
+  static bool force_enable_zoom(const blink::web_pref::WebPreferences& r) {
+    return r.force_enable_zoom;
+  }
+
+  static const GURL& default_video_poster_url(
+      const blink::web_pref::WebPreferences& r) {
+    return r.default_video_poster_url;
+  }
+
+  static bool support_deprecated_target_density_dpi(
+      const blink::web_pref::WebPreferences& r) {
+    return r.support_deprecated_target_density_dpi;
+  }
+
+  static bool use_legacy_background_size_shorthand_behavior(
+      const blink::web_pref::WebPreferences& r) {
+    return r.use_legacy_background_size_shorthand_behavior;
+  }
+
+  static bool wide_viewport_quirk(const blink::web_pref::WebPreferences& r) {
+    return r.wide_viewport_quirk;
+  }
+
+  static bool use_wide_viewport(const blink::web_pref::WebPreferences& r) {
+    return r.use_wide_viewport;
+  }
+
+  static bool force_zero_layout_height(
+      const blink::web_pref::WebPreferences& r) {
+    return r.force_zero_layout_height;
+  }
+
+  static bool viewport_meta_merge_content_quirk(
+      const blink::web_pref::WebPreferences& r) {
+    return r.viewport_meta_merge_content_quirk;
+  }
+
+  static bool viewport_meta_non_user_scalable_quirk(
+      const blink::web_pref::WebPreferences& r) {
+    return r.viewport_meta_non_user_scalable_quirk;
+  }
+
+  static bool viewport_meta_zero_values_quirk(
+      const blink::web_pref::WebPreferences& r) {
+    return r.viewport_meta_zero_values_quirk;
+  }
+
+  static bool clobber_user_agent_initial_scale_quirk(
+      const blink::web_pref::WebPreferences& r) {
+    return r.clobber_user_agent_initial_scale_quirk;
+  }
+
+  static bool ignore_main_frame_overflow_hidden_quirk(
+      const blink::web_pref::WebPreferences& r) {
+    return r.ignore_main_frame_overflow_hidden_quirk;
+  }
+
+  static bool report_screen_size_in_physical_pixels_quirk(
+      const blink::web_pref::WebPreferences& r) {
+    return r.report_screen_size_in_physical_pixels_quirk;
+  }
+
+  static bool reuse_global_for_unowned_main_frame(
+      const blink::web_pref::WebPreferences& r) {
+    return r.reuse_global_for_unowned_main_frame;
+  }
+
+  static bool spellcheck_enabled_by_default(
+      const blink::web_pref::WebPreferences& r) {
+    return r.spellcheck_enabled_by_default;
+  }
+
+  static bool video_fullscreen_orientation_lock_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.video_fullscreen_orientation_lock_enabled;
+  }
+
+  static bool video_rotate_to_fullscreen_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.video_rotate_to_fullscreen_enabled;
+  }
+
+  static bool embedded_media_experience_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.embedded_media_experience_enabled;
+  }
+
+  static bool css_hex_alpha_color_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.css_hex_alpha_color_enabled;
+  }
+
+  static bool scroll_top_left_interop_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.scroll_top_left_interop_enabled;
+  }
+
+  static bool disable_features_depending_on_viz(
+      const blink::web_pref::WebPreferences& r) {
+    return r.disable_features_depending_on_viz;
+  }
+
+  static bool disable_accelerated_small_canvases(
+      const blink::web_pref::WebPreferences& r) {
+    return r.disable_accelerated_small_canvases;
+  }
+
+  static bool reenable_web_components_v0(
+      const blink::web_pref::WebPreferences& r) {
+    return r.reenable_web_components_v0;
+  }
+#endif
+
+  static bool force_dark_mode_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.force_dark_mode_enabled;
+  }
+
+  static float default_minimum_page_scale_factor(
+      const blink::web_pref::WebPreferences& r) {
+    return r.default_minimum_page_scale_factor;
+  }
+
+  static float default_maximum_page_scale_factor(
+      const blink::web_pref::WebPreferences& r) {
+    return r.default_maximum_page_scale_factor;
+  }
+
+  static bool hide_download_ui(const blink::web_pref::WebPreferences& r) {
+    return r.hide_download_ui;
+  }
+
+  static bool presentation_receiver(const blink::web_pref::WebPreferences& r) {
+    return r.presentation_receiver;
+  }
+
+  static bool media_controls_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.media_controls_enabled;
+  }
+
+  static bool do_not_update_selection_on_mutating_selection_range(
+      const blink::web_pref::WebPreferences& r) {
+    return r.do_not_update_selection_on_mutating_selection_range;
+  }
+
+  static blink::web_pref::AutoplayPolicy autoplay_policy(
+      const blink::web_pref::WebPreferences& r) {
+    return r.autoplay_policy;
+  }
+
+  static blink::PreferredColorScheme preferred_color_scheme(
+      const blink::web_pref::WebPreferences& r) {
+    return r.preferred_color_scheme;
+  }
+
+  static net::EffectiveConnectionType low_priority_iframes_threshold(
+      const blink::web_pref::WebPreferences& r) {
+    return r.low_priority_iframes_threshold;
+  }
+
+  static bool picture_in_picture_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.picture_in_picture_enabled;
+  }
+
+  static bool translate_service_available(
+      const blink::web_pref::WebPreferences& r) {
+    return r.translate_service_available;
+  }
+
+  static net::EffectiveConnectionType network_quality_estimator_web_holdback(
+      const blink::web_pref::WebPreferences& r) {
+    return r.network_quality_estimator_web_holdback;
+  }
+
+  static bool lazy_load_enabled(const blink::web_pref::WebPreferences& r) {
+    return r.lazy_load_enabled;
+  }
+
+  static const std::map<net::EffectiveConnectionType, int32_t>&
+  lazy_frame_loading_distance_thresholds_px(
+      const blink::web_pref::WebPreferences& r) {
+    return r.lazy_frame_loading_distance_thresholds_px;
+  }
+
+  static const std::map<net::EffectiveConnectionType, int32_t>&
+  lazy_image_loading_distance_thresholds_px(
+      const blink::web_pref::WebPreferences& r) {
+    return r.lazy_image_loading_distance_thresholds_px;
+  }
+
+  static const std::map<net::EffectiveConnectionType, int32_t>&
+  lazy_image_first_k_fully_load(const blink::web_pref::WebPreferences& r) {
+    return r.lazy_image_first_k_fully_load;
+  }
+
+  static bool allow_mixed_content_upgrades(
+      const blink::web_pref::WebPreferences& r) {
+    return r.allow_mixed_content_upgrades;
+  }
+
+  static bool always_show_focus(const blink::web_pref::WebPreferences& r) {
+    return r.always_show_focus;
+  }
+
+  static bool touch_drag_drop_enabled(
+      const blink::web_pref::WebPreferences& r) {
+    return r.touch_drag_drop_enabled;
+  }
+
+  static bool Read(blink::mojom::WebPreferencesDataView r,
+                   blink::web_pref::WebPreferences* out);
+};
+
+}  // namespace mojo
+
+#endif  // THIRD_PARTY_BLINK_PUBLIC_COMMON_WEB_PREFERENCES_WEB_PREFERENCES_MOJOM_TRAITS_H_
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index ae07c26694931..b51530c6f53d1 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -174,6 +174,7 @@ mojom("mojom_platform") {
     "web_launch/web_launch.mojom",
     "webaudio/audio_context_manager.mojom",
     "webdatabase/web_database.mojom",
+    "webpreferences/web_preferences.mojom",
     "websockets/websocket_connector.mojom",
     "webtransport/quic_transport_connector.mojom",
     "widget/device_emulation_params.mojom",
@@ -405,6 +406,15 @@ mojom("mojom_platform") {
       traits_headers = [ "//third_party/blink/public/common/frame/frame_owner_properties_mojom_traits.h" ]
       traits_public_deps = [ "//third_party/blink/public/common:headers" ]
     },
+    {
+      types = [
+        {
+          mojom = "blink.mojom.WebPreferences"
+          cpp = "::blink::web_pref::WebPreferences"
+        },
+      ]
+      traits_headers = [ "//third_party/blink/public/common/web_preferences/web_preferences_mojom_traits.h" ]
+    },
   ]
   cpp_typemaps = [
     {
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom
index 4320f0ea1f2db..660ad847f83ad 100644
--- a/third_party/blink/public/mojom/page/page.mojom
+++ b/third_party/blink/public/mojom/page/page.mojom
@@ -5,6 +5,7 @@
 module blink.mojom;
 import "mojo/public/mojom/base/time.mojom";
 import "third_party/blink/public/mojom/page/page_visibility_state.mojom";
+import "third_party/blink/public/mojom/webpreferences/web_preferences.mojom";
 
 enum PagehideDispatch {
   // We haven't dispatched pagehide and should do so when appropriate.
@@ -56,4 +57,7 @@ interface PageBroadcast {
   // Notifies renderers when a portal web contents is activated or if a
   // web contents is adopted as a portal.
   SetInsidePortal(bool is_inside_portal);
+
+  // Notifies the renderer when updating a set of blink preferences.
+  UpdateWebPreferences(blink.mojom.WebPreferences preferences);
 };
diff --git a/third_party/blink/public/mojom/webpreferences/OWNERS b/third_party/blink/public/mojom/webpreferences/OWNERS
new file mode 100644
index 0000000000000..61b5e28552a18
--- /dev/null
+++ b/third_party/blink/public/mojom/webpreferences/OWNERS
@@ -0,0 +1,2 @@
+per-file *.mojom=set noparent
+per-file *.mojom=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/third_party/blink/public/mojom/webpreferences/web_preferences.mojom b/third_party/blink/public/mojom/webpreferences/web_preferences.mojom
new file mode 100644
index 0000000000000..d8a9421a17646
--- /dev/null
+++ b/third_party/blink/public/mojom/webpreferences/web_preferences.mojom
@@ -0,0 +1,423 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module blink.mojom;
+
+import "third_party/blink/public/mojom/v8_cache_options.mojom";
+import "url/mojom/url.mojom";
+import "mojo/public/mojom/base/string16.mojom";
+
+enum PointerType {
+  kPointerFirstType                         = 1,  // 1 << 0
+  kPointerCoarseType                        = 2,  // 1 << 1
+  kPointerFineType                          = 4   // 1 << 2
+};
+
+enum HoverType {
+  kHoverFirstType                            = 1,  // 1 << 0
+  kHoverHoverType                            = 2   // 1 << 1
+};
+
+enum PreferredColorScheme {
+  kDark,
+  kLight,
+};
+
+// TODO(gyuyoung): This Mojo enum will replace all uses of
+// web_pref::EditingBehaviorType in a follow-up CL.
+enum EditingBehavior {
+  kEditingMacBehavior,
+  kEditingWindowsBehavior,
+  kEditingUnixBehavior,
+  kEditingAndroidBehavior,
+  kEditingChromeOSBehavior
+};
+
+// ImageAnimationPolicy is used for controlling image animation
+// when image frame is rendered for animation.
+// See third_party/WebKit/Source/platform/graphics/ImageAnimationPolicy.h
+// for information on the options.
+enum ImageAnimationPolicy {
+  kImageAnimationPolicyAllowed,
+  kImageAnimationPolicyAnimateOnce,
+  kImageAnimationPolicyNoAnimation
+};
+
+enum ViewportStyle { kDefault, kMobile, kTelevision, kLast = kTelevision };
+
+// Defines the autoplay policy to be used. Should match the class in
+// WebSettings.h.
+enum AutoplayPolicy {
+  kNoUserGestureRequired,
+  kUserGestureRequired,
+  kDocumentUserActivationRequired,
+};
+
+enum EffectiveConnectionType {
+  // Effective connection type reported when the network quality is unknown.
+  kEffectiveConnectionUnknownType,
+
+  // Effective connection type reported when the Internet is unreachable
+  // because the device does not have a connection (as reported by underlying
+  // platform APIs). Note that due to rare but  potential bugs in the platform
+  // APIs, it is possible that effective connection type is reported as
+  // EFFECTIVE_CONNECTION_TYPE_OFFLINE. Callers must use caution when using
+  // acting on this.
+  kEffectiveConnectionOfflineType,
+
+  // Effective connection type reported when the network has the quality of a
+  // poor 2G connection.
+  kEffectiveConnectionSlow2GType,
+
+  // Effective connection type reported when the network has the quality of a
+  // faster 2G connection.
+  kEffectiveConnection2GType,
+
+  // Effective connection type reported when the network has the quality of a 3G
+  // connection.
+  kEffectiveConnection3GType,
+
+  // Effective connection type reported when the network has the quality of a 4G
+  // connection.
+  kEffectiveConnection4GType,
+};
+
+struct WebPreferences {
+  map<string, mojo_base.mojom.String16> standard_font_family_map;
+  map<string, mojo_base.mojom.String16> fixed_font_family_map;
+  map<string, mojo_base.mojom.String16> serif_font_family_map;
+  map<string, mojo_base.mojom.String16> sans_serif_font_family_map;
+  map<string, mojo_base.mojom.String16> cursive_font_family_map;
+  map<string, mojo_base.mojom.String16> fantasy_font_family_map;
+  map<string, mojo_base.mojom.String16> pictograph_font_family_map;
+  int32 default_font_size;
+  int32 default_fixed_font_size;
+  int32 minimum_font_size;
+  int32 minimum_logical_font_size;
+  string default_encoding;
+  bool context_menu_on_mouse_up;
+  bool javascript_enabled;
+  bool web_security_enabled;
+  bool loads_images_automatically;
+  bool images_enabled;
+  bool plugins_enabled;
+  bool dom_paste_enabled;
+  bool shrinks_standalone_images_to_fit;
+  bool text_areas_are_resizable;
+  bool allow_scripts_to_close_windows;
+  bool remote_fonts_enabled;
+  bool javascript_can_access_clipboard;
+  bool xslt_enabled;
+  // We don't use dns_prefetching_enabled to disable DNS prefetching.  Instead,
+  // we disable the feature at a lower layer so that we catch non-WebKit uses
+  // of DNS prefetch as well.
+  bool dns_prefetching_enabled;
+  // Preference to save data. When enabled, requests will contain the header
+  // 'Save-Data: on'.
+  bool data_saver_enabled;
+  // Whether data saver holdback for Web APIs is enabled. If enabled, data saver
+  // appears as disabled to the web consumers even if it has been actually
+  // enabled by the user.
+  bool data_saver_holdback_web_api_enabled;
+  bool local_storage_enabled;
+  bool databases_enabled;
+  bool application_cache_enabled;
+  bool tabs_to_links;
+  bool disable_ipc_flooding_protection;
+  bool hyperlink_auditing_enabled;
+  bool allow_universal_access_from_file_urls;
+  bool allow_file_access_from_file_urls;
+  bool webgl1_enabled;
+  bool webgl2_enabled;
+  bool pepper_3d_enabled;
+  bool flash_3d_enabled;
+  bool flash_stage3d_enabled;
+  bool flash_stage3d_baseline_enabled;
+  bool privileged_webgl_extensions_enabled;
+  bool webgl_errors_to_console_enabled;
+  bool hide_scrollbars;
+  bool accelerated_2d_canvas_enabled;
+  bool new_canvas_2d_api_enabled;
+  bool antialiased_2d_canvas_disabled;
+  bool antialiased_clips_2d_canvas_enabled;
+  bool accelerated_filters_enabled;
+  bool deferred_filters_enabled;
+  bool container_culling_enabled;
+  bool allow_running_insecure_content;
+  // If true, taint32s all <canvas> elements, regardless of origin.
+  bool disable_reading_from_canvas;
+  // Strict mixed content checking disables both displaying and running insecure
+  // mixed content, and disables embedder notifications that such content was
+  // requested (thereby preventing user override).
+  bool strict_mixed_content_checking;
+  // Strict powerful feature restrictions block insecure usage of powerful
+  // features (like device orientation) that we haven't yet disabled for the web
+  // at large.
+  bool strict_powerful_feature_restrictions;
+  // TODO(jww): Remove when WebView no longer needs this exception.
+  bool allow_geolocation_on_insecure_origins;
+  // Disallow user opt-in for blockable mixed content.
+  bool strictly_block_blockable_mixed_content;
+  bool block_mixed_plugin_content;
+  bool password_echo_enabled;
+  bool should_clear_document_background;
+  bool enable_scroll_animator;
+  bool prefers_reduced_motion;
+  bool touch_event_feature_detection_enabled;
+  int32 pointer_events_max_touch_points;
+  int32 available_pointer_types;
+  PointerType primary_pointer_type;
+  int32 available_hover_types;
+  HoverType primary_hover_type;
+  bool dont_send_key_events_to_javascript;
+  bool barrel_button_for_drag_enabled;
+  bool sync_xhr_in_documents_enabled;
+  int32 number_of_cpu_cores;
+  EditingBehavior editing_behavior;
+  bool supports_multiple_windows;
+  bool viewport_enabled;
+  bool viewport_meta_enabled;
+
+  // If true - Blink will clamp the minimum scale factor to the content width,
+  // preventing zoom beyond the visible content. This is really only needed if
+  // viewport_enabled is on.
+  bool shrinks_viewport_contents_to_fit;
+
+  ViewportStyle viewport_style;
+  bool smooth_scroll_for_find_enabled;
+  bool main_frame_resizes_are_orientation_changes;
+  bool initialize_at_minimum_page_scale;
+  bool smart_insert_delete_enabled;
+  bool spatial_navigation_enabled;
+  bool navigate_on_drag_drop;
+  V8CacheOptions v8_cache_options;
+  bool record_whole_document;
+
+  // This flags corresponds to a Page's Settings' setCookieEnabled state. It
+  // only controls whether or not the "document.cookie" field is properly
+  // connected to the backing store, for instance if you wanted to be able to
+  // define custom getters and setters from within a unique security content
+  // without raising a DOM security exception.
+  bool cookie_enabled;
+
+  // This flag indicates whether H/W accelerated video decode is enabled.
+  // Defaults to false.
+  bool accelerated_video_decode_enabled;
+
+  ImageAnimationPolicy animation_policy;
+
+  bool user_gesture_required_for_presentation;
+
+  bool text_tracks_enabled;
+
+  // These fields specify the foreground and background color for WebVTT text
+  // tracks. Their values can be any legal CSS color descriptor.
+  string text_track_background_color;
+  string text_track_text_color;
+
+  // These fields specify values for CSS properties used to style WebVTT text
+  // tracks.
+  // Specifies CSS font-size property in percentage.
+  string text_track_text_size;
+  string text_track_text_shadow;
+  string text_track_font_family;
+  string text_track_font_style;
+  // Specifies the value for CSS font-variant property.
+  string text_track_font_variant;
+
+  // These fields specify values for CSS properties used to style the window
+  // around WebVTT text tracks.
+  // Window color can be any legal CSS color descriptor.
+  string text_track_window_color;
+  // Window padding is in em.
+  string text_track_window_padding;
+  // Window radius is in pixels.
+  string text_track_window_radius;
+
+  // Specifies the margin for WebVTT text tracks as a percentage of media
+  // element height/width (for horizontal/vertical text respectively).
+  // Cues will not be placed in this margin area.
+  float text_track_margin_percentage;
+
+  bool immersive_mode_enabled;
+
+  bool double_tap_to_zoom_enabled;
+
+  bool fullscreen_supported;
+
+  bool text_autosizing_enabled;
+
+  // Representation of the Web App Manifest scope if any.
+  url.mojom.Url web_app_scope;
+
+  [EnableIf=is_android]
+  float font_scale_factor;
+
+  [EnableIf=is_android]
+  float device_scale_adjustment;
+
+  [EnableIf=is_android]
+  bool force_enable_zoom;
+
+  [EnableIf=is_android]
+  url.mojom.Url default_video_poster_url;
+
+  [EnableIf=is_android]
+  bool support_deprecated_target_density_dpi;
+
+  [EnableIf=is_android]
+  bool use_legacy_background_size_shorthand_behavior;
+
+  [EnableIf=is_android]
+  bool wide_viewport_quirk;
+
+  [EnableIf=is_android]
+  bool use_wide_viewport;
+
+  [EnableIf=is_android]
+  bool force_zero_layout_height;
+
+  [EnableIf=is_android]
+  bool viewport_meta_merge_content_quirk;
+
+  [EnableIf=is_android]
+  bool viewport_meta_non_user_scalable_quirk;
+
+  [EnableIf=is_android]
+  bool viewport_meta_zero_values_quirk;
+
+  [EnableIf=is_android]
+  bool clobber_user_agent_initial_scale_quirk;
+
+  [EnableIf=is_android]
+  bool ignore_main_frame_overflow_hidden_quirk;
+
+  [EnableIf=is_android]
+  bool report_screen_size_in_physical_pixels_quirk;
+
+  // Used by Android_WebView only to support legacy apps that inject script int32o
+  // a top-level initial empty document and expect it to persist on navigation.
+  [EnableIf=is_android]
+  bool reuse_global_for_unowned_main_frame;
+
+  // Specifies default setting for spellcheck when the spellcheck attribute is
+  // not explicitly specified.
+  [EnableIf=is_android]
+  bool spellcheck_enabled_by_default;
+
+  // If enabled, when a video goes fullscreen, the orientation should be locked.
+  [EnableIf=is_android]
+  bool video_fullscreen_orientation_lock_enabled;
+
+  // If enabled, fullscreen should be entered/exited when the device is rotated
+  // to/from the orientation of the video.
+  [EnableIf=is_android]
+  bool video_rotate_to_fullscreen_enabled;
+
+  [EnableIf=is_android]
+  bool embedded_media_experience_enabled;
+
+  // Enable 8 (#RRGGBBAA) and 4 (#RGBA) value hex colors in CSS Android
+  // WebView quirk (http://crbug.com/618472).
+  [EnableIf=is_android]
+  bool css_hex_alpha_color_enabled;
+
+  // Enable support for document.scrollingElement
+  // WebView sets this to false to retain old documentElement behaviour
+  // (http://crbug.com/761016).
+  [EnableIf=is_android]
+  bool scroll_top_left_interop_enabled;
+
+  // Disable features such as offscreen canvas that depend on the viz
+  // architecture of surface embedding. Android WebView does not support this
+  // architecture yet.
+  [EnableIf=is_android]
+  bool disable_features_depending_on_viz;
+
+  [EnableIf=is_android]
+  // Don't accelerate small canvases to avoid crashes TODO(crbug.com/1004304)
+  bool disable_accelerated_small_canvases;
+
+  // Re-enable Web Components v0 on Webview, temporarily. This should get
+  // removed when crbug.com/1021631 gets fixed.
+  [EnableIf=is_android]
+  bool reenable_web_components_v0;
+
+  // Enable forcibly modifying content rendering to result in a light on dark
+  // color scheme.
+  bool force_dark_mode_enabled;
+
+  // Default (used if the page or UA doesn't override these) values for page
+  // scale limits. These are set directly on the WebView so there's no analogue
+  // in WebSettings.
+  float default_minimum_page_scale_factor;
+  float default_maximum_page_scale_factor;
+
+  // Whether download UI should be hidden on this page.
+  bool hide_download_ui;
+
+  // Whether it is a presentation receiver.
+  bool presentation_receiver;
+
+  // If disabled, media controls should never be used.
+  bool media_controls_enabled;
+
+  // Whether we want to disable updating selection on mutating selection range.
+  // This is to work around Samsung's email app issue. See
+  // https://crbug.com/699943 for details.
+  // TODO(changwan): remove this once we no longer support Android N.
+  bool do_not_update_selection_on_mutating_selection_range;
+
+  // Defines the current autoplay policy.
+  AutoplayPolicy autoplay_policy;
+
+  // The preferred color scheme for the web content. The scheme is used to
+  // evaluate the prefers-color-scheme media query and resolve UA color scheme
+  // to be used based on the supported-color-schemes META tag and CSS property.
+  PreferredColorScheme preferred_color_scheme;
+
+  // Network quality threshold below which resources from iframes are assigned
+  // either kVeryLow or kVeryLow Blink priority.
+  EffectiveConnectionType low_priority_iframes_threshold;
+
+  // Whether Picture-in-Picture is enabled.
+  bool picture_in_picture_enabled;
+
+  // Whether a translate service is available.
+  // blink's hrefTranslate attribute existence relies on the result.
+  // See https://github.com/dtapuska/html-translate
+  bool translate_service_available;
+
+  // A value other than net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN implies that the
+  // network quality estimate related Web APIs are in the holdback mode. When
+  // the holdback is enabled, the related Web APIs return network quality
+  // estimate corresponding to |network_quality_estimator_web_holdback|
+  // regardless of the actual quality.
+  EffectiveConnectionType network_quality_estimator_web_holdback;
+
+  // Whether lazy loading of frames and images is enabled.
+  bool lazy_load_enabled;
+
+  // Specifies how close a lazily loaded iframe or image should be from the
+  // viewport before it should start being loaded in, depending on the effective
+  // connection type of the current network. Blink will use the default distance
+  // threshold for effective connection types that aren't specified here.
+  map<EffectiveConnectionType, int32>
+      lazy_frame_loading_distance_thresholds_px;
+  map<EffectiveConnectionType, int32>
+      lazy_image_loading_distance_thresholds_px;
+  map<EffectiveConnectionType, int32> lazy_image_first_k_fully_load;
+
+  // Setting to false disables upgrades to HTTPS for HTTP resources in HTTPS
+  // sites.
+  bool allow_mixed_content_upgrades;
+
+  // Whether the focused element should always be indicated (for example, by
+  // forcing :focus-visible to match regardless of focus method).
+  bool always_show_focus;
+
+  // Whether touch input can trigger HTML drag-and-drop operations. The
+  // default value depends on the platform.
+  bool touch_drag_drop_enabled;
+};
\ No newline at end of file
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index b932b8c864e71..64c52801dbfcd 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -240,6 +240,8 @@ class CORE_EXPORT WebViewImpl final : public WebView,
       SetPageLifecycleStateCallback callback) override;
   void AudioStateChanged(bool is_audio_playing) override;
   void SetInsidePortal(bool is_inside_portal) override;
+  void UpdateWebPreferences(
+      const blink::web_pref::WebPreferences& preferences) override;
 
   void DispatchPageshow(base::TimeTicks navigation_start);
   void DispatchPagehide(mojom::blink::PagehideDispatch pagehide_dispatch);
@@ -541,9 +543,6 @@ class CORE_EXPORT WebViewImpl final : public WebView,
   // browser.
   void DoDeferredCloseWindowSoon();
 
-  // Applies blink related preferences to this view.
-  void UpdateWebPreferences(const blink::web_pref::WebPreferences& preferences);
-
   WebViewImpl(
       WebViewClient*,
       mojom::blink::PageVisibilityState visibility,
diff --git a/third_party/blink/web_tests/images/huge-image-viewport-scale.html b/third_party/blink/web_tests/images/huge-image-viewport-scale.html
index 64de3ae2a4bce..55d80fa4634a9 100644
--- a/third_party/blink/web_tests/images/huge-image-viewport-scale.html
+++ b/third_party/blink/web_tests/images/huge-image-viewport-scale.html
@@ -9,9 +9,9 @@ if (window.testRunner) {
 
 onload = function() {
   var newWindow = window.open('resources/5000x5000.png', 'image', 'width=100,height=150');
-  if (newWindow.internals)
-    newWindow.internals.settings.setViewportEnabled(true);
   newWindow.onload = function() {
+    if (newWindow.internals)
+      newWindow.internals.settings.setViewportEnabled(true);
     runAfterLayoutAndPaint(function() {
       document.getElementById('output').textContent =
           '\nviewport meta: ' + newWindow.document.querySelector('meta').outerHTML