diff --git a/DEPS b/DEPS
index 99c8628..844f751f 100644
--- a/DEPS
+++ b/DEPS
@@ -145,7 +145,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '59192a0d66a746e472802fed50c139b880ef11c4',
+  'skia_revision': '14963cef70cc96244661efa5da4ab4a745177b07',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -157,7 +157,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '0716ce0a2c0c2aee069bc038fb0b55e796dd6052',
+  'angle_revision': '6e9098629bca9588cf3f000b5272005ae6f735e9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -165,7 +165,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '6e3a40600f246bd8cff2367e3805ce53466cb349',
+  'pdfium_revision': 'e2a6c7b2edbac6b98bd769780745501c0b248c79',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -280,7 +280,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '506ce9bba43beca3ba6416b93f6c43ef7df0c5d3',
+  'dawn_revision': 'e69627f35ec5e6ba0360b3023ba06c41c4107652',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -809,7 +809,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '23a204c3872ee7eabd7385e223ebe096aec64e45',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd595819730e18bd716a57f511e439b05a5faaff7',
       'condition': 'checkout_linux',
   },
 
@@ -834,7 +834,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'e3614ad6f574a554f18dbcb1c03dd9f0df6ab3ba',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c10743f873f3d4edc8a7d135303d8efdbddee196',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1207,7 +1207,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '094fa97a20d79f99949f9807d54ca64bd05f820a',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'bff98571c079f9bd2b744969fdf1e53a3ec36fe4',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1375,7 +1375,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'abaae129d9a0c6e1e092067e0b105475df43352e',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '378cae2543f5ea7d0a95a1c15516da0c5cd15f6c',
+    Var('webrtc_git') + '/src.git' + '@' + '17048012261406343c4e3f82418720b7cf0f4dd7',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1416,7 +1416,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@d8a18e30c0ceead64e58975f69e58433b795116c',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@52b21525450c28a5093452cc4984d531377bc286',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_contents.cc b/android_webview/browser/aw_contents.cc
index 4ca1b87..7bbff4b 100644
--- a/android_webview/browser/aw_contents.cc
+++ b/android_webview/browser/aw_contents.cc
@@ -403,7 +403,7 @@
   return render_process->GetJavaObject();
 }
 
-void AwContents::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void AwContents::Destroy(JNIEnv* env) {
   java_ref_.reset();
   delete this;
 }
diff --git a/android_webview/browser/aw_contents.h b/android_webview/browser/aw_contents.h
index 75106b091..cc49f4b7 100644
--- a/android_webview/browser/aw_contents.h
+++ b/android_webview/browser/aw_contents.h
@@ -106,7 +106,7 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& obj);
 
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
   void DocumentHasImages(JNIEnv* env,
                          const base::android::JavaParamRef<jobject>& obj,
                          const base::android::JavaParamRef<jobject>& message);
diff --git a/android_webview/browser/gfx/aw_gl_functor.cc b/android_webview/browser/gfx/aw_gl_functor.cc
index b9844f7..32b24f02 100644
--- a/android_webview/browser/gfx/aw_gl_functor.cc
+++ b/android_webview/browser/gfx/aw_gl_functor.cc
@@ -64,8 +64,7 @@
     Java_AwGLFunctor_detachFunctorFromView(env, obj);
 }
 
-void AwGLFunctor::Destroy(JNIEnv* env,
-                          const base::android::JavaParamRef<jobject>& obj) {
+void AwGLFunctor::Destroy(JNIEnv* env) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   java_ref_.reset();
   delete this;
diff --git a/android_webview/browser/gfx/aw_gl_functor.h b/android_webview/browser/gfx/aw_gl_functor.h
index 68fa7f2f..bde850b 100644
--- a/android_webview/browser/gfx/aw_gl_functor.h
+++ b/android_webview/browser/gfx/aw_gl_functor.h
@@ -18,7 +18,7 @@
   explicit AwGLFunctor(const JavaObjectWeakGlobalRef& java_ref);
   ~AwGLFunctor();
 
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
   void DeleteHardwareRenderer(JNIEnv* env,
                               const base::android::JavaParamRef<jobject>& obj);
   void RemoveFromCompositorFrameProducer(
diff --git a/android_webview/browser/gfx/aw_picture.cc b/android_webview/browser/gfx/aw_picture.cc
index 445ca1f..2dee089 100644
--- a/android_webview/browser/gfx/aw_picture.cc
+++ b/android_webview/browser/gfx/aw_picture.cc
@@ -18,7 +18,7 @@
 
 AwPicture::~AwPicture() {}
 
-void AwPicture::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void AwPicture::Destroy(JNIEnv* env) {
   delete this;
 }
 
diff --git a/android_webview/browser/gfx/aw_picture.h b/android_webview/browser/gfx/aw_picture.h
index eac03b2..fc332af 100644
--- a/android_webview/browser/gfx/aw_picture.h
+++ b/android_webview/browser/gfx/aw_picture.h
@@ -21,7 +21,7 @@
   ~AwPicture();
 
   // Methods called from Java.
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
   jint GetWidth(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
   jint GetHeight(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
   void Draw(JNIEnv* env,
diff --git a/android_webview/browser/permission/aw_permission_request.cc b/android_webview/browser/permission/aw_permission_request.cc
index 343a82e0..9ed9fd5 100644
--- a/android_webview/browser/permission/aw_permission_request.cc
+++ b/android_webview/browser/permission/aw_permission_request.cc
@@ -66,8 +66,7 @@
   Java_AwPermissionRequest_destroyNative(AttachCurrentThread(), j_request);
 }
 
-void AwPermissionRequest::Destroy(JNIEnv* env,
-                                  const JavaParamRef<jobject>& obj) {
+void AwPermissionRequest::Destroy(JNIEnv* env) {
   delete this;
 }
 
diff --git a/android_webview/browser/permission/aw_permission_request.h b/android_webview/browser/permission/aw_permission_request.h
index b205adb..3ef8e7c 100644
--- a/android_webview/browser/permission/aw_permission_request.h
+++ b/android_webview/browser/permission/aw_permission_request.h
@@ -47,7 +47,7 @@
   void OnAccept(JNIEnv* env,
                 const base::android::JavaParamRef<jobject>& jcaller,
                 jboolean granted);
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
 
   // Return the origin which initiated the request.
   const GURL& GetOrigin();
diff --git a/ash/app_list/app_list_util.cc b/ash/app_list/app_list_util.cc
index e3797b7d..4f9cc84 100644
--- a/ash/app_list/app_list_util.cc
+++ b/ash/app_list/app_list_util.cc
@@ -54,14 +54,14 @@
                                      const ui::KeyEvent& key_event) {
   DCHECK(IsUnhandledLeftRightKeyEvent(key_event));
 
-  if (textfield->text().empty())
+  if (textfield->GetText().empty())
     return true;
 
   if (textfield->HasSelection())
     return false;
 
   if (textfield->GetCursorPosition() != 0 &&
-      textfield->GetCursorPosition() != textfield->text().length()) {
+      textfield->GetCursorPosition() != textfield->GetText().length()) {
     return false;
   }
 
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc
index 8a9debf..1de1816 100644
--- a/ash/app_list/views/app_list_view_unittest.cc
+++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -459,7 +459,7 @@
   // Test the behavior triggered by left and right key when focus is on the
   // |textfield|. Does not insert text.
   void TestLeftAndRightKeyTraversalOnTextfield(views::Textfield* textfield) {
-    EXPECT_TRUE(textfield->text().empty());
+    EXPECT_TRUE(textfield->GetText().empty());
     EXPECT_EQ(textfield, focused_view());
 
     views::View* next_view =
@@ -1178,7 +1178,7 @@
   GetAllSuggestions()[0]->RequestFocus();
   SimulateKeyPress(ui::VKEY_SPACE, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
-  EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16(" "));
+  EXPECT_EQ(search_box_view()->search_box()->GetText(), base::UTF8ToUTF16(" "));
   EXPECT_FALSE(search_box_view()->search_box()->HasSelection());
 
   // UI and Focus behavior is different with Zero State enabled.
@@ -1186,21 +1186,24 @@
   expand_arrow_view()->RequestFocus();
   SimulateKeyPress(ui::VKEY_A, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
-  EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16(" a"));
+  EXPECT_EQ(search_box_view()->search_box()->GetText(),
+            base::UTF8ToUTF16(" a"));
   EXPECT_FALSE(search_box_view()->search_box()->HasSelection());
 
   // Set focus to close button and type a character.
   search_box_view()->close_button()->RequestFocus();
   SimulateKeyPress(ui::VKEY_B, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
-  EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16(" ab"));
+  EXPECT_EQ(search_box_view()->search_box()->GetText(),
+            base::UTF8ToUTF16(" ab"));
   EXPECT_FALSE(search_box_view()->search_box()->HasSelection());
 
   // Set focus to close button and hitting backspace.
   search_box_view()->close_button()->RequestFocus();
   SimulateKeyPress(ui::VKEY_BACK, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
-  EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16(" a"));
+  EXPECT_EQ(search_box_view()->search_box()->GetText(),
+            base::UTF8ToUTF16(" a"));
   EXPECT_FALSE(search_box_view()->search_box()->HasSelection());
 }
 
@@ -1215,7 +1218,8 @@
   Show();
 
   search_box_view()->search_box()->InsertText(base::UTF8ToUTF16("test"));
-  EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16("test"));
+  EXPECT_EQ(search_box_view()->search_box()->GetText(),
+            base::UTF8ToUTF16("test"));
 
   // Move selection away from the searchbox.
   SimulateKeyPress(ui::VKEY_TAB, false);
@@ -1242,18 +1246,18 @@
     SimulateKeyPress(ui::VKEY_TAB, false);
     SimulateKeyPress(ui::VKEY_TAB, false);
 
-    EXPECT_EQ(search_box->text(), base::UTF8ToUTF16("TestResult1"));
+    EXPECT_EQ(search_box->GetText(), base::UTF8ToUTF16("TestResult1"));
   }
   // Change focus to the next result
   SimulateKeyPress(ui::VKEY_TAB, false);
 
-  EXPECT_EQ(search_box->text(), base::UTF8ToUTF16("TestResult2"));
+  EXPECT_EQ(search_box->GetText(), base::UTF8ToUTF16("TestResult2"));
 
   // This should remain after the flag is removed.
   if (app_list_features::IsSearchBoxSelectionEnabled()) {
     SimulateKeyPress(ui::VKEY_TAB, true);
 
-    EXPECT_EQ(search_box->text(), base::UTF8ToUTF16("TestResult1"));
+    EXPECT_EQ(search_box->GetText(), base::UTF8ToUTF16("TestResult1"));
 
     SimulateKeyPress(ui::VKEY_TAB, false);
   }
@@ -1261,7 +1265,7 @@
   // Change focus to the final result
   SimulateKeyPress(ui::VKEY_TAB, false);
 
-  EXPECT_EQ(search_box->text(), base::UTF8ToUTF16("TestResult3"));
+  EXPECT_EQ(search_box->GetText(), base::UTF8ToUTF16("TestResult3"));
 }
 
 // Tests that the search box selects the whole query when focus moves to the
@@ -1278,7 +1282,8 @@
   constexpr int kListResults = 1;
   SetUpSearchResults(0, kListResults, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
-  EXPECT_EQ(base::UTF8ToUTF16("test"), search_box_view()->search_box()->text());
+  EXPECT_EQ(base::UTF8ToUTF16("test"),
+            search_box_view()->search_box()->GetText());
 
   // Hit Tab to move focus away from the searchbox.
   SimulateKeyPress(ui::VKEY_TAB, false);
@@ -2185,7 +2190,7 @@
   main_view->search_box_view()->search_box()->InsertText(search_text);
   // Check that the current search is using |search_text|.
   EXPECT_EQ(search_text, delegate_->GetSearchModel()->search_box()->text());
-  EXPECT_EQ(search_text, main_view->search_box_view()->search_box()->text());
+  EXPECT_EQ(search_text, main_view->search_box_view()->search_box()->GetText());
   contents_view->Layout();
   EXPECT_TRUE(
       contents_view->IsStateActive(ash::AppListState::kStateSearchResults));
@@ -2203,7 +2208,7 @@
   // Check that the current search is using |new_search_text|.
   EXPECT_EQ(new_search_text, delegate_->GetSearchModel()->search_box()->text());
   EXPECT_EQ(new_search_text,
-            main_view->search_box_view()->search_box()->text());
+            main_view->search_box_view()->search_box()->GetText());
   contents_view->Layout();
   EXPECT_TRUE(IsStateShown(ash::AppListState::kStateSearchResults));
   EXPECT_TRUE(CheckSearchBoxWidget(contents_view->GetDefaultSearchBoxBounds()));
diff --git a/ash/app_list/views/assistant/dialog_plate.cc b/ash/app_list/views/assistant/dialog_plate.cc
index 83f984a9..dfa98c4 100644
--- a/ash/app_list/views/assistant/dialog_plate.cc
+++ b/ash/app_list/views/assistant/dialog_plate.cc
@@ -103,7 +103,7 @@
         textfield_->GetFocusManager()->ClearFocus();
 
       const base::StringPiece16& trimmed_text = base::TrimWhitespace(
-          textfield_->text(), base::TrimPositions::TRIM_ALL);
+          textfield_->GetText(), base::TrimPositions::TRIM_ALL);
 
       // Only non-empty trimmed text is consider a valid contents commit.
       // Anything else will simply result in the DialogPlate being cleared.
diff --git a/ash/app_list/views/folder_header_view.cc b/ash/app_list/views/folder_header_view.cc
index 9c58ae4c..0a88c834 100644
--- a/ash/app_list/views/folder_header_view.cc
+++ b/ash/app_list/views/folder_header_view.cc
@@ -51,7 +51,7 @@
 
   void OnFocus() override {
     SetText(base::UTF8ToUTF16(folder_header_view_->folder_item_->name()));
-    starting_name_ = text();
+    starting_name_ = GetText();
     folder_header_view_->previous_folder_name_ = starting_name_;
     SelectAll(false);
     Textfield::OnFocus();
@@ -60,20 +60,20 @@
   void OnBlur() override {
     // Collapse whitespace when FolderNameView loses focus.
     folder_header_view_->ContentsChanged(
-        this, base::CollapseWhitespace(text(), false));
+        this, base::CollapseWhitespace(GetText(), false));
 
     // Ensure folder name is truncated when FolderNameView loses focus.
     SetText(folder_header_view_->GetElidedFolderName(
         base::UTF8ToUTF16(folder_header_view_->folder_item_->name())));
 
     // Record metric each time a folder is renamed.
-    if (text() != starting_name_) {
+    if (GetText() != starting_name_) {
       if (folder_header_view_->is_tablet_mode()) {
         UMA_HISTOGRAM_COUNTS_100("Apps.AppListFolderNameLength.TabletMode",
-                                 text().length());
+                                 GetText().length());
       } else {
         UMA_HISTOGRAM_COUNTS_100("Apps.AppListFolderNameLength.ClamshellMode",
-                                 text().length());
+                                 GetText().length());
       }
     }
 
@@ -172,16 +172,16 @@
 void FolderHeaderView::UpdateFolderNameAccessibleName() {
   // Sets |folder_name_view_|'s accessible name to the placeholder text if
   // |folder_name_view_| is blank; otherwise, clear the accessible name, the
-  // accessible state's value is set to be folder_name_view_->text() by
+  // accessible state's value is set to be folder_name_view_->GetText() by
   // TextField.
-  base::string16 accessible_name = folder_name_view_->text().empty()
+  base::string16 accessible_name = folder_name_view_->GetText().empty()
                                        ? folder_name_placeholder_text_
                                        : base::string16();
   folder_name_view_->SetAccessibleName(accessible_name);
 }
 
 const base::string16& FolderHeaderView::GetFolderNameForTest() {
-  return folder_name_view_->text();
+  return folder_name_view_->GetText();
 }
 
 void FolderHeaderView::SetFolderNameForTest(const base::string16& name) {
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index 02c2bb2f..4920a2e 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -182,7 +182,8 @@
 void SearchBoxView::UpdateModel(bool initiated_by_user) {
   // Temporarily remove from observer to ignore notifications caused by us.
   search_model_->search_box()->RemoveObserver(this);
-  search_model_->search_box()->Update(search_box()->text(), initiated_by_user);
+  search_model_->search_box()->Update(search_box()->GetText(),
+                                      initiated_by_user);
   search_model_->search_box()->SetSelectionModel(
       search_box()->GetSelectionModel());
   search_model_->search_box()->AddObserver(this);
@@ -319,7 +320,7 @@
   if (HasAutocompleteText()) {
     node_data->role = ax::mojom::Role::kTextField;
     node_data->SetValue(l10n_util::GetStringFUTF16(
-        IDS_APP_LIST_SEARCH_BOX_AUTOCOMPLETE, search_box()->text()));
+        IDS_APP_LIST_SEARCH_BOX_AUTOCOMPLETE, search_box()->GetText()));
   }
 }
 
@@ -434,7 +435,7 @@
 
   // Current non-autocompleted text.
   const base::string16& user_typed_text =
-      search_box()->text().substr(0, highlight_range_.start());
+      search_box()->GetText().substr(0, highlight_range_.start());
   if (last_key_pressed_ == ui::VKEY_BACK ||
       last_key_pressed_ == ui::VKEY_DELETE || IsArrowKey(last_key_pressed_) ||
       !first_visible_result ||
@@ -512,7 +513,7 @@
   if (!ShouldProcessAutocomplete())
     return;
 
-  const base::string16& current_text = search_box()->text();
+  const base::string16& current_text = search_box()->GetText();
   // Currrent text is a prefix of autocomplete text.
   DCHECK(base::StartsWith(autocomplete_text, current_text,
                           base::CompareCase::INSENSITIVE_ASCII));
@@ -627,7 +628,7 @@
   }
 
   // Record the |last_key_pressed_| for autocomplete.
-  if (!search_box()->text().empty() && ShouldProcessAutocomplete())
+  if (!search_box()->GetText().empty() && ShouldProcessAutocomplete())
     last_key_pressed_ = key_event.key_code();
 
   // Only arrow key or tab events intended for traversal within search results
@@ -800,7 +801,7 @@
 
 void SearchBoxView::ResetHighlightRange() {
   DCHECK(ShouldProcessAutocomplete());
-  const uint32_t text_length = search_box()->text().length();
+  const uint32_t text_length = search_box()->GetText().length();
   highlight_range_.set_start(text_length);
   highlight_range_.set_end(text_length);
 }
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc
index 3156302..6f1da70 100644
--- a/ash/app_list/views/search_box_view_unittest.cc
+++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -138,7 +138,7 @@
   // Overridden from SearchBoxViewDelegate:
   void QueryChanged(search_box::SearchBoxViewBase* sender) override {
     ++query_changed_count_;
-    last_query_ = sender->search_box()->text();
+    last_query_ = sender->search_box()->GetText();
   }
 
   void AssistantButtonPressed() override {}
@@ -199,7 +199,7 @@
       ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
                      base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON,
                      ui::EF_LEFT_MOUSE_BUTTON));
-  EXPECT_TRUE(view()->search_box()->text().empty());
+  EXPECT_TRUE(view()->search_box()->GetText().empty());
 }
 
 // Tests that the search box is no longer active after close button is clicked.
@@ -363,19 +363,19 @@
       // Search box autocomplete suggestion is accepted, but it should not
       // trigger another query, thus it is not reflected in Search Model.
       EXPECT_EQ(base::ASCIIToUTF16("hello world!"),
-                view()->search_box()->text());
+                view()->search_box()->GetText());
       EXPECT_EQ(base::ASCIIToUTF16("he"),
                 view_delegate()->GetSearchModel()->search_box()->text());
     } else {
       // Search box autocomplete suggestion is removed and is reflected in
       // SearchModel.
-      EXPECT_EQ(view()->search_box()->text(),
+      EXPECT_EQ(view()->search_box()->GetText(),
                 view_delegate()->GetSearchModel()->search_box()->text());
-      EXPECT_EQ(base::ASCIIToUTF16("he"), view()->search_box()->text());
+      EXPECT_EQ(base::ASCIIToUTF16("he"), view()->search_box()->GetText());
       // ProcessAutocomplete should be a no-op.
       view()->ProcessAutocomplete();
       // The autocomplete suggestion should still not be present.
-      EXPECT_EQ(base::ASCIIToUTF16("he"), view()->search_box()->text());
+      EXPECT_EQ(base::ASCIIToUTF16("he"), view()->search_box()->GetText());
     }
   }
 
@@ -491,7 +491,7 @@
   KeyPress(ui::VKEY_H);
   KeyPress(ui::VKEY_E);
   view()->ProcessAutocomplete();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hello list"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("hello list"));
   EXPECT_EQ(view()->search_box()->GetSelectedText(),
             base::ASCIIToUTF16("llo list"));
 }
@@ -511,7 +511,7 @@
   KeyPress(ui::VKEY_H);
   KeyPress(ui::VKEY_E);
   view()->ProcessAutocomplete();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hello tile"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("hello tile"));
   EXPECT_EQ(view()->search_box()->GetSelectedText(),
             base::ASCIIToUTF16("llo tile"));
 }
@@ -531,7 +531,7 @@
   KeyPress(ui::VKEY_H);
   KeyPress(ui::VKEY_E);
   view()->ProcessAutocomplete();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hello list"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("hello list"));
   EXPECT_EQ(view()->search_box()->GetSelectedText(),
             base::ASCIIToUTF16("llo list"));
 }
@@ -551,7 +551,7 @@
   KeyPress(ui::VKEY_H);
   KeyPress(ui::VKEY_E);
   view()->ProcessAutocomplete();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hello tile"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("hello tile"));
   EXPECT_EQ(view()->search_box()->GetSelectedText(),
             base::ASCIIToUTF16("llo tile"));
 }
@@ -569,7 +569,7 @@
   KeyPress(ui::VKEY_Z);
   view()->ProcessAutocomplete();
   // The text should not be autocompleted.
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("z"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("z"));
 }
 
 // Tests that autocomplete suggestion will remain if next key in the suggestion
@@ -587,13 +587,14 @@
   // After typing L, the highlighted text will be replaced by L.
   KeyPress(ui::VKEY_L);
   base::string16 selected_text = view()->search_box()->GetSelectedText();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hel"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("hel"));
   EXPECT_EQ(base::ASCIIToUTF16(""), selected_text);
 
   // After handling autocomplete, the highlighted text will show again.
   view()->ProcessAutocomplete();
   selected_text = view()->search_box()->GetSelectedText();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hello world!"));
+  EXPECT_EQ(view()->search_box()->GetText(),
+            base::ASCIIToUTF16("hello world!"));
   EXPECT_EQ(base::ASCIIToUTF16("lo world!"), selected_text);
 }
 
@@ -621,7 +622,8 @@
   view()->ProcessAutocomplete();
 
   base::string16 selected_text = view()->search_box()->GetSelectedText();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("hello world!"));
+  EXPECT_EQ(view()->search_box()->GetText(),
+            base::ASCIIToUTF16("hello world!"));
   EXPECT_EQ(base::ASCIIToUTF16("llo world!"), selected_text);
   view()->search_box()->SetText(base::string16());
 
@@ -633,7 +635,7 @@
   view()->ProcessAutocomplete();
 
   selected_text = view()->search_box()->GetSelectedText();
-  EXPECT_EQ(view()->search_box()->text(), base::ASCIIToUTF16("he"));
+  EXPECT_EQ(view()->search_box()->GetText(), base::ASCIIToUTF16("he"));
   EXPECT_EQ(base::ASCIIToUTF16(""), selected_text);
 }
 
diff --git a/ash/app_list/views/search_result_tile_item_list_view.cc b/ash/app_list/views/search_result_tile_item_list_view.cc
index 1cd853e1..7fdb015 100644
--- a/ash/app_list/views/search_result_tile_item_list_view.cc
+++ b/ash/app_list/views/search_result_tile_item_list_view.cc
@@ -250,7 +250,7 @@
 }
 
 std::vector<SearchResult*> SearchResultTileItemListView::GetDisplayResults() {
-  base::string16 raw_query = search_box_->text();
+  base::string16 raw_query = search_box_->GetText();
   base::string16 query;
   base::TrimWhitespace(raw_query, base::TRIM_ALL, &query);
 
@@ -298,7 +298,7 @@
 }
 
 base::string16 SearchResultTileItemListView::GetUserTypedQuery() {
-  base::string16 search_box_text = search_box_->text();
+  base::string16 search_box_text = search_box_->GetText();
   gfx::Range range = search_box_->GetSelectedRange();
   base::string16 raw_query = range.is_empty()
                                  ? search_box_text
diff --git a/ash/assistant/ui/dialog_plate/dialog_plate.cc b/ash/assistant/ui/dialog_plate/dialog_plate.cc
index 3a7678b..fd722545 100644
--- a/ash/assistant/ui/dialog_plate/dialog_plate.cc
+++ b/ash/assistant/ui/dialog_plate/dialog_plate.cc
@@ -103,7 +103,7 @@
         textfield_->GetFocusManager()->ClearFocus();
 
       const base::StringPiece16& trimmed_text = base::TrimWhitespace(
-          textfield_->text(), base::TrimPositions::TRIM_ALL);
+          textfield_->GetText(), base::TrimPositions::TRIM_ALL);
 
       // Only non-empty trimmed text is consider a valid contents commit.
       // Anything else will simply result in the DialogPlate being cleared.
diff --git a/ash/autoclick/autoclick_controller.cc b/ash/autoclick/autoclick_controller.cc
index 95330ca2..acb1ca4 100644
--- a/ash/autoclick/autoclick_controller.cc
+++ b/ash/autoclick/autoclick_controller.cc
@@ -157,6 +157,12 @@
       HideScrollPosition();
       Shell::Get()->RemovePreTargetHandler(this);
       menu_bubble_controller_ = nullptr;
+      // Set the click type to left-click. This is the most useful click type
+      // and users will want this type when they re-enable. If users were to
+      // re-enable in scroll, or right-click, they would need to use the bubble
+      // menu to change types.
+      Shell::Get()->accessibility_controller()->SetAutoclickEventType(
+          AutoclickEventType::kLeftClick);
       enabled_ = enabled;
     }
   }
@@ -520,6 +526,8 @@
 
 void AutoclickController::UpdateScrollPosition(
     const gfx::Point& point_in_screen) {
+  if (!enabled_)
+    return;
   if (!scroll_position_widget_) {
     CreateAutoclickScrollPositionWidget(point_in_screen);
     autoclick_scroll_position_handler_ =
diff --git a/ash/autoclick/autoclick_unittest.cc b/ash/autoclick/autoclick_unittest.cc
index 713119f..1c8b0e6 100644
--- a/ash/autoclick/autoclick_unittest.cc
+++ b/ash/autoclick/autoclick_unittest.cc
@@ -244,6 +244,10 @@
   EXPECT_FALSE(GetAutoclickController()->IsEnabled());
   events = WaitForMouseEvents();
   EXPECT_EQ(0u, events.size());
+
+  // After disable, autoclick should be set back to left click.
+  EXPECT_EQ(AutoclickEventType::kLeftClick,
+            Shell::Get()->accessibility_controller()->GetAutoclickEventType());
 }
 
 TEST_F(AutoclickTest, MouseMovement) {
diff --git a/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
index a8cbaf5..8c59a1a1 100644
--- a/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
+++ b/ash/components/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -300,7 +300,7 @@
   debounce_timer_.Start(
       FROM_HERE, kTimeOut,
       base::Bind(&KeyboardShortcutView::ShowSearchResults,
-                 base::Unretained(this), sender->search_box()->text()));
+                 base::Unretained(this), sender->search_box()->GetText()));
 }
 
 void KeyboardShortcutView::BackButtonPressed() {
diff --git a/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc b/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
index 9cf7fa1..65f0ecd8 100644
--- a/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
+++ b/ash/components/shortcut_viewer/views/keyboard_shortcut_view_unittest.cc
@@ -179,7 +179,7 @@
   // Press a key should enter search mode.
   KeyPress(ui::VKEY_A, /*should_insert=*/true);
   EXPECT_TRUE(GetSearchBoxView()->back_button()->GetVisible());
-  EXPECT_FALSE(GetSearchBoxView()->search_box()->text().empty());
+  EXPECT_FALSE(GetSearchBoxView()->search_box()->GetText().empty());
 
   // Case 2: Exit search mode by clicking |back_button|. The focus should be on
   // search box.
@@ -188,17 +188,17 @@
       ui::MouseEvent(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
                      base::TimeTicks(), ui::EF_LEFT_MOUSE_BUTTON,
                      ui::EF_LEFT_MOUSE_BUTTON));
-  EXPECT_TRUE(GetSearchBoxView()->search_box()->text().empty());
+  EXPECT_TRUE(GetSearchBoxView()->search_box()->GetText().empty());
   EXPECT_TRUE(GetSearchBoxView()->search_box()->HasFocus());
 
   // Enter search mode again.
   KeyPress(ui::VKEY_A, /*should_insert=*/true);
-  EXPECT_FALSE(GetSearchBoxView()->search_box()->text().empty());
+  EXPECT_FALSE(GetSearchBoxView()->search_box()->GetText().empty());
 
   // Case 3: Exit search mode by pressing |VKEY_ESCAPE|. The focus should be on
   // search box.
   KeyPress(ui::VKEY_ESCAPE, /*should_insert=*/false);
-  EXPECT_TRUE(GetSearchBoxView()->search_box()->text().empty());
+  EXPECT_TRUE(GetSearchBoxView()->search_box()->GetText().empty());
   EXPECT_TRUE(GetSearchBoxView()->search_box()->HasFocus());
 
   // Cleaning up.
diff --git a/ash/components/shortcut_viewer/views/ksv_search_box_view.cc b/ash/components/shortcut_viewer/views/ksv_search_box_view.cc
index 90029175..f06d76b 100644
--- a/ash/components/shortcut_viewer/views/ksv_search_box_view.cc
+++ b/ash/components/shortcut_viewer/views/ksv_search_box_view.cc
@@ -89,7 +89,7 @@
 void KSVSearchBoxView::UpdateSearchBoxBorder() {
   // TODO(wutao): Rename this function or create another function in base class.
   // It updates many things in addition to the border.
-  if (!search_box()->HasFocus() && search_box()->text().empty())
+  if (!search_box()->HasFocus() && search_box()->GetText().empty())
     SetSearchBoxActive(false, ui::ET_UNKNOWN);
 
   constexpr int kBorderThichness = 2;
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc
index 0011a29d..6c1796fd 100644
--- a/ash/extended_desktop_unittest.cc
+++ b/ash/extended_desktop_unittest.cc
@@ -842,13 +842,13 @@
   event_generator->PressKey(ui::VKEY_A, 0);
   event_generator->ReleaseKey(ui::VKEY_A, 0);
   EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
-  EXPECT_EQ("a", base::UTF16ToASCII(textfield->text()));
+  EXPECT_EQ("a", base::UTF16ToASCII(textfield->GetText()));
 
   event_generator->set_current_target(root_windows[1]);
   event_generator->PressKey(ui::VKEY_B, 0);
   event_generator->ReleaseKey(ui::VKEY_B, 0);
   EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
-  EXPECT_EQ("ab", base::UTF16ToASCII(textfield->text()));
+  EXPECT_EQ("ab", base::UTF16ToASCII(textfield->GetText()));
 
   // Deleting 2nd display. The lock window still should get the events.
   UpdateDisplay("100x100");
@@ -856,7 +856,7 @@
   event_generator->PressKey(ui::VKEY_C, 0);
   event_generator->ReleaseKey(ui::VKEY_C, 0);
   EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
-  EXPECT_EQ("abc", base::UTF16ToASCII(textfield->text()));
+  EXPECT_EQ("abc", base::UTF16ToASCII(textfield->GetText()));
 
   // Creating 2nd display again, and lock window still should get events
   // on both root windows.
@@ -866,13 +866,13 @@
   event_generator->PressKey(ui::VKEY_D, 0);
   event_generator->ReleaseKey(ui::VKEY_D, 0);
   EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
-  EXPECT_EQ("abcd", base::UTF16ToASCII(textfield->text()));
+  EXPECT_EQ("abcd", base::UTF16ToASCII(textfield->GetText()));
 
   event_generator->set_current_target(root_windows[1]);
   event_generator->PressKey(ui::VKEY_E, 0);
   event_generator->ReleaseKey(ui::VKEY_E, 0);
   EXPECT_EQ(lock_widget->GetNativeView(), focus_client->GetFocusedWindow());
-  EXPECT_EQ("abcde", base::UTF16ToASCII(textfield->text()));
+  EXPECT_EQ("abcde", base::UTF16ToASCII(textfield->GetText()));
 }
 
 // Verifies that clicking in the primary display and dragging to the secondary
diff --git a/ash/login/ui/lock_contents_view_unittest.cc b/ash/login/ui/lock_contents_view_unittest.cc
index 44ceb2ba..e0a323e 100644
--- a/ash/login/ui/lock_contents_view_unittest.cc
+++ b/ash/login/ui/lock_contents_view_unittest.cc
@@ -2019,9 +2019,9 @@
 
   textfield->SetText(base::ASCIIToUTF16("some_password"));
   // Suspend clears password.
-  EXPECT_FALSE(textfield->text().empty());
+  EXPECT_FALSE(textfield->GetText().empty());
   contents->SuspendImminent(power_manager::SuspendImminent_Reason_LID_CLOSED);
-  EXPECT_TRUE(textfield->text().empty());
+  EXPECT_TRUE(textfield->GetText().empty());
 }
 
 TEST_F(LockContentsViewUnitTest, ArrowNavSingleUser) {
diff --git a/ash/login/ui/lock_screen_sanity_unittest.cc b/ash/login/ui/lock_screen_sanity_unittest.cc
index e68aa322..77d031a 100644
--- a/ash/login/ui/lock_screen_sanity_unittest.cc
+++ b/ash/login/ui/lock_screen_sanity_unittest.cc
@@ -151,22 +151,22 @@
   // Run the browser-process authentication request. Verify that the password is
   // cleared after the ash callback handler has completed and auth has failed.
   submit_password();
-  EXPECT_FALSE(password_test_api.textfield()->text().empty());
-  EXPECT_TRUE(password_test_api.textfield()->read_only());
+  EXPECT_FALSE(password_test_api.textfield()->GetText().empty());
+  EXPECT_TRUE(password_test_api.textfield()->GetReadOnly());
   std::move(callback).Run(false);
   base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(password_test_api.textfield()->text().empty());
-  EXPECT_FALSE(password_test_api.textfield()->read_only());
+  EXPECT_TRUE(password_test_api.textfield()->GetText().empty());
+  EXPECT_FALSE(password_test_api.textfield()->GetReadOnly());
 
   // Repeat the above process. Verify that the password is not cleared if auth
   // succeeds.
   submit_password();
-  EXPECT_FALSE(password_test_api.textfield()->text().empty());
-  EXPECT_TRUE(password_test_api.textfield()->read_only());
+  EXPECT_FALSE(password_test_api.textfield()->GetText().empty());
+  EXPECT_TRUE(password_test_api.textfield()->GetReadOnly());
   std::move(callback).Run(true);
   base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(password_test_api.textfield()->text().empty());
-  EXPECT_TRUE(password_test_api.textfield()->read_only());
+  EXPECT_FALSE(password_test_api.textfield()->GetText().empty());
+  EXPECT_TRUE(password_test_api.textfield()->GetReadOnly());
 }
 
 // Verifies that tabbing from the lock screen will eventually focus the shelf.
@@ -423,13 +423,13 @@
   ui::test::EventGenerator* generator = GetEventGenerator();
   generator->PressKey(ui::KeyboardCode::VKEY_V, ui::EF_CONTROL_DOWN);
 
-  EXPECT_TRUE(text_input->text().empty());
+  EXPECT_TRUE(text_input->GetText().empty());
 
   LockScreen::Get()->Destroy();
   text_input->RequestFocus();
   generator->PressKey(ui::KeyboardCode::VKEY_V, ui::EF_CONTROL_DOWN);
 
-  EXPECT_EQ(base::UTF8ToUTF16("password"), text_input->text());
+  EXPECT_EQ(base::UTF8ToUTF16("password"), text_input->GetText());
 }
 
 }  // namespace ash
diff --git a/ash/login/ui/login_auth_user_view_unittest.cc b/ash/login/ui/login_auth_user_view_unittest.cc
index 34b970c..cab177f 100644
--- a/ash/login/ui/login_auth_user_view_unittest.cc
+++ b/ash/login/ui/login_auth_user_view_unittest.cc
@@ -167,7 +167,7 @@
        PasswordClearedAfterAnimationIfPasswordDisabled) {
   LoginPasswordView::TestApi password_test(view_->password_view());
   auto has_password = [&]() {
-    return !password_test.textfield()->text().empty();
+    return !password_test.textfield()->GetText().empty();
   };
 
   // Set a password.
@@ -209,7 +209,7 @@
   base::RunLoop().RunUntilIdle();
 
   LoginPasswordView::TestApi password_test(test_auth_user_view.password_view());
-  EXPECT_FALSE(password_test.textfield()->read_only());
+  EXPECT_FALSE(password_test.textfield()->GetReadOnly());
   EXPECT_TRUE(test_auth_user_view.external_binary_auth_button()->state() ==
               views::Button::STATE_NORMAL);
   EXPECT_TRUE(
diff --git a/ash/login/ui/login_password_view.cc b/ash/login/ui/login_password_view.cc
index 7776ad4d..6082a7d 100644
--- a/ash/login/ui/login_password_view.cc
+++ b/ash/login/ui/login_password_view.cc
@@ -473,7 +473,7 @@
   textfield_->SetText(base::string16());
   // |ContentsChanged| won't be called by |Textfield| if the text is changed
   // by |Textfield::SetText()|.
-  ContentsChanged(textfield_, textfield_->text());
+  ContentsChanged(textfield_, textfield_->GetText());
 }
 
 void LoginPasswordView::InsertNumber(int value) {
@@ -545,7 +545,7 @@
 bool LoginPasswordView::HandleKeyEvent(views::Textfield* sender,
                                        const ui::KeyEvent& key_event) {
   // Treat the password field as normal if it has text
-  if (!textfield_->text().empty())
+  if (!textfield_->GetText().empty())
     return false;
 
   if (key_event.type() != ui::ET_KEY_PRESSED)
@@ -569,8 +569,9 @@
 }
 
 void LoginPasswordView::UpdateUiState() {
-  bool is_enabled = !textfield_->read_only() &&
-                    (enabled_on_empty_password_ || !textfield_->text().empty());
+  bool is_enabled =
+      !textfield_->GetReadOnly() &&
+      (enabled_on_empty_password_ || !textfield_->GetText().empty());
   submit_button_->SetEnabled(is_enabled);
   SkColor color = is_enabled
                       ? login_constants::kButtonEnabledColor
@@ -588,9 +589,9 @@
 
 void LoginPasswordView::SubmitPassword() {
   DCHECK(submit_button_->GetEnabled());
-  if (textfield_->read_only())
+  if (textfield_->GetReadOnly())
     return;
-  on_submit_.Run(textfield_->text());
+  on_submit_.Run(textfield_->GetText());
 }
 
 }  // namespace ash
diff --git a/ash/login/ui/parent_access_view.cc b/ash/login/ui/parent_access_view.cc
index f1bf2683..651e17a2 100644
--- a/ash/login/ui/parent_access_view.cc
+++ b/ash/login/ui/parent_access_view.cc
@@ -160,8 +160,9 @@
     // {number of fields}"
     node_data->RemoveState(ax::mojom::State::kEditable);
     node_data->role = ax::mojom::Role::kListItem;
-    base::string16 description =
-        text().empty() ? accessible_description_ : text();
+    base::string16 description = views::Textfield::GetText().empty()
+                                     ? accessible_description_
+                                     : GetText();
     node_data->AddStringAttribute(ax::mojom::StringAttribute::kRoleDescription,
                                   base::UTF16ToUTF8(description));
   }
@@ -265,12 +266,12 @@
     std::string result;
     size_t length;
     for (auto* field : input_fields_) {
-      length = field->text().length();
+      length = field->GetText().length();
       if (!length)
         return base::nullopt;
 
       DCHECK_EQ(1u, length);
-      base::StrAppend(&result, {base::UTF16ToUTF8(field->text())});
+      base::StrAppend(&result, {base::UTF16ToUTF8(field->GetText())});
     }
     return result;
   }
@@ -390,7 +391,7 @@
   }
 
   // Returns text in the active input field.
-  const base::string16& ActiveInput() const { return ActiveField()->text(); }
+  const base::string16& ActiveInput() const { return ActiveField()->GetText(); }
 
   // To be called when access input code changes (digit is inserted, deleted or
   // updated). Passes true when code is complete (all digits have input value)
diff --git a/ash/magnifier/docked_magnifier_controller_impl.cc b/ash/magnifier/docked_magnifier_controller_impl.cc
index d0ae9d1f..b14388b 100644
--- a/ash/magnifier/docked_magnifier_controller_impl.cc
+++ b/ash/magnifier/docked_magnifier_controller_impl.cc
@@ -743,6 +743,13 @@
   //    and magnified.
   viewport_magnifier_layer_ =
       std::make_unique<ui::Layer>(ui::LAYER_SOLID_COLOR);
+  // There are situations that the content rect for the magnified container gets
+  // larger than its bounds (e.g. shelf stretches beyond the screen to allow it
+  // being dragged up, or contents of mouse pointer might go beyond screen when
+  // the pointer is at the edges of the screen). To avoid this extra content
+  // becoming visible in the magnifier, magnifier layer should clip its contents
+  // to its bounds.
+  viewport_magnifier_layer_->SetMasksToBounds(true);
   viewport_layer->Add(viewport_magnifier_layer_.get());
   viewport_layer->SetMasksToBounds(true);
 
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc
index 97a2f0116..9f64a75 100644
--- a/ash/public/cpp/ash_features.cc
+++ b/ash/public/cpp/ash_features.cc
@@ -87,6 +87,9 @@
 const base::Feature kSwapSideVolumeButtonsForOrientation{
     "SwapSideVolumeButtonsForOrientation", base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kUnifiedMessageCenterRefactor{
+    "UnifiedMessageCenterRefactor", base::FEATURE_DISABLED_BY_DEFAULT};
+
 bool IsHideArcMediaNotificationsEnabled() {
   return base::FeatureList::IsEnabled(kMediaSessionNotification) &&
          base::FeatureList::IsEnabled(kHideArcMediaNotifications);
@@ -156,5 +159,9 @@
   return base::FeatureList::IsEnabled(kSwapSideVolumeButtonsForOrientation);
 }
 
+bool IsUnifiedMessageCenterRefactorEnabled() {
+  return base::FeatureList::IsEnabled(kUnifiedMessageCenterRefactor);
+}
+
 }  // namespace features
 }  // namespace ash
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h
index faf5103..6872e542 100644
--- a/ash/public/cpp/ash_features.h
+++ b/ash/public/cpp/ash_features.h
@@ -107,6 +107,10 @@
 ASH_PUBLIC_EXPORT extern const base::Feature
     kSwapSideVolumeButtonsForOrientation;
 
+// Enables refactored UnifiedMessageCenter which is completely separated from
+// the UnifiedSystemTrayView.
+ASH_PUBLIC_EXPORT extern const base::Feature kUnifiedMessageCenterRefactor;
+
 ASH_PUBLIC_EXPORT bool IsHideArcMediaNotificationsEnabled();
 
 ASH_PUBLIC_EXPORT bool IsKeyboardShortcutViewerAppEnabled();
@@ -139,6 +143,8 @@
 
 ASH_PUBLIC_EXPORT bool IsSwapSideVolumeButtonsForOrientationEnabled();
 
+ASH_PUBLIC_EXPORT bool IsUnifiedMessageCenterRefactorEnabled();
+
 }  // namespace features
 }  // namespace ash
 
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 1351225..8197553 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -3225,7 +3225,6 @@
       "android/java/src/org/chromium/base/annotations/CalledByNative.java",
       "android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
       "android/java/src/org/chromium/base/annotations/DoNotInline.java",
-      "android/java/src/org/chromium/base/annotations/JCaller.java",
       "android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
       "android/java/src/org/chromium/base/annotations/JNINamespace.java",
       "android/java/src/org/chromium/base/annotations/JniIgnoreNatives.java",
diff --git a/base/android/java/src/org/chromium/base/annotations/JCaller.java b/base/android/java/src/org/chromium/base/annotations/JCaller.java
deleted file mode 100644
index 4a8e31e..0000000
--- a/base/android/java/src/org/chromium/base/annotations/JCaller.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 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.
-
-package org.chromium.base.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * JCaller is used on the first parameter in a static native function to
- * indicate that the JNI generator should pass in the parameter annotated
- * with JCaller first, as if the function was non-static and being called on
- * the object annotated by JCaller.
- *
- * For example the following functions will call the same cpp method:
- *
- * class A() {
- *    native void nativeFoo(long nativeCppClass);
- * }
- *
- * static native void nativeFoo(@JCaller A a, long nativeCppClass);
- *
- * @NativeMethods
- * interface Natives {
- *    void foo(@JCaller A a, long nativeCppClass);
- * }
- *
- * Will all call CppClass::Foo(JavaParamRef<jobject> jcaller)
- * and jobject will be an instance of A.
- */
-@Target(ElementType.PARAMETER)
-@Retention(RetentionPolicy.SOURCE)
-public @interface JCaller {}
diff --git a/base/android/jni_generator/README.md b/base/android/jni_generator/README.md
index 33a7008..2d15c7af 100644
--- a/base/android/jni_generator/README.md
+++ b/base/android/jni_generator/README.md
@@ -123,13 +123,6 @@
   /* package */ interface Natives {
     void foo();
     double bar(int a, int b);
-    // @JCaller is passed to C++ as the java "this" object, and nativeClassName
-    // as the C++ "this" object.
-    //
-    // If the C++ object does not use its Java caller in this method, you may
-    // omit the @JCaller parameter here. The C++ method still must have a caller
-    // parameter, but it will not be an instance of NewStyle.
-    //
     // Either the |ClassName| part of the |nativeClassName| parameter name must
     // match the native class name exactly, or the method annotation
     // @NativeClassQualifiedName("ClassName") must be used.
@@ -137,7 +130,7 @@
     // If the native class is nested, use
     // @NativeClassQualifiedName("FooClassName::BarClassName") and call the
     // parameter |nativePointer|.
-    void nonStatic(@JCaller NewStyle self, long nativeClassName);
+    void nonStatic(long nativeClassName, NewStyle self);
   }
 
   void callNatives() {
diff --git a/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden b/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
index 79c20bb8..95ee8824 100644
--- a/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
+++ b/base/android/jni_generator/golden/testNativeExportsOnlyOption.golden
@@ -76,12 +76,12 @@
 JNI_GENERATOR_EXPORT jint
     Java_org_chromium_example_jni_1generator_SampleForTests_nativeStaticMethod(
     JNIEnv* env,
-    jobject jcaller,
+    jclass jcaller,
     jlong nativeTest,
     jint arg1) {
   Test* native = reinterpret_cast<Test*>(nativeTest);
   CHECK_NATIVE_PTR(env, jcaller, native, "StaticMethod", 0);
-  return native->StaticMethod(env, base::android::JavaParamRef<jobject>(env, jcaller), arg1);
+  return native->StaticMethod(env, arg1);
 }
 
 JNI_GENERATOR_EXPORT jint Java_org_chromium_example_jni_1generator_SampleForTests_nativeMethod(
diff --git a/base/android/jni_generator/golden/testProxyNativesWithNatives.golden b/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
index e0b3576..728d604 100644
--- a/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
+++ b/base/android/jni_generator/golden/testProxyNativesWithNatives.golden
@@ -94,9 +94,9 @@
 
 JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1baz(
     JNIEnv* env,
-    jobject jcaller,
-    jobject caller,
-    jlong nativePtr) {
+    jclass jcaller,
+    jlong nativePtr,
+    jobject caller) {
   TRACE_EVENT0("jni", "Ptr::Baz");
   Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
   CHECK_NATIVE_PTR(env, jcaller, native, "Baz");
@@ -105,12 +105,12 @@
 
 JNI_GENERATOR_EXPORT void Java_org_chromium_base_natives_GEN_1JNI_org_1chromium_1foo_1Foo_1fooBar(
     JNIEnv* env,
-    jobject jcaller,
+    jclass jcaller,
     jlong nativePtr) {
   TRACE_EVENT0("jni", "Ptr::FooBar");
   Ptr* native = reinterpret_cast<Ptr*>(nativePtr);
   CHECK_NATIVE_PTR(env, jcaller, native, "FooBar");
-  return native->FooBar(env, base::android::JavaParamRef<jobject>(env, jcaller));
+  return native->FooBar(env);
 }
 
 
diff --git a/base/android/jni_generator/golden/testStaticBindingCaller.golden b/base/android/jni_generator/golden/testStaticBindingCaller.golden
index 9512534..f618859 100644
--- a/base/android/jni_generator/golden/testStaticBindingCaller.golden
+++ b/base/android/jni_generator/golden/testStaticBindingCaller.golden
@@ -59,9 +59,9 @@
 
 JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeFoo(
     JNIEnv* env,
-    jobject jcaller,
-    jobject caller,
-    jlong nativeNativeObject) {
+    jclass jcaller,
+    jlong nativeNativeObject,
+    jobject caller) {
   NativeObject* native = reinterpret_cast<NativeObject*>(nativeNativeObject);
   CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
   return native->Foo(env, base::android::JavaParamRef<jobject>(env, caller));
@@ -69,9 +69,9 @@
 
 JNI_GENERATOR_EXPORT void Java_org_chromium_foo_Foo_nativeFoo(
     JNIEnv* env,
-    jobject jcaller,
-    jobject caller,
+    jclass jcaller,
     jlong nativeNativeObject,
+    jobject caller,
     jint a) {
   NativeObject* native = reinterpret_cast<NativeObject*>(nativeNativeObject);
   CHECK_NATIVE_PTR(env, jcaller, native, "Foo");
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 6605e6f..06ba6bd1 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -137,25 +137,16 @@
 
     self.proxy_name = kwargs.get('proxy_name', self.name)
 
-    has_jcaller = False
     if self.params:
       assert type(self.params) is list
       assert type(self.params[0]) is Param
 
-      for p in self.params[1:]:
-        assert '@JCaller' not in p.annotations, ('Only the first parameter can '
-                                                 'be annotated with @JCaller')
 
-      if '@JCaller' in self.params[0].annotations:
-        has_jcaller = True
-
-    ptr_index = 1 if has_jcaller else 0
-
-    if (self.params and len(self.params) > ptr_index
-        and self.params[ptr_index].datatype == kwargs.get('ptr_type', 'int')
-        and self.params[ptr_index].name.startswith('native')):
+    if (self.params
+        and self.params[0].datatype == kwargs.get('ptr_type', 'int')
+        and self.params[0].name.startswith('native')):
       self.type = 'method'
-      self.p0_type = self.params[ptr_index].name[len('native'):]
+      self.p0_type = self.params[0].name[len('native'):]
       if kwargs.get('native_class_name'):
         self.p0_type = kwargs['native_class_name']
     else:
@@ -260,14 +251,9 @@
   return java_pod_type_map.get(java_type, 'NULL')
 
 
-def _GetJNIFirstParamType(native):
-  if native.type == 'function' and native.static:
-    return 'jclass'
-  return 'jobject'
-
-
 def _GetJNIFirstParam(native, for_declaration):
-  c_type = _GetJNIFirstParamType(native)
+  c_type = 'jclass' if native.static else 'jobject'
+
   if for_declaration:
     c_type = WrapCTypeForDeclaration(c_type)
   return [c_type + ' jcaller']
@@ -1226,10 +1212,6 @@
             name,
         })
 
-  def GetJNIFirstParamForCall(self, native):
-    c_type = _GetJNIFirstParamType(native)
-    return [self.GetJavaParamRefForCall(c_type, 'jcaller')]
-
   def GetImplementationMethodName(self, native):
     class_name = self.class_name
     if native.java_class_name is not None:
@@ -1242,17 +1224,14 @@
     is_method = native.type == 'method'
 
     if is_method:
-      if '@JCaller' in native.params[0].annotations:
-        # Native pointer is second param.
-        params = [native.params[0]] + native.params[2:]
-      else:
-        params = native.params[1:]
+      params = native.params[1:]
     else:
       params = native.params
 
     params_in_call = ['env']
-    if not native.static or is_method:
-      params_in_call.extend(self.GetJNIFirstParamForCall(native))
+    if not native.static:
+      # Add jcaller param.
+      params_in_call.append(self.GetJavaParamRefForCall('jobject', 'jcaller'))
 
     for p in params:
       c_type = JavaDataTypeToC(p.datatype)
@@ -1262,27 +1241,6 @@
         params_in_call.append(p.name)
 
     params_in_declaration = _GetParamsInDeclaration(native)
-    native_ptr_index = 0
-    if native.static:
-      # If a param is annotation with @JCaller we bind it in the same way
-      # as we'd bind a non-static function (JavaParamRef<jobject> caller will
-      # be the first parameter).
-      # This allows for conversion of non-static to static functions without
-      # touching the native implementation and allows for the JNI annotation
-      # processor to generate bindings for methods that can behave like
-      # non-static methods.
-      if native.params:
-        if '@JCaller' in native.params[0].annotations:
-          if is_method:
-            # Since is_method we have an extra param that isn't in the call
-            # (long nativePtr).
-            native_ptr_index = 1
-            # Replace <jobject> jcaller with @JCaller.
-            params_in_call[1:2] = []
-          # Don't need to do anything for functions since the jobject
-          # will be passed first anyways since we exclude jclass from our
-          # impl signature.
-
     params_in_call = ', '.join(params_in_call)
 
     return_type = return_declaration = JavaDataTypeToC(native.return_type)
@@ -1316,7 +1274,7 @@
         optional_error_return = ', ' + optional_error_return
       values.update({
           'OPTIONAL_ERROR_RETURN': optional_error_return,
-          'PARAM0_NAME': native.params[native_ptr_index].name,
+          'PARAM0_NAME': native.params[0].name,
           'P0_TYPE': native.p0_type,
       })
       if self.options.enable_tracing:
diff --git a/base/android/jni_generator/jni_generator_tests.py b/base/android/jni_generator/jni_generator_tests.py
index 8ff7dfc6..ce530b36 100755
--- a/base/android/jni_generator/jni_generator_tests.py
+++ b/base/android/jni_generator/jni_generator_tests.py
@@ -1274,12 +1274,10 @@
     package org.chromium.foo;
 
     class Bar {
-      static native void nativeShouldBindCaller(@JCaller Object caller);
-      static native void nativeShouldBindCaller(@JCaller Object caller, int a);
-      static native void nativeFoo(@JCaller Bar caller,
-                          long nativeNativeObject);
-      static native void nativeFoo(@JCaller Bar caller,
-                          long nativeNativeObject, int a);
+      static native void nativeShouldBindCaller(Object caller);
+      static native void nativeShouldBindCaller(Object caller, int a);
+      static native void nativeFoo(long nativeNativeObject, Bar caller);
+      static native void nativeFoo(long nativeNativeObject, Bar caller, int a);
       native void nativeCallNativeMethod(long nativePtr);
     }
     """
@@ -1314,7 +1312,7 @@
        void foo();
        String bar(String s, int y, char x, short z);
        String[] foobar(String[] a);
-       void baz(@JCaller BazClass caller, long nativePtr);
+       void baz(long nativePtr, BazClass caller);
        void fooBar(long nativePtr);
     }
 
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 5826ab5..66f3b325 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -293,8 +293,10 @@
     }
 
     # Linker warnings.
-    if (fatal_linker_warnings && !(is_android && use_order_profiling) &&
-        !is_mac && !is_ios && current_os != "aix") {
+    if (fatal_linker_warnings && !(is_chromeos && current_cpu == "arm") &&
+        !(is_android && use_order_profiling) && !is_mac && !is_ios &&
+        current_os != "aix") {
+      # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580
       # TODO(lizeb,pasko): Fix link errors when linking with order_profiling=1
       # crbug.com/485542
       ldflags += [ "-Wl,--fatal-warnings" ]
diff --git a/build/config/win/BUILD.gn b/build/config/win/BUILD.gn
index a6c0aeaf..781aeaa 100644
--- a/build/config/win/BUILD.gn
+++ b/build/config/win/BUILD.gn
@@ -82,19 +82,19 @@
   ]
 
   if (msvc_use_absolute_paths) {
-    # Pass /FC flag to the compiler if needed.
-    cflags += [ "/FC" ]
-
-    # Print absolute paths in diagnostics. There is no precedent for doing this
-    # on Linux/Mac (GCC doesn't support it), but MSVC does this with /FC and
-    # Windows developers rely on it (crbug.com/636109) so only do this on
-    # Windows.
+    # MSVC used to require absolute paths in its diagnostics to be able to
+    # click them. cl.exe only has "/FC" for this, which also affects __FILE__
+    # and other things, which is bad for build determinism.
+    # clang-cl has a more targeted flag (and silently ignores /FC because it's
+    # bad for build determinism), so use the better flag there.
     # TODO(thakis): This comment no longer really make sense after
     # https://chromium-review.googlesource.com/c/chromium/src/+/558871/
     # See if we can remove msvc_use_absolute_paths. See also discussion in
     # https://reviews.llvm.org/D23816
     if (is_clang) {
       cflags += [ "-fdiagnostics-absolute-paths" ]
+    } else {
+      cflags += [ "/FC" ]
     }
   }
 
diff --git a/cc/tiles/gpu_image_decode_cache.cc b/cc/tiles/gpu_image_decode_cache.cc
index 78dd9c6..27fe252 100644
--- a/cc/tiles/gpu_image_decode_cache.cc
+++ b/cc/tiles/gpu_image_decode_cache.cc
@@ -485,6 +485,13 @@
   return uploaded_image;
 }
 
+size_t GetUploadedTextureSizeFromSkImage(const sk_sp<SkImage>& plane,
+                                         const GrMipMapped mipped) {
+  const size_t plane_size = GrContext::ComputeTextureSize(
+      plane->colorType(), plane->width(), plane->height(), mipped);
+  return plane_size;
+}
+
 }  // namespace
 
 // static
@@ -1271,6 +1278,71 @@
   return max_working_set_bytes_;
 }
 
+void GpuImageDecodeCache::AddTextureDump(
+    base::trace_event::ProcessMemoryDump* pmd,
+    const std::string& texture_dump_name,
+    const size_t bytes,
+    const GrGLuint gl_id,
+    const size_t locked_size) const {
+  using base::trace_event::MemoryAllocatorDump;
+  using base::trace_event::MemoryAllocatorDumpGuid;
+
+  MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(texture_dump_name);
+  dump->AddScalar(MemoryAllocatorDump::kNameSize,
+                  MemoryAllocatorDump::kUnitsBytes, bytes);
+
+  // Dump the "locked_size" as an additional column.
+  dump->AddScalar("locked_size", MemoryAllocatorDump::kUnitsBytes, locked_size);
+
+  MemoryAllocatorDumpGuid guid;
+  guid = gl::GetGLTextureClientGUIDForTracing(
+      context_->ContextSupport()->ShareGroupTracingGUID(), gl_id);
+  pmd->CreateSharedGlobalAllocatorDump(guid);
+  // Importance of 3 gives this dump priority over the dump made by Skia
+  // (importance 2), attributing memory here.
+  const int kImportance = 3;
+  pmd->AddOwnershipEdge(dump->guid(), guid, kImportance);
+}
+
+void GpuImageDecodeCache::MemoryDumpYUVImage(
+    base::trace_event::ProcessMemoryDump* pmd,
+    const ImageData* image_data,
+    const std::string& dump_base_name,
+    size_t locked_size) const {
+  using base::trace_event::MemoryAllocatorDump;
+  DCHECK(image_data->is_yuv);
+  DCHECK(image_data->upload.has_yuv_planes());
+
+  struct PlaneMemoryDumpInfo {
+    size_t byte_size;
+    GrGLuint gl_id;
+  };
+  std::vector<PlaneMemoryDumpInfo> plane_dump_infos;
+  const GrMipMapped mipped =
+      image_data->needs_mips ? GrMipMapped::kYes : GrMipMapped::kNo;
+  // TODO(crbug.com/910276): Also include alpha plane if applicable.
+  plane_dump_infos.push_back(
+      {GetUploadedTextureSizeFromSkImage(image_data->upload.y_image(), mipped),
+       image_data->upload.gl_y_id()});
+  plane_dump_infos.push_back(
+      {GetUploadedTextureSizeFromSkImage(image_data->upload.u_image(), mipped),
+       image_data->upload.gl_u_id()});
+  plane_dump_infos.push_back(
+      {GetUploadedTextureSizeFromSkImage(image_data->upload.v_image(), mipped),
+       image_data->upload.gl_v_id()});
+
+  for (size_t i = 0u; i < plane_dump_infos.size(); ++i) {
+    auto plane_dump_info = plane_dump_infos.at(i);
+    // If the image is currently locked, we dump the locked size per plane.
+    AddTextureDump(
+        pmd,
+        dump_base_name +
+            base::StringPrintf("/plane_%0u", base::checked_cast<uint32_t>(i)),
+        plane_dump_info.byte_size, plane_dump_info.gl_id,
+        locked_size ? plane_dump_info.byte_size : 0u);
+  }
+}
+
 bool GpuImageDecodeCache::OnMemoryDump(
     const base::trace_event::MemoryDumpArgs& args,
     base::trace_event::ProcessMemoryDump* pmd) {
@@ -1335,38 +1407,17 @@
         discardable_size = 0;
       }
 
-      std::string gpu_dump_name = base::StringPrintf(
+      std::string gpu_dump_base_name = base::StringPrintf(
           "cc/image_memory/cache_0x%" PRIXPTR "/gpu/image_%d",
           reinterpret_cast<uintptr_t>(this), image_id);
-      MemoryAllocatorDump* dump = pmd->CreateAllocatorDump(gpu_dump_name);
-      dump->AddScalar(MemoryAllocatorDump::kNameSize,
-                      MemoryAllocatorDump::kUnitsBytes, discardable_size);
-
-      // Dump the "locked_size" as an additional column.
       size_t locked_size =
           image_data->upload.is_locked() ? discardable_size : 0u;
-      dump->AddScalar("locked_size", MemoryAllocatorDump::kUnitsBytes,
-                      locked_size);
-
-      // TODO(crbug.com/919296): Dump additional plane information for YUV.
-      // Create globally shared GUID(s) to associate this data with its
-      // GPU process counterpart.
-      MemoryAllocatorDumpGuid guid;
-      if (image_data->is_yuv) {  // Choose luma plane for identifying texture.
-        guid = gl::GetGLTextureClientGUIDForTracing(
-            context_->ContextSupport()->ShareGroupTracingGUID(),
-            image_data->upload.gl_y_id());
+      if (image_data->is_yuv) {
+        MemoryDumpYUVImage(pmd, image_data, gpu_dump_base_name, locked_size);
       } else {
-        guid = gl::GetGLTextureClientGUIDForTracing(
-            context_->ContextSupport()->ShareGroupTracingGUID(),
-            image_data->upload.gl_id());
+        AddTextureDump(pmd, gpu_dump_base_name, discardable_size,
+                       image_data->upload.gl_id(), locked_size);
       }
-      // kImportance is somewhat arbitrary - we chose 3 to be higher than the
-      // value used in the GPU process (1), and Skia (2), causing us to appear
-      // as the owner in memory traces.
-      const int kImportance = 3;
-      pmd->CreateSharedGlobalAllocatorDump(guid);
-      pmd->AddOwnershipEdge(dump->guid(), guid, kImportance);
     }
   }
 
diff --git a/cc/tiles/gpu_image_decode_cache.h b/cc/tiles/gpu_image_decode_cache.h
index 638a77f2..ecc6b0b8b 100644
--- a/cc/tiles/gpu_image_decode_cache.h
+++ b/cc/tiles/gpu_image_decode_cache.h
@@ -656,6 +656,26 @@
   sk_sp<SkColorSpace> ColorSpaceForImageDecode(const DrawImage& image,
                                                DecodedDataMode mode) const;
 
+  // Helper function to add a memory dump to |pmd| for a single texture
+  // identified by |gl_id| with size |bytes| and |locked_size| equal to either
+  // |bytes| or 0 depending on whether the texture is currently locked.
+  void AddTextureDump(base::trace_event::ProcessMemoryDump* pmd,
+                      const std::string& texture_dump_name,
+                      const size_t bytes,
+                      const GrGLuint gl_id,
+                      const size_t locked_size) const;
+
+  // Alias each texture of the YUV image entry to its Skia texture counterpart,
+  // taking ownership of the memory and preventing double counting.
+  //
+  // Given |dump_base_name| as the location where single RGB image textures are
+  // dumped, this method creates dumps under |pmd| for the planar textures
+  // backing |image_data| as subcategories plane_0, plane_1, etc.
+  void MemoryDumpYUVImage(base::trace_event::ProcessMemoryDump* pmd,
+                          const ImageData* image_data,
+                          const std::string& dump_base_name,
+                          size_t locked_size) const;
+
   // |persistent_cache_| represents the long-lived cache, keeping a certain
   // budget of ImageDatas alive even when their ref count reaches zero.
   using PersistentCache = base::HashingMRUCache<PaintImage::FrameKey,
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 5270f43..c458d0d 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -716,6 +716,10 @@
   return result;
 }
 
+void LayerTreeHost::UpdatePropertyTrees() {
+  draw_property_utils::UpdatePropertyTrees(this, &property_trees_);
+}
+
 void LayerTreeHost::DidPresentCompositorFrame(
     uint32_t frame_token,
     std::vector<LayerTreeHost::PresentationTimeCallback> callbacks,
@@ -847,7 +851,7 @@
   CHECK(property_trees_.effect_tree.Node(root_layer_->effect_tree_index()));
 #endif
 
-  draw_property_utils::UpdatePropertyTrees(this, &property_trees_);
+  UpdatePropertyTrees();
 
   LayerList update_layer_list;
   draw_property_utils::FindLayersThatNeedUpdates(this, &property_trees_,
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 54000cfe..8f80914 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -586,6 +586,7 @@
     client_->DidReceiveCompositorFrameAck();
   }
   bool UpdateLayers();
+  void UpdatePropertyTrees();
   void DidPresentCompositorFrame(
       uint32_t frame_token,
       std::vector<LayerTreeHost::PresentationTimeCallback> callbacks,
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index 179d787b..1b355b24 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -1636,6 +1636,7 @@
     "//chrome/browser/resources:net_internals_resources",
     "//chrome/browser/resources:quota_internals_resources",
     "//chrome/browser/resources:webapks_ui_resources",
+    "//chrome/browser/resources/bluetooth_internals:resources",
     "//components/autofill/core/browser:autofill_address_rewriter_resources",
   ]
 
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index c4ba19b..9637bff 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1222,23 +1222,23 @@
   "java/src/org/chromium/chrome/browser/preferences/AboutChromePreferenceOSVersion.java",
   "java/src/org/chromium/chrome/browser/preferences/AboutChromePreferences.java",
   "java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/ButtonPreferenceCompat.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreferenceCompat.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreferenceCompat.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeBasePreferenceCompat.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreferenceCompat.java",
+  "java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java",
+  "java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java",
+  "java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreference.java",
+  "java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java",
+  "java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/ChromePreferenceManager.java",
-  "java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreferenceCompat.java",
+  "java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java",
   "java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java",
   "java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java",
   "java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/LearnMorePreferenceCompat.java",
+  "java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java",
   "java/src/org/chromium/chrome/browser/preferences/LegalInformationPreferences.java",
   "java/src/org/chromium/chrome/browser/preferences/LocationSettings.java",
   "java/src/org/chromium/chrome/browser/preferences/MainPreferences.java",
-  "java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegateCompat.java",
+  "java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java",
   "java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java",
   "java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java",
   "java/src/org/chromium/chrome/browser/preferences/PrefChangeRegistrar.java",
@@ -1260,7 +1260,7 @@
   "java/src/org/chromium/chrome/browser/preferences/sync/SyncPreferenceUtils.java",
   "java/src/org/chromium/chrome/browser/preferences/sync/SyncedAccountPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/TextAndButtonPreference.java",
-  "java/src/org/chromium/chrome/browser/preferences/TextMessagePreferenceCompat.java",
+  "java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java",
   "java/src/org/chromium/chrome/browser/preferences/TextScalePreference.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppPreference.java",
   "java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
index f593c37..3165381 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/header/AssistantHeaderViewBinder.java
@@ -137,7 +137,7 @@
         view.mProfileIconMenu.setOnMenuItemClickListener(item -> {
             int itemId = item.getItemId();
             if (itemId == R.id.settings) {
-                PreferencesLauncher.launchSettingsPageCompat(
+                PreferencesLauncher.launchSettingsPage(
                         view.mHeader.getContext(), AutofillAssistantPreferences.class);
                 return true;
             } else if (itemId == R.id.send_feedback) {
diff --git a/chrome/android/java/res/layout/context_menu_divider.xml b/chrome/android/java/res/layout/context_menu_divider.xml
index 51785dc..004c0d1f 100644
--- a/chrome/android/java/res/layout/context_menu_divider.xml
+++ b/chrome/android/java/res/layout/context_menu_divider.xml
@@ -6,9 +6,8 @@
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:paddingTop="@dimen/revamped_context_menu_divider_padding"
-    android:paddingBottom="@dimen/revamped_context_menu_divider_padding">
-
-
+    android:paddingBottom="@dimen/revamped_context_menu_divider_padding"
+    android:importantForAccessibility="no">
     <!-- TODO(sinansahin): divider_preference can be renamed to horizontal_divider -->
     <include layout="@layout/divider_preference" />
 </FrameLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index 5b41c992..ccef52bd 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -246,8 +246,8 @@
         <item name="preferenceFragmentCompatStyle">@style/Theme.Chromium.PreferenceFragment</item>
         <item name="preferenceFragmentListStyle">@style/Theme.Chromium.PreferenceFragmentList</item>
         <item name="dialogPreferenceStyle">@style/Theme.Chromium.DialogPreference</item>
-        <item name="checkBoxPreferenceStyle">@style/Theme.Chromium.CheckBoxPreferenceCompat</item>
-        <item name="switchPreferenceCompatStyle">@style/Theme.Chromium.SwitchPreferenceCompat</item>
+        <item name="checkBoxPreferenceStyle">@style/Theme.Chromium.CheckBoxPreference</item>
+        <item name="switchPreferenceCompatStyle">@style/Theme.Chromium.SwitchPreference</item>
     </style>
 
     <style name="Theme.Chromium.PreferenceFragment">
@@ -288,7 +288,7 @@
         <item name="android:negativeButtonText">@android:string/cancel</item>
     </style>
 
-    <style name="Theme.Chromium.CheckBoxPreferenceCompat">
+    <style name="Theme.Chromium.CheckBoxPreference">
         <item name="android:layout">@layout/preference_compat</item>
         <item name="android:widgetLayout">@layout/preference_widget_checkbox</item>
     </style>
@@ -305,7 +305,7 @@
         <item name="android:textAllCaps">true</item>
     </style>
 
-    <style name="Theme.Chromium.SwitchPreferenceCompat">
+    <style name="Theme.Chromium.SwitchPreference">
         <item name="android:layout">@layout/preference_compat</item>
         <item name="android:widgetLayout">@layout/preference_widget_switch_compat</item>
     </style>
diff --git a/chrome/android/java/res/xml/about_chrome_preferences.xml b/chrome/android/java/res/xml/about_chrome_preferences.xml
index a24c0ee2..e1ddc30 100644
--- a/chrome/android/java/res/xml/about_chrome_preferences.xml
+++ b/chrome/android/java/res/xml/about_chrome_preferences.xml
@@ -3,15 +3,15 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <android.support.v7.preference.Preference
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <Preference
         android:key="application_version"
         android:title="@string/application_version_title" />
     <org.chromium.chrome.browser.preferences.AboutChromePreferenceOSVersion
         android:key="os_version"
         android:title="@string/os_version_title" />
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.LegalInformationPreferences"
         android:key="legal_information"
         android:title="@string/legal_information_title" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/accessibility_preferences.xml b/chrome/android/java/res/xml/accessibility_preferences.xml
index 2a57b00..c2b858a 100644
--- a/chrome/android/java/res/xml/accessibility_preferences.xml
+++ b/chrome/android/java/res/xml/accessibility_preferences.xml
@@ -3,30 +3,30 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
     <org.chromium.chrome.browser.preferences.TextScalePreference
         android:key="text_scale"
         android:title="@string/font_size"
         android:selectable="false" />
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="force_enable_zoom"
         android:summary="@string/force_enable_zoom_summary"
         android:title="@string/force_enable_zoom_title" />
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="reader_for_accessibility"
         android:summary="@string/reader_for_accessibility_summary"
         android:title="@string/reader_for_accessibility_title" />
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="accessibility_tab_switcher"
         android:summary="@string/accessibility_tab_switcher_summary"
         android:title="@string/accessibility_tab_switcher_title" />
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="captions"
         android:title="@string/accessibility_captions_title"/>
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/account_management_preferences.xml b/chrome/android/java/res/xml/account_management_preferences.xml
index 6df9b4dc..7639690 100644
--- a/chrome/android/java/res/xml/account_management_preferences.xml
+++ b/chrome/android/java/res/xml/account_management_preferences.xml
@@ -3,40 +3,40 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="accounts_category"
         android:title="@string/account_management_title"/>
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:layout="@layout/divider_preference"/>
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="parental_settings"
         android:title="@string/account_management_parental_settings"/>
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:key="parent_accounts"
         tools:summary="@string/account_management_two_parent_names"/>
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="child_content"
         android:selectable="false"
         android:title="@string/account_management_child_content_title"/>
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="child_content_divider"
         android:layout="@layout/divider_preference"/>
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="sign_out"
         android:title="@string/account_management_sign_out"/>
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="sign_out_divider"
         android:layout="@layout/divider_preference"/>
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
index a183d7f..69be874 100644
--- a/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
+++ b/chrome/android/java/res/xml/autofill_server_profile_preferences.xml
@@ -3,9 +3,9 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="server_profile_description"
         android:selectable="false" />
 
@@ -14,4 +14,4 @@
         android:widgetLayout="@layout/autofill_server_data_edit_link"
         android:title="@string/autofill_from_google_account_long" />
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml b/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
index a8bfb3b9..7464d13c 100644
--- a/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
+++ b/chrome/android/java/res/xml/clear_browsing_data_preferences_tab.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
@@ -44,4 +44,4 @@
         android:key="clear_site_settings_checkbox"
         android:persistent="false"
         android:title="@string/prefs_site_settings" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/contextual_search_preferences.xml b/chrome/android/java/res/xml/contextual_search_preferences.xml
index 4bd9f7b..d50afe589 100644
--- a/chrome/android/java/res/xml/contextual_search_preferences.xml
+++ b/chrome/android/java/res/xml/contextual_search_preferences.xml
@@ -3,17 +3,17 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="contextual_search_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:title="@string/contextual_search_description"
         app:allowDividerBelow="false" />
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/data_reduction_preferences.xml b/chrome/android/java/res/xml/data_reduction_preferences.xml
index 9fe40c9..6db42a0 100644
--- a/chrome/android/java/res/xml/data_reduction_preferences.xml
+++ b/chrome/android/java/res/xml/data_reduction_preferences.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <org.chromium.chrome.browser.preferences.datareduction.DataReductionStatsPreference
@@ -12,4 +12,4 @@
         android:selectable="false"
         app:allowDividerAbove="true" />
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml b/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml
index feb9ba6..3a13f9d1 100644
--- a/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml
+++ b/chrome/android/java/res/xml/data_reduction_preferences_off_lite_mode.xml
@@ -3,19 +3,19 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
                   xmlns:app="http://schemas.android.com/apk/res-auto" >
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:title="@string/data_reduction_benefits_description_lite_mode"
         app:allowDividerBelow="false" />
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:title="@string/data_reduction_description_lite_mode"
         app:allowDividerBelow="false" />
 
-    <org.chromium.chrome.browser.preferences.LearnMorePreferenceCompat
+    <org.chromium.chrome.browser.preferences.LearnMorePreference
         android:key="data_reduction_learn_more"
         app:helpContext="@string/help_context_data_reduction"
         app:allowDividerBelow="false" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/developer_preferences.xml b/chrome/android/java/res/xml/developer_preferences.xml
index 66db0c7..98a07ef3 100644
--- a/chrome/android/java/res/xml/developer_preferences.xml
+++ b/chrome/android/java/res/xml/developer_preferences.xml
@@ -3,14 +3,14 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:orderingFromXml="true">
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.developer.TracingPreferences"
         android:key="tracing"
         android:title="Tracing" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:enabled="false"
@@ -18,4 +18,4 @@
         android:title="Hint: You can also enable Developer options on Beta/Stable channels by tapping the Chrome version in &quot;Settings > About Chrome&quot; multiple times."
         app:allowDividerAbove="false"
         app:allowDividerBelow="false" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/do_not_track_preferences.xml b/chrome/android/java/res/xml/do_not_track_preferences.xml
index 83339e1..e24ae77 100644
--- a/chrome/android/java/res/xml/do_not_track_preferences.xml
+++ b/chrome/android/java/res/xml/do_not_track_preferences.xml
@@ -3,17 +3,17 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="do_not_track_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:title="@string/do_not_track_description"
         app:allowDividerBelow="false" />
 
-</android.support.v7.preference.PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/res/xml/download_preferences.xml b/chrome/android/java/res/xml/download_preferences.xml
index 894a886..e0ef6f5 100644
--- a/chrome/android/java/res/xml/download_preferences.xml
+++ b/chrome/android/java/res/xml/download_preferences.xml
@@ -3,20 +3,20 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
     <org.chromium.chrome.browser.preferences.download.DownloadLocationPreference
         android:key="location_change"
         android:title="@string/downloads_location_selector_title"
         android:positiveButtonText="@string/done"
         android:negativeButtonText="@null"  />
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="location_prompt_enabled"
         android:title="@string/download_location_prompt_enabled_title"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="prefetching_enabled"
         android:title="@string/download_settings_enable_prefetch_title" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/homepage_preferences.xml b/chrome/android/java/res/xml/homepage_preferences.xml
index 1fd9037..a54efc5 100644
--- a/chrome/android/java/res/xml/homepage_preferences.xml
+++ b/chrome/android/java/res/xml/homepage_preferences.xml
@@ -3,17 +3,17 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="homepage_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off" />
 
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="homepage_edit"
         android:title="@string/options_homepage_edit_label"
         android:fragment="org.chromium.chrome.browser.preferences.HomepageEditor" />
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/languages_preferences.xml b/chrome/android/java/res/xml/languages_preferences.xml
index 8d62f75..64e48b61 100644
--- a/chrome/android/java/res/xml/languages_preferences.xml
+++ b/chrome/android/java/res/xml/languages_preferences.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
 
     <org.chromium.chrome.browser.preferences.languages.LanguageListPreference
@@ -11,9 +11,9 @@
         android:layout="@layout/languages_preference"
         android:widgetLayout="@layout/accept_languages_list" />
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="translate_switch"
         android:summaryOn="@string/languages_offer_translate_switch"
         android:summaryOff="@string/languages_offer_translate_switch" />
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/legal_information_preferences.xml b/chrome/android/java/res/xml/legal_information_preferences.xml
index 07fe1b6..216cd19 100644
--- a/chrome/android/java/res/xml/legal_information_preferences.xml
+++ b/chrome/android/java/res/xml/legal_information_preferences.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
     <org.chromium.chrome.browser.preferences.HyperlinkPreference
@@ -18,4 +18,4 @@
         android:key="privacy_notice"
         android:title="@string/privacy_notice_title"
         app:url="@string/chrome_privacy_notice_url" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/main_preferences.xml b/chrome/android/java/res/xml/main_preferences.xml
index 64ab2b2..a5c50e69 100644
--- a/chrome/android/java/res/xml/main_preferences.xml
+++ b/chrome/android/java/res/xml/main_preferences.xml
@@ -3,10 +3,10 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     android:orderingFromXml="false">
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="account_section"
         android:order="0"
         android:title="@string/prefs_section_account"/>
@@ -14,101 +14,101 @@
         android:key="sign_in"
         android:order="1"
         android:title="@string/sign_in_to_chrome"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="sync_and_services"
         android:order="2"
         android:layout="@layout/account_management_account_row"
         android:title="@string/prefs_sync_and_services"
         android:fragment="org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences"/>
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="basics_section"
         android:order="3"
         android:title="@string/prefs_section_basics"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.SearchEnginePreference"
         android:key="search_engine"
         android:order="4"
         android:title="@string/prefs_search_engine"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.password.SavePasswordsPreferences"
         android:key="saved_passwords"
         android:order="5"
         android:title="@string/prefs_saved_passwords_title"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillPaymentMethodsFragment"
         android:key="autofill_payment_methods"
         android:order="6"
         android:title="@string/autofill_payment_methods"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.autofill.AutofillProfilesFragment"
         android:key="autofill_addresses"
         android:order="7"
         android:title="@string/autofill_addresses_settings_title"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.autofill_assistant.AutofillAssistantPreferences"
         android:key="autofill_assistant"
         android:order="8"
         android:title="@string/prefs_autofill_assistant_title"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.NotificationsPreferences"
         android:key="notifications"
         android:order="9"
         android:title="@string/prefs_notifications"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.HomepagePreferences"
         android:key="homepage"
         android:order="10"
         android:title="@string/options_homepage_title"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.themes.ThemePreferences"
         android:key="ui_theme"
         android:order="11"
         android:title="@string/prefs_themes" />
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="advanced_section"
         android:order="12"
         android:title="@string/prefs_section_advanced"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.privacy.PrivacyPreferences"
         android:key="privacy"
         android:order="13"
         android:title="@string/prefs_privacy"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.AccessibilityPreferences"
         android:key="accessibility"
         android:order="14"
         android:title="@string/prefs_accessibility"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.website.SiteSettingsPreferences"
         android:key="content_settings"
         android:order="15"
         android:title="@string/prefs_site_settings"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.languages.LanguagesPreferences"
         android:key="languages"
         android:order="16"
         android:title="@string/prefs_languages"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.datareduction.DataReductionPreferenceFragment"
         android:key="data_reduction"
         android:order="17"
         android:title="@string/data_reduction_title_lite_mode"/>
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:fragment="org.chromium.chrome.browser.preferences.download.DownloadPreferences"
         android:key="downloads"
         android:order="18"
         android:title="@string/menu_downloads"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.developer.DeveloperPreferences"
         android:key="developer"
         android:order="19"
         android:title="Developer options"/>
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.AboutChromePreferences"
         android:key="about_chrome"
         android:order="20"
         android:title="@string/prefs_about_chrome"/>
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/manage_sync_preferences.xml b/chrome/android/java/res/xml/manage_sync_preferences.xml
index 584914cf..e0e4398 100644
--- a/chrome/android/java/res/xml/manage_sync_preferences.xml
+++ b/chrome/android/java/res/xml/manage_sync_preferences.xml
@@ -3,60 +3,60 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="sync_everything"
         android:title="@string/sync_everything_pref"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_autofill"
         android:title="@string/sync_autofill"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_bookmarks"
         android:title="@string/sync_bookmarks"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_payments_integration"
         android:title="@string/sync_payments_integration"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_history"
         android:title="@string/sync_history"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_passwords"
         android:title="@string/sync_passwords"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_recent_tabs"
         android:title="@string/sync_recent_tabs"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="sync_settings"
         android:title="@string/sync_settings"
         android:persistent="false"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="google_activity_controls"
         android:title="@string/sign_in_google_activity_controls_title"
         android:summary="@string/sign_in_google_activity_controls_summary"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="encryption"
         android:title="@string/sync_encryption"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="sync_manage_data"
         android:title="@string/sync_manage_data"/>
 
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/notifications_preferences.xml b/chrome/android/java/res/xml/notifications_preferences.xml
index 5eccf3c..56a6565d 100644
--- a/chrome/android/java/res/xml/notifications_preferences.xml
+++ b/chrome/android/java/res/xml/notifications_preferences.xml
@@ -3,9 +3,9 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="content_suggestions"
         android:title="@string/notifications_content_suggestions_title"
         android:summary="@string/notifications_content_suggestions_summary" />
@@ -14,4 +14,4 @@
         android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
         android:title="@string/notifications_from_websites_title"
         android:key="from_websites" />
-</android.support.v7.preference.PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
index edcdd4c3..ccc1d1f 100644
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -3,33 +3,33 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="can_make_payment"
         android:title="@string/can_make_payment_title"
         android:summary="@string/settings_can_make_payment_toggle_label" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="preload_pages"
         android:title="@string/preload_pages_title"
         android:summary="@string/preload_pages_summary"
         android:persistent="false" />
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="usage_stats_reporting"
         android:title="@string/usage_stats_setting_title"
         android:persistent="false" />
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.privacy.DoNotTrackPreference"
         android:key="do_not_track"
         android:title="@string/do_not_track_title" />
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="clear_browsing_data"
         android:title="@string/clear_browsing_data_title"
         android:summary="@string/clear_browsing_data_summary"
         android:fragment="org.chromium.chrome.browser.preferences.privacy.ClearBrowsingDataTabsFragment" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:key="sync_and_services_link"
         android:summary="@string/privacy_sync_and_services_link"
         app:allowDividerBelow="false" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/single_website_preferences.xml b/chrome/android/java/res/xml/single_website_preferences.xml
index 09bec898..a2ab409a 100644
--- a/chrome/android/java/res/xml/single_website_preferences.xml
+++ b/chrome/android/java/res/xml/single_website_preferences.xml
@@ -3,31 +3,31 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="os_permissions_warning" />
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="os_permissions_warning_extra" />
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="os_permissions_warning_divider"
         android:layout="@layout/divider_preference" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:key="intrusive_ads_info"
         android:title="@string/intrusive_ads_information"
         android:icon="@drawable/btn_info"
         app:iconTint="@color/default_icon_color" />
-    <android.support.v7.preference.Preference
+    <Preference
         android:key="intrusive_ads_info_divider"
         android:layout="@layout/divider_preference" />
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="site_heading"
         android:title="@string/website_settings_site_category" />
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:key="site_title" />
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="site_usage"
         android:title="@string/website_settings_usage_category" />
     <org.chromium.chrome.browser.preferences.website.ClearWebsiteStorage
@@ -37,45 +37,45 @@
         android:positiveButtonText="@string/webstorage_clear_data_dialog_ok_button"
         android:negativeButtonText="@string/cancel"
         android:widgetLayout="@layout/clear_storage" />
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="site_permissions"
         android:title="@string/website_settings_permissions_category" />
 
     <!-- The order of the following items is from: http://crbug.com/610358. -->
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="cookies_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="location_access_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="camera_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="microphone_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="push_notifications_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="javascript_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="popup_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="ads_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="background_sync_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="automatic_downloads_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="protected_media_identifier_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="autoplay_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="sound_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="midi_sysex_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="clipboard_permission_list" />
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="bluetooth_scanning_permission_list" />
 
-    <org.chromium.chrome.browser.preferences.ButtonPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ButtonPreference
         android:key="reset_site_button"
         android:title="@string/website_reset" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/site_settings_preferences.xml b/chrome/android/java/res/xml/site_settings_preferences.xml
index ef75b04..9e9184a0 100644
--- a/chrome/android/java/res/xml/site_settings_preferences.xml
+++ b/chrome/android/java/res/xml/site_settings_preferences.xml
@@ -4,7 +4,7 @@
      found in the LICENSE file. -->
 
 <!-- The order of the following items is from: http://crbug.com/610358. -->
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
     <!-- All sites -->
     <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
@@ -96,4 +96,4 @@
     <org.chromium.chrome.browser.preferences.website.SiteSettingsPreference
         android:fragment="org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences"
         android:key="bluetooth_scanning" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/sync_and_services_preferences.xml b/chrome/android/java/res/xml/sync_and_services_preferences.xml
index ec89aae..7668491 100644
--- a/chrome/android/java/res/xml/sync_and_services_preferences.xml
+++ b/chrome/android/java/res/xml/sync_and_services_preferences.xml
@@ -7,78 +7,78 @@
      |GetSyncedServicePrefNames| in
      chrome/browser/unified_consent/unified_consent_service_factory.cc has to be
      updated accordingly. -->
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <android.support.v7.preference.PreferenceCategory
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+    <PreferenceCategory
         android:key="user_category"
         android:title="@string/user"/>
     <org.chromium.chrome.browser.preferences.sync.SignInPreference
         android:key="sign_in"
         android:title="@string/sign_in_to_chrome"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBasePreference
         android:key="manage_your_google_account"
         android:title="@string/manage_your_google_account"/>
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="sync_category"
         android:title="@string/sync_category_title">
 
-        <android.support.v7.preference.Preference
+        <Preference
             android:key="sync_error_card"
             android:layout="@layout/account_management_account_row"
             android:title="@string/sync_error_card_title"/>
-        <android.support.v7.preference.Preference
+        <Preference
             android:key="sync_disabled_by_administrator"
             android:layout="@layout/account_management_account_row"
             android:title="@string/sync_is_disabled_by_administrator"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="sync_requested"
             android:title="@string/sync_switch_title"
             android:persistent="false"/>
 
-        <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBasePreference
             android:key="manage_sync"
             android:title="@string/manage_sync_title"
             android:fragment="org.chromium.chrome.browser.preferences.sync.ManageSyncPreferences"/>
-    </android.support.v7.preference.PreferenceCategory>
+    </PreferenceCategory>
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="services_category"
         android:title="@string/services_category_title">
 
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="search_suggestions"
             android:title="@string/autocomplete_searches_and_urls_title"
             android:summary="@string/autocomplete_searches_and_urls_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="navigation_error"
             android:title="@string/navigation_error_suggestions_title"
             android:summary="@string/navigation_error_suggestions_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="safe_browsing"
             android:title="@string/safe_browsing_title"
             android:summary="@string/safe_browsing_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="safe_browsing_scout_reporting"
             android:title="@string/safe_browsing_scout_reporting_title"
             android:summary="@string/safe_browsing_scout_reporting_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="usage_and_crash_reports"
             android:title="@string/usage_and_crash_reports_title"
             android:summary="@string/usage_and_crash_reports_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:key="url_keyed_anonymized_data"
             android:title="@string/url_keyed_anonymized_data_title"
             android:summary="@string/url_keyed_anonymized_data_summary"
             android:persistent="false"/>
-        <org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBasePreference
             android:key="contextual_search"
             android:title="@string/contextual_search_title"
             android:fragment="org.chromium.chrome.browser.preferences.privacy.ContextualSearchPreferenceFragment"/>
-    </android.support.v7.preference.PreferenceCategory>
-</android.support.v7.preference.PreferenceScreen>
+    </PreferenceCategory>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/sync_customization_preferences.xml b/chrome/android/java/res/xml/sync_customization_preferences.xml
index 9a4e31cf..7b22ac1c 100644
--- a/chrome/android/java/res/xml/sync_customization_preferences.xml
+++ b/chrome/android/java/res/xml/sync_customization_preferences.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <org.chromium.chrome.browser.preferences.sync.SyncErrorCardPreference
@@ -12,7 +12,7 @@
         app:iconTint="@color/default_red"
         android:title="@string/sync_error_card_title"/>
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="sync_switch"
         android:title="@string/sign_in_sync"
         android:summary="@string/sync_description" />
@@ -20,48 +20,46 @@
     <org.chromium.chrome.browser.preferences.sync.SyncedAccountPreference
         android:key="synced_account" />
 
-    <android.support.v7.preference.PreferenceCategory
+    <PreferenceCategory
         android:key="sync_data_types"
         android:title="@string/sync_data_types">
-        <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
             android:persistent="false"
             android:key="sync_everything"
             android:title="@string/sync_everything_pref"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="sync_autofill"
             android:title="@string/sync_autofill"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="sync_bookmarks"
             android:title="@string/sync_bookmarks"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="sync_omnibox"
             android:title="@string/sync_history"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="sync_passwords"
             android:title="@string/sync_passwords"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="sync_recent_tabs"
             android:title="@string/sync_recent_tabs"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="sync_settings"
             android:title="@string/sync_settings"/>
-        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+        <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
             android:persistent="false"
             android:key="payments_integration"
             android:title="@string/payments_integration_legacy"/>
-    </android.support.v7.preference.PreferenceCategory>
-    <android.support.v7.preference.Preference
+    </PreferenceCategory>
+    <Preference
         android:key="encryption"
-        android:title="@string/sync_encryption">
-    </android.support.v7.preference.Preference>
-    <android.support.v7.preference.Preference
+        android:title="@string/sync_encryption" />
+    <Preference
         android:key="sync_manage_data"
-        android:title="@string/sync_manage_data">
-    </android.support.v7.preference.Preference>
-</android.support.v7.preference.PreferenceScreen>
+        android:title="@string/sync_manage_data" />
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/theme_preferences.xml b/chrome/android/java/res/xml/theme_preferences.xml
index 5368fa6..9e1f0e7 100644
--- a/chrome/android/java/res/xml/theme_preferences.xml
+++ b/chrome/android/java/res/xml/theme_preferences.xml
@@ -3,7 +3,7 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
     <org.chromium.chrome.browser.preferences.themes.RadioButtonGroupThemePreference
         android:key="ui_theme_pref" />
-</android.support.v7.preference.PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/res/xml/tracing_preferences.xml b/chrome/android/java/res/xml/tracing_preferences.xml
index 2aaf94c..e8320de 100644
--- a/chrome/android/java/res/xml/tracing_preferences.xml
+++ b/chrome/android/java/res/xml/tracing_preferences.xml
@@ -3,27 +3,27 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
+<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:orderingFromXml="true">
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.developer.TracingCategoriesPreferences"
         android:key="default_categories"
         android:title="Default categories"/><!-- developer strings are not translated -->
-    <android.support.v7.preference.Preference
+    <Preference
         android:fragment="org.chromium.chrome.browser.preferences.developer.TracingCategoriesPreferences"
         android:key="non_default_categories"
         android:title="Disabled-by-default categories"/>
-    <org.chromium.chrome.browser.preferences.ChromeBaseListPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseListPreference
         android:key="mode"
         android:title="Tracing mode"
         android:persistent="false"/>
-    <org.chromium.chrome.browser.preferences.ButtonPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ButtonPreference
         android:key="start_recording"/>
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:key="tracing_status"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:allowDividerAbove="false"
         app:allowDividerBelow="false" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml b/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml
index 2e76e9b1..7ab07e4e 100644
--- a/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml
+++ b/chrome/android/java/res/xml/usage_and_crash_reports_preferences.xml
@@ -3,21 +3,21 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="usage_and_crash_reports_switch"
         android:summaryOn="@string/text_on"
         android:summaryOff="@string/text_off"
         app:drawDivider="true"/>
 
-    <org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat
+    <org.chromium.chrome.browser.preferences.TextMessagePreference
         android:title="@string/usage_and_crash_reports_description_legacy"/>
 
-    <org.chromium.chrome.browser.preferences.LearnMorePreferenceCompat
+    <org.chromium.chrome.browser.preferences.LearnMorePreference
         android:key="usage_and_crash_reports_learn_more"
         app:helpContext="@string/help_context_usage_reports"/>
 
-</android.support.v7.preference.PreferenceScreen>
\ No newline at end of file
+</PreferenceScreen>
\ No newline at end of file
diff --git a/chrome/android/java/res/xml/website_preferences.xml b/chrome/android/java/res/xml/website_preferences.xml
index 59b84f1..1baf603 100644
--- a/chrome/android/java/res/xml/website_preferences.xml
+++ b/chrome/android/java/res/xml/website_preferences.xml
@@ -3,14 +3,14 @@
      Use of this source code is governed by a BSD-style license that can be
      found in the LICENSE file. -->
 
-<android.support.v7.preference.PreferenceScreen
+<PreferenceScreen
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:title="@string/all_sites">
 
     <!-- A common binary toggle, only shown for specific categories that allow
          turning default values for that category on/off.-->
-    <org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeSwitchPreference
         android:key="binary_toggle"
         android:defaultValue="true" />
     <!-- A common Allow/Ask/Block 3-state toggle (radio group). Only shown when
@@ -20,20 +20,20 @@
         android:key="tri_state_toggle" />
 
     <!-- A toggle for blocking third-party cookies, only shown for the Cookies category. -->
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="third_party_cookies"
         android:title="@string/block_third_party_cookies_title"
         android:summary="@string/block_third_party_cookies_summary"
         android:defaultValue="true"
         android:persistent="false" />
     <!-- A toggle for enabling vibration in notifications. -->
-    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat
+    <org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference
         android:key="notifications_vibrate"
         android:title="@string/enable_notifications_vibrate_title"
         android:summary="@string/enable_notifications_vibrate_summary"
         android:defaultValue="true" />
     <!-- An hyperlink to explain more about Protected Media content settings. -->
-    <org.chromium.chrome.browser.preferences.LearnMorePreferenceCompat
+    <org.chromium.chrome.browser.preferences.LearnMorePreference
         android:key="protected_content_learn_more"
         android:background="?android:attr/listDivider"
         app:helpContext="@string/help_context_protected_content"/>
@@ -45,4 +45,4 @@
         android:key="blocked_group" />
     <org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup
         android:key="allowed_group" />
-</android.support.v7.preference.PreferenceScreen>
+</PreferenceScreen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
index 46f734b..5f46ae4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -2110,7 +2110,7 @@
         }
 
         if (id == R.id.preferences_id) {
-            PreferencesLauncher.launchSettingsPageCompat(this, null);
+            PreferencesLauncher.launchSettingsPage(this, null);
             RecordUserAction.record("MobileMenuSettings");
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SmsReceiverDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/SmsReceiverDialog.java
index 4cfd963..c38e0cc6f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/SmsReceiverDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/SmsReceiverDialog.java
@@ -13,7 +13,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.ui.base.WindowAndroid;
@@ -68,8 +67,7 @@
                     public void onClick(DialogInterface prompt, int which) {
                         assert mNativeSmsDialogAndroid != 0;
                         prompt.dismiss();
-                        SmsReceiverDialogJni.get().onCancel(
-                                SmsReceiverDialog.this, mNativeSmsDialogAndroid);
+                        SmsReceiverDialogJni.get().onCancel(mNativeSmsDialogAndroid);
                     }
                 });
         mDialog.setButton(DialogInterface.BUTTON_POSITIVE,
@@ -78,8 +76,7 @@
                     public void onClick(DialogInterface prompt, int which) {
                         assert mNativeSmsDialogAndroid != 0;
                         prompt.dismiss();
-                        SmsReceiverDialogJni.get().onContinue(
-                                SmsReceiverDialog.this, mNativeSmsDialogAndroid);
+                        SmsReceiverDialogJni.get().onContinue(mNativeSmsDialogAndroid);
                     }
                 });
         mDialog.show();
@@ -121,7 +118,7 @@
 
     @NativeMethods
     interface Natives {
-        void onCancel(@JCaller SmsReceiverDialog self, long nativeSmsDialogAndroid);
-        void onContinue(@JCaller SmsReceiverDialog self, long nativeSmsDialogAndroid);
+        void onCancel(long nativeSmsDialogAndroid);
+        void onContinue(long nativeSmsDialogAndroid);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClearDataDialogActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClearDataDialogActivity.java
index cc944c8..d12255c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClearDataDialogActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ClearDataDialogActivity.java
@@ -114,7 +114,7 @@
         extras.putInt(SettingsNavigationSource.EXTRA_KEY,
                 SettingsNavigationSource.TWA_CLEAR_DATA_DIALOG);
 
-        PreferencesLauncher.launchSettingsPageCompat(this, SingleCategoryPreferences.class, extras);
+        PreferencesLauncher.launchSettingsPage(this, SingleCategoryPreferences.class, extras);
     }
 
     private void recordDecision(boolean accepted) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
index 2955971..f28bcc3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPromoControl.java
@@ -386,7 +386,7 @@
         new Handler().post(new Runnable() {
             @Override
             public void run() {
-                PreferencesLauncher.launchSettingsPageCompat(
+                PreferencesLauncher.launchSettingsPage(
                         getContext(), ContextualSearchPreferenceFragment.class);
             }
         });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java
index 85fb111..7ef84cf2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/datareduction/DataReductionMainMenuItem.java
@@ -84,7 +84,7 @@
         RecordUserAction.record("MobileMenuDataSaverOpened");
         Bundle fragmentArgs = new Bundle();
         fragmentArgs.putBoolean(DataReductionPreferenceFragment.FROM_MAIN_MENU, true);
-        PreferencesLauncher.launchSettingsPageCompat(
+        PreferencesLauncher.launchSettingsPage(
                 getContext(), DataReductionPreferenceFragment.class, fragmentArgs);
 
         Tracker tracker = TrackerFactory.getTrackerForProfile(Profile.getLastUsedProfile());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java
index 5bcc0b4f..de9aac4 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialog.java
@@ -25,7 +25,6 @@
 import org.chromium.base.Log;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
@@ -118,7 +117,7 @@
             if (checkLocationServicesAndPermission()) {
                 mItemChooserDialog.clear();
                 Natives jni = BluetoothChooserDialogJni.get();
-                jni.restartSearch(BluetoothChooserDialog.this, mNativeBluetoothChooserDialogPtr);
+                jni.restartSearch(mNativeBluetoothChooserDialogPtr);
             }
         }
     };
@@ -239,7 +238,7 @@
 
         if (mNativeBluetoothChooserDialogPtr != 0) {
             Natives jni = BluetoothChooserDialogJni.get();
-            jni.onDialogFinished(this, mNativeBluetoothChooserDialogPtr, resultCode, id);
+            jni.onDialogFinished(mNativeBluetoothChooserDialogPtr, resultCode, id);
         }
     }
 
@@ -262,7 +261,7 @@
                 if (checkLocationServicesAndPermission()) {
                     mItemChooserDialog.clear();
                     Natives jni = BluetoothChooserDialogJni.get();
-                    jni.restartSearch(this, mNativeBluetoothChooserDialogPtr);
+                    jni.restartSearch(mNativeBluetoothChooserDialogPtr);
                 }
                 return;
             }
@@ -336,7 +335,7 @@
             case LinkType.EXPLAIN_BLUETOOTH:
                 // No need to close the dialog here because
                 // ShowBluetoothOverviewLink will close it.
-                jni.showBluetoothOverviewLink(this, mNativeBluetoothChooserDialogPtr);
+                jni.showBluetoothOverviewLink(mNativeBluetoothChooserDialogPtr);
                 break;
             case LinkType.ADAPTER_OFF:
                 if (mAdapter != null && mAdapter.enable()) {
@@ -348,7 +347,7 @@
                 }
                 break;
             case LinkType.ADAPTER_OFF_HELP:
-                jni.showBluetoothAdapterOffLink(this, mNativeBluetoothChooserDialogPtr);
+                jni.showBluetoothAdapterOffLink(mNativeBluetoothChooserDialogPtr);
                 break;
             case LinkType.REQUEST_LOCATION_PERMISSION:
                 mItemChooserDialog.setIgnorePendingWindowFocusChangeForClose(true);
@@ -362,11 +361,11 @@
                         LocationUtils.getInstance().getSystemLocationSettingsIntent());
                 break;
             case LinkType.NEED_LOCATION_PERMISSION_HELP:
-                jni.showNeedLocationPermissionLink(this, mNativeBluetoothChooserDialogPtr);
+                jni.showNeedLocationPermissionLink(mNativeBluetoothChooserDialogPtr);
                 break;
             case LinkType.RESTART_SEARCH:
                 mItemChooserDialog.clear();
-                jni.restartSearch(this, mNativeBluetoothChooserDialogPtr);
+                jni.restartSearch(mNativeBluetoothChooserDialogPtr);
                 break;
             default:
                 assert false;
@@ -457,16 +456,11 @@
 
     @NativeMethods
     interface Natives {
-        void onDialogFinished(@JCaller BluetoothChooserDialog self,
-                long nativeBluetoothChooserAndroid, int eventType, String deviceId);
-        void restartSearch(
-                @JCaller BluetoothChooserDialog self, long nativeBluetoothChooserAndroid);
+        void onDialogFinished(long nativeBluetoothChooserAndroid, int eventType, String deviceId);
+        void restartSearch(long nativeBluetoothChooserAndroid);
         // Help links.
-        void showBluetoothOverviewLink(
-                @JCaller BluetoothChooserDialog self, long nativeBluetoothChooserAndroid);
-        void showBluetoothAdapterOffLink(
-                @JCaller BluetoothChooserDialog self, long nativeBluetoothChooserAndroid);
-        void showNeedLocationPermissionLink(
-                @JCaller BluetoothChooserDialog self, long nativeBluetoothChooserAndroid);
+        void showBluetoothOverviewLink(long nativeBluetoothChooserAndroid);
+        void showBluetoothAdapterOffLink(long nativeBluetoothChooserAndroid);
+        void showNeedLocationPermissionLink(long nativeBluetoothChooserAndroid);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialog.java
index bcdb010e..28fb7c4e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialog.java
@@ -24,7 +24,6 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeBaseAppCompatActivity;
@@ -250,7 +249,7 @@
     private void finishDialog(int resultCode) {
         if (mNativeBluetoothScanningPermissionDialogPtr == 0) return;
         Natives jni = BluetoothScanningPermissionDialogJni.get();
-        jni.onDialogFinished(this, mNativeBluetoothScanningPermissionDialogPtr, resultCode);
+        jni.onDialogFinished(mNativeBluetoothScanningPermissionDialogPtr, resultCode);
     }
 
     /**
@@ -271,7 +270,6 @@
 
     @NativeMethods
     interface Natives {
-        void onDialogFinished(@JCaller BluetoothScanningPermissionDialog self,
-                long nativeBluetoothScanningPromptAndroid, int eventType);
+        void onDialogFinished(long nativeBluetoothScanningPromptAndroid, int eventType);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialog.java
index 0b0f5ce..3ba7a24 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialog.java
@@ -10,7 +10,6 @@
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.omnibox.OmniboxUrlEmphasizer;
@@ -75,7 +74,7 @@
                             if (mNativeUsbChooserDialogPtr == 0) return;
 
                             Natives jni = UsbChooserDialogJni.get();
-                            jni.loadUsbHelpPage(this, mNativeUsbChooserDialogPtr);
+                            jni.loadUsbHelpPage(mNativeUsbChooserDialogPtr);
 
                             // Get rid of the highlight background on selection.
                             view.invalidate();
@@ -95,9 +94,9 @@
         if (mNativeUsbChooserDialogPtr != 0) {
             Natives jni = UsbChooserDialogJni.get();
             if (id.isEmpty()) {
-                jni.onDialogCancelled(this, mNativeUsbChooserDialogPtr);
+                jni.onDialogCancelled(mNativeUsbChooserDialogPtr);
             } else {
-                jni.onItemSelected(this, mNativeUsbChooserDialogPtr, id);
+                jni.onItemSelected(mNativeUsbChooserDialogPtr, id);
             }
         }
     }
@@ -137,9 +136,8 @@
 
     @NativeMethods
     interface Natives {
-        void onItemSelected(@JCaller UsbChooserDialog self, long nativeUsbChooserDialogAndroid,
-                String deviceId);
-        void onDialogCancelled(@JCaller UsbChooserDialog self, long nativeUsbChooserDialogAndroid);
-        void loadUsbHelpPage(@JCaller UsbChooserDialog self, long nativeUsbChooserDialogAndroid);
+        void onItemSelected(long nativeUsbChooserDialogAndroid, String deviceId);
+        void onDialogCancelled(long nativeUsbChooserDialogAndroid);
+        void loadUsbHelpPage(long nativeUsbChooserDialogAndroid);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
index 703a8c3a..9a0ca517 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerCoordinatorImpl.java
@@ -169,7 +169,7 @@
     @Override
     public void openSettings() {
         RecordUserAction.record("Android.DownloadManager.Settings");
-        PreferencesLauncher.launchSettingsPageCompat(mActivity, DownloadPreferences.class);
+        PreferencesLauncher.launchSettingsPage(mActivity, DownloadPreferences.class);
     }
 
     private void notifyFilterChanged(@FilterType int filter) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
index a5c42b8..58e5cea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/ui/DownloadManagerUi.java
@@ -383,7 +383,7 @@
             mToolbar.showSearchView();
             return true;
         } else if (item.getItemId() == R.id.settings_menu_id) {
-            PreferencesLauncher.launchSettingsPageCompat(mActivity, DownloadPreferences.class);
+            PreferencesLauncher.launchSettingsPage(mActivity, DownloadPreferences.class);
             return true;
         }
         return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
index 82b1edd..7fcad25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunSignInProcessor.java
@@ -98,7 +98,7 @@
     private static void openSignInSettings(Activity activity) {
         final Class<? extends Fragment> fragment = SyncAndServicesPreferences.class;
         final Bundle arguments = SyncAndServicesPreferences.createArguments(true);
-        PreferencesLauncher.launchSettingsPageCompat(activity, fragment, arguments);
+        PreferencesLauncher.launchSettingsPage(activity, fragment, arguments);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryDeletionBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryDeletionBridge.java
index 6baaa3f4..c7c9199 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryDeletionBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryDeletionBridge.java
@@ -8,7 +8,6 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 
 /** The JNI bridge for Android to receive notifications about history deletions. */
@@ -56,6 +55,6 @@
 
     @NativeMethods
     interface Natives {
-        long init(@JCaller HistoryDeletionBridge self);
+        long init(HistoryDeletionBridge self);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
index eeddb99..650b8ab 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -380,8 +380,7 @@
      */
     public void openClearBrowsingDataPreference() {
         recordUserAction("ClearBrowsingData");
-        PreferencesLauncher.launchSettingsPageCompat(
-                mActivity, ClearBrowsingDataTabsFragment.class);
+        PreferencesLauncher.launchSettingsPage(mActivity, ClearBrowsingDataTabsFragment.class);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java
index 04ccfde..c64a54a39 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PreviewsLitePageInfoBar.java
@@ -35,7 +35,7 @@
 
         Bundle fragmentArgs = new Bundle();
         fragmentArgs.putBoolean(FROM_INFOBAR, true);
-        PreferencesLauncher.launchSettingsPageCompat(
+        PreferencesLauncher.launchSettingsPage(
                 getContext(), DataReductionPreferenceFragment.class, fragmentArgs);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java
index 18335df..40e847a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/SearchGeolocationDisclosureInfoBar.java
@@ -57,7 +57,7 @@
     @CalledByNative
     private static void showSettingsPage(String searchUrl) {
         Context context = ContextUtils.getApplicationContext();
-        PreferencesLauncher.launchSettingsPageCompat(context, SingleWebsitePreferences.class,
+        PreferencesLauncher.launchSettingsPage(context, SingleWebsitePreferences.class,
                 SingleWebsitePreferences.createFragmentArgsForSite(searchUrl));
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
index 1eaf251..5dcb8419 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -96,7 +96,7 @@
         @Override
         public void onAction(Object actionData) {
             Context context = ContextUtils.getApplicationContext();
-            PreferencesLauncher.launchSettingsPageCompat(context, SearchEnginePreference.class);
+            PreferencesLauncher.launchSettingsPage(context, SearchEnginePreference.class);
         }
     };
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java
index 51383f2..3a7bd0c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/SogouPromoDialog.java
@@ -65,8 +65,7 @@
         mLocaleManager = localeManager;
         mSpan = new NoUnderlineClickableSpan(activity.getResources(), (widget) -> {
             mChoice = UserChoice.SETTINGS;
-            PreferencesLauncher.launchSettingsPageCompat(
-                    getContext(), SearchEnginePreference.class);
+            PreferencesLauncher.launchSettingsPage(getContext(), SearchEnginePreference.class);
             dismiss();
         });
         setOnDismissListener(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
index 5ca66dc9..77978656 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
@@ -9,7 +9,6 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.init.AsyncInitializationActivity;
 
@@ -42,7 +41,7 @@
             return;
         }
 
-        PictureInPictureActivityJni.get().onActivityStart(this, sNativeOverlayWindowAndroid);
+        PictureInPictureActivityJni.get().onActivityStart(sNativeOverlayWindowAndroid, this);
     }
 
     @Override
@@ -85,8 +84,7 @@
 
     @NativeMethods
     interface Natives {
-        void onActivityStart(
-                @JCaller PictureInPictureActivity self, long nativeOverlayWindowAndroid);
+        void onActivityStart(long nativeOverlayWindowAndroid, PictureInPictureActivity self);
 
         void onActivityDestroy(long nativeOverlayWindowAndroid);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
index 6602212..303f8241 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
@@ -286,8 +286,7 @@
         Class<? extends PreferenceFragmentCompat> fragment = launchSingleWebsitePreferences
                 ? SingleWebsitePreferences.class
                 : SingleCategoryPreferences.class;
-        PreferencesLauncher.launchSettingsPageCompat(
-                applicationContext, fragment, fragmentArguments);
+        PreferencesLauncher.launchSettingsPage(applicationContext, fragment, fragmentArguments);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index 56bf08a5..4986a37 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -1847,7 +1847,7 @@
             return;
         }
 
-        PreferencesLauncher.launchSettingsPageCompat(context, MainPreferences.class);
+        PreferencesLauncher.launchSettingsPage(context, MainPreferences.class);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java
index 28dd5cd8..5bdaebe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/AccessibilityPreferences.java
@@ -32,7 +32,7 @@
     private FontSizePrefs mFontSizePrefs;
 
     private TextScalePreference mTextScalePref;
-    private ChromeBaseCheckBoxPreferenceCompat mForceEnableZoomPref;
+    private ChromeBaseCheckBoxPreference mForceEnableZoomPref;
 
     private FontSizePrefsObserver mFontSizePrefsObserver = new FontSizePrefsObserver() {
         @Override
@@ -58,17 +58,17 @@
         mTextScalePref.setOnPreferenceChangeListener(this);
 
         mForceEnableZoomPref =
-                (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_FORCE_ENABLE_ZOOM);
+                (ChromeBaseCheckBoxPreference) findPreference(PREF_FORCE_ENABLE_ZOOM);
         mForceEnableZoomPref.setOnPreferenceChangeListener(this);
 
-        ChromeBaseCheckBoxPreferenceCompat readerForAccessibilityPref =
-                (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_READER_FOR_ACCESSIBILITY);
+        ChromeBaseCheckBoxPreference readerForAccessibilityPref =
+                (ChromeBaseCheckBoxPreference) findPreference(PREF_READER_FOR_ACCESSIBILITY);
         readerForAccessibilityPref.setChecked(
                 PrefServiceBridge.getInstance().getBoolean(Pref.READER_FOR_ACCESSIBILITY_ENABLED));
         readerForAccessibilityPref.setOnPreferenceChangeListener(this);
 
-        ChromeBaseCheckBoxPreferenceCompat mAccessibilityTabSwitcherPref =
-                (ChromeBaseCheckBoxPreferenceCompat) findPreference(
+        ChromeBaseCheckBoxPreference mAccessibilityTabSwitcherPref =
+                (ChromeBaseCheckBoxPreference) findPreference(
                         ChromePreferenceManager.ACCESSIBILITY_TAB_SWITCHER);
         if (AccessibilityUtil.isAccessibilityEnabled()) {
             mAccessibilityTabSwitcherPref.setChecked(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java
similarity index 89%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java
index e0de80c8..a0ad8f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ButtonPreference.java
@@ -18,11 +18,11 @@
  * Preference.getOnPreferenceClickListener().onPreferenceClick() is called when the button is
  * clicked.
  */
-public class ButtonPreferenceCompat extends Preference {
+public class ButtonPreference extends Preference {
     /**
      * Constructor for inflating from XML
      */
-    public ButtonPreferenceCompat(Context context, AttributeSet attrs) {
+    public ButtonPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         setLayoutResource(R.layout.button_preference_layout);
         setWidgetLayoutResource(R.layout.button_preference_button);
@@ -36,7 +36,7 @@
         button.setText(getTitle());
         button.setOnClickListener(v -> {
             if (getOnPreferenceClickListener() != null) {
-                getOnPreferenceClickListener().onPreferenceClick(ButtonPreferenceCompat.this);
+                getOnPreferenceClickListener().onPreferenceClick(ButtonPreference.this);
             }
         });
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java
similarity index 84%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java
index 485f9fd..fe47a93 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseCheckBoxPreference.java
@@ -13,20 +13,20 @@
 /**
  * Contains the basic functionality that should be shared by all CheckBoxPreference in Chrome.
  */
-public class ChromeBaseCheckBoxPreferenceCompat extends CheckBoxPreference {
-    private ManagedPreferenceDelegateCompat mManagedPrefDelegate;
+public class ChromeBaseCheckBoxPreference extends CheckBoxPreference {
+    private ManagedPreferenceDelegate mManagedPrefDelegate;
 
     /**
      * Constructor for inflating from XML.
      */
-    public ChromeBaseCheckBoxPreferenceCompat(Context context, AttributeSet attrs) {
+    public ChromeBaseCheckBoxPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     /**
      * Sets the ManagedPreferenceDelegate which will determine whether this preference is managed.
      */
-    public void setManagedPreferenceDelegate(ManagedPreferenceDelegateCompat delegate) {
+    public void setManagedPreferenceDelegate(ManagedPreferenceDelegate delegate) {
         mManagedPrefDelegate = delegate;
         ManagedPreferencesUtils.initPreference(mManagedPrefDelegate, this);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreference.java
similarity index 84%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreference.java
index f031e5f..1d2d2806 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBaseListPreference.java
@@ -12,20 +12,20 @@
 /**
  * Contains the basic functionality that should be shared by all ListPreference in Chrome.
  */
-public class ChromeBaseListPreferenceCompat extends ListPreference {
-    private ManagedPreferenceDelegateCompat mManagedPrefDelegate;
+public class ChromeBaseListPreference extends ListPreference {
+    private ManagedPreferenceDelegate mManagedPrefDelegate;
 
     /**
      * Constructor for inflating from XML.
      */
-    public ChromeBaseListPreferenceCompat(Context context, AttributeSet attrs) {
+    public ChromeBaseListPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     /**
      * Sets the ManagedPreferenceDelegate which will determine whether this preference is managed.
      */
-    public void setManagedPreferenceDelegate(ManagedPreferenceDelegateCompat delegate) {
+    public void setManagedPreferenceDelegate(ManagedPreferenceDelegate delegate) {
         mManagedPrefDelegate = delegate;
         ManagedPreferencesUtils.initPreference(mManagedPrefDelegate, this);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java
similarity index 91%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java
index 538d9f54..47e2d8d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeBasePreference.java
@@ -27,9 +27,9 @@
  * 3. This preference can set an icon color in XML through app:iconTint. Note that if a
  *    ColorStateList is set, only the default color will be used.
  */
-public class ChromeBasePreferenceCompat extends Preference {
+public class ChromeBasePreference extends Preference {
     private ColorStateList mIconTint;
-    private ManagedPreferenceDelegateCompat mManagedPrefDelegate;
+    private ManagedPreferenceDelegate mManagedPrefDelegate;
 
     /**
      * When null, the default Preferences Support Library logic will be used to determine dividers.
@@ -42,14 +42,14 @@
     /**
      * Constructor for use in Java.
      */
-    public ChromeBasePreferenceCompat(Context context) {
+    public ChromeBasePreference(Context context) {
         this(context, null);
     }
 
     /**
      * Constructor for inflating from XML.
      */
-    public ChromeBasePreferenceCompat(Context context, AttributeSet attrs) {
+    public ChromeBasePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
         setLayoutResource(R.layout.preference_compat);
@@ -63,7 +63,7 @@
     /**
      * Sets the ManagedPreferenceDelegate which will determine whether this preference is managed.
      */
-    public void setManagedPreferenceDelegate(ManagedPreferenceDelegateCompat delegate) {
+    public void setManagedPreferenceDelegate(ManagedPreferenceDelegate delegate) {
         mManagedPrefDelegate = delegate;
         ManagedPreferencesUtils.initPreference(mManagedPrefDelegate, this);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java
similarity index 93%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java
index 0cca33f0..147fc82 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeImageViewPreference.java
@@ -31,9 +31,9 @@
  * customizations, however a custom widget may also be included as long as there is an ImageView
  * with the image_view_widget ID.
  */
-public class ChromeImageViewPreferenceCompat extends Preference {
+public class ChromeImageViewPreference extends Preference {
     @Nullable
-    private ManagedPreferenceDelegateCompat mManagedPrefDelegate;
+    private ManagedPreferenceDelegate mManagedPrefDelegate;
 
     // The onClick listener to handle click events for the ImageView widget.
     @Nullable
@@ -50,14 +50,14 @@
     /**
      * Constructor for use in Java.
      */
-    public ChromeImageViewPreferenceCompat(Context context) {
+    public ChromeImageViewPreference(Context context) {
         this(context, null);
     }
 
     /**
      * Constructor for inflating from XML.
      */
-    public ChromeImageViewPreferenceCompat(Context context, AttributeSet attrs) {
+    public ChromeImageViewPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
         setWidgetLayoutResource(R.layout.preference_chrome_image_view);
@@ -67,7 +67,7 @@
     /**
      * Sets the ManagedPreferenceDelegate which will determine whether this preference is managed.
      */
-    public void setManagedPreferenceDelegate(@Nullable ManagedPreferenceDelegateCompat delegate) {
+    public void setManagedPreferenceDelegate(@Nullable ManagedPreferenceDelegate delegate) {
         mManagedPrefDelegate = delegate;
         ManagedPreferencesUtils.initPreference(mManagedPrefDelegate, this);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java
similarity index 87%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java
index 234387a..302ecf45 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ChromeSwitchPreference.java
@@ -15,17 +15,17 @@
 /**
  * A Chrome switch preference that supports managed preferences.
  */
-public class ChromeSwitchPreferenceCompat extends SwitchPreferenceCompat {
-    private ManagedPreferenceDelegateCompat mManagedPrefDelegate;
+public class ChromeSwitchPreference extends SwitchPreferenceCompat {
+    private ManagedPreferenceDelegate mManagedPrefDelegate;
 
-    public ChromeSwitchPreferenceCompat(Context context, AttributeSet attrs) {
+    public ChromeSwitchPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     /**
      * Sets the ManagedPreferenceDelegate which will determine whether this preference is managed.
      */
-    public void setManagedPreferenceDelegate(ManagedPreferenceDelegateCompat delegate) {
+    public void setManagedPreferenceDelegate(ManagedPreferenceDelegate delegate) {
         mManagedPrefDelegate = delegate;
         ManagedPreferencesUtils.initPreference(mManagedPrefDelegate, this);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
index 35b1291b..d53be06d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java
@@ -26,7 +26,7 @@
  * A preference representing one browsing data type in ClearBrowsingDataPreferences.
  * This class allows clickable links inside the checkbox summary.
  */
-public class ClearBrowsingDataCheckBoxPreference extends ChromeBaseCheckBoxPreferenceCompat {
+public class ClearBrowsingDataCheckBoxPreference extends ChromeBaseCheckBoxPreference {
     private View mView;
     private Runnable mLinkClickDelegate;
     private boolean mHasClickableSpans;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java
index c17ee70b..8d49ecb9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java
@@ -33,8 +33,8 @@
                         : R.string.options_homepage_title);
         PreferenceUtils.addPreferencesFromResource(this, R.xml.homepage_preferences);
 
-        ChromeSwitchPreferenceCompat mHomepageSwitch =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_HOMEPAGE_SWITCH);
+        ChromeSwitchPreference mHomepageSwitch =
+                (ChromeSwitchPreference) findPreference(PREF_HOMEPAGE_SWITCH);
         boolean isHomepageEnabled = mHomepageManager.getPrefHomepageEnabled();
         mHomepageSwitch.setChecked(isHomepageEnabled);
         mHomepageSwitch.setOnPreferenceChangeListener((preference, newValue) -> {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java
similarity index 90%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java
index af2e34a3..08ad761 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java
@@ -21,7 +21,7 @@
 /**
  * A preference that opens a HelpAndFeedback activity to learn more about the specified context.
  */
-public class LearnMorePreferenceCompat extends Preference {
+public class LearnMorePreference extends Preference {
     /**
      * Resource id for the help page to link to by context name. Corresponds to go/mobilehelprecs.
      */
@@ -32,7 +32,7 @@
      */
     private final int mColor;
 
-    public LearnMorePreferenceCompat(Context context, AttributeSet attrs) {
+    public LearnMorePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
 
         TypedArray styledAttributes =
@@ -61,6 +61,6 @@
         TextView titleView = (TextView) holder.findViewById(android.R.id.title);
         titleView.setClickable(true);
         titleView.setTextColor(mColor);
-        titleView.setOnClickListener(v -> LearnMorePreferenceCompat.this.onClick());
+        titleView.setOnClickListener(v -> LearnMorePreference.this.onClick());
     }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
index 56f952c1..75983bc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/MainPreferences.java
@@ -63,7 +63,7 @@
     // chrome/browser/ui/webui/options/autofill_options_handler.cc
     public static final String SETTINGS_ORIGIN = "Chrome settings";
 
-    private final ManagedPreferenceDelegateCompat mManagedPreferenceDelegate;
+    private final ManagedPreferenceDelegate mManagedPreferenceDelegate;
     private final Map<String, Preference> mAllPreferences = new HashMap<>();
     private SignInPreference mSignInPreference;
 
@@ -192,8 +192,7 @@
     }
 
     private void setManagedPreferenceDelegateForPreference(String key) {
-        ChromeBasePreferenceCompat chromeBasePreference =
-                (ChromeBasePreferenceCompat) mAllPreferences.get(key);
+        ChromeBasePreference chromeBasePreference = (ChromeBasePreference) mAllPreferences.get(key);
         chromeBasePreference.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
     }
 
@@ -229,8 +228,8 @@
             removePreferenceIfPresent(PREF_DEVELOPER);
         }
 
-        ChromeBasePreferenceCompat dataReduction =
-                (ChromeBasePreferenceCompat) findPreference(PREF_DATA_REDUCTION);
+        ChromeBasePreference dataReduction =
+                (ChromeBasePreference) findPreference(PREF_DATA_REDUCTION);
         dataReduction.setSummary(DataReductionPreferenceFragment.generateSummary(getResources()));
     }
 
@@ -246,16 +245,16 @@
     }
 
     private void updateSyncAndServicesPreference() {
-        ChromeBasePreferenceCompat syncAndServices =
-                (ChromeBasePreferenceCompat) findPreference(PREF_SYNC_AND_SERVICES);
+        ChromeBasePreference syncAndServices =
+                (ChromeBasePreference) findPreference(PREF_SYNC_AND_SERVICES);
         syncAndServices.setIcon(SyncPreferenceUtils.getSyncStatusIcon(getActivity()));
         syncAndServices.setSummary(SyncPreferenceUtils.getSyncStatusSummary(getActivity()));
     }
 
     private void updateSearchEnginePreference() {
         if (!TemplateUrlServiceFactory.get().isLoaded()) {
-            ChromeBasePreferenceCompat searchEnginePref =
-                    (ChromeBasePreferenceCompat) findPreference(PREF_SEARCH_ENGINE);
+            ChromeBasePreference searchEnginePref =
+                    (ChromeBasePreference) findPreference(PREF_SEARCH_ENGINE);
             searchEnginePref.setEnabled(false);
             return;
         }
@@ -318,12 +317,12 @@
     }
 
     @VisibleForTesting
-    ManagedPreferenceDelegateCompat getManagedPreferenceDelegateForTest() {
+    ManagedPreferenceDelegate getManagedPreferenceDelegateForTest() {
         return mManagedPreferenceDelegate;
     }
 
-    private ManagedPreferenceDelegateCompat createManagedPreferenceDelegate() {
-        return new ManagedPreferenceDelegateCompat() {
+    private ManagedPreferenceDelegate createManagedPreferenceDelegate() {
+        return new ManagedPreferenceDelegate() {
             @Override
             public boolean isPreferenceControlledByPolicy(Preference preference) {
                 if (PREF_DATA_REDUCTION.equals(preference.getKey())) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegateCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java
similarity index 97%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegateCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java
index 4810c016..e6546a9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegateCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferenceDelegate.java
@@ -27,7 +27,7 @@
  *   ChromeSwitchPreference enableRocketsPref = ...;
  *   enableRocketsPref.setManagedPreferenceDelegate(new RocketManagedPreferenceDelegate());
  */
-public interface ManagedPreferenceDelegateCompat {
+public interface ManagedPreferenceDelegate {
     /**
      * Returns whether the given Preference is controlled by an enterprise policy.
      * @param preference the {@link Preference} under consideration.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java
index 3e3802d..9aa3c0e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManagedPreferencesUtils.java
@@ -81,7 +81,7 @@
      *      a custodian.
      */
     public static Drawable getManagedIconDrawable(
-            @Nullable ManagedPreferenceDelegateCompat delegate, Preference preference) {
+            @Nullable ManagedPreferenceDelegate delegate, Preference preference) {
         if (delegate == null) return preference.getIcon();
 
         if (delegate.isPreferenceControlledByPolicy(preference)) {
@@ -108,10 +108,10 @@
      * @param preference The Preference that is being initialized
      */
     public static void initPreference(
-            @Nullable ManagedPreferenceDelegateCompat delegate, Preference preference) {
+            @Nullable ManagedPreferenceDelegate delegate, Preference preference) {
         if (delegate == null) return;
 
-        if (!(preference instanceof ChromeImageViewPreferenceCompat)) {
+        if (!(preference instanceof ChromeImageViewPreference)) {
             preference.setIcon(getManagedIconDrawable(delegate, preference));
         }
 
@@ -140,7 +140,7 @@
      * @param view The View that was bound to the Preference
      */
     public static void onBindViewToPreference(
-            @Nullable ManagedPreferenceDelegateCompat delegate, Preference preference, View view) {
+            @Nullable ManagedPreferenceDelegate delegate, Preference preference, View view) {
         if (delegate == null) return;
 
         if (delegate.isPreferenceClickDisabledByPolicy(preference)) {
@@ -170,9 +170,8 @@
      * @param preference The ChromeImageViewPreference that owns the view.
      * @param view The View that was bound to the ChromeImageViewPreference.
      */
-    public static void onBindViewToImageViewPreference(
-            @Nullable ManagedPreferenceDelegateCompat delegate,
-            ChromeImageViewPreferenceCompat preference, View view) {
+    public static void onBindViewToImageViewPreference(@Nullable ManagedPreferenceDelegate delegate,
+            ChromeImageViewPreference preference, View view) {
         if (delegate == null) return;
 
         onBindViewToPreference(delegate, preference, view);
@@ -205,7 +204,7 @@
      *         propagated; false otherwise.
      */
     public static boolean onClickPreference(
-            @Nullable ManagedPreferenceDelegateCompat delegate, Preference preference) {
+            @Nullable ManagedPreferenceDelegate delegate, Preference preference) {
         if (delegate == null || !delegate.isPreferenceClickDisabledByPolicy(preference)) {
             return false;
         }
@@ -223,7 +222,7 @@
     }
 
     /**
-     * @param delegate The {@link ManagedPreferenceDelegateCompat} that controls whether the
+     * @param delegate The {@link ManagedPreferenceDelegate} that controls whether the
      *         preference is
      *        managed.
      * @param preference The {@link Preference} that the summary
@@ -233,7 +232,7 @@
      *         managed.
      */
     private static CharSequence getSummaryWithManagedInfo(
-            @Nullable ManagedPreferenceDelegateCompat delegate, Preference preference,
+            @Nullable ManagedPreferenceDelegate delegate, Preference preference,
             @Nullable CharSequence summary) {
         if (delegate == null) return summary;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
index c9d977d..05c37299 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/NotificationsPreferences.java
@@ -33,7 +33,7 @@
     // The following field is only set if Feed is disabled, and should be null checked before
     // being used.
     @Nullable
-    private ChromeSwitchPreferenceCompat mSuggestionsPref;
+    private ChromeSwitchPreference mSuggestionsPref;
 
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -43,7 +43,7 @@
         PreferenceUtils.addPreferencesFromResource(this, R.xml.notifications_preferences);
         getActivity().setTitle(R.string.prefs_notifications);
 
-        mSuggestionsPref = (ChromeSwitchPreferenceCompat) findPreference(PREF_SUGGESTIONS);
+        mSuggestionsPref = (ChromeSwitchPreference) findPreference(PREF_SUGGESTIONS);
         mSuggestionsPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> {
             PrefetchPrefs.setNotificationEnabled((boolean) newValue);
             return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java
index 8c8c06d..a915dcfd3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/Preferences.java
@@ -162,7 +162,7 @@
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
-        Fragment fragment = getMainFragmentCompat();
+        Fragment fragment = getMainFragment();
         if (fragment == null || fragment.getView() == null
                 || fragment.getView().findViewById(R.id.list) == null) {
             return;
@@ -219,7 +219,7 @@
      * top of the main content.
      */
     @VisibleForTesting
-    public Fragment getMainFragmentCompat() {
+    public Fragment getMainFragment() {
         return getSupportFragmentManager().findFragmentById(android.R.id.content);
     }
 
@@ -245,8 +245,8 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        Fragment mainFragmentCompat = getMainFragmentCompat();
-        if (mainFragmentCompat != null && mainFragmentCompat.onOptionsItemSelected(item)) {
+        Fragment mainFragment = getMainFragment();
+        if (mainFragment != null && mainFragment.onOptionsItemSelected(item)) {
             return true;
         }
 
@@ -263,7 +263,7 @@
 
     @Override
     public void onBackPressed() {
-        Fragment activeFragment = getMainFragmentCompat();
+        Fragment activeFragment = getMainFragment();
         if (!(activeFragment instanceof OnBackPressedListener)) {
             super.onBackPressed();
             return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
index 000deed..5bd0538 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/PreferencesLauncher.java
@@ -10,6 +10,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
 
 import com.google.android.gms.common.ConnectionResult;
 
@@ -60,9 +61,9 @@
      * @param context The current Activity, or an application context if no Activity is available.
      * @param fragment The fragment to show, or null to show the top-level page.
      */
-    public static void launchSettingsPageCompat(
-            Context context, @Nullable Class<? extends android.support.v4.app.Fragment> fragment) {
-        launchSettingsPageCompat(context, fragment, null);
+    public static void launchSettingsPage(
+            Context context, @Nullable Class<? extends Fragment> fragment) {
+        launchSettingsPage(context, fragment, null);
     }
 
     /**
@@ -72,9 +73,8 @@
      * @param fragment The name of the fragment to show, or null to show the top-level page.
      * @param fragmentArgs The arguments bundle to initialize the instance of subpage fragment.
      */
-    public static void launchSettingsPageCompat(Context context,
-            @Nullable Class<? extends android.support.v4.app.Fragment> fragment,
-            @Nullable Bundle fragmentArgs) {
+    public static void launchSettingsPage(Context context,
+            @Nullable Class<? extends Fragment> fragment, @Nullable Bundle fragmentArgs) {
         String fragmentName = fragment != null ? fragment.getName() : null;
         Intent intent = createIntentForSettingsPage(context, fragmentName, fragmentArgs);
         IntentUtils.safeStartActivity(context, intent);
@@ -146,7 +146,7 @@
             }
         }
 
-        launchSettingsPageCompat(activity, SavePasswordsPreferences.class);
+        launchSettingsPage(activity, SavePasswordsPreferences.class);
     }
 
     @CalledByNative
@@ -171,10 +171,10 @@
     }
 
     private static void showSettingSubpage(
-            WebContents webContents, Class<? extends android.support.v4.app.Fragment> fragment) {
+            WebContents webContents, Class<? extends Fragment> fragment) {
         WeakReference<Activity> currentActivity =
                 webContents.getTopLevelNativeWindow().getActivity();
-        launchSettingsPageCompat(currentActivity.get(), fragment);
+        launchSettingsPage(currentActivity.get(), fragment);
     }
 
     private static boolean isSyncingPasswordsWithoutCustomPassphrase() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
index 49ec5b3..663c9434 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
@@ -476,7 +476,7 @@
         if (linkBeingShown == R.string.search_engine_system_location_disabled) {
             mContext.startActivity(LocationUtils.getInstance().getSystemLocationSettingsIntent());
         } else {
-            PreferencesLauncher.launchSettingsPageCompat(mContext, SingleWebsitePreferences.class,
+            PreferencesLauncher.launchSettingsPage(mContext, SingleWebsitePreferences.class,
                     SingleWebsitePreferences.createFragmentArgsForSite(url));
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreferenceCompat.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java
similarity index 90%
rename from chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreferenceCompat.java
rename to chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java
index 929c11d..e90c0ac8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreferenceCompat.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/TextMessagePreference.java
@@ -15,11 +15,11 @@
 /**
  * A preference that displays informational text.
  */
-public class TextMessagePreferenceCompat extends ChromeBasePreferenceCompat {
+public class TextMessagePreference extends ChromeBasePreference {
     /**
      * Constructor for inflating from XML.
      */
-    public TextMessagePreferenceCompat(Context context, AttributeSet attrs) {
+    public TextMessagePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
         setSelectable(false);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java
index 6df91c9f..e369151 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AndroidPaymentAppsFragment.java
@@ -14,11 +14,12 @@
 import android.support.v7.preference.PreferenceFragmentCompat;
 import android.support.v7.preference.PreferenceScreen;
 import android.util.Pair;
+import android.view.View;
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
 import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
-import org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat;
+import org.chromium.chrome.browser.preferences.TextMessagePreference;
 
 import java.util.Map;
 
@@ -36,6 +37,14 @@
     }
 
     @Override
+    public void onViewCreated(View view, Bundle savedInstanceState) {
+        super.onViewCreated(view, savedInstanceState);
+
+        // Disable animations of preference changes (crbug.com/986241).
+        getListView().setItemAnimator(null);
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         rebuildPaymentAppsList();
@@ -76,8 +85,7 @@
             getPreferenceScreen().addPreference(pref);
         }
 
-        TextMessagePreferenceCompat textPreference =
-                new TextMessagePreferenceCompat(getStyledContext(), null);
+        TextMessagePreference textPreference = new TextMessagePreference(getStyledContext(), null);
         textPreference.setTitle(R.string.payment_apps_usage_message);
         textPreference.setDividerAllowedBelow(false);
         getPreferenceScreen().addPreference(textPreference);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
index 1d29c2b..c8618dbb2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillPaymentMethodsFragment.java
@@ -20,9 +20,9 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager.CreditCard;
 import org.chromium.chrome.browser.payments.AndroidPaymentAppFactory;
 import org.chromium.chrome.browser.payments.ServiceWorkerPaymentAppBridge;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 
 /**
  * Autofill credit cards fragment, which allows the user to edit credit cards and control
@@ -62,8 +62,8 @@
         getPreferenceScreen().removeAll();
         getPreferenceScreen().setOrderingAsAdded(true);
 
-        ChromeSwitchPreferenceCompat autofillSwitch =
-                new ChromeSwitchPreferenceCompat(getStyledContext(), null);
+        ChromeSwitchPreference autofillSwitch =
+                new ChromeSwitchPreference(getStyledContext(), null);
         autofillSwitch.setTitle(R.string.autofill_enable_credit_cards_toggle_label);
         autofillSwitch.setSummary(R.string.autofill_enable_credit_cards_toggle_sublabel);
         autofillSwitch.setChecked(PersonalDataManager.isAutofillCreditCardEnabled());
@@ -71,7 +71,7 @@
             PersonalDataManager.setAutofillCreditCardEnabled((boolean) newValue);
             return true;
         });
-        autofillSwitch.setManagedPreferenceDelegate(new ManagedPreferenceDelegateCompat() {
+        autofillSwitch.setManagedPreferenceDelegate(new ManagedPreferenceDelegate() {
             @Override
             public boolean isPreferenceControlledByPolicy(Preference preference) {
                 return PersonalDataManager.isAutofillCreditCardManaged();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java
index b8787f88..50803aa 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragment.java
@@ -18,9 +18,9 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.autofill.PersonalDataManager.AutofillProfile;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.MainPreferences;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.widget.prefeditor.EditorObserverForTest;
 
 /**
@@ -57,8 +57,8 @@
         getPreferenceScreen().removeAll();
         getPreferenceScreen().setOrderingAsAdded(true);
 
-        ChromeSwitchPreferenceCompat autofillSwitch =
-                new ChromeSwitchPreferenceCompat(getStyledContext(), null);
+        ChromeSwitchPreference autofillSwitch =
+                new ChromeSwitchPreference(getStyledContext(), null);
         autofillSwitch.setTitle(R.string.autofill_enable_profiles_toggle_label);
         autofillSwitch.setSummary(R.string.autofill_enable_profiles_toggle_sublabel);
         autofillSwitch.setChecked(PersonalDataManager.isAutofillProfileEnabled());
@@ -66,7 +66,7 @@
             PersonalDataManager.setAutofillProfileEnabled((boolean) newValue);
             return true;
         });
-        autofillSwitch.setManagedPreferenceDelegate(new ManagedPreferenceDelegateCompat() {
+        autofillSwitch.setManagedPreferenceDelegate(new ManagedPreferenceDelegate() {
             @Override
             public boolean isPreferenceControlledByPolicy(Preference preference) {
                 return PersonalDataManager.isAutofillProfileManaged();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java
index 7a667fca..1aa27a6a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferences.java
@@ -11,7 +11,7 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 
 /** The "Autofill Assistant" preferences screen in Settings. */
 public class AutofillAssistantPreferences extends PreferenceFragmentCompat {
@@ -28,8 +28,8 @@
     }
 
     private void createAutofillAssistantSwitch() {
-        ChromeSwitchPreferenceCompat autofillAssistantSwitch =
-                new ChromeSwitchPreferenceCompat(getStyledContext(), null);
+        ChromeSwitchPreference autofillAssistantSwitch =
+                new ChromeSwitchPreference(getStyledContext(), null);
         autofillAssistantSwitch.setKey(PREF_AUTOFILL_ASSISTANT_SWITCH);
         autofillAssistantSwitch.setTitle(R.string.prefs_autofill_assistant_switch);
         autofillAssistantSwitch.setSummaryOn(R.string.text_on);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
index 27bfca0b..21da79c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/datareduction/DataReductionPreferenceFragment.java
@@ -19,7 +19,7 @@
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.infobar.PreviewsLitePageInfoBar;
 import org.chromium.chrome.browser.net.spdyproxy.DataReductionProxySettings;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.util.IntentUtils;
@@ -144,8 +144,8 @@
     }
 
     private void createDataReductionSwitch(boolean isEnabled) {
-        final ChromeSwitchPreferenceCompat dataReductionSwitch =
-                new ChromeSwitchPreferenceCompat(getPreferenceManager().getContext(), null);
+        final ChromeSwitchPreference dataReductionSwitch =
+                new ChromeSwitchPreference(getPreferenceManager().getContext(), null);
         dataReductionSwitch.setKey(PREF_DATA_REDUCTION_SWITCH);
         dataReductionSwitch.setSummaryOn(R.string.text_on);
         dataReductionSwitch.setSummaryOff(R.string.text_off);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java
index 4e7f156..4320db5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/developer/TracingCategoriesPreferences.java
@@ -11,7 +11,7 @@
 import android.support.v7.preference.PreferenceFragmentCompat;
 import android.support.v7.preference.PreferenceScreen;
 
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
 import org.chromium.chrome.browser.tracing.TracingController;
 
 import java.util.ArrayList;
@@ -55,8 +55,7 @@
     }
 
     private CheckBoxPreference createPreference(String category) {
-        CheckBoxPreference preference =
-                new ChromeBaseCheckBoxPreferenceCompat(getStyledContext(), null);
+        CheckBoxPreference preference = new ChromeBaseCheckBoxPreference(getStyledContext(), null);
         preference.setKey(category);
         preference.setTitle(category.startsWith(TracingPreferences.NON_DEFAULT_CATEGORY_PREFIX)
                         ? category.substring(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java
index 0ba863a..aadbeda 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadPreferences.java
@@ -12,7 +12,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.download.DownloadPromptStatus;
 import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 
@@ -26,8 +26,8 @@
     private static final String PREF_PREFETCHING_ENABLED = "prefetching_enabled";
 
     private DownloadLocationPreference mLocationChangePref;
-    private ChromeSwitchPreferenceCompat mLocationPromptEnabledPref;
-    private ChromeSwitchPreferenceCompat mPrefetchingEnabled;
+    private ChromeSwitchPreference mLocationPromptEnabledPref;
+    private ChromeSwitchPreference mPrefetchingEnabled;
 
     @Override
     public void onCreatePreferences(@Nullable Bundle savedInstanceState, String s) {
@@ -35,14 +35,13 @@
         PreferenceUtils.addPreferencesFromResource(this, R.xml.download_preferences);
 
         mLocationPromptEnabledPref =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_LOCATION_PROMPT_ENABLED);
+                (ChromeSwitchPreference) findPreference(PREF_LOCATION_PROMPT_ENABLED);
         mLocationPromptEnabledPref.setOnPreferenceChangeListener(this);
 
         mLocationChangePref = (DownloadLocationPreference) findPreference(PREF_LOCATION_CHANGE);
 
         if (PrefetchConfiguration.isPrefetchingFlagEnabled()) {
-            mPrefetchingEnabled =
-                    (ChromeSwitchPreferenceCompat) findPreference(PREF_PREFETCHING_ENABLED);
+            mPrefetchingEnabled = (ChromeSwitchPreference) findPreference(PREF_PREFETCHING_ENABLED);
             mPrefetchingEnabled.setOnPreferenceChangeListener(this);
 
             updatePrefetchSummary();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
index 26fe204..8325886 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/languages/LanguagesPreferences.java
@@ -10,7 +10,7 @@
 import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.preferences.PreferencesLauncher;
@@ -36,8 +36,8 @@
                 (LanguageListPreference) findPreference(PREFERRED_LANGUAGES_KEY);
         mLanguageListPref.registerActivityLauncher(this);
 
-        ChromeSwitchPreferenceCompat translateSwitch =
-                (ChromeSwitchPreferenceCompat) findPreference(TRANSLATE_SWITCH_KEY);
+        ChromeSwitchPreference translateSwitch =
+                (ChromeSwitchPreference) findPreference(TRANSLATE_SWITCH_KEY);
         boolean isTranslateEnabled = PrefServiceBridge.getInstance().isTranslateEnabled();
         translateSwitch.setChecked(isTranslateEnabled);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java
index 79c81e1..9ef6c10 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryViewer.java
@@ -224,7 +224,7 @@
         if (id == R.id.action_edit_saved_password) {
             Bundle fragmentArgs = new Bundle();
             fragmentArgs.putInt(SavePasswordsPreferences.PASSWORD_LIST_ID, mID);
-            PreferencesLauncher.launchSettingsPageCompat(
+            PreferencesLauncher.launchSettingsPage(
                     getActivity(), PasswordEntryEditor.class, fragmentArgs);
             return true;
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
index 314b202..5237388 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferences.java
@@ -26,13 +26,13 @@
 import org.chromium.base.StrictModeContext;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.preferences.ChromeBasePreference;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferencesLauncher;
 import org.chromium.chrome.browser.preferences.SearchUtils;
-import org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat;
+import org.chromium.chrome.browser.preferences.TextMessagePreference;
 import org.chromium.ui.text.SpanApplier;
 
 import java.util.Locale;
@@ -82,9 +82,9 @@
 
     private String mSearchQuery;
     private Preference mLinkPref;
-    private ChromeSwitchPreferenceCompat mSavePasswordsSwitch;
-    private ChromeBaseCheckBoxPreferenceCompat mAutoSignInSwitch;
-    private TextMessagePreferenceCompat mEmptyView;
+    private ChromeSwitchPreference mSavePasswordsSwitch;
+    private ChromeBaseCheckBoxPreference mAutoSignInSwitch;
+    private TextMessagePreference mEmptyView;
     private boolean mSearchRecorded;
     private Menu mMenu;
 
@@ -182,7 +182,7 @@
      * Empty screen message when no passwords or exceptions are stored.
      */
     private void displayEmptyScreenMessage() {
-        mEmptyView = new TextMessagePreferenceCompat(getStyledContext(), null);
+        mEmptyView = new TextMessagePreference(getStyledContext(), null);
         mEmptyView.setSummary(R.string.saved_passwords_none_text);
         mEmptyView.setKey(PREF_KEY_SAVED_PASSWORDS_NO_TEXT);
         mEmptyView.setOrder(ORDER_SAVED_PASSWORDS_NO_TEXT);
@@ -377,7 +377,7 @@
             Bundle fragmentAgs = new Bundle(preference.getExtras());
             fragmentAgs.putBoolean(
                     SavePasswordsPreferences.EXTRA_FOUND_VIA_SEARCH, mSearchQuery != null);
-            PreferencesLauncher.launchSettingsPageCompat(
+            PreferencesLauncher.launchSettingsPage(
                     getActivity(), PasswordEntryViewer.class, fragmentAgs);
         }
         return true;
@@ -387,7 +387,7 @@
         if (mSearchQuery != null) {
             return; // Don't create this option when the preferences are filtered for passwords.
         }
-        mSavePasswordsSwitch = new ChromeSwitchPreferenceCompat(getStyledContext(), null);
+        mSavePasswordsSwitch = new ChromeSwitchPreference(getStyledContext(), null);
         mSavePasswordsSwitch.setKey(PREF_SAVE_PASSWORDS_SWITCH);
         mSavePasswordsSwitch.setTitle(R.string.prefs_saved_passwords);
         mSavePasswordsSwitch.setOrder(ORDER_SWITCH);
@@ -416,7 +416,7 @@
         if (mSearchQuery != null) {
             return; // Don't create this option when the preferences are filtered for passwords.
         }
-        mAutoSignInSwitch = new ChromeBaseCheckBoxPreferenceCompat(getStyledContext(), null);
+        mAutoSignInSwitch = new ChromeBaseCheckBoxPreference(getStyledContext(), null);
         mAutoSignInSwitch.setKey(PREF_AUTOSIGNIN_SWITCH);
         mAutoSignInSwitch.setTitle(R.string.passwords_auto_signin_title);
         mAutoSignInSwitch.setOrder(ORDER_AUTO_SIGNIN_CHECKBOX);
@@ -448,7 +448,7 @@
                 ApiCompatibilityUtils.getColor(getResources(), R.color.default_text_color_link));
         SpannableString title = SpanApplier.applySpans(getString(R.string.manage_passwords_text),
                 new SpanApplier.SpanInfo("<link>", "</link>", colorSpan));
-        mLinkPref = new ChromeBasePreferenceCompat(getStyledContext());
+        mLinkPref = new ChromeBasePreference(getStyledContext());
         mLinkPref.setKey(PREF_KEY_MANAGE_ACCOUNT_LINK);
         mLinkPref.setTitle(title);
         mLinkPref.setOnPreferenceClickListener(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java
index 3988888..970b6bd9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/ContextualSearchPreferenceFragment.java
@@ -9,7 +9,7 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.contextualsearch.ContextualSearchUma;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 
@@ -28,8 +28,8 @@
     }
 
     private void initContextualSearchSwitch() {
-        ChromeSwitchPreferenceCompat contextualSearchSwitch =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_CONTEXTUAL_SEARCH_SWITCH);
+        ChromeSwitchPreference contextualSearchSwitch =
+                (ChromeSwitchPreference) findPreference(PREF_CONTEXTUAL_SEARCH_SWITCH);
 
         boolean isContextualSearchEnabled =
                 !PrefServiceBridge.getInstance().isContextualSearchDisabled();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java
index 859a5d61..08cb3fb5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/DoNotTrackPreference.java
@@ -8,7 +8,7 @@
 import android.support.v7.preference.PreferenceFragmentCompat;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 
@@ -23,8 +23,8 @@
         PreferenceUtils.addPreferencesFromResource(this, R.xml.do_not_track_preferences);
         getActivity().setTitle(R.string.do_not_track_title);
 
-        ChromeSwitchPreferenceCompat doNotTrackSwitch =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_DO_NOT_TRACK_SWITCH);
+        ChromeSwitchPreference doNotTrackSwitch =
+                (ChromeSwitchPreference) findPreference(PREF_DO_NOT_TRACK_SWITCH);
 
         boolean isDoNotTrackEnabled = PrefServiceBridge.getInstance().isDoNotTrackEnabled();
         doNotTrackSwitch.setChecked(isDoNotTrackEnabled);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
index 2f72fe5..f5ac214 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/PrivacyPreferences.java
@@ -16,8 +16,8 @@
 import org.chromium.base.BuildInfo;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
@@ -39,7 +39,7 @@
     private static final String PREF_DO_NOT_TRACK = "do_not_track";
     private static final String PREF_SYNC_AND_SERVICES_LINK = "sync_and_services_link";
 
-    private ManagedPreferenceDelegateCompat mManagedPreferenceDelegate;
+    private ManagedPreferenceDelegate mManagedPreferenceDelegate;
 
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
@@ -52,20 +52,19 @@
 
         mManagedPreferenceDelegate = createManagedPreferenceDelegate();
 
-        ChromeBaseCheckBoxPreferenceCompat canMakePaymentPref =
-                (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_CAN_MAKE_PAYMENT);
+        ChromeBaseCheckBoxPreference canMakePaymentPref =
+                (ChromeBaseCheckBoxPreference) findPreference(PREF_CAN_MAKE_PAYMENT);
         canMakePaymentPref.setOnPreferenceChangeListener(this);
 
-        ChromeBaseCheckBoxPreferenceCompat networkPredictionPref =
-                (ChromeBaseCheckBoxPreferenceCompat) findPreference(PREF_NETWORK_PREDICTIONS);
+        ChromeBaseCheckBoxPreference networkPredictionPref =
+                (ChromeBaseCheckBoxPreference) findPreference(PREF_NETWORK_PREDICTIONS);
         networkPredictionPref.setChecked(prefServiceBridge.getNetworkPredictionEnabled());
         networkPredictionPref.setOnPreferenceChangeListener(this);
         networkPredictionPref.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
         Preference syncAndServicesLink = findPreference(PREF_SYNC_AND_SERVICES_LINK);
         NoUnderlineClickableSpan linkSpan = new NoUnderlineClickableSpan(getResources(), view -> {
-            PreferencesLauncher.launchSettingsPageCompat(getActivity(),
-                    SyncAndServicesPreferences.class,
+            PreferencesLauncher.launchSettingsPage(getActivity(), SyncAndServicesPreferences.class,
                     SyncAndServicesPreferences.createArguments(false));
         });
         syncAndServicesLink.setSummary(
@@ -135,7 +134,7 @@
         }
     }
 
-    private ManagedPreferenceDelegateCompat createManagedPreferenceDelegate() {
+    private ManagedPreferenceDelegate createManagedPreferenceDelegate() {
         return preference -> {
             String key = preference.getKey();
             PrefServiceBridge prefs = PrefServiceBridge.getInstance();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java
index 2777f5b2..54e0294 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/privacy/UsageAndCrashReportsPreferenceFragment.java
@@ -9,7 +9,7 @@
 
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 
@@ -29,8 +29,8 @@
     }
 
     private void initUsageAndCrashReportsSwitch() {
-        ChromeSwitchPreferenceCompat usageAndCrashReportsSwitch =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_USAGE_AND_CRASH_REPORTS_SWITCH);
+        ChromeSwitchPreference usageAndCrashReportsSwitch =
+                (ChromeSwitchPreference) findPreference(PREF_USAGE_AND_CRASH_REPORTS_SWITCH);
         boolean enabled =
                 PrivacyPreferencesManager.getInstance().isUsageAndCrashReportingPermittedByUser();
         usageAndCrashReportsSwitch.setChecked(enabled);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java
index cba8b4ac..cec972e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/AccountManagementFragment.java
@@ -29,7 +29,7 @@
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.ContextUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBasePreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferencesLauncher;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -310,9 +310,8 @@
         }
     }
 
-    private ChromeBasePreferenceCompat createAddAccountPreference() {
-        ChromeBasePreferenceCompat addAccountPreference =
-                new ChromeBasePreferenceCompat(getStyledContext());
+    private ChromeBasePreference createAddAccountPreference() {
+        ChromeBasePreference addAccountPreference = new ChromeBasePreference(getStyledContext());
         addAccountPreference.setLayoutResource(R.layout.account_management_account_row);
         addAccountPreference.setIcon(
                 AppCompatResources.getDrawable(getActivity(), R.drawable.ic_add_circle_40dp));
@@ -433,7 +432,7 @@
     public static void openAccountManagementScreen(@GAIAServiceType int serviceType) {
         Bundle arguments = new Bundle();
         arguments.putInt(SHOW_GAIA_SERVICE_TYPE_EXTRA, serviceType);
-        PreferencesLauncher.launchSettingsPageCompat(
+        PreferencesLauncher.launchSettingsPage(
                 ContextUtils.getApplicationContext(), AccountManagementFragment.class, arguments);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java
index d9256b0..9ba94cb9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/ManageSyncPreferences.java
@@ -29,7 +29,7 @@
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.invalidation.InvalidationController;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
@@ -84,7 +84,7 @@
 
     private final ProfileSyncService mProfileSyncService = ProfileSyncService.get();
 
-    private ChromeSwitchPreferenceCompat mSyncEverything;
+    private ChromeSwitchPreference mSyncEverything;
     private CheckBoxPreference mSyncAutofill;
     private CheckBoxPreference mSyncBookmarks;
     private CheckBoxPreference mSyncPaymentsIntegration;
@@ -108,7 +108,7 @@
 
         PreferenceUtils.addPreferencesFromResource(this, R.xml.manage_sync_preferences);
 
-        mSyncEverything = (ChromeSwitchPreferenceCompat) findPreference(PREF_SYNC_EVERYTHING);
+        mSyncEverything = (ChromeSwitchPreference) findPreference(PREF_SYNC_EVERYTHING);
         mSyncEverything.setOnPreferenceChangeListener(this);
 
         mSyncAutofill = (CheckBoxPreference) findPreference(PREF_SYNC_AUTOFILL);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
index 7b201412..781fc41 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncAndServicesPreferences.java
@@ -41,9 +41,9 @@
 import org.chromium.chrome.browser.help.HelpAndFeedback;
 import org.chromium.chrome.browser.invalidation.InvalidationController;
 import org.chromium.chrome.browser.metrics.UmaSessionStats;
-import org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ChromeBasePreference;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
@@ -118,7 +118,7 @@
     private final PrefServiceBridge mPrefServiceBridge = PrefServiceBridge.getInstance();
     private final PrivacyPreferencesManager mPrivacyPrefManager =
             PrivacyPreferencesManager.getInstance();
-    private final ManagedPreferenceDelegateCompat mManagedPreferenceDelegate =
+    private final ManagedPreferenceDelegate mManagedPreferenceDelegate =
             createManagedPreferenceDelegate();
 
     private boolean mIsFromSigninScreen;
@@ -129,15 +129,15 @@
     private PreferenceCategory mSyncCategory;
     private Preference mSyncErrorCard;
     private Preference mSyncDisabledByAdministrator;
-    private ChromeBasePreferenceCompat mManageSync;
-    private ChromeSwitchPreferenceCompat mSyncRequested;
+    private ChromeBasePreference mManageSync;
+    private ChromeSwitchPreference mSyncRequested;
 
-    private ChromeSwitchPreferenceCompat mSearchSuggestions;
-    private ChromeSwitchPreferenceCompat mNavigationError;
-    private ChromeSwitchPreferenceCompat mSafeBrowsing;
-    private ChromeSwitchPreferenceCompat mSafeBrowsingReporting;
-    private ChromeSwitchPreferenceCompat mUsageAndCrashReporting;
-    private ChromeSwitchPreferenceCompat mUrlKeyedAnonymizedData;
+    private ChromeSwitchPreference mSearchSuggestions;
+    private ChromeSwitchPreference mNavigationError;
+    private ChromeSwitchPreference mSafeBrowsing;
+    private ChromeSwitchPreference mSafeBrowsingReporting;
+    private ChromeSwitchPreference mUsageAndCrashReporting;
+    private ChromeSwitchPreference mUrlKeyedAnonymizedData;
     private @Nullable Preference mContextualSearch;
 
     private ProfileSyncService.SyncSetupInProgressHandle mSyncSetupInProgressHandle;
@@ -190,34 +190,34 @@
         mSyncDisabledByAdministrator = findPreference(PREF_SYNC_DISABLED_BY_ADMINISTRATOR);
         mSyncDisabledByAdministrator.setIcon(
                 ManagedPreferencesUtils.getManagedByEnterpriseIconId());
-        mSyncRequested = (ChromeSwitchPreferenceCompat) findPreference(PREF_SYNC_REQUESTED);
+        mSyncRequested = (ChromeSwitchPreference) findPreference(PREF_SYNC_REQUESTED);
         mSyncRequested.setOnPreferenceChangeListener(this);
-        mManageSync = (ChromeBasePreferenceCompat) findPreference(PREF_MANAGE_SYNC);
+        mManageSync = (ChromeBasePreference) findPreference(PREF_MANAGE_SYNC);
 
-        mSearchSuggestions = (ChromeSwitchPreferenceCompat) findPreference(PREF_SEARCH_SUGGESTIONS);
+        mSearchSuggestions = (ChromeSwitchPreference) findPreference(PREF_SEARCH_SUGGESTIONS);
         mSearchSuggestions.setOnPreferenceChangeListener(this);
         mSearchSuggestions.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
-        mNavigationError = (ChromeSwitchPreferenceCompat) findPreference(PREF_NAVIGATION_ERROR);
+        mNavigationError = (ChromeSwitchPreference) findPreference(PREF_NAVIGATION_ERROR);
         mNavigationError.setOnPreferenceChangeListener(this);
         mNavigationError.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
-        mSafeBrowsing = (ChromeSwitchPreferenceCompat) findPreference(PREF_SAFE_BROWSING);
+        mSafeBrowsing = (ChromeSwitchPreference) findPreference(PREF_SAFE_BROWSING);
         mSafeBrowsing.setOnPreferenceChangeListener(this);
         mSafeBrowsing.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
         mSafeBrowsingReporting =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_SAFE_BROWSING_SCOUT_REPORTING);
+                (ChromeSwitchPreference) findPreference(PREF_SAFE_BROWSING_SCOUT_REPORTING);
         mSafeBrowsingReporting.setOnPreferenceChangeListener(this);
         mSafeBrowsingReporting.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
         mUsageAndCrashReporting =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_USAGE_AND_CRASH_REPORTING);
+                (ChromeSwitchPreference) findPreference(PREF_USAGE_AND_CRASH_REPORTING);
         mUsageAndCrashReporting.setOnPreferenceChangeListener(this);
         mUsageAndCrashReporting.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
         mUrlKeyedAnonymizedData =
-                (ChromeSwitchPreferenceCompat) findPreference(PREF_URL_KEYED_ANONYMIZED_DATA);
+                (ChromeSwitchPreference) findPreference(PREF_URL_KEYED_ANONYMIZED_DATA);
         mUrlKeyedAnonymizedData.setOnPreferenceChangeListener(this);
         mUrlKeyedAnonymizedData.setManagedPreferenceDelegate(mManagedPreferenceDelegate);
 
@@ -561,7 +561,7 @@
         mSyncRequested.setEnabled(canDisableSync());
     }
 
-    private ManagedPreferenceDelegateCompat createManagedPreferenceDelegate() {
+    private ManagedPreferenceDelegate createManagedPreferenceDelegate() {
         return preference -> {
             String key = preference.getKey();
             if (PREF_NAVIGATION_ERROR.equals(key)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncErrorCardPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncErrorCardPreference.java
index 4c6ab85f..dac9e557 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncErrorCardPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/sync/SyncErrorCardPreference.java
@@ -12,14 +12,14 @@
 
 import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBasePreference;
 import org.chromium.ui.UiUtils;
 
 /**
  * A preference that displays hint message to resolve sync error. Click of it navigates user to
  * appropriate place to resolve error.
  */
-public class SyncErrorCardPreference extends ChromeBasePreferenceCompat {
+public class SyncErrorCardPreference extends ChromeBasePreference {
     /**
      * Constructor for inflating from XML.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java
index 63f1a57..c60f4fd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ChosenObjectPreferences.java
@@ -23,8 +23,8 @@
 import org.chromium.base.annotations.RemovableInRelease;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.profiles.Profile;
 
@@ -229,8 +229,7 @@
      */
     private void createHeader() {
         PreferenceScreen preferenceScreen = getPreferenceScreen();
-        ChromeImageViewPreferenceCompat header =
-                new ChromeImageViewPreferenceCompat(getStyledContext());
+        ChromeImageViewPreference header = new ChromeImageViewPreference(getStyledContext());
         String titleText = mObjectInfos.get(0).getName();
         String dialogMsg =
                 String.format(getView().getContext().getString(
@@ -254,7 +253,7 @@
         preferenceScreen.addPreference(header);
 
         // TODO(chouinard): Handle this header and divider in a cleaner way. May need to migrate
-        // WebsitePreference to extend ChromeBasePreferenceCompat to more easily set dividers
+        // WebsitePreference to extend ChromeBasePreference to more easily set dividers
         // programmatically.
         Preference divider = new Preference(getStyledContext());
         divider.setLayoutResource(R.layout.divider_preference);
@@ -286,7 +285,7 @@
                         getInfo();
                     });
 
-            preference.setManagedPreferenceDelegate(new ManagedPreferenceDelegateCompat() {
+            preference.setManagedPreferenceDelegate(new ManagedPreferenceDelegate() {
                 @Override
                 public boolean isPreferenceControlledByPolicy(Preference preference) {
                     return info.isManaged();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java
index fe2430a2..540ad1c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/ManageSpaceActivity.java
@@ -242,7 +242,7 @@
                     getString(R.string.website_settings_storage));
             RecordHistogram.recordEnumeratedHistogram(
                     "Android.ManageSpace.ActionTaken", OPTION_MANAGE_STORAGE, OPTION_MAX);
-            PreferencesLauncher.launchSettingsPageCompat(
+            PreferencesLauncher.launchSettingsPage(
                     this, SingleCategoryPreferences.class, initialArguments);
         } else if (view == mClearAllDataButton) {
             final ActivityManager activityManager =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
index fac8976..40054804 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleCategoryPreferences.java
@@ -41,12 +41,12 @@
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.help.HelpAndFeedback;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.preferences.ChromeBasePreference;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup;
 import org.chromium.chrome.browser.preferences.LocationSettings;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
@@ -512,8 +512,8 @@
                 }
             }
 
-            ChromeSwitchPreferenceCompat binaryToggle =
-                    (ChromeSwitchPreferenceCompat) getPreferenceScreen().findPreference(
+            ChromeSwitchPreference binaryToggle =
+                    (ChromeSwitchPreference) getPreferenceScreen().findPreference(
                             BINARY_TOGGLE_KEY);
             updateAllowedHeader(mAllowedSiteCount, !binaryToggle.isChecked());
 
@@ -820,8 +820,8 @@
                             TRI_STATE_TOGGLE_KEY);
             return (triStateToggle.getCheckedSetting() == ContentSettingValues.BLOCK);
         } else {
-            ChromeSwitchPreferenceCompat binaryToggle =
-                    (ChromeSwitchPreferenceCompat) getPreferenceScreen().findPreference(
+            ChromeSwitchPreference binaryToggle =
+                    (ChromeSwitchPreference) getPreferenceScreen().findPreference(
                             BINARY_TOGGLE_KEY);
             if (binaryToggle != null) return !binaryToggle.isChecked();
         }
@@ -835,8 +835,8 @@
 
         // Find all preferences on the current preference screen. Some preferences are
         // not needed for the current category and will be removed in the steps below.
-        ChromeSwitchPreferenceCompat binaryToggle =
-                (ChromeSwitchPreferenceCompat) screen.findPreference(BINARY_TOGGLE_KEY);
+        ChromeSwitchPreference binaryToggle =
+                (ChromeSwitchPreference) screen.findPreference(BINARY_TOGGLE_KEY);
         TriStateSiteSettingsPreference triStateToggle =
                 (TriStateSiteSettingsPreference) screen.findPreference(TRI_STATE_TOGGLE_KEY);
         Preference thirdPartyCookies = screen.findPreference(THIRD_PARTY_COOKIES_TOGGLE_KEY);
@@ -933,10 +933,8 @@
         }
 
         // Show the link to system settings since permission is disabled.
-        ChromeBasePreferenceCompat osWarning =
-                new ChromeBasePreferenceCompat(getStyledContext(), null);
-        ChromeBasePreferenceCompat osWarningExtra =
-                new ChromeBasePreferenceCompat(getStyledContext(), null);
+        ChromeBasePreference osWarning = new ChromeBasePreference(getStyledContext(), null);
+        ChromeBasePreference osWarningExtra = new ChromeBasePreference(getStyledContext(), null);
         mCategory.configurePermissionIsOffPreferences(
                 osWarning, osWarningExtra, getActivity(), true);
         if (osWarning.getTitle() != null) {
@@ -957,7 +955,7 @@
         triStateToggle.initialize(setting, descriptionIds);
     }
 
-    private void configureBinaryToggle(ChromeSwitchPreferenceCompat binaryToggle, int contentType) {
+    private void configureBinaryToggle(ChromeSwitchPreference binaryToggle, int contentType) {
         binaryToggle.setOnPreferenceChangeListener(this);
         binaryToggle.setTitle(ContentSettingsResources.getTitle(contentType));
 
@@ -970,7 +968,7 @@
         }
         binaryToggle.setSummaryOff(ContentSettingsResources.getDisabledSummary(contentType));
 
-        binaryToggle.setManagedPreferenceDelegate(new ManagedPreferenceDelegateCompat() {
+        binaryToggle.setManagedPreferenceDelegate(new ManagedPreferenceDelegate() {
             @Override
             public boolean isPreferenceControlledByPolicy(Preference preference) {
                 // TODO(bauerb): Align the ManagedPreferenceDelegate and
@@ -994,8 +992,8 @@
     }
 
     private void updateThirdPartyCookiesCheckBox() {
-        ChromeBaseCheckBoxPreferenceCompat thirdPartyCookiesPref =
-                (ChromeBaseCheckBoxPreferenceCompat) getPreferenceScreen().findPreference(
+        ChromeBaseCheckBoxPreference thirdPartyCookiesPref =
+                (ChromeBaseCheckBoxPreference) getPreferenceScreen().findPreference(
                         THIRD_PARTY_COOKIES_TOGGLE_KEY);
         thirdPartyCookiesPref.setChecked(
                 PrefServiceBridge.getInstance().isBlockThirdPartyCookiesEnabled());
@@ -1006,8 +1004,8 @@
     }
 
     private void updateNotificationsVibrateCheckBox() {
-        ChromeBaseCheckBoxPreferenceCompat preference =
-                (ChromeBaseCheckBoxPreferenceCompat) getPreferenceScreen().findPreference(
+        ChromeBaseCheckBoxPreference preference =
+                (ChromeBaseCheckBoxPreference) getPreferenceScreen().findPreference(
                         NOTIFICATIONS_VIBRATE_TOGGLE_KEY);
         if (preference != null) {
             preference.setEnabled(PrefServiceBridge.getInstance().isCategoryEnabled(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
index b84e6cc..18182f4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
@@ -30,8 +30,8 @@
 import org.chromium.chrome.browser.browserservices.Origin;
 import org.chromium.chrome.browser.browserservices.permissiondelegation.TrustedWebActivityPermissionManager;
 import org.chromium.chrome.browser.notifications.channels.SiteChannelsManager;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegateCompat;
+import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
+import org.chromium.chrome.browser.preferences.ManagedPreferenceDelegate;
 import org.chromium.chrome.browser.preferences.ManagedPreferencesUtils;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
@@ -396,10 +396,10 @@
      * summary and (intentionally) loses its click handler.
      * @return A read-only copy of the preference passed in as |oldPreference|.
      */
-    private ChromeImageViewPreferenceCompat replaceWithReadOnlyCopyOf(
+    private ChromeImageViewPreference replaceWithReadOnlyCopyOf(
             Preference oldPreference, String newSummary) {
-        ChromeImageViewPreferenceCompat newPreference =
-                new ChromeImageViewPreferenceCompat(oldPreference.getContext());
+        ChromeImageViewPreference newPreference =
+                new ChromeImageViewPreference(oldPreference.getContext());
         newPreference.setKey(oldPreference.getKey());
         setUpPreferenceCommon(newPreference);
         newPreference.setSummary(newSummary);
@@ -414,7 +414,7 @@
     }
 
     private void setupNotificationManagedByPreference(
-            ChromeImageViewPreferenceCompat preference, Intent settingsIntent) {
+            ChromeImageViewPreference preference, Intent settingsIntent) {
         preference.setImageView(
                 R.drawable.permission_popups, R.string.website_notification_settings, null);
         // By disabling the ImageView, clicks will go through to the preference.
@@ -436,7 +436,7 @@
             String summaryText = String.format(
                     getResources().getString(R.string.website_notification_managed_by_app),
                     managedBy);
-            ChromeImageViewPreferenceCompat newPreference =
+            ChromeImageViewPreference newPreference =
                     replaceWithReadOnlyCopyOf(preference, summaryText);
             setupNotificationManagedByPreference(newPreference, notificationSettingsIntent);
             return;
@@ -469,7 +469,7 @@
 
             // On Android O this preference is read-only, so we replace the existing pref with a
             // regular Preference that takes users to OS settings on click.
-            ChromeImageViewPreferenceCompat newPreference =
+            ChromeImageViewPreference newPreference =
                     replaceWithReadOnlyCopyOf(preference, overrideSummary);
             newPreference.setDefaultValue(value);
 
@@ -559,8 +559,8 @@
         PreferenceScreen preferenceScreen = getPreferenceScreen();
 
         for (ChosenObjectInfo info : mSite.getChosenObjectInfo()) {
-            ChromeImageViewPreferenceCompat preference =
-                    new ChromeImageViewPreferenceCompat(getStyledContext());
+            ChromeImageViewPreference preference =
+                    new ChromeImageViewPreference(getStyledContext());
 
             preference.setKey(CHOOSER_PERMISSION_PREFERENCE_KEY);
             preference.setIcon(ContentSettingsResources.getIcon(info.getContentSettingsType()));
@@ -577,7 +577,7 @@
                         }
                     });
 
-            preference.setManagedPreferenceDelegate(new ManagedPreferenceDelegateCompat() {
+            preference.setManagedPreferenceDelegate(new ManagedPreferenceDelegate() {
                 @Override
                 public boolean isPreferenceControlledByPolicy(Preference preference) {
                     return info.isManaged();
@@ -944,7 +944,7 @@
      */
     private void removeUserChosenObjectPreferences() {
         Preference preference = findPreference(CHOOSER_PERMISSION_PREFERENCE_KEY);
-        if (preference != null && !((ChromeImageViewPreferenceCompat) preference).isManaged()) {
+        if (preference != null && !((ChromeImageViewPreference) preference).isManaged()) {
             getPreferenceScreen().removePreference(preference);
         }
         mObjectUserPermissionCount = 0;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java
index ee69eac4..7c9574e3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreference.java
@@ -11,12 +11,12 @@
 import android.widget.ImageView;
 
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.preferences.ChromeBasePreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBasePreference;
 
 /**
  * A custom preference for drawing Site Settings entries.
  */
-public class SiteSettingsPreference extends ChromeBasePreferenceCompat {
+public class SiteSettingsPreference extends ChromeBasePreference {
     /**
      * Constructor for inflating from XML.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java
index b0be9d2..b29e259 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreference.java
@@ -20,17 +20,17 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.favicon.FaviconHelper;
 import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.widget.RoundedIconGenerator;
 
 /**
  * A preference that displays a website's favicon and URL and, optionally, the amount of local
  * storage used by the site. This preference can also display an additional icon on the right side
- * of the preference. See {@link ChromeImageViewPreferenceCompat} for more details on how this icon
+ * of the preference. See {@link ChromeImageViewPreference} for more details on how this icon
  * can be used.
  */
-class WebsitePreference extends ChromeImageViewPreferenceCompat implements FaviconImageCallback {
+class WebsitePreference extends ChromeImageViewPreference implements FaviconImageCallback {
     private final Website mSite;
     private final SiteSettingsCategory mCategory;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java b/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
index ee4e2d12..024ddb99 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/search_engines/SearchEngineChoiceNotification.java
@@ -79,7 +79,7 @@
 
         @Override
         public void onAction(Object actionData) {
-            PreferencesLauncher.launchSettingsPageCompat(mContext, SearchEnginePreference.class);
+            PreferencesLauncher.launchSettingsPage(mContext, SearchEnginePreference.class);
             recordEvent(Events.PROMPT_FOLLOWED);
             recordSearchEngineTypeBeforeChoicePresented();
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java
index d8a8e79..951009d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfModelObserverBridge.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.send_tab_to_self;
 
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -61,7 +60,7 @@
     public void destroy() {
         if (mNativeModelObserverBridge != 0) {
             Natives jni = SendTabToSelfModelObserverBridgeJni.get();
-            jni.destroy(this, mNativeModelObserverBridge);
+            jni.destroy(mNativeModelObserverBridge);
             mNativeModelObserverBridge = 0;
         }
     }
@@ -152,9 +151,8 @@
 
     @NativeMethods
     interface Natives {
-        long init(@JCaller SendTabToSelfModelObserverBridge bridge, Profile profile);
+        long init(SendTabToSelfModelObserverBridge bridge, Profile profile);
 
-        void destroy(@JCaller SendTabToSelfModelObserverBridge bridge,
-                long nativeSendTabToSelfModelObserverBridge);
+        void destroy(long nativeSendTabToSelfModelObserverBridge);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java
index a262b70..5e65be5a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninFragment.java
@@ -134,7 +134,7 @@
                         UnifiedConsentServiceBridge.setUrlKeyedAnonymizedDataCollectionEnabled(
                                 true);
                         if (settingsClicked) {
-                            PreferencesLauncher.launchSettingsPageCompat(getActivity(),
+                            PreferencesLauncher.launchSettingsPage(getActivity(),
                                     SyncAndServicesPreferences.class,
                                     SyncAndServicesPreferences.createArguments(true));
                         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
index 7fab0c2c..e58378db 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -22,7 +22,6 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
@@ -244,7 +243,7 @@
         mAndroidSyncSettings = androidSyncSettings;
 
         mSigninAllowedByPolicy =
-                SigninManagerJni.get().isSigninAllowedByPolicy(this, mNativeSigninManagerAndroid);
+                SigninManagerJni.get().isSigninAllowedByPolicy(mNativeSigninManagerAndroid);
 
         mAccountTrackerService.addSystemAccountsSeededListener(this);
     }
@@ -316,7 +315,7 @@
      * @return Whether force sign-in is enabled by policy.
      */
     public boolean isForceSigninEnabled() {
-        return SigninManagerJni.get().isForceSigninEnabled(this, mNativeSigninManagerAndroid);
+        return SigninManagerJni.get().isForceSigninEnabled(mNativeSigninManagerAndroid);
     }
 
     /**
@@ -469,7 +468,7 @@
         assert mSignInState != null;
 
         SigninManagerJni.get().onSignInCompleted(
-                this, mNativeSigninManagerAndroid, mSignInState.mAccount.name);
+                mNativeSigninManagerAndroid, mSignInState.mAccount.name);
 
         // Cache the signed-in account name. This must be done after the native call, otherwise
         // sync tries to start without being signed in natively and crashes.
@@ -586,23 +585,23 @@
         Log.d(TAG, "Signing out, management domain: " + mSignOutState.mManagementDomain);
 
         // User data will be wiped in disableSyncAndWipeData(), called from onNativeSignOut().
-        SigninManagerJni.get().signOut(this, mNativeSigninManagerAndroid, signoutSource);
+        SigninManagerJni.get().signOut(mNativeSigninManagerAndroid, signoutSource);
     }
 
     /**
      * Returns the management domain if the signed in account is managed, otherwise returns null.
      */
     public String getManagementDomain() {
-        return SigninManagerJni.get().getManagementDomain(this, mNativeSigninManagerAndroid);
+        return SigninManagerJni.get().getManagementDomain(mNativeSigninManagerAndroid);
     }
 
     @VisibleForTesting
     void logInSignedInUser() {
-        SigninManagerJni.get().logInSignedInUser(this, mNativeSigninManagerAndroid);
+        SigninManagerJni.get().logInSignedInUser(mNativeSigninManagerAndroid);
     }
 
     public void clearLastSignedInUser() {
-        SigninManagerJni.get().clearLastSignedInUser(this, mNativeSigninManagerAndroid);
+        SigninManagerJni.get().clearLastSignedInUser(mNativeSigninManagerAndroid);
     }
 
     /**
@@ -678,7 +677,7 @@
      * @return Whether there is a signed in account on the native side.
      */
     public boolean isSignedInOnNative() {
-        return SigninManagerJni.get().isSignedInOnNative(this, mNativeSigninManagerAndroid);
+        return SigninManagerJni.get().isSignedInOnNative(mNativeSigninManagerAndroid);
     }
 
     @CalledByNative
@@ -696,7 +695,7 @@
      *                 otherwise.
      */
     public void isAccountManaged(String email, final Callback<Boolean> callback) {
-        SigninManagerJni.get().isAccountManaged(this, mNativeSigninManagerAndroid, email, callback);
+        SigninManagerJni.get().isAccountManaged(mNativeSigninManagerAndroid, email, callback);
     }
 
     public static String extractDomainName(String email) {
@@ -716,11 +715,11 @@
 
     private void fetchAndApplyCloudPolicy(String username, final Runnable callback) {
         SigninManagerJni.get().fetchAndApplyCloudPolicy(
-                this, mNativeSigninManagerAndroid, username, callback);
+                mNativeSigninManagerAndroid, username, callback);
     }
 
     private void stopApplyingCloudPolicy() {
-        SigninManagerJni.get().stopApplyingCloudPolicy(this, mNativeSigninManagerAndroid);
+        SigninManagerJni.get().stopApplyingCloudPolicy(mNativeSigninManagerAndroid);
     }
 
     private void enableSync(Account account) {
@@ -734,52 +733,46 @@
             boolean isManagedOrForceWipe, final Runnable wipeDataCallback) {
         mAndroidSyncSettings.updateAccount(null);
         if (isManagedOrForceWipe) {
-            SigninManagerJni.get().wipeProfileData(
-                    this, mNativeSigninManagerAndroid, wipeDataCallback);
+            SigninManagerJni.get().wipeProfileData(mNativeSigninManagerAndroid, wipeDataCallback);
         } else {
             SigninManagerJni.get().wipeGoogleServiceWorkerCaches(
-                    this, mNativeSigninManagerAndroid, wipeDataCallback);
+                    mNativeSigninManagerAndroid, wipeDataCallback);
         }
     }
 
     // Native methods.
     @NativeMethods
     interface Natives {
-        boolean isSigninAllowedByPolicy(
-                @JCaller SigninManager self, long nativeSigninManagerAndroid);
+        boolean isSigninAllowedByPolicy(long nativeSigninManagerAndroid);
 
-        boolean isForceSigninEnabled(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+        boolean isForceSigninEnabled(long nativeSigninManagerAndroid);
 
-        void onSignInCompleted(
-                @JCaller SigninManager self, long nativeSigninManagerAndroid, String username);
+        void onSignInCompleted(long nativeSigninManagerAndroid, String username);
 
-        void signOut(@JCaller SigninManager self, long nativeSigninManagerAndroid,
-                @SignoutReason int reason);
+        void signOut(long nativeSigninManagerAndroid, @SignoutReason int reason);
 
-        void clearLastSignedInUser(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+        void clearLastSignedInUser(long nativeSigninManagerAndroid);
 
-        void logInSignedInUser(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+        void logInSignedInUser(long nativeSigninManagerAndroid);
 
-        boolean isSignedInOnNative(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+        boolean isSignedInOnNative(long nativeSigninManagerAndroid);
 
         String extractDomainName(String email);
 
         boolean isMobileIdentityConsistencyEnabled();
 
-        void fetchAndApplyCloudPolicy(@JCaller SigninManager self, long nativeSigninManagerAndroid,
-                String username, Runnable callback);
+        void fetchAndApplyCloudPolicy(
+                long nativeSigninManagerAndroid, String username, Runnable callback);
 
-        void stopApplyingCloudPolicy(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+        void stopApplyingCloudPolicy(long nativeSigninManagerAndroid);
 
-        void isAccountManaged(@JCaller SigninManager self, long nativeSigninManagerAndroid,
-                String username, Callback<Boolean> callback);
+        void isAccountManaged(
+                long nativeSigninManagerAndroid, String username, Callback<Boolean> callback);
 
-        String getManagementDomain(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+        String getManagementDomain(long nativeSigninManagerAndroid);
 
-        void wipeProfileData(
-                @JCaller SigninManager self, long nativeSigninManagerAndroid, Runnable callback);
+        void wipeProfileData(long nativeSigninManagerAndroid, Runnable callback);
 
-        void wipeGoogleServiceWorkerCaches(
-                @JCaller SigninManager self, long nativeSigninManagerAndroid, Runnable callback);
+        void wipeGoogleServiceWorkerCaches(long nativeSigninManagerAndroid, Runnable callback);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
index 9cd4bd4..c5f314586 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SyncPromoView.java
@@ -175,7 +175,7 @@
 
         ButtonState positiveButton = new ButtonPresent(R.string.enable_sync_button,
                 view
-                -> PreferencesLauncher.launchSettingsPageCompat(getContext(),
+                -> PreferencesLauncher.launchSettingsPage(getContext(),
                         SyncAndServicesPreferences.class,
                         SyncAndServicesPreferences.createArguments(false)));
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
index 74ef794..bf4dd662 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
@@ -32,7 +32,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
 import org.chromium.chrome.browser.invalidation.InvalidationController;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PreferenceUtils;
 import org.chromium.chrome.browser.preferences.sync.SyncPreferenceUtils;
 import org.chromium.chrome.browser.preferences.sync.SyncedAccountPreference;
@@ -110,7 +110,7 @@
         int OTHER_ERRORS = 128;
     }
 
-    private ChromeSwitchPreferenceCompat mSyncSwitchPreference;
+    private ChromeSwitchPreference mSyncSwitchPreference;
     private boolean mIsEngineInitialized;
     private boolean mIsPassphraseRequired;
 
@@ -173,7 +173,7 @@
             type.setOnPreferenceChangeListener(this);
         }
 
-        mSyncSwitchPreference = (ChromeSwitchPreferenceCompat) findPreference(PREF_SYNC_SWITCH);
+        mSyncSwitchPreference = (ChromeSwitchPreference) findPreference(PREF_SYNC_SWITCH);
         mSyncSwitchPreference.setOnPreferenceChangeListener((preference, newValue) -> {
             assert canDisableSync();
             SyncPreferenceUtils.enableSync((boolean) newValue);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
index b2e25d1..7339594 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/IdentityDiscController.java
@@ -132,8 +132,7 @@
         Drawable profileImage = mProfileDataCache.getProfileDataOrDefault(accountName).getImage();
         mToolbarManager.enableExperimentalButton(view -> {
             RecordUserAction.record("MobileToolbarIdentityDiscTap");
-            PreferencesLauncher.launchSettingsPageCompat(
-                    mContext, SyncAndServicesPreferences.class);
+            PreferencesLauncher.launchSettingsPage(mContext, SyncAndServicesPreferences.class);
         }, profileImage, R.string.accessibility_toolbar_btn_identity_disc);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkHandlerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkHandlerDelegate.java
index d67b4d8..0cc2d3044 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkHandlerDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkHandlerDelegate.java
@@ -10,7 +10,6 @@
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.ShortcutSource;
 import org.chromium.webapk.lib.client.WebApkValidator;
@@ -23,11 +22,10 @@
 
     @NativeMethods
     interface Natives {
-        void onWebApkInfoRetrieved(@JCaller WebApkHandlerDelegate self,
-                long nativeWebApkHandlerDelegate, String name, String shortName, String packageName,
-                String id, int shellApkVersion, int versionCode, String uri, String scope,
-                String manifestUrl, String manifestStartUrl, int displayMode, int orientation,
-                long themeColor, long backgroundColor, long lastUpdateCheckTimeMs,
+        void onWebApkInfoRetrieved(long nativeWebApkHandlerDelegate, String name, String shortName,
+                String packageName, String id, int shellApkVersion, int versionCode, String uri,
+                String scope, String manifestUrl, String manifestStartUrl, int displayMode,
+                int orientation, long themeColor, long backgroundColor, long lastUpdateCheckTimeMs,
                 long lastUpdateCompletionTimeMs, boolean relaxUpdates,
                 String backingBrowserPackageName, boolean isBackingBrowser, String updateStatus);
     }
@@ -100,12 +98,12 @@
             relaxUpdatesForStorage = storage.shouldRelaxUpdates();
             updateStatus = storage.getUpdateStatus();
         }
-        WebApkHandlerDelegateJni.get().onWebApkInfoRetrieved(this, mNativePointer,
-                webApkInfo.name(), webApkInfo.shortName(), webApkInfo.webApkPackageName(),
-                webApkInfo.id(), webApkInfo.shellApkVersion(), packageInfo.versionCode,
-                webApkInfo.uri().toString(), webApkInfo.scopeUri().toString(),
-                webApkInfo.manifestUrl(), webApkInfo.manifestStartUrl(), webApkInfo.displayMode(),
-                webApkInfo.orientation(), webApkInfo.themeColor(), webApkInfo.backgroundColor(),
+        WebApkHandlerDelegateJni.get().onWebApkInfoRetrieved(mNativePointer, webApkInfo.name(),
+                webApkInfo.shortName(), webApkInfo.webApkPackageName(), webApkInfo.id(),
+                webApkInfo.shellApkVersion(), packageInfo.versionCode, webApkInfo.uri().toString(),
+                webApkInfo.scopeUri().toString(), webApkInfo.manifestUrl(),
+                webApkInfo.manifestStartUrl(), webApkInfo.displayMode(), webApkInfo.orientation(),
+                webApkInfo.themeColor(), webApkInfo.backgroundColor(),
                 lastUpdateCheckTimeMsForStorage, lastUpdateCompletionTimeMsInStorage,
                 relaxUpdatesForStorage, backingBrowserPackageName, isBackingBrowser, updateStatus);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/SmsReceiverDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/SmsReceiverDialogTest.java
index 3e38541dc..6297fad 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/SmsReceiverDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/SmsReceiverDialogTest.java
@@ -16,7 +16,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
@@ -47,12 +46,12 @@
 
     private class TestSmsReceiverDialogJni implements SmsReceiverDialog.Natives {
         @Override
-        public void onCancel(@JCaller SmsReceiverDialog self, long nativeSmsDialogAndroid) {
+        public void onCancel(long nativeSmsDialogAndroid) {
             mCancelButtonClickedCallback.notifyCalled();
         }
 
         @Override
-        public void onContinue(@JCaller SmsReceiverDialog self, long nativeSmsDialogAndroid) {
+        public void onContinue(long nativeSmsDialogAndroid) {
             mContinueButtonClickedCallback.notifyCalled();
         }
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
index f834528d..6ecea73 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browserservices/permissiondelegation/TrustedWebActivityPreferencesUiTest.java
@@ -20,7 +20,7 @@
 import org.chromium.chrome.browser.ChromeApplication;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.browserservices.Origin;
-import org.chromium.chrome.browser.preferences.ChromeImageViewPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeImageViewPreference;
 import org.chromium.chrome.browser.preferences.ExpandablePreferenceGroup;
 import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.preferences.website.SingleCategoryPreferences;
@@ -81,7 +81,7 @@
         final SingleCategoryPreferences websitePreferences =
                 TestThreadUtils.runOnUiThreadBlocking(() -> {
                     final SingleCategoryPreferences preferences =
-                            (SingleCategoryPreferences) preferenceActivity.getMainFragmentCompat();
+                            (SingleCategoryPreferences) preferenceActivity.getMainFragment();
                     final ExpandablePreferenceGroup group =
                             (ExpandablePreferenceGroup) preferences.findPreference(groupName);
                     preferences.onPreferenceClick(group);
@@ -135,9 +135,9 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             final SingleWebsitePreferences websitePreferences =
-                    (SingleWebsitePreferences) preferenceActivity.getMainFragmentCompat();
-            final ChromeImageViewPreferenceCompat notificationPreference =
-                    (ChromeImageViewPreferenceCompat) websitePreferences.findPreference(
+                    (SingleWebsitePreferences) preferenceActivity.getMainFragment();
+            final ChromeImageViewPreference notificationPreference =
+                    (ChromeImageViewPreference) websitePreferences.findPreference(
                             "push_notifications_list");
             CharSequence summary = notificationPreference.getSummary();
             Assert.assertTrue(summary.toString().startsWith("Managed by "));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
index 0eca668d..e240a05 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
@@ -65,53 +65,57 @@
     private int mRestartSearchCount;
 
     private class TestBluetoothChooserDialogJni implements BluetoothChooserDialog.Natives {
+        private BluetoothChooserDialog mBluetoothChooserDialog;
+
+        TestBluetoothChooserDialogJni(BluetoothChooserDialog dialog) {
+            mBluetoothChooserDialog = dialog;
+        }
+
         @Override
-        public void onDialogFinished(BluetoothChooserDialog self,
+        public void onDialogFinished(
                 long nativeBluetoothChooserAndroid, int eventType, String deviceId) {
-            Assert.assertEquals(
-                    nativeBluetoothChooserAndroid, self.mNativeBluetoothChooserDialogPtr);
+            Assert.assertEquals(nativeBluetoothChooserAndroid,
+                    mBluetoothChooserDialog.mNativeBluetoothChooserDialogPtr);
             Assert.assertEquals(mFinishedEventType, -1);
             mFinishedEventType = eventType;
             mFinishedDeviceId = deviceId;
             // The native code calls closeDialog() when OnDialogFinished is called.
-            self.closeDialog();
+            mBluetoothChooserDialog.closeDialog();
         }
 
         @Override
-        public void restartSearch(BluetoothChooserDialog self, long nativeBluetoothChooserAndroid) {
-            Assert.assertTrue(self.mNativeBluetoothChooserDialogPtr != 0);
+        public void restartSearch(long nativeBluetoothChooserAndroid) {
+            Assert.assertTrue(mBluetoothChooserDialog.mNativeBluetoothChooserDialogPtr != 0);
             mRestartSearchCount++;
         }
 
         @Override
-        public void showBluetoothOverviewLink(
-                BluetoothChooserDialog self, long nativeBluetoothChooserAndroid) {
+        public void showBluetoothOverviewLink(long nativeBluetoothChooserAndroid) {
             // We shouldn't be running native functions if the native class has been destroyed.
-            Assert.assertTrue(self.mNativeBluetoothChooserDialogPtr != 0);
+            Assert.assertTrue(mBluetoothChooserDialog.mNativeBluetoothChooserDialogPtr != 0);
         }
 
         @Override
-        public void showBluetoothAdapterOffLink(
-                BluetoothChooserDialog self, long nativeBluetoothChooserAndroid) {
+        public void showBluetoothAdapterOffLink(long nativeBluetoothChooserAndroid) {
             // We shouldn't be running native functions if the native class has been destroyed.
-            Assert.assertTrue(self.mNativeBluetoothChooserDialogPtr != 0);
+            Assert.assertTrue(mBluetoothChooserDialog.mNativeBluetoothChooserDialogPtr != 0);
         }
 
         @Override
-        public void showNeedLocationPermissionLink(
-                BluetoothChooserDialog self, long nativeBluetoothChooserAndroid) {
+        public void showNeedLocationPermissionLink(long nativeBluetoothChooserAndroid) {
             // We shouldn't be running native functions if the native class has been destroyed.
-            Assert.assertTrue(self.mNativeBluetoothChooserDialogPtr != 0);
+            Assert.assertTrue(mBluetoothChooserDialog.mNativeBluetoothChooserDialogPtr != 0);
         }
     }
 
     @Before
     public void setUp() throws Exception {
-        mocker.mock(BluetoothChooserDialogJni.TEST_HOOKS, new TestBluetoothChooserDialogJni());
         mActivityTestRule.startMainActivityOnBlankPage();
         mLocationUtils = new FakeLocationUtils();
         LocationUtils.setFactory(() -> mLocationUtils);
         mChooserDialog = createDialog();
+        mocker.mock(BluetoothChooserDialogJni.TEST_HOOKS,
+                new TestBluetoothChooserDialogJni(mChooserDialog));
     }
 
     @After
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java
index f984d86..3045a1a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothScanningPermissionDialogTest.java
@@ -16,7 +16,6 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.JniMocker;
 import org.chromium.chrome.R;
@@ -51,8 +50,7 @@
     private class TestBluetoothScanningPermissionDialogJni
             implements BluetoothScanningPermissionDialog.Natives {
         @Override
-        public void onDialogFinished(@JCaller BluetoothScanningPermissionDialog self,
-                long nativeBluetoothScanningPromptAndroid, int eventType) {
+        public void onDialogFinished(long nativeBluetoothScanningPromptAndroid, int eventType) {
             mFinishedEventType = eventType;
         }
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java
index e3ada1d..15c7a7a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/UsbChooserDialogTest.java
@@ -51,16 +51,15 @@
 
     private class TestUsbChooserDialogJni implements UsbChooserDialog.Natives {
         @Override
-        public void onItemSelected(
-                UsbChooserDialog self, long nativeUsbChooserDialogAndroid, String deviceId) {
+        public void onItemSelected(long nativeUsbChooserDialogAndroid, String deviceId) {
             mSelectedDeviceId = deviceId;
         }
 
         @Override
-        public void onDialogCancelled(UsbChooserDialog self, long nativeUsbChooserDialogAndroid) {}
+        public void onDialogCancelled(long nativeUsbChooserDialogAndroid) {}
 
         @Override
-        public void loadUsbHelpPage(UsbChooserDialog self, long nativeUsbChooserDialogAndroid) {}
+        public void loadUsbHelpPage(long nativeUsbChooserDialogAndroid) {}
     }
 
     @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
index 9e28b8ee..c70fc353 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridgeIntentTest.java
@@ -80,8 +80,8 @@
                 });
         Assert.assertNotNull("Could not find the Preferences activity", activity);
 
-        SingleCategoryPreferences fragment = ActivityUtils.waitForFragmentToAttachCompat(
-                activity, SingleCategoryPreferences.class);
+        SingleCategoryPreferences fragment =
+                ActivityUtils.waitForFragmentToAttach(activity, SingleCategoryPreferences.class);
         Assert.assertNotNull("Could not find the SingleCategoryPreferences fragment", fragment);
     }
 
@@ -119,8 +119,8 @@
                 });
         Assert.assertNotNull("Could not find the Preferences activity", activity);
 
-        SingleWebsitePreferences fragment = ActivityUtils.waitForFragmentToAttachCompat(
-                activity, SingleWebsitePreferences.class);
+        SingleWebsitePreferences fragment =
+                ActivityUtils.waitForFragmentToAttach(activity, SingleWebsitePreferences.class);
         Assert.assertNotNull("Could not find the SingleWebsitePreferences fragment", fragment);
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
index 2d3d064a..5c304983 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageIntegrationTest.java
@@ -28,7 +28,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.HomepageEditor;
 import org.chromium.chrome.browser.preferences.HomepagePreferences;
 import org.chromium.chrome.browser.preferences.Preferences;
@@ -246,9 +246,8 @@
         PreferenceFragmentCompat fragment =
                 (PreferenceFragmentCompat) homepagePreferenceActivity.getSupportFragmentManager()
                         .findFragmentById(android.R.id.content);
-        ChromeSwitchPreferenceCompat preference =
-                (ChromeSwitchPreferenceCompat) fragment.findPreference(
-                        HomepagePreferences.PREF_HOMEPAGE_SWITCH);
+        ChromeSwitchPreference preference = (ChromeSwitchPreference) fragment.findPreference(
+                HomepagePreferences.PREF_HOMEPAGE_SWITCH);
         Assert.assertNotNull(preference);
 
         // Click toggle and verify that checked state matches expectation.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
index 6cb8864f..711d3aa 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/NotificationsPreferencesTest.java
@@ -62,10 +62,9 @@
         // clang-format on
 
         final PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) mActivity.getMainFragmentCompat();
-        final ChromeSwitchPreferenceCompat toggle =
-                (ChromeSwitchPreferenceCompat) fragment.findPreference(
-                        NotificationsPreferences.PREF_SUGGESTIONS);
+                (PreferenceFragmentCompat) mActivity.getMainFragment();
+        final ChromeSwitchPreference toggle = (ChromeSwitchPreference) fragment.findPreference(
+                NotificationsPreferences.PREF_SUGGESTIONS);
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             // Make sure the toggle reflects the state correctly.
@@ -99,11 +98,9 @@
     public void testToggleDisabledWhenPrefetchingDisabled() {
         // clang-format on
 
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) mActivity.getMainFragmentCompat();
-        ChromeSwitchPreferenceCompat toggle =
-                (ChromeSwitchPreferenceCompat) fragment.findPreference(
-                        NotificationsPreferences.PREF_SUGGESTIONS);
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) mActivity.getMainFragment();
+        ChromeSwitchPreference toggle = (ChromeSwitchPreference) fragment.findPreference(
+                NotificationsPreferences.PREF_SUGGESTIONS);
 
         Assert.assertFalse(toggle.isEnabled());
         Assert.assertFalse(toggle.isChecked());
@@ -122,7 +119,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             PreferenceFragmentCompat fragment =
-                    (PreferenceFragmentCompat) mActivity.getMainFragmentCompat();
+                    (PreferenceFragmentCompat) mActivity.getMainFragment();
             Preference fromWebsites =
                     fragment.findPreference(NotificationsPreferences.PREF_FROM_WEBSITES);
 
@@ -153,7 +150,7 @@
         // clang-format on
 
         final PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) mActivity.getMainFragmentCompat();
+                (PreferenceFragmentCompat) mActivity.getMainFragment();
         final Preference fromWebsites =
                 fragment.findPreference(NotificationsPreferences.PREF_FROM_WEBSITES);
 
@@ -173,7 +170,7 @@
     /** Gets the fragment of the top Activity. Assumes the top Activity is a Preferences. */
     private static Fragment getTopFragment() {
         Preferences preferences = (Preferences) ApplicationStatus.getLastTrackedFocusedActivity();
-        return preferences.getMainFragmentCompat();
+        return preferences.getMainFragment();
     }
 
     /** Gets the summary text that should be used for site specific notifications. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java
index bd94ef79..4023eec 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PasswordViewingTypeTest.java
@@ -43,7 +43,7 @@
     public NativeLibraryTestRule mActivityTestRule = new NativeLibraryTestRule();
 
     private MainPreferences mMainPreferences;
-    private ChromeBasePreferenceCompat mPasswordsPref;
+    private ChromeBasePreference mPasswordsPref;
     private Context mContext;
     private MockSyncContentResolverDelegate mSyncContentResolverDelegate;
     private String mAuthority;
@@ -57,8 +57,8 @@
         mContext = InstrumentationRegistry.getTargetContext();
         mMainPreferences = (MainPreferences) startMainPreferences(
                 InstrumentationRegistry.getInstrumentation(), mContext)
-                                   .getMainFragmentCompat();
-        mPasswordsPref = (ChromeBasePreferenceCompat) mMainPreferences.findPreference(
+                                   .getMainFragment();
+        mPasswordsPref = (ChromeBasePreference) mMainPreferences.findPreference(
                 MainPreferences.PREF_SAVED_PASSWORDS);
         AndroidSyncSettings.overrideForTests(mSyncContentResolverDelegate, null);
         mAuthority = AndroidSyncSettings.get().getContractAuthority();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
index 3983bfd..bfd3eb4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/PreferencesTest.java
@@ -98,8 +98,7 @@
 
         // Set the second search engine as the default using TemplateUrlService.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            SearchEnginePreference pref =
-                    (SearchEnginePreference) prefActivity.getMainFragmentCompat();
+            SearchEnginePreference pref = (SearchEnginePreference) prefActivity.getMainFragment();
             pref.setValueForTesting("1");
 
             // Ensure that the second search engine in the list is selected.
@@ -181,8 +180,8 @@
         Preferences preferenceActivity = ActivityUtils.waitForActivity(
                 InstrumentationRegistry.getInstrumentation(), Preferences.class);
 
-        final MainPreferences mainPreferences = ActivityUtils.waitForFragmentToAttachCompat(
-                preferenceActivity, MainPreferences.class);
+        final MainPreferences mainPreferences =
+                ActivityUtils.waitForFragmentToAttach(preferenceActivity, MainPreferences.class);
 
         final android.support.v7.preference.Preference searchEnginePref =
                 waitForPreference(mainPreferences, MainPreferences.PREF_SEARCH_ENGINE);
@@ -194,7 +193,7 @@
             }
         }));
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            ManagedPreferenceDelegateCompat managedPrefDelegate =
+            ManagedPreferenceDelegate managedPrefDelegate =
                     mainPreferences.getManagedPreferenceDelegateForTest();
             Assert.assertTrue(managedPrefDelegate.isPreferenceControlledByPolicy(searchEnginePref));
         });
@@ -221,15 +220,13 @@
 
         // Set the first search engine as the default using TemplateUrlService.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            SearchEnginePreference pref =
-                    (SearchEnginePreference) prefActivity.getMainFragmentCompat();
+            SearchEnginePreference pref = (SearchEnginePreference) prefActivity.getMainFragment();
             pref.setValueForTesting("0");
         });
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             // Ensure that the first search engine in the list is selected.
-            SearchEnginePreference pref =
-                    (SearchEnginePreference) prefActivity.getMainFragmentCompat();
+            SearchEnginePreference pref = (SearchEnginePreference) prefActivity.getMainFragment();
             Assert.assertNotNull(pref);
             Assert.assertEquals("0", pref.getValueForTesting());
 
@@ -299,11 +296,11 @@
         String accessibilityPrefClassname = AccessibilityPreferences.class.getName();
         AccessibilityPreferences accessibilityPref = (AccessibilityPreferences) startPreferences(
                 InstrumentationRegistry.getInstrumentation(), accessibilityPrefClassname)
-                                                             .getMainFragmentCompat();
+                                                             .getMainFragment();
         SeekBarPreference textScalePref = (SeekBarPreference) accessibilityPref.findPreference(
                 AccessibilityPreferences.PREF_TEXT_SCALE);
-        ChromeBaseCheckBoxPreferenceCompat forceEnableZoomPref =
-                (ChromeBaseCheckBoxPreferenceCompat) accessibilityPref.findPreference(
+        ChromeBaseCheckBoxPreference forceEnableZoomPref =
+                (ChromeBaseCheckBoxPreference) accessibilityPref.findPreference(
                         AccessibilityPreferences.PREF_FORCE_ENABLE_ZOOM);
         NumberFormat percentFormat = NumberFormat.getPercentInstance();
         // Arbitrary value 0.4f to be larger and smaller than threshold.
@@ -349,7 +346,7 @@
         String accessibilityPrefClassname = AccessibilityPreferences.class.getName();
         AccessibilityPreferences accessibilityPref = (AccessibilityPreferences) startPreferences(
                 InstrumentationRegistry.getInstrumentation(), accessibilityPrefClassname)
-                                                             .getMainFragmentCompat();
+                                                             .getMainFragment();
         android.support.v7.preference.Preference captionsPref =
                 accessibilityPref.findPreference(AccessibilityPreferences.PREF_CAPTIONS);
         Assert.assertNotNull(captionsPref);
@@ -408,7 +405,7 @@
     }
 
     private static void userSetForceEnableZoom(final AccessibilityPreferences accessibilityPref,
-            final ChromeBaseCheckBoxPreferenceCompat forceEnableZoomPref, final boolean enabled) {
+            final ChromeBaseCheckBoxPreference forceEnableZoomPref, final boolean enabled) {
         PostTask.runOrPostTask(UiThreadTaskTraits.DEFAULT,
                 () -> { accessibilityPref.onPreferenceChange(forceEnableZoomPref, enabled); });
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java
index 719253f2..46594813 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill/AutofillProfilesFragmentTest.java
@@ -69,13 +69,12 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
         AutofillProfilesFragment autofillProfileFragment =
-                (AutofillProfilesFragment) activity.getMainFragmentCompat();
+                (AutofillProfilesFragment) activity.getMainFragment();
 
         // Check the preferences on the initial screen.
         Assert.assertEquals(6 /* One toggle + one add button + four profiles. */,
                 autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference addProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference(
                         AutofillProfilesFragment.PREF_NEW_PROFILE);
@@ -113,13 +112,12 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
         AutofillProfilesFragment autofillProfileFragment =
-                (AutofillProfilesFragment) activity.getMainFragmentCompat();
+                (AutofillProfilesFragment) activity.getMainFragment();
 
         // Check the preferences on the initial screen.
         Assert.assertEquals(6 /* One toggle + one add button + four profiles. */,
                 autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference addProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference(
                         AutofillProfilesFragment.PREF_NEW_PROFILE);
@@ -139,13 +137,12 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
         AutofillProfilesFragment autofillProfileFragment =
-                (AutofillProfilesFragment) activity.getMainFragmentCompat();
+                (AutofillProfilesFragment) activity.getMainFragment();
 
         // Check the preferences on the initial screen.
         Assert.assertEquals(6 /* One toggle + one add button + four profiles. */,
                 autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference sebProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference("Seb Doe");
         Assert.assertNotNull(sebProfile);
@@ -174,13 +171,12 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
         AutofillProfilesFragment autofillProfileFragment =
-                (AutofillProfilesFragment) activity.getMainFragmentCompat();
+                (AutofillProfilesFragment) activity.getMainFragment();
 
         // Check the preferences on the initial screen.
         Assert.assertEquals(6 /* One toggle + one add button + four profiles. */,
                 autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference johnProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference("John Doe");
         Assert.assertNotNull(johnProfile);
@@ -219,13 +215,12 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
         AutofillProfilesFragment autofillProfileFragment =
-                (AutofillProfilesFragment) activity.getMainFragmentCompat();
+                (AutofillProfilesFragment) activity.getMainFragment();
 
         // Check the preferences on the initial screen.
         Assert.assertEquals(6 /* One toggle + one add button + four profiles. */,
                 autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference bobProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference("Bob Doe");
         Assert.assertNotNull(bobProfile);
@@ -248,13 +243,12 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
         AutofillProfilesFragment autofillProfileFragment =
-                (AutofillProfilesFragment) activity.getMainFragmentCompat();
+                (AutofillProfilesFragment) activity.getMainFragment();
 
         // Check the preferences on the initial screen.
         Assert.assertEquals(6 /* One toggle + one add button + four profiles. */,
                 autofillProfileFragment.getPreferenceScreen().getPreferenceCount());
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference billProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference("Bill Doe");
         Assert.assertNotNull(billProfile);
@@ -277,8 +271,7 @@
                 PreferencesTest.startPreferences(InstrumentationRegistry.getInstrumentation(),
                         AutofillProfilesFragment.class.getName());
 
-        PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+        PreferenceFragmentCompat fragment = (PreferenceFragmentCompat) activity.getMainFragment();
         AutofillProfileEditorPreference addProfile =
                 (AutofillProfileEditorPreference) fragment.findPreference(
                         AutofillProfilesFragment.PREF_NEW_PROFILE);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java
index d8ab768..046d07ee 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/autofill_assistant/AutofillAssistantPreferencesTest.java
@@ -23,7 +23,7 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.history.HistoryActivity;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.MainPreferences;
 import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.preferences.PreferencesTest;
@@ -85,9 +85,9 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             AutofillAssistantPreferences autofillAssistantPrefs =
-                    (AutofillAssistantPreferences) preferences.getMainFragmentCompat();
-            ChromeSwitchPreferenceCompat onOffSwitch =
-                    (ChromeSwitchPreferenceCompat) autofillAssistantPrefs.findPreference(
+                    (AutofillAssistantPreferences) preferences.getMainFragment();
+            ChromeSwitchPreference onOffSwitch =
+                    (ChromeSwitchPreference) autofillAssistantPrefs.findPreference(
                             AutofillAssistantPreferences.PREF_AUTOFILL_ASSISTANT_SWITCH);
             Assert.assertTrue(onOffSwitch.isChecked());
 
@@ -105,9 +105,9 @@
                         AutofillAssistantPreferences.class.getName());
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             AutofillAssistantPreferences autofillAssistantPrefs =
-                    (AutofillAssistantPreferences) preferences2.getMainFragmentCompat();
-            ChromeSwitchPreferenceCompat onOffSwitch =
-                    (ChromeSwitchPreferenceCompat) autofillAssistantPrefs.findPreference(
+                    (AutofillAssistantPreferences) preferences2.getMainFragment();
+            ChromeSwitchPreference onOffSwitch =
+                    (ChromeSwitchPreference) autofillAssistantPrefs.findPreference(
                             AutofillAssistantPreferences.PREF_AUTOFILL_ASSISTANT_SWITCH);
             Assert.assertFalse(onOffSwitch.isChecked());
         });
@@ -128,7 +128,7 @@
         final Preferences preferences = PreferencesTest.startPreferences(
                 InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName());
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            MainPreferences mainPrefs = (MainPreferences) preferences.getMainFragmentCompat();
+            MainPreferences mainPrefs = (MainPreferences) preferences.getMainFragment();
             Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT),
                     is(nullValue()));
         });
@@ -149,7 +149,7 @@
         final Preferences preferences = PreferencesTest.startPreferences(
                 InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName());
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            MainPreferences mainPrefs = (MainPreferences) preferences.getMainFragmentCompat();
+            MainPreferences mainPrefs = (MainPreferences) preferences.getMainFragment();
             Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT),
                     is(not(nullValue())));
         });
@@ -167,7 +167,7 @@
                 InstrumentationRegistry.getInstrumentation(), MainPreferences.class.getName());
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            MainPreferences mainPrefs = (MainPreferences) preferences.getMainFragmentCompat();
+            MainPreferences mainPrefs = (MainPreferences) preferences.getMainFragment();
             Assert.assertThat(mainPrefs.findPreference(MainPreferences.PREF_AUTOFILL_ASSISTANT),
                     is(nullValue()));
         });
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java
index 2dc5620..dbd1bd8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/developer/TracingPreferencesTest.java
@@ -35,10 +35,10 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.ButtonPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ButtonPreference;
 import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.preferences.PreferencesLauncher;
-import org.chromium.chrome.browser.preferences.TextMessagePreferenceCompat;
+import org.chromium.chrome.browser.preferences.TextMessagePreference;
 import org.chromium.chrome.browser.tracing.TracingController;
 import org.chromium.chrome.browser.tracing.TracingNotificationManager;
 import org.chromium.chrome.test.ChromeActivityTestRule;
@@ -147,10 +147,9 @@
         Preferences activity =
                 mActivityTestRule.startPreferences(TracingPreferences.class.getName());
         final PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
-        final ButtonPreferenceCompat startTracingButton =
-                (ButtonPreferenceCompat) fragment.findPreference(
-                        TracingPreferences.UI_PREF_START_RECORDING);
+                (PreferenceFragmentCompat) activity.getMainFragment();
+        final ButtonPreference startTracingButton = (ButtonPreference) fragment.findPreference(
+                TracingPreferences.UI_PREF_START_RECORDING);
 
         waitForTracingControllerInitialization(fragment);
 
@@ -248,12 +247,11 @@
         Preferences activity =
                 mActivityTestRule.startPreferences(TracingPreferences.class.getName());
         final PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
-        final ButtonPreferenceCompat startTracingButton =
-                (ButtonPreferenceCompat) fragment.findPreference(
-                        TracingPreferences.UI_PREF_START_RECORDING);
-        final TextMessagePreferenceCompat statusPreference =
-                (TextMessagePreferenceCompat) fragment.findPreference(
+                (PreferenceFragmentCompat) activity.getMainFragment();
+        final ButtonPreference startTracingButton = (ButtonPreference) fragment.findPreference(
+                TracingPreferences.UI_PREF_START_RECORDING);
+        final TextMessagePreference statusPreference =
+                (TextMessagePreference) fragment.findPreference(
                         TracingPreferences.UI_PREF_TRACING_STATUS);
 
         waitForTracingControllerInitialization(fragment);
@@ -274,7 +272,7 @@
         Preferences activity =
                 mActivityTestRule.startPreferences(TracingPreferences.class.getName());
         final PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+                (PreferenceFragmentCompat) activity.getMainFragment();
         final Preference defaultCategoriesPref =
                 fragment.findPreference(TracingPreferences.UI_PREF_DEFAULT_CATEGORIES);
         final Preference nonDefaultCategoriesPref =
@@ -307,7 +305,7 @@
                             intent);
 
             PreferenceFragmentCompat categoriesFragment =
-                    (PreferenceFragmentCompat) categoriesActivity.getMainFragmentCompat();
+                    (PreferenceFragmentCompat) categoriesActivity.getMainFragment();
             Assert.assertEquals(TracingCategoriesPreferences.class, categoriesFragment.getClass());
 
             CheckBoxPreference sampleCategoryPref =
@@ -334,7 +332,7 @@
         Preferences activity =
                 mActivityTestRule.startPreferences(TracingPreferences.class.getName());
         final PreferenceFragmentCompat fragment =
-                (PreferenceFragmentCompat) activity.getMainFragmentCompat();
+                (PreferenceFragmentCompat) activity.getMainFragment();
         final ListPreference modePref =
                 (ListPreference) fragment.findPreference(TracingPreferences.UI_PREF_MODE);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java
index 5931dc59..128e8f025 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/password/SavePasswordsPreferencesTest.java
@@ -79,8 +79,8 @@
 import org.chromium.chrome.browser.history.HistoryActivity;
 import org.chromium.chrome.browser.history.HistoryManager;
 import org.chromium.chrome.browser.history.StubbedHistoryProvider;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.preferences.PreferencesTest;
@@ -331,12 +331,12 @@
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             // Disable the timer for progress bar.
             SavePasswordsPreferences fragment =
-                    (SavePasswordsPreferences) preferences.getMainFragmentCompat();
+                    (SavePasswordsPreferences) preferences.getMainFragment();
             fragment.getExportFlowForTesting()
                     .getDialogManagerForTesting()
                     .replaceCallbackDelayerForTesting(mManualDelayer);
             // Now call onResume to nudge Chrome into continuing the export flow.
-            preferences.getMainFragmentCompat().onResume();
+            preferences.getMainFragment().onResume();
         });
     }
 
@@ -381,7 +381,7 @@
             Preferences preferences, int positiveButtonLabelId) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SavePasswordsPreferences fragment =
-                    (SavePasswordsPreferences) preferences.getMainFragmentCompat();
+                    (SavePasswordsPreferences) preferences.getMainFragment();
             // To show an error, the error type for UMA needs to be specified. Because it is not
             // relevant for cases when the error is forcibly displayed in tests,
             // HistogramExportResult.NO_CONSUMER is passed as an arbitrarily chosen value.
@@ -437,7 +437,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SavePasswordsPreferences savePasswordPreferences =
-                    (SavePasswordsPreferences) preferences.getMainFragmentCompat();
+                    (SavePasswordsPreferences) preferences.getMainFragment();
             // Emulate an update from PasswordStore. This should not crash.
             savePasswordPreferences.passwordListAvailable(0);
         });
@@ -460,9 +460,9 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SavePasswordsPreferences savedPasswordPrefs =
-                    (SavePasswordsPreferences) preferences.getMainFragmentCompat();
-            ChromeSwitchPreferenceCompat onOffSwitch =
-                    (ChromeSwitchPreferenceCompat) savedPasswordPrefs.findPreference(
+                    (SavePasswordsPreferences) preferences.getMainFragment();
+            ChromeSwitchPreference onOffSwitch =
+                    (ChromeSwitchPreference) savedPasswordPrefs.findPreference(
                             SavePasswordsPreferences.PREF_SAVE_PASSWORDS_SWITCH);
             Assert.assertTrue(onOffSwitch.isChecked());
 
@@ -481,9 +481,9 @@
                         SavePasswordsPreferences.class.getName());
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SavePasswordsPreferences savedPasswordPrefs =
-                    (SavePasswordsPreferences) preferences2.getMainFragmentCompat();
-            ChromeSwitchPreferenceCompat onOffSwitch =
-                    (ChromeSwitchPreferenceCompat) savedPasswordPrefs.findPreference(
+                    (SavePasswordsPreferences) preferences2.getMainFragment();
+            ChromeSwitchPreference onOffSwitch =
+                    (ChromeSwitchPreference) savedPasswordPrefs.findPreference(
                             SavePasswordsPreferences.PREF_SAVE_PASSWORDS_SWITCH);
             Assert.assertFalse(onOffSwitch.isChecked());
         });
@@ -507,9 +507,9 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SavePasswordsPreferences passwordPrefs =
-                    (SavePasswordsPreferences) preferences.getMainFragmentCompat();
-            ChromeBaseCheckBoxPreferenceCompat onOffSwitch =
-                    (ChromeBaseCheckBoxPreferenceCompat) passwordPrefs.findPreference(
+                    (SavePasswordsPreferences) preferences.getMainFragment();
+            ChromeBaseCheckBoxPreference onOffSwitch =
+                    (ChromeBaseCheckBoxPreference) passwordPrefs.findPreference(
                             SavePasswordsPreferences.PREF_AUTOSIGNIN_SWITCH);
             Assert.assertTrue(onOffSwitch.isChecked());
 
@@ -529,9 +529,9 @@
                         SavePasswordsPreferences.class.getName());
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SavePasswordsPreferences passwordPrefs =
-                    (SavePasswordsPreferences) preferences2.getMainFragmentCompat();
-            ChromeBaseCheckBoxPreferenceCompat onOffSwitch =
-                    (ChromeBaseCheckBoxPreferenceCompat) passwordPrefs.findPreference(
+                    (SavePasswordsPreferences) preferences2.getMainFragment();
+            ChromeBaseCheckBoxPreference onOffSwitch =
+                    (ChromeBaseCheckBoxPreference) passwordPrefs.findPreference(
                             SavePasswordsPreferences.PREF_AUTOSIGNIN_SWITCH);
             Assert.assertFalse(onOffSwitch.isChecked());
         });
@@ -693,8 +693,7 @@
         ReauthenticationManager.resetLastReauth();
 
         // Now call onResume to nudge Chrome into continuing the export flow.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { preferences.getMainFragmentCompat().onResume(); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> { preferences.getMainFragment().onResume(); });
 
         // Check that the warning dialog is not displayed.
         Espresso.onView(withText(R.string.settings_passwords_export_description))
@@ -782,8 +781,7 @@
                 .perform(click());
         // The reauthentication dialog is skipped and the last reauthentication timestamp is not
         // reset. This looks like a failed reauthentication to SavePasswordsPreferences' onResume.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { preferences.getMainFragmentCompat().onResume(); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> { preferences.getMainFragment().onResume(); });
         checkExportMenuItemState(MenuItemState.ENABLED);
     }
 
@@ -893,8 +891,7 @@
 
         // Call onResume to simulate that the user put Chrome into background by opening "recent
         // apps" and then restored Chrome by choosing it from the list.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { preferences.getMainFragmentCompat().onResume(); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> { preferences.getMainFragment().onResume(); });
 
         File tempFile = createFakeExportedPasswordsFile();
         // Pretend that passwords have been serialized to go directly to the intent.
@@ -967,8 +964,7 @@
 
         // Call onResume to simulate that the user put Chrome into background by opening "recent
         // apps" and then restored Chrome by choosing it from the list.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { preferences.getMainFragmentCompat().onResume(); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> { preferences.getMainFragment().onResume(); });
 
         // Cancel the export warning.
         Espresso.onView(withText(R.string.cancel)).perform(click());
@@ -1012,8 +1008,7 @@
 
         // Call onResume to simulate that the user put Chrome into background by opening "recent
         // apps" and then restored Chrome by choosing it from the list.
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { preferences.getMainFragmentCompat().onResume(); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> { preferences.getMainFragment().onResume(); });
 
         // Check that export warning is not visible again.
         Espresso.onView(withText(R.string.cancel)).check(doesNotExist());
@@ -1445,7 +1440,7 @@
                 (SavePasswordsPreferences) PreferencesTest
                         .startPreferences(InstrumentationRegistry.getInstrumentation(),
                                 SavePasswordsPreferences.class.getName())
-                        .getMainFragmentCompat();
+                        .getMainFragment();
 
         // Force the search option into the action bar.
         TestThreadUtils.runOnUiThreadBlocking(
@@ -1488,7 +1483,7 @@
                 (SavePasswordsPreferences) PreferencesTest
                         .startPreferences(InstrumentationRegistry.getInstrumentation(),
                                 SavePasswordsPreferences.class.getName())
-                        .getMainFragmentCompat();
+                        .getMainFragment();
 
         // Force the search option into the overflow menu.
         TestThreadUtils.runOnUiThreadBlocking(
@@ -1647,7 +1642,7 @@
                 (SavePasswordsPreferences) PreferencesTest
                         .startPreferences(InstrumentationRegistry.getInstrumentation(),
                                 SavePasswordsPreferences.class.getName())
-                        .getMainFragmentCompat();
+                        .getMainFragment();
 
         Espresso.onView(withText(R.string.section_saved_passwords_exceptions))
                 .check(matches(isDisplayed()));
@@ -1678,7 +1673,7 @@
                 (SavePasswordsPreferences) PreferencesTest
                         .startPreferences(InstrumentationRegistry.getInstrumentation(),
                                 SavePasswordsPreferences.class.getName())
-                        .getMainFragmentCompat();
+                        .getMainFragment();
         final AtomicReference<Boolean> menuInitiallyVisible = new AtomicReference<>();
         TestThreadUtils.runOnUiThreadBlocking(
                 ()
@@ -1787,7 +1782,7 @@
                 (SavePasswordsPreferences) PreferencesTest
                         .startPreferences(InstrumentationRegistry.getInstrumentation(),
                                 SavePasswordsPreferences.class.getName())
-                        .getMainFragmentCompat();
+                        .getMainFragment();
         Espresso.onView(withId(R.id.search_button)).check(matches(isDisplayed()));
         final AtomicReference<ColorFilter> passwordSearchFilter = new AtomicReference<>();
         TestThreadUtils.runOnUiThreadBlocking(() -> {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
index ab60d66..fd5c05f1 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesBasicTest.java
@@ -111,7 +111,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferencesBasic fragment =
-                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragmentCompat();
+                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragment();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             String cookiesSummary = getCheckboxSummary(screen,
@@ -142,7 +142,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferencesBasic fragment =
-                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragmentCompat();
+                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragment();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             String cookiesSummary = getCheckboxSummary(screen,
@@ -173,7 +173,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferencesBasic fragment =
-                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragmentCompat();
+                    (ClearBrowsingDataPreferencesBasic) preferences.getMainFragment();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             String cookiesSummary = getCheckboxSummary(screen,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
index 16be2ea..8f21101f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/privacy/ClearBrowsingDataPreferencesTest.java
@@ -126,7 +126,7 @@
                 ClearBrowsingDataPreferencesAdvanced.class.getName());
         ClearBrowsingDataFetcher fetcher = new ClearBrowsingDataFetcher();
         ClearBrowsingDataPreferences fragment =
-                (ClearBrowsingDataPreferences) preferences.getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) preferences.getMainFragment();
         fragment.setClearBrowsingDataFetcher(fetcher);
         TestThreadUtils.runOnUiThreadBlocking(fetcher::fetchImportantSites);
         return preferences;
@@ -147,7 +147,7 @@
         setDataTypesToClear(
                 new ArraySet<>(Arrays.asList(DialogOption.CLEAR_COOKIES_AND_SITE_DATA)));
         final ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
 
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
@@ -173,7 +173,7 @@
 
         setDataTypesToClear(new ArraySet<>(Arrays.asList(DialogOption.CLEAR_HISTORY)));
         final ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
 
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
@@ -198,7 +198,7 @@
         setDataTypesToClear(ClearBrowsingDataPreferences.getAllOptions());
 
         final ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             PreferenceScreen screen = preferences.getPreferenceScreen();
@@ -236,11 +236,11 @@
         @Override
         public void run() {
             ClearBrowsingDataPreferences fragment =
-                    (ClearBrowsingDataPreferences) mPreferences.getMainFragmentCompat();
+                    (ClearBrowsingDataPreferences) mPreferences.getMainFragment();
             PreferenceScreen screen = fragment.getPreferenceScreen();
 
             // Enable the dialog and click the "Clear" button.
-            ((ClearBrowsingDataPreferences) mPreferences.getMainFragmentCompat())
+            ((ClearBrowsingDataPreferences) mPreferences.getMainFragment())
                     .getClearBrowsingDataFetcher()
                     .enableDialogAboutOtherFormsOfBrowsingHistory();
             clickClearButton(fragment);
@@ -266,7 +266,7 @@
         @Override
         public boolean isSatisfied() {
             ClearBrowsingDataPreferences fragment =
-                    (ClearBrowsingDataPreferences) mPreferences.getMainFragmentCompat();
+                    (ClearBrowsingDataPreferences) mPreferences.getMainFragment();
             return fragment == null || !fragment.isVisible();
         }
     }
@@ -306,7 +306,7 @@
             @Override
             public boolean isSatisfied() {
                 ClearBrowsingDataPreferences fragment =
-                        (ClearBrowsingDataPreferences) preferences2.getMainFragmentCompat();
+                        (ClearBrowsingDataPreferences) preferences2.getMainFragment();
                 OtherFormsOfHistoryDialogFragment dialog =
                         fragment.getDialogAboutOtherFormsOfBrowsingHistory();
                 return dialog != null && dialog.getActivity() != null;
@@ -316,7 +316,7 @@
         // Close that dialog.
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             ClearBrowsingDataPreferences fragment =
-                    (ClearBrowsingDataPreferences) preferences2.getMainFragmentCompat();
+                    (ClearBrowsingDataPreferences) preferences2.getMainFragment();
             fragment.getDialogAboutOtherFormsOfBrowsingHistory().onClick(
                     null, AlertDialog.BUTTON_POSITIVE);
         });
@@ -423,7 +423,7 @@
                 "true", mActivityTestRule.runJavaScriptCodeInCurrentTab("hasAllStorage()"));
 
         ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
 
         // Clear in root preference.
         TestThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(preferences));
@@ -470,7 +470,7 @@
 
         Preferences preferences = startPreferences();
         ClearBrowsingDataPreferences fragment =
-                (ClearBrowsingDataPreferences) preferences.getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) preferences.getMainFragment();
         TestThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(fragment));
         // Check that the important sites dialog is shown, and the list is visible.
         waitForImportantDialogToShow(fragment, 2);
@@ -513,7 +513,7 @@
 
         final Preferences preferences = startPreferences();
         final ClearBrowsingDataPreferences fragment =
-                (ClearBrowsingDataPreferences) preferences.getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) preferences.getMainFragment();
 
         // Uncheck the first item (our internal web server).
         TestThreadUtils.runOnUiThreadBlocking(getPressClearRunnable(fragment));
@@ -565,7 +565,7 @@
         // Clear history.
         setDataTypesToClear(new ArraySet<>(Arrays.asList(DialogOption.CLEAR_HISTORY)));
         ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
 
@@ -608,7 +608,7 @@
         // Delete history.
         setDataTypesToClear(new ArraySet<>(Arrays.asList(DialogOption.CLEAR_HISTORY)));
         ClearBrowsingDataPreferences preferences =
-                (ClearBrowsingDataPreferences) startPreferences().getMainFragmentCompat();
+                (ClearBrowsingDataPreferences) startPreferences().getMainFragment();
         TestThreadUtils.runOnUiThreadBlocking(() -> clickClearButton(preferences));
         waitForProgressToComplete(preferences);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java
index 2cd0ac73..cd987bb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/themes/ThemePreferencesTest.java
@@ -41,7 +41,7 @@
         ChromePreferenceManager.getInstance().removeKey(UI_THEME_SETTING_KEY);
         Preferences preferences = PreferencesTest.startPreferences(
                 InstrumentationRegistry.getInstrumentation(), ThemePreferences.class.getName());
-        mFragment = (ThemePreferences) preferences.getMainFragmentCompat();
+        mFragment = (ThemePreferences) preferences.getMainFragment();
         mPreference = (RadioButtonGroupThemePreference) mFragment.findPreference(
                 ThemePreferences.PREF_UI_THEME_PREF);
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
index 1a191b7..b1c50218 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/preferences/website/SiteSettingsPreferencesTest.java
@@ -30,8 +30,8 @@
 import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.customtabs.CustomTabActivity;
 import org.chromium.chrome.browser.infobar.InfoBarContainer;
-import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreferenceCompat;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeBaseCheckBoxPreference;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.LocationSettings;
 import org.chromium.chrome.browser.preferences.PrefServiceBridge;
 import org.chromium.chrome.browser.preferences.Preferences;
@@ -84,9 +84,9 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SingleCategoryPreferences websitePreferences =
-                    (SingleCategoryPreferences) preferenceActivity.getMainFragmentCompat();
-            ChromeSwitchPreferenceCompat location =
-                    (ChromeSwitchPreferenceCompat) websitePreferences.findPreference(
+                    (SingleCategoryPreferences) preferenceActivity.getMainFragment();
+            ChromeSwitchPreference location =
+                    (ChromeSwitchPreference) websitePreferences.findPreference(
                             SingleCategoryPreferences.BINARY_TOGGLE_KEY);
 
             websitePreferences.onPreferenceChange(location, enabled);
@@ -157,12 +157,12 @@
             @Override
             public void run() {
                 final SingleCategoryPreferences websitePreferences =
-                        (SingleCategoryPreferences) preferenceActivity.getMainFragmentCompat();
-                final ChromeSwitchPreferenceCompat cookies =
-                        (ChromeSwitchPreferenceCompat) websitePreferences.findPreference(
+                        (SingleCategoryPreferences) preferenceActivity.getMainFragment();
+                final ChromeSwitchPreference cookies =
+                        (ChromeSwitchPreference) websitePreferences.findPreference(
                                 SingleCategoryPreferences.BINARY_TOGGLE_KEY);
-                final ChromeBaseCheckBoxPreferenceCompat thirdPartyCookies =
-                        (ChromeBaseCheckBoxPreferenceCompat) websitePreferences.findPreference(
+                final ChromeBaseCheckBoxPreference thirdPartyCookies =
+                        (ChromeBaseCheckBoxPreference) websitePreferences.findPreference(
                                 SingleCategoryPreferences.THIRD_PARTY_COOKIES_TOGGLE_KEY);
 
                 if (thirdPartyCookies != null) {
@@ -186,9 +186,9 @@
             final boolean enabled) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             final SingleCategoryPreferences websitePreferences =
-                    (SingleCategoryPreferences) preferenceActivity.getMainFragmentCompat();
-            final ChromeBaseCheckBoxPreferenceCompat thirdPartyCookies =
-                    (ChromeBaseCheckBoxPreferenceCompat) websitePreferences.findPreference(
+                    (SingleCategoryPreferences) preferenceActivity.getMainFragment();
+            final ChromeBaseCheckBoxPreference thirdPartyCookies =
+                    (ChromeBaseCheckBoxPreference) websitePreferences.findPreference(
                             SingleCategoryPreferences.THIRD_PARTY_COOKIES_TOGGLE_KEY);
 
             websitePreferences.onPreferenceChange(thirdPartyCookies, enabled);
@@ -205,10 +205,9 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SingleCategoryPreferences preferences =
-                    (SingleCategoryPreferences) preferenceActivity.getMainFragmentCompat();
-            ChromeSwitchPreferenceCompat toggle =
-                    (ChromeSwitchPreferenceCompat) preferences.findPreference(
-                            SingleCategoryPreferences.BINARY_TOGGLE_KEY);
+                    (SingleCategoryPreferences) preferenceActivity.getMainFragment();
+            ChromeSwitchPreference toggle = (ChromeSwitchPreference) preferences.findPreference(
+                    SingleCategoryPreferences.BINARY_TOGGLE_KEY);
             preferences.onPreferenceChange(toggle, enabled);
         });
         preferenceActivity.finish();
@@ -248,7 +247,7 @@
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             PreferenceFragmentCompat preferenceFragment =
-                    (PreferenceFragmentCompat) preferenceActivity.getMainFragmentCompat();
+                    (PreferenceFragmentCompat) preferenceActivity.getMainFragment();
             PreferenceScreen preferenceScreen = preferenceFragment.getPreferenceScreen();
             int preferenceCount = preferenceScreen.getPreferenceCount();
 
@@ -392,7 +391,7 @@
                 SiteSettingsTestUtils.startSingleWebsitePreferences(website);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SingleWebsitePreferences websitePreferences =
-                    (SingleWebsitePreferences) preferenceActivity.getMainFragmentCompat();
+                    (SingleWebsitePreferences) preferenceActivity.getMainFragment();
             websitePreferences.resetSite();
         });
         preferenceActivity.finish();
@@ -473,7 +472,7 @@
                 SiteSettingsTestUtils.startSiteSettingsMenu(SiteSettingsPreferences.MEDIA_KEY);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             SiteSettingsPreferences siteSettings =
-                    (SiteSettingsPreferences) preferenceActivity.getMainFragmentCompat();
+                    (SiteSettingsPreferences) preferenceActivity.getMainFragment();
 
             SiteSettingsPreference allSites = (SiteSettingsPreference) siteSettings.findPreference(
                     SiteSettingsCategory.preferenceKey(SiteSettingsCategory.Type.ALL_SITES));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java
index a040edb..5c4bcbd6 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninTest.java
@@ -379,7 +379,7 @@
     }
 
     private static MainPreferences getMainPreferences(Preferences prefActivity) {
-        Fragment fragment = prefActivity.getMainFragmentCompat();
+        Fragment fragment = prefActivity.getMainFragment();
         Assert.assertNotNull(fragment);
         Assert.assertTrue(fragment instanceof MainPreferences);
         return (MainPreferences) fragment;
@@ -395,7 +395,7 @@
     }
 
     private static void clickSignOut(Preferences prefActivity) {
-        Fragment fragment = prefActivity.getMainFragmentCompat();
+        Fragment fragment = prefActivity.getMainFragment();
         Assert.assertNotNull(fragment);
         Assert.assertTrue(fragment instanceof AccountManagementFragment);
         AccountManagementFragment managementFragment = (AccountManagementFragment) fragment;
@@ -408,7 +408,7 @@
 
     private void acceptAlertDialogWithTag(AppCompatActivity activity, String tag) {
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        DialogFragment fragment = ActivityUtils.waitForFragmentCompat(activity, tag);
+        DialogFragment fragment = ActivityUtils.waitForFragment(activity, tag);
         AlertDialog dialog = (AlertDialog) fragment.getDialog();
         Assert.assertTrue(dialog != null);
         Assert.assertTrue(dialog.isShowing());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
index 31d636c..f1bde3a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/FirstRunTest.java
@@ -161,7 +161,7 @@
 
         // Close the settings fragment.
         AccountManagementFragment fragment =
-                (AccountManagementFragment) prefActivity.getMainFragmentCompat();
+                (AccountManagementFragment) prefActivity.getMainFragment();
         Assert.assertNotNull(fragment);
         prefActivity.getSupportFragmentManager().beginTransaction().remove(fragment).commit();
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java
index 22554333..5b10c24 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncPreferencesTest.java
@@ -27,7 +27,7 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.preferences.sync.ManageSyncPreferences;
 import org.chromium.chrome.browser.sync.ui.PassphraseCreationDialogFragment;
@@ -86,7 +86,7 @@
         mSyncTestRule.setUpTestAccountAndSignIn();
         SyncTestUtil.waitForSyncActive();
         ManageSyncPreferences fragment = startManageSyncPreferences();
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         Collection<CheckBoxPreference> dataTypes = getDataTypes(fragment).values();
 
         assertSyncOnState(fragment);
@@ -106,7 +106,7 @@
         mSyncTestRule.setUpTestAccountAndSignIn();
         SyncTestUtil.waitForSyncActive();
         ManageSyncPreferences fragment = startManageSyncPreferences();
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         Map<Integer, CheckBoxPreference> dataTypes = getDataTypes(fragment);
 
         assertSyncOnState(fragment);
@@ -171,7 +171,7 @@
 
         ManageSyncPreferences fragment = startManageSyncPreferences();
         assertSyncOnState(fragment);
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         mSyncTestRule.togglePreference(syncEverything);
 
         CheckBoxPreference paymentsIntegration = (CheckBoxPreference) fragment.findPreference(
@@ -215,7 +215,7 @@
 
         ManageSyncPreferences fragment = startManageSyncPreferences();
         assertSyncOnState(fragment);
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         mSyncTestRule.togglePreference(syncEverything);
 
         CheckBoxPreference paymentsIntegration = (CheckBoxPreference) fragment.findPreference(
@@ -238,7 +238,7 @@
 
         ManageSyncPreferences fragment = startManageSyncPreferences();
         assertSyncOnState(fragment);
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         mSyncTestRule.togglePreference(syncEverything);
 
         CheckBoxPreference syncAutofill = (CheckBoxPreference) fragment.findPreference(
@@ -264,7 +264,7 @@
 
         // Get the UI elements.
         ManageSyncPreferences fragment = startManageSyncPreferences();
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         CheckBoxPreference syncAutofill = (CheckBoxPreference) fragment.findPreference(
                 ManageSyncPreferences.PREF_SYNC_AUTOFILL);
         CheckBoxPreference paymentsIntegration = (CheckBoxPreference) fragment.findPreference(
@@ -440,7 +440,7 @@
     private ManageSyncPreferences startManageSyncPreferences() {
         mPreferences = mSyncTestRule.startPreferences(ManageSyncPreferences.class.getName());
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        return (ManageSyncPreferences) mPreferences.getMainFragmentCompat();
+        return (ManageSyncPreferences) mPreferences.getMainFragment();
     }
 
     private void closeFragment(ManageSyncPreferences fragment) {
@@ -451,8 +451,8 @@
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
-    private ChromeSwitchPreferenceCompat getSyncEverything(ManageSyncPreferences fragment) {
-        return (ChromeSwitchPreferenceCompat) fragment.findPreference(
+    private ChromeSwitchPreference getSyncEverything(ManageSyncPreferences fragment) {
+        return (ChromeSwitchPreference) fragment.findPreference(
                 ManageSyncPreferences.PREF_SYNC_EVERYTHING);
     }
 
@@ -479,22 +479,22 @@
     }
 
     private PassphraseDialogFragment getPassphraseDialogFragment() {
-        return ActivityUtils.waitForFragmentCompat(
+        return ActivityUtils.waitForFragment(
                 mPreferences, ManageSyncPreferences.FRAGMENT_ENTER_PASSPHRASE);
     }
 
     private PassphraseTypeDialogFragment getPassphraseTypeDialogFragment() {
-        return ActivityUtils.waitForFragmentCompat(
+        return ActivityUtils.waitForFragment(
                 mPreferences, ManageSyncPreferences.FRAGMENT_PASSPHRASE_TYPE);
     }
 
     private PassphraseCreationDialogFragment getPassphraseCreationDialogFragment() {
-        return ActivityUtils.waitForFragmentCompat(
+        return ActivityUtils.waitForFragment(
                 mPreferences, ManageSyncPreferences.FRAGMENT_CUSTOM_PASSPHRASE);
     }
 
     private void assertSyncOnState(ManageSyncPreferences fragment) {
-        ChromeSwitchPreferenceCompat syncEverything = getSyncEverything(fragment);
+        ChromeSwitchPreference syncEverything = getSyncEverything(fragment);
         Assert.assertTrue("The sync everything switch should be on.", syncEverything.isChecked());
         Assert.assertTrue(
                 "The sync everything switch should be enabled.", syncEverything.isEnabled());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
index 28f25380..65fb4c4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncAndServicesPreferencesTest.java
@@ -17,7 +17,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.preferences.ChromeSwitchPreferenceCompat;
+import org.chromium.chrome.browser.preferences.ChromeSwitchPreference;
 import org.chromium.chrome.browser.preferences.Preferences;
 import org.chromium.chrome.browser.preferences.sync.SyncAndServicesPreferences;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -50,7 +50,7 @@
         mSyncTestRule.setUpTestAccountAndSignIn();
         SyncTestUtil.waitForSyncActive();
         SyncAndServicesPreferences fragment = startSyncAndServicesPreferences();
-        final ChromeSwitchPreferenceCompat syncSwitch = getSyncSwitch(fragment);
+        final ChromeSwitchPreference syncSwitch = getSyncSwitch(fragment);
 
         Assert.assertTrue(syncSwitch.isChecked());
         Assert.assertTrue(AndroidSyncSettings.get().isChromeSyncEnabled());
@@ -132,7 +132,7 @@
         Assert.assertTrue(AndroidSyncSettings.get().isChromeSyncEnabled());
         SyncAndServicesPreferences fragment = startSyncAndServicesPreferences();
         assertSyncOnState(fragment);
-        ChromeSwitchPreferenceCompat syncSwitch = getSyncSwitch(fragment);
+        ChromeSwitchPreference syncSwitch = getSyncSwitch(fragment);
         Assert.assertTrue(syncSwitch.isChecked());
         Assert.assertTrue(AndroidSyncSettings.get().isChromeSyncEnabled());
         mSyncTestRule.togglePreference(syncSwitch);
@@ -148,7 +148,7 @@
     private SyncAndServicesPreferences startSyncAndServicesPreferences() {
         mPreferences = mSyncTestRule.startPreferences(SyncAndServicesPreferences.class.getName());
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-        return (SyncAndServicesPreferences) mPreferences.getMainFragmentCompat();
+        return (SyncAndServicesPreferences) mPreferences.getMainFragment();
     }
 
     private void closeFragment(SyncAndServicesPreferences fragment) {
@@ -159,8 +159,8 @@
         InstrumentationRegistry.getInstrumentation().waitForIdleSync();
     }
 
-    private ChromeSwitchPreferenceCompat getSyncSwitch(SyncAndServicesPreferences fragment) {
-        return (ChromeSwitchPreferenceCompat) fragment.findPreference(
+    private ChromeSwitchPreference getSyncSwitch(SyncAndServicesPreferences fragment) {
+        return (ChromeSwitchPreference) fragment.findPreference(
                 SyncAndServicesPreferences.PREF_SYNC_REQUESTED);
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
index 7acf7f7..ece2672 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
@@ -395,8 +395,7 @@
         NativeUiUtils.enableMockedInput();
         NativeUiUtils.performActionAndWaitForUiQuiescence(() -> {
             TestThreadUtils.runOnUiThreadBlocking(() -> {
-                PreferencesLauncher.launchSettingsPageCompat(
-                        context, SingleWebsitePreferences.class);
+                PreferencesLauncher.launchSettingsPage(context, SingleWebsitePreferences.class);
             });
         });
         TestThreadUtils.runOnUiThreadBlocking(
@@ -413,7 +412,7 @@
         VrShellDelegateUtils.getDelegateInstance().overrideDaydreamApiForTesting(mockApiWithDoff);
 
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            PreferencesLauncher.launchSettingsPageCompat(context, null);
+            PreferencesLauncher.launchSettingsPage(context, null);
             VrShellDelegateUtils.getDelegateInstance().acceptDoffPromptForTesting();
         });
         CriteriaHelper.pollUiThread(() -> {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
index 60d0c59..d348b14 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
@@ -57,7 +57,7 @@
 
         mocker.mock(SigninManagerJni.TEST_HOOKS, mNativeMock);
 
-        doReturn(true).when(mNativeMock).isSigninAllowedByPolicy(any(), anyLong());
+        doReturn(true).when(mNativeMock).isSigninAllowedByPolicy(anyLong());
 
         mAccountTrackerService = mock(AccountTrackerService.class);
 
@@ -71,114 +71,114 @@
     public void signOutFromJavaWithManagedDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
-        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        doNothing().when(mNativeMock).wipeProfileData(anyLong(), any());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // See verification of nativeWipeProfileData below.
-        doReturn("TestDomain").when(mNativeMock).getManagementDomain(any(), anyLong());
+        doReturn("TestDomain").when(mNativeMock).getManagementDomain(anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
 
         // nativeSignOut should be called *before* clearing any account data.
         // http://crbug.com/589028
-        verify(mNativeMock, never()).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, never()).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // Simulate native callback to trigger clearing of account data.
         mSigninManager.onNativeSignOut();
 
         // Sign-out should only clear the profile when the user is managed.
-        verify(mNativeMock, times(1)).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, times(1)).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any());
     }
 
     @Test
     public void signOutFromJavaWithNullDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
-        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        doNothing().when(mNativeMock).wipeProfileData(anyLong(), any());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // See verification of nativeWipeGoogleServiceWorkerCaches below.
-        doReturn(null).when(mNativeMock).getManagementDomain(any(), anyLong());
+        doReturn(null).when(mNativeMock).getManagementDomain(anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
 
         // nativeSignOut should be called *before* clearing any account data.
         // http://crbug.com/589028
-        verify(mNativeMock, never()).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, never()).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // Simulate native callback to trigger clearing of account data.
         mSigninManager.onNativeSignOut();
 
         // Sign-out should only clear the service worker cache when the user is not managed.
-        verify(mNativeMock, never()).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, never()).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(anyLong(), any());
     }
 
     @Test
     public void signOutFromJavaWithNullDomainAndForceWipe() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
-        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        doNothing().when(mNativeMock).wipeProfileData(anyLong(), any());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // See verification of nativeWipeGoogleServiceWorkerCaches below.
-        doReturn(null).when(mNativeMock).getManagementDomain(any(), anyLong());
+        doReturn(null).when(mNativeMock).getManagementDomain(anyLong());
 
         // Trigger the sign out flow
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST, null, null, true);
 
         // nativeSignOut should be called *before* clearing any account data.
         // http://crbug.com/589028
-        verify(mNativeMock, never()).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, never()).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // Simulate native callback to trigger clearing of account data.
         mSigninManager.onNativeSignOut();
 
         // Sign-out should only clear the service worker cache when the user is not managed.
-        verify(mNativeMock, times(1)).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, times(1)).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any());
     }
 
     @Test
     public void signOutFromNativeWithManagedDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
-        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        doNothing().when(mNativeMock).wipeProfileData(anyLong(), any());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // See verification of nativeWipeProfileData below.
-        doReturn("TestDomain").when(mNativeMock).getManagementDomain(any(), anyLong());
+        doReturn("TestDomain").when(mNativeMock).getManagementDomain(anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.onNativeSignOut();
 
         // Sign-out should only clear the profile when the user is managed.
-        verify(mNativeMock, times(1)).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, times(1)).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(anyLong(), any());
     }
 
     @Test
     public void signOutFromNativeWithNullDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong(), any());
-        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        doNothing().when(mNativeMock).wipeProfileData(anyLong(), any());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(anyLong(), any());
 
         // See verification of nativeWipeGoogleServiceWorkerCaches below.
-        doReturn(null).when(mNativeMock).getManagementDomain(any(), anyLong());
+        doReturn(null).when(mNativeMock).getManagementDomain(anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.onNativeSignOut();
 
         // Sign-out should only clear the service worker cache when the user is not managed.
-        verify(mNativeMock, never()).wipeProfileData(any(), anyLong(), any());
-        verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(any(), anyLong(), any());
+        verify(mNativeMock, never()).wipeProfileData(anyLong(), any());
+        verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(anyLong(), any());
     }
 
     @Test
@@ -197,7 +197,7 @@
             return null;
         })
                 .when(mNativeMock)
-                .signOut(any(), anyLong(), anyInt());
+                .signOut(anyLong(), anyInt());
 
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
         assertTrue(mSigninManager.isOperationInProgress());
@@ -216,10 +216,10 @@
         doReturn(true).when(mAccountTrackerService).checkAndSeedSystemAccounts();
         // Request that policy is loaded. It will pause sign-in until onPolicyCheckedBeforeSignIn is
         // invoked.
-        doNothing().when(mNativeMock).fetchAndApplyCloudPolicy(any(), anyLong(), any(), any());
+        doNothing().when(mNativeMock).fetchAndApplyCloudPolicy(anyLong(), any(), any());
 
         doReturn(true).when(mSigninManager).isSigninSupported();
-        doNothing().when(mNativeMock).onSignInCompleted(any(), anyLong(), any());
+        doNothing().when(mNativeMock).onSignInCompleted(anyLong(), any());
         doNothing().when(mSigninManager).logInSignedInUser();
 
         mSigninManager.onFirstRunCheckDone(); // Allow sign-in.
diff --git a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
index 45844c3..8802677 100644
--- a/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
+++ b/chrome/android/touchless/java/src/org/chromium/chrome/browser/touchless/TouchlessPreferences.java
@@ -40,7 +40,7 @@
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
-        Fragment fragment = getMainFragmentCompat();
+        Fragment fragment = getMainFragment();
         if (fragment == null || fragment.getView() == null
                 || fragment.getView().findViewById(R.id.list) == null) {
             return;
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni
index ac0db968..f5a751d 100644
--- a/chrome/android/webapk/shell_apk/current_version/current_version.gni
+++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@
 # //chrome/android/webapk/shell_apk:webapk is changed. This includes
 # Java files, Android resource files and AndroidManifest.xml. Does not affect
 # Chrome.apk
-current_shell_apk_version = 100
+current_shell_apk_version = 101
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java
index 786b8340..72f48a56 100644
--- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java
+++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/SplashActivityTest.java
@@ -201,6 +201,25 @@
         setAppTaskTopActivity(splashActivityController.get().getTaskId(), new Activity());
 
         splashActivityController.create(new Bundle()).visible();
+        splashActivityController.newIntent(new Intent());
+        splashActivityController.get().onActivityResult(0, 0, null);
+        splashActivityController.resume();
+
+        assertNotNull(mShadowApplication.getNextStartedActivity());
+        assertFalse(splashActivityController.get().isFinishing());
+    }
+
+    /**
+     * Test that SplashActivity does not finish itself when it receives onActivityResult()
+     * prior to onNewIntent().
+     */
+    @Test
+    public void testActivityResultBeforeNewIntent() {
+        ActivityController<SplashActivity> splashActivityController =
+                Robolectric.buildActivity(SplashActivity.class, new Intent());
+        setAppTaskTopActivity(splashActivityController.get().getTaskId(), new Activity());
+
+        splashActivityController.create(new Bundle()).visible();
         splashActivityController.get().onActivityResult(0, 0, null);
         splashActivityController.newIntent(new Intent());
         splashActivityController.resume();
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
index 0d222b4..0cba40ce 100644
--- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
+++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashActivity.java
@@ -14,6 +14,7 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.SystemClock;
+import android.support.annotation.IntDef;
 import android.view.View;
 import android.view.ViewTreeObserver;
 
@@ -26,6 +27,8 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 
 /** Displays splash screen. */
 public class SplashActivity extends Activity {
@@ -36,9 +39,17 @@
     @SuppressWarnings("NoAndroidAsyncTaskCheck")
     private android.os.AsyncTask mScreenshotSplashTask;
 
+    @IntDef({ActivityResult.NONE, ActivityResult.CANCELED, ActivityResult.IGNORE})
+    @Retention(RetentionPolicy.SOURCE)
+    private @interface ActivityResult {
+        int NONE = 0;
+        int CANCELED = 1;
+        int IGNORE = 2;
+    }
+
     private View mSplashView;
     private HostBrowserLauncherParams mParams;
-    private boolean mGotCanceledResult;
+    private @ActivityResult int mResult;
     private boolean mResumed;
     private boolean mPendingLaunch;
 
@@ -67,7 +78,9 @@
 
     @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        mGotCanceledResult = (resultCode == Activity.RESULT_CANCELED);
+        if (mResult != ActivityResult.IGNORE && resultCode == Activity.RESULT_CANCELED) {
+            mResult = ActivityResult.CANCELED;
+        }
     }
 
     @Override
@@ -79,7 +92,7 @@
         // The host browser activity is killed - triggering SplashActivity#onActivityResult()
         // - when SplashActivity gets a new intent because SplashActivity has launchMode
         // "singleTask".
-        mGotCanceledResult = false;
+        mResult = ActivityResult.IGNORE;
 
         mPendingLaunch = true;
 
@@ -90,11 +103,12 @@
     public void onResume() {
         super.onResume();
         mResumed = true;
-        if (mGotCanceledResult) {
+        if (mResult == ActivityResult.CANCELED) {
             WebApkUtils.finishAndRemoveTask(this);
             return;
         }
 
+        mResult = ActivityResult.NONE;
         maybeScreenshotSplashAndLaunch();
     }
 
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 0c70ee1..d266d9f 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -919,6 +919,12 @@
     "offline_items_collection/offline_content_aggregator_factory.cc",
     "offline_items_collection/offline_content_aggregator_factory.h",
     "omnibox/common/omnibox_features.h",
+    "optimization_guide/optimization_guide_hints_manager.cc",
+    "optimization_guide/optimization_guide_hints_manager.h",
+    "optimization_guide/optimization_guide_keyed_service.cc",
+    "optimization_guide/optimization_guide_keyed_service.h",
+    "optimization_guide/optimization_guide_keyed_service_factory.cc",
+    "optimization_guide/optimization_guide_keyed_service_factory.h",
     "page_load_metrics/metrics_navigation_throttle.cc",
     "page_load_metrics/metrics_navigation_throttle.h",
     "page_load_metrics/metrics_web_contents_observer.cc",
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.cc b/chrome/browser/android/bookmarks/bookmark_bridge.cc
index 27932643..25737ed 100644
--- a/chrome/browser/android/bookmarks/bookmark_bridge.cc
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.cc
@@ -144,9 +144,7 @@
   return reinterpret_cast<intptr_t>(delegate);
 }
 
-jboolean BookmarkBridge::IsEditBookmarksEnabled(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean BookmarkBridge::IsEditBookmarksEnabled(JNIEnv* env) {
   return IsEditBookmarksEnabled();
 }
 
diff --git a/chrome/browser/android/bookmarks/bookmark_bridge.h b/chrome/browser/android/bookmarks/bookmark_bridge.h
index 1f7410b..c50c876 100644
--- a/chrome/browser/android/bookmarks/bookmark_bridge.h
+++ b/chrome/browser/android/bookmarks/bookmark_bridge.h
@@ -36,9 +36,7 @@
   bool IsDoingExtensiveChanges(JNIEnv* env,
                                const base::android::JavaParamRef<jobject>& obj);
 
-  jboolean IsEditBookmarksEnabled(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  jboolean IsEditBookmarksEnabled(JNIEnv* env);
 
   void LoadEmptyPartnerBookmarkShimForTesting(
       JNIEnv* env,
diff --git a/chrome/browser/android/compositor/layer_title_cache.cc b/chrome/browser/android/compositor/layer_title_cache.cc
index 60bd07b8..b58ca47a 100644
--- a/chrome/browser/android/compositor/layer_title_cache.cc
+++ b/chrome/browser/android/compositor/layer_title_cache.cc
@@ -47,7 +47,7 @@
       resource_manager_(nullptr) {
 }
 
-void LayerTitleCache::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void LayerTitleCache::Destroy(JNIEnv* env) {
   delete this;
 }
 
diff --git a/chrome/browser/android/compositor/layer_title_cache.h b/chrome/browser/android/compositor/layer_title_cache.h
index 40b7b99..f6308a9 100644
--- a/chrome/browser/android/compositor/layer_title_cache.h
+++ b/chrome/browser/android/compositor/layer_title_cache.h
@@ -43,7 +43,7 @@
                   jint favicon_end_padding,
                   jint spinner_resource_id,
                   jint spinner_incognito_resource_id);
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
 
   // Called from Java, updates a native cc::Layer based on the new texture
   // information.
diff --git a/chrome/browser/android/compositor/tab_content_manager.cc b/chrome/browser/android/compositor/tab_content_manager.cc
index 756ebb8..8b55817 100644
--- a/chrome/browser/android/compositor/tab_content_manager.cc
+++ b/chrome/browser/android/compositor/tab_content_manager.cc
@@ -136,7 +136,7 @@
 TabContentManager::~TabContentManager() {
 }
 
-void TabContentManager::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void TabContentManager::Destroy(JNIEnv* env) {
   thumbnail_cache_->RemoveThumbnailCacheObserver(this);
   delete this;
 }
diff --git a/chrome/browser/android/compositor/tab_content_manager.h b/chrome/browser/android/compositor/tab_content_manager.h
index b85ad021..46633da0 100644
--- a/chrome/browser/android/compositor/tab_content_manager.h
+++ b/chrome/browser/android/compositor/tab_content_manager.h
@@ -50,7 +50,7 @@
 
   virtual ~TabContentManager();
 
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
 
   void SetUIResourceProvider(ui::UIResourceProvider* ui_resource_provider);
 
diff --git a/chrome/browser/android/favicon_helper.cc b/chrome/browser/android/favicon_helper.cc
index 794b410..8e4313cb 100644
--- a/chrome/browser/android/favicon_helper.cc
+++ b/chrome/browser/android/favicon_helper.cc
@@ -88,13 +88,12 @@
   cancelable_task_tracker_.reset(new base::CancelableTaskTracker());
 }
 
-void FaviconHelper::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void FaviconHelper::Destroy(JNIEnv* env) {
   delete this;
 }
 
 jboolean FaviconHelper::GetLocalFaviconImageForURL(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_profile,
     const JavaParamRef<jstring>& j_page_url,
     jint j_desired_size_in_pixel,
@@ -136,7 +135,6 @@
 
 jboolean FaviconHelper::GetForeignFaviconImageForURL(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& jprofile,
     const JavaParamRef<jstring>& j_page_url,
     jint j_desired_size_in_pixel,
@@ -171,7 +169,6 @@
 
 void FaviconHelper::EnsureIconIsAvailable(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_profile,
     const JavaParamRef<jobject>& j_web_contents,
     const JavaParamRef<jstring>& j_page_url,
@@ -204,7 +201,6 @@
 
 void FaviconHelper::TouchOnDemandFavicon(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_profile,
     const JavaParamRef<jstring>& j_icon_url) {
   Profile* profile = ProfileAndroid::FromProfileAndroid(j_profile);
diff --git a/chrome/browser/android/favicon_helper.h b/chrome/browser/android/favicon_helper.h
index e6054d6..2b72f76 100644
--- a/chrome/browser/android/favicon_helper.h
+++ b/chrome/browser/android/favicon_helper.h
@@ -25,17 +25,15 @@
 class FaviconHelper {
  public:
   FaviconHelper();
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
   jboolean GetLocalFaviconImageForURL(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_profile,
       const base::android::JavaParamRef<jstring>& j_page_url,
       jint j_desired_size_in_pixel,
       const base::android::JavaParamRef<jobject>& j_favicon_image_callback);
   jboolean GetForeignFaviconImageForURL(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& jprofile,
       const base::android::JavaParamRef<jstring>& j_page_url,
       jint j_desired_size_in_pixel,
@@ -43,7 +41,6 @@
 
   void EnsureIconIsAvailable(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_profile,
       const base::android::JavaParamRef<jobject>& j_web_contents,
       const base::android::JavaParamRef<jstring>& j_page_url,
@@ -52,7 +49,6 @@
       const base::android::JavaParamRef<jobject>& j_availability_callback);
   void TouchOnDemandFavicon(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_profile,
       const base::android::JavaParamRef<jstring>& j_icon_url);
 
diff --git a/chrome/browser/android/foreign_session_helper.cc b/chrome/browser/android/foreign_session_helper.cc
index ce3928e..8d69b6d 100644
--- a/chrome/browser/android/foreign_session_helper.cc
+++ b/chrome/browser/android/foreign_session_helper.cc
@@ -165,22 +165,17 @@
 ForeignSessionHelper::~ForeignSessionHelper() {
 }
 
-void ForeignSessionHelper::Destroy(JNIEnv* env,
-                                   const JavaParamRef<jobject>& obj) {
+void ForeignSessionHelper::Destroy(JNIEnv* env) {
   delete this;
 }
 
-jboolean ForeignSessionHelper::IsTabSyncEnabled(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean ForeignSessionHelper::IsTabSyncEnabled(JNIEnv* env) {
   sync_sessions::SessionSyncService* service =
       SessionSyncServiceFactory::GetInstance()->GetForProfile(profile_);
   return service && service->GetOpenTabsUIDelegate();
 }
 
-void ForeignSessionHelper::TriggerSessionSync(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void ForeignSessionHelper::TriggerSessionSync(JNIEnv* env) {
   syncer::SyncService* service =
       ProfileSyncServiceFactory::GetForProfile(profile_);
   if (!service)
@@ -191,7 +186,6 @@
 
 void ForeignSessionHelper::SetOnForeignSessionCallback(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& callback) {
   callback_.Reset(env, callback);
 }
@@ -206,7 +200,6 @@
 
 jboolean ForeignSessionHelper::GetForeignSessions(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& result) {
   OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(profile_);
   if (!open_tabs)
@@ -254,7 +247,6 @@
 
 jboolean ForeignSessionHelper::OpenForeignSessionTab(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_tab,
     const JavaParamRef<jstring>& session_tag,
     jint session_tab_id,
@@ -297,7 +289,6 @@
 
 void ForeignSessionHelper::DeleteForeignSession(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& session_tag) {
   OpenTabsUIDelegate* open_tabs = GetOpenTabsUIDelegate(profile_);
   if (open_tabs)
@@ -306,7 +297,6 @@
 
 void ForeignSessionHelper::SetInvalidationsForSessionsEnabled(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jboolean enabled) {
   syncer::SyncService* service =
       ProfileSyncServiceFactory::GetForProfile(profile_);
diff --git a/chrome/browser/android/foreign_session_helper.h b/chrome/browser/android/foreign_session_helper.h
index a669632..33614e2 100644
--- a/chrome/browser/android/foreign_session_helper.h
+++ b/chrome/browser/android/foreign_session_helper.h
@@ -19,33 +19,26 @@
   explicit ForeignSessionHelper(Profile* profile);
   ~ForeignSessionHelper();
 
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
-  jboolean IsTabSyncEnabled(JNIEnv* env,
-                            const base::android::JavaParamRef<jobject>& obj);
-  void TriggerSessionSync(JNIEnv* env,
-                          const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
+  jboolean IsTabSyncEnabled(JNIEnv* env);
+  void TriggerSessionSync(JNIEnv* env);
   void SetOnForeignSessionCallback(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& callback);
   jboolean GetForeignSessions(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& result);
   jboolean OpenForeignSessionTab(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_tab,
       const base::android::JavaParamRef<jstring>& session_tag,
       jint tab_id,
       jint disposition);
   void DeleteForeignSession(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& session_tag);
   void SetInvalidationsForSessionsEnabled(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       jboolean enabled);
 
  private:
diff --git a/chrome/browser/android/large_icon_bridge.cc b/chrome/browser/android/large_icon_bridge.cc
index b413f6e..e1c4504 100644
--- a/chrome/browser/android/large_icon_bridge.cc
+++ b/chrome/browser/android/large_icon_bridge.cc
@@ -65,13 +65,12 @@
 
 LargeIconBridge::~LargeIconBridge() {}
 
-void LargeIconBridge::Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void LargeIconBridge::Destroy(JNIEnv* env) {
   delete this;
 }
 
 jboolean LargeIconBridge::GetLargeIconForURL(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_profile,
     const JavaParamRef<jstring>& j_page_url,
     jint min_source_size_px,
diff --git a/chrome/browser/android/large_icon_bridge.h b/chrome/browser/android/large_icon_bridge.h
index 74c71684..cec22c91 100644
--- a/chrome/browser/android/large_icon_bridge.h
+++ b/chrome/browser/android/large_icon_bridge.h
@@ -18,10 +18,9 @@
 class LargeIconBridge {
  public:
   LargeIconBridge();
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
   jboolean GetLargeIconForURL(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_profile,
       const base::android::JavaParamRef<jstring>& j_page_url,
       jint min_source_size_px,
diff --git a/chrome/browser/android/locale/locale_template_url_loader.cc b/chrome/browser/android/locale/locale_template_url_loader.cc
index 30926be..de77cdf 100644
--- a/chrome/browser/android/locale/locale_template_url_loader.cc
+++ b/chrome/browser/android/locale/locale_template_url_loader.cc
@@ -38,14 +38,11 @@
                                                  TemplateURLService* service)
     : locale_(locale), template_url_service_(service) {}
 
-void LocaleTemplateUrlLoader::Destroy(JNIEnv* env,
-                                      const JavaParamRef<jobject>& obj) {
+void LocaleTemplateUrlLoader::Destroy(JNIEnv* env) {
   delete this;
 }
 
-jboolean LocaleTemplateUrlLoader::LoadTemplateUrls(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean LocaleTemplateUrlLoader::LoadTemplateUrls(JNIEnv* env) {
   DCHECK(locale_.length() == 2);
 
   std::vector<std::unique_ptr<TemplateURLData>> prepopulated_list =
@@ -95,9 +92,7 @@
   return true;
 }
 
-void LocaleTemplateUrlLoader::RemoveTemplateUrls(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void LocaleTemplateUrlLoader::RemoveTemplateUrls(JNIEnv* env) {
   while (!prepopulate_ids_.empty()) {
     TemplateURL* turl = FindURLByPrepopulateID(
         template_url_service_->GetTemplateURLs(), prepopulate_ids_.back());
@@ -108,9 +103,7 @@
   }
 }
 
-void LocaleTemplateUrlLoader::OverrideDefaultSearchProvider(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void LocaleTemplateUrlLoader::OverrideDefaultSearchProvider(JNIEnv* env) {
   // If the user has changed their default search provider, no-op.
   const TemplateURL* current_dsp =
       template_url_service_->GetDefaultSearchProvider();
@@ -127,9 +120,7 @@
   }
 }
 
-void LocaleTemplateUrlLoader::SetGoogleAsDefaultSearch(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void LocaleTemplateUrlLoader::SetGoogleAsDefaultSearch(JNIEnv* env) {
   // If the user has changed their default search provider, no-op.
   const TemplateURL* current_dsp =
       template_url_service_->GetDefaultSearchProvider();
diff --git a/chrome/browser/android/locale/locale_template_url_loader.h b/chrome/browser/android/locale/locale_template_url_loader.h
index 3e043e0..5e5591c 100644
--- a/chrome/browser/android/locale/locale_template_url_loader.h
+++ b/chrome/browser/android/locale/locale_template_url_loader.h
@@ -17,12 +17,11 @@
  public:
   LocaleTemplateUrlLoader(const std::string& locale,
                           TemplateURLService* service);
-  void Destroy(JNIEnv* env, const JavaParamRef<jobject>& obj);
-  jboolean LoadTemplateUrls(JNIEnv* env, const JavaParamRef<jobject>& obj);
-  void RemoveTemplateUrls(JNIEnv* env, const JavaParamRef<jobject>& obj);
-  void OverrideDefaultSearchProvider(JNIEnv* env,
-                                     const JavaParamRef<jobject>& obj);
-  void SetGoogleAsDefaultSearch(JNIEnv* env, const JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
+  jboolean LoadTemplateUrls(JNIEnv* env);
+  void RemoveTemplateUrls(JNIEnv* env);
+  void OverrideDefaultSearchProvider(JNIEnv* env);
+  void SetGoogleAsDefaultSearch(JNIEnv* env);
 
   virtual ~LocaleTemplateUrlLoader();
 
diff --git a/chrome/browser/android/locale/locale_template_url_loader_unittest.cc b/chrome/browser/android/locale/locale_template_url_loader_unittest.cc
index 5d236ac8..6249dda 100644
--- a/chrome/browser/android/locale/locale_template_url_loader_unittest.cc
+++ b/chrome/browser/android/locale/locale_template_url_loader_unittest.cc
@@ -77,8 +77,7 @@
   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(naver));
   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(keyword_so));
 
-  ASSERT_TRUE(
-      loader()->LoadTemplateUrls(nullptr, JavaParamRef<jobject>(nullptr)));
+  ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
 
   EXPECT_EQ(TemplateURLPrepopulateData::naver.id,
             model()->GetTemplateURLForKeyword(naver)->prepopulate_id());
@@ -87,15 +86,13 @@
 
   // Ensure multiple calls to Load do not duplicate the search engines.
   size_t existing_size = model()->GetTemplateURLs().size();
-  ASSERT_TRUE(
-      loader()->LoadTemplateUrls(nullptr, JavaParamRef<jobject>(nullptr)));
+  ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
   EXPECT_EQ(existing_size, model()->GetTemplateURLs().size());
 }
 
 TEST_F(LocaleTemplateUrlLoaderTest, RemoveLocalSearchEngines) {
   test_util()->VerifyLoad();
-  ASSERT_TRUE(
-      loader()->LoadTemplateUrls(nullptr, JavaParamRef<jobject>(nullptr)));
+  ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
   // Make sure locale engines are loaded.
   auto keyword_naver = base::ASCIIToUTF16("naver.com");
   auto keyword_so = base::ASCIIToUTF16("so.com");
@@ -104,7 +101,7 @@
   ASSERT_EQ(TemplateURLPrepopulateData::so_360.id,
             model()->GetTemplateURLForKeyword(keyword_so)->prepopulate_id());
 
-  loader()->RemoveTemplateUrls(nullptr, JavaParamRef<jobject>(nullptr));
+  loader()->RemoveTemplateUrls(nullptr);
 
   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(keyword_naver));
   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(keyword_so));
@@ -115,20 +112,18 @@
   ASSERT_EQ(TemplateURLPrepopulateData::google.id,
             model()->GetDefaultSearchProvider()->prepopulate_id());
   // Load local search engines first.
-  ASSERT_TRUE(
-      loader()->LoadTemplateUrls(nullptr, JavaParamRef<jobject>(nullptr)));
+  ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
 
   ASSERT_EQ(TemplateURLPrepopulateData::google.id,
             model()->GetDefaultSearchProvider()->prepopulate_id());
 
   // Set one of the local search engine as default.
-  loader()->OverrideDefaultSearchProvider(nullptr,
-                                          JavaParamRef<jobject>(nullptr));
+  loader()->OverrideDefaultSearchProvider(nullptr);
   ASSERT_EQ(TemplateURLPrepopulateData::naver.id,
             model()->GetDefaultSearchProvider()->prepopulate_id());
 
   // Revert the default search engine tweak.
-  loader()->SetGoogleAsDefaultSearch(nullptr, JavaParamRef<jobject>(nullptr));
+  loader()->SetGoogleAsDefaultSearch(nullptr);
   ASSERT_EQ(TemplateURLPrepopulateData::google.id,
             model()->GetDefaultSearchProvider()->prepopulate_id());
 }
@@ -144,8 +139,7 @@
   // match.
   ASSERT_EQ(nullptr, model()->GetTemplateURLForKeyword(google_keyword));
 
-  ASSERT_TRUE(
-      loader()->LoadTemplateUrls(nullptr, JavaParamRef<jobject>(nullptr)));
+  ASSERT_TRUE(loader()->LoadTemplateUrls(nullptr));
 
   auto template_urls = model()->GetTemplateURLs();
   ASSERT_EQ(1, std::count_if(template_urls.begin(), template_urls.end(),
diff --git a/chrome/browser/android/ntp/recent_tabs_page_prefs.cc b/chrome/browser/android/ntp/recent_tabs_page_prefs.cc
index d81a78b..f0df700 100644
--- a/chrome/browser/android/ntp/recent_tabs_page_prefs.cc
+++ b/chrome/browser/android/ntp/recent_tabs_page_prefs.cc
@@ -28,51 +28,41 @@
 RecentTabsPagePrefs::RecentTabsPagePrefs(Profile* profile)
     : profile_(profile) {}
 
-void RecentTabsPagePrefs::Destroy(JNIEnv* env,
-                                  const JavaParamRef<jobject>& obj) {
+void RecentTabsPagePrefs::Destroy(JNIEnv* env) {
   delete this;
 }
 
 RecentTabsPagePrefs::~RecentTabsPagePrefs() {}
 
-jboolean RecentTabsPagePrefs::GetSnapshotDocumentCollapsed(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean RecentTabsPagePrefs::GetSnapshotDocumentCollapsed(JNIEnv* env) {
   return profile_->GetPrefs()->GetBoolean(prefs::kNtpCollapsedSnapshotDocument);
 }
 
 void RecentTabsPagePrefs::SetSnapshotDocumentCollapsed(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jboolean is_collapsed) {
   PrefService* prefs = profile_->GetPrefs();
   prefs->SetBoolean(prefs::kNtpCollapsedSnapshotDocument, is_collapsed);
 }
 
-jboolean RecentTabsPagePrefs::GetRecentlyClosedTabsCollapsed(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean RecentTabsPagePrefs::GetRecentlyClosedTabsCollapsed(JNIEnv* env) {
   return profile_->GetPrefs()->GetBoolean(
       prefs::kNtpCollapsedRecentlyClosedTabs);
 }
 
 void RecentTabsPagePrefs::SetRecentlyClosedTabsCollapsed(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jboolean is_collapsed) {
   PrefService* prefs = profile_->GetPrefs();
   prefs->SetBoolean(prefs::kNtpCollapsedRecentlyClosedTabs, is_collapsed);
 }
 
-jboolean RecentTabsPagePrefs::GetSyncPromoCollapsed(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean RecentTabsPagePrefs::GetSyncPromoCollapsed(JNIEnv* env) {
   return profile_->GetPrefs()->GetBoolean(prefs::kNtpCollapsedSyncPromo);
 }
 
 void RecentTabsPagePrefs::SetSyncPromoCollapsed(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jboolean is_collapsed) {
   PrefService* prefs = profile_->GetPrefs();
   prefs->SetBoolean(prefs::kNtpCollapsedSyncPromo, is_collapsed);
@@ -80,7 +70,6 @@
 
 jboolean RecentTabsPagePrefs::GetForeignSessionCollapsed(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& session_tag) {
   const base::DictionaryValue* dict =
       profile_->GetPrefs()->GetDictionary(prefs::kNtpCollapsedForeignSessions);
@@ -89,7 +78,6 @@
 
 void RecentTabsPagePrefs::SetForeignSessionCollapsed(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& session_tag,
     jboolean is_collapsed) {
   // Store session tags for collapsed sessions in a preference so that the
diff --git a/chrome/browser/android/ntp/recent_tabs_page_prefs.h b/chrome/browser/android/ntp/recent_tabs_page_prefs.h
index 2ae74c0..f255fc2f5 100644
--- a/chrome/browser/android/ntp/recent_tabs_page_prefs.h
+++ b/chrome/browser/android/ntp/recent_tabs_page_prefs.h
@@ -12,38 +12,27 @@
 class RecentTabsPagePrefs {
  public:
   explicit RecentTabsPagePrefs(Profile* profile);
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void Destroy(JNIEnv* env);
 
-  jboolean GetSnapshotDocumentCollapsed(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  jboolean GetSnapshotDocumentCollapsed(JNIEnv* env);
   void SetSnapshotDocumentCollapsed(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       jboolean is_collapsed);
 
-  jboolean GetRecentlyClosedTabsCollapsed(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  jboolean GetRecentlyClosedTabsCollapsed(JNIEnv* env);
   void SetRecentlyClosedTabsCollapsed(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       jboolean is_collapsed);
 
-  jboolean GetSyncPromoCollapsed(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  jboolean GetSyncPromoCollapsed(JNIEnv* env);
   void SetSyncPromoCollapsed(JNIEnv* env,
-                             const base::android::JavaParamRef<jobject>& obj,
                              jboolean is_collapsed);
 
   jboolean GetForeignSessionCollapsed(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& session_tag);
   void SetForeignSessionCollapsed(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& session_tag,
       jboolean is_collapsed);
 
diff --git a/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.cc b/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.cc
index 47fb7c8..a4af1dd8 100644
--- a/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.cc
+++ b/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.cc
@@ -51,8 +51,7 @@
   return reinterpret_cast<intptr_t>(bridge);
 }
 
-void SendTabToSelfModelObserverBridge::Destroy(JNIEnv*,
-                                               const JavaParamRef<jobject>&) {
+void SendTabToSelfModelObserverBridge::Destroy(JNIEnv*) {
   delete this;
 }
 
diff --git a/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.h b/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.h
index b33ddec..e916386 100644
--- a/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.h
+++ b/chrome/browser/android/send_tab_to_self/send_tab_to_self_model_observer_bridge.h
@@ -24,7 +24,7 @@
       const base::android::JavaRef<jobject>& obj,
       const base::android::JavaRef<jobject>& j_profile);
 
-  void Destroy(JNIEnv*, const base::android::JavaParamRef<jobject>&);
+  void Destroy(JNIEnv*);
 
   // SendTabToSelfModelObserver implementation.
   void SendTabToSelfModelLoaded() override;
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
index 312e50e..3c1ecf9d 100644
--- a/chrome/browser/android/signin/signin_manager_android.cc
+++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -164,7 +164,6 @@
 
 void SigninManagerAndroid::OnSignInCompleted(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& username) {
   DVLOG(1) << "SigninManagerAndroid::OnSignInCompleted";
 
@@ -176,7 +175,6 @@
 }
 
 void SigninManagerAndroid::SignOut(JNIEnv* env,
-                                   const JavaParamRef<jobject>& obj,
                                    jint signoutReason) {
   auto* account_mutator = identity_manager_->GetPrimaryAccountMutator();
 
@@ -191,14 +189,11 @@
       signin_metrics::SignoutDelete::IGNORE_METRIC);
 }
 
-void SigninManagerAndroid::ClearLastSignedInUser(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void SigninManagerAndroid::ClearLastSignedInUser(JNIEnv* env) {
   ClearLastSignedInUserForProfile(profile_);
 }
 
-void SigninManagerAndroid::LogInSignedInUser(JNIEnv* env,
-                                             const JavaParamRef<jobject>& obj) {
+void SigninManagerAndroid::LogInSignedInUser(JNIEnv* env) {
   // With the account consistency enabled let the account Reconcilor handles
   // everything.
   // TODO(https://crbug.com/930094): Determine the right long-term flow here.
@@ -209,21 +204,15 @@
   return signin_allowed_.GetValue();
 }
 
-jboolean SigninManagerAndroid::IsSigninAllowedByPolicy(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) const {
+jboolean SigninManagerAndroid::IsSigninAllowedByPolicy(JNIEnv* env) const {
   return IsSigninAllowed();
 }
 
-jboolean SigninManagerAndroid::IsForceSigninEnabled(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean SigninManagerAndroid::IsForceSigninEnabled(JNIEnv* env) {
   return force_browser_signin_.GetValue();
 }
 
-jboolean SigninManagerAndroid::IsSignedInOnNative(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean SigninManagerAndroid::IsSignedInOnNative(JNIEnv* env) {
   return identity_manager_->HasPrimaryAccount();
 }
 
@@ -240,9 +229,7 @@
       IsSigninAllowed());
 }
 
-void SigninManagerAndroid::StopApplyingCloudPolicy(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void SigninManagerAndroid::StopApplyingCloudPolicy(JNIEnv* env) {
   user_policy_signin_service_->ShutdownUserCloudPolicyManager();
 }
 
@@ -270,7 +257,6 @@
 
 void SigninManagerAndroid::FetchAndApplyCloudPolicy(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& j_username,
     const base::android::JavaParamRef<jobject>& j_callback) {
   std::string username =
@@ -326,7 +312,6 @@
 
 void SigninManagerAndroid::IsAccountManaged(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& j_username,
     const JavaParamRef<jobject>& j_callback) {
   base::android::ScopedJavaGlobalRef<jobject> callback(env, j_callback);
@@ -349,8 +334,7 @@
 }
 
 base::android::ScopedJavaLocalRef<jstring>
-SigninManagerAndroid::GetManagementDomain(JNIEnv* env,
-                                          const JavaParamRef<jobject>& obj) {
+SigninManagerAndroid::GetManagementDomain(JNIEnv* env) {
   base::android::ScopedJavaLocalRef<jstring> domain;
 
   policy::CloudPolicyStore* store = user_cloud_policy_manager_->core()->store();
@@ -365,7 +349,6 @@
 
 void SigninManagerAndroid::WipeProfileData(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_callback) {
   WipeData(
       profile_, true /* all data */,
@@ -375,7 +358,6 @@
 
 void SigninManagerAndroid::WipeGoogleServiceWorkerCaches(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& j_callback) {
   WipeData(
       profile_, false /* only Google service worker caches */,
diff --git a/chrome/browser/android/signin/signin_manager_android.h b/chrome/browser/android/signin/signin_manager_android.h
index 38bcff8..90dc9e7d 100644
--- a/chrome/browser/android/signin/signin_manager_android.h
+++ b/chrome/browser/android/signin/signin_manager_android.h
@@ -45,29 +45,20 @@
   // Indicates that the user has made the choice to sign-in. |username|
   // contains the email address of the account to use as primary.
   void OnSignInCompleted(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& obj,
                          const base::android::JavaParamRef<jstring>& username);
 
   void SignOut(JNIEnv* env,
-               const base::android::JavaParamRef<jobject>& obj,
                jint signoutReason);
 
-  void LogInSignedInUser(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& obj);
+  void LogInSignedInUser(JNIEnv* env);
 
-  void ClearLastSignedInUser(JNIEnv* env,
-                             const base::android::JavaParamRef<jobject>& obj);
+  void ClearLastSignedInUser(JNIEnv* env);
 
-  jboolean IsSigninAllowedByPolicy(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj) const;
+  jboolean IsSigninAllowedByPolicy(JNIEnv* env) const;
 
-  jboolean IsForceSigninEnabled(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  jboolean IsForceSigninEnabled(JNIEnv* env);
 
-  jboolean IsSignedInOnNative(JNIEnv* env,
-                              const base::android::JavaParamRef<jobject>& obj);
+  jboolean IsSignedInOnNative(JNIEnv* env);
 
   // signin::IdentityManager::Observer implementation.
   void OnPrimaryAccountCleared(
@@ -77,31 +68,24 @@
   // the policy if necessary.
   void FetchAndApplyCloudPolicy(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& username,
       const base::android::JavaParamRef<jobject>& j_callback);
 
-  void StopApplyingCloudPolicy(JNIEnv* env,
-                               const base::android::JavaParamRef<jobject>& obj);
+  void StopApplyingCloudPolicy(JNIEnv* env);
 
   void IsAccountManaged(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
                         const base::android::JavaParamRef<jstring>& j_username,
                         const base::android::JavaParamRef<jobject>& j_callback);
 
-  base::android::ScopedJavaLocalRef<jstring> GetManagementDomain(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  base::android::ScopedJavaLocalRef<jstring> GetManagementDomain(JNIEnv* env);
 
   // Delete all data for this profile.
   void WipeProfileData(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj,
                        const base::android::JavaParamRef<jobject>& j_callback);
 
   // Delete service worker caches for google.<eTLD>.
   void WipeGoogleServiceWorkerCaches(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& j_callback);
 
  private:
diff --git a/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.cc b/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.cc
index 1e75f79a..aa511b1 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.cc
+++ b/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.cc
@@ -68,7 +68,6 @@
 
 void ArCoreConsentPrompt::OnUserConsentResult(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& j_caller,
     jboolean is_granted) {
   jdelegate_.Reset();
 
@@ -142,7 +141,6 @@
 
 void ArCoreConsentPrompt::OnRequestInstallArModuleResult(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     bool success) {
   DVLOG(1) << __func__;
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -154,7 +152,6 @@
 
 void ArCoreConsentPrompt::OnRequestInstallSupportedArCoreResult(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     bool success) {
   DVLOG(1) << __func__;
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
diff --git a/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h b/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h
index 45a27a50..1491eb7 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h
+++ b/chrome/browser/android/vr/arcore_device/arcore_consent_prompt.h
@@ -29,15 +29,12 @@
 
   // Called from Java end.
   void OnUserConsentResult(JNIEnv* env,
-                           const base::android::JavaParamRef<jobject>& j_caller,
                            jboolean is_granted);
   void OnRequestInstallArModuleResult(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       bool success);
   void OnRequestInstallSupportedArCoreResult(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       bool success);
 
  private:
diff --git a/chrome/browser/android/vr/gvr_consent_helper_impl.cc b/chrome/browser/android/vr/gvr_consent_helper_impl.cc
index 16855b0..61a066a 100644
--- a/chrome/browser/android/vr/gvr_consent_helper_impl.cc
+++ b/chrome/browser/android/vr/gvr_consent_helper_impl.cc
@@ -69,7 +69,6 @@
 
 void GvrConsentHelperImpl::OnUserConsentResult(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& j_caller,
     jboolean is_granted) {
   jdelegate_.Reset();
   if (!on_user_consent_callback_)
diff --git a/chrome/browser/android/vr/gvr_consent_helper_impl.h b/chrome/browser/android/vr/gvr_consent_helper_impl.h
index 508073f0..d52bba1 100644
--- a/chrome/browser/android/vr/gvr_consent_helper_impl.h
+++ b/chrome/browser/android/vr/gvr_consent_helper_impl.h
@@ -27,7 +27,6 @@
                                int render_frame_id,
                                OnUserConsentCallback) override;
   void OnUserConsentResult(JNIEnv* env,
-                           const base::android::JavaParamRef<jobject>& j_caller,
                            jboolean is_granted);
 
  private:
diff --git a/chrome/browser/android/webapk/webapk_handler_delegate.cc b/chrome/browser/android/webapk/webapk_handler_delegate.cc
index 0b61cf9..a71c1a5c 100644
--- a/chrome/browser/android/webapk/webapk_handler_delegate.cc
+++ b/chrome/browser/android/webapk/webapk_handler_delegate.cc
@@ -35,7 +35,6 @@
 
 void WebApkHandlerDelegate::OnWebApkInfoRetrieved(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jstring>& jname,
     const JavaParamRef<jstring>& jshort_name,
     const JavaParamRef<jstring>& jpackage_name,
diff --git a/chrome/browser/android/webapk/webapk_handler_delegate.h b/chrome/browser/android/webapk/webapk_handler_delegate.h
index 11fa2e7..af810de9 100644
--- a/chrome/browser/android/webapk/webapk_handler_delegate.h
+++ b/chrome/browser/android/webapk/webapk_handler_delegate.h
@@ -26,7 +26,6 @@
   // Called once for each installed WebAPK when RetrieveWebApks() is called.
   void OnWebApkInfoRetrieved(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
       const base::android::JavaParamRef<jstring>& jname,
       const base::android::JavaParamRef<jstring>& jshort_name,
       const base::android::JavaParamRef<jstring>& jpackage_name,
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
index 91fc1c3..06810e4 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -741,15 +741,11 @@
                      ScopedJavaGlobalRef<jobject>(jdelegate)));
 }
 
-jboolean PersonalDataManagerAndroid::HasProfiles(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& unused_obj) {
+jboolean PersonalDataManagerAndroid::HasProfiles(JNIEnv* env) {
   return !personal_data_manager_->GetProfiles().empty();
 }
 
-jboolean PersonalDataManagerAndroid::HasCreditCards(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& unused_obj) {
+jboolean PersonalDataManagerAndroid::HasCreditCards(JNIEnv* env) {
   return !personal_data_manager_->GetCreditCards().empty();
 }
 
@@ -773,15 +769,11 @@
                                               jtimeout_seconds, std::move(cb));
 }
 
-void PersonalDataManagerAndroid::CancelPendingGetSubKeys(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& unused_obj) {
+void PersonalDataManagerAndroid::CancelPendingGetSubKeys(JNIEnv* env) {
   subkey_requester_.CancelPendingGetSubKeys();
 }
 
-void PersonalDataManagerAndroid::SetSyncServiceForTesting(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& unused_obj) {
+void PersonalDataManagerAndroid::SetSyncServiceForTesting(JNIEnv* env) {
   personal_data_manager_->SetSyncingForTest(true);
 }
 
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h
index 0cbda90..90f28d5 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.h
+++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -320,13 +320,10 @@
       const base::android::JavaParamRef<jobject>& jdelegate);
 
   // Checks whether the Autofill PersonalDataManager has profiles.
-  jboolean HasProfiles(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& unused_obj);
+  jboolean HasProfiles(JNIEnv* env);
 
   // Checks whether the Autofill PersonalDataManager has credit cards.
-  jboolean HasCreditCards(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& unused_obj);
+  jboolean HasCreditCards(JNIEnv* env);
 
   // Gets the subkeys for the region with |jregion_code| code, if the
   // |jregion_code| rules have finished loading. Otherwise, sets up a task to
@@ -339,13 +336,9 @@
       const base::android::JavaParamRef<jobject>& jdelegate);
 
   // Cancels the pending subkey request task.
-  void CancelPendingGetSubKeys(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& unused_obj);
+  void CancelPendingGetSubKeys(JNIEnv* env);
 
-  void SetSyncServiceForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& unused_obj);
+  void SetSyncServiceForTesting(JNIEnv* env);
 
   static const char* GetPrefNameExposedToJava(int pref_index);
 
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 0fc9c6e..86337e60 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -137,28 +137,6 @@
       <include name="IDR_ACCESSIBILITY_CSS" file="resources\accessibility\accessibility.css" compress="gzip" type="BINDATA" />
       <include name="IDR_ACCESSIBILITY_JS" file="resources\accessibility\accessibility.js" flattenhtml="true" compress="gzip" type="BINDATA" />
       <include name="IDR_AD_NETWORK_HASHES" file="resources\ad_networks.dat" type="BINDATA" />
-      <include name="IDR_BLUETOOTH_ADAPTER_MOJO_JS" file="${root_gen_dir}\device\bluetooth\public\mojom\adapter.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_DEVICE_MOJO_JS" file="${root_gen_dir}\device\bluetooth\public\mojom\device.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_UUID_MOJO_JS" file="${root_gen_dir}\device\bluetooth\public\mojom\uuid.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_CSS" file="resources\bluetooth_internals\bluetooth_internals.css" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_ADAPTER_BROKER_JS" file="resources\bluetooth_internals\adapter_broker.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_ADAPTER_PAGE_JS" file="resources\bluetooth_internals\adapter_page.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_CHARACTERISTIC_LIST_JS" file="resources\bluetooth_internals\characteristic_list.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_DESCRIPTOR_LIST_JS" file="resources\bluetooth_internals\descriptor_list.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_BROKER_JS" file="resources\bluetooth_internals\device_broker.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_COLLECTION_JS" file="resources\bluetooth_internals\device_collection.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_DETAILS_PAGE_JS" file="resources\bluetooth_internals\device_details_page.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_TABLE_JS" file="resources\bluetooth_internals\device_table.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_DEVICES_PAGE_JS" file="resources\bluetooth_internals\devices_page.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_EXPANDABLE_LIST_JS" file="resources\bluetooth_internals\expandable_list.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_HTML" file="resources\bluetooth_internals\bluetooth_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_JS" file="resources\bluetooth_internals\bluetooth_internals.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_MOJO_JS" file="${root_gen_dir}\chrome\browser\ui\webui\bluetooth_internals\bluetooth_internals.mojom-lite.js" use_base_dir="false" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_OBJECT_FIELDSET_JS" file="resources\bluetooth_internals\object_fieldset.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_SERVICE_LIST_JS" file="resources\bluetooth_internals\service_list.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_SIDEBAR_JS" file="resources\bluetooth_internals\sidebar.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_SNACKBAR_JS" file="resources\bluetooth_internals\snackbar.js" type="BINDATA" compress="gzip" />
-      <include name="IDR_BLUETOOTH_INTERNALS_VALUE_CONTROL_JS" file="resources\bluetooth_internals\value_control.js" type="BINDATA" compress="gzip" />
       <if expr="is_posix and not is_macosx">
         <include name="IDR_CERTIFICATE_VIEWER_HTML" file="resources\certificate_viewer.html" type="BINDATA" />
         <include name="IDR_CERTIFICATE_VIEWER_JS" file="resources\certificate_viewer.js" type="BINDATA" />
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index b9e3c15..56ec0a0 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -1306,7 +1306,6 @@
   TRACE_EVENT0("startup", "ChromeBrowserMainParts::PreMainMessageLoopRunImpl");
 
   SCOPED_UMA_HISTOGRAM_LONG_TIMER("Startup.PreMainMessageLoopRunImplLongTime");
-  const base::TimeTicks start_time_step1 = base::TimeTicks::Now();
 
   // Can't be in SetupFieldTrials() because it needs a task runner.
   blink::MemoryAblationExperiment::MaybeStart(
@@ -1525,11 +1524,6 @@
   // Desktop construction occurs here, (required before profile creation).
   PreProfileInit();
 
-  // Profile creation ----------------------------------------------------------
-
-  UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep1Time",
-                      base::TimeTicks::Now() - start_time_step1);
-
   // This step is costly and is already measured in Startup.CreateFirstProfile
   // and more directly Profile.CreateAndInitializeProfile.
   profile_ = CreatePrimaryProfile(parameters(),
@@ -1539,7 +1533,6 @@
     return service_manager::RESULT_CODE_NORMAL_EXIT;
 
 #if !defined(OS_ANDROID)
-  const base::TimeTicks start_time_step2 = base::TimeTicks::Now();
   // The first run sentinel must be created after the process singleton was
   // grabbed and no early return paths were otherwise hit above.
   first_run::CreateSentinelIfNeeded();
@@ -1768,9 +1761,6 @@
       g_browser_process->profile_manager()->GetLastOpenedProfiles();
 #endif  // defined(OS_CHROMEOS)
 
-  UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep2Time",
-                      base::TimeTicks::Now() - start_time_step2);
-
   // This step is costly and is already measured in
   // Startup.StartupBrowserCreator_Start.
   // See the comment above for an explanation of |process_command_line|.
@@ -1778,7 +1768,6 @@
       !process_command_line ||
       browser_creator_->Start(parsed_command_line(), base::FilePath(), profile_,
                               last_opened_profiles);
-  const base::TimeTicks start_time_step3 = base::TimeTicks::Now();
   if (started) {
 #if defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
     // Initialize autoupdate timer. Timer callback costs basically nothing
@@ -1843,10 +1832,6 @@
   }
 #endif  // defined(OS_ANDROID)
 
-#if !defined(OS_ANDROID)
-  UMA_HISTOGRAM_TIMES("Startup.PreMainMessageLoopRunImplStep3Time",
-                      base::TimeTicks::Now() - start_time_step3);
-#endif  // !defined(OS_ANDROID)
 
 #if BUILDFLAG(ENABLE_SIMPLE_BROWSER_SERVICE_OUT_OF_PROCESS) || \
     BUILDFLAG(ENABLE_SIMPLE_BROWSER_SERVICE_IN_PROCESS)
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 5c77cc9..52db0ad0 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -426,13 +426,17 @@
     vm_applications_service_.reset();
     drive_file_stream_service_.reset();
     cryptohome_key_delegate_service_.reset();
-    machine_learning_decision_service_.reset();
     ProcessDataCollector::Shutdown();
     PowerDataCollector::Shutdown();
     PowerPolicyController::Shutdown();
     device::BluetoothAdapterFactory::Shutdown();
   }
 
+  void PreAshShutdown() {
+    // Services depending on ash should be released here.
+    machine_learning_decision_service_.reset();
+  }
+
  private:
   std::unique_ptr<CrosDBusService> proxy_resolution_service_;
   std::unique_ptr<CrosDBusService> kiosk_info_service_;
@@ -1191,6 +1195,9 @@
         language::prefs::kApplicationLocale));
   }
 
+  // Cleans up dbus services depending on ash.
+  dbus_services_->PreAshShutdown();
+
   // NOTE: Closes ash and destroys ash::Shell.
   ChromeBrowserMainPartsLinux::PostMainMessageLoopRun();
 
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 1bef613..09621ea6 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -2555,11 +2555,13 @@
 
 void CrostiniManager::SuspendImminent(
     power_manager::SuspendImminent::Reason reason) {
-  // https://crbug.com/968060.  Unmount sshfs before suspend.
+  // Block suspend and try to unmount sshfs (https://crbug.com/968060).
+  auto token = base::UnguessableToken::Create();
+  chromeos::PowerManagerClient::Get()->BlockSuspend(token, "CrostiniManager");
   file_manager::VolumeManager::Get(profile_)->RemoveSshfsCrostiniVolume(
-      file_manager::util::GetCrostiniMountDirectory(profile_));
-  SetContainerSshfsMounted(kCrostiniDefaultVmName,
-                           kCrostiniDefaultContainerName, false);
+      file_manager::util::GetCrostiniMountDirectory(profile_),
+      base::BindOnce(&CrostiniManager::OnRemoveSshfsCrostiniVolume,
+                     weak_ptr_factory_.GetWeakPtr(), token));
 }
 
 void CrostiniManager::SuspendDone(const base::TimeDelta& sleep_duration) {
@@ -2571,4 +2573,16 @@
   }
 }
 
+void CrostiniManager::OnRemoveSshfsCrostiniVolume(
+    base::UnguessableToken power_manager_suspend_token,
+    bool result) {
+  if (result) {
+    SetContainerSshfsMounted(kCrostiniDefaultVmName,
+                             kCrostiniDefaultContainerName, false);
+  }
+  // Need to let the device suspend after cleaning up.
+  chromeos::PowerManagerClient::Get()->UnblockSuspend(
+      power_manager_suspend_token);
+}
+
 }  // namespace crostini
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h
index 7649e5d..4a031a9 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.h
+++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -15,6 +15,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/optional.h"
+#include "base/unguessable_token.h"
 #include "chrome/browser/chromeos/crostini/crostini_simple_types.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
@@ -452,6 +453,13 @@
   void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
 
+  // Callback for |RemoveSshfsCrostiniVolume| called from |SuspendImminent| when
+  // the device is allowed to suspend. Removes metadata associated with the
+  // crostini sshfs mount and unblocks a pending suspend.
+  void OnRemoveSshfsCrostiniVolume(
+      base::UnguessableToken power_manager_suspend_token,
+      bool result);
+
   void RemoveCrostini(std::string vm_name, RemoveCrostiniCallback callback);
 
   void UpdateVmState(std::string vm_name, VmState vm_state);
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
index c9be2cc4..0e3d694 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
@@ -254,7 +254,7 @@
     }
     case file_manager::VOLUME_TYPE_CROSTINI:
       file_manager::VolumeManager::Get(chrome_details.GetProfile())
-          ->RemoveSshfsCrostiniVolume(volume->mount_path());
+          ->RemoveSshfsCrostiniVolume(volume->mount_path(), base::DoNothing());
       break;
     default:
       // Requested unmounting a device which is not unmountable.
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc
index 0da12c4d..72dd587 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc
@@ -662,18 +662,22 @@
           crostini::kCrostiniDefaultVmName,
           crostini::kCrostiniDefaultContainerName,
           base::BindOnce(&VolumeManager::RemoveSshfsCrostiniVolume,
-                         weak_ptr_factory_.GetWeakPtr(), sshfs_mount_path));
+                         weak_ptr_factory_.GetWeakPtr(), sshfs_mount_path,
+                         base::BindOnce([](bool result) {
+                           if (!result)
+                             LOG(ERROR) << "Failed to remove sshfs mount";
+                         })));
 }
 
 void VolumeManager::RemoveSshfsCrostiniVolume(
-    const base::FilePath& sshfs_mount_path) {
+    const base::FilePath& sshfs_mount_path,
+    RemoveSshfsCrostiniVolumeCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  // Call DiskMountManager first since DoUnmountEvent deletes Volume.
   disk_mount_manager_->UnmountPath(
       sshfs_mount_path.value(), chromeos::UNMOUNT_OPTIONS_NONE,
-      chromeos::disks::DiskMountManager::UnmountPathCallback());
-  DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
-                 *Volume::CreateForSshfsCrostini(sshfs_mount_path));
+      base::BindOnce(&VolumeManager::OnSshfsCrostiniUnmountCallback,
+                     base::Unretained(this), sshfs_mount_path,
+                     std::move(callback)));
 }
 
 bool VolumeManager::RegisterAndroidFilesDirectoryForTesting(
@@ -1411,4 +1415,24 @@
   return drive_integration_service_->GetMountPointPath();
 }
 
+void VolumeManager::OnSshfsCrostiniUnmountCallback(
+    const base::FilePath& sshfs_mount_path,
+    RemoveSshfsCrostiniVolumeCallback callback,
+    chromeos::MountError error_code) {
+  if ((error_code == chromeos::MOUNT_ERROR_NONE) ||
+      (error_code == chromeos::MOUNT_ERROR_PATH_NOT_MOUNTED)) {
+    // Remove metadata associated with the mount. It will be a no-op if it
+    // wasn't mounted or unmounted out of band.
+    DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
+                   *Volume::CreateForSshfsCrostini(sshfs_mount_path));
+    if (callback)
+      std::move(callback).Run(true);
+    return;
+  }
+
+  LOG(ERROR) << "Unmounting " << sshfs_mount_path.value() << " failed";
+  if (callback)
+    std::move(callback).Run(false);
+}
+
 }  // namespace file_manager
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.h b/chrome/browser/chromeos/file_manager/volume_manager.h
index 6ce0775..d775f2ec 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.h
+++ b/chrome/browser/chromeos/file_manager/volume_manager.h
@@ -280,6 +280,9 @@
       const std::string&,
       device::mojom::MtpManager::GetStorageInfoCallback)>;
 
+  // Callback for |RemoveSshfsCrostiniVolume|.
+  using RemoveSshfsCrostiniVolumeCallback = base::OnceCallback<void(bool)>;
+
   VolumeManager(
       Profile* profile,
       drive::DriveIntegrationService* drive_integration_service,
@@ -316,8 +319,11 @@
   // Add sshfs crostini volume mounted at specified path.
   void AddSshfsCrostiniVolume(const base::FilePath& sshfs_mount_path);
 
-  // Removes specified sshfs crostini mount.
-  void RemoveSshfsCrostiniVolume(const base::FilePath& sshfs_mount_path);
+  // Removes specified sshfs crostini mount. Runs |callback| with true if the
+  // mount was removed successfully or wasn't mounted to begin with. Runs
+  // |callback| with false in all other cases.
+  void RemoveSshfsCrostiniVolume(const base::FilePath& sshfs_mount_path,
+                                 RemoveSshfsCrostiniVolumeCallback callback);
 
   // Removes Downloads volume used for testing.
   void RemoveDownloadsDirectoryForTesting();
@@ -442,6 +448,11 @@
   // Returns the path of the mount point for drive.
   base::FilePath GetDriveMountPointPath() const;
 
+  void OnSshfsCrostiniUnmountCallback(
+      const base::FilePath& sshfs_mount_path,
+      RemoveSshfsCrostiniVolumeCallback callback,
+      chromeos::MountError error_code);
+
   Profile* profile_;
   drive::DriveIntegrationService* drive_integration_service_;  // Not owned.
   chromeos::disks::DiskMountManager* disk_mount_manager_;      // Not owned.
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.cc b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
index c65e4a7..a752563 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
@@ -306,11 +306,6 @@
   std::move(callback).Run(dim_deferred_);
 }
 
-void UserActivityManager::OnSessionManagerDestroyed() {
-  session_manager_observer_.RemoveAll();
-  session_manager_ = nullptr;
-}
-
 void UserActivityManager::OnSessionStateChanged() {
   DCHECK(session_manager_);
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.h b/chrome/browser/chromeos/power/ml/user_activity_manager.h
index 80394c74..d0f2a9b 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.h
@@ -117,7 +117,6 @@
                               UserActivityEvent::ModelPrediction prediction);
 
   // session_manager::SessionManagerObserver overrides:
-  void OnSessionManagerDestroyed() override;
   void OnSessionStateChanged() override;
 
  private:
@@ -203,7 +202,7 @@
                  session_manager::SessionManagerObserver>
       session_manager_observer_;
 
-  session_manager::SessionManager* session_manager_ = nullptr;
+  session_manager::SessionManager* const session_manager_;
 
   mojo::Binding<viz::mojom::VideoDetectorObserver> binding_;
 
diff --git a/chrome/browser/chromeos/ui/passphrase_textfield.cc b/chrome/browser/chromeos/ui/passphrase_textfield.cc
index 87ff455..bcbaebc 100644
--- a/chrome/browser/chromeos/ui/passphrase_textfield.cc
+++ b/chrome/browser/chromeos/ui/passphrase_textfield.cc
@@ -31,13 +31,13 @@
 
 void PassphraseTextfield::OnBlur() {
   // If password is not changed, then show the fake password when blurred.
-  if (show_fake_ && text().empty())
+  if (show_fake_ && GetText().empty())
     SetFakePassphrase();
   Textfield::OnBlur();
 }
 
 std::string PassphraseTextfield::GetPassphrase() {
-  return changed_ ? base::UTF16ToUTF8(text()) : std::string();
+  return changed_ ? base::UTF16ToUTF8(GetText()) : std::string();
 }
 
 void PassphraseTextfield::SetFakePassphrase() {
diff --git a/chrome/browser/chromeos/ui/request_pin_view.cc b/chrome/browser/chromeos/ui/request_pin_view.cc
index f4ed8273..784ad55 100644
--- a/chrome/browser/chromeos/ui/request_pin_view.cc
+++ b/chrome/browser/chromeos/ui/request_pin_view.cc
@@ -73,7 +73,7 @@
 
   if (!textfield_->GetEnabled())
     return true;
-  DCHECK(!textfield_->text().empty());
+  DCHECK(!textfield_->GetText().empty());
 
   error_label_->SetVisible(true);
   error_label_->SetText(
@@ -84,7 +84,7 @@
   // The |textfield_| and OK button become disabled, but the user still can
   // close the dialog.
   SetAcceptInput(false);
-  std::move(callback_).Run(base::UTF16ToUTF8(textfield_->text()));
+  std::move(callback_).Run(base::UTF16ToUTF8(textfield_->GetText()));
   DialogModelChanged();
   delegate_->OnPinDialogInput();
 
@@ -103,7 +103,7 @@
       // dialog.
       if (!textfield_->GetEnabled())
         return true;
-      return textfield_->text().size() > 0;
+      return textfield_->GetText().size() > 0;
     case ui::DialogButton::DIALOG_BUTTON_NONE:
       return true;
   }
diff --git a/chrome/browser/dom_distiller/OWNERS b/chrome/browser/dom_distiller/OWNERS
index 9db3893..1b6f4e1a 100644
--- a/chrome/browser/dom_distiller/OWNERS
+++ b/chrome/browser/dom_distiller/OWNERS
@@ -1 +1,2 @@
 file://components/dom_distiller/OWNERS
+# COMPONENT: UI>Browser>ReaderMode
diff --git a/chrome/browser/enterprise_reporting/policy_info_unittest.cc b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
index 0d3b8937..00695a4 100644
--- a/chrome/browser/enterprise_reporting/policy_info_unittest.cc
+++ b/chrome/browser/enterprise_reporting/policy_info_unittest.cc
@@ -84,12 +84,12 @@
 
   EXPECT_CALL(*policy_service(), GetPolicies(_));
 
-  AppendChromePolicyInfoIntoProfileReport(
-      policy::GetAllPolicyValuesAsDictionary(
-          profile(), /* with_user_policies */ true, /* convert_values */ false,
-          /* with_device_data*/ false,
-          /* is_pretty_print */ false, /* convert_types */ false),
-      &profile_info);
+  AppendChromePolicyInfoIntoProfileReport(policy::DictionaryPolicyConversions()
+                                              .WithBrowserContext(profile())
+                                              .EnableConvertTypes(false)
+                                              .EnablePrettyPrint(false)
+                                              .ToValue(),
+                                          &profile_info);
   EXPECT_EQ(2, profile_info.chrome_policies_size());
 
   auto policy1 = profile_info.chrome_policies(0);
@@ -131,8 +131,11 @@
                               std::make_unique<base::Value>(3), nullptr);
   em::ChromeUserProfileInfo profile_info;
   AppendExtensionPolicyInfoIntoProfileReport(
-      policy::GetAllPolicyValuesAsDictionary(profile(), true, false, false,
-                                             false, false),
+      policy::DictionaryPolicyConversions()
+          .WithBrowserContext(profile())
+          .EnableConvertTypes(false)
+          .EnablePrettyPrint(false)
+          .ToValue(),
       &profile_info);
   // The second extension is not in the report because it has no policy.
   EXPECT_EQ(1, profile_info.extension_policies_size());
diff --git a/chrome/browser/enterprise_reporting/profile_report_generator.cc b/chrome/browser/enterprise_reporting/profile_report_generator.cc
index a7012fc..82e466d 100644
--- a/chrome/browser/enterprise_reporting/profile_report_generator.cc
+++ b/chrome/browser/enterprise_reporting/profile_report_generator.cc
@@ -59,10 +59,11 @@
 
   if (policies_enabled_) {
     // TODO(crbug.com/983151): Upload policy error as their IDs.
-    policies_ = policy::GetAllPolicyValuesAsDictionary(
-        profile_, /* with_user_policies */ true, /* convert_values */ false,
-        /* with_device_data*/ false,
-        /* is_pretty_print */ false, /* convert_types */ false);
+    policies_ = policy::DictionaryPolicyConversions()
+                    .WithBrowserContext(profile_)
+                    .EnableConvertTypes(false)
+                    .EnablePrettyPrint(false)
+                    .ToValue();
     GetChromePolicyInfo();
     GetExtensionPolicyInfo();
     GetPolicyFetchTimestampInfo();
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
index 85b835c4..5284f7e 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/chrome_desktop_report_request_helper.cc
@@ -113,8 +113,10 @@
     // the future.
     request->mutable_browser_report()
         ->mutable_chrome_user_profile_reports(0)
-        ->set_policy_data(
-            policy::GetAllPolicyValuesAsJSON(profile, true, false, false));
+        ->set_policy_data(policy::DictionaryPolicyConversions()
+                              .WithBrowserContext(profile)
+                              .EnablePrettyPrint(false)
+                              .ToJSON());
 
     int64_t timestamp = GetMachineLevelUserCloudPolicyFetchTimestamp();
     if (timestamp > 0) {
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index 84a7a97..74a6724 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -48,9 +48,6 @@
 
 namespace {
 
-// Whether the browser action is visible in the toolbar.
-const char kBrowserActionVisible[] = "browser_action_visible";
-
 // Errors.
 const char kNoExtensionActionError[] =
     "This extension has no action specified.";
@@ -113,29 +110,6 @@
   observers_.RemoveObserver(observer);
 }
 
-bool ExtensionActionAPI::GetBrowserActionVisibility(
-    const std::string& extension_id) {
-  bool visible = false;
-  ExtensionPrefs* prefs = GetExtensionPrefs();
-  if (!prefs || !prefs->ReadPrefAsBoolean(extension_id,
-                                          kBrowserActionVisible,
-                                          &visible)) {
-    return true;
-  }
-  return visible;
-}
-
-void ExtensionActionAPI::SetBrowserActionVisibility(
-    const std::string& extension_id,
-    bool visible) {
-  if (GetBrowserActionVisibility(extension_id) == visible)
-    return;
-
-  GetExtensionPrefs()->UpdateExtensionPref(
-      extension_id, kBrowserActionVisible,
-      std::make_unique<base::Value>(visible));
-}
-
 bool ExtensionActionAPI::ShowExtensionActionPopup(
     const Extension* extension,
     Browser* browser,
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.h b/chrome/browser/extensions/api/extension_action/extension_action_api.h
index f4d9ea2..a5910ca 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.h
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.h
@@ -67,10 +67,6 @@
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
-  bool GetBrowserActionVisibility(const std::string& extension_id);
-  void SetBrowserActionVisibility(const std::string& extension_id,
-                                  bool visible);
-
   // Opens the popup for the given |extension| in the given |browser|'s window.
   // If |grant_active_tab_permissions| is true, this grants the extension
   // activeTab (so this should only be done if this is through a direct user
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_prefs_unittest.cc b/chrome/browser/extensions/api/extension_action/extension_action_prefs_unittest.cc
deleted file mode 100644
index 9eb67c6..0000000
--- a/chrome/browser/extensions/api/extension_action/extension_action_prefs_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2013 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 <string>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
-#include "chrome/browser/extensions/extension_prefs_unittest.h"
-#include "chrome/test/base/testing_profile.h"
-#include "extensions/common/extension.h"
-
-namespace extensions {
-
-// Tests force hiding browser actions.
-class ExtensionPrefsHidingBrowserActions : public ExtensionPrefsTest {
- public:
-  ExtensionPrefsHidingBrowserActions() {}
-  ~ExtensionPrefsHidingBrowserActions() override {}
-
-  void Initialize() override {
-    profile_.reset(new TestingProfile());
-
-    // Install 5 extensions.
-    for (int i = 0; i < 5; i++) {
-      std::string name = "test" + base::NumberToString(i);
-      extensions_.push_back(prefs_.AddExtension(name));
-    }
-
-    ExtensionActionAPI* action_api = ExtensionActionAPI::Get(profile_.get());
-    action_api->set_prefs_for_testing(prefs());
-    for (const scoped_refptr<const Extension>& extension : extensions_)
-      EXPECT_TRUE(action_api->GetBrowserActionVisibility(extension->id()));
-
-    action_api->SetBrowserActionVisibility(extensions_[0]->id(), false);
-    action_api->SetBrowserActionVisibility(extensions_[1]->id(), true);
-  }
-
-  void Verify() override {
-    ExtensionActionAPI* action_api = ExtensionActionAPI::Get(profile_.get());
-    action_api->set_prefs_for_testing(prefs());
-    // Make sure the one we hid is hidden.
-    EXPECT_FALSE(action_api->GetBrowserActionVisibility(extensions_[0]->id()));
-
-    // Make sure the other id's are not hidden.
-    ExtensionList::const_iterator iter = extensions_.begin() + 1;
-    for (; iter != extensions_.end(); ++iter) {
-      SCOPED_TRACE(base::StringPrintf("Loop %d ",
-                       static_cast<int>(iter - extensions_.begin())));
-      EXPECT_TRUE(action_api->GetBrowserActionVisibility((*iter)->id()));
-    }
-  }
-
- private:
-  std::unique_ptr<TestingProfile> profile_;
-  ExtensionList extensions_;
-
-  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefsHidingBrowserActions);
-};
-
-TEST_F(ExtensionPrefsHidingBrowserActions, ForceHide) {}
-
-}  // namespace extensions
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
index 1f9c0f8..3415b96 100644
--- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc
+++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -13,7 +13,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/app/chrome_command_ids.h"
-#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
 #include "chrome/browser/extensions/chrome_extension_browser_constants.h"
 #include "chrome/browser/extensions/context_menu_matcher.h"
 #include "chrome/browser/extensions/extension_action_runner.h"
@@ -678,14 +677,7 @@
     int index = menu.GetIndexOfCommandId(visibility_command);
     EXPECT_NE(-1, index);
     EXPECT_EQ(hide_string, menu.GetLabelAt(index));
-
-    ExtensionActionAPI* action_api = ExtensionActionAPI::Get(profile());
-    EXPECT_TRUE(action_api->GetBrowserActionVisibility(browser_action->id()));
-    // Executing the 'hide' command shouldn't modify the prefs (the ordering
-    // behavior is tested in ToolbarActionsModel tests).
-    // TODO(devlin): We should be able to get rid of the pref.
     menu.ExecuteCommand(visibility_command, 0);
-    EXPECT_TRUE(action_api->GetBrowserActionVisibility(browser_action->id()));
   }
 
   {
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.cc b/chrome/browser/navigation_predictor/navigation_predictor.cc
index 8e58fdc..58d2452 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor.cc
@@ -28,6 +28,9 @@
 #include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "net/base/features.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "third_party/blink/public/common/features.h"
 #include "url/gurl.h"
 #include "url/url_canon.h"
@@ -189,7 +192,11 @@
       normalize_navigation_scores_(base::GetFieldTrialParamByFeatureAsBool(
           blink::features::kNavigationPredictor,
           "normalize_scores",
-          true)){
+          true)),
+      send_ukm_metrics_(base::GetFieldTrialParamByFeatureAsBool(
+          blink::features::kNavigationPredictor,
+          "send_ukm_metrics",
+          false)) {
   DCHECK(browser_context_);
   DETACH_FROM_SEQUENCE(sequence_checker_);
   DCHECK_LE(0, preconnect_origin_score_threshold_);
@@ -403,6 +410,47 @@
                      base::Unretained(this), Action::kPreconnectAfterTimeout));
 }
 
+void NavigationPredictor::MaybeSendMetricsToUkm() const {
+  if (!send_ukm_metrics_) {
+    return;
+  }
+
+  ukm::UkmRecorder* ukm_recorder = ukm::UkmRecorder::Get();
+  if (!ukm_recorder) {
+    return;
+  }
+
+  ukm::builders::NavigationPredictorPageLinkMetrics builder(ukm_source_id_);
+
+  builder.SetNumberOfAnchors_Total(
+      GetBucketMinForPageMetrics(number_of_anchors_));
+  builder.SetNumberOfAnchors_SameHost(
+      GetBucketMinForPageMetrics(number_of_anchors_same_host_));
+  builder.SetNumberOfAnchors_ContainsImage(
+      GetBucketMinForPageMetrics(number_of_anchors_contains_image_));
+  builder.SetNumberOfAnchors_InIframe(
+      GetBucketMinForPageMetrics(number_of_anchors_in_iframe_));
+  builder.SetNumberOfAnchors_URLIncremented(
+      GetBucketMinForPageMetrics(number_of_anchors_url_incremented_));
+  builder.SetTotalClickableSpace(
+      GetBucketMinForPageMetrics(total_clickable_space_));
+  builder.SetMedianLinkLocation(
+      GetBucketMinForMedianLinkLocation(median_link_location_));
+  builder.SetViewport_Height(
+      GetBucketMinForPageMetrics(viewport_size_.height()));
+  builder.SetViewport_Width(GetBucketMinForPageMetrics(viewport_size_.width()));
+
+  builder.Record(ukm_recorder);
+}
+
+int NavigationPredictor::GetBucketMinForPageMetrics(int value) const {
+  return ukm::GetExponentialBucketMin(value, 1.3);
+}
+
+int NavigationPredictor::GetBucketMinForMedianLinkLocation(int value) const {
+  return ukm::GetLinearBucketMin(static_cast<int64_t>(value), 10);
+}
+
 SiteEngagementService* NavigationPredictor::GetEngagementService() const {
   Profile* profile = Profile::FromBrowserContext(browser_context_);
   SiteEngagementService* service = SiteEngagementService::Get(profile);
@@ -685,6 +733,8 @@
   median_link_location_ = link_locations[link_locations.size() / 2];
   double page_metrics_score = GetPageMetricsScore();
 
+  MaybeSendMetricsToUkm();
+
   // Retrieve site engagement score of the document. |metrics| is guaranteed to
   // be non-empty. All |metrics| have the same source_url.
   SiteEngagementService* engagement_service = GetEngagementService();
diff --git a/chrome/browser/navigation_predictor/navigation_predictor.h b/chrome/browser/navigation_predictor/navigation_predictor.h
index fa75cb69..5c92a8d 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor.h
+++ b/chrome/browser/navigation_predictor/navigation_predictor.h
@@ -195,6 +195,18 @@
   // MaybePreconnectNow preconnects to an origin server if it's allowed.
   void MaybePreconnectNow(Action log_action);
 
+  // Sends metrics to the UKM id at |ukm_source_id_| if |send_ukm_metrics_|
+  // is true.
+  void MaybeSendMetricsToUkm() const;
+
+  // Returns the minimum of the bucket that |value| belongs in, for page-wide
+  // metrics, excluding |median_link_location_|.
+  int GetBucketMinForPageMetrics(int value) const;
+
+  // Returns the minimum of the bucket that |value| belongs in, for
+  // |median_link_location_|.
+  int GetBucketMinForMedianLinkLocation(int value) const;
+
   // Used to get keyed services.
   content::BrowserContext* const browser_context_;
 
@@ -270,6 +282,10 @@
   // all navigation scores for a page.
   const bool normalize_navigation_scores_;
 
+  // True if |this| should send metrics about aggregate link information
+  // to the UKM at id |ukm_source_id_|.
+  const bool send_ukm_metrics_;
+
   // Timing of document loaded and last click.
   base::TimeTicks document_loaded_timing_;
   base::TimeTicks last_click_timing_;
@@ -288,8 +304,6 @@
   std::unique_ptr<prerender::PrerenderHandle> prerender_handle_;
 
   // UKM ID for navigation
-  // TODO(sofiyase): implement that function that uses this id to send aggregate
-  // link information to the UKM.
   ukm::SourceId ukm_source_id_;
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc b/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc
index 3a1e46c3..df42909 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_unittest.cc
@@ -12,9 +12,11 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/web_contents.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/loader/navigation_predictor.mojom.h"
@@ -125,7 +127,8 @@
 
   void SetupFieldTrial(base::Optional<int> preconnect_origin_score_threshold,
                        base::Optional<int> prefetch_url_score_threshold,
-                       base::Optional<bool> prefetch_after_preconnect) {
+                       base::Optional<bool> prefetch_after_preconnect,
+                       base::Optional<bool> send_ukm_metrics) {
     if (field_trial_initiated_)
       return;
 
@@ -146,6 +149,9 @@
       params["prefetch_after_preconnect"] =
           prefetch_after_preconnect.value() ? "true" : "false";
     }
+    if (send_ukm_metrics.has_value()) {
+      params["send_ukm_metrics"] = send_ukm_metrics.value() ? "true" : "false";
+    }
     scoped_feature_list.InitAndEnableFeatureWithParameters(
         blink::features::kNavigationPredictor, params);
   }
@@ -510,11 +516,80 @@
   EXPECT_FALSE(prefetch_url().has_value());
 }
 
+class NavigationPredictorSendUkmMetricsEnabledTest
+    : public NavigationPredictorTest {
+ public:
+  NavigationPredictorSendUkmMetricsEnabledTest() {
+    SetupFieldTrial(base::nullopt, base::nullopt, base::nullopt, true);
+  }
+
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    predictor_service_helper_ = std::make_unique<TestNavigationPredictor>(
+        mojo::MakeRequest(&predictor_service_), main_rfh(), false);
+  }
+};
+
+// Checks that per-page link aggregate information is sent to the UKM on page
+// load.
+TEST_F(NavigationPredictorSendUkmMetricsEnabledTest, SendUkmMetrics) {
+  using UkmEntry = ukm::builders::NavigationPredictorPageLinkMetrics;
+
+  ukm::TestAutoSetUkmRecorder test_ukm_recorder;
+
+  const std::string source = "https://example.com";
+  const std::string same_origin_href_large = "https://example.com/large";
+  std::vector<blink::mojom::AnchorElementMetricsPtr> metrics;
+  metrics.push_back(CreateMetricsPtr(source, same_origin_href_large, 1));
+
+  predictor_service()->ReportAnchorElementMetricsOnLoad(std::move(metrics),
+                                                        GetDefaultViewport());
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_EQ(1ul, test_ukm_recorder.entries_count());
+
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kNumberOfAnchors_TotalName, 1);
+
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kNumberOfAnchors_SameHostName, 0);
+
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kNumberOfAnchors_ContainsImageName, 0);
+
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kNumberOfAnchors_InIframeName, 0);
+
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kNumberOfAnchors_URLIncrementedName, 0);
+
+  ukm::TestUkmRecorder::EntryHasMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kTotalClickableSpaceName);
+
+  ukm::TestUkmRecorder::EntryHasMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kMedianLinkLocationName);
+
+  ukm::TestUkmRecorder::EntryHasMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kViewport_HeightName);
+
+  ukm::TestUkmRecorder::EntryHasMetric(
+      test_ukm_recorder.GetEntriesByName(UkmEntry::kEntryName)[0],
+      UkmEntry::kViewport_WidthName);
+}
+
 class NavigationPredictorPrefetchAfterPreconnectEnabledTest
     : public NavigationPredictorTest {
  public:
   NavigationPredictorPrefetchAfterPreconnectEnabledTest() {
-    SetupFieldTrial(base::nullopt, base::nullopt, true);
+    SetupFieldTrial(base::nullopt, base::nullopt, true, base::nullopt);
   }
 
   void SetUp() override {
@@ -561,7 +636,8 @@
  public:
   NavigationPredictorPrefetchDisabledTest() {
     SetupFieldTrial(0 /* preconnect_origin_score_threshold */,
-                    101 /* prefetch_url_score_threshold */, base::nullopt);
+                    101 /* prefetch_url_score_threshold */, base::nullopt,
+                    base::nullopt);
   }
 
   void SetUp() override {
@@ -659,7 +735,8 @@
  public:
   NavigationPredictorPreconnectPrefetchDisabledTest() {
     SetupFieldTrial(101 /* preconnect_origin_score_threshold */,
-                    101 /* prefetch_url_score_threshold */, base::nullopt);
+                    101 /* prefetch_url_score_threshold */, base::nullopt,
+                    base::nullopt);
   }
 
   void SetUp() override {
diff --git a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
index dd67b4e..f9d7eeaa 100644
--- a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
+++ b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager.cc
@@ -216,6 +216,8 @@
 
     // TODO(hesen): Address only first icon for now. Handle all icons situation
     // in following CLs.
+    if (entry->notification_data.icons.empty())
+      return;
     notifications::ConvertIconToString(
         std::move(entry->notification_data.icons.front()),
         base::BindOnce(&ScheduledNotificationManagerImpl::OnIconEncoded,
diff --git a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc
index 21d492c..1ddecaa 100644
--- a/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc
+++ b/chrome/browser/notifications/scheduler/internal/scheduled_notification_manager_unittest.cc
@@ -178,7 +178,11 @@
   EXPECT_FALSE(guid.empty());
 
   // Verify call contract.
-  EXPECT_CALL(*notification_store(), Add(guid, _, _));
+  EXPECT_CALL(*notification_store(), Add(guid, _, _))
+      .WillOnce(Invoke([guid](const std::string&, const NotificationEntry&,
+                              base::OnceCallback<void(bool)> cb) {
+        std::move(cb).Run(true);
+      }));
   manager()->ScheduleNotification(std::move(params));
 
   // Verify in-memory data.
diff --git a/chrome/browser/optimization_guide/OWNERS b/chrome/browser/optimization_guide/OWNERS
new file mode 100644
index 0000000..60c555ff
--- /dev/null
+++ b/chrome/browser/optimization_guide/OWNERS
@@ -0,0 +1,3 @@
+file://components/optimization_guide/OWNERS
+
+# COMPONENT: Blink>Previews
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
new file mode 100644
index 0000000..59ed904
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager.cc
@@ -0,0 +1,184 @@
+// Copyright 2019 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 "chrome/browser/optimization_guide/optimization_guide_hints_manager.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_macros_local.h"
+#include "base/sequenced_task_runner.h"
+#include "base/task/post_task.h"
+#include "base/task_runner_util.h"
+#include "components/optimization_guide/hint_cache.h"
+#include "components/optimization_guide/hint_cache_store.h"
+#include "components/optimization_guide/hints_component_info.h"
+#include "components/optimization_guide/hints_component_util.h"
+#include "components/optimization_guide/hints_processing_util.h"
+#include "components/optimization_guide/optimization_guide_service.h"
+#include "components/optimization_guide/optimization_guide_switches.h"
+#include "components/optimization_guide/proto/hints.pb.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/browser/browser_thread.h"
+
+namespace {
+
+// The component version used with a manual config. This ensures that any hint
+// component received from the OptimizationGuideService on a subsequent startup
+// will have a newer version than it.
+constexpr char kManualConfigComponentVersion[] = "0.0.0";
+
+std::unique_ptr<optimization_guide::HintUpdateData> ProcessHintsComponent(
+    const optimization_guide::HintsComponentInfo& info,
+    std::unique_ptr<optimization_guide::HintUpdateData> update_data) {
+  // TODO(crbug/969558): Add the result here and record the histogram.
+  std::unique_ptr<optimization_guide::proto::Configuration> config =
+      optimization_guide::ProcessHintsComponent(info, /*out_result=*/nullptr);
+  if (!config)
+    return nullptr;
+
+  optimization_guide::ProcessHints(config->mutable_hints(), update_data.get());
+
+  return update_data;
+}
+
+void MaybeRunUpdateClosure(base::OnceClosure update_closure) {
+  if (update_closure)
+    std::move(update_closure).Run();
+}
+
+}  // namespace
+
+OptimizationGuideHintsManager::OptimizationGuideHintsManager(
+    optimization_guide::OptimizationGuideService* optimization_guide_service,
+    const base::FilePath& profile_path,
+    PrefService* pref_service,
+    leveldb_proto::ProtoDatabaseProvider* database_provider)
+    : optimization_guide_service_(optimization_guide_service),
+      background_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::TaskPriority::BEST_EFFORT})),
+      pref_service_(pref_service),
+      hint_cache_(std::make_unique<optimization_guide::HintCache>(
+          std::make_unique<optimization_guide::HintCacheStore>(
+              database_provider,
+              profile_path,
+              pref_service_,
+              background_task_runner_))) {
+  DCHECK(optimization_guide_service_);
+  hint_cache_->Initialize(
+      optimization_guide::switches::ShouldPurgeHintCacheStoreOnStartup(),
+      base::BindOnce(&OptimizationGuideHintsManager::OnHintCacheInitialized,
+                     ui_weak_ptr_factory_.GetWeakPtr()));
+}
+
+OptimizationGuideHintsManager::~OptimizationGuideHintsManager() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  optimization_guide_service_->RemoveObserver(this);
+}
+
+void OptimizationGuideHintsManager::Shutdown() {
+  optimization_guide_service_->RemoveObserver(this);
+}
+
+void OptimizationGuideHintsManager::OnHintsComponentAvailable(
+    const optimization_guide::HintsComponentInfo& info) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  // Check for if hint component is disabled. This check is needed because the
+  // optimization guide still registers with the service as an observer for
+  // components as a signal during testing.
+  if (optimization_guide::switches::IsHintComponentProcessingDisabled()) {
+    MaybeRunUpdateClosure(std::move(next_update_closure_));
+    return;
+  }
+
+  std::unique_ptr<optimization_guide::HintUpdateData> update_data =
+      hint_cache_->MaybeCreateUpdateDataForComponentHints(info.version);
+  if (!update_data) {
+    MaybeRunUpdateClosure(std::move(next_update_closure_));
+    return;
+  }
+
+  // TODO(sophiechang): Check if we are mid-crash loop for processing this hint
+  // version.
+
+  // Processes the hints from the newly available component on a background
+  // thread, providing a HintUpdateData for component update from the hint
+  // cache, so that each hint within the component can be moved into it. In the
+  // case where the component's version is not newer than the hint cache store's
+  // component version, HintUpdateData will be a nullptr and hint
+  // processing will be skipped. After PreviewsHints::Create() returns the newly
+  // created PreviewsHints, it is initialized in UpdateHints() on the UI thread.
+  base::PostTaskAndReplyWithResult(
+      background_task_runner_.get(), FROM_HERE,
+      base::BindOnce(&ProcessHintsComponent, info, std::move(update_data)),
+      base::BindOnce(&OptimizationGuideHintsManager::UpdateComponentHints,
+                     ui_weak_ptr_factory_.GetWeakPtr(),
+                     std::move(next_update_closure_)));
+}
+
+void OptimizationGuideHintsManager::OnHintCacheInitialized() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  // Check if there is a valid hint proto given on the command line first. We
+  // don't normally expect one, but if one is provided then use that and do not
+  // register as an observer as the opt_guide service.
+  std::unique_ptr<optimization_guide::proto::Configuration> manual_config =
+      optimization_guide::switches::ParseComponentConfigFromCommandLine();
+  if (manual_config) {
+    std::unique_ptr<optimization_guide::HintUpdateData> hint_update_data =
+        hint_cache_->MaybeCreateUpdateDataForComponentHints(
+            base::Version(kManualConfigComponentVersion));
+    optimization_guide::ProcessHints(manual_config->mutable_hints(),
+                                     hint_update_data.get());
+    // Allow |UpdateComponentHints| to block startup so that the first
+    // navigation gets the hints when a command line hint proto is provided.
+    UpdateComponentHints(base::DoNothing(), std::move(hint_update_data));
+  }
+
+  // Register as an observer regardless of hint proto override usage. This is
+  // needed as a signal during testing.
+  optimization_guide_service_->AddObserver(this);
+}
+
+void OptimizationGuideHintsManager::UpdateComponentHints(
+    base::OnceClosure update_closure,
+    std::unique_ptr<optimization_guide::HintUpdateData> hint_update_data) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  if (hint_update_data) {
+    hint_cache_->UpdateComponentHints(
+        std::move(hint_update_data),
+        base::BindOnce(&OptimizationGuideHintsManager::OnComponentHintsUpdated,
+                       ui_weak_ptr_factory_.GetWeakPtr(),
+                       std::move(update_closure),
+                       /* hints_updated=*/true));
+  } else {
+    OnComponentHintsUpdated(std::move(update_closure), /*hints_updated=*/false);
+  }
+}
+
+void OptimizationGuideHintsManager::OnComponentHintsUpdated(
+    base::OnceClosure update_closure,
+    bool hints_updated) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+
+  // Record the result of updating the hints. This is used as a signal for the
+  // hints being fully processed in testing.
+  // TODO(sophiechang): Change this back to just a Result suffix once we
+  // have the flag to not record the histogram in Previews.
+  LOCAL_HISTOGRAM_BOOLEAN("OptimizationGuide.UpdateComponentHints.Result2",
+                          hints_updated);
+
+  MaybeRunUpdateClosure(std::move(update_closure));
+}
+
+void OptimizationGuideHintsManager::ListenForNextUpdateForTesting(
+    base::OnceClosure next_update_closure) {
+  DCHECK(!next_update_closure_)
+      << "Only one update closure is supported at a time";
+  next_update_closure_ = std::move(next_update_closure);
+}
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager.h b/chrome/browser/optimization_guide/optimization_guide_hints_manager.h
new file mode 100644
index 0000000..d0e124a7
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager.h
@@ -0,0 +1,93 @@
+// Copyright 2019 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 CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_HINTS_MANAGER_H_
+#define CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_HINTS_MANAGER_H_
+
+#include <memory>
+
+#include "base/callback_forward.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner.h"
+#include "components/optimization_guide/optimization_guide_service_observer.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace leveldb_proto {
+class ProtoDatabaseProvider;
+}  // namespace leveldb_proto
+
+namespace optimization_guide {
+class HintCache;
+class HintUpdateData;
+struct HintsComponentInfo;
+class OptimizationGuideService;
+}  // namespace optimization_guide
+
+class PrefService;
+
+class OptimizationGuideHintsManager
+    : public optimization_guide::OptimizationGuideServiceObserver {
+ public:
+  OptimizationGuideHintsManager(
+      optimization_guide::OptimizationGuideService* optimization_guide_service,
+      const base::FilePath& profile_path,
+      PrefService* pref_service,
+      leveldb_proto::ProtoDatabaseProvider* database_provider);
+
+  ~OptimizationGuideHintsManager() override;
+
+  // Unhooks the observer to |optimization_guide_service_|.
+  void Shutdown();
+
+  // optimization_guide::OptimizationGuideServiceObserver implementation:
+  void OnHintsComponentAvailable(
+      const optimization_guide::HintsComponentInfo& info) override;
+
+  // |next_update_closure| is called the next time OnHintsComponentAvailable()
+  // is called and the corresponding hints have been updated.
+  void ListenForNextUpdateForTesting(base::OnceClosure next_update_closure);
+
+ private:
+  // Callback run after the hint cache is fully initialized. At this point, the
+  // OptimizationGuideHintsManager is ready to process hints.
+  void OnHintCacheInitialized();
+
+  // Updates the cache with the latest hints sent by the Component Updater.
+  void UpdateComponentHints(
+      base::OnceClosure update_closure,
+      std::unique_ptr<optimization_guide::HintUpdateData> hint_update_data);
+
+  // Called when the hints have been fully updated with the latest hints from
+  // the Component Updater. This is used as a signal during tests.
+  void OnComponentHintsUpdated(base::OnceClosure update_closure,
+                               bool hints_updated);
+
+  // The OptimizationGuideService that this guide is listening to. Not owned.
+  optimization_guide::OptimizationGuideService* const
+      optimization_guide_service_;
+
+  // Background thread where hints processing should be performed.
+  scoped_refptr<base::SequencedTaskRunner> background_task_runner_;
+
+  // A reference to the PrefService for this profile. Not owned.
+  PrefService* pref_service_ = nullptr;
+
+  // The hint cache that holds both hints received from the component and
+  // fetched from the remote Optimization Guide Service.
+  std::unique_ptr<optimization_guide::HintCache> hint_cache_;
+
+  // Used in testing to subscribe to an update event in this class.
+  base::OnceClosure next_update_closure_;
+
+  // Used to get |weak_ptr_| to self on the UI thread.
+  base::WeakPtrFactory<OptimizationGuideHintsManager> ui_weak_ptr_factory_{
+      this};
+
+  DISALLOW_COPY_AND_ASSIGN(OptimizationGuideHintsManager);
+};
+
+#endif  // CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_HINTS_MANAGER_H_
diff --git a/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
new file mode 100644
index 0000000..dd183ee
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_hints_manager_unittest.cc
@@ -0,0 +1,323 @@
+// Copyright 2019 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 "chrome/browser/optimization_guide/optimization_guide_hints_manager.h"
+
+#include <string>
+
+#include "base/base64.h"
+#include "base/command_line.h"
+#include "base/files/file_util.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "components/optimization_guide/optimization_guide_prefs.h"
+#include "components/optimization_guide/optimization_guide_service.h"
+#include "components/optimization_guide/optimization_guide_switches.h"
+#include "components/optimization_guide/proto/hints.pb.h"
+#include "components/optimization_guide/proto_database_provider_test_base.h"
+#include "components/prefs/testing_pref_service.h"
+#include "content/public/test/test_browser_thread_bundle.h"
+
+class TestOptimizationGuideService
+    : public optimization_guide::OptimizationGuideService {
+ public:
+  explicit TestOptimizationGuideService(
+      const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner)
+      : OptimizationGuideService(ui_task_runner) {}
+
+  ~TestOptimizationGuideService() override = default;
+
+  void AddObserver(
+      optimization_guide::OptimizationGuideServiceObserver* observer) override {
+    add_observer_called_ = true;
+  }
+
+  void RemoveObserver(
+      optimization_guide::OptimizationGuideServiceObserver* observer) override {
+    remove_observer_called_ = true;
+  }
+
+  bool AddObserverCalled() const { return add_observer_called_; }
+  bool RemoveObserverCalled() const { return remove_observer_called_; }
+
+ private:
+  bool add_observer_called_ = false;
+  bool remove_observer_called_ = false;
+};
+
+class OptimizationGuideHintsManagerTest
+    : public optimization_guide::ProtoDatabaseProviderTestBase {
+ public:
+  OptimizationGuideHintsManagerTest() = default;
+  ~OptimizationGuideHintsManagerTest() override = default;
+
+  void SetUp() override {
+    optimization_guide::ProtoDatabaseProviderTestBase::SetUp();
+    CreateServiceAndHintsManager();
+  }
+
+  void TearDown() override {
+    optimization_guide::ProtoDatabaseProviderTestBase::TearDown();
+    ResetHintsManager();
+  }
+
+  void CreateServiceAndHintsManager() {
+    if (hints_manager_) {
+      ResetHintsManager();
+    }
+    optimization_guide_service_ =
+        std::make_unique<TestOptimizationGuideService>(
+            browser_thread_bundle_.GetMainThreadTaskRunner());
+    pref_service_ = std::make_unique<TestingPrefServiceSimple>();
+    optimization_guide::prefs::RegisterProfilePrefs(pref_service_->registry());
+
+    hints_manager_ = std::make_unique<OptimizationGuideHintsManager>(
+        optimization_guide_service_.get(), temp_dir(), pref_service_.get(),
+        db_provider_.get());
+
+    // Add observer is called after the HintCache is fully initialized,
+    // indicating that the OptimizationGuideHintsManager is ready to process
+    // hints.
+    while (!optimization_guide_service_->AddObserverCalled()) {
+      RunUntilIdle();
+    }
+  }
+
+  void ResetHintsManager() {
+    hints_manager_.reset();
+    RunUntilIdle();
+  }
+
+  void ProcessInvalidHintsComponentInfo(const std::string& version) {
+    optimization_guide::HintsComponentInfo info(
+        base::Version(version),
+        temp_dir().Append(FILE_PATH_LITERAL("notaconfigfile")));
+
+    base::RunLoop run_loop;
+    hints_manager_->ListenForNextUpdateForTesting(run_loop.QuitClosure());
+    hints_manager_->OnHintsComponentAvailable(info);
+    run_loop.Run();
+  }
+
+  void ProcessHints(const optimization_guide::proto::Configuration& config,
+                    const std::string& version) {
+    optimization_guide::HintsComponentInfo info(
+        base::Version(version),
+        temp_dir().Append(FILE_PATH_LITERAL("somefile.pb")));
+    ASSERT_NO_FATAL_FAILURE(WriteConfigToFile(config, info.path));
+
+    base::RunLoop run_loop;
+    hints_manager_->ListenForNextUpdateForTesting(run_loop.QuitClosure());
+    hints_manager_->OnHintsComponentAvailable(info);
+    run_loop.Run();
+  }
+
+  void InitializeWithDefaultConfig(const std::string& version) {
+    optimization_guide::proto::Configuration config;
+    optimization_guide::proto::Hint* hint1 = config.add_hints();
+    hint1->set_key("somedomain.org");
+    hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+    hint1->set_version("someversion");
+    optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
+    page_hint1->set_page_pattern("/news/");
+    optimization_guide::proto::Optimization* optimization1 =
+        page_hint1->add_whitelisted_optimizations();
+    optimization1->set_optimization_type(
+        optimization_guide::proto::RESOURCE_LOADING);
+    optimization_guide::proto::ResourceLoadingHint* resource_loading_hint1 =
+        optimization1->add_resource_loading_hints();
+    resource_loading_hint1->set_loading_optimization_type(
+        optimization_guide::proto::LOADING_BLOCK_RESOURCE);
+    resource_loading_hint1->set_resource_pattern("news_cruft.js");
+
+    ProcessHints(config, version);
+  }
+
+  base::FilePath temp_dir() const { return temp_dir_.GetPath(); }
+
+  TestingPrefServiceSimple* pref_service() { return pref_service_.get(); }
+
+ protected:
+  void RunUntilIdle() {
+    browser_thread_bundle_.RunUntilIdle();
+    base::RunLoop().RunUntilIdle();
+  }
+
+ private:
+  void WriteConfigToFile(const optimization_guide::proto::Configuration& config,
+                         const base::FilePath& filePath) {
+    std::string serialized_config;
+    ASSERT_TRUE(config.SerializeToString(&serialized_config));
+    ASSERT_EQ(static_cast<int32_t>(serialized_config.size()),
+              base::WriteFile(filePath, serialized_config.data(),
+                              serialized_config.size()));
+  }
+
+  content::TestBrowserThreadBundle browser_thread_bundle_;
+
+  std::unique_ptr<OptimizationGuideHintsManager> hints_manager_;
+  std::unique_ptr<TestOptimizationGuideService> optimization_guide_service_;
+  std::unique_ptr<TestingPrefServiceSimple> pref_service_;
+
+  DISALLOW_COPY_AND_ASSIGN(OptimizationGuideHintsManagerTest);
+};
+
+TEST_F(OptimizationGuideHintsManagerTest,
+       ProcessHintsWithValidCommandLineOverride) {
+  base::HistogramTester histogram_tester;
+
+  optimization_guide::proto::Configuration config;
+  optimization_guide::proto::Hint* hint = config.add_hints();
+  hint->set_key("somedomain.org");
+  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
+  page_hint->set_page_pattern("noscript_default_2g");
+  optimization_guide::proto::Optimization* optimization =
+      page_hint->add_whitelisted_optimizations();
+  optimization->set_optimization_type(optimization_guide::proto::NOSCRIPT);
+
+  std::string encoded_config;
+  config.SerializeToString(&encoded_config);
+  base::Base64Encode(encoded_config, &encoded_config);
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+      optimization_guide::switches::kHintsProtoOverride, encoded_config);
+  CreateServiceAndHintsManager();
+
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+}
+
+TEST_F(OptimizationGuideHintsManagerTest,
+       ProcessHintsWithInvalidCommandLineOverride) {
+  base::HistogramTester histogram_tester;
+
+  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+      optimization_guide::switches::kHintsProtoOverride, "this-is-not-a-proto");
+  CreateServiceAndHintsManager();
+
+  // If the proto was invalid, we do not expect it to go through with the
+  // process of updating hints.
+  histogram_tester.ExpectTotalCount(
+      "OptimizationGuide.UpdateComponentHints.Result2", 0);
+}
+
+TEST_F(OptimizationGuideHintsManagerTest,
+       ProcessHintsWithCommandLineOverrideShouldNotBeOverriddenByNewComponent) {
+  optimization_guide::proto::Configuration config;
+  optimization_guide::proto::Hint* hint = config.add_hints();
+  hint->set_key("somedomain.org");
+  hint->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
+  page_hint->set_page_pattern("noscript_default_2g");
+  optimization_guide::proto::Optimization* optimization =
+      page_hint->add_whitelisted_optimizations();
+  optimization->set_optimization_type(optimization_guide::proto::NOSCRIPT);
+
+  std::string encoded_config;
+  config.SerializeToString(&encoded_config);
+  base::Base64Encode(encoded_config, &encoded_config);
+
+  {
+    base::HistogramTester histogram_tester;
+    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+        optimization_guide::switches::kHintsProtoOverride, encoded_config);
+    CreateServiceAndHintsManager();
+    histogram_tester.ExpectUniqueSample(
+        "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+  }
+
+  // Test that a new component coming in does not update the component hints.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig("3.0.0.0");
+    histogram_tester.ExpectTotalCount(
+        "OptimizationGuide.UpdateComponentHints.Result2", 0);
+  }
+}
+
+TEST_F(OptimizationGuideHintsManagerTest, ParseTwoConfigVersions) {
+  optimization_guide::proto::Configuration config;
+  optimization_guide::proto::Hint* hint1 = config.add_hints();
+  hint1->set_key("somedomain.org");
+  hint1->set_key_representation(optimization_guide::proto::HOST_SUFFIX);
+  hint1->set_version("someversion");
+  optimization_guide::proto::PageHint* page_hint1 = hint1->add_page_hints();
+  page_hint1->set_page_pattern("/news/");
+  optimization_guide::proto::Optimization* optimization1 =
+      page_hint1->add_whitelisted_optimizations();
+  optimization1->set_optimization_type(
+      optimization_guide::proto::RESOURCE_LOADING);
+  optimization_guide::proto::ResourceLoadingHint* resource_loading_hint1 =
+      optimization1->add_resource_loading_hints();
+  resource_loading_hint1->set_loading_optimization_type(
+      optimization_guide::proto::LOADING_BLOCK_RESOURCE);
+  resource_loading_hint1->set_resource_pattern("news_cruft.js");
+
+  // Test the first time parsing the config.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig("1.0.0.0");
+    histogram_tester.ExpectUniqueSample(
+        "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+  }
+
+  // Test the second time parsing the config. This should also update the hints.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig("2.0.0.0");
+    histogram_tester.ExpectUniqueSample(
+        "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+  }
+}
+
+TEST_F(OptimizationGuideHintsManagerTest, ParseOlderConfigVersions) {
+  // Test the first time parsing the config.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig("10.0.0.0");
+    histogram_tester.ExpectUniqueSample(
+        "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+  }
+
+  // Test the second time parsing the config. This will be treated by the cache
+  // as an older version.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig("2.0.0.0");
+    // If we have already parsed a version later than this version, we expect
+    // for the hints to not be updated.
+    histogram_tester.ExpectTotalCount(
+        "OptimizationGuide.UpdateComponentHints.Result2", 0);
+  }
+}
+
+TEST_F(OptimizationGuideHintsManagerTest, ParseDuplicateConfigVersions) {
+  const std::string version = "3.0.0.0";
+
+  // Test the first time parsing the config.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig(version);
+    histogram_tester.ExpectUniqueSample(
+        "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+  }
+
+  // Test the second time parsing the config. This will be treated by the cache
+  // as a duplicate version.
+  {
+    base::HistogramTester histogram_tester;
+    InitializeWithDefaultConfig(version);
+    // If we have already parsed this version, then we do not expect to update
+    // the hints.
+    histogram_tester.ExpectTotalCount(
+        "OptimizationGuide.UpdateComponentHints.Result2", 0);
+  }
+}
+
+TEST_F(OptimizationGuideHintsManagerTest, ComponentInfoDidNotContainConfig) {
+  base::HistogramTester histogram_tester;
+  ProcessInvalidHintsComponentInfo("1.0.0.0");
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.UpdateComponentHints.Result2", false, 1);
+}
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
new file mode 100644
index 0000000..2484396
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -0,0 +1,44 @@
+// Copyright 2019 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 "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
+
+#include "base/files/file_path.h"
+#include "chrome/browser/optimization_guide/optimization_guide_hints_manager.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/optimization_guide/optimization_guide_service.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/browser_thread.h"
+
+OptimizationGuideKeyedService::OptimizationGuideKeyedService(
+    content::BrowserContext* browser_context)
+    : browser_context_(browser_context) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(!browser_context_->IsOffTheRecord());
+}
+
+OptimizationGuideKeyedService::~OptimizationGuideKeyedService() {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+}
+
+void OptimizationGuideKeyedService::Initialize(
+    optimization_guide::OptimizationGuideService* optimization_guide_service,
+    leveldb_proto::ProtoDatabaseProvider* database_provider,
+    const base::FilePath& profile_path) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  DCHECK(optimization_guide_service);
+
+  hints_manager_ = std::make_unique<OptimizationGuideHintsManager>(
+      optimization_guide_service, profile_path,
+      Profile::FromBrowserContext(browser_context_)->GetPrefs(),
+      database_provider);
+}
+
+void OptimizationGuideKeyedService::Shutdown() {
+  if (hints_manager_) {
+    hints_manager_->Shutdown();
+    hints_manager_ = nullptr;
+  }
+}
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
new file mode 100644
index 0000000..aed9b03
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
@@ -0,0 +1,60 @@
+// Copyright 2019 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 CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_KEYED_SERVICE_H_
+#define CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_KEYED_SERVICE_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+namespace base {
+class FilePath;
+}  // namespace base
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+namespace leveldb_proto {
+class ProtoDatabaseProvider;
+}  // namespace leveldb_proto
+
+namespace optimization_guide {
+class OptimizationGuideService;
+}  // namespace optimization_guide
+
+class OptimizationGuideHintsManager;
+
+class OptimizationGuideKeyedService : public KeyedService {
+ public:
+  explicit OptimizationGuideKeyedService(
+      content::BrowserContext* browser_context);
+  ~OptimizationGuideKeyedService() override;
+
+  // Initializes the service. |optimization_guide_service| is the
+  // Optimization Guide Service that is being listened to and is guaranteed to
+  // outlive |this|. |profile_path| is the path to user data on disk.
+  void Initialize(
+      optimization_guide::OptimizationGuideService* optimization_guide_service,
+      leveldb_proto::ProtoDatabaseProvider* database_provider,
+      const base::FilePath& profile_path);
+
+  OptimizationGuideHintsManager* GetHintsManager() {
+    return hints_manager_.get();
+  }
+
+  // KeyedService implementation.
+  void Shutdown() override;
+
+ private:
+  std::unique_ptr<OptimizationGuideHintsManager> hints_manager_;
+
+  content::BrowserContext* browser_context_;
+
+  DISALLOW_COPY_AND_ASSIGN(OptimizationGuideKeyedService);
+};
+
+#endif  // CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_KEYED_SERVICE_H_
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service_browsertest.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service_browsertest.cc
new file mode 100644
index 0000000..501b8f6b
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service_browsertest.cc
@@ -0,0 +1,90 @@
+// Copyright 2019 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 "base/run_loop.h"
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/optimization_guide/optimization_guide_hints_manager.h"
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "components/optimization_guide/optimization_guide_features.h"
+#include "components/optimization_guide/proto/hints.pb.h"
+#include "components/optimization_guide/test_hints_component_creator.h"
+#include "content/public/test/browser_test_utils.h"
+
+using OptimizationGuideKeyedServiceDisabledBrowserTest = InProcessBrowserTest;
+
+IN_PROC_BROWSER_TEST_F(OptimizationGuideKeyedServiceDisabledBrowserTest,
+                       KeyedServiceNotEnabledButOptimizationHintsEnabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {optimization_guide::features::kOptimizationHints},
+      {optimization_guide::features::kOptimizationGuideKeyedService});
+
+  EXPECT_EQ(nullptr, OptimizationGuideKeyedServiceFactory::GetForProfile(
+                         browser()->profile()));
+}
+
+IN_PROC_BROWSER_TEST_F(OptimizationGuideKeyedServiceDisabledBrowserTest,
+                       KeyedServiceEnabledButOptimizationHintsDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {optimization_guide::features::kOptimizationGuideKeyedService},
+      {optimization_guide::features::kOptimizationHints});
+
+  EXPECT_EQ(nullptr, OptimizationGuideKeyedServiceFactory::GetForProfile(
+                         browser()->profile()));
+}
+
+class OptimizationGuideKeyedServiceBrowserTest
+    : public OptimizationGuideKeyedServiceDisabledBrowserTest {
+ public:
+  OptimizationGuideKeyedServiceBrowserTest() = default;
+  ~OptimizationGuideKeyedServiceBrowserTest() override = default;
+
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        {optimization_guide::features::kOptimizationHints,
+         optimization_guide::features::kOptimizationGuideKeyedService},
+        {});
+    OptimizationGuideKeyedServiceDisabledBrowserTest::SetUp();
+  }
+
+  void PushHintsComponentAndWaitForCompletion() {
+    base::RunLoop run_loop;
+    OptimizationGuideKeyedServiceFactory::GetForProfile(browser()->profile())
+        ->GetHintsManager()
+        ->ListenForNextUpdateForTesting(run_loop.QuitClosure());
+
+    const optimization_guide::HintsComponentInfo& component_info =
+        test_hints_component_creator_.CreateHintsComponentInfoWithPageHints(
+            optimization_guide::proto::NOSCRIPT, {"somehost.com"}, "*", {});
+
+    g_browser_process->optimization_guide_service()->MaybeUpdateHintsComponent(
+        component_info);
+
+    run_loop.Run();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+  optimization_guide::testing::TestHintsComponentCreator
+      test_hints_component_creator_;
+
+  DISALLOW_COPY_AND_ASSIGN(OptimizationGuideKeyedServiceBrowserTest);
+};
+
+IN_PROC_BROWSER_TEST_F(OptimizationGuideKeyedServiceBrowserTest,
+                       VerifyHintsReceivedWhenPushed) {
+  base::HistogramTester histogram_tester;
+
+  PushHintsComponentAndWaitForCompletion();
+
+  histogram_tester.ExpectUniqueSample(
+      "OptimizationGuide.UpdateComponentHints.Result2", true, 1);
+}
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.cc
new file mode 100644
index 0000000..88f99ee
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.cc
@@ -0,0 +1,42 @@
+// Copyright 2019 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 "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
+
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/content/browser_context_dependency_manager.h"
+#include "components/optimization_guide/optimization_guide_features.h"
+#include "content/public/browser/browser_context.h"
+
+// static
+OptimizationGuideKeyedService*
+OptimizationGuideKeyedServiceFactory::GetForProfile(Profile* profile) {
+  if (optimization_guide::features::IsOptimizationHintsEnabled() &&
+      optimization_guide::features::IsOptimizationGuideKeyedServiceEnabled()) {
+    return static_cast<OptimizationGuideKeyedService*>(
+        GetInstance()->GetServiceForBrowserContext(profile, true));
+  }
+  return nullptr;
+}
+
+// static
+OptimizationGuideKeyedServiceFactory*
+OptimizationGuideKeyedServiceFactory::GetInstance() {
+  static base::NoDestructor<OptimizationGuideKeyedServiceFactory> factory;
+  return factory.get();
+}
+
+OptimizationGuideKeyedServiceFactory::OptimizationGuideKeyedServiceFactory()
+    : BrowserContextKeyedServiceFactory(
+          "OptimizationGuideKeyedService",
+          BrowserContextDependencyManager::GetInstance()) {}
+
+OptimizationGuideKeyedServiceFactory::~OptimizationGuideKeyedServiceFactory() =
+    default;
+
+KeyedService* OptimizationGuideKeyedServiceFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  return new OptimizationGuideKeyedService(context);
+}
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h b/chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h
new file mode 100644
index 0000000..1a8435a5
--- /dev/null
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h
@@ -0,0 +1,46 @@
+// Copyright 2019 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 CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_KEYED_SERVICE_FACTORY_H_
+#define CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_KEYED_SERVICE_FACTORY_H_
+
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
+
+namespace content {
+class BrowserContext;
+}  // namespace content
+
+class OptimizationGuideKeyedService;
+class Profile;
+
+// LazyInstance that owns all OptimizationGuideKeyedServices and associates them
+// with Profiles.
+class OptimizationGuideKeyedServiceFactory
+    : public BrowserContextKeyedServiceFactory {
+ public:
+  // Gets the OptimizationGuideKeyedService for the profile.
+  //
+  // Returns null if the features that allow for this to provide useful
+  // information are disabled.
+  static OptimizationGuideKeyedService* GetForProfile(Profile* profile);
+
+  // Gets the LazyInstance that owns all OptimizationGuideKeyedService(s).
+  static OptimizationGuideKeyedServiceFactory* GetInstance();
+
+ private:
+  friend base::NoDestructor<OptimizationGuideKeyedServiceFactory>;
+
+  OptimizationGuideKeyedServiceFactory();
+  ~OptimizationGuideKeyedServiceFactory() override;
+
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+
+  DISALLOW_COPY_AND_ASSIGN(OptimizationGuideKeyedServiceFactory);
+};
+
+#endif  // CHROME_BROWSER_OPTIMIZATION_GUIDE_OPTIMIZATION_GUIDE_KEYED_SERVICE_FACTORY_H_
diff --git a/chrome/browser/predictors/loading_test_util.cc b/chrome/browser/predictors/loading_test_util.cc
index ab0ec9af..4cb41ef 100644
--- a/chrome/browser/predictors/loading_test_util.cc
+++ b/chrome/browser/predictors/loading_test_util.cc
@@ -37,6 +37,7 @@
                             int consecutive_misses) {
   redirect->set_url(url.host());
   redirect->set_url_scheme(url.scheme());
+  redirect->set_url_port(url.EffectiveIntPort());
   redirect->set_number_of_hits(number_of_hits);
   redirect->set_number_of_misses(number_of_misses);
   redirect->set_consecutive_misses(consecutive_misses);
@@ -170,8 +171,9 @@
 
 std::ostream& operator<<(std::ostream& os, const RedirectStat& redirect) {
   return os << "[" << redirect.url() << "," << redirect.url_scheme() << ","
-            << redirect.number_of_hits() << "," << redirect.number_of_misses()
-            << "," << redirect.consecutive_misses() << "]";
+            << redirect.url_port() << "," << redirect.number_of_hits() << ","
+            << redirect.number_of_misses() << ","
+            << redirect.consecutive_misses() << "]";
 }
 
 std::ostream& operator<<(std::ostream& os, const OriginData& data) {
@@ -239,6 +241,7 @@
 
 bool operator==(const RedirectStat& lhs, const RedirectStat& rhs) {
   return lhs.url() == rhs.url() && lhs.url_scheme() == rhs.url_scheme() &&
+         lhs.url_port() == rhs.url_port() &&
          lhs.number_of_hits() == rhs.number_of_hits() &&
          lhs.number_of_misses() == rhs.number_of_misses() &&
          lhs.consecutive_misses() == rhs.consecutive_misses();
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc
index ef3b4e7..47716f95 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor.cc
@@ -296,6 +296,7 @@
                                               const GURL& final_redirect,
                                               RedirectDataMap* redirect_data) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   // If the primary key is too long reject it.
   if (key.length() > ResourcePrefetchPredictorTables::kMaxStringLength)
     return;
@@ -309,6 +310,7 @@
     redirect_to_add->set_url(final_redirect.host());
     redirect_to_add->set_number_of_hits(1);
     redirect_to_add->set_url_scheme(final_redirect.scheme());
+    redirect_to_add->set_url_port(final_redirect.EffectiveIntPort());
   } else {
     data.set_last_visit_time(base::Time::Now().ToInternalValue());
 
@@ -325,15 +327,26 @@
           !redirect.url_scheme().empty() &&
           redirect.url_scheme() != final_redirect.scheme();
 
-      if (!host_mismatch && !url_scheme_mismatch) {
+      // When the existing port in database is empty, then difference in
+      // ports is not considered a mismatch. This case is treated
+      // specially since port was added later to the database, and previous
+      // entries would have empty value. In such case, we simply update the port
+      // in the database.
+      const bool url_port_mismatch =
+          redirect.has_url_port() &&
+          redirect.url_port() != final_redirect.EffectiveIntPort();
+
+      if (!host_mismatch && !url_scheme_mismatch && !url_port_mismatch) {
         // No mismatch.
         need_to_add = false;
         redirect.set_number_of_hits(redirect.number_of_hits() + 1);
         redirect.set_consecutive_misses(0);
 
-        // If existing scheme in database is empty, then update it.
+        // If existing scheme or port in database are empty, then update them.
         if (redirect.url_scheme().empty())
           redirect.set_url_scheme(final_redirect.scheme());
+        if (!redirect.has_url_port())
+          redirect.set_url_port(final_redirect.EffectiveIntPort());
       } else {
         // A real mismatch.
         redirect.set_number_of_misses(redirect.number_of_misses() + 1);
@@ -346,6 +359,7 @@
       redirect_to_add->set_url(final_redirect.host());
       redirect_to_add->set_number_of_hits(1);
       redirect_to_add->set_url_scheme(final_redirect.scheme());
+      redirect_to_add->set_url_port(final_redirect.EffectiveIntPort());
     }
   }
 
diff --git a/chrome/browser/predictors/resource_prefetch_predictor.proto b/chrome/browser/predictors/resource_prefetch_predictor.proto
index 2181648..a74b0c1 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.proto
+++ b/chrome/browser/predictors/resource_prefetch_predictor.proto
@@ -27,6 +27,10 @@
   // in M-77 without wiping the database. As such, it may be empty in some
   // cases even when originally |url| had a non-empty scheme.
   optional string url_scheme = 5;
+  // |url_port| field was added in M-77 without wiping the database. As such,
+  // it may be empty in some cases even when originally |url| had a non-empty
+  // port number.
+  optional int32 url_port = 6;
 }
 
 // Represents a mapping from URL or host to a list of redirect endpoints.
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc b/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc
index f84761fb..6d62825 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #include "base/sequenced_task_runner.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/browser/predictors/loading_test_util.h"
@@ -302,7 +303,8 @@
 
 std::string ResourcePrefetchPredictorTablesTest::GetKeyForRedirectStat(
     const RedirectStat& stat) const {
-  return stat.url() + "," + stat.url_scheme();
+  return stat.url() + "," + stat.url_scheme() + "," +
+         base::NumberToString(stat.url_port());
 }
 
 void ResourcePrefetchPredictorTablesTest::DeleteAllData() {
diff --git a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
index a6e00f2..724bd8a6 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor_unittest.cc
@@ -535,6 +535,10 @@
                            .data_[host_redirect_data_https.primary_key()]
                            .redirect_endpoints(0)
                            .url_scheme());
+    EXPECT_EQ(443, mock_tables_->host_redirect_table_
+                       .data_[host_redirect_data_https.primary_key()]
+                       .redirect_endpoints(0)
+                       .url_port());
   }
   {
     std::vector<content::mojom::ResourceLoadInfoPtr> resources_http;
@@ -569,6 +573,10 @@
                           .data_[host_redirect_data_http.primary_key()]
                           .redirect_endpoints(1)
                           .url_scheme());
+    EXPECT_EQ(80, mock_tables_->host_redirect_table_
+                      .data_[host_redirect_data_http.primary_key()]
+                      .redirect_endpoints(1)
+                      .url_port());
   }
 }
 
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index b8063150..dcb7b54 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 
-#include "base/metrics/histogram_macros.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "chrome/browser/about_flags.h"
@@ -694,7 +693,6 @@
 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry,
                           const std::string& locale) {
   TRACE_EVENT0("browser", "chrome::RegisterProfilePrefs");
-  SCOPED_UMA_HISTOGRAM_TIMER("Settings.RegisterProfilePrefsTime");
   // User prefs. Please keep this list alphabetized.
   AccessibilityLabelsService::RegisterProfilePrefs(registry);
   AccessibilityUIMessageHandler::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/prefs/chrome_pref_service_factory.cc b/chrome/browser/prefs/chrome_pref_service_factory.cc
index 95d2de3..5e83325 100644
--- a/chrome/browser/prefs/chrome_pref_service_factory.cc
+++ b/chrome/browser/prefs/chrome_pref_service_factory.cc
@@ -432,7 +432,6 @@
     scoped_refptr<base::SequencedTaskRunner> io_task_runner,
     std::unique_ptr<PrefValueStore::Delegate> delegate) {
   TRACE_EVENT0("browser", "chrome_prefs::CreateProfilePrefs");
-  SCOPED_UMA_HISTOGRAM_TIMER("PrefService.CreateProfilePrefsTime");
 
   prefs::mojom::ResetOnLoadObserverPtr reset_on_load_observer;
   mojo::MakeStrongBinding(
diff --git a/chrome/browser/prerender/external_prerender_handler_android.cc b/chrome/browser/prerender/external_prerender_handler_android.cc
index e757eaf..70ce3b05 100644
--- a/chrome/browser/prerender/external_prerender_handler_android.cc
+++ b/chrome/browser/prerender/external_prerender_handler_android.cc
@@ -53,7 +53,6 @@
 base::android::ScopedJavaLocalRef<jobject>
 ExternalPrerenderHandlerAndroid::AddPrerender(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& jprofile,
     const JavaParamRef<jobject>& jweb_contents,
     const JavaParamRef<jstring>& jurl,
@@ -108,9 +107,7 @@
   }
 }
 
-void ExternalPrerenderHandlerAndroid::CancelCurrentPrerender(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& object) {
+void ExternalPrerenderHandlerAndroid::CancelCurrentPrerender(JNIEnv* env) {
   if (!prerender_handle_)
     return;
 
diff --git a/chrome/browser/prerender/external_prerender_handler_android.h b/chrome/browser/prerender/external_prerender_handler_android.h
index f2e8b723..c70218f8 100644
--- a/chrome/browser/prerender/external_prerender_handler_android.h
+++ b/chrome/browser/prerender/external_prerender_handler_android.h
@@ -29,7 +29,6 @@
   // the given profile. This is restricted to a single prerender at a time.
   base::android::ScopedJavaLocalRef<jobject> AddPrerender(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& profile,
       const base::android::JavaParamRef<jobject>& jweb_contents,
       const base::android::JavaParamRef<jstring>& url,
@@ -41,9 +40,7 @@
       jboolean forced_prerender);
 
   // Cancel the prerender associated with the prerender_handle_
-  void CancelCurrentPrerender(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& object);
+  void CancelCurrentPrerender(JNIEnv* env);
 
   // Whether the PrerenderManager associated with the given profile has any
   // prerenders for the url.
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 084648e..c6f83e51 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -22,7 +22,6 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/memory/weak_ptr.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
@@ -629,7 +628,6 @@
 
 void ProfileImpl::DoFinalInit() {
   TRACE_EVENT0("browser", "ProfileImpl::DoFinalInit")
-  SCOPED_UMA_HISTOGRAM_TIMER("Profile.ProfileImplDoFinalInit");
 
   PrefService* prefs = GetPrefs();
   pref_change_registrar_.Init(prefs);
@@ -756,12 +754,9 @@
   // initialized.
   SharingServiceFactory::GetForBrowserContext(this);
 
-  {
-    SCOPED_UMA_HISTOGRAM_TIMER("Profile.NotifyProfileCreatedTime");
-    content::NotificationService::current()->Notify(
-        chrome::NOTIFICATION_PROFILE_CREATED, content::Source<Profile>(this),
-        content::NotificationService::NoDetails());
-  }
+  content::NotificationService::current()->Notify(
+      chrome::NOTIFICATION_PROFILE_CREATED, content::Source<Profile>(this),
+      content::NotificationService::NoDetails());
 }
 
 base::FilePath ProfileImpl::last_selected_directory() {
@@ -947,7 +942,6 @@
 
 void ProfileImpl::OnLocaleReady() {
   TRACE_EVENT0("browser", "ProfileImpl::OnLocaleReady");
-  SCOPED_UMA_HISTOGRAM_TIMER("Profile.OnLocaleReadyTime");
   // Migrate obsolete prefs.
   if (g_browser_process->local_state())
     MigrateObsoleteBrowserPrefs(this, g_browser_process->local_state());
@@ -985,11 +979,8 @@
 
   FullBrowserTransitionManager::Get()->OnProfileCreated(this);
 
-  {
-    SCOPED_UMA_HISTOGRAM_TIMER("Profile.CreateBrowserContextServicesTime");
-    BrowserContextDependencyManager::GetInstance()
-        ->CreateBrowserContextServices(this);
-  }
+  BrowserContextDependencyManager::GetInstance()->CreateBrowserContextServices(
+      this);
 
   ChromeVersionService::OnProfileLoaded(prefs_.get(), IsNewProfile());
   DoFinalInit();
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index bd27157..0b2c3233 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -41,6 +41,8 @@
 #include "chrome/browser/data_reduction_proxy/data_reduction_proxy_chrome_settings_factory.h"
 #include "chrome/browser/download/download_core_service.h"
 #include "chrome/browser/download/download_core_service_factory.h"
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
+#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/password_manager/password_store_factory.h"
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/previews/previews_service.h"
@@ -1262,6 +1264,16 @@
       leveldb_proto::ProtoDatabaseProviderFactory::GetInstance()->GetForKey(
           profile->GetProfileKey());
 
+  // Creates the Optimization Guide Keyed Service and begins loading the
+  // hint cache from persistent memory.
+  auto* optimization_guide_keyed_service =
+      OptimizationGuideKeyedServiceFactory::GetForProfile(profile);
+  if (optimization_guide_keyed_service) {
+    optimization_guide_keyed_service->Initialize(
+        g_browser_process->optimization_guide_service(), proto_db_provider,
+        profile->GetPath());
+  }
+
   // Create the Previews Service and begin loading opt out history from
   // persistent memory.
   PreviewsServiceFactory::GetForProfile(profile)->Initialize(
@@ -1314,7 +1326,6 @@
 
 Profile* ProfileManager::CreateProfileHelper(const base::FilePath& path) {
   TRACE_EVENT0("browser", "ProfileManager::CreateProfileHelper");
-  SCOPED_UMA_HISTOGRAM_TIMER("Profile.CreateProfileHelperTime");
 
   return Profile::CreateProfile(path, NULL, Profile::CREATE_MODE_SYNCHRONOUS)
       .release();
@@ -1396,7 +1407,6 @@
 Profile* ProfileManager::CreateAndInitializeProfile(
     const base::FilePath& profile_dir) {
   TRACE_EVENT0("browser", "ProfileManager::CreateAndInitializeProfile");
-  SCOPED_UMA_HISTOGRAM_LONG_TIMER("Profile.CreateAndInitializeProfile");
 
   // CHECK that we are not trying to load the same profile twice, to prevent
   // profile corruption. Note that this check also covers the case when we have
diff --git a/chrome/browser/resources/bluetooth_internals/BUILD.gn b/chrome/browser/resources/bluetooth_internals/BUILD.gn
index 88abbb1..7ab5c80 100644
--- a/chrome/browser/resources/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/resources/bluetooth_internals/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/grit/grit_rule.gni")
 
 js_type_check("closure_compile") {
   deps = [
@@ -41,3 +42,25 @@
     "//ui/webui/resources/js/cr/ui/page_manager:page_manager",
   ]
 }
+
+grit("resources") {
+  source = "resources.grd"
+
+  # The .grd contains references to generated files.
+  source_is_generated = true
+  outputs = [
+    "grit/bluetooth_internals_resources.h",
+    "grit/bluetooth_internals_resources_map.h",
+    "grit/bluetooth_internals_resources_map.cc",
+    "bluetooth_internals_resources.pak",
+  ]
+  output_dir = "$root_gen_dir/chrome"
+  depfile_dir = target_gen_dir
+  grit_flags = [
+    "-E",
+    "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+  ]
+  deps = [
+    "//chrome/browser/ui/webui/bluetooth_internals:mojo_bindings_js",
+  ]
+}
diff --git a/chrome/browser/resources/bluetooth_internals/resources.grd b/chrome/browser/resources/bluetooth_internals/resources.grd
new file mode 100644
index 0000000..786dc15
--- /dev/null
+++ b/chrome/browser/resources/bluetooth_internals/resources.grd
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<grit latest_public_release="0"
+      current_release="1"
+      output_all_resource_defines="false">
+  <outputs>
+    <output filename="grit/bluetooth_internals_resources.h"
+            type="rc_header">
+      <emit emit_type='prepend'></emit>
+    </output>
+    <output filename="grit/bluetooth_internals_resources_map.cc"
+            type="resource_file_map_source" />
+    <output filename="grit/bluetooth_internals_resources_map.h"
+            type="resource_map_header" />
+    <output filename="bluetooth_internals_resources.pak"
+            type="data_package" />
+  </outputs>
+  <release seq="1">
+    <includes>
+      <include name="IDR_BLUETOOTH_INTERNALS_ADAPTER_BROKER_JS"
+               file="adapter_broker.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_ADAPTER_MOJO_JS"
+               file="${root_gen_dir}\device\bluetooth\public\mojom\adapter.mojom-lite.js"
+               use_base_dir="false"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_ADAPTER_PAGE_JS"
+               file="adapter_page.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_CHARACTERISTIC_LIST_JS"
+               file="characteristic_list.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_CSS"
+               file="bluetooth_internals.css"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DESCRIPTOR_LIST_JS"
+               file="descriptor_list.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_BROKER_JS"
+               file="device_broker.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_COLLECTION_JS"
+               file="device_collection.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_DETAILS_PAGE_JS"
+               file="device_details_page.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_MOJO_JS"
+               file="${root_gen_dir}\device\bluetooth\public\mojom\device.mojom-lite.js"
+               use_base_dir="false"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEVICE_TABLE_JS"
+               file="device_table.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_DEVICES_PAGE_JS"
+               file="devices_page.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_EXPANDABLE_LIST_JS"
+               file="expandable_list.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_HTML"
+               file="bluetooth_internals.html"
+               flattenhtml="true"
+               allowexternalscript="true"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_JS"
+               file="bluetooth_internals.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_MOJO_JS"
+               file="${root_gen_dir}\chrome\browser\ui\webui\bluetooth_internals\bluetooth_internals.mojom-lite.js"
+               use_base_dir="false"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_OBJECT_FIELDSET_JS"
+               file="object_fieldset.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_SERVICE_LIST_JS"
+               file="service_list.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_SIDEBAR_JS"
+               file="sidebar.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_SNACKBAR_JS"
+               file="snackbar.js"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_UUID_MOJO_JS"
+               file="${root_gen_dir}\device\bluetooth\public\mojom\uuid.mojom-lite.js"
+               use_base_dir="false"
+               type="BINDATA"
+               compress="gzip" />
+      <include name="IDR_BLUETOOTH_INTERNALS_VALUE_CONTROL_JS"
+               file="value_control.js"
+               type="BINDATA"
+               compress="gzip" />
+    </includes>
+  </release>
+</grit>
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
index 7b426643..fdc2b91 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output_test.extjs
@@ -281,13 +281,20 @@
       '<input type="search"</input>' +
       '<input type="invalidType"</input>',
     function(root) {
-      var expectedSpans = [
+      var expectedSpansNonSearchBox = [
         {value: 'name', start: 0, end: 0},
         {value: new Output.EarconAction('EDITABLE_TEXT'), start: 0, end: 0},
         {value: new Output.SelectionSpan(0, 0, 0), start: 1, end: 1},
         {value: 'value', start: 1, end: 1},
         {value: 'inputType', start: 2}
       ];
+      var expectedSpansForSearchBox = [
+        {value: 'name', start: 0, end: 0},
+        {value: new Output.EarconAction('EDITABLE_TEXT'), start: 0, end: 0},
+        {value: new Output.SelectionSpan(0, 0, 0), start: 1, end: 1},
+        {value: 'value', start: 1, end: 1},
+        {value: 'role', start:2, end:8}
+      ];
 
       var expectedSpeechValues = [
         '||Edit text',
@@ -313,7 +320,7 @@
           {value: 'value', start: 12, end: 26},
           {value: 'role', start: 27, end: 33}]
         ],
-        '||Edit text, search entry',
+        '||Search',
         '||Edit text'
       ];
       // TODO(plundblad): Some of these are wrong, there should be an initial
@@ -327,7 +334,7 @@
         {string_: 'time'},
         {string_: 'date'},
         {string_: 'Choose File No file chosen btn'},
-        ' srched',
+        ' search',
         ' ed'
       ];
       assertEquals(expectedSpeechValues.length, expectedBrailleValues.length);
@@ -338,11 +345,14 @@
         var o = new Output()
             .withoutHints()
             .withSpeechAndBraille(range, null, 'navigate');
+        var expectedSpansForValue = null;
         if (typeof expectedValue == 'object') {
           checkSpeechOutput(expectedValue[0], expectedValue[1], o);
         } else {
-          expectedSpans[4].end = expectedValue.length;
-          checkSpeechOutput(expectedValue, expectedSpans, o);
+          expectedSpansForValue = expectedValue === '||Search' ?
+              expectedSpansForSearchBox : expectedSpansNonSearchBox;
+          expectedSpansForValue[4].end = expectedValue.length;
+          checkSpeechOutput(expectedValue, expectedSpansForValue, o);
         }
         el = el.nextSibling;
       });
diff --git a/chrome/browser/resources/ntp4/dot_list.js b/chrome/browser/resources/ntp4/dot_list.js
index 9e5bdfa..d37ff53 100644
--- a/chrome/browser/resources/ntp4/dot_list.js
+++ b/chrome/browser/resources/ntp4/dot_list.js
@@ -11,7 +11,7 @@
 
   /**
    * Live list of the navigation dots.
-   * @type {!NodeList|undefined}
+   * @type {!HTMLCollection<!Element>}
    */
   let navDots;
 
diff --git a/chrome/browser/resources/ntp4/page_list_view.js b/chrome/browser/resources/ntp4/page_list_view.js
index 3a878c3..b9e093a 100644
--- a/chrome/browser/resources/ntp4/page_list_view.js
+++ b/chrome/browser/resources/ntp4/page_list_view.js
@@ -78,13 +78,13 @@
 
     /**
      * A list of all 'tile-page' elements.
-     * @type {!NodeList|undefined}
+     * @type {!HTMLCollection<!ntp.TilePage>|undefined}
      */
     tilePages: undefined,
 
     /**
      * A list of all 'apps-page' elements.
-     * @type {!NodeList|undefined}
+     * @type {!HTMLCollection<!ntp.AppsPage>|undefined}
      */
     appsPages: undefined,
 
@@ -175,8 +175,10 @@
 
       document.addEventListener('keydown', this.onDocKeyDown_.bind(this));
 
-      this.tilePages = this.pageList.getElementsByClassName('tile-page');
-      this.appsPages = this.pageList.getElementsByClassName('apps-page');
+      this.tilePages = /** @type {!HTMLCollection<!ntp.TilePage>} */ (
+          this.pageList.getElementsByClassName('tile-page'));
+      this.appsPages = /** @type {!HTMLCollection<!ntp.AppsPage>} */ (
+          this.pageList.getElementsByClassName('apps-page'));
 
       // Initialize the cardSlider without any cards at the moment.
       this.sliderFrame = cardSliderFrame;
diff --git a/chrome/browser/resources/omnibox/omnibox.js b/chrome/browser/resources/omnibox/omnibox.js
index 7bcb89eb..e2f4e0115 100644
--- a/chrome/browser/resources/omnibox/omnibox.js
+++ b/chrome/browser/resources/omnibox/omnibox.js
@@ -71,7 +71,7 @@
     this.handler_.setClientPage(
         this.callbackRouter_.$.bindNewPipeAndPassRemote());
 
-    /** @private {Request} */
+    /** @private {?Request} */
     this.lastRequest;
   }
 
diff --git a/chrome/browser/resources/settings/OWNERS b/chrome/browser/resources/settings/OWNERS
index a34bf8b..de56e9e6 100644
--- a/chrome/browser/resources/settings/OWNERS
+++ b/chrome/browser/resources/settings/OWNERS
@@ -6,4 +6,7 @@
 stevenjb@chromium.org
 tommycli@chromium.org
 
+# Chrome OS Settings
+per-file *os_settings*=file://chrome/browser/resources/settings/chromeos/OWNERS
+
 # COMPONENT: UI>Settings
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html
index 80d61cd9..30780b1 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.html
+++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -180,12 +180,10 @@
           </settings-section>
         </template>
 </if>
-        <template is="dom-if" if="[[showPage_(pageVisibility.search)]]" restamp>
-          <settings-section page-title="$i18n{searchPageTitle}"
-              section="search">
-            <settings-search-page prefs="{{prefs}}"></settings-search-page>
-          </settings-section>
-        </template>
+        <settings-section page-title="$i18n{searchPageTitle}"
+            section="search">
+          <settings-search-page prefs="{{prefs}}"></settings-search-page>
+        </settings-section>
 <if expr="chromeos">
         <template is="dom-if" if="[[showApps]]" restamp>
           <settings-section page-title="$i18n{appsPageTitle}" section="apps">
@@ -193,8 +191,7 @@
             </settings-app-management-page>
           </settings-section>
         </template>
-        <template is="dom-if" if="[[shouldCreateAndroidAppsSection_(
-            showAndroidApps, pageVisibility)]]" restamp>
+        <template is="dom-if" if="[[showAndroidApps]]" restamp>
           <settings-section page-title="$i18n{androidAppsPageTitle}"
               section="androidApps" hidden$="[[!shouldShowAndroidAppsSection_(
               androidAppsInfo)]]">
@@ -314,13 +311,10 @@
               </settings-section>
             </template>
 <if expr="not chromeos">
-            <template is="dom-if" if="[[showPage_(pageVisibility.system)]]"
-                restamp>
-              <settings-section page-title="$i18n{systemPageTitle}"
-                  section="system">
-                <settings-system-page prefs="{{prefs}}"></settings-system-page>
-              </settings-section>
-            </template>
+            <settings-section page-title="$i18n{systemPageTitle}"
+                section="system">
+              <settings-system-page prefs="{{prefs}}"></settings-system-page>
+            </settings-section>
 </if>
             <template is="dom-if" if="[[showPage_(pageVisibility.reset)]]"
                 restamp>
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.js b/chrome/browser/resources/settings/basic_page/basic_page.js
index 53f94ad..e0defb5 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.js
+++ b/chrome/browser/resources/settings/basic_page/basic_page.js
@@ -236,18 +236,6 @@
   },
 
   /**
-   * Returns true in case Android apps settings needs to be created. It is not
-   * created in case ARC++ is not allowed for the current profile.
-   * @return {boolean}
-   * @private
-   */
-  shouldCreateAndroidAppsSection_: function() {
-    const visibility = /** @type {boolean|undefined} */ (
-        this.get('pageVisibility.androidApps'));
-    return this.showAndroidApps && this.showPage_(visibility);
-  },
-
-  /**
    * Returns true in case Android apps settings should be shown. It is not
    * shown in case we don't have the Play Store app and settings app is not
    * yet available.
diff --git a/chrome/browser/resources/settings/chromeos/OWNERS b/chrome/browser/resources/settings/chromeos/OWNERS
new file mode 100644
index 0000000..5fb80bb
--- /dev/null
+++ b/chrome/browser/resources/settings/chromeos/OWNERS
@@ -0,0 +1,4 @@
+maybelle@chromium.org
+jamescook@chromium.org
+
+# COMPONENT: OS>Systems>Settings
diff --git a/chrome/browser/resources/settings/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
index 9c100437..bf2d66f2 100644
--- a/chrome/browser/resources/settings/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/internet_page/internet_detail_page.js
@@ -10,6 +10,8 @@
 (function() {
 'use strict';
 
+const mojom = chromeos.networkConfig.mojom;
+
 Polymer({
   is: 'settings-internet-detail-page',
 
@@ -515,10 +517,25 @@
     }
     const type = /** @type {CrOnc.Type} */ (
         OncMojo.getNetworkTypeString(networkState.type));
-    const connectionState = /** @type {CrOnc.ConnectionState} */ (
-        OncMojo.getConnectionStateTypeString(networkState.connectionState));
+
+    let connectionState;
+    switch (networkState.connectionState) {
+      case mojom.ConnectionStateType.kOnline:
+      case mojom.ConnectionStateType.kConnected:
+      case mojom.ConnectionStateType.kPortal:
+        connectionState = CrOnc.ConnectionState.CONNECTED;
+        break;
+      case mojom.ConnectionStateType.kConnecting:
+        connectionState = CrOnc.ConnectionState.CONNECTING;
+        break;
+      case mojom.ConnectionStateType.kNotConnected:
+        connectionState = CrOnc.ConnectionState.NOT_CONNECTED;
+        break;
+    }
+
     this.networkProperties_ = {
       GUID: networkState.guid,
+      Name: {Active: networkState.name},
       Type: type,
       Connectable: networkState.connectable,
       ConnectionState: connectionState,
@@ -936,8 +953,8 @@
     // Only mark VPN networks as enforced. This fake pref also controls the
     // policy indicator on the connect/disconnect buttons, so it shouldn't be
     // shown on non-VPN networks.
-    if (this.isVpn_(this.networkProperties_) && this.prefs.vpn_config_allowed &&
-        !this.prefs.vpn_config_allowed.value) {
+    if (this.isVpn_(this.networkProperties_) && this.prefs &&
+        this.prefs.vpn_config_allowed && !this.prefs.vpn_config_allowed.value) {
       fakeAlwaysOnVpnEnforcementPref.enforcement =
           chrome.settingsPrivate.Enforcement.ENFORCED;
       fakeAlwaysOnVpnEnforcementPref.controlledBy =
diff --git a/chrome/browser/resources/settings/people_page/fingerprint_list.js b/chrome/browser/resources/settings/people_page/fingerprint_list.js
index 92cfb70..657e219 100644
--- a/chrome/browser/resources/settings/people_page/fingerprint_list.js
+++ b/chrome/browser/resources/settings/people_page/fingerprint_list.js
@@ -117,9 +117,10 @@
 
       // Flash the background.
       listItem.animate(
-          {
-            backgroundColor: ['var(--google-grey-300)', 'white'],
-          },
+          [
+            {backgroundColor: ['var(--google-grey-300)']},
+            {backgroundColor: ['white']}
+          ],
           FLASH_DURATION_MS);
     });
   },
diff --git a/chrome/browser/sharing/sharing_fcm_handler.cc b/chrome/browser/sharing/sharing_fcm_handler.cc
index 7ee5696..c06ce50 100644
--- a/chrome/browser/sharing/sharing_fcm_handler.cc
+++ b/chrome/browser/sharing/sharing_fcm_handler.cc
@@ -144,6 +144,7 @@
 void SharingFCMHandler::OnAckMessageSent(
     const std::string& original_message_id,
     base::Optional<std::string> message_id) {
+  LogSendSharingAckMessageSuccess(message_id.has_value());
   if (!message_id) {
     LOG(ERROR) << "Failed to send ack mesage for " << original_message_id;
   }
diff --git a/chrome/browser/sharing/sharing_metrics.cc b/chrome/browser/sharing/sharing_metrics.cc
index c95490b..58f772b 100644
--- a/chrome/browser/sharing/sharing_metrics.cc
+++ b/chrome/browser/sharing/sharing_metrics.cc
@@ -106,3 +106,11 @@
 void LogClickToCallDialogShown(SharingClickToCallDialogType type) {
   base::UmaHistogramEnumeration("Sharing.ClickToCallDialogShown", type);
 }
+
+void LogSendSharingMessageSuccess(bool success) {
+  base::UmaHistogramBoolean("Sharing.SendMessageSuccess", success);
+}
+
+void LogSendSharingAckMessageSuccess(bool success) {
+  base::UmaHistogramBoolean("Sharing.SendAckMessageSuccess", success);
+}
diff --git a/chrome/browser/sharing/sharing_metrics.h b/chrome/browser/sharing/sharing_metrics.h
index 669fe72..6bb40e5 100644
--- a/chrome/browser/sharing/sharing_metrics.h
+++ b/chrome/browser/sharing/sharing_metrics.h
@@ -87,4 +87,13 @@
 // Logs to UMA the |type| of dialog shown for Click to Call.
 void LogClickToCallDialogShown(SharingClickToCallDialogType type);
 
+// Logs to UMA whether a SharingMessage was sent successfully by the Sharing
+// service. For |success| to be true, an ack message must be received before the
+// timeout. This should not be called for sending ack messages.
+void LogSendSharingMessageSuccess(bool success);
+
+// Logs to UMA whether an ack message was sent successfully by the Sharing
+// service.
+void LogSendSharingAckMessageSuccess(bool success);
+
 #endif  // CHROME_BROWSER_SHARING_SHARING_METRICS_H_
diff --git a/chrome/browser/sharing/sharing_service.cc b/chrome/browser/sharing/sharing_service.cc
index 7c3b3ca..4dfe5893 100644
--- a/chrome/browser/sharing/sharing_service.cc
+++ b/chrome/browser/sharing/sharing_service.cc
@@ -224,6 +224,7 @@
   SendMessageCallback callback = std::move(iter->second);
   send_message_callbacks_.erase(iter);
   std::move(callback).Run(result);
+  LogSendSharingMessageSuccess(result);
 }
 
 void SharingService::RegisterHandler(
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index da086bc9..197abcc 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -215,8 +215,12 @@
     "webauthn/authenticator_request_dialog.h",
     "webui/about_ui.cc",
     "webui/about_ui.h",
-    "webui/autofill_internals_ui.cc",
-    "webui/autofill_internals_ui.h",
+    "webui/autofill_and_password_manager_internals/autofill_internals_ui.cc",
+    "webui/autofill_and_password_manager_internals/autofill_internals_ui.h",
+    "webui/autofill_and_password_manager_internals/internals_ui_handler.cc",
+    "webui/autofill_and_password_manager_internals/internals_ui_handler.h",
+    "webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc",
+    "webui/autofill_and_password_manager_internals/password_manager_internals_ui.h",
     "webui/chrome_web_ui_controller_factory.cc",
     "webui/chrome_web_ui_controller_factory.h",
     "webui/components_ui.cc",
@@ -283,8 +287,6 @@
     "webui/omnibox/omnibox_page_handler.h",
     "webui/omnibox/omnibox_ui.cc",
     "webui/omnibox/omnibox_ui.h",
-    "webui/password_manager_internals/password_manager_internals_ui.cc",
-    "webui/password_manager_internals/password_manager_internals_ui.h",
     "webui/policy_ui.cc",
     "webui/policy_ui.h",
     "webui/policy_ui_handler.cc",
diff --git a/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.cc b/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.cc
index 9d77bea..42e6c81 100644
--- a/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.cc
+++ b/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.cc
@@ -107,7 +107,6 @@
 
 void BluetoothChooserAndroid::OnDialogFinished(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint event_type,
     const JavaParamRef<jstring>& device_id) {
   // Values are defined in BluetoothChooserDialog as DIALOG_FINISHED constants.
@@ -131,28 +130,21 @@
   event_handler_.Run(Event::RESCAN, "");
 }
 
-void BluetoothChooserAndroid::RestartSearch(JNIEnv*,
-                                            const JavaParamRef<jobject>&) {
+void BluetoothChooserAndroid::RestartSearch(JNIEnv*) {
   RestartSearch();
 }
 
-void BluetoothChooserAndroid::ShowBluetoothOverviewLink(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void BluetoothChooserAndroid::ShowBluetoothOverviewLink(JNIEnv* env) {
   OpenURL(chrome::kChooserBluetoothOverviewURL);
   event_handler_.Run(Event::SHOW_OVERVIEW_HELP, "");
 }
 
-void BluetoothChooserAndroid::ShowBluetoothAdapterOffLink(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void BluetoothChooserAndroid::ShowBluetoothAdapterOffLink(JNIEnv* env) {
   OpenURL(chrome::kChooserBluetoothOverviewURL);
   event_handler_.Run(Event::SHOW_ADAPTER_OFF_HELP, "");
 }
 
-void BluetoothChooserAndroid::ShowNeedLocationPermissionLink(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void BluetoothChooserAndroid::ShowNeedLocationPermissionLink(JNIEnv* env) {
   OpenURL(chrome::kChooserBluetoothOverviewURL);
   event_handler_.Run(Event::SHOW_NEED_LOCATION_HELP, "");
 }
diff --git a/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.h b/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.h
index 05a7452..0e7536cb 100644
--- a/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.h
+++ b/chrome/browser/ui/android/device_dialog/bluetooth_chooser_android.h
@@ -31,24 +31,17 @@
 
   // Report the dialog's result.
   void OnDialogFinished(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
                         jint event_type,
                         const base::android::JavaParamRef<jstring>& device_id);
 
   // Notify bluetooth stack that the search needs to be re-issued.
   void RestartSearch();
   // Calls RestartSearch(). Unused JNI parameters enable calls from Java.
-  void RestartSearch(JNIEnv*, const base::android::JavaParamRef<jobject>&);
+  void RestartSearch(JNIEnv*);
 
-  void ShowBluetoothOverviewLink(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  void ShowBluetoothAdapterOffLink(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  void ShowNeedLocationPermissionLink(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  void ShowBluetoothOverviewLink(JNIEnv* env);
+  void ShowBluetoothAdapterOffLink(JNIEnv* env);
+  void ShowNeedLocationPermissionLink(JNIEnv* env);
 
  private:
   void OpenURL(const char* url);
diff --git a/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.cc b/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.cc
index fe2a1bc..8d6df5a 100644
--- a/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.cc
+++ b/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.cc
@@ -70,7 +70,6 @@
 
 void BluetoothScanningPromptAndroid::OnDialogFinished(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     jint event_type) {
   // Values are defined in BluetoothScanningPromptDialog as DIALOG_FINISHED
   // constants.
diff --git a/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.h b/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.h
index 89fe02f..677ab41 100644
--- a/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.h
+++ b/chrome/browser/ui/android/device_dialog/bluetooth_scanning_prompt_android.h
@@ -35,7 +35,6 @@
 
   // Report the dialog's result.
   void OnDialogFinished(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
                         jint event_type);
 
  private:
diff --git a/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc b/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc
index 2160e48..e3a9d21 100644
--- a/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc
+++ b/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.cc
@@ -126,7 +126,6 @@
 
 void UsbChooserDialogAndroid::OnItemSelected(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     const base::android::JavaParamRef<jstring>& item_id_jstring) {
   std::string item_id =
       base::android::ConvertJavaStringToUTF8(env, item_id_jstring);
@@ -136,15 +135,11 @@
   std::move(on_close_).Run();
 }
 
-void UsbChooserDialogAndroid::OnDialogCancelled(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void UsbChooserDialogAndroid::OnDialogCancelled(JNIEnv* env) {
   Cancel();
 }
 
-void UsbChooserDialogAndroid::LoadUsbHelpPage(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void UsbChooserDialogAndroid::LoadUsbHelpPage(JNIEnv* env) {
   controller_->OpenHelpCenterUrl();
   Cancel();
 }
diff --git a/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.h b/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.h
index 00ce6b7..41ba002 100644
--- a/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.h
+++ b/chrome/browser/ui/android/device_dialog/usb_chooser_dialog_android.h
@@ -45,12 +45,9 @@
 
   // Report the dialog's result.
   void OnItemSelected(JNIEnv* env,
-                      const base::android::JavaParamRef<jobject>& obj,
                       const base::android::JavaParamRef<jstring>& item_id);
-  void OnDialogCancelled(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& obj);
-  void LoadUsbHelpPage(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj);
+  void OnDialogCancelled(JNIEnv* env);
+  void LoadUsbHelpPage(JNIEnv* env);
 
  private:
   // Called when the chooser dialog is closed.
diff --git a/chrome/browser/ui/android/overlay/overlay_window_android.cc b/chrome/browser/ui/android/overlay/overlay_window_android.cc
index fa72ec4..5ce88e7 100644
--- a/chrome/browser/ui/android/overlay/overlay_window_android.cc
+++ b/chrome/browser/ui/android/overlay/overlay_window_android.cc
@@ -37,9 +37,7 @@
   java_ref_ = JavaObjectWeakGlobalRef(env, obj);
 }
 
-void OverlayWindowAndroid::OnActivityDestroy(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void OverlayWindowAndroid::OnActivityDestroy(JNIEnv* env) {
   java_ref_.reset();
   controller_->CloseAndFocusInitiator();
   controller_->OnWindowDestroyed();
diff --git a/chrome/browser/ui/android/overlay/overlay_window_android.h b/chrome/browser/ui/android/overlay/overlay_window_android.h
index 3988c93..1cbb99f1 100644
--- a/chrome/browser/ui/android/overlay/overlay_window_android.h
+++ b/chrome/browser/ui/android/overlay/overlay_window_android.h
@@ -19,8 +19,7 @@
 
   void OnActivityStart(JNIEnv* env,
                        const base::android::JavaParamRef<jobject>& obj);
-  void OnActivityDestroy(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& obj);
+  void OnActivityDestroy(JNIEnv* env);
 
   bool IsActive() override;
   void Close() override;
diff --git a/chrome/browser/ui/android/sms/sms_dialog_android.cc b/chrome/browser/ui/android/sms/sms_dialog_android.cc
index f3d03aef..6eaa59f7 100644
--- a/chrome/browser/ui/android/sms/sms_dialog_android.cc
+++ b/chrome/browser/ui/android/sms/sms_dialog_android.cc
@@ -49,12 +49,10 @@
                                               java_dialog_);
 }
 
-void SmsDialogAndroid::OnContinue(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void SmsDialogAndroid::OnContinue(JNIEnv* env) {
   std::move(on_continue_).Run();
 }
 
-void SmsDialogAndroid::OnCancel(JNIEnv* env, const JavaParamRef<jobject>& obj) {
+void SmsDialogAndroid::OnCancel(JNIEnv* env) {
   std::move(on_cancel_).Run();
 }
diff --git a/chrome/browser/ui/android/sms/sms_dialog_android.h b/chrome/browser/ui/android/sms/sms_dialog_android.h
index b992827..aff4082 100644
--- a/chrome/browser/ui/android/sms/sms_dialog_android.h
+++ b/chrome/browser/ui/android/sms/sms_dialog_android.h
@@ -22,10 +22,10 @@
   void EnableContinueButton() override;
 
   // Report the user manually clicks the 'Continue' button.
-  void OnContinue(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void OnContinue(JNIEnv* env);
 
   // Report the user manually dismisses the SMS dialog.
-  void OnCancel(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+  void OnCancel(JNIEnv* env);
 
  private:
   base::android::ScopedJavaGlobalRef<jobject> java_dialog_;
diff --git a/chrome/browser/ui/search/search_tab_helper_unittest.cc b/chrome/browser/ui/search/search_tab_helper_unittest.cc
index 0d62a665..de0cccd 100644
--- a/chrome/browser/ui/search/search_tab_helper_unittest.cc
+++ b/chrome/browser/ui/search/search_tab_helper_unittest.cc
@@ -12,8 +12,6 @@
 
 #include "base/bind.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/test/bind_test_util.h"
-#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/browser/ui/search/search_ipc_router.h"
 #include "chrome/common/search/mock_embedded_search_client.h"
@@ -51,8 +49,6 @@
 
   void SetUp() override {
     ChromeRenderViewHostTestHarness::SetUp();
-    identity_test_env_adaptor_ =
-        std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
     SearchTabHelper::CreateForWebContents(web_contents());
     auto* search_tab = SearchTabHelper::FromWebContents(web_contents());
     auto factory =
@@ -63,32 +59,15 @@
         .set_embedded_search_client_factory_for_testing(std::move(factory));
   }
 
-  void TearDown() override {
-    // |identity_test_env_adaptor_| must be destroyed before profile().
-    identity_test_env_adaptor_.reset();
-    ChromeRenderViewHostTestHarness::TearDown();
-  }
-
   content::BrowserContext* CreateBrowserContext() override {
-    TestingProfile::TestingFactories factories = {
-        {ProfileSyncServiceFactory::GetInstance(),
-         base::BindLambdaForTesting(
-             [](content::BrowserContext*) -> std::unique_ptr<KeyedService> {
-               return std::make_unique<syncer::TestSyncService>();
-             })}};
-
-    // Per comments on content::RenderViewHostTestHarness, it takes ownership of
-    // the returned object.
-    return IdentityTestEnvironmentProfileAdaptor::
-        CreateProfileForIdentityTestEnvironment(factories)
-            .release();
-  }
-
-  // Associates |email| with profile as the primary account. |email|
-  // should not be empty.
-  void SetUpAccount(const std::string& email) {
-    ASSERT_FALSE(email.empty());
-    identity_test_env()->SetPrimaryAccount(email);
+    TestingProfile::Builder builder;
+    builder.AddTestingFactory(
+        ProfileSyncServiceFactory::GetInstance(),
+        base::BindRepeating(
+            [](content::BrowserContext*) -> std::unique_ptr<KeyedService> {
+              return std::make_unique<syncer::TestSyncService>();
+            }));
+    return builder.Build().release();
   }
 
   // Configure the account to |sync_history| or not.
@@ -105,15 +84,8 @@
     sync_service->SetPreferredDataTypes(types);
   }
 
-  signin::IdentityTestEnvironment* identity_test_env() {
-    DCHECK(identity_test_env_adaptor_);
-    return identity_test_env_adaptor_->identity_test_env();
-  }
-
  private:
   NiceMock<MockEmbeddedSearchClient> mock_embedded_search_client_;
-  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor>
-      identity_test_env_adaptor_;
 };
 
 TEST_F(SearchTabHelperTest, FileSelectedUpdatesLastSelectedDirectory) {
diff --git a/chrome/browser/ui/toolbar/toolbar_actions_model.cc b/chrome/browser/ui/toolbar/toolbar_actions_model.cc
index 2f91fd54..131fa268 100644
--- a/chrome/browser/ui/toolbar/toolbar_actions_model.cc
+++ b/chrome/browser/ui/toolbar/toolbar_actions_model.cc
@@ -473,18 +473,14 @@
   std::vector<ActionId> unsorted;
 
   // Populate the lists.
-  int hidden = 0;
 
   // Add the extension action ids to all_actions.
   const extensions::ExtensionSet& extensions =
       extension_registry_->enabled_extensions();
   for (const scoped_refptr<const extensions::Extension>& extension :
        extensions) {
-    if (!ShouldAddExtension(extension.get())) {
-      if (!extension_action_api_->GetBrowserActionVisibility(extension->id()))
-        ++hidden;
+    if (!ShouldAddExtension(extension.get()))
       continue;
-    }
 
     all_actions.push_back(extension->id());
   }
@@ -537,8 +533,6 @@
 
   // Histogram names are prefixed with "ExtensionToolbarModel" rather than
   // "ToolbarActionsModel" for historical reasons.
-  UMA_HISTOGRAM_COUNTS_100(
-      "ExtensionToolbarModel.BrowserActionsPermanentlyHidden", hidden);
   UMA_HISTOGRAM_COUNTS_100("ExtensionToolbarModel.BrowserActionsCount",
                            action_ids_.size());
 
diff --git a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
index fe8b16a..cb35efc 100644
--- a/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/card_unmask_prompt_views.cc
@@ -302,7 +302,7 @@
   DCHECK_EQ(ui::DIALOG_BUTTON_OK, button);
 
   return cvc_input_->GetEnabled() &&
-         controller_->InputCvcIsValid(cvc_input_->text()) &&
+         controller_->InputCvcIsValid(cvc_input_->GetText()) &&
          ExpirationDateIsValid();
 }
 
@@ -323,7 +323,7 @@
     return true;
 
   controller_->OnUnmaskResponse(
-      cvc_input_->text(),
+      cvc_input_->GetText(),
       month_input_->GetVisible()
           ? month_input_->GetTextForRow(month_input_->GetSelectedIndex())
           : base::string16(),
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
index b42eebc1..adaaf8f 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -1366,7 +1366,7 @@
   // Account.
   views::Textfield* cardholder_name_textfield = static_cast<views::Textfield*>(
       FindViewInBubbleById(DialogViewId::CARDHOLDER_NAME_TEXTFIELD));
-  EXPECT_EQ(cardholder_name_textfield->text(),
+  EXPECT_EQ(cardholder_name_textfield->GetText(),
             base::ASCIIToUTF16("John Smith"));
 }
 
@@ -1637,7 +1637,7 @@
   // user's Google Account should also be visible.
   views::Textfield* cardholder_name_textfield = static_cast<views::Textfield*>(
       FindViewInBubbleById(DialogViewId::CARDHOLDER_NAME_TEXTFIELD));
-  EXPECT_EQ(cardholder_name_textfield->text(),
+  EXPECT_EQ(cardholder_name_textfield->GetText(),
             base::ASCIIToUTF16("John Smith"));
   histogram_tester.ExpectUniqueSample(
       "Autofill.SaveCardCardholderNamePrefilled", true, 1);
@@ -1673,7 +1673,7 @@
   // name came from the user's Google Account should NOT be visible.
   views::Textfield* cardholder_name_textfield = static_cast<views::Textfield*>(
       FindViewInBubbleById(DialogViewId::CARDHOLDER_NAME_TEXTFIELD));
-  EXPECT_TRUE(cardholder_name_textfield->text().empty());
+  EXPECT_TRUE(cardholder_name_textfield->GetText().empty());
   histogram_tester.ExpectUniqueSample(
       "Autofill.SaveCardCardholderNamePrefilled", false, 1);
   EXPECT_FALSE(FindViewInBubbleById(DialogViewId::CARDHOLDER_NAME_TOOLTIP));
@@ -1783,7 +1783,7 @@
   // name came from the user's Google Account should NOT be visible.
   views::Textfield* cardholder_name_textfield = static_cast<views::Textfield*>(
       FindViewInBubbleById(DialogViewId::CARDHOLDER_NAME_TEXTFIELD));
-  EXPECT_TRUE(cardholder_name_textfield->text().empty());
+  EXPECT_TRUE(cardholder_name_textfield->GetText().empty());
   histogram_tester.ExpectUniqueSample(
       "Autofill.SaveCardCardholderNamePrefilled", false, 1);
   EXPECT_FALSE(FindViewInBubbleById(DialogViewId::CARDHOLDER_NAME_TOOLTIP));
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
index 236f8cc..7e91ade 100644
--- a/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_card_offer_bubble_views.cc
@@ -74,7 +74,7 @@
   auto upload_explanation_tooltip = std::make_unique<
       views::TooltipIcon>(l10n_util::GetStringUTF16(
       (cardholder_name_textfield_ &&
-       !cardholder_name_textfield_->text().empty())
+       !cardholder_name_textfield_->GetText().empty())
           ? IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_AND_CARDHOLDER_NAME_TOOLTIP
           : IDS_AUTOFILL_SAVE_CARD_PROMPT_UPLOAD_EXPLANATION_TOOLTIP));
   upload_explanation_tooltip->set_bubble_width(kTooltipBubbleWidth);
@@ -98,7 +98,7 @@
 bool SaveCardOfferBubbleViews::Accept() {
   if (controller()) {
     controller()->OnSaveButton(
-        {cardholder_name_textfield_ ? cardholder_name_textfield_->text()
+        {cardholder_name_textfield_ ? cardholder_name_textfield_->GetText()
                                     : base::string16(),
          month_input_dropdown_ ? month_input_dropdown_->model()->GetItemAt(
                                      month_input_dropdown_->GetSelectedIndex())
@@ -130,7 +130,7 @@
     DCHECK(!month_input_dropdown_ && !year_input_dropdown_);
     // If requesting the user confirm the name, it cannot be blank.
     base::string16 trimmed_text;
-    base::TrimWhitespace(cardholder_name_textfield_->text(), base::TRIM_ALL,
+    base::TrimWhitespace(cardholder_name_textfield_->GetText(), base::TRIM_ALL,
                          &trimmed_text);
     return !trimmed_text.empty();
   }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
index b7d4b0c7..14bd189 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bubble_view.cc
@@ -318,7 +318,7 @@
   BookmarkModel* model = BookmarkModelFactory::GetForBrowserContext(profile_);
   const BookmarkNode* node = model->GetMostRecentlyAddedUserNodeForURL(url_);
   if (node) {
-    const base::string16 new_title = name_field_->text();
+    const base::string16 new_title = name_field_->GetText();
     if (new_title != node->GetTitle()) {
       model->SetTitle(node, new_title);
       base::RecordAction(
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
index 93867d7..84ebb31 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_editor_view.cc
@@ -431,7 +431,7 @@
 GURL BookmarkEditorView::GetInputURL() const {
   if (details_.GetNodeType() == BookmarkNode::FOLDER)
     return GURL();
-  return url_formatter::FixupURL(base::UTF16ToUTF8(url_tf_->text()),
+  return url_formatter::FixupURL(base::UTF16ToUTF8(url_tf_->GetText()),
                                  std::string());
 }
 
@@ -549,7 +549,7 @@
   bb_model_->RemoveObserver(this);
 
   GURL new_url(GetInputURL());
-  base::string16 new_title(title_tf_->text());
+  base::string16 new_title(title_tf_->GetText());
 
   if (!show_tree_) {
     BookmarkEditor::ApplyEditsWithNoFolderChange(
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_editor_view_unittest.cc b/chrome/browser/ui/views/bookmarks/bookmark_editor_view_unittest.cc
index cb92f9f..f1a795b 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_editor_view_unittest.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_editor_view_unittest.cc
@@ -74,7 +74,7 @@
 
   base::string16 GetURLText() const {
     if (editor_->details_.type != BookmarkEditor::EditDetails::NEW_FOLDER)
-      return editor_->url_tf_->text();
+      return editor_->url_tf_->GetText();
 
     return base::string16();
   }
diff --git a/chrome/browser/ui/views/crypto_module_password_dialog_view.cc b/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
index 8c6db72..0cdfdbad 100644
--- a/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
+++ b/chrome/browser/ui/views/crypto_module_password_dialog_view.cc
@@ -63,7 +63,7 @@
 }
 
 bool CryptoModulePasswordDialogView::Accept() {
-  callback_.Run(base::UTF16ToUTF8(password_entry_->text()));
+  callback_.Run(base::UTF16ToUTF8(password_entry_->GetText()));
   const base::string16 empty;
   password_entry_->SetText(empty);
   return true;
diff --git a/chrome/browser/ui/views/crypto_module_password_dialog_view_unittest.cc b/chrome/browser/ui/views/crypto_module_password_dialog_view_unittest.cc
index 6257c146..44c9a08 100644
--- a/chrome/browser/ui/views/crypto_module_password_dialog_view_unittest.cc
+++ b/chrome/browser/ui/views/crypto_module_password_dialog_view_unittest.cc
@@ -44,5 +44,5 @@
   EXPECT_TRUE(dialog_->Accept());
   EXPECT_EQ(kPassword, text_);
   const base::string16 empty;
-  EXPECT_EQ(empty, dialog_->password_entry_->text());
+  EXPECT_EQ(empty, dialog_->password_entry_->GetText());
 }
diff --git a/chrome/browser/ui/views/extensions/bookmark_app_confirmation_view.cc b/chrome/browser/ui/views/extensions/bookmark_app_confirmation_view.cc
index eeaf3a2..e7cf92f 100644
--- a/chrome/browser/ui/views/extensions/bookmark_app_confirmation_view.cc
+++ b/chrome/browser/ui/views/extensions/bookmark_app_confirmation_view.cc
@@ -152,7 +152,7 @@
 }
 
 base::string16 BookmarkAppConfirmationView::GetTrimmedTitle() const {
-  base::string16 title(title_tf_->text());
+  base::string16 title(title_tf_->GetText());
   base::TrimWhitespace(title, base::TRIM_ALL, &title);
   return title;
 }
diff --git a/chrome/browser/ui/views/find_bar_view.cc b/chrome/browser/ui/views/find_bar_view.cc
index cd5d170b..0c36685 100644
--- a/chrome/browser/ui/views/find_bar_view.cc
+++ b/chrome/browser/ui/views/find_bar_view.cc
@@ -259,7 +259,7 @@
 }
 
 base::string16 FindBarView::GetFindText() const {
-  return find_text_->text();
+  return find_text_->GetText();
 }
 
 gfx::Range FindBarView::GetSelectedRange() const {
@@ -286,7 +286,7 @@
   // Find Bar hosts with global find pasteboards are expected to preserve the
   // find text contents after clearing the find results as the normal
   // prepopulation code does not run.
-  if (find_text_->text() != find_text && !find_text_->IsIMEComposing() &&
+  if (find_text_->GetText() != find_text && !find_text_->IsIMEComposing() &&
       (!find_bar_host_->HasGlobalFindPasteboard() || !find_text.empty())) {
     find_text_->SetText(find_text);
     find_text_->SelectAll(true);
@@ -373,7 +373,7 @@
 #if !defined(OS_WIN)
   GetWidget()->GetInputMethod()->ShowVirtualKeyboardIfEnabled();
 #endif
-  if (!find_text_->text().empty())
+  if (!find_text_->GetText().empty())
     find_text_->SelectAll(true);
 }
 
@@ -385,11 +385,11 @@
   switch (sender->GetID()) {
     case VIEW_ID_FIND_IN_PAGE_PREVIOUS_BUTTON:
     case VIEW_ID_FIND_IN_PAGE_NEXT_BUTTON:
-      if (!find_text_->text().empty()) {
+      if (!find_text_->GetText().empty()) {
         FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(
             find_bar_host_->GetFindBarController()->web_contents());
         find_tab_helper->StartFinding(
-            find_text_->text(),
+            find_text_->GetText(),
             sender->GetID() == VIEW_ID_FIND_IN_PAGE_NEXT_BUTTON,
             false);  // Not case sensitive.
       }
@@ -419,7 +419,7 @@
   if (key_event.key_code() == ui::VKEY_RETURN &&
       key_event.type() == ui::ET_KEY_PRESSED) {
     // Pressing Return/Enter starts the search (unless text box is empty).
-    base::string16 find_string = find_text_->text();
+    base::string16 find_string = find_text_->GetText();
     if (!find_string.empty()) {
       FindBarController* controller = find_bar_host_->GetFindBarController();
       FindTabHelper* find_tab_helper =
@@ -438,8 +438,8 @@
 void FindBarView::OnAfterUserAction(views::Textfield* sender) {
   // The composition text wouldn't be what the user is really looking for.
   // We delay the search until the user commits the composition text.
-  if (!sender->IsIMEComposing() && sender->text() != last_searched_text_)
-    Find(sender->text());
+  if (!sender->IsIMEComposing() && sender->GetText() != last_searched_text_)
+    Find(sender->GetText());
 }
 
 void FindBarView::OnAfterPaste() {
@@ -493,7 +493,7 @@
 }
 
 void FindBarView::UpdateMatchCountAppearance(bool no_match) {
-  bool enable_buttons = !find_text_->text().empty() && !no_match;
+  bool enable_buttons = !find_text_->GetText().empty() && !no_match;
   find_previous_button_->SetEnabled(enable_buttons);
   find_next_button_->SetEnabled(enable_buttons);
 }
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 1f30038..c53e9de4 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -1176,7 +1176,7 @@
 void LocationBarView::OnChanged() {
   location_icon_view_->Update(/*suppress_animations=*/false);
   clear_all_button_->SetVisible(IsLocationBarUserInputInProgress() &&
-                                !omnibox_view_->text().empty() &&
+                                !omnibox_view_->GetText().empty() &&
                                 IsVirtualKeyboardVisible(GetWidget()));
   Layout();
   SchedulePaint();
diff --git a/chrome/browser/ui/views/login_view.cc b/chrome/browser/ui/views/login_view.cc
index c9bd5890..4dc47bd 100644
--- a/chrome/browser/ui/views/login_view.cc
+++ b/chrome/browser/ui/views/login_view.cc
@@ -84,11 +84,11 @@
 }
 
 const base::string16& LoginView::GetUsername() const {
-  return username_field_->text();
+  return username_field_->GetText();
 }
 
 const base::string16& LoginView::GetPassword() const {
-  return password_field_->text();
+  return password_field_->GetText();
 }
 
 views::View* LoginView::GetInitiallyFocusedView() {
@@ -100,7 +100,7 @@
 
 void LoginView::OnAutofillDataAvailable(const base::string16& username,
                                         const base::string16& password) {
-  if (username_field_->text().empty()) {
+  if (username_field_->GetText().empty()) {
     username_field_->SetText(username);
     password_field_->SetText(password);
     username_field_->SelectAll(true);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 45f5a7d..7f3edc0 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -324,7 +324,7 @@
 
 bool OmniboxViewViews::SelectionAtEnd() const {
   const gfx::Range sel = GetSelectedRange();
-  return sel.GetMin() == text().size();
+  return sel.GetMin() == GetText().size();
 }
 
 void OmniboxViewViews::EmphasizeURLComponents() {
@@ -382,7 +382,7 @@
 
 base::string16 OmniboxViewViews::GetText() const {
   // TODO(oshima): IME support
-  return text();
+  return Textfield::GetText();
 }
 
 void OmniboxViewViews::SetUserText(const base::string16& text,
@@ -727,7 +727,7 @@
 
 bool OmniboxViewViews::IsSelectAll() const {
   // TODO(oshima): IME support.
-  return !text().empty() && text() == GetSelectedText();
+  return !GetText().empty() && GetText() == GetSelectedText();
 }
 
 void OmniboxViewViews::UpdatePopup() {
@@ -762,7 +762,7 @@
 bool OmniboxViewViews::OnInlineAutocompleteTextMaybeChanged(
     const base::string16& display_text,
     size_t user_text_length) {
-  if (display_text == text())
+  if (display_text == GetText())
     return false;
 
   if (!IsIMEComposing()) {
@@ -958,7 +958,7 @@
 
 int OmniboxViewViews::GetOmniboxTextLength() const {
   // TODO(oshima): Support IME.
-  return static_cast<int>(text().length());
+  return static_cast<int>(GetText().length());
 }
 
 void OmniboxViewViews::SetEmphasis(bool emphasize, const gfx::Range& range) {
@@ -1222,7 +1222,7 @@
 
 bool OmniboxViewViews::HandleAccessibleAction(
     const ui::AXActionData& action_data) {
-  if (read_only())
+  if (GetReadOnly())
     return Textfield::HandleAccessibleAction(action_data);
 
   if (action_data.action == ax::mojom::Action::kSetValue) {
@@ -1318,9 +1318,9 @@
   if (GetWidget() && GetWidget()->IsActive() && popup_closes_on_blur &&
       !model()->is_keyword_selected() &&
       ((!model()->user_input_in_progress() &&
-        text() != model()->GetPermanentDisplayText()) ||
+        GetText() != model()->GetPermanentDisplayText()) ||
        (model()->user_input_in_progress() &&
-        text() == model()->GetPermanentDisplayText()))) {
+        GetText() == model()->GetPermanentDisplayText()))) {
     RevertAll();
   }
 
@@ -1334,7 +1334,8 @@
   // If we fully reverted in this case, we'd lose the cursor/highlight
   // information saved above.
   if (!model()->user_input_in_progress() && popup_model &&
-      popup_model->IsOpen() && text() != model()->GetPermanentDisplayText()) {
+      popup_model->IsOpen() &&
+      GetText() != model()->GetPermanentDisplayText()) {
     RevertAll();
   } else if (popup_closes_on_blur) {
     CloseOmniboxPopup();
@@ -1380,9 +1381,9 @@
 
 bool OmniboxViewViews::IsCommandIdEnabled(int command_id) const {
   if (command_id == IDS_APP_PASTE)
-    return !read_only() && !GetClipboardText().empty();
+    return !GetReadOnly() && !GetClipboardText().empty();
   if (command_id == IDC_PASTE_AND_GO)
-    return !read_only() && model()->CanPasteAndGo(GetClipboardText());
+    return !GetReadOnly() && model()->CanPasteAndGo(GetClipboardText());
 
   // Menu item is only shown when it is valid.
   if (command_id == IDS_SHOW_URL)
@@ -1420,9 +1421,9 @@
   switch (command) {
     case ui::TextEditCommand::MOVE_UP:
     case ui::TextEditCommand::MOVE_DOWN:
-      return !read_only();
+      return !GetReadOnly();
     case ui::TextEditCommand::PASTE:
-      return !read_only() && !GetClipboardText().empty();
+      return !GetReadOnly() && !GetClipboardText().empty();
     default:
       return Textfield::IsTextEditCommandEnabled(command);
   }
@@ -1568,14 +1569,14 @@
       break;
 
     case ui::VKEY_PRIOR:
-      if (control || alt || shift || read_only())
+      if (control || alt || shift || GetReadOnly())
         return false;
       model()->OnUpOrDownKeyPressed(
           -static_cast<int>(model()->popup_model()->selected_line()));
       return true;
 
     case ui::VKEY_NEXT:
-      if (control || alt || shift || read_only())
+      if (control || alt || shift || GetReadOnly())
         return false;
       model()->OnUpOrDownKeyPressed(model()->result().size() -
                                     model()->popup_model()->selected_line() -
@@ -1807,8 +1808,9 @@
   if (base::FeatureList::IsEnabled(omnibox::kQueryInOmnibox)) {
     // If the user has not started editing the text, and we are not showing the
     // full URL, then provide a way to unelide via the context menu.
-    if (!read_only() && !model()->user_input_in_progress() &&
-        text() != controller()->GetLocationBarModel()->GetFormattedFullURL()) {
+    if (!GetReadOnly() && !model()->user_input_in_progress() &&
+        GetText() !=
+            controller()->GetLocationBarModel()->GetFormattedFullURL()) {
       menu_contents->AddItemWithStringId(IDS_SHOW_URL, IDS_SHOW_URL);
     }
   }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
index 48d1d5bd..43828136 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
@@ -160,7 +160,7 @@
   EXPECT_TRUE(data.HasString());
 
   omnibox_view_views->OnDrop(data);
-  EXPECT_EQ(input, omnibox_view_views->text());
+  EXPECT_EQ(input, omnibox_view_views->GetText());
   EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
   EXPECT_TRUE(omnibox_view_views->IsSelectAll());
   EXPECT_FALSE(
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
index 430da08..48eb680 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_unittest.cc
@@ -133,13 +133,13 @@
 }
 
 void TestingOmniboxView::EmphasizeURLComponents() {
-  UpdateTextStyle(text(), model()->CurrentTextIsURL(),
+  UpdateTextStyle(GetText(), model()->CurrentTextIsURL(),
                   model()->client()->GetSchemeClassifier());
 }
 
 void TestingOmniboxView::UpdatePopup() {
   ++update_popup_call_count_;
-  update_popup_text_ = text();
+  update_popup_text_ = GetText();
   update_popup_selection_range_ = GetSelectedRange();
 
   // The real view calls OmniboxEditModel::UpdateInput(), which sets input in
@@ -505,7 +505,8 @@
   omnibox_view()->model()->ResetDisplayTexts();
   omnibox_view()->RevertAll();
 
-  EXPECT_EQ(base::ASCIIToUTF16("https://example.com/"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("https://example.com/"),
+            omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 
   // Set the view text without updating the model's user text. This usually
@@ -513,23 +514,24 @@
   // the full URL to the user.
   omnibox_view()->SetWindowTextAndCaretPos(base::ASCIIToUTF16("view text"), 0,
                                            false, false);
-  EXPECT_EQ(base::ASCIIToUTF16("view text"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("view text"), omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 
   // Expect that on blur, we revert to the original text and are not in user
   // input mode.
   omnibox_textfield()->OnBlur();
-  EXPECT_EQ(base::ASCIIToUTF16("https://example.com/"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("https://example.com/"),
+            omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 
   // Now set user text, which is reflected into the model as well.
   omnibox_view()->SetUserText(base::ASCIIToUTF16("user text"));
-  EXPECT_EQ(base::ASCIIToUTF16("user text"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("user text"), omnibox_view()->GetText());
   EXPECT_TRUE(omnibox_view()->model()->user_input_in_progress());
 
   // Expect that on blur, if the text has been edited, stay in user input mode.
   omnibox_textfield()->OnBlur();
-  EXPECT_EQ(base::ASCIIToUTF16("user text"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("user text"), omnibox_view()->GetText());
   EXPECT_TRUE(omnibox_view()->model()->user_input_in_progress());
 }
 
@@ -539,11 +541,11 @@
   omnibox_view()->RevertAll();
 
   EXPECT_EQ(base::ASCIIToUTF16("https://permanent-text.com/"),
-            omnibox_view()->text());
+            omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 
   omnibox_view()->SetUserText(base::ASCIIToUTF16("user text"));
-  EXPECT_EQ(base::ASCIIToUTF16("user text"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("user text"), omnibox_view()->GetText());
   EXPECT_TRUE(omnibox_view()->model()->user_input_in_progress());
 
   // Expect that on Escape, the text is reverted to the permanent URL.
@@ -551,7 +553,7 @@
   omnibox_textfield()->OnKeyEvent(&escape);
 
   EXPECT_EQ(base::ASCIIToUTF16("https://permanent-text.com/"),
-            omnibox_view()->text());
+            omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 }
 
@@ -584,12 +586,12 @@
   // Enter keyword mode, but with no user text.
   omnibox_view()->model()->EnterKeywordModeForDefaultSearchProvider(
       OmniboxEventProto::KEYBOARD_SHORTCUT);
-  EXPECT_TRUE(omnibox_view()->text().empty());
+  EXPECT_TRUE(omnibox_view()->GetText().empty());
   EXPECT_FALSE(omnibox_view()->model()->keyword().empty());
 
   // Expect that on blur, stay in keyword mode.
   omnibox_textfield()->OnBlur();
-  EXPECT_TRUE(omnibox_view()->text().empty());
+  EXPECT_TRUE(omnibox_view()->GetText().empty());
   EXPECT_FALSE(omnibox_view()->model()->keyword().empty());
 }
 
@@ -818,12 +820,12 @@
   }
 
   void ExpectFullUrlDisplayed() {
-    EXPECT_EQ(base::UTF8ToUTF16(kFullUrl.spec()), omnibox_view()->text());
+    EXPECT_EQ(base::UTF8ToUTF16(kFullUrl.spec()), omnibox_view()->GetText());
     EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
   }
 
   bool IsElidedUrlDisplayed() {
-    return omnibox_view()->text() == base::ASCIIToUTF16("example.com") &&
+    return omnibox_view()->GetText() == base::ASCIIToUTF16("example.com") &&
            !omnibox_view()->model()->user_input_in_progress();
   }
 
@@ -1135,12 +1137,14 @@
                           ui::DomKey::FromCharacter('a'),
                           ui::EventTimeForNow());
   omnibox_textfield()->InsertChar(char_event);
-  EXPECT_EQ(base::ASCIIToUTF16("https://www.a.com/"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("https://www.a.com/"),
+            omnibox_view()->GetText());
   EXPECT_TRUE(omnibox_view()->model()->user_input_in_progress());
 
   // Now that we've edited the text, blurring should not re-elide the URL.
   BlurOmnibox();
-  EXPECT_EQ(base::ASCIIToUTF16("https://www.a.com/"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("https://www.a.com/"),
+            omnibox_view()->GetText());
   EXPECT_TRUE(omnibox_view()->model()->user_input_in_progress());
 }
 
@@ -1217,7 +1221,7 @@
     omnibox_view()->RevertAll();
 
     // Sanity check that Query in Omnibox is working with Steady State Elisions.
-    EXPECT_EQ(base::ASCIIToUTF16("foo query"), omnibox_view()->text());
+    EXPECT_EQ(base::ASCIIToUTF16("foo query"), omnibox_view()->GetText());
 
     // Focus the Omnibox.
     SendMouseClick(0);
@@ -1230,7 +1234,7 @@
   // end of the search query.
   omnibox_textfield_view()->OnKeyPressed(
       ui::KeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_RIGHT, 0));
-  EXPECT_EQ(base::ASCIIToUTF16("foo query"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("foo query"), omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 
   size_t start, end;
@@ -1243,7 +1247,7 @@
        UnelideFromModel) {
   // Uneliding without exiting Query in Omnibox should do nothing.
   omnibox_view()->model()->Unelide(false /* exit_query_in_omnibox */);
-  EXPECT_EQ(base::ASCIIToUTF16("foo query"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("foo query"), omnibox_view()->GetText());
   {
     size_t start, end;
     omnibox_view()->GetSelectionBounds(&start, &end);
@@ -1254,7 +1258,7 @@
   // Uneliding and exiting Query in Omnibox should reveal the full URL.
   omnibox_view()->model()->Unelide(true /* exit_query_in_omnibox */);
   EXPECT_EQ(base::ASCIIToUTF16(kValidSearchResultsPage.spec()),
-            omnibox_view()->text());
+            omnibox_view()->GetText());
   {
     size_t start, end;
     omnibox_view()->GetSelectionBounds(&start, &end);
@@ -1270,7 +1274,7 @@
   location_bar_model()->set_display_search_terms(base::ASCIIToUTF16("foo:bar"));
   omnibox_view()->model()->ResetDisplayTexts();
   omnibox_view()->RevertAll();
-  EXPECT_EQ(base::ASCIIToUTF16("foo:bar"), omnibox_view()->text());
+  EXPECT_EQ(base::ASCIIToUTF16("foo:bar"), omnibox_view()->GetText());
   EXPECT_FALSE(omnibox_view()->model()->user_input_in_progress());
 
   omnibox_view()->ResetEmphasisTestState();
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_view.cc b/chrome/browser/ui/views/page_action/page_action_icon_view.cc
index 82cef23..c009ff7 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_view.cc
+++ b/chrome/browser/ui/views/page_action/page_action_icon_view.cc
@@ -23,6 +23,12 @@
 #include "ui/views/controls/focus_ring.h"
 #include "ui/views/style/platform_style.h"
 
+std::unique_ptr<views::Border>
+PageActionIconView::Delegate::GetPageActionIconBorder() const {
+  return views::CreateEmptyBorder(
+      GetLayoutInsets(LOCATION_BAR_ICON_INTERIOR_PADDING));
+}
+
 bool PageActionIconView::Delegate::IsLocationBarUserInputInProgress() const {
   return false;
 }
@@ -211,6 +217,5 @@
 }
 
 void PageActionIconView::UpdateBorder() {
-  SetBorder(views::CreateEmptyBorder(
-      GetLayoutInsets(LOCATION_BAR_ICON_INTERIOR_PADDING)));
+  SetBorder(delegate_->GetPageActionIconBorder());
 }
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_view.h b/chrome/browser/ui/views/page_action/page_action_icon_view.h
index 4c57128..8d6f6155 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_view.h
+++ b/chrome/browser/ui/views/page_action/page_action_icon_view.h
@@ -44,6 +44,10 @@
 
     virtual content::WebContents* GetWebContentsForPageActionIconView() = 0;
 
+    // Returns the border the icon should use. It depends on what kind of
+    // delegate this icon has.
+    virtual std::unique_ptr<views::Border> GetPageActionIconBorder() const;
+
     // Delegate should override and return true when the user is editing the
     // location bar contents.
     virtual bool IsLocationBarUserInputInProgress() const;
diff --git a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
index 9bbc5a0c..17955d9 100644
--- a/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/contact_info_editor_view_controller.cc
@@ -141,7 +141,7 @@
     autofill::AutofillProfile* profile) {
   for (const auto& field : text_fields()) {
     profile->SetInfo(autofill::AutofillType(field.second.type),
-                     field.first->text(), state()->GetApplicationLocale());
+                     field.first->GetText(), state()->GetApplicationLocale());
   }
   profile->set_origin(autofill::kSettingsOrigin);
 }
@@ -210,14 +210,14 @@
   autofill::AutofillProfile* invalid_contact_profile =
       controller_->state()->invalid_contact_profile();
   if (invalid_contact_profile && error_message &&
-      textfield->text() ==
+      textfield->GetText() ==
           controller_->GetValueForType(*invalid_contact_profile, field_.type)) {
     *error_message = controller_->spec()->GetPayerError(field_.type);
     if (!error_message->empty())
       return false;
   }
 
-  if (textfield->text().empty()) {
+  if (textfield->GetText().empty()) {
     is_valid = false;
     if (error_message) {
       *error_message = l10n_util::GetStringUTF16(
@@ -228,7 +228,7 @@
       case autofill::PHONE_HOME_WHOLE_NUMBER: {
         const std::string default_region_code =
             autofill::AutofillCountry::CountryCodeForLocale(locale_);
-        if (!autofill::IsPossiblePhoneNumber(textfield->text(),
+        if (!autofill::IsPossiblePhoneNumber(textfield->GetText(),
                                              default_region_code)) {
           is_valid = false;
           if (error_message) {
@@ -240,7 +240,7 @@
       }
 
       case autofill::EMAIL_ADDRESS: {
-        if (!autofill::IsValidEmailAddress(textfield->text())) {
+        if (!autofill::IsValidEmailAddress(textfield->GetText())) {
           is_valid = false;
           if (error_message) {
             *error_message = l10n_util::GetStringUTF16(
diff --git a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
index f485ae8..1834c874f 100644
--- a/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/credit_card_editor_view_controller.cc
@@ -431,7 +431,7 @@
     DCHECK_EQ(autofill::CREDIT_CARD,
               autofill::AutofillType(field.second.type).group());
     credit_card.SetInfo(autofill::AutofillType(field.second.type),
-                        field.first->text(), locale);
+                        field.first->GetText(), locale);
   }
   for (const auto& field : comboboxes()) {
     // ValidatingCombobox* is the key, EditorField is the value.
@@ -666,7 +666,7 @@
 bool CreditCardEditorViewController::CreditCardValidationDelegate::
     IsValidTextfield(views::Textfield* textfield,
                      base::string16* error_message) {
-  return ValidateValue(textfield->text(), error_message);
+  return ValidateValue(textfield->GetText(), error_message);
 }
 
 bool CreditCardEditorViewController::CreditCardValidationDelegate::
@@ -680,7 +680,7 @@
   if (field_.type == autofill::CREDIT_CARD_NUMBER) {
     std::string basic_card_network =
         autofill::data_util::GetPaymentRequestData(
-            autofill::CreditCard::GetCardNetwork(textfield->text()))
+            autofill::CreditCard::GetCardNetwork(textfield->GetText()))
             .basic_card_issuer_network;
     controller_->SelectBasicCardNetworkIcon(basic_card_network);
   }
@@ -691,7 +691,7 @@
     return true;
 
   base::string16 error_message;
-  bool is_valid = ValidateValue(textfield->text(), &error_message);
+  bool is_valid = ValidateValue(textfield->GetText(), &error_message);
   controller_->DisplayErrorMessageForField(field_.type, error_message);
 
   return is_valid;
diff --git a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc
index cdaaf3076..a3d005f 100644
--- a/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc
+++ b/chrome/browser/ui/views/payments/cvc_unmask_view_controller.cc
@@ -291,7 +291,7 @@
 }
 
 void CvcUnmaskViewController::CvcConfirmed() {
-  const base::string16& cvc = cvc_field_->text();
+  const base::string16& cvc = cvc_field_->GetText();
   if (unmask_delegate_) {
     autofill::CardUnmaskDelegate::UnmaskResponse response;
     response.cvc = cvc;
@@ -323,7 +323,7 @@
 
 void CvcUnmaskViewController::UpdatePayButtonState() {
   base::string16 trimmed_text;
-  base::TrimWhitespace(cvc_field_->text(), base::TRIM_ALL, &trimmed_text);
+  base::TrimWhitespace(cvc_field_->GetText(), base::TRIM_ALL, &trimmed_text);
   bool cvc_valid = autofill::IsValidCreditCardSecurityCode(
       trimmed_text, credit_card_.network());
   cvc_field_->SetInvalid(!cvc_valid);
diff --git a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
index 81062f8..fee070f4 100644
--- a/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
+++ b/chrome/browser/ui/views/payments/payment_request_browsertest_base.cc
@@ -693,7 +693,7 @@
       static_cast<ValidatingTextfield*>(delegate_->dialog_view()->GetViewByID(
           EditorViewController::GetInputFieldViewId(type)));
   DCHECK(textfield);
-  return textfield->text();
+  return textfield->GetText();
 }
 
 void PaymentRequestBrowserTestBase::SetEditorTextfieldValue(
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
index 56727e0..82a40c4 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller.cc
@@ -253,7 +253,7 @@
 bool ShippingAddressEditorViewController::ShippingAddressValidationDelegate::
     IsValidTextfield(views::Textfield* textfield,
                      base::string16* error_message) {
-  return ValidateValue(textfield->text(), error_message);
+  return ValidateValue(textfield->GetText(), error_message);
 }
 
 bool ShippingAddressEditorViewController::ShippingAddressValidationDelegate::
@@ -268,7 +268,7 @@
     return true;
 
   base::string16 error_message;
-  bool is_valid = ValidateValue(textfield->text(), &error_message);
+  bool is_valid = ValidateValue(textfield->GetText(), &error_message);
   controller_->DisplayErrorMessageForField(field_.type, error_message);
   return is_valid;
 }
@@ -548,12 +548,13 @@
     // ValidatingTextfield* is the key, EditorField is the value.
     if (field.first->IsValid()) {
       success =
-          profile->SetInfo(field.second.type, field.first->text(), locale);
+          profile->SetInfo(field.second.type, field.first->GetText(), locale);
     } else {
       success = false;
     }
     LOG_IF(ERROR, !success && !ignore_errors)
-        << "Can't setinfo(" << field.second.type << ", " << field.first->text();
+        << "Can't setinfo(" << field.second.type << ", "
+        << field.first->GetText();
     if (!success && !ignore_errors)
       return false;
   }
diff --git a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
index 855feb37..14f5431 100644
--- a/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
+++ b/chrome/browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc
@@ -104,7 +104,7 @@
     if (!textfield)
       return false;
     if (textfield_text)
-      *textfield_text = textfield->text();
+      *textfield_text = textfield->GetText();
     return true;
   }
 
@@ -416,7 +416,7 @@
       if (textfield) {
         // The zip field will be populated after switching to a country for
         // which the profile has a zip set.
-        EXPECT_TRUE(textfield->text().empty() ||
+        EXPECT_TRUE(textfield->GetText().empty() ||
                     type == autofill::ADDRESS_HOME_ZIP)
             << type;
         SetFieldTestValue(type);
@@ -621,7 +621,7 @@
       static_cast<views::Textfield*>(dialog_view()->GetViewByID(
           EditorViewController::GetInputFieldViewId(autofill::NAME_FULL)));
   DCHECK(textfield);
-  EXPECT_TRUE(textfield->text().empty());
+  EXPECT_TRUE(textfield->GetText().empty());
   // Field is not invalid because there is nothing in it.
   EXPECT_FALSE(textfield->invalid());
   EXPECT_TRUE(textfield->HasFocus());
@@ -647,7 +647,7 @@
       static_cast<views::Textfield*>(dialog_view()->GetViewByID(
           EditorViewController::GetInputFieldViewId(autofill::NAME_FULL)));
   DCHECK(textfield);
-  EXPECT_FALSE(textfield->text().empty());
+  EXPECT_FALSE(textfield->GetText().empty());
   EXPECT_FALSE(textfield->invalid());
   EXPECT_FALSE(textfield->HasFocus());
 
diff --git a/chrome/browser/ui/views/payments/validating_textfield.cc b/chrome/browser/ui/views/payments/validating_textfield.cc
index 5bd7446..b738b5c 100644
--- a/chrome/browser/ui/views/payments/validating_textfield.cc
+++ b/chrome/browser/ui/views/payments/validating_textfield.cc
@@ -22,8 +22,8 @@
   if (!being_removed_)
     Validate();
 
-  if (!text().empty() && delegate_->ShouldFormat())
-    SetText(delegate_->Format(text()));
+  if (!GetText().empty() && delegate_->ShouldFormat())
+    SetText(delegate_->Format(GetText()));
 }
 
 void ValidatingTextfield::ViewHierarchyChanged(
@@ -34,9 +34,9 @@
 
 void ValidatingTextfield::OnContentsChanged() {
   // This is called on every keystroke.
-  if (!text().empty() && GetCursorPosition() == text().length() &&
+  if (!GetText().empty() && GetCursorPosition() == GetText().length() &&
       delegate_->ShouldFormat()) {
-    SetText(delegate_->Format(text()));
+    SetText(delegate_->Format(GetText()));
   }
 
   Validate();
diff --git a/chrome/browser/ui/views/payments/validating_textfield_unittest.cc b/chrome/browser/ui/views/payments/validating_textfield_unittest.cc
index a37c1b0..5d328f2 100644
--- a/chrome/browser/ui/views/payments/validating_textfield_unittest.cc
+++ b/chrome/browser/ui/views/payments/validating_textfield_unittest.cc
@@ -41,7 +41,7 @@
     bool IsValidTextfield(views::Textfield* textfield,
                           base::string16* error_message) override {
       // We really don't like textfields with more than 5 characters in them.
-      return textfield->text().size() <= 5u;
+      return textfield->GetText().size() <= 5u;
     }
     bool IsValidCombobox(views::Combobox* combobox,
                          base::string16* error_message) override {
diff --git a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
index 87a086a..9771d7b 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.cc
@@ -126,6 +126,14 @@
   return browser_->tab_strip_model()->GetActiveWebContents();
 }
 
+std::unique_ptr<views::Border>
+ToolbarPageActionIconContainerView::GetPageActionIconBorder() const {
+  // With this border, the icon will have the same ink drop shape as toolbar
+  // buttons.
+  return views::CreateEmptyBorder(ChromeLayoutProvider::Get()->GetInsetsMetric(
+      views::InsetsMetric::INSETS_LABEL_BUTTON));
+}
+
 void ToolbarPageActionIconContainerView::OnThemeChanged() {
   // Update icon color.
   UpdateAllIcons();
diff --git a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h
index dee62ab..19f7646 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h
+++ b/chrome/browser/ui/views/toolbar/toolbar_page_action_icon_container_view.h
@@ -44,6 +44,7 @@
   // PageActionIconView::Delegate:
   SkColor GetPageActionInkDropColor() const override;
   content::WebContents* GetWebContentsForPageActionIconView() override;
+  std::unique_ptr<views::Border> GetPageActionIconBorder() const override;
 
   // views::View:
   void OnThemeChanged() override;
diff --git a/chrome/browser/ui/webui/password_manager_internals/OWNERS b/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS
similarity index 73%
rename from chrome/browser/ui/webui/password_manager_internals/OWNERS
rename to chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS
index 034df86..85ef92a8 100644
--- a/chrome/browser/ui/webui/password_manager_internals/OWNERS
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/OWNERS
@@ -1,3 +1,4 @@
+battre@chromium.org
 dvadym@chromium.org
 
 # COMPONENT: UI>Browser>Passwords
diff --git a/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc b/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc
new file mode 100644
index 0000000..a6231ff
--- /dev/null
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.cc
@@ -0,0 +1,27 @@
+// Copyright 2019 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 "chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.h"
+
+#include "base/bind.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.h"
+#include "chrome/common/url_constants.h"
+#include "components/autofill/content/browser/autofill_log_router_factory.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+
+AutofillInternalsUI::AutofillInternalsUI(content::WebUI* web_ui)
+    : WebUIController(web_ui) {
+  Profile* profile = Profile::FromWebUI(web_ui);
+  content::WebUIDataSource::Add(profile,
+                                autofill::CreateInternalsHTMLSource(
+                                    chrome::kChromeUIAutofillInternalsHost));
+  web_ui->AddMessageHandler(std::make_unique<autofill::InternalsUIHandler>(
+      "setUpAutofillInternals",
+      base::BindRepeating(
+          &autofill::AutofillLogRouterFactory::GetForBrowserContext)));
+}
+
+AutofillInternalsUI::~AutofillInternalsUI() = default;
diff --git a/chrome/browser/ui/webui/autofill_internals_ui.h b/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.h
similarity index 63%
rename from chrome/browser/ui/webui/autofill_internals_ui.h
rename to chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.h
index 3a22afcb..c38a6d9b 100644
--- a/chrome/browser/ui/webui/autofill_internals_ui.h
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_AUTOFILL_INTERNALS_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_AUTOFILL_INTERNALS_UI_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_AUTOFILL_INTERNALS_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_AUTOFILL_INTERNALS_UI_H_
 
 #include "base/macros.h"
 #include "content/public/browser/web_ui.h"
@@ -18,4 +18,4 @@
   DISALLOW_COPY_AND_ASSIGN(AutofillInternalsUI);
 };
 
-#endif  // CHROME_BROWSER_UI_WEBUI_AUTOFILL_INTERNALS_UI_H_
+#endif  // CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_AUTOFILL_INTERNALS_UI_H_
diff --git a/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc b/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc
new file mode 100644
index 0000000..144d4bea
--- /dev/null
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.cc
@@ -0,0 +1,106 @@
+// Copyright 2014 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 "chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.h"
+
+#include "base/values.h"
+#include "chrome/browser/chrome_content_browser_client.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/channel_info.h"
+#include "components/autofill/core/browser/logging/log_router.h"
+#include "components/grit/components_resources.h"
+#include "components/version_info/version_info.h"
+#include "components/version_ui/version_handler_helper.h"
+#include "components/version_ui/version_ui_constants.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+
+using autofill::LogRouter;
+
+namespace autofill {
+
+content::WebUIDataSource* CreateInternalsHTMLSource(
+    const std::string& source_name) {
+  content::WebUIDataSource* source =
+      content::WebUIDataSource::Create(source_name);
+  source->AddResourcePath("autofill_and_password_manager_internals.js",
+                          IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_JS);
+  source->AddResourcePath("autofill_and_password_manager_internals.css",
+                          IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_CSS);
+  source->SetDefaultResource(IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_HTML);
+  // Data strings:
+  source->AddString(version_ui::kVersion, version_info::GetVersionNumber());
+  source->AddString(version_ui::kOfficial, version_info::IsOfficialBuild()
+                                               ? "official"
+                                               : "Developer build");
+  source->AddString(version_ui::kVersionModifier, chrome::GetChannelName());
+  source->AddString(version_ui::kCL, version_info::GetLastChange());
+  source->AddString(version_ui::kUserAgent, GetUserAgent());
+  return source;
+}
+
+InternalsUIHandler::InternalsUIHandler(
+    std::string call_on_load,
+    GetLogRouterFunction get_log_router_function)
+    : call_on_load_(std::move(call_on_load)),
+      get_log_router_function_(std::move(get_log_router_function)) {}
+
+InternalsUIHandler::~InternalsUIHandler() {
+  EndSubscription();
+}
+
+void InternalsUIHandler::RegisterMessages() {
+  web_ui()->RegisterMessageCallback(
+      "loaded", base::BindRepeating(&InternalsUIHandler::OnLoaded,
+                                    base::Unretained(this)));
+}
+
+void InternalsUIHandler::OnJavascriptAllowed() {
+  StartSubscription();
+}
+
+void InternalsUIHandler::OnJavascriptDisallowed() {
+  EndSubscription();
+}
+
+void InternalsUIHandler::OnLoaded(const base::ListValue* args) {
+  AllowJavascript();
+  CallJavascriptFunction(call_on_load_);
+  CallJavascriptFunction(
+      "notifyAboutIncognito",
+      base::Value(Profile::FromWebUI(web_ui())->IsIncognitoProfile()));
+  CallJavascriptFunction("notifyAboutVariations",
+                         *version_ui::GetVariationsList());
+}
+
+void InternalsUIHandler::StartSubscription() {
+  LogRouter* log_router =
+      get_log_router_function_.Run(Profile::FromWebUI(web_ui()));
+  if (!log_router)
+    return;
+
+  registered_with_log_router_ = true;
+
+  const auto& past_logs = log_router->RegisterReceiver(this);
+  for (const auto& entry : past_logs)
+    LogEntry(entry);
+}
+
+void InternalsUIHandler::EndSubscription() {
+  if (!registered_with_log_router_)
+    return;
+  registered_with_log_router_ = false;
+  LogRouter* log_router =
+      get_log_router_function_.Run(Profile::FromWebUI(web_ui()));
+  if (log_router)
+    log_router->UnregisterReceiver(this);
+}
+
+void InternalsUIHandler::LogEntry(const base::Value& entry) {
+  if (!registered_with_log_router_ || entry.is_none())
+    return;
+  CallJavascriptFunction("addRawLog", entry);
+}
+
+}  // namespace autofill
diff --git a/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.h b/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.h
new file mode 100644
index 0000000..8a6594f
--- /dev/null
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.h
@@ -0,0 +1,70 @@
+// Copyright 2014 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 CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_INTERNALS_UI_HANDLER_H_
+#define CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_INTERNALS_UI_HANDLER_H_
+
+#include <string>
+
+#include "base/bind.h"
+#include "base/macros.h"
+#include "components/autofill/core/browser/logging/log_receiver.h"
+#include "content/public/browser/web_ui_message_handler.h"
+
+namespace autofill {
+class LogRouter;
+}
+
+namespace content {
+class BrowserContext;
+class WebUIDataSource;
+}  // namespace content
+
+namespace autofill {
+content::WebUIDataSource* CreateInternalsHTMLSource(
+    const std::string& source_name);
+
+// UI handler for chrome://password-manager-internals and
+// chrome://autofill-internals that takes care of subscribing to the autofill
+// logging instance.
+class InternalsUIHandler : public content::WebUIMessageHandler,
+                           public autofill::LogReceiver {
+ public:
+  using GetLogRouterFunction =
+      base::RepeatingCallback<autofill::LogRouter*(content::BrowserContext*)>;
+
+  InternalsUIHandler(std::string call_on_load,
+                     GetLogRouterFunction get_log_router_function);
+  ~InternalsUIHandler() override;
+
+ private:
+  // content::WebUIMessageHandler:
+  void RegisterMessages() override;
+
+  // Implements content::WebUIMessageHandler.
+  void OnJavascriptAllowed() override;
+  void OnJavascriptDisallowed() override;
+
+  // LogReceiver implementation.
+  void LogEntry(const base::Value& entry) override;
+
+  void StartSubscription();
+  void EndSubscription();
+
+  // JavaScript call handler.
+  void OnLoaded(const base::ListValue* args);
+
+  // JavaScript function to be called on load.
+  std::string call_on_load_;
+  GetLogRouterFunction get_log_router_function_;
+
+  // Whether |this| is registered as a log receiver with the LogRouter.
+  bool registered_with_log_router_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(InternalsUIHandler);
+};
+
+}  // namespace autofill
+
+#endif  // CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_INTERNALS_UI_HANDLER_H_
diff --git a/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc b/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc
new file mode 100644
index 0000000..a43a8d4
--- /dev/null
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.cc
@@ -0,0 +1,27 @@
+// Copyright 2014 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 "chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h"
+
+#include "base/bind.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/internals_ui_handler.h"
+#include "chrome/common/url_constants.h"
+#include "components/password_manager/content/browser/password_manager_log_router_factory.h"
+#include "content/public/browser/web_ui.h"
+#include "content/public/browser/web_ui_data_source.h"
+
+PasswordManagerInternalsUI::PasswordManagerInternalsUI(content::WebUI* web_ui)
+    : WebUIController(web_ui) {
+  Profile* profile = Profile::FromWebUI(web_ui);
+  content::WebUIDataSource::Add(
+      profile, autofill::CreateInternalsHTMLSource(
+                   chrome::kChromeUIPasswordManagerInternalsHost));
+  web_ui->AddMessageHandler(std::make_unique<autofill::InternalsUIHandler>(
+      "setUpPasswordManagerInternals",
+      base::BindRepeating(&password_manager::PasswordManagerLogRouterFactory::
+                              GetForBrowserContext)));
+}
+
+PasswordManagerInternalsUI::~PasswordManagerInternalsUI() = default;
diff --git a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h b/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h
similarity index 63%
rename from chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h
rename to chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h
index 586ce8e..19d8ed9 100644
--- a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_UI_WEBUI_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_H_
+#ifndef CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_H_
 
 #include "base/macros.h"
 #include "content/public/browser/web_ui.h"
@@ -18,4 +18,4 @@
   DISALLOW_COPY_AND_ASSIGN(PasswordManagerInternalsUI);
 };
 
-#endif  // CHROME_BROWSER_UI_WEBUI_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_H_
+#endif  // CHROME_BROWSER_UI_WEBUI_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_PASSWORD_MANAGER_INTERNALS_UI_H_
diff --git a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc b/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc
similarity index 95%
rename from chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc
rename to chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc
index 5d84d30..0a50d409 100644
--- a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
+#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "chrome/test/base/web_ui_browser_test.h"
@@ -31,15 +31,14 @@
                                     WindowOpenDisposition disposition);
 
  private:
-  PasswordManagerInternalsUI* controller_;
+  PasswordManagerInternalsUI* controller_ = nullptr;
 };
 
 PasswordManagerInternalsWebUIBrowserTest::
-    PasswordManagerInternalsWebUIBrowserTest()
-    : controller_(NULL) {}
+    PasswordManagerInternalsWebUIBrowserTest() = default;
 
 PasswordManagerInternalsWebUIBrowserTest::
-    ~PasswordManagerInternalsWebUIBrowserTest() {}
+    ~PasswordManagerInternalsWebUIBrowserTest() = default;
 
 void PasswordManagerInternalsWebUIBrowserTest::SetUpOnMainThread() {
   WebUIBrowserTest::SetUpOnMainThread();
@@ -64,9 +63,7 @@
   std::string url_string("chrome://");
   url_string += chrome::kChromeUIPasswordManagerInternalsHost;
   ui_test_utils::NavigateToURLWithDisposition(
-      browser,
-      GURL(url_string),
-      disposition,
+      browser, GURL(url_string), disposition,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
   controller_ = static_cast<PasswordManagerInternalsUI*>(
       GetWebContents()->GetWebUI()->GetController());
diff --git a/chrome/browser/ui/webui/autofill_internals_ui.cc b/chrome/browser/ui/webui/autofill_internals_ui.cc
deleted file mode 100644
index 489a5d6..0000000
--- a/chrome/browser/ui/webui/autofill_internals_ui.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2019 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 "chrome/browser/ui/webui/autofill_internals_ui.h"
-
-#include <string>
-
-#include "base/bind.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/browser_resources.h"
-#include "components/autofill/content/browser/autofill_log_router_factory.h"
-#include "components/autofill/core/browser/logging/log_receiver.h"
-#include "components/autofill/core/browser/logging/log_router.h"
-#include "components/grit/components_resources.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "content/public/browser/web_ui_message_handler.h"
-
-using autofill::AutofillLogRouterFactory;
-using autofill::LogRouter;
-
-namespace {
-
-content::WebUIDataSource* CreateAutofillInternalsHTMLSource() {
-  content::WebUIDataSource* source =
-      content::WebUIDataSource::Create(chrome::kChromeUIAutofillInternalsHost);
-  source->AddResourcePath("autofill_and_password_manager_internals.js",
-                          IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_JS);
-  source->AddResourcePath("autofill_and_password_manager_internals.css",
-                          IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_CSS);
-  source->SetDefaultResource(IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_HTML);
-  return source;
-}
-
-// Message handler for AutofillInternalsLoggingImpl. The purpose of this class
-// is to enable safe calls to JavaScript, while the renderer is fully loaded.
-class AutofillInternalsUIHandler : public content::WebUIMessageHandler,
-                                   public autofill::LogReceiver {
- public:
-  AutofillInternalsUIHandler() = default;
-  ~AutofillInternalsUIHandler() override;
-
- private:
-  // content::WebUIMessageHandler:
-  void RegisterMessages() override;
-
-  // Implements content::WebUIMessageHandler.
-  void OnJavascriptAllowed() override;
-  void OnJavascriptDisallowed() override;
-
-  // LogReceiver implementation.
-  void LogEntry(const base::Value& entry) override;
-
-  void StartSubscription();
-  void EndSubscription();
-
-  // JavaScript call handler.
-  void OnLoaded(const base::ListValue* args);
-
-  // Whether |this| is registered as a log receiver with the LogRouter.
-  bool registered_with_log_router_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(AutofillInternalsUIHandler);
-};
-
-AutofillInternalsUIHandler::~AutofillInternalsUIHandler() {
-  EndSubscription();
-}
-
-void AutofillInternalsUIHandler::RegisterMessages() {
-  web_ui()->RegisterMessageCallback(
-      "loaded", base::BindRepeating(&AutofillInternalsUIHandler::OnLoaded,
-                                    base::Unretained(this)));
-}
-
-void AutofillInternalsUIHandler::OnJavascriptAllowed() {
-  StartSubscription();
-}
-
-void AutofillInternalsUIHandler::OnJavascriptDisallowed() {
-  EndSubscription();
-}
-
-void AutofillInternalsUIHandler::OnLoaded(const base::ListValue* args) {
-  AllowJavascript();
-  CallJavascriptFunction("setUpAutofillInternals");
-  CallJavascriptFunction(
-      "notifyAboutIncognito",
-      base::Value(Profile::FromWebUI(web_ui())->IsIncognitoProfile()));
-}
-
-void AutofillInternalsUIHandler::LogEntry(const base::Value& entry) {
-  if (!registered_with_log_router_ || entry.is_none())
-    return;
-  CallJavascriptFunction("addRawLog", entry);
-}
-
-void AutofillInternalsUIHandler::StartSubscription() {
-  LogRouter* log_router = AutofillLogRouterFactory::GetForBrowserContext(
-      Profile::FromWebUI(web_ui()));
-
-  if (!log_router)
-    return;
-
-  registered_with_log_router_ = true;
-
-  const auto& past_logs = log_router->RegisterReceiver(this);
-  for (const auto& entry : past_logs)
-    LogEntry(entry);
-}
-
-void AutofillInternalsUIHandler::EndSubscription() {
-  if (!registered_with_log_router_)
-    return;
-  registered_with_log_router_ = false;
-  LogRouter* log_router = AutofillLogRouterFactory::GetForBrowserContext(
-      Profile::FromWebUI(web_ui()));
-  if (log_router)
-    log_router->UnregisterReceiver(this);
-}
-
-}  // namespace
-
-AutofillInternalsUI::AutofillInternalsUI(content::WebUI* web_ui)
-    : WebUIController(web_ui) {
-  Profile* profile = Profile::FromWebUI(web_ui);
-  content::WebUIDataSource::Add(profile, CreateAutofillInternalsHTMLSource());
-  web_ui->AddMessageHandler(std::make_unique<AutofillInternalsUIHandler>());
-}
-
-AutofillInternalsUI::~AutofillInternalsUI() = default;
diff --git a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
index c50c38a..2dc037e 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
@@ -18,6 +18,7 @@
 
   deps = [
     ":mojo_bindings",
+    "//chrome/browser/resources/bluetooth_internals:resources",
     "//chrome/common",
     "//content/public/browser",
     "//device/bluetooth",
diff --git a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
index 513a4d8..b501efc 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
+++ b/chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.cc
@@ -8,7 +8,8 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_handler.h"
 #include "chrome/common/url_constants.h"
-#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/bluetooth_internals_resources.h"
+#include "chrome/grit/bluetooth_internals_resources_map.h"
 #include "content/public/browser/web_ui_data_source.h"
 
 BluetoothInternalsUI::BluetoothInternalsUI(content::WebUI* web_ui)
@@ -19,48 +20,17 @@
 
   // Add required resources.
   html_source->AddResourcePath("adapter.mojom-lite.js",
-                               IDR_BLUETOOTH_ADAPTER_MOJO_JS);
-  html_source->AddResourcePath("adapter_broker.js",
-                               IDR_BLUETOOTH_INTERNALS_ADAPTER_BROKER_JS);
-  html_source->AddResourcePath("adapter_page.js",
-                               IDR_BLUETOOTH_INTERNALS_ADAPTER_PAGE_JS);
-  html_source->AddResourcePath("bluetooth_internals.css",
-                               IDR_BLUETOOTH_INTERNALS_CSS);
-  html_source->AddResourcePath("bluetooth_internals.js",
-                               IDR_BLUETOOTH_INTERNALS_JS);
+                               IDR_BLUETOOTH_INTERNALS_ADAPTER_MOJO_JS);
+  html_source->AddResourcePath("device.mojom-lite.js",
+                               IDR_BLUETOOTH_INTERNALS_DEVICE_MOJO_JS);
   html_source->AddResourcePath("bluetooth_internals.mojom-lite.js",
                                IDR_BLUETOOTH_INTERNALS_MOJO_JS);
-  html_source->AddResourcePath("characteristic_list.js",
-                               IDR_BLUETOOTH_INTERNALS_CHARACTERISTIC_LIST_JS);
-  html_source->AddResourcePath("descriptor_list.js",
-                               IDR_BLUETOOTH_INTERNALS_DESCRIPTOR_LIST_JS);
-  html_source->AddResourcePath("device.mojom-lite.js",
-                               IDR_BLUETOOTH_DEVICE_MOJO_JS);
-  html_source->AddResourcePath("device_broker.js",
-                               IDR_BLUETOOTH_INTERNALS_DEVICE_BROKER_JS);
-  html_source->AddResourcePath("device_collection.js",
-                               IDR_BLUETOOTH_INTERNALS_DEVICE_COLLECTION_JS);
-  html_source->AddResourcePath("device_details_page.js",
-                               IDR_BLUETOOTH_INTERNALS_DEVICE_DETAILS_PAGE_JS);
-  html_source->AddResourcePath("device_table.js",
-                               IDR_BLUETOOTH_INTERNALS_DEVICE_TABLE_JS);
-  html_source->AddResourcePath("devices_page.js",
-                               IDR_BLUETOOTH_INTERNALS_DEVICES_PAGE_JS);
-  html_source->AddResourcePath("expandable_list.js",
-                               IDR_BLUETOOTH_INTERNALS_EXPANDABLE_LIST_JS);
-  html_source->AddResourcePath("object_fieldset.js",
-                               IDR_BLUETOOTH_INTERNALS_OBJECT_FIELDSET_JS);
-  html_source->AddResourcePath("service_list.js",
-                               IDR_BLUETOOTH_INTERNALS_SERVICE_LIST_JS);
-  html_source->AddResourcePath("sidebar.js",
-                               IDR_BLUETOOTH_INTERNALS_SIDEBAR_JS);
-  html_source->AddResourcePath("snackbar.js",
-                               IDR_BLUETOOTH_INTERNALS_SNACKBAR_JS);
   html_source->AddResourcePath("uuid.mojom-lite.js",
-                               IDR_BLUETOOTH_UUID_MOJO_JS);
-  html_source->AddResourcePath("value_control.js",
-                               IDR_BLUETOOTH_INTERNALS_VALUE_CONTROL_JS);
-
+                               IDR_BLUETOOTH_INTERNALS_UUID_MOJO_JS);
+  for (size_t i = 0; i < kBluetoothInternalsResourcesSize; i++) {
+    html_source->AddResourcePath(kBluetoothInternalsResources[i].name,
+                                 kBluetoothInternalsResources[i].value);
+  }
   html_source->SetDefaultResource(IDR_BLUETOOTH_INTERNALS_HTML);
 
   Profile* profile = Profile::FromWebUI(web_ui);
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 6b43fff..7acbe18 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -22,7 +22,8 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/search/suggestions/suggestions_ui.h"
 #include "chrome/browser/ui/webui/about_ui.h"
-#include "chrome/browser/ui/webui/autofill_internals_ui.h"
+#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/autofill_internals_ui.h"
+#include "chrome/browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui.h"
 #include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h"
 #include "chrome/browser/ui/webui/chromeos/account_manager_welcome_ui.h"
 #include "chrome/browser/ui/webui/chromeos/account_migration_welcome_ui.h"
@@ -51,7 +52,6 @@
 #include "chrome/browser/ui/webui/notifications_internals/notifications_internals_ui.h"
 #include "chrome/browser/ui/webui/ntp_tiles_internals_ui.h"
 #include "chrome/browser/ui/webui/omnibox/omnibox_ui.h"
-#include "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
 #include "chrome/browser/ui/webui/policy_ui.h"
 #include "chrome/browser/ui/webui/predictors/predictors_ui.h"
 #include "chrome/browser/ui/webui/quota_internals/quota_internals_ui.h"
diff --git a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.cc b/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.cc
deleted file mode 100644
index 5e92515c3..0000000
--- a/chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2014 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 "chrome/browser/ui/webui/password_manager_internals/password_manager_internals_ui.h"
-
-#include "base/values.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/url_constants.h"
-#include "components/autofill/core/browser/logging/log_receiver.h"
-#include "components/autofill/core/browser/logging/log_router.h"
-#include "components/grit/components_resources.h"
-#include "components/password_manager/content/browser/password_manager_log_router_factory.h"
-#include "content/public/browser/web_contents.h"
-#include "content/public/browser/web_ui.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "content/public/browser/web_ui_message_handler.h"
-#include "net/base/escape.h"
-
-using autofill::LogRouter;
-using password_manager::PasswordManagerLogRouterFactory;
-
-namespace {
-
-content::WebUIDataSource* CreatePasswordManagerInternalsHTMLSource() {
-  content::WebUIDataSource* source = content::WebUIDataSource::Create(
-      chrome::kChromeUIPasswordManagerInternalsHost);
-  source->AddResourcePath("autofill_and_password_manager_internals.js",
-                          IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_JS);
-  source->AddResourcePath("autofill_and_password_manager_internals.css",
-                          IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_CSS);
-  source->SetDefaultResource(IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_HTML);
-  return source;
-}
-
-// chrome://password-manager-internals specific UI handler that takes care of
-// subscribing to the autofill logging instance.
-class PasswordManagerInternalsUIHandler : public content::WebUIMessageHandler,
-                                          public autofill::LogReceiver {
- public:
-  PasswordManagerInternalsUIHandler() = default;
-  ~PasswordManagerInternalsUIHandler() override;
-
- private:
-  // content::WebUIMessageHandler:
-  void RegisterMessages() override;
-
-  // Implements content::WebUIMessageHandler.
-  void OnJavascriptAllowed() override;
-  void OnJavascriptDisallowed() override;
-
-  // LogReceiver implementation.
-  void LogEntry(const base::Value& entry) override;
-
-  void StartSubscription();
-  void EndSubscription();
-
-  // JavaScript call handler.
-  void OnLoaded(const base::ListValue* args);
-
-  // Whether |this| is registered as a log receiver with the LogRouter.
-  bool registered_with_log_router_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(PasswordManagerInternalsUIHandler);
-};
-
-PasswordManagerInternalsUIHandler::~PasswordManagerInternalsUIHandler() {
-  EndSubscription();
-}
-
-void PasswordManagerInternalsUIHandler::RegisterMessages() {
-  web_ui()->RegisterMessageCallback(
-      "loaded",
-      base::BindRepeating(&PasswordManagerInternalsUIHandler::OnLoaded,
-                          base::Unretained(this)));
-}
-
-void PasswordManagerInternalsUIHandler::OnJavascriptAllowed() {
-  StartSubscription();
-}
-
-void PasswordManagerInternalsUIHandler::OnJavascriptDisallowed() {
-  EndSubscription();
-}
-
-void PasswordManagerInternalsUIHandler::OnLoaded(const base::ListValue* args) {
-  AllowJavascript();
-  CallJavascriptFunction("setUpPasswordManagerInternals");
-  CallJavascriptFunction(
-      "notifyAboutIncognito",
-      base::Value(Profile::FromWebUI(web_ui())->IsIncognitoProfile()));
-}
-
-void PasswordManagerInternalsUIHandler::StartSubscription() {
-  LogRouter* log_router = PasswordManagerLogRouterFactory::GetForBrowserContext(
-      Profile::FromWebUI(web_ui()));
-  if (!log_router)
-    return;
-
-  registered_with_log_router_ = true;
-
-  const auto& past_logs = log_router->RegisterReceiver(this);
-  for (const auto& entry : past_logs)
-    LogEntry(entry);
-}
-
-void PasswordManagerInternalsUIHandler::EndSubscription() {
-  if (!registered_with_log_router_)
-    return;
-  registered_with_log_router_ = false;
-  LogRouter* log_router = PasswordManagerLogRouterFactory::GetForBrowserContext(
-      Profile::FromWebUI(web_ui()));
-  if (log_router)
-    log_router->UnregisterReceiver(this);
-}
-
-void PasswordManagerInternalsUIHandler::LogEntry(const base::Value& entry) {
-  if (!registered_with_log_router_ || entry.is_none())
-    return;
-  CallJavascriptFunction("addRawLog", entry);
-}
-
-}  // namespace
-
-PasswordManagerInternalsUI::PasswordManagerInternalsUI(content::WebUI* web_ui)
-    : WebUIController(web_ui) {
-  Profile* profile = Profile::FromWebUI(web_ui);
-  content::WebUIDataSource::Add(profile,
-                                CreatePasswordManagerInternalsHTMLSource());
-  web_ui->AddMessageHandler(
-      std::make_unique<PasswordManagerInternalsUIHandler>());
-}
-
-PasswordManagerInternalsUI::~PasswordManagerInternalsUI() = default;
diff --git a/chrome/browser/vr/metrics/consent_flow_metrics_helper.cc b/chrome/browser/vr/metrics/consent_flow_metrics_helper.cc
index 65491042..cf7b696 100644
--- a/chrome/browser/vr/metrics/consent_flow_metrics_helper.cc
+++ b/chrome/browser/vr/metrics/consent_flow_metrics_helper.cc
@@ -73,7 +73,6 @@
 #if defined(OS_ANDROID)
 void ConsentFlowMetricsHelper::OnDialogClosedWithConsent(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     const base::android::JavaParamRef<jstring>& jurl,
     jboolean is_granted) {
   OnDialogClosedWithConsent(base::android::ConvertJavaStringToUTF8(env, jurl),
@@ -82,26 +81,22 @@
 
 void ConsentFlowMetricsHelper::LogUserAction(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     jint action) {
   LogUserAction(static_cast<ConsentDialogAction>(action));
 }
 
 void ConsentFlowMetricsHelper::LogConsentFlowDurationWhenConsentGranted(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+    JNIEnv* env) {
   LogConsentFlowDurationWhenConsentGranted();
 }
 
 void ConsentFlowMetricsHelper::LogConsentFlowDurationWhenConsentNotGranted(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+    JNIEnv* env) {
   LogConsentFlowDurationWhenConsentNotGranted();
 }
 
 void ConsentFlowMetricsHelper::LogConsentFlowDurationWhenUserAborted(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+    JNIEnv* env) {
   LogConsentFlowDurationWhenUserAborted();
 }
 
diff --git a/chrome/browser/vr/metrics/consent_flow_metrics_helper.h b/chrome/browser/vr/metrics/consent_flow_metrics_helper.h
index 19f488f..6770649 100644
--- a/chrome/browser/vr/metrics/consent_flow_metrics_helper.h
+++ b/chrome/browser/vr/metrics/consent_flow_metrics_helper.h
@@ -53,21 +53,13 @@
 #if defined(OS_ANDROID)
   void OnDialogClosedWithConsent(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jstring>& url,
       jboolean is_granted);
   void LogUserAction(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& obj,
                      jint action);
-  void LogConsentFlowDurationWhenConsentGranted(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  void LogConsentFlowDurationWhenConsentNotGranted(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  void LogConsentFlowDurationWhenUserAborted(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  void LogConsentFlowDurationWhenConsentGranted(JNIEnv* env);
+  void LogConsentFlowDurationWhenConsentNotGranted(JNIEnv* env);
+  void LogConsentFlowDurationWhenUserAborted(JNIEnv* env);
 #endif
 
  private:
diff --git a/chrome/browser/win/chrome_elf_init.cc b/chrome/browser/win/chrome_elf_init.cc
index 36f2618..ef3ae4c 100644
--- a/chrome/browser/win/chrome_elf_init.cc
+++ b/chrome/browser/win/chrome_elf_init.cc
@@ -29,10 +29,6 @@
 
 namespace {
 
-// How long to wait, in seconds, before reporting for the second (and last
-// time), what dlls were blocked from the browser process.
-const int kBlacklistReportingDelaySec = 600;
-
 // This enum is used to define the buckets for an enumerated UMA histogram.
 // Hence,
 //   (a) existing enumerated constants should never be deleted or reordered, and
@@ -68,29 +64,6 @@
                             BLACKLIST_SETUP_EVENT_MAX);
 }
 
-// Report which DLLs were prevented from being loaded.
-void ReportSuccessfulBlocks() {
-  // Figure out how many dlls were blocked.
-  int num_blocked_dlls = 0;
-  blacklist::SuccessfullyBlocked(NULL, &num_blocked_dlls);
-
-  if (num_blocked_dlls == 0)
-    return;
-
-  // Now retrieve the list of blocked dlls.
-  std::vector<const wchar_t*> blocked_dlls(num_blocked_dlls);
-  blacklist::SuccessfullyBlocked(&blocked_dlls[0], &num_blocked_dlls);
-
-  // Send up the hashes of the blocked dlls via UMA.
-  for (size_t i = 0; i < blocked_dlls.size(); ++i) {
-    std::string dll_name_utf8;
-    base::WideToUTF8(blocked_dlls[i], wcslen(blocked_dlls[i]), &dll_name_utf8);
-    int uma_hash = DllNameToHash(dll_name_utf8);
-
-    base::UmaHistogramSparse("Blacklist.Blocked", uma_hash);
-  }
-}
-
 base::string16 GetBeaconRegistryPath() {
   return install_static::GetRegistryPath().append(
       blacklist::kRegistryBeaconKeyName);
@@ -108,17 +81,6 @@
     BrowserBlacklistBeaconSetup();
   }
 
-  // Report all successful blacklist interceptions.
-  ReportSuccessfulBlocks();
-
-  // Schedule another task to report all successful interceptions later.
-  // This time delay should be long enough to catch any dlls that attempt to
-  // inject after Chrome has started up.
-  base::PostDelayedTaskWithTraits(
-      FROM_HERE, {content::BrowserThread::UI},
-      base::BindOnce(&ReportSuccessfulBlocks),
-      base::TimeDelta::FromSeconds(kBlacklistReportingDelaySec));
-
   // Make sure the early finch emergency "off switch" for
   // sandbox::MITIGATION_EXTENSION_POINT_DISABLE is set properly in reg.
   // Note: the very existence of this key signals elf to not enable
diff --git a/chrome/chrome_elf/blacklist/blacklist.cc b/chrome/chrome_elf/blacklist/blacklist.cc
index d90f1e1..2d174ad9 100644
--- a/chrome/chrome_elf/blacklist/blacklist.cc
+++ b/chrome/chrome_elf/blacklist/blacklist.cc
@@ -45,8 +45,6 @@
 // For more information about how this list is generated, and how to get off
 // of it, see:
 // https://sites.google.com/a/chromium.org/dev/Home/third-party-developers
-// NOTE: Please remember to update the DllHash enum in histograms.xml when
-//       adding a new value to the blacklist.
 const wchar_t* g_troublesome_dlls[kTroublesomeDllsMaxCount] = {
     L"949ba8b6a9.dll",           // Coupon Time.
     L"activedetect32.dll",       // Lenovo One Key Theater.
diff --git a/chrome/chrome_elf/chrome_elf_main.cc b/chrome/chrome_elf/chrome_elf_main.cc
index 6f0f867..c6cd0c8 100644
--- a/chrome/chrome_elf/chrome_elf_main.cc
+++ b/chrome/chrome_elf/chrome_elf_main.cc
@@ -8,6 +8,7 @@
 #include <windows.h>
 
 #include "chrome/chrome_elf/blacklist/blacklist.h"
+#include "chrome/chrome_elf/chrome_elf_security.h"
 #include "chrome/chrome_elf/crash/crash_helper.h"
 #include "chrome/chrome_elf/third_party_dlls/main.h"
 #include "chrome/install_static/install_details.h"
@@ -70,6 +71,9 @@
     if (install_static::IsNonBrowserProcess())
       return TRUE;
 
+    // Disable legacy hooking.
+    elf_security::EarlyBrowserSecurity();
+
     __try {
       // Initialize blacklist before initializing third_party_dlls.
       // Note: "blacklist" is deprecated in favor of "third_party_dlls", but
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni
index 93af4dc..77c398a 100644
--- a/chrome/chrome_paks.gni
+++ b/chrome/chrome_paks.gni
@@ -91,6 +91,7 @@
                            ])
     output = "${invoker.output_dir}/resources.pak"
     sources = [
+      "$root_gen_dir/chrome/bluetooth_internals_resources.pak",
       "$root_gen_dir/chrome/browser_resources.pak",
       "$root_gen_dir/chrome/chrome_unscaled_resources.pak",
       "$root_gen_dir/chrome/common_resources.pak",
@@ -112,6 +113,7 @@
       "//chrome/browser/resources:invalidations_resources",
       "//chrome/browser/resources:net_internals_resources",
       "//chrome/browser/resources:quota_internals_resources",
+      "//chrome/browser/resources/bluetooth_internals:resources",
       "//chrome/common:resources",
       "//components/autofill/core/browser:autofill_address_rewriter_resources",
       "//components/resources",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 8766118b..a24c170f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -969,6 +969,7 @@
       "../browser/no_best_effort_tasks_during_startup_browsertest.cc",
       "../browser/ntp_snippets/content_suggestions_service_factory_browsertest.cc",
       "../browser/ntp_tiles/ntp_tiles_browsertest.cc",
+      "../browser/optimization_guide/optimization_guide_keyed_service_browsertest.cc",
       "../browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc",
       "../browser/page_load_metrics/observers/amp_page_load_metrics_observer_browsertest.cc",
       "../browser/page_load_metrics/observers/data_saver_site_breakdown_metrics_observer_browsertest.cc",
@@ -1231,6 +1232,7 @@
       "../browser/ui/web_applications/bookmark_app_browsertest.cc",
       "../browser/ui/web_applications/web_app_ui_manager_impl_browsertest.cc",
       "../browser/ui/webauthn/authenticator_dialog_browsertest.cc",
+      "../browser/ui/webui/autofill_and_password_manager_internals/password_manager_internals_ui_browsertest.cc",
       "../browser/ui/webui/bookmarks/bookmarks_browsertest.cc",
       "../browser/ui/webui/bookmarks/bookmarks_browsertest.h",
       "../browser/ui/webui/chrome_url_data_manager_browsertest.cc",
@@ -1254,7 +1256,6 @@
       "../browser/ui/webui/net_internals/net_internals_ui_browsertest.cc",
       "../browser/ui/webui/net_internals/net_internals_ui_browsertest.h",
       "../browser/ui/webui/ntp/new_tab_ui_browsertest.cc",
-      "../browser/ui/webui/password_manager_internals/password_manager_internals_ui_browsertest.cc",
       "../browser/ui/webui/policy_ui_browsertest.cc",
       "../browser/ui/webui/prefs_internals_browsertest.cc",
       "../browser/ui/webui/profile_helper_browsertest.cc",
@@ -2934,6 +2935,7 @@
     "../browser/notifications/stub_alert_dispatcher_mac.mm",
     "../browser/notifications/stub_notification_center_mac.h",
     "../browser/notifications/stub_notification_center_mac.mm",
+    "../browser/optimization_guide/optimization_guide_hints_manager_unittest.cc",
     "../browser/page_load_metrics/metrics_web_contents_observer_unittest.cc",
     "../browser/page_load_metrics/observers/aborts_page_load_metrics_observer_unittest.cc",
     "../browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_unittest.cc",
@@ -3370,6 +3372,7 @@
     "//components/offline_items_collection/core/test_support",
     "//components/offline_pages/task:test_support",
     "//components/optimization_guide",
+    "//components/optimization_guide:test_support",
     "//components/os_crypt:test_support",
     "//components/resources",
     "//components/safe_browsing:buildflags",
@@ -4102,7 +4105,6 @@
       "../browser/extensions/api/downloads/downloads_api_unittest.cc",
       "../browser/extensions/api/enterprise_hardware_platform/enterprise_hardware_platform_api_unittest.cc",
       "../browser/extensions/api/extension_action/extension_action_api_unittest.cc",
-      "../browser/extensions/api/extension_action/extension_action_prefs_unittest.cc",
       "../browser/extensions/api/file_system/file_system_api_unittest.cc",
       "../browser/extensions/api/identity/extension_token_key_unittest.cc",
       "../browser/extensions/api/identity/gaia_web_auth_flow_unittest.cc",
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/OWNERS b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/OWNERS
new file mode 100644
index 0000000..7325cb0
--- /dev/null
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/OWNERS
@@ -0,0 +1,3 @@
+aluo@chromium.org
+skym@chromium.org
+wuwang@chromium.org
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java
index b3a5e4d..3380d8c7 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ActivityUtils.java
@@ -11,6 +11,8 @@
 import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.ActivityOptionsCompat;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.Fragment;
 import android.support.v7.app.AppCompatActivity;
 
 import org.junit.Assert;
@@ -151,19 +153,18 @@
      * @param fragmentTag The tag of the fragment to be loaded.
      */
     @SuppressWarnings("unchecked")
-    public static <T extends android.support.v4.app.Fragment> T waitForFragmentCompat(
+    public static <T extends Fragment> T waitForFragment(
             AppCompatActivity activity, String fragmentTag) {
         String failureReason =
                 String.format("Could not locate the fragment with tag '%s'", fragmentTag);
         CriteriaHelper.pollInstrumentationThread(new Criteria(failureReason) {
             @Override
             public boolean isSatisfied() {
-                android.support.v4.app.Fragment fragment =
+                Fragment fragment =
                         activity.getSupportFragmentManager().findFragmentByTag(fragmentTag);
                 if (fragment == null) return false;
-                if (fragment instanceof android.support.v4.app.DialogFragment) {
-                    android.support.v4.app.DialogFragment dialogFragment =
-                            (android.support.v4.app.DialogFragment) fragment;
+                if (fragment instanceof DialogFragment) {
+                    DialogFragment dialogFragment = (DialogFragment) fragment;
                     return dialogFragment.getDialog() != null
                             && dialogFragment.getDialog().isShowing();
                 }
@@ -179,22 +180,22 @@
      * quickly and we can miss the time that a fragment is visible. This method allows you to get a
      * reference to any fragment that was attached to the activity at any point.
      *
-     * @param <T> A subclass of {@link android.support.v4.app.Fragment}.
+     * @param <T> A subclass of {@link Fragment}.
      * @param activity An instance or subclass of {@link Preferences}.
      * @param fragmentClass The class object for {@link T}.
      * @return A reference to the requested fragment or null.
      */
     @SuppressWarnings("unchecked")
-    public static <T extends android.support.v4.app.Fragment> T waitForFragmentToAttachCompat(
+    public static <T extends Fragment> T waitForFragmentToAttach(
             final Preferences activity, final Class<T> fragmentClass) {
         String failureReason = String.format(
                 "Could not find fragment of type %s", fragmentClass.getCanonicalName());
         CriteriaHelper.pollInstrumentationThread(new Criteria(failureReason) {
             @Override
             public boolean isSatisfied() {
-                return fragmentClass.isInstance(activity.getMainFragmentCompat());
+                return fragmentClass.isInstance(activity.getMainFragment());
             }
         }, ACTIVITY_START_TIMEOUT_MS, CONDITION_POLL_INTERVAL_MS);
-        return (T) activity.getMainFragmentCompat();
+        return (T) activity.getMainFragment();
     }
 }
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 726caf57..e81e9472 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -15,6 +15,8 @@
   sources = [
     "chrome_content_utility_client.cc",
     "chrome_content_utility_client.h",
+    "services.cc",
+    "services.h",
   ]
 
   defines = []
diff --git a/chrome/utility/chrome_content_utility_client.cc b/chrome/utility/chrome_content_utility_client.cc
index adc50cc..00e5594 100644
--- a/chrome/utility/chrome_content_utility_client.cc
+++ b/chrome/utility/chrome_content_utility_client.cc
@@ -13,18 +13,16 @@
 #include "base/files/file_path.h"
 #include "base/lazy_instance.h"
 #include "base/memory/ref_counted.h"
-#include "base/no_destructor.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chrome/common/buildflags.h"
+#include "chrome/utility/services.h"
 #include "components/mirroring/mojom/constants.mojom.h"
 #include "components/mirroring/service/features.h"
 #include "components/mirroring/service/mirroring_service.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/services/patch/patch_service.h"
 #include "components/services/patch/public/mojom/constants.mojom.h"
-#include "components/services/unzip/public/mojom/unzipper.mojom.h"
-#include "components/services/unzip/unzipper_impl.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/common/service_manager_connection.h"
@@ -40,13 +38,9 @@
 #include "chrome/utility/importer/profile_import_impl.h"
 #include "chrome/utility/importer/profile_import_service.h"
 #include "services/network/url_request_context_builder_mojo.h"
-#include "services/proxy_resolver/proxy_resolver_factory_impl.h"  // nogncheck
-#include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
 #endif  // !defined(OS_ANDROID)
 
 #if defined(OS_WIN)
-#include "chrome/services/util_win/public/mojom/util_win.mojom.h"
-#include "chrome/services/util_win/util_win_impl.h"
 #include "components/services/quarantine/public/cpp/quarantine_features_win.h"  // nogncheck
 #include "components/services/quarantine/public/mojom/quarantine.mojom.h"  // nogncheck
 #include "components/services/quarantine/quarantine_service.h"  // nogncheck
@@ -316,29 +310,13 @@
     g_network_binder_creation_callback.Get().Run(registry);
 }
 
-void ChromeContentUtilityClient::RunMainThreadService(
-    mojo::GenericPendingReceiver receiver) {
-#if defined(OS_WIN)
-  if (auto util_receiver = receiver.As<chrome::mojom::UtilWin>()) {
-    static base::NoDestructor<UtilWinImpl> service(std::move(util_receiver));
-    return;
-  }
-#endif
-  if (auto unzipper_receiver = receiver.As<unzip::mojom::Unzipper>()) {
-    static base::NoDestructor<unzip::UnzipperImpl> service(
-        std::move(unzipper_receiver));
-  }
+mojo::ServiceFactory*
+ChromeContentUtilityClient::GetMainThreadServiceFactory() {
+  return ::GetMainThreadServiceFactory();
 }
 
-void ChromeContentUtilityClient::RunIOThreadService(
-    mojo::GenericPendingReceiver* receiver) {
-#if !defined(OS_ANDROID)
-  if (auto factory_receiver =
-          receiver->As<proxy_resolver::mojom::ProxyResolverFactory>()) {
-    static base::NoDestructor<proxy_resolver::ProxyResolverFactoryImpl> factory(
-        std::move(factory_receiver));
-  }
-#endif  // !defined(OS_ANDROID)
+mojo::ServiceFactory* ChromeContentUtilityClient::GetIOThreadServiceFactory() {
+  return ::GetIOThreadServiceFactory();
 }
 
 // static
diff --git a/chrome/utility/chrome_content_utility_client.h b/chrome/utility/chrome_content_utility_client.h
index 386057f..8b2892c 100644
--- a/chrome/utility/chrome_content_utility_client.h
+++ b/chrome/utility/chrome_content_utility_client.h
@@ -33,8 +33,8 @@
       service_manager::mojom::ServiceRequest request) override;
   void RegisterNetworkBinders(
       service_manager::BinderRegistry* registry) override;
-  void RunMainThreadService(mojo::GenericPendingReceiver receiver) override;
-  void RunIOThreadService(mojo::GenericPendingReceiver* receiver) override;
+  mojo::ServiceFactory* GetMainThreadServiceFactory() override;
+  mojo::ServiceFactory* GetIOThreadServiceFactory() override;
 
   // See NetworkBinderProvider above.
   static void SetNetworkBinderCreationCallback(
diff --git a/chrome/utility/services.cc b/chrome/utility/services.cc
new file mode 100644
index 0000000..601cbe49
--- /dev/null
+++ b/chrome/utility/services.cc
@@ -0,0 +1,70 @@
+// Copyright 2019 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 "chrome/utility/services.h"
+
+#include <utility>
+
+#include "base/macros.h"
+#include "base/no_destructor.h"
+#include "build/build_config.h"
+#include "components/services/unzip/public/mojom/unzipper.mojom.h"
+#include "components/services/unzip/unzipper_impl.h"
+#include "mojo/public/cpp/bindings/service_factory.h"
+
+#if defined(OS_WIN)
+#include "chrome/services/util_win/public/mojom/util_win.mojom.h"
+#include "chrome/services/util_win/util_win_impl.h"
+#endif  // defined(OS_WIN)
+
+#if !defined(OS_ANDROID)
+#include "services/proxy_resolver/proxy_resolver_factory_impl.h"  // nogncheck
+#include "services/proxy_resolver/public/mojom/proxy_resolver.mojom.h"
+#endif  // !defined(OS_ANDROID)
+
+namespace {
+
+auto RunUnzipper(mojo::PendingReceiver<unzip::mojom::Unzipper> receiver) {
+  return std::make_unique<unzip::UnzipperImpl>(std::move(receiver));
+}
+
+#if defined(OS_WIN)
+auto RunWindowsUtility(mojo::PendingReceiver<chrome::mojom::UtilWin> receiver) {
+  return std::make_unique<UtilWinImpl>(std::move(receiver));
+}
+#endif  // defined(OS_WIN)
+
+#if !defined(OS_ANDROID)
+auto RunProxyResolver(
+    mojo::PendingReceiver<proxy_resolver::mojom::ProxyResolverFactory>
+        receiver) {
+  return std::make_unique<proxy_resolver::ProxyResolverFactoryImpl>(
+      std::move(receiver));
+}
+#endif  // !defined(OS_ANDROID)
+
+}  // namespace
+
+mojo::ServiceFactory* GetMainThreadServiceFactory() {
+  // clang-format off
+  static base::NoDestructor<mojo::ServiceFactory> factory {
+    RunUnzipper,
+#if defined(OS_WIN)
+    RunWindowsUtility,
+#endif  // defined(OS_WIN)
+  };
+  // clang-format on
+  return factory.get();
+}
+
+mojo::ServiceFactory* GetIOThreadServiceFactory() {
+  // clang-format off
+  static base::NoDestructor<mojo::ServiceFactory> factory {
+#if !defined(OS_ANDROID)
+    RunProxyResolver,
+#endif  // !defined(OS_ANDROID)
+  };
+  // clang-format on
+  return factory.get();
+}
diff --git a/chrome/utility/services.h b/chrome/utility/services.h
new file mode 100644
index 0000000..6fa90ac
--- /dev/null
+++ b/chrome/utility/services.h
@@ -0,0 +1,18 @@
+// Copyright 2019 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 CHROME_UTILITY_SERVICES_H_
+#define CHROME_UTILITY_SERVICES_H_
+
+namespace mojo {
+class ServiceFactory;
+}
+
+// Helpers to run out-of-process services in a dedicated utility process. All
+// out-of-process services will need to have their implementation hooked up in
+// one of these helpers.
+mojo::ServiceFactory* GetMainThreadServiceFactory();
+mojo::ServiceFactory* GetIOThreadServiceFactory();
+
+#endif  // CHROME_UTILITY_SERVICES_H_
diff --git a/chromecast/browser/exo/cast_wm_helper.cc b/chromecast/browser/exo/cast_wm_helper.cc
index 4d022dc2..79daefd 100644
--- a/chromecast/browser/exo/cast_wm_helper.cc
+++ b/chromecast/browser/exo/cast_wm_helper.cc
@@ -53,6 +53,8 @@
       cast_screen_(cast_screen),
       vsync_timing_manager_(this) {
   cast_screen_->AddObserver(&display_observer_);
+  for (const auto& display : cast_screen_->GetAllDisplays())
+    display_observer_.OnDisplayAdded(display);
 }
 
 CastWMHelper::~CastWMHelper() {
diff --git a/chromeos/cryptohome/OWNERS b/chromeos/cryptohome/OWNERS
index e1627725..5fcd766 100644
--- a/chromeos/cryptohome/OWNERS
+++ b/chromeos/cryptohome/OWNERS
@@ -1 +1,2 @@
 hashimoto@chromium.org
+# COMPONENT: OS>Systems>Security
diff --git a/chromeos/dbus/OWNERS b/chromeos/dbus/OWNERS
index c5198cd..1ab0c6b 100644
--- a/chromeos/dbus/OWNERS
+++ b/chromeos/dbus/OWNERS
@@ -7,3 +7,4 @@
 per-file *smb_provider*=zentaro@chromium.org
 per-file *wilco_dtc_supportd*=emaxx@chromium.org
 per-file *wilco_dtc_supportd*=pmarko@chromium.org
+# COMPONENT: OS>Systems
diff --git a/chromeos/dbus/biod/OWNERS b/chromeos/dbus/biod/OWNERS
new file mode 100644
index 0000000..a8c25c75
--- /dev/null
+++ b/chromeos/dbus/biod/OWNERS
@@ -0,0 +1 @@
+# COMPONENT: UI>Shell>LockScreen
diff --git a/chromeos/printing/OWNERS b/chromeos/printing/OWNERS
index c0b8d9f..e7afb7c 100644
--- a/chromeos/printing/OWNERS
+++ b/chromeos/printing/OWNERS
@@ -1,6 +1,7 @@
 skau@chromium.org
 thestig@chromium.org
 zentaro@chromium.org
+luum@chromium.org
 
 #TEAM: cros-printing-dev@chromium.org
 #COMPONENT: Internals>Printing>CUPS
diff --git a/chromeos/services/assistant/platform/audio_input_impl.cc b/chromeos/services/assistant/platform/audio_input_impl.cc
index 3c69f1c..ab40b9f 100644
--- a/chromeos/services/assistant/platform/audio_input_impl.cc
+++ b/chromeos/services/assistant/platform/audio_input_impl.cc
@@ -8,6 +8,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/stl_util.h"
+#include "base/strings/string_util.h"
 #include "base/timer/timer.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/dbus/power/power_manager_client.h"
@@ -388,6 +389,13 @@
     std::string region_code = pref_locale;
     pref_locale.append("_").append(region_code);
   }
+
+  // For locales with language code "en", use "en_all" hotword model.
+  std::vector<std::string> code_strings = base::SplitString(
+      pref_locale, "_", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
+  if (code_strings.size() > 0 && code_strings[0] == "en")
+    pref_locale = "en_all";
+
   uint64_t dsp_node_id;
   base::StringToUint64(hotword_device_id_, &dsp_node_id);
   chromeos::CrasAudioHandler::Get()->SetHotwordModel(
diff --git a/components/arc/OWNERS b/components/arc/OWNERS
index ab4ebe9c..d2b9a64 100644
--- a/components/arc/OWNERS
+++ b/components/arc/OWNERS
@@ -2,3 +2,5 @@
 yusukes@chromium.org
 # backup reviewer
 elijahtaylor@chromium.org
+
+# COMPONENT: Platform>Apps>ARC
diff --git a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css
index 2df889c0..a68c417 100644
--- a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css
+++ b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.css
@@ -29,6 +29,25 @@
   display: block;
 }
 
+#version-info {
+  padding: 3px;
+  margin: 3px;
+}
+
+.version {
+  font-family: monospace;
+  max-width: 430px;
+  padding-left: 5px;
+  word-break: break-word;
+  vertical-align: top;
+}
+
+.label {
+  font-family: monospace;
+  vertical-align: top;
+  font-weight: 200;
+}
+
 /*
  * Colors can be taken from
  * https://material.io/design/color/#tools-for-picking-colors
diff --git a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.html b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.html
index 220e6b5b..6fe0d7f 100644
--- a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.html
+++ b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.html
@@ -14,6 +14,28 @@
 <h1 id="h1-title"></h1>
 <div id="logging-note"></div>
 <div id="logging-note-incognito"></div>
+<div id="version-info">
+  <table>
+    <tr>
+      <td class="label">Version:</td>
+      <td class="version"><span>$i18n{version}</span>
+        (<span>$i18n{official}</span>)
+        <span>$i18n{version_modifier}</span></td>
+    </tr>
+    <tr>
+      <td class="label">Revision:</td>
+      <td class="version"><span>$i18n{cl}</span></td>
+    </tr>
+    <tr>
+      <td class="label">User Agent:</td>
+      <td class="version"><span>$i18n{useragent}</span></td>
+    </tr>
+    <tr>
+      <td class="label">Variations:</td>
+      <td class="version" id="variations-list"></td>
+    </tr>
+  </table>
+</div>
 <div id="log-entries">
 </div>
 </body>
diff --git a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.js b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.js
index 96b18a5..20883c6 100644
--- a/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.js
+++ b/components/autofill/core/browser/autofill_and_password_manager_internals/autofill_and_password_manager_internals.js
@@ -75,6 +75,16 @@
   document.body.dataset.incognito = isIncognito;
 }
 
+function notifyAboutVariations(variations) {
+  var list = document.createElement("div");
+  for (let item of variations) {
+    list.appendChild(document.createTextNode(item));
+    list.appendChild(document.createElement("br"));
+  }
+  var variationsList = document.getElementById("variations-list");
+  variationsList.appendChild(list);
+}
+
 document.addEventListener("DOMContentLoaded", function(event) {
   chrome.send('loaded');
 });
diff --git a/components/autofill/ios/form_util/form_activity_tab_helper.h b/components/autofill/ios/form_util/form_activity_tab_helper.h
index 7b2d7ba..dc40fa6 100644
--- a/components/autofill/ios/form_util/form_activity_tab_helper.h
+++ b/components/autofill/ios/form_util/form_activity_tab_helper.h
@@ -8,7 +8,6 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "base/values.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
 #include "ios/web/public/web_state/web_state_observer.h"
 #import "ios/web/public/web_state/web_state_user_data.h"
 
diff --git a/components/autofill/ios/form_util/form_activity_tab_helper.mm b/components/autofill/ios/form_util/form_activity_tab_helper.mm
index 2110fc1..e8b7601 100644
--- a/components/autofill/ios/form_util/form_activity_tab_helper.mm
+++ b/components/autofill/ios/form_util/form_activity_tab_helper.mm
@@ -11,6 +11,7 @@
 #include "components/autofill/ios/form_util/form_activity_observer.h"
 #include "components/autofill/ios/form_util/form_activity_params.h"
 #include "ios/web/public/js_messaging/web_frame.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/components/cronet/android/cronet_upload_data_stream_adapter.cc b/components/cronet/android/cronet_upload_data_stream_adapter.cc
index 21a137e..188ed127 100644
--- a/components/cronet/android/cronet_upload_data_stream_adapter.cc
+++ b/components/cronet/android/cronet_upload_data_stream_adapter.cc
@@ -98,8 +98,7 @@
                                 upload_data_stream_));
 }
 
-void CronetUploadDataStreamAdapter::Destroy(JNIEnv* env,
-                                            const JavaParamRef<jobject>& jobj) {
+void CronetUploadDataStreamAdapter::Destroy(JNIEnv* env) {
   delete this;
 }
 
diff --git a/components/cronet/android/cronet_upload_data_stream_adapter.h b/components/cronet/android/cronet_upload_data_stream_adapter.h
index e171137..8b984d6 100644
--- a/components/cronet/android/cronet_upload_data_stream_adapter.h
+++ b/components/cronet/android/cronet_upload_data_stream_adapter.h
@@ -55,8 +55,7 @@
 
   // Destroys |this|. Can be called from any thread, but needs to be protected
   // by the adapter lock.
-  void Destroy(JNIEnv* env,
-               const base::android::JavaParamRef<jobject>& jobject);
+  void Destroy(JNIEnv* env);
 
  private:
   // Initialized on construction, effectively constant.
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
index 9b1951e63..e42e478 100644
--- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
+++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
@@ -5,7 +5,6 @@
 package org.chromium.components.dom_distiller.core;
 
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.JNINamespace;
 
 import java.util.HashMap;
@@ -57,7 +56,7 @@
         }
 
         public void destroy() {
-            nativeDestroyObserverAndroid(this, mNativeDistilledPagePrefsObserverAndroidPtr);
+            nativeDestroyObserverAndroid(mNativeDistilledPagePrefsObserverAndroidPtr);
         }
 
         public long getNativePtr() {
@@ -65,13 +64,6 @@
         }
     }
 
-    static private native long nativeInitObserverAndroid(
-            @JCaller DistilledPagePrefsObserverWrapper caller);
-
-    static private native void nativeDestroyObserverAndroid(
-            @JCaller DistilledPagePrefsObserverWrapper caller,
-            long nativeDistilledPagePrefsObserverAndroid);
-
     DistilledPagePrefs(long distilledPagePrefsPtr) {
         mDistilledPagePrefsAndroid = nativeInit(distilledPagePrefsPtr);
         mObserverMap = new HashMap<Observer, DistilledPagePrefsObserverWrapper>();
@@ -145,4 +137,9 @@
 
     private native void nativeRemoveObserver(long nativeDistilledPagePrefsAndroid,
             long nativeObserverPtr);
+
+    private static native long nativeInitObserverAndroid(DistilledPagePrefsObserverWrapper caller);
+
+    private static native void nativeDestroyObserverAndroid(
+            long nativeDistilledPagePrefsObserverAndroid);
 }
diff --git a/components/dom_distiller/core/distilled_page_prefs_android.cc b/components/dom_distiller/core/distilled_page_prefs_android.cc
index 22a597a4..7e8556e 100644
--- a/components/dom_distiller/core/distilled_page_prefs_android.cc
+++ b/components/dom_distiller/core/distilled_page_prefs_android.cc
@@ -93,9 +93,7 @@
 
 DistilledPagePrefsObserverAndroid::~DistilledPagePrefsObserverAndroid() {}
 
-void DistilledPagePrefsObserverAndroid::DestroyObserverAndroid(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void DistilledPagePrefsObserverAndroid::DestroyObserverAndroid(JNIEnv* env) {
   delete this;
 }
 
diff --git a/components/dom_distiller/core/distilled_page_prefs_android.h b/components/dom_distiller/core/distilled_page_prefs_android.h
index 22521ed33..5c1877e8 100644
--- a/components/dom_distiller/core/distilled_page_prefs_android.h
+++ b/components/dom_distiller/core/distilled_page_prefs_android.h
@@ -59,9 +59,7 @@
   void OnChangeTheme(DistilledPagePrefs::Theme new_theme) override;
   void OnChangeFontScaling(float scaling) override;
 
-  virtual void DestroyObserverAndroid(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  virtual void DestroyObserverAndroid(JNIEnv* env);
 
  private:
   base::android::ScopedJavaGlobalRef<jobject> java_ref_;
diff --git a/components/dom_distiller/core/dom_distiller_service_android.cc b/components/dom_distiller/core/dom_distiller_service_android.cc
index f8b1e8a..039288a 100644
--- a/components/dom_distiller/core/dom_distiller_service_android.cc
+++ b/components/dom_distiller/core/dom_distiller_service_android.cc
@@ -48,9 +48,7 @@
   return ConvertUTF8ToJavaString(env, service_->GetUrlForEntry(entry_id));
 }
 
-jlong DomDistillerServiceAndroid::GetDistilledPagePrefsPtr(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jlong DomDistillerServiceAndroid::GetDistilledPagePrefsPtr(JNIEnv* env) {
   return reinterpret_cast<intptr_t>(service_->GetDistilledPagePrefs());
 }
 
diff --git a/components/dom_distiller/core/dom_distiller_service_android.h b/components/dom_distiller/core/dom_distiller_service_android.h
index e0e133f1..5714572 100644
--- a/components/dom_distiller/core/dom_distiller_service_android.h
+++ b/components/dom_distiller/core/dom_distiller_service_android.h
@@ -23,9 +23,7 @@
   virtual ~DomDistillerServiceAndroid();
   // Returns native pointer to native DistilledPagePrefs registered with
   // DomDistillerService.
-  jlong GetDistilledPagePrefsPtr(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+  jlong GetDistilledPagePrefsPtr(JNIEnv* env);
   bool HasEntry(JNIEnv* env,
                 const base::android::JavaParamRef<jobject>& obj,
                 const base::android::JavaParamRef<jstring>& entry_id);
diff --git a/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java b/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java
index 1fc32c7..7eeb984 100644
--- a/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java
+++ b/components/feature_engagement/internal/android/java/src/org/chromium/components/feature_engagement/internal/TrackerImpl.java
@@ -10,7 +10,6 @@
 import org.chromium.base.Callback;
 import org.chromium.base.CommandLine;
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.components.feature_engagement.TriggerState;
@@ -46,14 +45,11 @@
         @Override
         public void release() {
             assert mNativePtr != 0;
-            nativeRelease(this, mNativePtr);
+            nativeRelease(mNativePtr);
             assert mNativePtr == 0;
         }
     }
 
-    private static native void nativeRelease(
-            @JCaller DisplayLockHandleAndroid caller, long nativeDisplayLockHandleAndroid);
-
     /**
      * The pointer to the feature_engagement::TrackerImplAndroid JNI bridge.
      */
@@ -145,4 +141,5 @@
     private native boolean nativeIsInitialized(long nativeTrackerImplAndroid);
     private native void nativeAddOnInitializedCallback(
             long nativeTrackerImplAndroid, Callback<Boolean> callback);
+    private static native void nativeRelease(long nativeDisplayLockHandleAndroid);
 }
diff --git a/components/feature_engagement/internal/android/tracker_impl_android.cc b/components/feature_engagement/internal/android/tracker_impl_android.cc
index f44a5ac..81e9681 100644
--- a/components/feature_engagement/internal/android/tracker_impl_android.cc
+++ b/components/feature_engagement/internal/android/tracker_impl_android.cc
@@ -184,9 +184,7 @@
   return base::android::ScopedJavaLocalRef<jobject>(java_obj_);
 }
 
-void DisplayLockHandleAndroid::Release(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jobj) {
+void DisplayLockHandleAndroid::Release(JNIEnv* env) {
   delete this;
 }
 }  // namespace feature_engagement
diff --git a/components/feature_engagement/internal/android/tracker_impl_android.h b/components/feature_engagement/internal/android/tracker_impl_android.h
index 894604b0..675c02ce 100644
--- a/components/feature_engagement/internal/android/tracker_impl_android.h
+++ b/components/feature_engagement/internal/android/tracker_impl_android.h
@@ -40,7 +40,7 @@
   base::android::ScopedJavaLocalRef<jobject> GetJavaObject();
 
   // Deletes |this|.
-  void Release(JNIEnv* env, const base::android::JavaParamRef<jobject>& jobj);
+  void Release(JNIEnv* env);
 
  private:
   // The DisplayLockHandle that this JNI bridge owns.
diff --git a/components/leveldb_proto/OWNERS b/components/leveldb_proto/OWNERS
index 3bf6060c..6774f0e 100644
--- a/components/leveldb_proto/OWNERS
+++ b/components/leveldb_proto/OWNERS
@@ -2,3 +2,4 @@
 ssid@chromium.org
 
 # COMPONENT: Internals
+# TEAM: chromium-reviews@chromium.org
diff --git a/components/optimization_guide/optimization_guide_features.cc b/components/optimization_guide/optimization_guide_features.cc
index 5b51443..d135a7c9 100644
--- a/components/optimization_guide/optimization_guide_features.cc
+++ b/components/optimization_guide/optimization_guide_features.cc
@@ -11,7 +11,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "build/build_config.h"
 #include "components/optimization_guide/optimization_guide_constants.h"
-#include "components/optimization_guide/optimization_guide_features.h"
 #include "components/optimization_guide/optimization_guide_switches.h"
 #include "google_apis/google_api_keys.h"
 #include "net/base/url_util.h"
@@ -50,6 +49,10 @@
 const base::Feature kOptimizationHintsFetching{
     "OptimizationHintsFetching", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables the initialization of the Optimization Guide Keyed Service.
+const base::Feature kOptimizationGuideKeyedService{
+    "OptimizationGuideKeyedService", base::FEATURE_DISABLED_BY_DEFAULT};
+
 size_t MaxHintsFetcherTopHostBlacklistSize() {
   // The blacklist will be limited to the most engaged hosts and will hold twice
   // (2*N) as many hosts that the HintsFetcher request hints for. The extra N
@@ -112,5 +115,9 @@
   return base::FeatureList::IsEnabled(features::kOptimizationHintsFetching);
 }
 
+bool IsOptimizationGuideKeyedServiceEnabled() {
+  return base::FeatureList::IsEnabled(features::kOptimizationGuideKeyedService);
+}
+
 }  // namespace features
 }  // namespace optimization_guide
diff --git a/components/optimization_guide/optimization_guide_features.h b/components/optimization_guide/optimization_guide_features.h
index 50385e8..069aebb 100644
--- a/components/optimization_guide/optimization_guide_features.h
+++ b/components/optimization_guide/optimization_guide_features.h
@@ -20,6 +20,7 @@
 constexpr char kOptimizationHintsExperimentNameParam[] = "experiment_name";
 extern const base::Feature kSlowPageTriggering;
 extern const base::Feature kOptimizationHintsFetching;
+extern const base::Feature kOptimizationGuideKeyedService;
 
 // The maximum number of hosts that can be stored in the
 // |kHintsFetcherTopHostBlacklist| dictionary pref when initialized. The top
@@ -49,6 +50,10 @@
 // Service is enabled.
 bool IsHintsFetchingEnabled();
 
+// Returns true if the initialization of the Optimization Guide Keyed Service is
+// enabled.
+bool IsOptimizationGuideKeyedServiceEnabled();
+
 }  // namespace features
 }  // namespace optimization_guide
 
diff --git a/components/password_manager/OWNERS b/components/password_manager/OWNERS
index 7746c0f4..55e5a05 100644
--- a/components/password_manager/OWNERS
+++ b/components/password_manager/OWNERS
@@ -4,3 +4,4 @@
 vasilii@chromium.org
 
 # COMPONENT: UI>Browser>Passwords
+# TEAM: chromium-dev@chromium.org
diff --git a/components/payments/content/android/payment_handler_host.cc b/components/payments/content/android/payment_handler_host.cc
index 155ee61..4364b07af 100644
--- a/components/payments/content/android/payment_handler_host.cc
+++ b/components/payments/content/android/payment_handler_host.cc
@@ -26,27 +26,20 @@
 
 PaymentHandlerHost::~PaymentHandlerHost() {}
 
-jboolean PaymentHandlerHost::IsChangingPaymentMethod(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& j_caller) const {
+jboolean PaymentHandlerHost::IsChangingPaymentMethod(JNIEnv* env) const {
   return payment_handler_host_.is_changing_payment_method();
 }
 
-jlong PaymentHandlerHost::GetNativePaymentHandlerHost(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller) {
+jlong PaymentHandlerHost::GetNativePaymentHandlerHost(JNIEnv* env) {
   return reinterpret_cast<intptr_t>(&payment_handler_host_);
 }
 
-void PaymentHandlerHost::Destroy(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller) {
+void PaymentHandlerHost::Destroy(JNIEnv* env) {
   delete this;
 }
 
 void PaymentHandlerHost::UpdateWith(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller,
     const base::android::JavaParamRef<jobject>& response_buffer) {
   mojom::PaymentMethodChangeResponsePtr response;
   bool success = mojom::PaymentMethodChangeResponse::Deserialize(
@@ -56,9 +49,7 @@
   payment_handler_host_.UpdateWith(std::move(response));
 }
 
-void PaymentHandlerHost::NoUpdatedPaymentDetails(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller) {
+void PaymentHandlerHost::NoUpdatedPaymentDetails(JNIEnv* env) {
   payment_handler_host_.NoUpdatedPaymentDetails();
 }
 
diff --git a/components/payments/content/android/payment_handler_host.h b/components/payments/content/android/payment_handler_host.h
index a957622..75248e7 100644
--- a/components/payments/content/android/payment_handler_host.h
+++ b/components/payments/content/android/payment_handler_host.h
@@ -42,31 +42,24 @@
   ~PaymentHandlerHost() override;
 
   // Checks whether the payment method change is currently in progress.
-  jboolean IsChangingPaymentMethod(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller) const;
+  jboolean IsChangingPaymentMethod(JNIEnv* env) const;
 
   // Returns the pointer to the payments::PaymentHandlerHost for binding to its
   // IPC endpoint in service_worker_payment_app_bridge.cc.
-  jlong GetNativePaymentHandlerHost(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  jlong GetNativePaymentHandlerHost(JNIEnv* env);
 
   // Destroys this object.
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
+  void Destroy(JNIEnv* env);
 
   // Notifies the payment handler that the merchant has updated the payment
   // details. The |response_buffer| should be a serialization of a valid
   // PaymentMethodChangeResponse.java object.
   void UpdateWith(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& caller,
                   const base::android::JavaParamRef<jobject>& response_buffer);
 
   // Notifies the payment handler that the merchant ignored the payment
   // method change event.
-  void NoUpdatedPaymentDetails(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void NoUpdatedPaymentDetails(JNIEnv* env);
 
  private:
   // PaymentHandlerHost::Delegate implementation:
diff --git a/components/payments/content/android/payment_manifest_parser_android.cc b/components/payments/content/android/payment_manifest_parser_android.cc
index 63f7f935..98abacd 100644
--- a/components/payments/content/android/payment_manifest_parser_android.cc
+++ b/components/payments/content/android/payment_manifest_parser_android.cc
@@ -131,7 +131,6 @@
 
 void PaymentManifestParserAndroid::ParsePaymentMethodManifest(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller,
     const base::android::JavaParamRef<jstring>& jcontent,
     const base::android::JavaParamRef<jobject>& jcallback) {
   parser_.ParsePaymentMethodManifest(
@@ -142,7 +141,6 @@
 
 void PaymentManifestParserAndroid::ParseWebAppManifest(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller,
     const base::android::JavaParamRef<jstring>& jcontent,
     const base::android::JavaParamRef<jobject>& jcallback) {
   parser_.ParseWebAppManifest(
@@ -152,8 +150,7 @@
 }
 
 void PaymentManifestParserAndroid::DestroyPaymentManifestParserAndroid(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller) {
+    JNIEnv* env) {
   delete this;
 }
 
diff --git a/components/payments/content/android/payment_manifest_parser_android.h b/components/payments/content/android/payment_manifest_parser_android.h
index e763e549..c201077a 100644
--- a/components/payments/content/android/payment_manifest_parser_android.h
+++ b/components/payments/content/android/payment_manifest_parser_android.h
@@ -25,19 +25,15 @@
 
   void ParsePaymentMethodManifest(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jcaller,
       const base::android::JavaParamRef<jstring>& jcontent,
       const base::android::JavaParamRef<jobject>& jcallback);
 
   void ParseWebAppManifest(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jcaller,
       const base::android::JavaParamRef<jstring>& jcontent,
       const base::android::JavaParamRef<jobject>& jcallback);
 
-  void DestroyPaymentManifestParserAndroid(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jcaller);
+  void DestroyPaymentManifestParserAndroid(JNIEnv* env);
 
  private:
   PaymentManifestParser parser_;
diff --git a/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_BUTTON_OPEN_LOGIN_PAGE.png.sha1 b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_BUTTON_OPEN_LOGIN_PAGE.png.sha1
new file mode 100644
index 0000000..5d0db87
--- /dev/null
+++ b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_BUTTON_OPEN_LOGIN_PAGE.png.sha1
@@ -0,0 +1 @@
+d61456e2fd82bcad5d327f4e0fbb59bba9126366
\ No newline at end of file
diff --git a/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_HEADING_WIFI.png.sha1 b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_HEADING_WIFI.png.sha1
new file mode 100644
index 0000000..5d0db87
--- /dev/null
+++ b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_HEADING_WIFI.png.sha1
@@ -0,0 +1 @@
+d61456e2fd82bcad5d327f4e0fbb59bba9126366
\ No newline at end of file
diff --git a/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_PRIMARY_PARAGRAPH_WIFI_SSID.png.sha1 b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_PRIMARY_PARAGRAPH_WIFI_SSID.png.sha1
new file mode 100644
index 0000000..5d0db87
--- /dev/null
+++ b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_PRIMARY_PARAGRAPH_WIFI_SSID.png.sha1
@@ -0,0 +1 @@
+d61456e2fd82bcad5d327f4e0fbb59bba9126366
\ No newline at end of file
diff --git a/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_PRIMARY_PARAGRAPH_WIRED.png.sha1 b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_PRIMARY_PARAGRAPH_WIRED.png.sha1
new file mode 100644
index 0000000..dfc1e8d
--- /dev/null
+++ b/components/security_interstitials_strings_grdp/IDS_CAPTIVE_PORTAL_PRIMARY_PARAGRAPH_WIRED.png.sha1
@@ -0,0 +1 @@
+378650e81625e476126a1a3d4b6ff559df54ef7c
diff --git a/components/session_manager/core/session_manager.cc b/components/session_manager/core/session_manager.cc
index ed4a656..bb94497 100644
--- a/components/session_manager/core/session_manager.cc
+++ b/components/session_manager/core/session_manager.cc
@@ -24,9 +24,6 @@
 SessionManager::~SessionManager() {
   DCHECK_EQ(instance, this);
   SessionManager::SetInstance(nullptr);
-
-  for (auto& observer : observers_)
-    observer.OnSessionManagerDestroyed();
 }
 
 // static
diff --git a/components/session_manager/core/session_manager_observer.h b/components/session_manager/core/session_manager_observer.h
index 98317fa..e3748ca 100644
--- a/components/session_manager/core/session_manager_observer.h
+++ b/components/session_manager/core/session_manager_observer.h
@@ -16,9 +16,6 @@
 //     http://crbug.com/657149.
 class SessionManagerObserver : public base::CheckedObserver {
  public:
-  // Inovked when session manager is destroyed.
-  virtual void OnSessionManagerDestroyed() {}
-
   // Invoked when session state is changed.
   virtual void OnSessionStateChanged() {}
 
diff --git a/components/signin/core/browser/consistency_cookie_manager_android.cc b/components/signin/core/browser/consistency_cookie_manager_android.cc
index 5b044244..cd1f0cca 100644
--- a/components/signin/core/browser/consistency_cookie_manager_android.cc
+++ b/components/signin/core/browser/consistency_cookie_manager_android.cc
@@ -31,9 +31,7 @@
   Java_ConsistencyCookieManager_destroy(env, java_ref_);
 }
 
-void ConsistencyCookieManagerAndroid::OnIsUpdatePendingChanged(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& java_obj) {
+void ConsistencyCookieManagerAndroid::OnIsUpdatePendingChanged(JNIEnv* env) {
   bool is_update_pending_in_java =
       Java_ConsistencyCookieManager_getIsUpdatePending(env, java_ref_);
   if (is_update_pending_in_java == is_update_pending_in_java_)
diff --git a/components/signin/core/browser/consistency_cookie_manager_android.h b/components/signin/core/browser/consistency_cookie_manager_android.h
index 093b8898..6fa0f2e 100644
--- a/components/signin/core/browser/consistency_cookie_manager_android.h
+++ b/components/signin/core/browser/consistency_cookie_manager_android.h
@@ -25,9 +25,7 @@
 
   ~ConsistencyCookieManagerAndroid() override;
 
-  void OnIsUpdatePendingChanged(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& java_self);
+  void OnIsUpdatePendingChanged(JNIEnv* env);
 
  protected:
   std::string CalculateCookieValue() override;
diff --git a/components/ukm/debug/ukm_internals.js b/components/ukm/debug/ukm_internals.js
index 5bec3e1..92aebee 100644
--- a/components/ukm/debug/ukm_internals.js
+++ b/components/ukm/debug/ukm_internals.js
@@ -86,7 +86,7 @@
 /**
  * Sets the display option of all the elements in HtmlCollection to the value
  * passed.
- * @param {!NodeList<!Element>} collection Collection of Elements.
+ * @param {!HTMLCollection<!Element>} collection Collection of Elements.
  */
 function setDisplayStyle(collection, display_value) {
   for (const el of collection) {
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
index a43cee4..fdd358f7 100644
--- a/components/viz/service/BUILD.gn
+++ b/components/viz/service/BUILD.gn
@@ -233,8 +233,8 @@
     sources += [
       "display/ca_layer_overlay.cc",
       "display/ca_layer_overlay.h",
-      "display/overlay_processor_ca.cc",
-      "display/overlay_processor_ca.h",
+      "display_embedder/overlay_candidate_validator_mac.cc",
+      "display_embedder/overlay_candidate_validator_mac.h",
       "display_embedder/software_output_device_mac.cc",
       "display_embedder/software_output_device_mac.h",
     ]
diff --git a/components/viz/service/display/DEPS b/components/viz/service/display/DEPS
index 1614213..162c04a 100644
--- a/components/viz/service/display/DEPS
+++ b/components/viz/service/display/DEPS
@@ -9,6 +9,7 @@
   "+cc/scheduler",
   "+components/viz/service/surfaces",
   "+components/viz/service/display_embedder/overlay_candidate_validator_android.h",
+  "+components/viz/service/display_embedder/overlay_candidate_validator_mac.h",
   "+components/viz/service/display_embedder/overlay_candidate_validator_ozone.h",
   "+components/viz/service/display_embedder/overlay_candidate_validator_surface_control.h",
   "+components/viz/service/display_embedder/overlay_candidate_validator_win.h",
diff --git a/components/viz/service/display/ca_layer_overlay.cc b/components/viz/service/display/ca_layer_overlay.cc
index 9323043..481f8a2 100644
--- a/components/viz/service/display/ca_layer_overlay.cc
+++ b/components/viz/service/display/ca_layer_overlay.cc
@@ -4,14 +4,357 @@
 
 #include "components/viz/service/display/ca_layer_overlay.h"
 
+#include <algorithm>
+
+#include "base/metrics/histogram_macros.h"
+#include "components/viz/common/quads/render_pass_draw_quad.h"
+#include "components/viz/common/quads/solid_color_draw_quad.h"
+#include "components/viz/common/quads/stream_video_draw_quad.h"
+#include "components/viz/common/quads/texture_draw_quad.h"
+#include "components/viz/common/quads/tile_draw_quad.h"
+#include "components/viz/service/display/display_resource_provider.h"
 #include "gpu/GLES2/gl2extchromium.h"
 
 namespace viz {
 
+namespace {
+
+// If there are too many RenderPassDrawQuads, we shouldn't use Core
+// Animation to present them as individual layers, since that potentially
+// doubles the amount of work needed to present them. cc has to blit them into
+// an IOSurface, and then Core Animation has to blit them to the final surface.
+// https://crbug.com/636884.
+const int kTooManyRenderPassDrawQuads = 30;
+
+// This enum is used for histogram states and should only have new values added
+// to the end before COUNT.
+enum CALayerResult {
+  CA_LAYER_SUCCESS = 0,
+  CA_LAYER_FAILED_UNKNOWN = 1,
+  // CA_LAYER_FAILED_IO_SURFACE_NOT_CANDIDATE = 2,
+  CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE = 3,
+  // CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM = 4,
+  CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE = 5,
+  // CA_LAYER_FAILED_TEXTURE_Y_FLIPPED = 6,
+  CA_LAYER_FAILED_TILE_NOT_CANDIDATE = 7,
+  CA_LAYER_FAILED_QUAD_BLEND_MODE = 8,
+  // CA_LAYER_FAILED_QUAD_TRANSFORM = 9,
+  // CA_LAYER_FAILED_QUAD_CLIPPING = 10,
+  CA_LAYER_FAILED_DEBUG_BORDER = 11,
+  CA_LAYER_FAILED_PICTURE_CONTENT = 12,
+  // CA_LAYER_FAILED_RENDER_PASS = 13,
+  CA_LAYER_FAILED_SURFACE_CONTENT = 14,
+  CA_LAYER_FAILED_YUV_VIDEO_CONTENT = 15,
+  CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS = 16,
+  CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES = 17,
+  // CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE = 18,
+  CA_LAYER_FAILED_RENDER_PASS_BACKDROP_FILTERS = 19,
+  // CA_LAYER_FAILED_RENDER_PASS_MASK = 20,
+  CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION = 21,
+  CA_LAYER_FAILED_RENDER_PASS_SORTING_CONTEXT_ID = 22,
+  CA_LAYER_FAILED_TOO_MANY_RENDER_PASS_DRAW_QUADS = 23,
+  // CA_LAYER_FAILED_QUAD_ROUNDED_CORNER = 24,
+  CA_LAYER_FAILED_QUAD_ROUNDED_CORNER_CLIP_MISMATCH = 25,
+  CA_LAYER_FAILED_QUAD_ROUNDED_CORNER_NOT_UNIFORM = 26,
+  CA_LAYER_FAILED_COUNT,
+};
+
+bool FilterOperationSupported(const cc::FilterOperation& operation) {
+  switch (operation.type()) {
+    case cc::FilterOperation::GRAYSCALE:
+    case cc::FilterOperation::SEPIA:
+    case cc::FilterOperation::SATURATE:
+    case cc::FilterOperation::HUE_ROTATE:
+    case cc::FilterOperation::INVERT:
+    case cc::FilterOperation::BRIGHTNESS:
+    case cc::FilterOperation::CONTRAST:
+    case cc::FilterOperation::OPACITY:
+    case cc::FilterOperation::BLUR:
+    case cc::FilterOperation::DROP_SHADOW:
+      return true;
+    default:
+      return false;
+  }
+}
+
+CALayerResult FromRenderPassQuad(
+    DisplayResourceProvider* resource_provider,
+    const RenderPassDrawQuad* quad,
+    const base::flat_map<RenderPassId, cc::FilterOperations*>&
+        render_pass_filters,
+    const base::flat_map<RenderPassId, cc::FilterOperations*>&
+        render_pass_backdrop_filters,
+    CALayerOverlay* ca_layer_overlay) {
+  if (render_pass_backdrop_filters.count(quad->render_pass_id)) {
+    return CA_LAYER_FAILED_RENDER_PASS_BACKDROP_FILTERS;
+  }
+
+  if (quad->shared_quad_state->sorting_context_id != 0)
+    return CA_LAYER_FAILED_RENDER_PASS_SORTING_CONTEXT_ID;
+
+  auto it = render_pass_filters.find(quad->render_pass_id);
+  if (it != render_pass_filters.end()) {
+    for (const auto& operation : it->second->operations()) {
+      bool success = FilterOperationSupported(operation);
+      if (!success)
+        return CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION;
+    }
+  }
+
+  ca_layer_overlay->rpdq = quad;
+  ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1);
+
+  return CA_LAYER_SUCCESS;
+}
+
+CALayerResult FromStreamVideoQuad(DisplayResourceProvider* resource_provider,
+                                  const StreamVideoDrawQuad* quad,
+                                  CALayerOverlay* ca_layer_overlay) {
+  unsigned resource_id = quad->resource_id();
+  if (!resource_provider->IsOverlayCandidate(resource_id))
+    return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE;
+  ca_layer_overlay->contents_resource_id = resource_id;
+  ca_layer_overlay->contents_rect =
+      BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
+  return CA_LAYER_SUCCESS;
+}
+
+CALayerResult FromSolidColorDrawQuad(const SolidColorDrawQuad* quad,
+                                     CALayerOverlay* ca_layer_overlay,
+                                     bool* skip) {
+  // Do not generate quads that are completely transparent.
+  if (SkColorGetA(quad->color) == 0) {
+    *skip = true;
+    return CA_LAYER_SUCCESS;
+  }
+  ca_layer_overlay->background_color = quad->color;
+  return CA_LAYER_SUCCESS;
+}
+
+CALayerResult FromTextureQuad(DisplayResourceProvider* resource_provider,
+                              const TextureDrawQuad* quad,
+                              CALayerOverlay* ca_layer_overlay) {
+  unsigned resource_id = quad->resource_id();
+  if (!resource_provider->IsOverlayCandidate(resource_id))
+    return CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE;
+  if (quad->y_flipped) {
+    // The anchor point is at the bottom-left corner of the CALayer. The
+    // transformation that flips the contents of the layer without changing its
+    // frame is the composition of a vertical flip about the anchor point, and a
+    // translation by the height of the layer.
+    ca_layer_overlay->shared_state->transform.preTranslate(
+        0, ca_layer_overlay->bounds_rect.height(), 0);
+    ca_layer_overlay->shared_state->transform.preScale(1, -1, 1);
+  }
+  ca_layer_overlay->contents_resource_id = resource_id;
+  ca_layer_overlay->contents_rect =
+      BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
+  ca_layer_overlay->background_color = quad->background_color;
+  for (int i = 1; i < 4; ++i) {
+    if (quad->vertex_opacity[i] != quad->vertex_opacity[0])
+      return CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES;
+  }
+  ca_layer_overlay->shared_state->opacity *= quad->vertex_opacity[0];
+  ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR;
+  return CA_LAYER_SUCCESS;
+}
+
+CALayerResult FromTileQuad(DisplayResourceProvider* resource_provider,
+                           const TileDrawQuad* quad,
+                           CALayerOverlay* ca_layer_overlay) {
+  unsigned resource_id = quad->resource_id();
+  if (!resource_provider->IsOverlayCandidate(resource_id))
+    return CA_LAYER_FAILED_TILE_NOT_CANDIDATE;
+  ca_layer_overlay->contents_resource_id = resource_id;
+  ca_layer_overlay->contents_rect = quad->tex_coord_rect;
+  ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(),
+                                        1.f / quad->texture_size.height());
+  ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR;
+  return CA_LAYER_SUCCESS;
+}
+
+class CALayerOverlayProcessor {
+ public:
+  CALayerResult FromDrawQuad(
+      DisplayResourceProvider* resource_provider,
+      const gfx::RectF& display_rect,
+      const DrawQuad* quad,
+      const base::flat_map<RenderPassId, cc::FilterOperations*>&
+          render_pass_filters,
+      const base::flat_map<RenderPassId, cc::FilterOperations*>&
+          render_pass_backdrop_filters,
+      CALayerOverlay* ca_layer_overlay,
+      bool* skip,
+      bool* render_pass_draw_quad) {
+    if (quad->shared_quad_state->blend_mode != SkBlendMode::kSrcOver)
+      return CA_LAYER_FAILED_QUAD_BLEND_MODE;
+
+    // Early-out for invisible quads.
+    if (quad->shared_quad_state->opacity == 0.f) {
+      *skip = true;
+      return CA_LAYER_SUCCESS;
+    }
+
+    // Support rounded corner bounds when they have the same rect as the clip
+    // rect, and all corners have the same radius. Note that it is entirely
+    // possible to make rounded corner rects independent of clip rect (by adding
+    // another CALayer to the tree). Handling non-single border radii is also,
+    // but requires APIs not supported on all macOS versions.
+    if (!quad->shared_quad_state->rounded_corner_bounds.IsEmpty()) {
+      DCHECK(quad->shared_quad_state->is_clipped);
+      if (quad->shared_quad_state->rounded_corner_bounds.GetType() >
+          gfx::RRectF::Type::kSingle) {
+        return CA_LAYER_FAILED_QUAD_ROUNDED_CORNER_NOT_UNIFORM;
+      }
+    }
+
+    // Enable edge anti-aliasing only on layer boundaries.
+    ca_layer_overlay->edge_aa_mask = 0;
+    if (quad->IsLeftEdge())
+      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_LEFT_CHROMIUM;
+    if (quad->IsRightEdge())
+      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_RIGHT_CHROMIUM;
+    if (quad->IsBottomEdge())
+      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM;
+    if (quad->IsTopEdge())
+      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_TOP_CHROMIUM;
+
+    if (most_recent_shared_quad_state_ != quad->shared_quad_state) {
+      most_recent_shared_quad_state_ = quad->shared_quad_state;
+      most_recent_overlay_shared_state_ = new CALayerOverlaySharedState;
+      // Set rect clipping and sorting context ID.
+      most_recent_overlay_shared_state_->sorting_context_id =
+          quad->shared_quad_state->sorting_context_id;
+      most_recent_overlay_shared_state_->is_clipped =
+          quad->shared_quad_state->is_clipped;
+      most_recent_overlay_shared_state_->clip_rect =
+          gfx::RectF(quad->shared_quad_state->clip_rect);
+      most_recent_overlay_shared_state_->rounded_corner_bounds =
+          quad->shared_quad_state->rounded_corner_bounds;
+
+      most_recent_overlay_shared_state_->opacity =
+          quad->shared_quad_state->opacity;
+      most_recent_overlay_shared_state_->transform =
+          quad->shared_quad_state->quad_to_target_transform.matrix();
+    }
+    ca_layer_overlay->shared_state = most_recent_overlay_shared_state_;
+
+    ca_layer_overlay->bounds_rect = gfx::RectF(quad->rect);
+
+    *render_pass_draw_quad = quad->material == DrawQuad::Material::kRenderPass;
+    switch (quad->material) {
+      case DrawQuad::Material::kTextureContent:
+        return FromTextureQuad(resource_provider,
+                               TextureDrawQuad::MaterialCast(quad),
+                               ca_layer_overlay);
+      case DrawQuad::Material::kTiledContent:
+        return FromTileQuad(resource_provider, TileDrawQuad::MaterialCast(quad),
+                            ca_layer_overlay);
+      case DrawQuad::Material::kSolidColor:
+        return FromSolidColorDrawQuad(SolidColorDrawQuad::MaterialCast(quad),
+                                      ca_layer_overlay, skip);
+      case DrawQuad::Material::kStreamVideoContent:
+        return FromStreamVideoQuad(resource_provider,
+                                   StreamVideoDrawQuad::MaterialCast(quad),
+                                   ca_layer_overlay);
+      case DrawQuad::Material::kDebugBorder:
+        return CA_LAYER_FAILED_DEBUG_BORDER;
+      case DrawQuad::Material::kPictureContent:
+        return CA_LAYER_FAILED_PICTURE_CONTENT;
+      case DrawQuad::Material::kRenderPass:
+        return FromRenderPassQuad(
+            resource_provider, RenderPassDrawQuad::MaterialCast(quad),
+            render_pass_filters, render_pass_backdrop_filters,
+            ca_layer_overlay);
+      case DrawQuad::Material::kSurfaceContent:
+        return CA_LAYER_FAILED_SURFACE_CONTENT;
+      case DrawQuad::Material::kYuvVideoContent:
+        return CA_LAYER_FAILED_YUV_VIDEO_CONTENT;
+      default:
+        break;
+    }
+
+    return CA_LAYER_FAILED_UNKNOWN;
+  }
+
+ private:
+  const SharedQuadState* most_recent_shared_quad_state_ = nullptr;
+  scoped_refptr<CALayerOverlaySharedState> most_recent_overlay_shared_state_;
+};
+
+}  // namespace
+
 CALayerOverlay::CALayerOverlay() : filter(GL_LINEAR) {}
 
 CALayerOverlay::CALayerOverlay(const CALayerOverlay& other) = default;
 
 CALayerOverlay::~CALayerOverlay() {}
 
+bool ProcessForCALayerOverlays(
+    DisplayResourceProvider* resource_provider,
+    const gfx::RectF& display_rect,
+    const QuadList& quad_list,
+    const base::flat_map<RenderPassId, cc::FilterOperations*>&
+        render_pass_filters,
+    const base::flat_map<RenderPassId, cc::FilterOperations*>&
+        render_pass_backdrop_filters,
+    CALayerOverlayList* ca_layer_overlays) {
+  CALayerResult result = CA_LAYER_SUCCESS;
+  ca_layer_overlays->reserve(quad_list.size());
+
+  int render_pass_draw_quad_count = 0;
+  CALayerOverlayProcessor processor;
+  for (auto it = quad_list.BackToFrontBegin(); it != quad_list.BackToFrontEnd();
+       ++it) {
+    const DrawQuad* quad = *it;
+    CALayerOverlay ca_layer;
+    bool skip = false;
+    bool render_pass_draw_quad = false;
+    result = processor.FromDrawQuad(
+        resource_provider, display_rect, quad, render_pass_filters,
+        render_pass_backdrop_filters, &ca_layer, &skip, &render_pass_draw_quad);
+    if (result != CA_LAYER_SUCCESS)
+      break;
+
+    if (render_pass_draw_quad) {
+      ++render_pass_draw_quad_count;
+      if (render_pass_draw_quad_count > kTooManyRenderPassDrawQuads) {
+        result = CA_LAYER_FAILED_TOO_MANY_RENDER_PASS_DRAW_QUADS;
+        break;
+      }
+    }
+
+    if (skip)
+      continue;
+
+    // It is not possible to correctly represent two different clipping settings
+    // within one sorting context.
+    if (!ca_layer_overlays->empty()) {
+      const CALayerOverlay& previous_ca_layer = ca_layer_overlays->back();
+      if (ca_layer.shared_state->sorting_context_id &&
+          previous_ca_layer.shared_state->sorting_context_id ==
+              ca_layer.shared_state->sorting_context_id) {
+        if (previous_ca_layer.shared_state->is_clipped !=
+                ca_layer.shared_state->is_clipped ||
+            previous_ca_layer.shared_state->clip_rect !=
+                ca_layer.shared_state->clip_rect) {
+          result = CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS;
+          break;
+        }
+      }
+    }
+
+    ca_layer_overlays->push_back(ca_layer);
+  }
+
+  UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result,
+                            CA_LAYER_FAILED_COUNT);
+
+  if (result != CA_LAYER_SUCCESS) {
+    ca_layer_overlays->clear();
+    return false;
+  }
+  return true;
+}
+
 }  // namespace viz
diff --git a/components/viz/service/display/ca_layer_overlay.h b/components/viz/service/display/ca_layer_overlay.h
index 2660df9..d8004ff3 100644
--- a/components/viz/service/display/ca_layer_overlay.h
+++ b/components/viz/service/display/ca_layer_overlay.h
@@ -16,6 +16,7 @@
 #include "ui/gl/ca_renderer_layer_params.h"
 
 namespace viz {
+class DisplayResourceProvider;
 class DrawQuad;
 class RenderPassDrawQuad;
 
@@ -73,6 +74,18 @@
 
 typedef std::vector<CALayerOverlay> CALayerOverlayList;
 
+// Returns true if all quads in the root render pass have been replaced by
+// CALayerOverlays.
+bool ProcessForCALayerOverlays(
+    DisplayResourceProvider* resource_provider,
+    const gfx::RectF& display_rect,
+    const QuadList& quad_list,
+    const base::flat_map<RenderPassId, cc::FilterOperations*>&
+        render_pass_filters,
+    const base::flat_map<RenderPassId, cc::FilterOperations*>&
+        render_pass_backdrop_filters,
+    CALayerOverlayList* ca_layer_overlays);
+
 }  // namespace viz
 
 #endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_CA_LAYER_OVERLAY_H_
diff --git a/components/viz/service/display/gl_renderer_unittest.cc b/components/viz/service/display/gl_renderer_unittest.cc
index b95e02e..9638d51 100644
--- a/components/viz/service/display/gl_renderer_unittest.cc
+++ b/components/viz/service/display/gl_renderer_unittest.cc
@@ -50,10 +50,6 @@
 #include "ui/gfx/transform.h"
 #include "ui/latency/latency_info.h"
 
-#if defined(OS_MACOSX)
-#include "components/viz/service/display/overlay_processor_ca.h"
-#endif
-
 using testing::_;
 using testing::AnyNumber;
 using testing::Args;
@@ -2242,8 +2238,6 @@
   array->insert(array->end(), returned.begin(), returned.end());
 }
 
-// TODO(weiliangc): This unit test should really be an overlay unit test. It is
-// very volatile during the refactoring of OverlayProcessor.
 TEST_F(GLRendererTest, DontOverlayWithCopyRequests) {
   cc::FakeOutputSurfaceClient output_surface_client;
   std::unique_ptr<FakeOutputSurface> output_surface(
@@ -2330,7 +2324,7 @@
 #if defined(USE_OZONE) || defined(OS_ANDROID)
   EXPECT_CALL(processor->strategy(), Attempt(_, _, _, _, _, _)).Times(0);
 #elif defined(OS_MACOSX)
-  // Mac's test is in overlay_ca_unittest.
+  EXPECT_CALL(*validator, AllowCALayerOverlays()).Times(0);
 #elif defined(OS_WIN)
   EXPECT_CALL(*validator, AllowDCLayerOverlays()).Times(0);
 #endif
@@ -2355,7 +2349,9 @@
 #if defined(USE_OZONE) || defined(OS_ANDROID)
   EXPECT_CALL(processor->strategy(), Attempt(_, _, _, _, _, _)).Times(1);
 #elif defined(OS_MACOSX)
-  // Mac's test is in overlay_ca_unittest.
+  EXPECT_CALL(*validator, AllowCALayerOverlays())
+      .Times(1)
+      .WillOnce(::testing::Return(false));
 #elif defined(OS_WIN)
   EXPECT_CALL(*validator, AllowDCLayerOverlays())
       .Times(1)
@@ -2363,9 +2359,6 @@
 #endif
   DrawFrame(&renderer, viewport_size);
 
-  // TODO(weiliangc): ProcessForOverlays should be a single path on each
-  // platform. When OverlayProcessor refactor happens, this part of the test
-  // will be obsolete.
   // If the CALayerOverlay path is taken, then the ordinary overlay path should
   // not be called.
   root_pass = cc::AddRenderPass(&render_passes_in_draw_order_, 1,
@@ -2381,7 +2374,9 @@
       SK_ColorTRANSPARENT, vertex_opacity, flipped, nearest_neighbor,
       /*secure_output_only=*/false, gfx::ProtectedVideoType::kClear);
 #if defined(OS_MACOSX)
-  // Mac's test is in overlay_ca_unittest.
+  EXPECT_CALL(*validator, AllowCALayerOverlays())
+      .Times(1)
+      .WillOnce(::testing::Return(true));
 #elif defined(USE_OZONE) || defined(OS_ANDROID)
   EXPECT_CALL(processor->strategy(), Attempt(_, _, _, _, _, _)).Times(1);
 #elif defined(OS_WIN)
@@ -3150,6 +3145,14 @@
 #endif  // defined(USE_OZONE) || defined(OS_ANDROID)
 
 #if defined(OS_MACOSX)
+class CALayerValidator : public OverlayCandidateValidator {
+ public:
+  bool AllowCALayerOverlays() const override { return true; }
+  bool AllowDCLayerOverlays() const override { return false; }
+  bool NeedsSurfaceOccludingDamageRect() const override { return false; }
+  void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
+};
+
 class MockCALayerGLES2Interface : public TestGLES2Interface {
  public:
   MOCK_METHOD6(ScheduleCALayerSharedStateCHROMIUM,
@@ -3210,7 +3213,9 @@
     // This validator allows the renderer to make CALayer overlays. If all
     // quads can be turned into CALayer overlays, then all damage is removed and
     // we can skip the root RenderPass, swapping empty.
-    OverlayProcessorCA* processor = new OverlayProcessorCA(true /* allow_ca */);
+    TestOverlayProcessor* processor =
+        new TestOverlayProcessor(output_surface_->context_provider(),
+                                 std::make_unique<CALayerValidator>());
     renderer_->SetOverlayProcessor(processor);
   }
 
diff --git a/components/viz/service/display/overlay_ca_unittest.cc b/components/viz/service/display/overlay_ca_unittest.cc
index 3ab3b36..f1c371b 100644
--- a/components/viz/service/display/overlay_ca_unittest.cc
+++ b/components/viz/service/display/overlay_ca_unittest.cc
@@ -16,7 +16,6 @@
 #include "cc/test/geometry_test_utils.h"
 #include "cc/test/resource_provider_test_utils.h"
 #include "components/viz/client/client_resource_provider.h"
-#include "components/viz/common/frame_sinks/copy_output_request.h"
 #include "components/viz/common/quads/render_pass.h"
 #include "components/viz/common/quads/render_pass_draw_quad.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
@@ -30,7 +29,8 @@
 #include "components/viz/service/display/output_surface.h"
 #include "components/viz/service/display/output_surface_client.h"
 #include "components/viz/service/display/output_surface_frame.h"
-#include "components/viz/service/display/overlay_processor_ca.h"
+#include "components/viz/service/display/overlay_candidate_validator.h"
+#include "components/viz/service/display/overlay_processor.h"
 #include "components/viz/test/test_context_provider.h"
 #include "components/viz/test/test_gles2_interface.h"
 #include "components/viz/test/test_shared_bitmap_manager.h"
@@ -50,6 +50,14 @@
 const gfx::PointF kUVTopLeft(0.1f, 0.2f);
 const gfx::PointF kUVBottomRight(1.0f, 1.0f);
 
+class CALayerValidator : public OverlayCandidateValidator {
+ public:
+  bool AllowCALayerOverlays() const override { return true; }
+  bool AllowDCLayerOverlays() const override { return false; }
+  bool NeedsSurfaceOccludingDamageRect() const override { return false; }
+  void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
+};
+
 class OverlayOutputSurface : public OutputSurface {
  public:
   explicit OverlayOutputSurface(
@@ -93,6 +101,13 @@
   unsigned bind_framebuffer_count_ = 0;
 };
 
+class CATestOverlayProcessor : public OverlayProcessor {
+ public:
+  CATestOverlayProcessor() : OverlayProcessor(nullptr) {
+    SetOverlayCandidateValidator(std::make_unique<CALayerValidator>());
+  }
+};
+
 std::unique_ptr<RenderPass> CreateRenderPass() {
   int render_pass_id = 1;
   gfx::Rect output_rect(0, 0, 256, 256);
@@ -224,8 +239,7 @@
     child_provider_->BindToCurrentThread();
     child_resource_provider_ = std::make_unique<ClientResourceProvider>(true);
 
-    overlay_processor_ =
-        std::make_unique<OverlayProcessorCA>(true /* allow_ca */);
+    overlay_processor_ = std::make_unique<CATestOverlayProcessor>();
   }
 
   void TearDown() override {
@@ -246,34 +260,11 @@
   std::unique_ptr<DisplayResourceProvider> resource_provider_;
   scoped_refptr<TestContextProvider> child_provider_;
   std::unique_ptr<ClientResourceProvider> child_resource_provider_;
-  std::unique_ptr<OverlayProcessorCA> overlay_processor_;
+  std::unique_ptr<CATestOverlayProcessor> overlay_processor_;
   gfx::Rect damage_rect_;
   std::vector<gfx::Rect> content_bounds_;
 };
 
-TEST_F(CALayerOverlayTest, DoNotOverlayCopyRequest) {
-  std::unique_ptr<RenderPass> pass = CreateRenderPass();
-  CreateFullscreenCandidateQuad(
-      resource_provider_.get(), child_resource_provider_.get(),
-      child_provider_.get(), pass->shared_quad_state_list.back(), pass.get());
-  pass->copy_requests.push_back(CopyOutputRequest::CreateStubForTesting());
-
-  gfx::Rect damage_rect;
-  CALayerOverlayList ca_layer_list;
-  OverlayProcessor::FilterOperationsMap render_pass_filters;
-  OverlayProcessor::FilterOperationsMap render_pass_backdrop_filters;
-  RenderPassList pass_list;
-  pass_list.push_back(std::move(pass));
-  overlay_processor_->ProcessForOverlays(
-      resource_provider_.get(), &pass_list, GetIdentityColorMatrix(),
-      render_pass_filters, render_pass_backdrop_filters, &ca_layer_list,
-      &damage_rect_, &content_bounds_);
-
-  EXPECT_EQ(gfx::Rect(), damage_rect);
-  EXPECT_EQ(0U, ca_layer_list.size());
-  EXPECT_EQ(0U, output_surface_->bind_framebuffer_count());
-}
-
 TEST_F(CALayerOverlayTest, AllowNonAxisAlignedTransform) {
   std::unique_ptr<RenderPass> pass = CreateRenderPass();
   CreateFullscreenCandidateQuad(
diff --git a/components/viz/service/display/overlay_candidate_validator.cc b/components/viz/service/display/overlay_candidate_validator.cc
index 7c28da6..1213e1c 100644
--- a/components/viz/service/display/overlay_candidate_validator.cc
+++ b/components/viz/service/display/overlay_candidate_validator.cc
@@ -16,6 +16,10 @@
 #include "gpu/config/gpu_feature_info.h"
 #endif
 
+#if defined(OS_MACOSX)
+#include "components/viz/service/display_embedder/overlay_candidate_validator_mac.h"
+#endif
+
 #if defined(OS_WIN)
 #include "base/feature_list.h"
 #include "components/viz/service/display_embedder/overlay_candidate_validator_win.h"
@@ -112,8 +116,8 @@
     return CreateOverlayCandidateValidatorOzone(surface_handle,
                                                 renderer_settings);
 #elif defined(OS_MACOSX)
-    // Mac's CA Overlay is handled inside OverlayProcessorCA without use of
-    // a validator.
+    return std::make_unique<OverlayCandidateValidatorMac>(
+        !renderer_settings.allow_overlays);
 #elif defined(OS_ANDROID)
     return std::make_unique<OverlayCandidateValidatorSurfaceControl>();
 #else
diff --git a/components/viz/service/display/overlay_processor.cc b/components/viz/service/display/overlay_processor.cc
index 5ab84dc7..b46c6244 100644
--- a/components/viz/service/display/overlay_processor.cc
+++ b/components/viz/service/display/overlay_processor.cc
@@ -9,8 +9,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "components/viz/common/display/renderer_settings.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
+#include "components/viz/service/display/dc_layer_overlay.h"
 #include "components/viz/service/display/display_resource_provider.h"
 #include "components/viz/service/display/output_surface.h"
 #include "components/viz/service/display/overlay_candidate_validator.h"
@@ -19,10 +19,6 @@
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/transform.h"
 
-#if defined(OS_MACOSX)
-#include "components/viz/service/display/overlay_processor_ca.h"
-#endif
-
 namespace viz {
 
 namespace {
@@ -106,18 +102,11 @@
     const ContextProvider* context_provider,
     gpu::SurfaceHandle surface_handle,
     const RendererSettings& renderer_settings) {
-#if defined(OS_MACOSX)
-  bool allow_ca_layer_overlays = surface_handle != gpu::kNullSurfaceHandle;
-  allow_ca_layer_overlays &= renderer_settings.allow_overlays;
-
-  std::unique_ptr<OverlayProcessorCA> processor(
-      new OverlayProcessorCA(allow_ca_layer_overlays));
-#else
   std::unique_ptr<OverlayProcessor> processor(
       new OverlayProcessor(context_provider));
+
   processor->SetOverlayCandidateValidator(OverlayCandidateValidator::Create(
       surface_handle, context_provider, renderer_settings));
-#endif
 
   return processor;
 }
@@ -143,13 +132,34 @@
   return result;
 }
 
-bool OverlayProcessor::ProcessForOverlayInternal(
+bool OverlayProcessor::ProcessForCALayers(
     DisplayResourceProvider* resource_provider,
-    RenderPassList* render_passes,
-    const FilterOperationsMap& render_pass_filters,
-    const FilterOperationsMap& render_pass_backdrop_filters,
-    CandidateList* overlay_candidates,
+    RenderPass* render_pass,
+    const OverlayProcessor::FilterOperationsMap& render_pass_filters,
+    const OverlayProcessor::FilterOperationsMap& render_pass_backdrop_filters,
+    CandidateList* ca_layer_overlays,
     gfx::Rect* damage_rect) {
+#if defined(OS_MACOSX)
+  // Skip overlay processing if we have copy request.
+  if (!render_pass->copy_requests.empty())
+    return true;
+
+  if (!overlay_validator_ || !overlay_validator_->AllowCALayerOverlays())
+    return false;
+
+  if (!ProcessForCALayerOverlays(
+          resource_provider, gfx::RectF(render_pass->output_rect),
+          render_pass->quad_list, render_pass_filters,
+          render_pass_backdrop_filters, ca_layer_overlays))
+    return false;
+
+  // CALayer overlays are all-or-nothing. If all quads were replaced with
+  // layers then mark the output surface as already handled.
+  output_surface_already_handled_ = true;
+  overlay_damage_rect_ = render_pass->output_rect;
+  *damage_rect = gfx::Rect();
+  return true;
+#endif  // defined(OS_MACOSX)
   return false;
 }
 
@@ -199,10 +209,13 @@
   SendPromotionHintsBeforeReturning notifier(resource_provider, candidates);
 #endif
 
+  // Clear to get ready to handle output surface as overlay.
+  output_surface_already_handled_ = false;
+
   // First attempt to process for CALayers.
-  if (ProcessForOverlayInternal(
-          resource_provider, render_passes, render_pass_filters,
-          render_pass_backdrop_filters, candidates, damage_rect)) {
+  if (ProcessForCALayers(resource_provider, render_passes->back().get(),
+                         render_pass_filters, render_pass_backdrop_filters,
+                         candidates, damage_rect)) {
     return;
   }
 
@@ -326,14 +339,14 @@
   previous_frame_underlay_rect_ = this_frame_underlay_rect;
 }
 
-// The return value is optional because for Mac's OverlayProcessorCA the output
-// surface could only be represented as an overlay when the CA overlay
-// processing has failed.
 base::Optional<OverlayProcessor::OutputSurfaceOverlayPlane>
 OverlayProcessor::ProcessOutputSurfaceAsOverlay(
     const gfx::Size& viewport_size,
     const gfx::BufferFormat& buffer_format,
     const gfx::ColorSpace& color_space) const {
+  if (output_surface_already_handled_)
+    return base::nullopt;
+
   OutputSurfaceOverlayPlane overlay_plane;
   overlay_plane.transform = gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE;
   overlay_plane.resource_size = viewport_size;
diff --git a/components/viz/service/display/overlay_processor.h b/components/viz/service/display/overlay_processor.h
index 303371ae..cb3233ac 100644
--- a/components/viz/service/display/overlay_processor.h
+++ b/components/viz/service/display/overlay_processor.h
@@ -133,10 +133,10 @@
   // TODO(weiliangc): Eventually the asymmetry between primary plane and
   // non-primary places should be internalized and should not have a special
   // API.
-  virtual base::Optional<OutputSurfaceOverlayPlane>
-  ProcessOutputSurfaceAsOverlay(const gfx::Size& viewport_size,
-                                const gfx::BufferFormat& buffer_format,
-                                const gfx::ColorSpace& color_space) const;
+  base::Optional<OutputSurfaceOverlayPlane> ProcessOutputSurfaceAsOverlay(
+      const gfx::Size& viewport_size,
+      const gfx::BufferFormat& buffer_format,
+      const gfx::ColorSpace& color_space) const;
 
 #if defined(OS_WIN)
   void SetDCHasHwOverlaySupportForTesting() {
@@ -149,14 +149,6 @@
   void SetOverlayCandidateValidator(
       std::unique_ptr<OverlayCandidateValidator> overlay_validator);
 
-  virtual bool ProcessForOverlayInternal(
-      DisplayResourceProvider* resource_provider,
-      RenderPassList* render_passes,
-      const FilterOperationsMap& render_pass_filters,
-      const FilterOperationsMap& render_pass_backdrop_filters,
-      CandidateList* overlay_candidates,
-      gfx::Rect* damage_rect);
-
   StrategyList strategies_;
   std::unique_ptr<OverlayCandidateValidator> overlay_validator_;
   gfx::Rect overlay_damage_rect_;
@@ -164,6 +156,13 @@
   bool previous_frame_underlay_was_unoccluded_ = false;
 
  private:
+  bool ProcessForCALayers(
+      DisplayResourceProvider* resource_provider,
+      RenderPass* render_pass,
+      const FilterOperationsMap& render_pass_filters,
+      const FilterOperationsMap& render_pass_backdrop_filters,
+      CandidateList* overlay_candidates,
+      gfx::Rect* damage_rect);
   bool ProcessForDCLayers(
       DisplayResourceProvider* resource_provider,
       RenderPassList* render_passes,
@@ -182,6 +181,7 @@
   std::unique_ptr<DCLayerOverlayProcessor> dc_processor_;
 #endif
 
+  bool output_surface_already_handled_;
   DISALLOW_COPY_AND_ASSIGN(OverlayProcessor);
 };
 
diff --git a/components/viz/service/display/overlay_processor_ca.cc b/components/viz/service/display/overlay_processor_ca.cc
deleted file mode 100644
index 74c0616..0000000
--- a/components/viz/service/display/overlay_processor_ca.cc
+++ /dev/null
@@ -1,406 +0,0 @@
-// Copyright 2019 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 "components/viz/service/display/overlay_processor_ca.h"
-
-#include <algorithm>
-
-#include "base/metrics/histogram_macros.h"
-#include "components/viz/common/quads/render_pass_draw_quad.h"
-#include "components/viz/common/quads/solid_color_draw_quad.h"
-#include "components/viz/common/quads/stream_video_draw_quad.h"
-#include "components/viz/common/quads/texture_draw_quad.h"
-#include "components/viz/common/quads/tile_draw_quad.h"
-#include "components/viz/service/display/display_resource_provider.h"
-#include "gpu/GLES2/gl2extchromium.h"
-
-namespace viz {
-
-namespace {
-
-// If there are too many RenderPassDrawQuads, we shouldn't use Core
-// Animation to present them as individual layers, since that potentially
-// doubles the amount of work needed to present them. cc has to blit them into
-// an IOSurface, and then Core Animation has to blit them to the final surface.
-// https://crbug.com/636884.
-const int kTooManyRenderPassDrawQuads = 30;
-
-// This enum is used for histogram states and should only have new values added
-// to the end before COUNT.
-enum CALayerResult {
-  CA_LAYER_SUCCESS = 0,
-  CA_LAYER_FAILED_UNKNOWN = 1,
-  // CA_LAYER_FAILED_IO_SURFACE_NOT_CANDIDATE = 2,
-  CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE = 3,
-  // CA_LAYER_FAILED_STREAM_VIDEO_TRANSFORM = 4,
-  CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE = 5,
-  // CA_LAYER_FAILED_TEXTURE_Y_FLIPPED = 6,
-  CA_LAYER_FAILED_TILE_NOT_CANDIDATE = 7,
-  CA_LAYER_FAILED_QUAD_BLEND_MODE = 8,
-  // CA_LAYER_FAILED_QUAD_TRANSFORM = 9,
-  // CA_LAYER_FAILED_QUAD_CLIPPING = 10,
-  CA_LAYER_FAILED_DEBUG_BORDER = 11,
-  CA_LAYER_FAILED_PICTURE_CONTENT = 12,
-  // CA_LAYER_FAILED_RENDER_PASS = 13,
-  CA_LAYER_FAILED_SURFACE_CONTENT = 14,
-  CA_LAYER_FAILED_YUV_VIDEO_CONTENT = 15,
-  CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS = 16,
-  CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES = 17,
-  // CA_LAYER_FAILED_RENDER_PASS_FILTER_SCALE = 18,
-  CA_LAYER_FAILED_RENDER_PASS_BACKDROP_FILTERS = 19,
-  // CA_LAYER_FAILED_RENDER_PASS_MASK = 20,
-  CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION = 21,
-  CA_LAYER_FAILED_RENDER_PASS_SORTING_CONTEXT_ID = 22,
-  CA_LAYER_FAILED_TOO_MANY_RENDER_PASS_DRAW_QUADS = 23,
-  // CA_LAYER_FAILED_QUAD_ROUNDED_CORNER = 24,
-  CA_LAYER_FAILED_QUAD_ROUNDED_CORNER_CLIP_MISMATCH = 25,
-  CA_LAYER_FAILED_QUAD_ROUNDED_CORNER_NOT_UNIFORM = 26,
-  CA_LAYER_FAILED_COUNT,
-};
-
-bool FilterOperationSupported(const cc::FilterOperation& operation) {
-  switch (operation.type()) {
-    case cc::FilterOperation::GRAYSCALE:
-    case cc::FilterOperation::SEPIA:
-    case cc::FilterOperation::SATURATE:
-    case cc::FilterOperation::HUE_ROTATE:
-    case cc::FilterOperation::INVERT:
-    case cc::FilterOperation::BRIGHTNESS:
-    case cc::FilterOperation::CONTRAST:
-    case cc::FilterOperation::OPACITY:
-    case cc::FilterOperation::BLUR:
-    case cc::FilterOperation::DROP_SHADOW:
-      return true;
-    default:
-      return false;
-  }
-}
-
-CALayerResult FromRenderPassQuad(
-    DisplayResourceProvider* resource_provider,
-    const RenderPassDrawQuad* quad,
-    const base::flat_map<RenderPassId, cc::FilterOperations*>&
-        render_pass_filters,
-    const base::flat_map<RenderPassId, cc::FilterOperations*>&
-        render_pass_backdrop_filters,
-    CALayerOverlay* ca_layer_overlay) {
-  if (render_pass_backdrop_filters.count(quad->render_pass_id)) {
-    return CA_LAYER_FAILED_RENDER_PASS_BACKDROP_FILTERS;
-  }
-
-  if (quad->shared_quad_state->sorting_context_id != 0)
-    return CA_LAYER_FAILED_RENDER_PASS_SORTING_CONTEXT_ID;
-
-  auto it = render_pass_filters.find(quad->render_pass_id);
-  if (it != render_pass_filters.end()) {
-    for (const auto& operation : it->second->operations()) {
-      bool success = FilterOperationSupported(operation);
-      if (!success)
-        return CA_LAYER_FAILED_RENDER_PASS_FILTER_OPERATION;
-    }
-  }
-
-  ca_layer_overlay->rpdq = quad;
-  ca_layer_overlay->contents_rect = gfx::RectF(0, 0, 1, 1);
-
-  return CA_LAYER_SUCCESS;
-}
-
-CALayerResult FromStreamVideoQuad(DisplayResourceProvider* resource_provider,
-                                  const StreamVideoDrawQuad* quad,
-                                  CALayerOverlay* ca_layer_overlay) {
-  unsigned resource_id = quad->resource_id();
-  if (!resource_provider->IsOverlayCandidate(resource_id))
-    return CA_LAYER_FAILED_STREAM_VIDEO_NOT_CANDIDATE;
-  ca_layer_overlay->contents_resource_id = resource_id;
-  ca_layer_overlay->contents_rect =
-      BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
-  return CA_LAYER_SUCCESS;
-}
-
-CALayerResult FromSolidColorDrawQuad(const SolidColorDrawQuad* quad,
-                                     CALayerOverlay* ca_layer_overlay,
-                                     bool* skip) {
-  // Do not generate quads that are completely transparent.
-  if (SkColorGetA(quad->color) == 0) {
-    *skip = true;
-    return CA_LAYER_SUCCESS;
-  }
-  ca_layer_overlay->background_color = quad->color;
-  return CA_LAYER_SUCCESS;
-}
-
-CALayerResult FromTextureQuad(DisplayResourceProvider* resource_provider,
-                              const TextureDrawQuad* quad,
-                              CALayerOverlay* ca_layer_overlay) {
-  unsigned resource_id = quad->resource_id();
-  if (!resource_provider->IsOverlayCandidate(resource_id))
-    return CA_LAYER_FAILED_TEXTURE_NOT_CANDIDATE;
-  if (quad->y_flipped) {
-    // The anchor point is at the bottom-left corner of the CALayer. The
-    // transformation that flips the contents of the layer without changing its
-    // frame is the composition of a vertical flip about the anchor point, and a
-    // translation by the height of the layer.
-    ca_layer_overlay->shared_state->transform.preTranslate(
-        0, ca_layer_overlay->bounds_rect.height(), 0);
-    ca_layer_overlay->shared_state->transform.preScale(1, -1, 1);
-  }
-  ca_layer_overlay->contents_resource_id = resource_id;
-  ca_layer_overlay->contents_rect =
-      BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
-  ca_layer_overlay->background_color = quad->background_color;
-  for (int i = 1; i < 4; ++i) {
-    if (quad->vertex_opacity[i] != quad->vertex_opacity[0])
-      return CA_LAYER_FAILED_DIFFERENT_VERTEX_OPACITIES;
-  }
-  ca_layer_overlay->shared_state->opacity *= quad->vertex_opacity[0];
-  ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR;
-  return CA_LAYER_SUCCESS;
-}
-
-CALayerResult FromTileQuad(DisplayResourceProvider* resource_provider,
-                           const TileDrawQuad* quad,
-                           CALayerOverlay* ca_layer_overlay) {
-  unsigned resource_id = quad->resource_id();
-  if (!resource_provider->IsOverlayCandidate(resource_id))
-    return CA_LAYER_FAILED_TILE_NOT_CANDIDATE;
-  ca_layer_overlay->contents_resource_id = resource_id;
-  ca_layer_overlay->contents_rect = quad->tex_coord_rect;
-  ca_layer_overlay->contents_rect.Scale(1.f / quad->texture_size.width(),
-                                        1.f / quad->texture_size.height());
-  ca_layer_overlay->filter = quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR;
-  return CA_LAYER_SUCCESS;
-}
-
-class SingleUseCALayerProcessor {
- public:
-  CALayerResult FromDrawQuad(
-      DisplayResourceProvider* resource_provider,
-      const gfx::RectF& display_rect,
-      const DrawQuad* quad,
-      const base::flat_map<RenderPassId, cc::FilterOperations*>&
-          render_pass_filters,
-      const base::flat_map<RenderPassId, cc::FilterOperations*>&
-          render_pass_backdrop_filters,
-      CALayerOverlay* ca_layer_overlay,
-      bool* skip,
-      bool* render_pass_draw_quad) {
-    if (quad->shared_quad_state->blend_mode != SkBlendMode::kSrcOver)
-      return CA_LAYER_FAILED_QUAD_BLEND_MODE;
-
-    // Early-out for invisible quads.
-    if (quad->shared_quad_state->opacity == 0.f) {
-      *skip = true;
-      return CA_LAYER_SUCCESS;
-    }
-
-    // Support rounded corner bounds when they have the same rect as the clip
-    // rect, and all corners have the same radius. Note that it is entirely
-    // possible to make rounded corner rects independent of clip rect (by adding
-    // another CALayer to the tree). Handling non-single border radii is also,
-    // but requires APIs not supported on all macOS versions.
-    if (!quad->shared_quad_state->rounded_corner_bounds.IsEmpty()) {
-      DCHECK(quad->shared_quad_state->is_clipped);
-      if (quad->shared_quad_state->rounded_corner_bounds.GetType() >
-          gfx::RRectF::Type::kSingle) {
-        return CA_LAYER_FAILED_QUAD_ROUNDED_CORNER_NOT_UNIFORM;
-      }
-    }
-
-    // Enable edge anti-aliasing only on layer boundaries.
-    ca_layer_overlay->edge_aa_mask = 0;
-    if (quad->IsLeftEdge())
-      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_LEFT_CHROMIUM;
-    if (quad->IsRightEdge())
-      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_RIGHT_CHROMIUM;
-    if (quad->IsBottomEdge())
-      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_BOTTOM_CHROMIUM;
-    if (quad->IsTopEdge())
-      ca_layer_overlay->edge_aa_mask |= GL_CA_LAYER_EDGE_TOP_CHROMIUM;
-
-    if (most_recent_shared_quad_state_ != quad->shared_quad_state) {
-      most_recent_shared_quad_state_ = quad->shared_quad_state;
-      most_recent_overlay_shared_state_ = new CALayerOverlaySharedState;
-      // Set rect clipping and sorting context ID.
-      most_recent_overlay_shared_state_->sorting_context_id =
-          quad->shared_quad_state->sorting_context_id;
-      most_recent_overlay_shared_state_->is_clipped =
-          quad->shared_quad_state->is_clipped;
-      most_recent_overlay_shared_state_->clip_rect =
-          gfx::RectF(quad->shared_quad_state->clip_rect);
-      most_recent_overlay_shared_state_->rounded_corner_bounds =
-          quad->shared_quad_state->rounded_corner_bounds;
-
-      most_recent_overlay_shared_state_->opacity =
-          quad->shared_quad_state->opacity;
-      most_recent_overlay_shared_state_->transform =
-          quad->shared_quad_state->quad_to_target_transform.matrix();
-    }
-    ca_layer_overlay->shared_state = most_recent_overlay_shared_state_;
-
-    ca_layer_overlay->bounds_rect = gfx::RectF(quad->rect);
-
-    *render_pass_draw_quad = quad->material == DrawQuad::Material::kRenderPass;
-    switch (quad->material) {
-      case DrawQuad::Material::kTextureContent:
-        return FromTextureQuad(resource_provider,
-                               TextureDrawQuad::MaterialCast(quad),
-                               ca_layer_overlay);
-      case DrawQuad::Material::kTiledContent:
-        return FromTileQuad(resource_provider, TileDrawQuad::MaterialCast(quad),
-                            ca_layer_overlay);
-      case DrawQuad::Material::kSolidColor:
-        return FromSolidColorDrawQuad(SolidColorDrawQuad::MaterialCast(quad),
-                                      ca_layer_overlay, skip);
-      case DrawQuad::Material::kStreamVideoContent:
-        return FromStreamVideoQuad(resource_provider,
-                                   StreamVideoDrawQuad::MaterialCast(quad),
-                                   ca_layer_overlay);
-      case DrawQuad::Material::kDebugBorder:
-        return CA_LAYER_FAILED_DEBUG_BORDER;
-      case DrawQuad::Material::kPictureContent:
-        return CA_LAYER_FAILED_PICTURE_CONTENT;
-      case DrawQuad::Material::kRenderPass:
-        return FromRenderPassQuad(
-            resource_provider, RenderPassDrawQuad::MaterialCast(quad),
-            render_pass_filters, render_pass_backdrop_filters,
-            ca_layer_overlay);
-      case DrawQuad::Material::kSurfaceContent:
-        return CA_LAYER_FAILED_SURFACE_CONTENT;
-      case DrawQuad::Material::kYuvVideoContent:
-        return CA_LAYER_FAILED_YUV_VIDEO_CONTENT;
-      default:
-        break;
-    }
-
-    return CA_LAYER_FAILED_UNKNOWN;
-  }
-
- private:
-  const SharedQuadState* most_recent_shared_quad_state_ = nullptr;
-  scoped_refptr<CALayerOverlaySharedState> most_recent_overlay_shared_state_;
-};
-
-}  // namespace
-
-bool OverlayProcessorCA::ProcessForCALayerOverlays(
-    DisplayResourceProvider* resource_provider,
-    const gfx::RectF& display_rect,
-    const QuadList& quad_list,
-    const base::flat_map<RenderPassId, cc::FilterOperations*>&
-        render_pass_filters,
-    const base::flat_map<RenderPassId, cc::FilterOperations*>&
-        render_pass_backdrop_filters,
-    CALayerOverlayList* ca_layer_overlays) {
-  CALayerResult result = CA_LAYER_SUCCESS;
-  ca_layer_overlays->reserve(quad_list.size());
-
-  int render_pass_draw_quad_count = 0;
-  SingleUseCALayerProcessor processor;
-  for (auto it = quad_list.BackToFrontBegin(); it != quad_list.BackToFrontEnd();
-       ++it) {
-    const DrawQuad* quad = *it;
-    CALayerOverlay ca_layer;
-    bool skip = false;
-    bool render_pass_draw_quad = false;
-    result = processor.FromDrawQuad(
-        resource_provider, display_rect, quad, render_pass_filters,
-        render_pass_backdrop_filters, &ca_layer, &skip, &render_pass_draw_quad);
-    if (result != CA_LAYER_SUCCESS)
-      break;
-
-    if (render_pass_draw_quad) {
-      ++render_pass_draw_quad_count;
-      if (render_pass_draw_quad_count > kTooManyRenderPassDrawQuads) {
-        result = CA_LAYER_FAILED_TOO_MANY_RENDER_PASS_DRAW_QUADS;
-        break;
-      }
-    }
-
-    if (skip)
-      continue;
-
-    // It is not possible to correctly represent two different clipping settings
-    // within one sorting context.
-    if (!ca_layer_overlays->empty()) {
-      const CALayerOverlay& previous_ca_layer = ca_layer_overlays->back();
-      if (ca_layer.shared_state->sorting_context_id &&
-          previous_ca_layer.shared_state->sorting_context_id ==
-              ca_layer.shared_state->sorting_context_id) {
-        if (previous_ca_layer.shared_state->is_clipped !=
-                ca_layer.shared_state->is_clipped ||
-            previous_ca_layer.shared_state->clip_rect !=
-                ca_layer.shared_state->clip_rect) {
-          result = CA_LAYER_FAILED_DIFFERENT_CLIP_SETTINGS;
-          break;
-        }
-      }
-    }
-
-    ca_layer_overlays->push_back(ca_layer);
-  }
-
-  UMA_HISTOGRAM_ENUMERATION("Compositing.Renderer.CALayerResult", result,
-                            CA_LAYER_FAILED_COUNT);
-
-  if (result != CA_LAYER_SUCCESS) {
-    ca_layer_overlays->clear();
-    return false;
-  }
-  return true;
-}
-
-OverlayProcessorCA::OverlayProcessorCA(bool allow_ca_layer_overlays)
-    : OverlayProcessor(nullptr),
-      allow_ca_layer_overlays_(allow_ca_layer_overlays) {}
-
-bool OverlayProcessorCA::ProcessForOverlayInternal(
-    DisplayResourceProvider* resource_provider,
-    RenderPassList* render_passes,
-    const FilterOperationsMap& render_pass_filters,
-    const FilterOperationsMap& render_pass_backdrop_filters,
-    CALayerOverlayList* overlay_candidates,
-    gfx::Rect* damage_rect) {
-  output_surface_already_handled_ = false;
-
-  if (!allow_ca_layer_overlays_)
-    return false;
-
-  auto* render_pass = render_passes->back().get();
-
-  // Skip overlay process if we have copy request.
-  if (!render_pass->copy_requests.empty())
-    return true;
-
-  if (!ProcessForCALayerOverlays(
-          resource_provider, gfx::RectF(render_pass->output_rect),
-          render_pass->quad_list, render_pass_filters,
-          render_pass_backdrop_filters, overlay_candidates))
-    return false;
-
-  // CALayer overlays are all-or-nothing. If all quads were replaced with
-  // layers then clear the list and remove the backbuffer from the
-  // overcandidate list.
-  output_surface_already_handled_ = true;
-  overlay_damage_rect_ = render_pass->output_rect;
-  *damage_rect = gfx::Rect();
-  return true;
-}
-
-// TODO(weiliangc): When the Mac's usage of surfaceless surface is exposed so
-// this case can be represented as a CALayer as well, this special case code can
-// be removed.
-base::Optional<OverlayProcessor::OutputSurfaceOverlayPlane>
-OverlayProcessorCA::ProcessOutputSurfaceAsOverlay(
-    const gfx::Size& viewport_size,
-    const gfx::BufferFormat& buffer_format,
-    const gfx::ColorSpace& color_space) const {
-  if (output_surface_already_handled_)
-    return base::nullopt;
-
-  return OverlayProcessor::ProcessOutputSurfaceAsOverlay(
-      viewport_size, buffer_format, color_space);
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/overlay_processor_ca.h b/components/viz/service/display/overlay_processor_ca.h
deleted file mode 100644
index ad44ad48..0000000
--- a/components/viz/service/display/overlay_processor_ca.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2019 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 COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_CA_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_CA_H_
-
-#include "components/viz/service/display/ca_layer_overlay.h"
-#include "components/viz/service/display/overlay_processor.h"
-#include "components/viz/service/viz_service_export.h"
-
-namespace viz {
-class DisplayResourceProvider;
-
-// TODO(weiliangc): Eventually move all the schedule overlay code from
-// GLRenderer to inside this class, and then no need to export CALayerOverlay
-// class.
-class VIZ_SERVICE_EXPORT OverlayProcessorCA : public OverlayProcessor {
- public:
-  explicit OverlayProcessorCA(bool allow_ca_layer_overlays);
-
- protected:
-  bool ProcessForOverlayInternal(
-      DisplayResourceProvider* resource_provider,
-      RenderPassList* render_passes,
-      const OverlayProcessor::FilterOperationsMap& render_pass_filters,
-      const OverlayProcessor::FilterOperationsMap& render_pass_backdrop_filters,
-      OverlayProcessor::CandidateList* overlay_candidates,
-      gfx::Rect* damage_rect) override;
-
-  base::Optional<OverlayProcessor::OutputSurfaceOverlayPlane>
-  ProcessOutputSurfaceAsOverlay(
-      const gfx::Size& viewport_size,
-      const gfx::BufferFormat& buffer_format,
-      const gfx::ColorSpace& color_space) const override;
-
- private:
-  // Returns true if all quads in the root render pass have been replaced by
-  // CALayerOverlays.
-  bool ProcessForCALayerOverlays(
-      DisplayResourceProvider* resource_provider,
-      const gfx::RectF& display_rect,
-      const QuadList& quad_list,
-      const base::flat_map<RenderPassId, cc::FilterOperations*>&
-          render_pass_filters,
-      const base::flat_map<RenderPassId, cc::FilterOperations*>&
-          render_pass_backdrop_filters,
-      CALayerOverlayList* ca_layer_overlays);
-
-  bool allow_ca_layer_overlays_;
-  bool output_surface_already_handled_;
-
-  DISALLOW_COPY_AND_ASSIGN(OverlayProcessorCA);
-};
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_OVERLAY_PROCESSOR_CA_H_
diff --git a/components/viz/service/display/overlay_unittest.cc b/components/viz/service/display/overlay_unittest.cc
index fef3329..afcd257 100644
--- a/components/viz/service/display/overlay_unittest.cc
+++ b/components/viz/service/display/overlay_unittest.cc
@@ -140,6 +140,14 @@
   std::vector<gfx::RectF> expected_rects_;
 };
 
+class CALayerValidator : public TestOverlayCandidateValidator {
+ public:
+  bool AllowCALayerOverlays() const override { return true; }
+  bool AllowDCLayerOverlays() const override { return false; }
+  bool NeedsSurfaceOccludingDamageRect() const override { return false; }
+  void CheckOverlaySupport(OverlayCandidateList* surfaces) override {}
+};
+
 class DCLayerValidator : public TestOverlayCandidateValidator {
  public:
   bool AllowCALayerOverlays() const override { return false; }
@@ -576,6 +584,7 @@
 using TransparentUnderlayTest =
     OverlayTest<TransparentUnderlayOverlayValidator>;
 using UnderlayCastTest = OverlayTest<UnderlayCastOverlayValidator>;
+using CALayerOverlayTest = OverlayTest<CALayerValidator>;
 
 TEST(OverlayTest, OverlaysProcessorHasStrategy) {
   scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
@@ -2878,5 +2887,164 @@
 }
 #endif
 
+#if defined(OS_MACOSX)
+class CALayerOverlayRPDQTest : public CALayerOverlayTest {
+ protected:
+  void SetUp() override {
+    CALayerOverlayTest::SetUp();
+    pass_list_.push_back(CreateRenderPass());
+    pass_ = pass_list_.back().get();
+    quad_ = pass_->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
+    render_pass_id_ = 3;
+  }
+
+  void ProcessForOverlays() {
+    overlay_processor_->ProcessForOverlays(
+        resource_provider_.get(), &pass_list_, GetIdentityColorMatrix(),
+        render_pass_filters_, render_pass_backdrop_filters_, &ca_layer_list_,
+        &damage_rect_, &content_bounds_);
+    auto output_surface_plane =
+        overlay_processor_->ProcessOutputSurfaceAsOverlay(
+            gfx::Size(pass_->output_rect.width(), pass_->output_rect.height()),
+            kDefaultBufferFormat, gfx::ColorSpace());
+    if (!ca_layer_list_.empty())
+      ASSERT_FALSE(output_surface_plane.has_value());
+  }
+  RenderPassList pass_list_;
+  RenderPass* pass_;
+  RenderPassDrawQuad* quad_;
+  int render_pass_id_;
+  cc::FilterOperations filters_;
+  cc::FilterOperations backdrop_filters_;
+  OverlayProcessor::FilterOperationsMap render_pass_filters_;
+  OverlayProcessor::FilterOperationsMap render_pass_backdrop_filters_;
+  CALayerOverlayList ca_layer_list_;
+};
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadNoFilters) {
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+
+  EXPECT_EQ(1U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadAllValidFilters) {
+  filters_.Append(cc::FilterOperation::CreateGrayscaleFilter(0.1f));
+  filters_.Append(cc::FilterOperation::CreateSepiaFilter(0.2f));
+  filters_.Append(cc::FilterOperation::CreateSaturateFilter(0.3f));
+  filters_.Append(cc::FilterOperation::CreateHueRotateFilter(0.4f));
+  filters_.Append(cc::FilterOperation::CreateInvertFilter(0.5f));
+  filters_.Append(cc::FilterOperation::CreateBrightnessFilter(0.6f));
+  filters_.Append(cc::FilterOperation::CreateContrastFilter(0.7f));
+  filters_.Append(cc::FilterOperation::CreateOpacityFilter(0.8f));
+  filters_.Append(cc::FilterOperation::CreateBlurFilter(0.9f));
+  filters_.Append(cc::FilterOperation::CreateDropShadowFilter(
+      gfx::Point(10, 20), 1.0f, SK_ColorGREEN));
+  render_pass_filters_[render_pass_id_] = &filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+
+  EXPECT_EQ(1U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadOpacityFilterScale) {
+  filters_.Append(cc::FilterOperation::CreateOpacityFilter(0.8f));
+  render_pass_filters_[render_pass_id_] = &filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 2), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(1U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadBlurFilterScale) {
+  filters_.Append(cc::FilterOperation::CreateBlurFilter(0.8f));
+  render_pass_filters_[render_pass_id_] = &filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 2), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(1U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadDropShadowFilterScale) {
+  filters_.Append(cc::FilterOperation::CreateDropShadowFilter(
+      gfx::Point(10, 20), 1.0f, SK_ColorGREEN));
+  render_pass_filters_[render_pass_id_] = &filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 2), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(1U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadBackgroundFilter) {
+  backdrop_filters_.Append(cc::FilterOperation::CreateGrayscaleFilter(0.1f));
+  render_pass_backdrop_filters_[render_pass_id_] = &backdrop_filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(0U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadBackgroundFilterWithMask) {
+  backdrop_filters_.Append(cc::FilterOperation::CreateGrayscaleFilter(0.1f));
+  render_pass_backdrop_filters_[render_pass_id_] = &backdrop_filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(),
+                true, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(0U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadMask) {
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(1U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, RenderPassDrawQuadUnsupportedFilter) {
+  filters_.Append(cc::FilterOperation::CreateZoomFilter(0.9f, 1));
+  render_pass_filters_[render_pass_id_] = &filters_;
+  quad_->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                kOverlayRect, render_pass_id_, 0, gfx::RectF(), gfx::Size(),
+                false, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(), false,
+                1.0f);
+  ProcessForOverlays();
+  EXPECT_EQ(0U, ca_layer_list_.size());
+}
+
+TEST_F(CALayerOverlayRPDQTest, TooManyRenderPassDrawQuads) {
+  filters_.Append(cc::FilterOperation::CreateBlurFilter(0.8f));
+  int count = 35;
+
+  for (int i = 0; i < count; ++i) {
+    auto* quad = pass_->CreateAndAppendDrawQuad<RenderPassDrawQuad>();
+    quad->SetNew(pass_->shared_quad_state_list.back(), kOverlayRect,
+                 kOverlayRect, render_pass_id_, 2, gfx::RectF(), gfx::Size(),
+                 false, gfx::Vector2dF(1, 1), gfx::PointF(), gfx::RectF(),
+                 false, 1.0f);
+  }
+
+  ProcessForOverlays();
+  EXPECT_EQ(0U, ca_layer_list_.size());
+}
+#endif
+
 }  // namespace
 }  // namespace viz
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc
index afbd9c74..280548a 100644
--- a/components/viz/service/display/renderer_pixeltest.cc
+++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -28,6 +28,7 @@
 #include "components/viz/common/resources/bitmap_allocation.h"
 #include "components/viz/common/resources/resource_format_utils.h"
 #include "components/viz/service/display/gl_renderer.h"
+#include "components/viz/service/display/software_renderer.h"
 #include "components/viz/test/test_in_process_context_provider.h"
 #include "components/viz/test/test_shared_bitmap_manager.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
@@ -2954,8 +2955,8 @@
   gfx::Rect filter_pass_layer_rect_;
 };
 
-// TODO(916318): The software renderer does not support background filters yet.
 using BackdropFilterRendererTypes = ::testing::Types<GLRenderer,
+                                                     SoftwareRenderer,
                                                      SkiaRenderer
 #if defined(ENABLE_VIZ_VULKAN_TESTS)
                                                      ,
diff --git a/components/viz/service/display_embedder/overlay_candidate_validator_mac.cc b/components/viz/service/display_embedder/overlay_candidate_validator_mac.cc
new file mode 100644
index 0000000..c95051a
--- /dev/null
+++ b/components/viz/service/display_embedder/overlay_candidate_validator_mac.cc
@@ -0,0 +1,32 @@
+// Copyright 2015 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 "components/viz/service/display_embedder/overlay_candidate_validator_mac.h"
+
+#include <stddef.h>
+
+namespace viz {
+
+OverlayCandidateValidatorMac::OverlayCandidateValidatorMac(
+    bool ca_layer_disabled)
+    : ca_layer_disabled_(ca_layer_disabled) {}
+
+OverlayCandidateValidatorMac::~OverlayCandidateValidatorMac() = default;
+
+bool OverlayCandidateValidatorMac::AllowCALayerOverlays() const {
+  return !ca_layer_disabled_;
+}
+
+bool OverlayCandidateValidatorMac::AllowDCLayerOverlays() const {
+  return false;
+}
+
+bool OverlayCandidateValidatorMac::NeedsSurfaceOccludingDamageRect() const {
+  return false;
+}
+
+void OverlayCandidateValidatorMac::CheckOverlaySupport(
+    OverlayCandidateList* surfaces) {}
+
+}  // namespace viz
diff --git a/components/viz/service/display_embedder/overlay_candidate_validator_mac.h b/components/viz/service/display_embedder/overlay_candidate_validator_mac.h
new file mode 100644
index 0000000..7dce0433
--- /dev/null
+++ b/components/viz/service/display_embedder/overlay_candidate_validator_mac.h
@@ -0,0 +1,36 @@
+// Copyright 2015 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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
+#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/viz/service/display/overlay_candidate_validator.h"
+#include "components/viz/service/viz_service_export.h"
+
+namespace viz {
+
+class VIZ_SERVICE_EXPORT OverlayCandidateValidatorMac
+    : public OverlayCandidateValidator {
+ public:
+  explicit OverlayCandidateValidatorMac(bool ca_layer_disabled);
+  ~OverlayCandidateValidatorMac() override;
+
+  // OverlayCandidateValidator implementation.
+  bool AllowCALayerOverlays() const override;
+  bool AllowDCLayerOverlays() const override;
+  bool NeedsSurfaceOccludingDamageRect() const override;
+  void CheckOverlaySupport(OverlayCandidateList* surfaces) override;
+
+ private:
+  const bool ca_layer_disabled_;
+
+  DISALLOW_COPY_AND_ASSIGN(OverlayCandidateValidatorMac);
+};
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
diff --git a/content/app/strings/content_strings.grd b/content/app/strings/content_strings.grd
index fdf3095..0a9b2b76 100644
--- a/content/app/strings/content_strings.grd
+++ b/content/app/strings/content_strings.grd
@@ -449,9 +449,17 @@
       <message name="IDS_AX_ROLE_REGION" desc="Accessibility role description for region">
         region
       </message>
-      <message name="IDS_AX_ROLE_SEARCH_BOX" desc="Accessibility role description for search text field">
-        search text field
-      </message>
+      <!-- https://www.w3.org/TR/core-aam-1.1/#role-map-searchbox -->
+      <if expr="is_win">
+        <message name="IDS_AX_ROLE_SEARCH_BOX" desc="UIA role description for search text field">
+          search box
+        </message>
+      </if>
+      <if expr="not is_win">
+        <message name="IDS_AX_ROLE_SEARCH_BOX" desc="Accessibility role description for search text field">
+          search text field
+        </message>
+      </if>
       <message name="IDS_AX_ROLE_STATUS" desc="Accessibility role description for status">
         status
       </message>
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc
index 088c7da..5fce305 100644
--- a/content/browser/accessibility/browser_accessibility.cc
+++ b/content/browser/accessibility/browser_accessibility.cc
@@ -1851,6 +1851,20 @@
   }
 }
 
+base::string16 BrowserAccessibility::GetLocalizedStringForRoleDescription()
+    const {
+  ContentClient* content_client = content::GetContentClient();
+  const ui::AXNodeData& data = GetData();
+
+  switch (data.role) {
+    case ax::mojom::Role::kSearchBox:
+      return content_client->GetLocalizedString(IDS_AX_ROLE_SEARCH_BOX);
+
+    default:
+      return {};
+  }
+}
+
 base::string16 BrowserAccessibility::GetStyleNameAttributeAsLocalizedString()
     const {
   const BrowserAccessibility* current_node = this;
diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h
index 8c20abcf..5f91ecf 100644
--- a/content/browser/accessibility/browser_accessibility.h
+++ b/content/browser/accessibility/browser_accessibility.h
@@ -519,6 +519,7 @@
       ax::mojom::ImageAnnotationStatus status) const override;
   base::string16 GetLocalizedRoleDescriptionForUnlabeledImage() const override;
   base::string16 GetLocalizedStringForLandmarkType() const override;
+  base::string16 GetLocalizedStringForRoleDescription() const override;
   base::string16 GetStyleNameAttributeAsLocalizedString() const override;
   bool ShouldIgnoreHoveredStateForTesting() override;
   bool IsOffscreen() const override;
diff --git a/content/browser/android/navigation_handle_proxy.cc b/content/browser/android/navigation_handle_proxy.cc
index 72cd549..a20bbe2 100644
--- a/content/browser/android/navigation_handle_proxy.cc
+++ b/content/browser/android/navigation_handle_proxy.cc
@@ -88,7 +88,6 @@
 // Called from Java.
 void NavigationHandleProxy::SetRequestHeader(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& name,
     const JavaParamRef<jstring>& value) {
   cpp_navigation_handle_->SetRequestHeader(ConvertJavaStringToUTF8(name),
@@ -98,7 +97,6 @@
 // Called from Java.
 void NavigationHandleProxy::RemoveRequestHeader(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& name) {
   cpp_navigation_handle_->RemoveRequestHeader(ConvertJavaStringToUTF8(name));
 }
diff --git a/content/browser/android/navigation_handle_proxy.h b/content/browser/android/navigation_handle_proxy.h
index af3797c..3abb84b 100644
--- a/content/browser/android/navigation_handle_proxy.h
+++ b/content/browser/android/navigation_handle_proxy.h
@@ -38,13 +38,11 @@
 
   // Called from Java.
   void SetRequestHeader(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
                         const base::android::JavaParamRef<jstring>& name,
                         const base::android::JavaParamRef<jstring>& value);
 
   // Called from Java.
   void RemoveRequestHeader(JNIEnv* env,
-                           const base::android::JavaParamRef<jobject>& obj,
                            const base::android::JavaParamRef<jstring>& name);
 
  private:
diff --git a/content/browser/child_process_launcher_helper.h b/content/browser/child_process_launcher_helper.h
index 95aa1e2..3694dcd 100644
--- a/content/browser/child_process_launcher_helper.h
+++ b/content/browser/child_process_launcher_helper.h
@@ -193,7 +193,6 @@
 
 #if defined(OS_ANDROID)
   void OnChildProcessStarted(JNIEnv* env,
-                             const base::android::JavaParamRef<jobject>& obj,
                              jint handle);
 
   // Dumps the stack of the child process without crashing it.
diff --git a/content/browser/child_process_launcher_helper_android.cc b/content/browser/child_process_launcher_helper_android.cc
index e7f74684..81ff192 100644
--- a/content/browser/child_process_launcher_helper_android.cc
+++ b/content/browser/child_process_launcher_helper_android.cc
@@ -267,7 +267,6 @@
 // the ChildProcess could not be created.
 void ChildProcessLauncherHelper::OnChildProcessStarted(
     JNIEnv*,
-    const base::android::JavaParamRef<jobject>& obj,
     jint handle) {
   DCHECK(CurrentlyOnProcessLauncherTaskRunner());
   scoped_refptr<ChildProcessLauncherHelper> ref(this);
diff --git a/content/browser/contacts/contacts_provider_android.cc b/content/browser/contacts/contacts_provider_android.cc
index 370e4ed..b277a2b2 100644
--- a/content/browser/contacts/contacts_provider_android.cc
+++ b/content/browser/contacts/contacts_provider_android.cc
@@ -68,7 +68,6 @@
 
 void ContactsProviderAndroid::AddContact(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     jboolean include_names,
     jboolean include_emails,
     jboolean include_tel,
@@ -104,16 +103,12 @@
   contacts_.push_back(std::move(contact));
 }
 
-void ContactsProviderAndroid::EndContactsList(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void ContactsProviderAndroid::EndContactsList(JNIEnv* env) {
   DCHECK(callback_);
   std::move(callback_).Run(std::move(contacts_));
 }
 
-void ContactsProviderAndroid::EndWithPermissionDenied(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void ContactsProviderAndroid::EndWithPermissionDenied(JNIEnv* env) {
   DCHECK(callback_);
   std::move(callback_).Run(base::nullopt);
 }
diff --git a/content/browser/contacts/contacts_provider_android.h b/content/browser/contacts/contacts_provider_android.h
index 60ed785..439e6cb 100644
--- a/content/browser/contacts/contacts_provider_android.h
+++ b/content/browser/contacts/contacts_provider_android.h
@@ -32,7 +32,6 @@
   // (or EndWithPermissionDenied) must be called to signal the end of the
   // construction of the contacts list.
   void AddContact(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& obj,
                   jboolean includeNames,
                   jboolean includeEmails,
                   jboolean includeTel,
@@ -42,12 +41,10 @@
 
   // Signals the end of adding contacts to the list. The contact list is
   // returned to the web page.
-  void EndContactsList(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj);
+  void EndContactsList(JNIEnv* env);
 
   // Signals the end (due to a permission error).
-  void EndWithPermissionDenied(JNIEnv* env,
-                               const base::android::JavaParamRef<jobject>& obj);
+  void EndWithPermissionDenied(JNIEnv* env);
 
  private:
   base::android::ScopedJavaGlobalRef<jobject> dialog_;
diff --git a/content/browser/image_capture/OWNERS b/content/browser/image_capture/OWNERS
index cdc46b5..97f49d7 100644
--- a/content/browser/image_capture/OWNERS
+++ b/content/browser/image_capture/OWNERS
@@ -2,4 +2,4 @@
 mcasas@chromium.org
 
 # COMPONENT: Blink>ImageCapture
-# TEAM: webrtc-dev@chromium.org
+# TEAM: chromium-dev@chromium.org
diff --git a/content/browser/renderer_host/input/input_router_impl_unittest.cc b/content/browser/renderer_host/input/input_router_impl_unittest.cc
index f19d1ed..e2d9be2 100644
--- a/content/browser/renderer_host/input/input_router_impl_unittest.cc
+++ b/content/browser/renderer_host/input/input_router_impl_unittest.cc
@@ -994,49 +994,55 @@
       WebInputEvent::kGesturePinchEnd,    WebInputEvent::kGestureScrollEnd};
   for (size_t i = 0; i < base::size(eventTypes); ++i) {
     WebInputEvent::Type type = eventTypes[i];
-    if (ShouldBlockEventStream(GetEventWithType(type))) {
+    if (type == WebInputEvent::kGestureFlingStart ||
+        type == WebInputEvent::kGestureFlingCancel) {
+      SimulateGestureEvent(type, blink::WebGestureDevice::kTouchscreen);
+      DispatchedMessages dispatched_messages = GetAndResetDispatchedMessages();
+
+      if (type == WebInputEvent::kGestureFlingCancel) {
+        // The fling controller generates and sends a GSE while handling the
+        // GFC.
+        EXPECT_EQ(1U, dispatched_messages.size());
+        EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
+      } else {
+        EXPECT_EQ(0U, dispatched_messages.size());
+        EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+      }
+
+      EXPECT_EQ(0, client_->in_flight_event_count());
+      EXPECT_FALSE(HasPendingEvents());
+    } else if (ShouldBlockEventStream(GetEventWithType(type))) {
       PressAndSetTouchActionAuto();
       SimulateGestureEvent(type, blink::WebGestureDevice::kTouchscreen);
       DispatchedMessages dispatched_messages = GetAndResetDispatchedMessages();
 
-      if (type != WebInputEvent::kGestureFlingStart &&
-          type != WebInputEvent::kGestureFlingCancel) {
-        if (type == WebInputEvent::kGestureScrollUpdate)
-          EXPECT_EQ(2U, dispatched_messages.size());
-        else
-          EXPECT_EQ(1U, dispatched_messages.size());
-        EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
-        EXPECT_EQ(1, client_->in_flight_event_count());
-        EXPECT_TRUE(HasPendingEvents());
-        ASSERT_TRUE(
-            dispatched_messages[dispatched_messages.size() - 1]->ToEvent());
-
-        dispatched_messages[dispatched_messages.size() - 1]
-            ->ToEvent()
-            ->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
+      if (type == WebInputEvent::kGestureScrollUpdate) {
+        // TouchScrollStarted is also dispatched.
+        EXPECT_EQ(2U, dispatched_messages.size());
+      } else {
+        EXPECT_EQ(1U, dispatched_messages.size());
       }
+      EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
+      EXPECT_EQ(1, client_->in_flight_event_count());
+      EXPECT_TRUE(HasPendingEvents());
+      ASSERT_TRUE(
+          dispatched_messages[dispatched_messages.size() - 1]->ToEvent());
+
+      dispatched_messages[dispatched_messages.size() - 1]
+          ->ToEvent()
+          ->CallCallback(INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
 
       EXPECT_EQ(0U, GetAndResetDispatchedMessages().size());
-      if (type == WebInputEvent::kGestureFlingCancel) {
-        // fling controller generates and sends a GSE while handling the GFC.
-        EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
-      } else {
-        EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-      }
+      EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
       EXPECT_EQ(0, client_->in_flight_event_count());
       EXPECT_FALSE(HasPendingEvents());
-      continue;
-
-      ReleaseTouchPoint(0);
-      SendTouchEvent();
-      GetAndResetDispatchedMessages();
+    } else {
+      SimulateGestureEvent(type, blink::WebGestureDevice::kTouchscreen);
+      EXPECT_EQ(1U, GetAndResetDispatchedMessages().size());
+      EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+      EXPECT_EQ(0, client_->in_flight_event_count());
+      EXPECT_FALSE(HasPendingEvents());
     }
-
-    SimulateGestureEvent(type, blink::WebGestureDevice::kTouchscreen);
-    EXPECT_EQ(1U, GetAndResetDispatchedMessages().size());
-    EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-    EXPECT_EQ(0, client_->in_flight_event_count());
-    EXPECT_FALSE(HasPendingEvents());
   }
 }
 
@@ -1080,15 +1086,14 @@
       WebInputEvent::kKeyDown,
       WebInputEvent::kKeyUp,
       WebInputEvent::kChar,
+      WebInputEvent::kGestureScrollBegin,
       WebInputEvent::kGestureScrollUpdate,
-      WebInputEvent::kGestureFlingStart,
-      WebInputEvent::kGestureFlingCancel,
-      WebInputEvent::kGesturePinchUpdate,
       WebInputEvent::kTouchStart,
       WebInputEvent::kTouchMove};
   for (size_t i = 0; i < base::size(kRequiredEventAckTypes); ++i) {
     const WebInputEvent::Type required_ack_type = kRequiredEventAckTypes[i];
-    ASSERT_TRUE(ShouldBlockEventStream(GetEventWithType(required_ack_type)));
+    ASSERT_TRUE(ShouldBlockEventStream(GetEventWithType(required_ack_type)))
+        << WebInputEvent::GetName(required_ack_type);
   }
 }
 
@@ -1205,16 +1210,27 @@
   EXPECT_EQ(1U, GetAndResetDispatchedMessages().size());
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
 
-  // GesturePinchUpdate waits for an ack.
+  // GesturePinchUpdate ignores its ack.
   // This also verifies that GesturePinchUpdates for touchscreen are sent
   // to the renderer (in contrast to the TrackpadPinchUpdate test).
   SimulateGestureEvent(WebInputEvent::kGesturePinchUpdate,
                        blink::WebGestureDevice::kTouchscreen);
   dispatched_messages = GetAndResetDispatchedMessages();
   EXPECT_EQ(1U, dispatched_messages.size());
+  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(0, client_->in_flight_event_count());
+  EXPECT_EQ(WebInputEvent::kGesturePinchUpdate,
+            client_->last_in_flight_event_type());
+
+  // GestureScrollUpdate waits for an ack.
+  // This dispatches TouchScrollStarted and GestureScrollUpdate.
+  SimulateGestureEvent(WebInputEvent::kGestureScrollUpdate,
+                       blink::WebGestureDevice::kTouchscreen);
+  dispatched_messages = GetAndResetDispatchedMessages();
+  EXPECT_EQ(2U, dispatched_messages.size());
   EXPECT_EQ(0U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
-  EXPECT_EQ(WebInputEvent::kGesturePinchUpdate,
+  EXPECT_EQ(WebInputEvent::kGestureScrollUpdate,
             client_->last_in_flight_event_type());
 
   // GestureShowPress will be sent immediately since GestureEventQueue allows
@@ -1236,8 +1252,8 @@
   EXPECT_EQ(WebInputEvent::kGestureShowPress,
             client_->last_in_flight_event_type());
 
-  // Ack the GesturePinchUpdate to release two GestureShowPress ack.
-  dispatched_messages[0]->ToEvent()->CallCallback(
+  // Ack the GestureScrollUpdate to release the two GestureShowPress acks.
+  dispatched_messages[1]->ToEvent()->CallCallback(
       INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
   EXPECT_EQ(0U, GetAndResetDispatchedMessages().size());
   EXPECT_EQ(3U, disposition_handler_->GetAndResetAckCount());
@@ -1936,7 +1952,7 @@
   ASSERT_EQ(1U, temp_dispatched_messages.size());
   ASSERT_TRUE(temp_dispatched_messages[0]->ToEvent());
   dispatched_messages.emplace_back(std::move(temp_dispatched_messages.at(0)));
-  EXPECT_EQ(3, client_->in_flight_event_count());
+  EXPECT_EQ(2, client_->in_flight_event_count());
 
   SimulateGestureScrollUpdateEvent(1.5f, 1.5f, 0,
                                    blink::WebGestureDevice::kTouchpad);
@@ -1944,7 +1960,7 @@
   ASSERT_EQ(1U, temp_dispatched_messages.size());
   ASSERT_TRUE(temp_dispatched_messages[0]->ToEvent());
   dispatched_messages.emplace_back(std::move(temp_dispatched_messages.at(0)));
-  EXPECT_EQ(4, client_->in_flight_event_count());
+  EXPECT_EQ(3, client_->in_flight_event_count());
 
   SimulateTouchpadGesturePinchEventWithoutWheel(
       WebInputEvent::kGesturePinchUpdate, 1.5f, 20, 25, 0);
@@ -1952,7 +1968,7 @@
   ASSERT_EQ(1U, temp_dispatched_messages.size());
   ASSERT_TRUE(temp_dispatched_messages[0]->ToEvent());
   dispatched_messages.emplace_back(std::move(temp_dispatched_messages.at(0)));
-  EXPECT_EQ(5, client_->in_flight_event_count());
+  EXPECT_EQ(3, client_->in_flight_event_count());
 
   SimulateGestureScrollUpdateEvent(0.f, 1.5f, 0,
                                    blink::WebGestureDevice::kTouchpad);
@@ -1960,36 +1976,26 @@
   ASSERT_EQ(1U, temp_dispatched_messages.size());
   ASSERT_TRUE(temp_dispatched_messages[0]->ToEvent());
   dispatched_messages.emplace_back(std::move(temp_dispatched_messages.at(0)));
-  EXPECT_EQ(6, client_->in_flight_event_count());
+  EXPECT_EQ(4, client_->in_flight_event_count());
 
   // Ack'ing events should decrease in-flight event count.
   dispatched_messages[0]->ToEvent()->CallCallback(
       INPUT_EVENT_ACK_STATE_CONSUMED);
   EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(5, client_->in_flight_event_count());
+  EXPECT_EQ(3, client_->in_flight_event_count());
 
   // Ack the second scroll.
   dispatched_messages[1]->ToEvent()->CallCallback(
       INPUT_EVENT_ACK_STATE_CONSUMED);
-  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(4, client_->in_flight_event_count());
-
-  // Ack the pinch event.
-  dispatched_messages[2]->ToEvent()->CallCallback(
-      INPUT_EVENT_ACK_STATE_CONSUMED);
-  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(3, client_->in_flight_event_count());
+  EXPECT_FALSE(dispatched_messages[2]->ToEvent()->HasCallback());
+  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_EQ(2, client_->in_flight_event_count());
 
   // Ack the scroll event.
   dispatched_messages[3]->ToEvent()->CallCallback(
       INPUT_EVENT_ACK_STATE_CONSUMED);
-  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
-  EXPECT_EQ(2, client_->in_flight_event_count());
-
-  // Ack the pinch event.
-  dispatched_messages[4]->ToEvent()->CallCallback(
-      INPUT_EVENT_ACK_STATE_CONSUMED);
-  EXPECT_EQ(1U, disposition_handler_->GetAndResetAckCount());
+  EXPECT_FALSE(dispatched_messages[4]->ToEvent()->HasCallback());
+  EXPECT_EQ(2U, disposition_handler_->GetAndResetAckCount());
   EXPECT_EQ(1, client_->in_flight_event_count());
 
   // Ack the scroll event.
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 7bea1b7..3db31a3 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -334,6 +334,7 @@
       window_(nullptr),
       in_shutdown_(false),
       in_bounds_changed_(false),
+      is_occluded_(true),
       popup_parent_host_view_(nullptr),
       popup_child_host_view_(nullptr),
       is_loading_(false),
@@ -478,12 +479,14 @@
                                 window_->GetLocalSurfaceIdAllocation());
   }
 
-  window_->Show();
+  // See documentation of |is_occluded_|.
+  DCHECK(window_->TargetVisibility());
   WasUnOccluded();
 }
 
 void RenderWidgetHostViewAura::Hide() {
-  window_->Hide();
+  // See documentation of |is_occluded_|.
+  DCHECK(window_->TargetVisibility());
   WasOccluded();
 }
 
@@ -627,10 +630,13 @@
 }
 
 bool RenderWidgetHostViewAura::IsShowing() {
-  return window_->IsVisible();
+  // See documentation of |is_occluded_|.
+  DCHECK(window_->TargetVisibility());
+  return !is_occluded_;
 }
 
 void RenderWidgetHostViewAura::WasUnOccluded() {
+  is_occluded_ = false;
   if (!host_->is_hidden())
     return;
 
@@ -663,6 +669,7 @@
 }
 
 void RenderWidgetHostViewAura::WasOccluded() {
+  is_occluded_ = true;
   if (!host()->is_hidden()) {
     host()->WasHidden();
     if (delegated_frame_host_)
@@ -1692,6 +1699,8 @@
 }
 
 void RenderWidgetHostViewAura::OnWindowTargetVisibilityChanged(bool visible) {
+  // See documentation of |is_occluded_|.
+  DCHECK(visible);
 }
 
 bool RenderWidgetHostViewAura::HasHitTestMask() const {
@@ -2024,6 +2033,10 @@
   // Init(), because it needs to have the layer.
   if (frame_sink_id_.is_valid())
     window_->SetEmbedFrameSinkId(frame_sink_id_);
+
+  // The |window_|'s visiblility remains visible the entire time.
+  // See documentation of |is_occluded_|.
+  window_->Show();
 }
 
 void RenderWidgetHostViewAura::CreateDelegatedFrameHostClient() {
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index 2bc54fe..4d11c0d 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -591,6 +591,14 @@
   // True if in the process of handling a window bounds changed notification.
   bool in_bounds_changed_;
 
+  // True if the content of this view is occluded (i.e. not visible).
+  // Note that we keep |window_|'s target visibility true all the time. Its
+  // actual visibility (i.e. Window::IsVisible()) will depend on its location in
+  // the window tree hierarchy and whether its layer is drawn or not (due to
+  // e.g. occlusion). Hiding |window_| is unnecessary and will cause issues when
+  // the browser or app is mirrored for alt-tab, or virtual desks mini_views.
+  bool is_occluded_;
+
   // Our parent host view, if this is a popup.  NULL otherwise.
   RenderWidgetHostViewAura* popup_parent_host_view_;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_aura_browsertest.cc
index c2fec194..01bb7a6d 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_browsertest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_browsertest.cc
@@ -72,6 +72,10 @@
         GetRenderViewHost()->GetWidget()->GetView());
   }
 
+  aura::Window* GetWindow() const {
+    return GetRenderWidgetHostView()->window();
+  }
+
   DelegatedFrameHost* GetDelegatedFrameHost() const {
     return GetRenderWidgetHostView()->delegated_frame_host_.get();
   }
@@ -100,6 +104,7 @@
   // Hide the view and evict the frame. This should trigger a copy of the stale
   // frame content.
   GetRenderWidgetHostView()->Hide();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
   static_cast<viz::FrameEvictorClient*>(GetDelegatedFrameHost())
       ->EvictDelegatedFrame();
   EXPECT_EQ(GetDelegatedFrameHost()->frame_eviction_state_,
@@ -115,6 +120,7 @@
   // Unhidding the view should reset the stale content layer to show the new
   // frame content.
   GetRenderWidgetHostView()->Show();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
   EXPECT_FALSE(
       GetDelegatedFrameHost()->stale_content_layer_->has_external_content());
 }
@@ -140,12 +146,14 @@
   // Hide the view and evict the frame. This should trigger a copy of the stale
   // frame content.
   GetRenderWidgetHostView()->Hide();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
   static_cast<viz::FrameEvictorClient*>(GetDelegatedFrameHost())
       ->EvictDelegatedFrame();
   EXPECT_EQ(GetDelegatedFrameHost()->frame_eviction_state_,
             DelegatedFrameHost::FrameEvictionState::kPendingEvictionRequests);
 
   GetRenderWidgetHostView()->Show();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
   EXPECT_EQ(GetDelegatedFrameHost()->frame_eviction_state_,
             DelegatedFrameHost::FrameEvictionState::kNotStarted);
 
@@ -180,6 +188,7 @@
   // Hide the view and evict the frame. This should not trigger a copy of the
   // stale frame content as the WebContentDelegate returns false.
   GetRenderWidgetHostView()->Hide();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
   static_cast<viz::FrameEvictorClient*>(GetDelegatedFrameHost())
       ->EvictDelegatedFrame();
 
@@ -192,6 +201,25 @@
   EXPECT_FALSE(
       GetDelegatedFrameHost()->stale_content_layer_->has_external_content());
 }
+
+IN_PROC_BROWSER_TEST_F(RenderWidgetHostViewAuraBrowserTest,
+                       OcclusionDoesntAffectWindowTargetVisibility) {
+  NavigateToURL(shell(), GURL(kMinimalPageDataURL));
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
+  EXPECT_TRUE(GetRenderWidgetHostView()->IsShowing());
+
+  // Hide the window's parent, the content should be occluded but the window's
+  // target visibility should remain visible.
+  GetWindow()->parent()->Hide();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
+  EXPECT_FALSE(GetRenderWidgetHostView()->IsShowing());
+
+  // Show the parent again, and expect that the contents are unoccluded again.
+  GetWindow()->parent()->Show();
+  EXPECT_TRUE(GetWindow()->TargetVisibility());
+  EXPECT_TRUE(GetRenderWidgetHostView()->IsShowing());
+}
+
 #endif  // #if defined(OS_CHROMEOS)
 
 }  // namespace content
diff --git a/content/browser/sms/sms_provider_android.cc b/content/browser/sms/sms_provider_android.cc
index 270d8f2..603e71c 100644
--- a/content/browser/sms/sms_provider_android.cc
+++ b/content/browser/sms/sms_provider_android.cc
@@ -39,15 +39,11 @@
 
 void SmsProviderAndroid::OnReceive(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     jstring message) {
   std::string sms = ConvertJavaStringToUTF8(env, message);
   NotifyReceive(sms);
 }
 
-void SmsProviderAndroid::OnTimeout(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
-}
+void SmsProviderAndroid::OnTimeout(JNIEnv* env) {}
 
 }  // namespace content
diff --git a/content/browser/sms/sms_provider_android.h b/content/browser/sms/sms_provider_android.h
index 40dca84..ff206ea 100644
--- a/content/browser/sms/sms_provider_android.h
+++ b/content/browser/sms/sms_provider_android.h
@@ -22,9 +22,8 @@
   void Retrieve() override;
 
   void OnReceive(JNIEnv*,
-                 const base::android::JavaParamRef<jobject>&,
                  jstring message);
-  void OnTimeout(JNIEnv* env, const base::android::JavaParamRef<jobject>&);
+  void OnTimeout(JNIEnv* env);
 
  private:
   base::android::ScopedJavaGlobalRef<jobject> j_sms_receiver_;
@@ -34,4 +33,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_BROWSER_SMS_SMS_PROVIDER_ANDROID_H_
\ No newline at end of file
+#endif  // CONTENT_BROWSER_SMS_SMS_PROVIDER_ANDROID_H_
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
index 1ac134a..f2ad5fd 100644
--- a/content/public/renderer/content_renderer_client.cc
+++ b/content/public/renderer/content_renderer_client.cc
@@ -5,11 +5,11 @@
 #include "content/public/renderer/content_renderer_client.h"
 
 #include "media/base/renderer_factory.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "third_party/blink/public/platform/web_audio_device.h"
 #include "third_party/blink/public/platform/web_media_stream_center.h"
 #include "third_party/blink/public/platform/web_rtc_peer_connection_handler.h"
 #include "third_party/blink/public/platform/web_speech_synthesizer.h"
+#include "third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "ui/gfx/icc_profile.h"
 #include "url/gurl.h"
 
diff --git a/content/public/utility/content_utility_client.cc b/content/public/utility/content_utility_client.cc
index 354911d..29a4c17 100644
--- a/content/public/utility/content_utility_client.cc
+++ b/content/public/utility/content_utility_client.cc
@@ -16,10 +16,12 @@
   return false;
 }
 
-void ContentUtilityClient::RunIOThreadService(
-    mojo::GenericPendingReceiver* receiver) {}
+mojo::ServiceFactory* ContentUtilityClient::GetIOThreadServiceFactory() {
+  return nullptr;
+}
 
-void ContentUtilityClient::RunMainThreadService(
-    mojo::GenericPendingReceiver receiver) {}
+mojo::ServiceFactory* ContentUtilityClient::GetMainThreadServiceFactory() {
+  return nullptr;
+}
 
 }  // namespace content
diff --git a/content/public/utility/content_utility_client.h b/content/public/utility/content_utility_client.h
index 48b297d..25a057a 100644
--- a/content/public/utility/content_utility_client.h
+++ b/content/public/utility/content_utility_client.h
@@ -16,6 +16,10 @@
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/mojom/service.mojom.h"
 
+namespace mojo {
+class ServiceFactory;
+}
+
 namespace content {
 
 // Embedder API for participating in utility process logic.
@@ -44,15 +48,18 @@
       service_manager::mojom::ServiceRequest request);
 
   // Allows the embedder to handle an incoming service interface request to run
-  // a service on the IO thread. |*receiver| is always valid when this called,
-  // and the embedder is free to take ownership if handling the request. If the
-  // embedder does not wish to handle this request on the I/O thread, it must
-  // not modify |*receiver|.
-  virtual void RunIOThreadService(mojo::GenericPendingReceiver* receiver);
+  // a service on the IO thread. Should return a ServiceFactory instance which
+  // lives at least as long as the IO thread, or nullptr.
+  //
+  // Only called from the IO thread.
+  virtual mojo::ServiceFactory* GetIOThreadServiceFactory();
 
   // Allows the embedder to handle an incoming service interface request to run
-  // a service on the main thread. |receiver| is always valid when this called.
-  virtual void RunMainThreadService(mojo::GenericPendingReceiver receiver);
+  // a service on the main thread. Should return a ServiceFactory instance which
+  // which effectively lives forever, or nullptr.
+  //
+  // Only called from the main thread.
+  virtual mojo::ServiceFactory* GetMainThreadServiceFactory();
 
   virtual void RegisterNetworkBinders(
       service_manager::BinderRegistry* registry) {}
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index d4580fd..ae03e0d 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -202,8 +202,6 @@
     "media/stream/media_stream_center.h",
     "media/stream/media_stream_device_observer.cc",
     "media/stream/media_stream_device_observer.h",
-    "media/stream/media_stream_renderer_factory_impl.cc",
-    "media/stream/media_stream_renderer_factory_impl.h",
     "media/stream/user_media_client_impl.cc",
     "media/stream/user_media_client_impl.h",
     "media/stream/user_media_processor.cc",
@@ -401,8 +399,6 @@
     "worker/dedicated_worker_host_factory_client.h",
     "worker/embedded_shared_worker_stub.cc",
     "worker/embedded_shared_worker_stub.h",
-    "worker/service_worker_network_provider_for_shared_worker.cc",
-    "worker/service_worker_network_provider_for_shared_worker.h",
     "worker/shared_worker_factory_impl.cc",
     "worker/shared_worker_factory_impl.h",
     "worker/worker_thread_registry.cc",
diff --git a/content/renderer/input/input_event_prediction.cc b/content/renderer/input/input_event_prediction.cc
index e504a73f..49ea4fae 100644
--- a/content/renderer/input/input_event_prediction.cc
+++ b/content/renderer/input/input_event_prediction.cc
@@ -113,28 +113,51 @@
   last_event_timestamp_ = event.TimeStamp();
 }
 
+// When resampling, we don't want to predict too far away because the result
+// will likely be inaccurate in that case. We then cut off the prediction to
+// the maximum available for the current predictor
 void InputEventPrediction::ApplyResampling(base::TimeTicks frame_time,
                                            WebInputEvent* event) {
-  // When resampling, we don't want to predict too far away because the
-  // result will likely be inaccurate in that case. We then cut off the
-  // prediction to the maximum available for the current mouse predictor
-  base::TimeDelta prediction_delta = std::min(
-      frame_time - event->TimeStamp(), mouse_predictor_->MaxResampleTime());
-  base::TimeTicks predict_time = event->TimeStamp() + prediction_delta;
+  base::TimeDelta prediction_delta = frame_time - event->TimeStamp();
+  base::TimeTicks predict_time;
+  WebPointerProperties* wpp_event;
 
   if (event->GetType() == WebInputEvent::kTouchMove) {
     WebTouchEvent* touch_event = static_cast<WebTouchEvent*>(event);
     for (unsigned i = 0; i < touch_event->touches_length; ++i) {
-      if (GetPointerPrediction(predict_time, &touch_event->touches[i]))
-        event->SetTimeStamp(predict_time);
+      wpp_event = &touch_event->touches[i];
+      // Cutoff prediction if delta > MaxResampleTime
+      auto predictor = pointer_id_predictor_map_.find(wpp_event->id);
+      if (predictor != pointer_id_predictor_map_.end()) {
+        prediction_delta =
+            std::min(prediction_delta, predictor->second->MaxResampleTime());
+        predict_time = event->TimeStamp() + prediction_delta;
+        // Compute the prediction
+        if (GetPointerPrediction(predict_time, wpp_event))
+          event->SetTimeStamp(predict_time);
+      }
     }
   } else if (event->GetType() == WebInputEvent::kMouseMove) {
-    if (GetPointerPrediction(predict_time, static_cast<WebMouseEvent*>(event)))
+    wpp_event = static_cast<WebMouseEvent*>(event);
+    // Cutoff prediction if delta > MaxResampleTime
+    prediction_delta =
+        std::min(prediction_delta, mouse_predictor_->MaxResampleTime());
+    predict_time = event->TimeStamp() + prediction_delta;
+    // Compute the prediction
+    if (GetPointerPrediction(predict_time, wpp_event))
       event->SetTimeStamp(predict_time);
   } else if (event->GetType() == WebInputEvent::kPointerMove) {
-    if (GetPointerPrediction(predict_time,
-                             static_cast<WebPointerEvent*>(event)))
-      event->SetTimeStamp(predict_time);
+    wpp_event = static_cast<WebPointerEvent*>(event);
+    // Cutoff prediction if delta > MaxResampleTime
+    auto predictor = pointer_id_predictor_map_.find(wpp_event->id);
+    if (predictor != pointer_id_predictor_map_.end()) {
+      prediction_delta =
+          std::min(prediction_delta, predictor->second->MaxResampleTime());
+      predict_time = event->TimeStamp() + prediction_delta;
+      // Compute the prediction
+      if (GetPointerPrediction(predict_time, wpp_event))
+        event->SetTimeStamp(predict_time);
+    }
   }
 }
 
diff --git a/content/renderer/loader/web_worker_fetch_context_impl.cc b/content/renderer/loader/web_worker_fetch_context_impl.cc
index 564b4b3..34bd415f 100644
--- a/content/renderer/loader/web_worker_fetch_context_impl.cc
+++ b/content/renderer/loader/web_worker_fetch_context_impl.cc
@@ -401,10 +401,9 @@
         ancestor_frame_id_, request, WebURLRequestToResourceType(request)));
   }
   if (response_override_) {
-    DCHECK(blink::features::IsPlzDedicatedWorkerEnabled() ||
-           blink::features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
     using RequestContextType = blink::mojom::RequestContextType;
-    DCHECK(request.GetRequestContext() == RequestContextType::WORKER ||
+    DCHECK((blink::features::IsPlzDedicatedWorkerEnabled() &&
+            request.GetRequestContext() == RequestContextType::WORKER) ||
            request.GetRequestContext() == RequestContextType::SHARED_WORKER)
         << request.GetRequestContext();
     extra_data->set_navigation_response_override(std::move(response_override_));
@@ -522,7 +521,6 @@
 
 void WebWorkerFetchContextImpl::SetResponseOverrideForMainScript(
     std::unique_ptr<NavigationResponseOverrideParameters> response_override) {
-  DCHECK(blink::features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
   DCHECK(!response_override_);
   response_override_ = std::move(response_override);
 }
diff --git a/content/renderer/media/media_factory.cc b/content/renderer/media/media_factory.cc
index 781705f3..bc044e9 100644
--- a/content/renderer/media/media_factory.cc
+++ b/content/renderer/media/media_factory.cc
@@ -21,7 +21,6 @@
 #include "content/renderer/media/audio/audio_device_factory.h"
 #include "content/renderer/media/render_media_log.h"
 #include "content/renderer/media/renderer_webmediaplayer_delegate.h"
-#include "content/renderer/media/stream/media_stream_renderer_factory_impl.h"
 #include "content/renderer/render_frame_impl.h"
 #include "content/renderer/render_thread_impl.h"
 #include "content/renderer/render_view_impl.h"
@@ -47,6 +46,7 @@
 #include "third_party/blink/public/platform/web_surface_layer_bridge.h"
 #include "third_party/blink/public/platform/web_video_frame_submitter.h"
 #include "third_party/blink/public/web/blink.h"
+#include "third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "url/origin.h"
@@ -578,7 +578,7 @@
       GetContentClient()->renderer()->CreateMediaStreamRendererFactory();
   if (factory.get())
     return factory;
-  return std::make_unique<MediaStreamRendererFactoryImpl>();
+  return blink::CreateWebMediaStreamRendererFactory();
 }
 
 media::DecoderFactory* MediaFactory::GetDecoderFactory() {
diff --git a/content/renderer/media/stream/media_stream_renderer_factory_impl.h b/content/renderer/media/stream/media_stream_renderer_factory_impl.h
deleted file mode 100644
index 714967c1..0000000
--- a/content/renderer/media/stream/media_stream_renderer_factory_impl.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 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 CONTENT_RENDERER_MEDIA_STREAM_MEDIA_STREAM_RENDERER_FACTORY_IMPL_H_
-#define CONTENT_RENDERER_MEDIA_STREAM_MEDIA_STREAM_RENDERER_FACTORY_IMPL_H_
-
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h"
-
-#include <string>
-
-#include "base/macros.h"
-
-namespace content {
-
-class MediaStreamRendererFactoryImpl
-    : public blink::WebMediaStreamRendererFactory {
- public:
-  MediaStreamRendererFactoryImpl();
-  ~MediaStreamRendererFactoryImpl() override;
-
-  scoped_refptr<blink::WebMediaStreamVideoRenderer> GetVideoRenderer(
-      const blink::WebMediaStream& web_stream,
-      const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
-      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner)
-      override;
-
-  scoped_refptr<blink::WebMediaStreamAudioRenderer> GetAudioRenderer(
-      const blink::WebMediaStream& web_stream,
-      blink::WebLocalFrame* web_frame,
-      const std::string& device_id) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MediaStreamRendererFactoryImpl);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_MEDIA_STREAM_MEDIA_STREAM_RENDERER_FACTORY_IMPL_H_
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index d2d53b4d..379ca75a 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -612,6 +612,16 @@
   return rtc_dependency_factory->GetWebRtcWorkerThreadRtcThread();
 }
 
+scoped_refptr<base::SingleThreadTaskRunner>
+RendererBlinkPlatformImpl::GetWebRtcSignalingTaskRunner() {
+  RenderThreadImpl* render_thread = RenderThreadImpl::current();
+  DCHECK(render_thread);
+  PeerConnectionDependencyFactory* rtc_dependency_factory =
+      render_thread->GetPeerConnectionDependencyFactory();
+  rtc_dependency_factory->EnsureInitialized();
+  return rtc_dependency_factory->GetWebRtcSignalingThread();
+}
+
 std::unique_ptr<cricket::PortAllocator>
 RendererBlinkPlatformImpl::CreateWebRtcPortAllocator(
     blink::WebLocalFrame* frame) {
diff --git a/content/renderer/renderer_blink_platform_impl.h b/content/renderer/renderer_blink_platform_impl.h
index 0478456..a58c51ee 100644
--- a/content/renderer/renderer_blink_platform_impl.h
+++ b/content/renderer/renderer_blink_platform_impl.h
@@ -139,6 +139,8 @@
       override;
   scoped_refptr<base::SingleThreadTaskRunner> GetWebRtcWorkerThread() override;
   rtc::Thread* GetWebRtcWorkerThreadRtcThread() override;
+  scoped_refptr<base::SingleThreadTaskRunner> GetWebRtcSignalingTaskRunner()
+      override;
   std::unique_ptr<cricket::PortAllocator> CreateWebRtcPortAllocator(
       blink::WebLocalFrame* frame) override;
   std::unique_ptr<webrtc::AsyncResolverFactory>
diff --git a/content/renderer/worker/embedded_shared_worker_stub.cc b/content/renderer/worker/embedded_shared_worker_stub.cc
index 0e2547d..e303d90 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.cc
+++ b/content/renderer/worker/embedded_shared_worker_stub.cc
@@ -19,8 +19,6 @@
 #include "content/renderer/loader/navigation_response_override_parameters.h"
 #include "content/renderer/loader/web_worker_fetch_context_impl.h"
 #include "content/renderer/renderer_blink_platform_impl.h"
-#include "content/renderer/service_worker/service_worker_provider_context.h"
-#include "content/renderer/worker/service_worker_network_provider_for_shared_worker.h"
 #include "ipc/ipc_message_macros.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -33,7 +31,6 @@
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/platform/interface_provider.h"
-#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/url_conversion.h"
 #include "third_party/blink/public/platform/web_security_origin.h"
@@ -67,21 +64,20 @@
       renderer_preferences_(renderer_preferences),
       preference_watcher_request_(std::move(preference_watcher_request)) {
   DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
+  DCHECK(main_script_load_params);
   DCHECK(subresource_loader_factory_bundle_info);
 
-  if (main_script_load_params) {
-    response_override_ =
-        std::make_unique<NavigationResponseOverrideParameters>();
-    response_override_->url_loader_client_endpoints =
-        std::move(main_script_load_params->url_loader_client_endpoints);
-    response_override_->response_head = main_script_load_params->response_head;
-    response_override_->response_body =
-        std::move(main_script_load_params->response_body);
-    response_override_->redirect_responses =
-        main_script_load_params->redirect_response_heads;
-    response_override_->redirect_infos =
-        main_script_load_params->redirect_infos;
-  }
+  // Initialize the response override for the main worker script loaded by the
+  // browser process.
+  response_override_ = std::make_unique<NavigationResponseOverrideParameters>();
+  response_override_->url_loader_client_endpoints =
+      std::move(main_script_load_params->url_loader_client_endpoints);
+  response_override_->response_head = main_script_load_params->response_head;
+  response_override_->response_body =
+      std::move(main_script_load_params->response_body);
+  response_override_->redirect_responses =
+      main_script_load_params->redirect_response_heads;
+  response_override_->redirect_infos = main_script_load_params->redirect_infos;
 
   impl_ = blink::WebSharedWorker::Create(this, appcache_host_id);
   if (pause_on_start) {
@@ -90,9 +86,6 @@
     impl_->PauseWorkerContextOnStart();
   }
 
-  service_worker_provider_info_ = std::move(service_worker_provider_info);
-  controller_info_ = std::move(controller_info);
-
   // If the network service crashes, then self-destruct so clients don't get
   // stuck with a worker with a broken loader. Self-destruction is effectively
   // the same as the worker's process crashing.
@@ -107,13 +100,22 @@
             &EmbeddedSharedWorkerStub::Terminate, base::Unretained(this)));
   }
 
-  // Initialize the loader factory bundle passed by the browser process.
-  DCHECK(!subresource_loader_factory_bundle_);
+  // Initialize the subresource loader factory bundle passed by the browser
+  // process.
   subresource_loader_factory_bundle_ =
       base::MakeRefCounted<ChildURLLoaderFactoryBundle>(
           std::make_unique<ChildURLLoaderFactoryBundleInfo>(
               std::move(subresource_loader_factory_bundle_info)));
 
+  if (service_worker_provider_info) {
+    service_worker_provider_context_ =
+        base::MakeRefCounted<ServiceWorkerProviderContext>(
+            blink::mojom::ServiceWorkerProviderType::kForDedicatedWorker,
+            std::move(service_worker_provider_info->client_request),
+            std::move(service_worker_provider_info->host_ptr_info),
+            std::move(controller_info), subresource_loader_factory_bundle_);
+  }
+
   impl_->StartWorkerContext(
       url_, blink::WebString::FromUTF8(name_),
       blink::WebString::FromUTF8(info->content_security_policy),
@@ -165,35 +167,8 @@
   delete this;
 }
 
-std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
-EmbeddedSharedWorkerStub::CreateServiceWorkerNetworkProvider() {
-  if (blink::features::IsOffMainThreadSharedWorkerScriptFetchEnabled()) {
-    // Off-the-main-thread shared worker script fetch:
-    // |response_override_| will be passed to WebWorkerFetchContextImpl in
-    // CreateWorkerFetchContext() and consumed during off-the-main-thread
-    // shared worker script fetch.
-    return ServiceWorkerNetworkProviderForSharedWorker::Create(
-        std::move(service_worker_provider_info_), std::move(controller_info_),
-        subresource_loader_factory_bundle_, IsOriginSecure(url_),
-        nullptr /* response_override */);
-  }
-
-  // |response_override_| is passed to DocumentLoader and consumed during
-  // on-the-main-thread shared worker script fetch.
-  return ServiceWorkerNetworkProviderForSharedWorker::Create(
-      std::move(service_worker_provider_info_), std::move(controller_info_),
-      subresource_loader_factory_bundle_, IsOriginSecure(url_),
-      std::move(response_override_));
-}
-
 scoped_refptr<blink::WebWorkerFetchContext>
-EmbeddedSharedWorkerStub::CreateWorkerFetchContext(
-    blink::WebServiceWorkerNetworkProvider* web_network_provider) {
-  DCHECK(web_network_provider);
-  auto* network_provider =
-      static_cast<ServiceWorkerNetworkProviderForSharedWorker*>(
-          web_network_provider);
-
+EmbeddedSharedWorkerStub::CreateWorkerFetchContext() {
   // Make the factory used for service worker network fallback (that should
   // skip AppCache if it is provided).
   std::unique_ptr<network::SharedURLLoaderFactoryInfo> fallback_factory =
@@ -201,7 +176,8 @@
 
   scoped_refptr<WebWorkerFetchContextImpl> worker_fetch_context =
       WebWorkerFetchContextImpl::Create(
-          network_provider->context(), std::move(renderer_preferences_),
+          service_worker_provider_context_.get(),
+          std::move(renderer_preferences_),
           std::move(preference_watcher_request_),
           subresource_loader_factory_bundle_->Clone(),
           std::move(fallback_factory));
@@ -219,11 +195,9 @@
   worker_fetch_context->set_is_secure_context(IsOriginSecure(url_));
   worker_fetch_context->set_origin_url(url_.GetOrigin());
 
-  if (response_override_) {
-    DCHECK(blink::features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
-    worker_fetch_context->SetResponseOverrideForMainScript(
-        std::move(response_override_));
-  }
+  DCHECK(response_override_);
+  worker_fetch_context->SetResponseOverrideForMainScript(
+      std::move(response_override_));
 
   return worker_fetch_context;
 }
diff --git a/content/renderer/worker/embedded_shared_worker_stub.h b/content/renderer/worker/embedded_shared_worker_stub.h
index 98c89157..90c389ec 100644
--- a/content/renderer/worker/embedded_shared_worker_stub.h
+++ b/content/renderer/worker/embedded_shared_worker_stub.h
@@ -10,6 +10,7 @@
 
 #include "base/macros.h"
 #include "base/unguessable_token.h"
+#include "content/renderer/service_worker/service_worker_provider_context.h"
 #include "ipc/ipc_listener.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
@@ -79,10 +80,8 @@
   void WorkerReadyForInspection() override;
   void WorkerScriptLoadFailed() override;
   void WorkerScriptEvaluated(bool success) override;
-  std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
-  CreateServiceWorkerNetworkProvider() override;
-  scoped_refptr<blink::WebWorkerFetchContext> CreateWorkerFetchContext(
-      blink::WebServiceWorkerNetworkProvider*) override;
+  scoped_refptr<blink::WebWorkerFetchContext> CreateWorkerFetchContext()
+      override;
 
  private:
   // WebSharedWorker will own |channel|.
@@ -112,11 +111,7 @@
       std::pair<int /* connection_request_id */, blink::MessagePortChannel>;
   std::vector<PendingChannel> pending_channels_;
 
-  // The info needed to connect to the ServiceWorkerProviderHost on the browser.
-  blink::mojom::ServiceWorkerProviderInfoForClientPtr
-      service_worker_provider_info_;
-
-  blink::mojom::ControllerServiceWorkerInfoPtr controller_info_;
+  scoped_refptr<ServiceWorkerProviderContext> service_worker_provider_context_;
 
   // The factory bundle used for loading subresources for this shared worker.
   scoped_refptr<ChildURLLoaderFactoryBundle> subresource_loader_factory_bundle_;
diff --git a/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc b/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc
deleted file mode 100644
index 0984b816..0000000
--- a/content/renderer/worker/service_worker_network_provider_for_shared_worker.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2019 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 "content/renderer/worker/service_worker_network_provider_for_shared_worker.h"
-
-#include <utility>
-
-#include "base/feature_list.h"
-#include "content/public/common/origin_util.h"
-#include "content/renderer/loader/navigation_response_override_parameters.h"
-#include "content/renderer/loader/request_extra_data.h"
-#include "content/renderer/service_worker/service_worker_provider_context.h"
-#include "services/network/public/cpp/features.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
-
-namespace content {
-
-std::unique_ptr<ServiceWorkerNetworkProviderForSharedWorker>
-ServiceWorkerNetworkProviderForSharedWorker::Create(
-    blink::mojom::ServiceWorkerProviderInfoForClientPtr info,
-    blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
-    scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory,
-    bool is_secure_context,
-    std::unique_ptr<NavigationResponseOverrideParameters> response_override) {
-  auto provider =
-      base::WrapUnique(new ServiceWorkerNetworkProviderForSharedWorker(
-          is_secure_context, std::move(response_override)));
-  if (info) {
-    provider->context_ = base::MakeRefCounted<ServiceWorkerProviderContext>(
-        blink::mojom::ServiceWorkerProviderType::kForSharedWorker,
-        std::move(info->client_request), std::move(info->host_ptr_info),
-        std::move(controller_info), std::move(fallback_loader_factory));
-  }
-  return provider;
-}
-
-ServiceWorkerNetworkProviderForSharedWorker::
-    ~ServiceWorkerNetworkProviderForSharedWorker() {
-  if (context())
-    context()->OnNetworkProviderDestroyed();
-}
-
-void ServiceWorkerNetworkProviderForSharedWorker::WillSendRequest(
-    blink::WebURLRequest& request) {
-  auto extra_data = std::make_unique<RequestExtraData>();
-  extra_data->set_initiated_in_secure_context(is_secure_context_);
-  if (response_override_) {
-    DCHECK(base::FeatureList::IsEnabled(network::features::kNetworkService));
-    extra_data->set_navigation_response_override(std::move(response_override_));
-  }
-  request.SetExtraData(std::move(extra_data));
-}
-
-std::unique_ptr<blink::WebURLLoader>
-ServiceWorkerNetworkProviderForSharedWorker::CreateURLLoader(
-    const blink::WebURLRequest& request,
-    std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
-        task_runner_handle) {
-  if (request.GetRequestContext() !=
-      blink::mojom::RequestContextType::SHARED_WORKER) {
-    // This provider is only used for requests from the shadow page, which is
-    // created to load the shared worker's main script. But shadow pages
-    // sometimes request strange things like CSS resources because consumers
-    // think it's a real frame. Just return nullptr to use the default loader
-    // instead of the script loader.
-    return nullptr;
-  }
-
-  // Otherwise go to default resource loading.
-  return nullptr;
-}
-
-blink::mojom::ControllerServiceWorkerMode
-ServiceWorkerNetworkProviderForSharedWorker::GetControllerServiceWorkerMode() {
-  if (!context())
-    return blink::mojom::ControllerServiceWorkerMode::kNoController;
-  return context()->GetControllerServiceWorkerMode();
-}
-
-int64_t
-ServiceWorkerNetworkProviderForSharedWorker::ControllerServiceWorkerID() {
-  if (!context())
-    return blink::mojom::kInvalidServiceWorkerVersionId;
-  return context()->GetControllerVersionId();
-}
-
-void ServiceWorkerNetworkProviderForSharedWorker::DispatchNetworkQuiet() {}
-
-ServiceWorkerNetworkProviderForSharedWorker::
-    ServiceWorkerNetworkProviderForSharedWorker(
-        bool is_secure_context,
-        std::unique_ptr<NavigationResponseOverrideParameters> response_override)
-    : is_secure_context_(is_secure_context),
-      response_override_(std::move(response_override)) {}
-
-}  // namespace content
diff --git a/content/renderer/worker/service_worker_network_provider_for_shared_worker.h b/content/renderer/worker/service_worker_network_provider_for_shared_worker.h
deleted file mode 100644
index c98f6ce..0000000
--- a/content/renderer/worker/service_worker_network_provider_for_shared_worker.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2019 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 CONTENT_RENDERER_WORKER_SERVICE_WORKER_NETWORK_PROVIDER_FOR_SHARED_WORKER_H_
-#define CONTENT_RENDERER_WORKER_SERVICE_WORKER_NETWORK_PROVIDER_FOR_SHARED_WORKER_H_
-
-#include <memory>
-
-#include "base/memory/ref_counted.h"
-#include "content/renderer/service_worker/service_worker_provider_context.h"
-#include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_provider_type.mojom.h"
-#include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
-
-namespace content {
-
-struct NavigationResponseOverrideParameters;
-
-// The WebServiceWorkerNetworkProvider implementation used for shared
-// workers.
-//
-// This class is only used for the main script request from the shadow page.
-// Remove it when the shadow page is removed (https://crbug.com/538751).
-class ServiceWorkerNetworkProviderForSharedWorker final
-    : public blink::WebServiceWorkerNetworkProvider {
- public:
-  // Creates a new instance.
-  // - |info|: provider info from the browser
-  // - |controller_info|: info about controller service worker
-  // - |fallback_loader_factory|: the factory to use when a service worker falls
-  //   back to network (unlike the default factory of this renderer, it skips
-  //   AppCache)
-  // - |is_secure_context|: whether this context is secure
-  // - |response_override|: the main script response
-  static std::unique_ptr<ServiceWorkerNetworkProviderForSharedWorker> Create(
-      blink::mojom::ServiceWorkerProviderInfoForClientPtr info,
-      blink::mojom::ControllerServiceWorkerInfoPtr controller_info,
-      scoped_refptr<network::SharedURLLoaderFactory> fallback_loader_factory,
-      bool is_secure_context,
-      std::unique_ptr<NavigationResponseOverrideParameters> response_override);
-
-  ServiceWorkerNetworkProviderForSharedWorker(
-      bool is_secure_context,
-      std::unique_ptr<NavigationResponseOverrideParameters> response_override);
-  ~ServiceWorkerNetworkProviderForSharedWorker() override;
-
-  // Implements WebServiceWorkerNetworkProvider.
-  void WillSendRequest(blink::WebURLRequest& request) override;
-  std::unique_ptr<blink::WebURLLoader> CreateURLLoader(
-      const blink::WebURLRequest& request,
-      std::unique_ptr<blink::scheduler::WebResourceLoadingTaskRunnerHandle>
-          task_runner_handle) override;
-  blink::mojom::ControllerServiceWorkerMode GetControllerServiceWorkerMode()
-      override;
-  int64_t ControllerServiceWorkerID() override;
-  void DispatchNetworkQuiet() override;
-
-  ServiceWorkerProviderContext* context() { return context_.get(); }
-
- private:
-  const bool is_secure_context_;
-  std::unique_ptr<NavigationResponseOverrideParameters> response_override_;
-
-  // |context_| is null if |this| is an invalid instance, in which case there is
-  // no connection to the browser process.
-  scoped_refptr<ServiceWorkerProviderContext> context_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_RENDERER_WORKER_SERVICE_WORKER_NETWORK_PROVIDER_FOR_SHARED_WORKER_H_
diff --git a/content/shell/browser/shell_views.cc b/content/shell/browser/shell_views.cc
index cae6ae8..870c8e71 100644
--- a/content/shell/browser/shell_views.cc
+++ b/content/shell/browser/shell_views.cc
@@ -231,7 +231,7 @@
                       const ui::KeyEvent& key_event) override {
     if (key_event.type() == ui::ET_KEY_PRESSED && sender == url_entry_ &&
         key_event.key_code() == ui::VKEY_RETURN) {
-      std::string text = base::UTF16ToUTF8(url_entry_->text());
+      std::string text = base::UTF16ToUTF8(url_entry_->GetText());
       GURL url(text);
       if (!url.has_scheme()) {
         url = GURL(std::string("http://") + std::string(text));
diff --git a/content/shell/renderer/web_test/test_media_stream_renderer_factory.h b/content/shell/renderer/web_test/test_media_stream_renderer_factory.h
index ba1052e3..5e5273bf 100644
--- a/content/shell/renderer/web_test/test_media_stream_renderer_factory.h
+++ b/content/shell/renderer/web_test/test_media_stream_renderer_factory.h
@@ -8,7 +8,7 @@
 #include <string>
 
 #include "base/callback_forward.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h"
+#include "third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h"
 
 namespace content {
 
diff --git a/content/shell/utility/shell_content_utility_client.cc b/content/shell/utility/shell_content_utility_client.cc
index 5c38e9ca..61b358f5 100644
--- a/content/shell/utility/shell_content_utility_client.cc
+++ b/content/shell/utility/shell_content_utility_client.cc
@@ -22,6 +22,7 @@
 #include "content/public/utility/utility_thread.h"
 #include "content/shell/common/power_monitor_test_impl.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
+#include "mojo/public/cpp/bindings/service_factory.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/system/buffer.h"
 #include "services/service_manager/public/cpp/binder_registry.h"
@@ -81,6 +82,10 @@
   DISALLOW_COPY_AND_ASSIGN(TestUtilityServiceImpl);
 };
 
+auto RunEchoService(mojo::PendingReceiver<echo::mojom::EchoService> receiver) {
+  return std::make_unique<echo::EchoService>(std::move(receiver));
+}
+
 }  // namespace
 
 ShellContentUtilityClient::ShellContentUtilityClient(bool is_browsertest) {
@@ -127,13 +132,11 @@
   return false;
 }
 
-void ShellContentUtilityClient::RunIOThreadService(
-    mojo::GenericPendingReceiver* receiver) {
-  if (auto echo_receiver = receiver->As<echo::mojom::EchoService>()) {
-    static base::NoDestructor<echo::EchoService> service(
-        std::move(echo_receiver));
-    return;
-  }
+mojo::ServiceFactory* ShellContentUtilityClient::GetIOThreadServiceFactory() {
+  static base::NoDestructor<mojo::ServiceFactory> factory{
+      RunEchoService,
+  };
+  return factory.get();
 }
 
 void ShellContentUtilityClient::RegisterNetworkBinders(
diff --git a/content/shell/utility/shell_content_utility_client.h b/content/shell/utility/shell_content_utility_client.h
index 6d67275..849783c 100644
--- a/content/shell/utility/shell_content_utility_client.h
+++ b/content/shell/utility/shell_content_utility_client.h
@@ -22,7 +22,7 @@
   bool HandleServiceRequest(
       const std::string& service_name,
       service_manager::mojom::ServiceRequest request) override;
-  void RunIOThreadService(mojo::GenericPendingReceiver* receiver) override;
+  mojo::ServiceFactory* GetIOThreadServiceFactory() override;
   void RegisterNetworkBinders(
       service_manager::BinderRegistry* registry) override;
   void RegisterAudioBinders(service_manager::BinderMap* binders) override;
diff --git a/content/test/data/accessibility/html/action-verbs-expected-uia-win.txt b/content/test/data/accessibility/html/action-verbs-expected-uia-win.txt
index 186e85f..3c7e3e557 100644
--- a/content/test/data/accessibility/html/action-verbs-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/action-verbs-expected-uia-win.txt
@@ -5,7 +5,7 @@
 ++button Name='Button'
 ++link Name='Link'
 ++textbox
-++textbox
+++searchbox
 ++textbox
 ++textbox
 ++checkbox Toggle.ToggleState='Off'
diff --git a/content/test/data/accessibility/html/input-search-expected-android.txt b/content/test/data/accessibility/html/input-search-expected-android.txt
index 7613b7cd..0da53e1 100644
--- a/content/test/data/accessibility/html/input-search-expected-android.txt
+++ b/content/test/data/accessibility/html/input-search-expected-android.txt
@@ -1,3 +1,3 @@
 android.webkit.WebView focusable focused scrollable
 ++android.view.View
-++++android.widget.EditText clickable editable_text focusable has_non_empty_value name='Search terms' input_type=1 text_change_added_count=12
+++++android.widget.EditText role_description='search text field' clickable editable_text focusable has_non_empty_value name='Search terms' input_type=1 text_change_added_count=12
diff --git a/content/test/data/accessibility/html/input-search-expected-mac.txt b/content/test/data/accessibility/html/input-search-expected-mac.txt
index 7784eff..3dfb477 100644
--- a/content/test/data/accessibility/html/input-search-expected-mac.txt
+++ b/content/test/data/accessibility/html/input-search-expected-mac.txt
@@ -1,3 +1,3 @@
 AXWebArea AXRoleDescription='HTML content'
 ++AXGroup AXRoleDescription='group'
-++++AXTextField AXRoleDescription='text field' AXValue='Search terms'
+++++AXTextField AXSubrole=AXSearchField AXRoleDescription='search text field' AXValue='Search terms'
diff --git a/content/test/data/accessibility/html/input-search-expected-uia-win.txt b/content/test/data/accessibility/html/input-search-expected-uia-win.txt
index 8a36694..2f4c42d 100644
--- a/content/test/data/accessibility/html/input-search-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/input-search-expected-uia-win.txt
@@ -1,3 +1,3 @@
-document
-++group
-++++textbox Value.Value='Search terms'
+document LocalizedControlType='document'
+++group LocalizedControlType='group'
+++++searchbox LocalizedControlType='search box' Value.Value='Search terms'
diff --git a/content/test/data/accessibility/html/input-search.html b/content/test/data/accessibility/html/input-search.html
index 8e8b20a..962e186 100644
--- a/content/test/data/accessibility/html/input-search.html
+++ b/content/test/data/accessibility/html/input-search.html
@@ -1,6 +1,7 @@
 <!--
 @MAC-ALLOW:AXRole*
 @MAC-ALLOW:AXSubrole*
+@UIA-WIN-ALLOW:LocalizedControlType*
 @WIN-ALLOW:caret_offset*
 @WIN-ALLOW:ia2_hypertext=*
 @WIN-ALLOW:n_selections*
diff --git a/content/test/data/accessibility/html/input-types-expected-android.txt b/content/test/data/accessibility/html/input-types-expected-android.txt
index b3263bad9..f10c9c0 100644
--- a/content/test/data/accessibility/html/input-types-expected-android.txt
+++ b/content/test/data/accessibility/html/input-types-expected-android.txt
@@ -34,7 +34,7 @@
 ++++++android.widget.Button role_description='button' clickable focusable name='Reset:'
 ++++android.view.View
 ++++++android.view.View name='Search: '
-++++++android.widget.EditText clickable editable_text focusable hint='Search:' input_type=1
+++++++android.widget.EditText role_description='search text field' clickable editable_text focusable hint='Search:' input_type=1
 ++++android.view.View
 ++++++android.view.View name='Submit: '
 ++++++android.widget.Button role_description='button' clickable focusable name='Submit:'
diff --git a/content/test/data/accessibility/html/input-types-expected-blink.txt b/content/test/data/accessibility/html/input-types-expected-blink.txt
index 6a11448..91173b1 100644
--- a/content/test/data/accessibility/html/input-types-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-types-expected-blink.txt
@@ -50,7 +50,7 @@
 ++++labelText
 ++++++staticText name='Search: '
 ++++++++inlineTextBox name='Search: '
-++++++textField name='Search:'
+++++++searchBox name='Search:'
 ++++++++genericContainer
 ++++labelText
 ++++++staticText name='Submit: '
diff --git a/content/test/data/accessibility/html/input-types-expected-uia-win.txt b/content/test/data/accessibility/html/input-types-expected-uia-win.txt
index 815dcec..a92836e 100644
--- a/content/test/data/accessibility/html/input-types-expected-uia-win.txt
+++ b/content/test/data/accessibility/html/input-types-expected-uia-win.txt
@@ -34,7 +34,7 @@
 ++++++button Name='Reset:'
 ++++description
 ++++++description Name='Search: '
-++++++textbox Name='Search:'
+++++++searchbox Name='Search:'
 ++++description
 ++++++description Name='Submit: '
 ++++++button Name='Submit:'
@@ -46,4 +46,4 @@
 ++++++textbox Name='Text:'
 ++++description
 ++++++description Name='Url: '
-++++++textbox Name='Url:'
+++++++textbox Name='Url:'
\ No newline at end of file
diff --git a/content/test/gpu/gpu_tests/cloud_storage_integration_test_base.py b/content/test/gpu/gpu_tests/cloud_storage_integration_test_base.py
index 97f03ba..a381e14 100644
--- a/content/test/gpu/gpu_tests/cloud_storage_integration_test_base.py
+++ b/content/test/gpu/gpu_tests/cloud_storage_integration_test_base.py
@@ -28,19 +28,12 @@
   # methods that aren't overridden.
   # pylint: disable=abstract-method
 
-  # This information is class-scoped, so that it can be shared across
-  # invocations of tests; but it's zapped every time the browser is
-  # restarted with different command line arguments.
-  _reference_image_parameters = None
-
   # The command line options (which are passed to subclasses'
   # GenerateGpuTests) *must* be configured here, via a call to
   # SetParsedCommandLineOptions. If they are not, an error will be
   # raised when running the tests.
   _parsed_command_line_options = None
 
-  _skia_gold_temp_dir = None
-
   _error_image_cloud_storage_bucket = 'chromium-browser-gpu-tests'
 
   @classmethod
diff --git a/content/test/gpu/gpu_tests/pixel_integration_test.py b/content/test/gpu/gpu_tests/pixel_integration_test.py
index 4bf8357..34e0970e 100644
--- a/content/test/gpu/gpu_tests/pixel_integration_test.py
+++ b/content/test/gpu/gpu_tests/pixel_integration_test.py
@@ -8,6 +8,7 @@
 import re
 import subprocess
 from subprocess import CalledProcessError
+import shutil
 import sys
 import tempfile
 
@@ -63,7 +64,7 @@
 SKIA_GOLD_INSTANCE = 'chrome-gpu'
 
 
-class _ReferenceImageParameters(object):
+class _ImageParameters(object):
   def __init__(self):
     # Parameters for cloud storage reference images.
     self.vendor_id = None
@@ -79,6 +80,13 @@
 
   test_base_name = 'Pixel'
 
+  # This information is class-scoped, so that it can be shared across
+  # invocations of tests; but it's zapped every time the browser is
+  # restarted with different command line arguments.
+  _image_parameters = None
+
+  _skia_gold_temp_dir = None
+
   @classmethod
   def Name(cls):
     """The name by which this test is invoked on the command line."""
@@ -93,6 +101,7 @@
     cls.CustomizeBrowserArgs(cls._AddDefaultArgs([]))
     cls.StartBrowser()
     cls.SetStaticServerDirs(test_data_dirs)
+    cls._skia_gold_temp_dir = tempfile.mkdtemp()
 
   @staticmethod
   def _AddDefaultArgs(browser_args):
@@ -111,6 +120,12 @@
     cls.ResetGpuInfo()
 
   @classmethod
+  def TearDownProcess(cls):
+    super(PixelIntegrationTest, cls).TearDownProcess()
+    if not cls.GetParsedCommandLineOptions().local_run:
+      shutil.rmtree(cls._skia_gold_temp_dir)
+
+  @classmethod
   def AddCommandlineArgs(cls, parser):
     super(PixelIntegrationTest, cls).AddCommandlineArgs(parser)
     parser.add_option(
@@ -140,8 +155,9 @@
       '--local-run',
       action='store_true', default=False,
       help='Runs the tests in a manner more suitable for local testing. '
-           'Specifically, runs goldctl in dryrun mode (no upload) and outputs '
-           'local links to generated images. Implies --no-luci-auth.')
+           'Specifically, runs goldctl in extra_imgtest_args mode (no upload) '
+           'and outputs local links to generated images. Implies '
+           '--no-luci-auth.')
     parser.add_option(
       '--no-luci-auth',
       action='store_true', default=False,
@@ -169,17 +185,17 @@
 
   @classmethod
   def ResetGpuInfo(cls):
-    cls._reference_image_parameters = None
+    cls._image_parameters = None
 
   @classmethod
-  def GetReferenceImageParameters(cls, tab, page):
-    if not cls._reference_image_parameters:
+  def GetImageParameters(cls, tab, page):
+    if not cls._image_parameters:
       cls._ComputeGpuInfo(tab, page)
-    return cls._reference_image_parameters
+    return cls._image_parameters
 
   @classmethod
   def _ComputeGpuInfo(cls, tab, page):
-    if cls._reference_image_parameters:
+    if cls._image_parameters:
       return
     browser = cls.browser
     system_info = browser.GetSystemInfo()
@@ -188,8 +204,8 @@
     if not system_info.gpu:
       raise Exception('GPU information was absent')
     device = system_info.gpu.devices[0]
-    cls._reference_image_parameters = _ReferenceImageParameters()
-    params = cls._reference_image_parameters
+    cls._image_parameters = _ImageParameters()
+    params = cls._image_parameters
     if device.vendor_id and device.device_id:
       params.vendor_id = device.vendor_id
       params.device_id = device.device_id
@@ -250,12 +266,20 @@
       'domAutomationController._readyForActions')
     if do_page_action:
       self._DoPageAction(tab, page)
-    self.RunSkiaGoldBasedPixelTest(test_path, do_page_action, args)
+    self._RunSkiaGoldBasedPixelTest(do_page_action, page)
 
-  def RunSkiaGoldBasedPixelTest(self, test_path, do_page_action, args):
-    page = args[0]
+  def _RunSkiaGoldBasedPixelTest(self, do_page_action, page):
+    """Captures and compares a test image using Skia Gold.
+
+    Raises an Exception if the comparison fails.
+
+    Args:
+      do_page_action: a bool indicating if an action was run on the page.
+      page: the GPU PixelTestPage object for the test.
+    """
     tab = self.tab
     try:
+      # Actually run the test and capture the screenshot.
       if not tab.EvaluateJavaScript('domAutomationController._succeeded'):
         self.fail('page indicated test failure')
       if not tab.screenshot_supported:
@@ -269,12 +293,13 @@
             screenshot, int(page.test_rect[0] * dpr),
             int(page.test_rect[1] * dpr), int(page.test_rect[2] * dpr),
             int(page.test_rect[3] * dpr))
-      # This is required by Gold whether this is a tryjob or not.
+
+      # Get all the information that goldctl requires.
+      parsed_options = self.GetParsedCommandLineOptions()
       build_id_args = [
         '--commit',
-        self.GetParsedCommandLineOptions().build_revision,
+        parsed_options.build_revision,
       ]
-      parsed_options = self.GetParsedCommandLineOptions()
       # If --review-patch-issue is passed, then we assume we're running on a
       # trybot.
       if parsed_options.review_patch_issue:
@@ -286,11 +311,12 @@
           '--jobid',
           parsed_options.buildbucket_build_id
         ]
+
+      # Compare images against approved images/colors.
       if page.expected_colors:
-        # Use expected colors instead of ref images for validation.
+        # Use expected colors instead of hash comparison for validation.
         self._ValidateScreenshotSamplesWithSkiaGold(
-            tab, page, screenshot, page.expected_colors, page.tolerance,
-            dpr, build_id_args)
+            tab, page, screenshot, dpr, build_id_args)
         return
       image_name = self._UrlToImageName(page.name)
       self._UploadTestResultToSkiaGold(
@@ -304,49 +330,68 @@
 
   def _UploadTestResultToSkiaGold(self, image_name, screenshot,
                                   tab, page, build_id_args=None):
-    if build_id_args is None:
+    """Compares the given image using Skia Gold and uploads the result.
+
+    No uploading is done if the test is being run in local run mode. Compares
+    the given screenshot to baselines provided by Gold, raising an Exception if
+    a match is not found.
+
+    Args:
+      image_name: the name of the image being checked.
+      screenshot: the image being checked as a Telemetry Bitmap.
+      tab: the Telemetry Tab object that the test was run in.
+      page: the GPU PixelTestPage object for the test.
+      build_id_args: a list of build-identifying flags and values.
+    """
+    if not isinstance(build_id_args, list) or '--commit' not in build_id_args:
       raise Exception('Requires build args to be specified, including --commit')
-    if self._skia_gold_temp_dir is None:
-      # TODO(kbr): this depends on Swarming to clean up the temporary
-      # directory to avoid filling up the local disk.
-      self._skia_gold_temp_dir = tempfile.mkdtemp()
+
     # Write screenshot to PNG file on local disk.
-    png_temp_file = tempfile.NamedTemporaryFile(suffix='.png').name
+    png_temp_file = tempfile.NamedTemporaryFile(
+        suffix='.png', dir=self._skia_gold_temp_dir).name
     image_util.WritePngFile(screenshot, png_temp_file)
-    ref_img_params = self.GetReferenceImageParameters(tab, page)
+
+    # Get all information that goldctl will need.
+    img_params = self.GetImageParameters(tab, page)
     # All values need to be strings, otherwise goldctl fails.
     gpu_keys = {
-      'vendor_id': self.ToHexOrNone(ref_img_params.vendor_id),
-      'device_id': self.ToHexOrNone(ref_img_params.device_id),
-      'vendor_string': str(ref_img_params.vendor_string),
-      'device_string': str(ref_img_params.device_string),
-      'msaa': str(ref_img_params.msaa),
-      'model_name': str(ref_img_params.model_name),
+      'vendor_id': self.ToHexOrNone(img_params.vendor_id),
+      'device_id': self.ToHexOrNone(img_params.device_id),
+      'vendor_string': str(img_params.vendor_string),
+      'device_string': str(img_params.device_string),
+      'msaa': str(img_params.msaa),
+      'model_name': str(img_params.model_name),
     }
-    mode = ['--passfail']
-    dryrun = []
-    luci = []
-    if self.GetParsedCommandLineOptions().local_run:
-      dryrun = ['--dryrun']
-    elif not self.GetParsedCommandLineOptions().no_luci_auth:
-      luci = ['--luci']
-    json_temp_file = tempfile.NamedTemporaryFile(suffix='.json').name
-    failure_file = tempfile.NamedTemporaryFile(suffix='.txt').name
+    json_temp_file = tempfile.NamedTemporaryFile(
+        suffix='.json', dir=self._skia_gold_temp_dir).name
+    failure_file = tempfile.NamedTemporaryFile(
+        suffix='.txt', dir=self._skia_gold_temp_dir).name
     with open(json_temp_file, 'w+') as f:
       json.dump(gpu_keys, f)
+
+    # Figure out any extra args we need to pass to goldctl.
+    extra_imgtest_args = []
+    extra_auth_args = []
+    parsed_options = self.GetParsedCommandLineOptions()
+    if parsed_options.local_run:
+      extra_imgtest_args.append('--dryrun')
+    elif not parsed_options.no_luci_auth:
+      extra_auth_args = ['--luci']
+
+    # Run goldctl for a result.
     try:
       subprocess.check_output([goldctl_bin, 'auth',
                                '--work-dir', self._skia_gold_temp_dir]
-                               + luci,
+                               + extra_auth_args,
             stderr=subprocess.STDOUT)
-      cmd = ([goldctl_bin, 'imgtest', 'add'] + mode +
-                            ['--test-name', image_name,
-                             '--instance', SKIA_GOLD_INSTANCE,
-                             '--keys-file', json_temp_file,
-                             '--png-file', png_temp_file,
-                             '--work-dir', self._skia_gold_temp_dir,
-                             '--failure-file', failure_file] +
-                            build_id_args + dryrun)
+      cmd = ([goldctl_bin, 'imgtest', 'add', '--passfail',
+              '--test-name', image_name,
+              '--instance', SKIA_GOLD_INSTANCE,
+              '--keys-file', json_temp_file,
+              '--png-file', png_temp_file,
+              '--work-dir', self._skia_gold_temp_dir,
+              '--failure-file', failure_file] +
+              build_id_args + extra_imgtest_args)
       subprocess.check_output(cmd, stderr=subprocess.STDOUT)
     except CalledProcessError as e:
       try:
@@ -359,7 +404,7 @@
       except Exception:
         logging.error('Failed to read contents of goldctl failure file')
       logging.error('goldctl failed with output: %s', e.output)
-      if self.GetParsedCommandLineOptions().local_run:
+      if parsed_options.local_run:
         logging.error(
             'Image produced by %s: file://%s', image_name, png_temp_file)
         gold_images = ('https://%s-gold.skia.org/search?'
@@ -368,35 +413,41 @@
                           SKIA_GOLD_INSTANCE, image_name))
         logging.error(
             'Approved images for %s in Gold: %s', image_name, gold_images)
-      if not self.GetParsedCommandLineOptions().no_skia_gold_failure:
+      if not parsed_options.no_skia_gold_failure:
         raise Exception('goldctl command failed')
 
   def _ValidateScreenshotSamplesWithSkiaGold(self, tab, page, screenshot,
-                                             expectations, tolerance,
                                              device_pixel_ratio,
                                              build_id_args):
     """Samples the given screenshot and verifies pixel color values.
-       The sample locations and expected color values are given in expectations.
-       In case any of the samples do not match the expected color, it raises
-       a Failure and dumps the screenshot locally or cloud storage depending on
-       what machine the test is being run."""
-    url = page.name
+
+    In case any of the samples do not match the expected color, it raises
+    a Failure and uploads the image to Gold.
+
+    Args:
+      tab: the Telemetry Tab object that the test was run in.
+      page: the GPU PixelTestPage object for the test.
+      screenshot: the screenshot of the test page as a Telemetry Bitmap.
+      device_pixel_ratio: the device pixel ratio for the test device as a float.
+      build_id_args: a list of build-identifying flags and values.
+    """
     try:
       self._CompareScreenshotSamples(
-        tab, screenshot, expectations, tolerance, device_pixel_ratio,
+        tab, screenshot, page.expected_colors, page.tolerance,
+        device_pixel_ratio,
         self.GetParsedCommandLineOptions().test_machine_name)
     except Exception:
       # An exception raised from self.fail() indicates a failure.
-      image_name = self._UrlToImageName(url)
-      if self.GetParsedCommandLineOptions().test_machine_name:
+      image_name = self._UrlToImageName(page.name)
+      # We want to report the screenshot comparison failure, not any failures
+      # related to Gold.
+      try:
         self._UploadTestResultToSkiaGold(
           image_name, screenshot,
           tab, page,
           build_id_args=build_id_args)
-      else:
-        self._WriteErrorImages(
-          self.GetParsedCommandLineOptions().generated_dir, image_name,
-          screenshot, None)
+      except Exception as e:
+        logging.error(str(e))
       raise
 
   def _DoPageAction(self, tab, page):
diff --git a/content/utility/services.cc b/content/utility/services.cc
index 39f3d532..be0e50a 100644
--- a/content/utility/services.cc
+++ b/content/utility/services.cc
@@ -9,36 +9,59 @@
 #include "base/no_destructor.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/utility/content_utility_client.h"
+#include "mojo/public/cpp/bindings/service_factory.h"
 #include "services/video_capture/public/mojom/video_capture_service.mojom.h"
 #include "services/video_capture/video_capture_service_impl.h"
 
 namespace content {
 
+namespace {
+
+auto RunVideoCapture(
+    mojo::PendingReceiver<video_capture::mojom::VideoCaptureService> receiver) {
+  return std::make_unique<video_capture::VideoCaptureServiceImpl>(
+      std::move(receiver), base::ThreadTaskRunnerHandle::Get());
+}
+
+mojo::ServiceFactory& GetMainThreadServiceFactory() {
+  static base::NoDestructor<mojo::ServiceFactory> factory{
+      RunVideoCapture,
+  };
+  return *factory;
+}
+
+}  // namespace
+
 void HandleServiceRequestOnIOThread(
     mojo::GenericPendingReceiver receiver,
     base::SequencedTaskRunner* main_thread_task_runner) {
   // If the request was handled already, we should not reach this point.
   DCHECK(receiver.is_valid());
-  GetContentClient()->utility()->RunIOThreadService(&receiver);
+  auto* embedder_factory =
+      GetContentClient()->utility()->GetIOThreadServiceFactory();
+  if (embedder_factory && embedder_factory->MaybeRunService(&receiver))
+    return;
 
-  if (receiver.is_valid()) {
-    main_thread_task_runner->PostTask(
-        FROM_HERE,
-        base::BindOnce(&HandleServiceRequestOnMainThread, std::move(receiver)));
-  }
+  DCHECK(receiver.is_valid());
+  main_thread_task_runner->PostTask(
+      FROM_HERE,
+      base::BindOnce(&HandleServiceRequestOnMainThread, std::move(receiver)));
 }
 
 void HandleServiceRequestOnMainThread(mojo::GenericPendingReceiver receiver) {
-  if (auto video_capture_receiver =
-          receiver.As<video_capture::mojom::VideoCaptureService>()) {
-    static base::NoDestructor<video_capture::VideoCaptureServiceImpl> service(
-        std::move(video_capture_receiver), base::ThreadTaskRunnerHandle::Get());
+  if (GetMainThreadServiceFactory().MaybeRunService(&receiver))
     return;
-  }
 
   // If the request was handled already, we should not reach this point.
   DCHECK(receiver.is_valid());
-  GetContentClient()->utility()->RunMainThreadService(std::move(receiver));
+  auto* embedder_factory =
+      GetContentClient()->utility()->GetMainThreadServiceFactory();
+  if (embedder_factory && embedder_factory->MaybeRunService(&receiver))
+    return;
+
+  DCHECK(receiver.is_valid());
+  DLOG(ERROR) << "Unhandled out-of-process service request for "
+              << receiver.interface_name().value();
 }
 
 }  // namespace content
diff --git a/dbus/OWNERS b/dbus/OWNERS
index 04931c3..7b310e7c3 100644
--- a/dbus/OWNERS
+++ b/dbus/OWNERS
@@ -1,3 +1,4 @@
 hashimoto@chromium.org
 satorux@chromium.org
 stevenjb@chromium.org
+# COMPONENT: OS>Systems
diff --git a/device/bluetooth/test/bluetooth_test_android.cc b/device/bluetooth/test/bluetooth_test_android.cc
index 4d32368..d801af69 100644
--- a/device/bluetooth/test/bluetooth_test_android.cc
+++ b/device/bluetooth/test/bluetooth_test_android.cc
@@ -63,7 +63,6 @@
 
 void BluetoothTestAndroid::PostTaskFromJava(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jobject>& runnable) {
   base::android::ScopedJavaGlobalRef<jobject> runnable_ref;
   // ScopedJavaGlobalRef does not hold onto the env reference, so it is safe to
@@ -480,63 +479,48 @@
       descriptor_android->GetJavaObject());
 }
 
-void BluetoothTestAndroid::OnFakeBluetoothDeviceConnectGattCalled(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void BluetoothTestAndroid::OnFakeBluetoothDeviceConnectGattCalled(JNIEnv* env) {
   gatt_open_connections_++;
   gatt_connection_attempts_++;
 }
 
-void BluetoothTestAndroid::OnFakeBluetoothGattDisconnect(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void BluetoothTestAndroid::OnFakeBluetoothGattDisconnect(JNIEnv* env) {
   gatt_disconnection_attempts_++;
 }
 
-void BluetoothTestAndroid::OnFakeBluetoothGattClose(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void BluetoothTestAndroid::OnFakeBluetoothGattClose(JNIEnv* env) {
   gatt_open_connections_--;
 
   // close implies disconnect
   gatt_disconnection_attempts_++;
 }
 
-void BluetoothTestAndroid::OnFakeBluetoothGattDiscoverServices(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void BluetoothTestAndroid::OnFakeBluetoothGattDiscoverServices(JNIEnv* env) {
   gatt_discovery_attempts_++;
 }
 
 void BluetoothTestAndroid::OnFakeBluetoothGattSetCharacteristicNotification(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+    JNIEnv* env) {
   gatt_notify_characteristic_attempts_++;
 }
 
-void BluetoothTestAndroid::OnFakeBluetoothGattReadCharacteristic(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void BluetoothTestAndroid::OnFakeBluetoothGattReadCharacteristic(JNIEnv* env) {
   gatt_read_characteristic_attempts_++;
 }
 
 void BluetoothTestAndroid::OnFakeBluetoothGattWriteCharacteristic(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jbyteArray>& value) {
   gatt_write_characteristic_attempts_++;
   base::android::JavaByteArrayToByteVector(env, value, &last_write_value_);
 }
 
-void BluetoothTestAndroid::OnFakeBluetoothGattReadDescriptor(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void BluetoothTestAndroid::OnFakeBluetoothGattReadDescriptor(JNIEnv* env) {
   gatt_read_descriptor_attempts_++;
 }
 
 void BluetoothTestAndroid::OnFakeBluetoothGattWriteDescriptor(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jbyteArray>& value) {
   gatt_write_descriptor_attempts_++;
   base::android::JavaByteArrayToByteVector(env, value, &last_write_value_);
@@ -544,12 +528,12 @@
 
 void BluetoothTestAndroid::OnFakeAdapterStateChanged(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const bool powered) {
   // Delegate to the real implementation if the adapter is still alive.
   if (adapter_) {
     static_cast<BluetoothAdapterAndroid*>(adapter_.get())
-        ->OnAdapterStateChanged(env, caller, powered);
+        ->OnAdapterStateChanged(
+            env, base::android::JavaParamRef<jobject>(nullptr), powered);
   }
 }
 
diff --git a/device/bluetooth/test/bluetooth_test_android.h b/device/bluetooth/test/bluetooth_test_android.h
index 4268f27..3791ec60 100644
--- a/device/bluetooth/test/bluetooth_test_android.h
+++ b/device/bluetooth/test/bluetooth_test_android.h
@@ -108,62 +108,42 @@
   void ForceIllegalStateException();
 
   // Records that Java FakeBluetoothDevice connectGatt was called.
-  void OnFakeBluetoothDeviceConnectGattCalled(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothDeviceConnectGattCalled(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt disconnect was called.
-  void OnFakeBluetoothGattDisconnect(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothGattDisconnect(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt close was called.
-  void OnFakeBluetoothGattClose(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothGattClose(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt discoverServices was called.
-  void OnFakeBluetoothGattDiscoverServices(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothGattDiscoverServices(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt setCharacteristicNotification was
   // called.
-  void OnFakeBluetoothGattSetCharacteristicNotification(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothGattSetCharacteristicNotification(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt readCharacteristic was called.
-  void OnFakeBluetoothGattReadCharacteristic(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothGattReadCharacteristic(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt writeCharacteristic was called.
   void OnFakeBluetoothGattWriteCharacteristic(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
       const base::android::JavaParamRef<jbyteArray>& value);
 
   // Records that Java FakeBluetoothGatt readDescriptor was called.
-  void OnFakeBluetoothGattReadDescriptor(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnFakeBluetoothGattReadDescriptor(JNIEnv* env);
 
   // Records that Java FakeBluetoothGatt writeDescriptor was called.
   void OnFakeBluetoothGattWriteDescriptor(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
       const base::android::JavaParamRef<jbyteArray>& value);
 
   // Records that Java FakeBluetoothAdapter onAdapterStateChanged was called.
-  void OnFakeAdapterStateChanged(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
-      const bool powered);
+  void OnFakeAdapterStateChanged(JNIEnv* env, const bool powered);
 
   // Posts a task to be run on the current message loop.
   void PostTaskFromJava(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& caller,
                         const base::android::JavaParamRef<jobject>& runnable);
 
   base::android::ScopedJavaGlobalRef<jobject> j_fake_bluetooth_adapter_;
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 23ff1550..5fb210c3 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -2121,6 +2121,9 @@
 
       // Added 2019-07.
       "has_set_script_all_urls",
+
+      // Added 2019-07.
+      "browser_action_visible",
   };
 
   for (const auto& key_value : extensions_dictionary->DictItems()) {
diff --git a/google_apis/drive/OWNERS b/google_apis/drive/OWNERS
index c9f39ec..7ed32b30f 100644
--- a/google_apis/drive/OWNERS
+++ b/google_apis/drive/OWNERS
@@ -1 +1,2 @@
 file://components/drive/OWNERS
+# COMPONENT: Platform>Apps>FileManager
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller.mm b/ios/chrome/browser/autofill/form_suggestion_controller.mm
index 2d5b2b90..58f9371 100644
--- a/ios/chrome/browser/autofill/form_suggestion_controller.mm
+++ b/ios/chrome/browser/autofill/form_suggestion_controller.mm
@@ -23,7 +23,7 @@
 #import "ios/web/common/url_scheme_util.h"
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
 #import "ios/web/public/js_messaging/web_frames_manager.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
index 31ab038..7a206ea 100644
--- a/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
+++ b/ios/chrome/browser/autofill/form_suggestion_controller_unittest.mm
@@ -23,7 +23,7 @@
 #include "ios/web/public/test/fakes/fake_web_frame.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "ios/web/public/test/test_web_thread_bundle.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "testing/gtest_mac.h"
 #import "testing/platform_test.h"
diff --git a/ios/chrome/browser/autofill/form_suggestion_label.mm b/ios/chrome/browser/autofill/form_suggestion_label.mm
index 658473b6..3cf68a8 100644
--- a/ios/chrome/browser/autofill/form_suggestion_label.mm
+++ b/ios/chrome/browser/autofill/form_suggestion_label.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/browser/autofill/form_suggestion_client.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
+#import "ios/chrome/common/colors/UIColor+cr_semantic_colors.h"
 #include "ios/chrome/common/ui_util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -36,20 +37,11 @@
 const CGFloat kIpadFontSize = 15.0f;
 const CGFloat kIphoneFontSize = 14.0f;
 
-// The alpha values of the suggestion's main and description labels.
-const CGFloat kMainLabelAlpha = 0.87f;
-const CGFloat kDescriptionLabelAlpha = 0.55f;
-
 // The horizontal space between the edge of the background and the text.
 const CGFloat kBorderWidth = 14.0f;
 // The space between items in the label.
 const CGFloat kSpacing = 4.0f;
 
-// RGB button color when the button is not pressed.
-const int kBackgroundNormalColor = 0xeceff1;
-// RGB button color when the button is pressed.
-const int kBackgroundPressedColor = 0xc4cbcf;
-
 // Structure that record the image for each icon.
 struct IconImageMap {
   const char* const icon_name;
@@ -58,14 +50,14 @@
 
 // Creates a label with the given |text| and |alpha| suitable for use in a
 // suggestion button in the keyboard accessory view.
-UILabel* TextLabel(NSString* text, CGFloat alpha, BOOL bold) {
+UILabel* TextLabel(NSString* text, UIColor* textColor, BOOL bold) {
   UILabel* label = [[UILabel alloc] init];
   [label setText:text];
   CGFloat fontSize = IsIPadIdiom() ? kIpadFontSize : kIphoneFontSize;
   UIFont* font = bold ? [UIFont boldSystemFontOfSize:fontSize]
                       : [UIFont systemFontOfSize:fontSize];
   [label setFont:font];
-  [label setTextColor:[UIColor colorWithWhite:0.0f alpha:alpha]];
+  label.textColor = textColor;
   [label setBackgroundColor:[UIColor clearColor]];
   return label;
 }
@@ -110,17 +102,17 @@
       [stackView addArrangedSubview:iconView];
     }
 
-    UILabel* label = TextLabel(suggestion.value, kMainLabelAlpha, YES);
+    UILabel* label = TextLabel(suggestion.value, UIColor.cr_labelColor, YES);
     [stackView addArrangedSubview:label];
 
     if ([suggestion.displayDescription length] > 0) {
-      UILabel* description =
-          TextLabel(suggestion.displayDescription, kDescriptionLabelAlpha, NO);
+      UILabel* description = TextLabel(suggestion.displayDescription,
+                                       UIColor.cr_secondaryLabelColor, NO);
       [stackView addArrangedSubview:description];
     }
 
     if (userInteractionEnabled_) {
-      [self setBackgroundColor:UIColorFromRGB(kBackgroundNormalColor)];
+      [self setBackgroundColor:UIColor.cr_secondarySystemBackgroundColor];
     }
 
     [self setClipsToBounds:YES];
@@ -150,19 +142,19 @@
 
 - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
   if (userInteractionEnabled_) {
-    [self setBackgroundColor:UIColorFromRGB(kBackgroundPressedColor)];
+    [self setBackgroundColor:UIColor.cr_systemGray3Color];
   }
 }
 
 - (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event {
   if (userInteractionEnabled_) {
-    [self setBackgroundColor:UIColorFromRGB(kBackgroundNormalColor)];
+    [self setBackgroundColor:UIColor.cr_secondarySystemBackgroundColor];
   }
 }
 
 - (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
   if (userInteractionEnabled_) {
-    [self setBackgroundColor:UIColorFromRGB(kBackgroundNormalColor)];
+    [self setBackgroundColor:UIColor.cr_secondarySystemBackgroundColor];
     [client_ didSelectSuggestion:suggestion_];
   }
 }
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index 2fa411af..db58b7e 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -24,7 +24,7 @@
 #import "ios/testing/earl_grey/disabled_test_macros.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
diff --git a/ios/chrome/browser/find_in_page/find_in_page_controller.mm b/ios/chrome/browser/find_in_page/find_in_page_controller.mm
index 4094bd7..e82da08 100644
--- a/ios/chrome/browser/find_in_page/find_in_page_controller.mm
+++ b/ios/chrome/browser/find_in_page/find_in_page_controller.mm
@@ -20,8 +20,8 @@
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
 #import "ios/web/public/find_in_page/find_in_page_manager.h"
 #import "ios/web/public/find_in_page/find_in_page_manager_delegate_bridge.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_observer_bridge.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
diff --git a/ios/chrome/browser/find_in_page/find_in_page_js_unittest.mm b/ios/chrome/browser/find_in_page/find_in_page_js_unittest.mm
index e849147e..fa98af3 100644
--- a/ios/chrome/browser/find_in_page/find_in_page_js_unittest.mm
+++ b/ios/chrome/browser/find_in_page/find_in_page_js_unittest.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/find_in_page/js_findinpage_manager.h"
 #import "ios/chrome/browser/web/chrome_web_test.h"
 #import "ios/web/public/deprecated/crw_js_injection_receiver.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/gtest_mac.h"
diff --git a/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn b/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn
index a809bdad..389d71c 100644
--- a/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn
+++ b/ios/chrome/browser/overlays/public/web_content_area/BUILD.gn
@@ -22,7 +22,6 @@
     "//base",
     "//ios/chrome/browser/overlays",
     "//ios/web/public",
-    "//ios/web/public:web_state_types",
     "//url",
   ]
 }
diff --git a/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm b/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm
index 4183eeca..c4b5178 100644
--- a/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm
+++ b/ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper_unittest.mm
@@ -13,8 +13,8 @@
 #import "ios/chrome/test/fakes/fake_overscroll_actions_controller_delegate.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "ios/web/public/test/test_web_thread_bundle.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #import "testing/gtest_mac.h"
 #include "testing/platform_test.h"
diff --git a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
index 3c9d1cad..c0052f2c 100644
--- a/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/chrome_signin_view_controller.mm
@@ -1028,7 +1028,19 @@
       [self updateGradientColors];
       // As of iOS 13 Beta 3, MDCFlatButton doesn't update it's colors
       // automatically. These lines do it instead.
-      [self updatePrimaryButtonForIdentityPickerState];
+      switch (_currentState) {
+        case IDENTITY_PICKER_STATE:
+          [self updatePrimaryButtonForIdentityPickerState];
+          break;
+        case IDENTITY_SELECTED_STATE:
+          [self updatePrimaryButtonForIdentitySelectedState];
+          break;
+        case NULL_STATE:
+        case SIGNIN_PENDING_STATE:
+        case DONE_STATE:
+          // Transitional states. No need to updated the primary button.
+          break;
+      }
       [self setSecondaryButtonStyling:_secondaryButton];
     }
   }
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index ee44ebdb..36094dd 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -190,9 +190,9 @@
 #import "ios/web/public/deprecated/crw_web_controller_util.h"
 #include "ios/web/public/navigation/navigation_item.h"
 #include "ios/web/public/thread/web_thread.h"
+#import "ios/web/public/ui/context_menu_params.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #include "ios/web/public/web_client.h"
-#import "ios/web/public/web_state/context_menu_params.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state/web_state_delegate_bridge.h"
 #include "ios/web/public/web_state/web_state_observer_bridge.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
diff --git a/ios/chrome/browser/ui/bubble/bubble_presenter.mm b/ios/chrome/browser/ui/bubble/bubble_presenter.mm
index 6fa42b48..868a5776 100644
--- a/ios/chrome/browser/ui/bubble/bubble_presenter.mm
+++ b/ios/chrome/browser/ui/bubble/bubble_presenter.mm
@@ -24,8 +24,8 @@
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "ui/base/l10n/l10n_util.h"
 
diff --git a/ios/chrome/browser/ui/dialogs/java_script_dialog_presenter_impl.h b/ios/chrome/browser/ui/dialogs/java_script_dialog_presenter_impl.h
index cdb134c..a73d46f 100644
--- a/ios/chrome/browser/ui/dialogs/java_script_dialog_presenter_impl.h
+++ b/ios/chrome/browser/ui/dialogs/java_script_dialog_presenter_impl.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_DIALOGS_JAVA_SCRIPT_DIALOG_PRESENTER_IMPL_H_
 #define IOS_CHROME_BROWSER_UI_DIALOGS_JAVA_SCRIPT_DIALOG_PRESENTER_IMPL_H_
 
-#include "ios/web/public/java_script_dialog_presenter.h"
+#include "ios/web/public/ui/java_script_dialog_presenter.h"
 
 @class AlertCoordinator;
 @class DialogPresenter;
diff --git a/ios/chrome/browser/ui/dialogs/overlay_java_script_dialog_presenter.h b/ios/chrome/browser/ui/dialogs/overlay_java_script_dialog_presenter.h
index dd8dbd7..7ea8ab4 100644
--- a/ios/chrome/browser/ui/dialogs/overlay_java_script_dialog_presenter.h
+++ b/ios/chrome/browser/ui/dialogs/overlay_java_script_dialog_presenter.h
@@ -7,7 +7,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "ios/chrome/browser/overlays/public/web_content_area/java_script_dialog_source.h"
-#include "ios/web/public/java_script_dialog_presenter.h"
+#include "ios/web/public/ui/java_script_dialog_presenter.h"
 
 class OverlayResponse;
 
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_content_adjustment_util.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_content_adjustment_util.mm
index 43424fd..aee8258 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_content_adjustment_util.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_content_adjustment_util.mm
@@ -7,8 +7,8 @@
 #include "base/logging.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
 #import "ios/web/common/features.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer_unittest.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer_unittest.mm
index 8f97dc03..e8e6184 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer_unittest.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_list_observer_unittest.mm
@@ -18,8 +18,8 @@
 #import "ios/web/public/test/fakes/fake_navigation_context.h"
 #import "ios/web/public/test/fakes/test_navigation_manager.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #include "testing/platform_test.h"
 #import "third_party/ocmock/OCMock/OCMock.h"
 
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm
index a2b340a..f50e928 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_state_observer.mm
@@ -20,8 +20,8 @@
 #import "ios/web/public/navigation/navigation_item.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/security/ssl_status.h"
-#import "ios/web/public/web_state/page_display_state.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/page_display_state.h"
 #import "ios/web/public/web_state/web_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_proxy_observer.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_proxy_observer.mm
index 8633901..6baf80d4 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_proxy_observer.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_proxy_observer.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_mediator.h"
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_resizer.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_resizer.mm
index 9f22e7e4..9e5204df 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_resizer.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_web_view_resizer.mm
@@ -9,8 +9,8 @@
 #import "ios/chrome/browser/ui/fullscreen/fullscreen_model.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/web/common/features.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.mm b/ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.mm
index eb83d05..142fd9a 100644
--- a/ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.mm
+++ b/ios/chrome/browser/ui/main_content/web_scroll_view_main_content_ui_forwarder.mm
@@ -11,8 +11,8 @@
 #import "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/chrome/browser/web_state_list/web_state_list_observer_bridge.h"
 #import "ios/web/public/navigation/navigation_context.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_observer_bridge.h"
 
diff --git a/ios/chrome/browser/ui/open_in/open_in_controller.mm b/ios/chrome/browser/ui/open_in/open_in_controller.mm
index f0a66a9..3854100 100644
--- a/ios/chrome/browser/ui/open_in/open_in_controller.mm
+++ b/ios/chrome/browser/ui/open_in/open_in_controller.mm
@@ -22,8 +22,8 @@
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/web/public/thread/web_thread.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "net/base/load_flags.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
diff --git a/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm b/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm
index 1ed53fda..d03215dc 100644
--- a/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/open_in/open_in_mediator_unittest.mm
@@ -10,8 +10,8 @@
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
 #include "ios/web/public/test/test_web_thread_bundle.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #include "testing/gtest_mac.h"
 #include "testing/platform_test.h"
 #import "third_party/ocmock/OCMock/OCMock.h"
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h
index 6c39b84..aa82191 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h
@@ -9,7 +9,7 @@
 
 #import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_view.h"
 #import "ios/chrome/browser/ui/util/relaxed_bounds_constraints_hittest.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 
 @protocol CRWWebViewProxy;
 namespace ios {
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
index c96176b8..79a70ba 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -26,7 +26,7 @@
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
 #import "ios/public/provider/chrome/browser/ui/fullscreen_provider.h"
 #include "ios/web/common/features.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/ui/payments/payment_request_manager.mm b/ios/chrome/browser/ui/payments/payment_request_manager.mm
index d122353e..1398d1a 100644
--- a/ios/chrome/browser/ui/payments/payment_request_manager.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_manager.mm
@@ -67,7 +67,7 @@
 #include "ios/web/public/navigation/navigation_item.h"
 #include "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/security/ssl_status.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_observer_bridge.h"
 #include "third_party/libaddressinput/chromium/chrome_metadata_source.h"
diff --git a/ios/chrome/browser/ui/webui/password_manager_internals_ui_ios.mm b/ios/chrome/browser/ui/webui/password_manager_internals_ui_ios.mm
index 3e0fc9d..24311e4 100644
--- a/ios/chrome/browser/ui/webui/password_manager_internals_ui_ios.mm
+++ b/ios/chrome/browser/ui/webui/password_manager_internals_ui_ios.mm
@@ -7,12 +7,17 @@
 #include "base/hash/hash.h"
 #include "components/autofill/core/browser/logging/log_router.h"
 #include "components/grit/components_resources.h"
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/chrome_url_constants.h"
-#include "ios/chrome/browser/passwords/password_manager_log_router_factory.h"
+#include "components/version_info/version_info.h"
+#include "components/version_ui/version_handler_helper.h"
+#include "components/version_ui/version_ui_constants.h"
+#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/chrome_url_constants.h"
+#import "ios/chrome/browser/passwords/password_manager_log_router_factory.h"
+#import "ios/chrome/common/channel_info.h"
+#import "ios/web/public/web_client.h"
 #import "ios/web/public/web_state/web_state.h"
-#include "ios/web/public/webui/web_ui_ios.h"
-#include "ios/web/public/webui/web_ui_ios_data_source.h"
+#import "ios/web/public/webui/web_ui_ios.h"
+#import "ios/web/public/webui/web_ui_ios_data_source.h"
 #include "net/base/escape.h"
 
 using autofill::LogRouter;
@@ -28,6 +33,16 @@
   source->AddResourcePath("autofill_and_password_manager_internals.css",
                           IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_CSS);
   source->SetDefaultResource(IDR_AUTOFILL_AND_PASSWORD_MANAGER_INTERNALS_HTML);
+  // Data strings:
+  source->AddString(version_ui::kVersion, version_info::GetVersionNumber());
+  source->AddString(version_ui::kOfficial, version_info::IsOfficialBuild()
+                                               ? "official"
+                                               : "Developer build");
+  source->AddString(version_ui::kVersionModifier,
+                    GetChannelString(GetChannel()));
+  source->AddString(version_ui::kCL, version_info::GetLastChange());
+  source->AddString(version_ui::kUserAgent, web::GetWebClient()->GetUserAgent(
+                                                web::UserAgentType::MOBILE));
   return source;
 }
 
diff --git a/ios/chrome/browser/web/page_placeholder_tab_helper.mm b/ios/chrome/browser/web/page_placeholder_tab_helper.mm
index 2a74cc0..2ed1f557 100644
--- a/ios/chrome/browser/web/page_placeholder_tab_helper.mm
+++ b/ios/chrome/browser/web/page_placeholder_tab_helper.mm
@@ -10,7 +10,7 @@
 #import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
 #import "ios/chrome/browser/ui/util/named_guide.h"
 #import "ios/chrome/common/ui_util/constraints_ui_util.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/chrome/browser/web/web_state_delegate_tab_helper_unittest.mm b/ios/chrome/browser/web/web_state_delegate_tab_helper_unittest.mm
index d96710a..5c85ec0a 100644
--- a/ios/chrome/browser/web/web_state_delegate_tab_helper_unittest.mm
+++ b/ios/chrome/browser/web/web_state_delegate_tab_helper_unittest.mm
@@ -8,9 +8,9 @@
 #import "ios/chrome/browser/overlays/public/overlay_request_queue.h"
 #import "ios/chrome/browser/overlays/public/web_content_area/http_auth_overlay.h"
 #import "ios/chrome/browser/overlays/public/web_content_area/java_script_alert_overlay.h"
-#include "ios/web/public/java_script_dialog_presenter.h"
-#include "ios/web/public/java_script_dialog_type.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
+#include "ios/web/public/ui/java_script_dialog_presenter.h"
+#include "ios/web/public/ui/java_script_dialog_type.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #import "testing/gtest_mac.h"
 #include "testing/platform_test.h"
diff --git a/ios/chrome/test/wpt/cwt_webdriver_app_interface.mm b/ios/chrome/test/wpt/cwt_webdriver_app_interface.mm
index f13a567..06f0d91 100644
--- a/ios/chrome/test/wpt/cwt_webdriver_app_interface.mm
+++ b/ios/chrome/test/wpt/cwt_webdriver_app_interface.mm
@@ -20,7 +20,7 @@
 #import "ios/testing/earl_grey/earl_grey_app.h"
 #import "ios/testing/nserror_util.h"
 #import "ios/web/public/test/navigation_test_util.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/image/image.h"
 
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index 2bb140d..1080e55 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -54,6 +54,7 @@
     "//ios/web/service",
     "//ios/web/session",
     "//ios/web/thread",
+    "//ios/web/ui",
     "//ios/web/web_state",
     "//ios/web/web_state:web_view_internal_creation_util",
     "//services/network:network_service",
@@ -197,7 +198,6 @@
     ":ios_web_general_unittests",
     ":ios_web_navigation_unittests",
     ":ios_web_net_unittests",
-    ":ios_web_public_unittests",
     ":ios_web_web_state_js_unittests",
     ":ios_web_web_state_ui_unittests",
     ":ios_web_web_state_unittests",
@@ -360,39 +360,6 @@
   ]
 }
 
-source_set("ios_web_public_unittests") {
-  configs += [ "//build/config/compiler:enable_arc" ]
-  testonly = true
-  deps = [
-    ":core",
-    ":test_support",
-    ":web",
-    "//base",
-    "//base/test:test_support",
-    "//components/url_formatter",
-    "//ios/net",
-    "//ios/net:ios_net_unittests",
-    "//ios/testing:ocmock_support",
-    "//ios/web/public",
-    "//ios/web/public/test",
-    "//ios/web/public/test/fakes",
-    "//ios/web/test:mojo_bindings",
-    "//ios/web/test:test_constants",
-    "//ios/web/test:test_support",
-    "//ios/web/web_state:page_viewport_state",
-    "//net:test_support",
-    "//services/service_manager/public/cpp",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//third_party/ocmock",
-    "//ui/base:test_support",
-  ]
-
-  sources = [
-    "public/web_state/page_viewport_state_unittest.mm",
-  ]
-}
-
 source_set("ios_web_web_state_unittests") {
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
@@ -428,6 +395,7 @@
     "//ios/web/test/fakes",
     "//ios/web/web_state",
     "//ios/web/web_state:context_menu",
+    "//ios/web/web_state:page_viewport_state",
     "//ios/web/web_state:web_view_internal_creation_util",
     "//net:test_support",
     "//services/service_manager/public/cpp",
@@ -441,6 +409,7 @@
   sources = [
     "web_state/context_menu_params_utils_unittest.mm",
     "web_state/page_display_state_unittest.mm",
+    "web_state/page_viewport_state_unittest.mm",
     "web_state/web_state_delegate_bridge_unittest.mm",
     "web_state/web_state_impl_unittest.mm",
     "web_state/web_state_observer_bridge_unittest.mm",
diff --git a/ios/web/favicon/BUILD.gn b/ios/web/favicon/BUILD.gn
index d8a81cb..b6f26ebd 100644
--- a/ios/web/favicon/BUILD.gn
+++ b/ios/web/favicon/BUILD.gn
@@ -41,7 +41,7 @@
     "//base",
     "//base/test:test_support",
     "//ios/web/public",
-    "//ios/web/public:web_state_types",
+    "//ios/web/public:web_state_observer",
     "//ios/web/public/test",
   ]
   sources = [
diff --git a/ios/web/navigation/BUILD.gn b/ios/web/navigation/BUILD.gn
index ecdcc11..ff4d067 100644
--- a/ios/web/navigation/BUILD.gn
+++ b/ios/web/navigation/BUILD.gn
@@ -70,6 +70,7 @@
     "session_storage_builder.mm",
     "time_smoother.cc",
     "time_smoother.h",
+    "url_schemes.mm",
     "web_kit_constants.cc",
     "web_kit_constants.h",
     "wk_back_forward_list_item_holder.h",
diff --git a/ios/web/public/url_schemes.mm b/ios/web/navigation/url_schemes.mm
similarity index 100%
rename from ios/web/public/url_schemes.mm
rename to ios/web/navigation/url_schemes.mm
diff --git a/ios/web/public/BUILD.gn b/ios/web/public/BUILD.gn
index 8d83247f..ea5f891 100644
--- a/ios/web/public/BUILD.gn
+++ b/ios/web/public/BUILD.gn
@@ -6,8 +6,7 @@
 
 source_set("public") {
   public_deps = [
-    ":ui",
-    ":web_state_types",
+    ":web_state_observer",
     "//ios/web/public/favicon",
     "//ios/web/public/navigation",
     "//ios/web/public/service",
@@ -27,14 +26,7 @@
 
   sources = [
     "browser_state.h",
-    "java_script_dialog_callback.h",
-    "java_script_dialog_presenter.h",
-    "java_script_dialog_type.h",
-    "url_schemes.mm",
     "web_client.h",
-    "web_state/page_display_state.mm",
-    "web_state/ui/crw_web_view_proxy.h",
-    "web_state/ui/crw_web_view_scroll_view_proxy.h",
     "web_state/web_state.h",
     "web_state/web_state_delegate.h",
     "web_state/web_state_delegate_bridge.h",
@@ -49,24 +41,15 @@
 
 # Un-separate this once the things in public/deprecated that need it are
 # deprecated.
-source_set("web_state_types") {
+source_set("web_state_observer") {
   deps = [
     "//base",
     "//ios/web/public/navigation",
     "//url",
   ]
   sources = [
-    "web_state/context_menu_params.h",
     "web_state/web_state_observer.h",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
 }
-
-source_set("ui") {
-  sources = [
-    "web_state/page_display_state.h",
-  ]
-
-  configs += [ "//build/config/compiler:enable_arc" ]
-}
diff --git a/ios/web/public/deprecated/BUILD.gn b/ios/web/public/deprecated/BUILD.gn
index 92c1e362..aef0d4cc 100644
--- a/ios/web/public/deprecated/BUILD.gn
+++ b/ios/web/public/deprecated/BUILD.gn
@@ -9,7 +9,7 @@
 
   deps = [
     "//base",
-    "//ios/web/public:web_state_types",
+    "//ios/web/public:web_state_observer",
     "//url",
   ]
   sources = [
diff --git a/ios/web/public/deprecated/crw_context_menu_delegate.h b/ios/web/public/deprecated/crw_context_menu_delegate.h
index 27c599a..404b0c6 100644
--- a/ios/web/public/deprecated/crw_context_menu_delegate.h
+++ b/ios/web/public/deprecated/crw_context_menu_delegate.h
@@ -7,7 +7,7 @@
 
 #import <WebKit/WebKit.h>
 
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 
 // Implement this protocol to listen to the custom context menu trigger from
 // WKWebView.
diff --git a/ios/web/public/navigation/BUILD.gn b/ios/web/public/navigation/BUILD.gn
index ccdc0a0e..65d8690 100644
--- a/ios/web/public/navigation/BUILD.gn
+++ b/ios/web/public/navigation/BUILD.gn
@@ -5,7 +5,6 @@
 source_set("navigation") {
   deps = [
     "//ios/web/common:user_agent",
-    "//ios/web/public:ui",
     "//ios/web/public/deprecated:deprecated_navigation_util",
     "//ui/base",
     "//url",
diff --git a/ios/web/public/navigation/navigation_item.h b/ios/web/public/navigation/navigation_item.h
index c9a9be8..000457d9 100644
--- a/ios/web/public/navigation/navigation_item.h
+++ b/ios/web/public/navigation/navigation_item.h
@@ -11,7 +11,7 @@
 #include "base/supports_user_data.h"
 #include "base/time/time.h"
 #import "ios/web/common/user_agent.h"
-#import "ios/web/public/web_state/page_display_state.h"
+#import "ios/web/public/ui/page_display_state.h"
 #include "ui/base/page_transition_types.h"
 
 class GURL;
diff --git a/ios/web/public/session/crw_navigation_item_storage.h b/ios/web/public/session/crw_navigation_item_storage.h
index 9021913a..c46cb7f 100644
--- a/ios/web/public/session/crw_navigation_item_storage.h
+++ b/ios/web/public/session/crw_navigation_item_storage.h
@@ -12,7 +12,7 @@
 #include "base/time/time.h"
 #include "ios/web/common/user_agent.h"
 #include "ios/web/public/navigation/referrer.h"
-#import "ios/web/public/web_state/page_display_state.h"
+#import "ios/web/public/ui/page_display_state.h"
 #include "url/gurl.h"
 
 namespace web {
diff --git a/ios/web/public/test/crw_mock_web_state_delegate.mm b/ios/web/public/test/crw_mock_web_state_delegate.mm
index 2a8009d..54b80b1d5 100644
--- a/ios/web/public/test/crw_mock_web_state_delegate.mm
+++ b/ios/web/public/test/crw_mock_web_state_delegate.mm
@@ -4,7 +4,7 @@
 
 #import "ios/web/public/test/crw_mock_web_state_delegate.h"
 
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #import "ios/web/public/web_state/web_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/web/public/test/fakes/test_java_script_dialog_presenter.h b/ios/web/public/test/fakes/test_java_script_dialog_presenter.h
index f5db3b3..5793a8b9 100644
--- a/ios/web/public/test/fakes/test_java_script_dialog_presenter.h
+++ b/ios/web/public/test/fakes/test_java_script_dialog_presenter.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <vector>
 
-#import "ios/web/public/java_script_dialog_presenter.h"
+#import "ios/web/public/ui/java_script_dialog_presenter.h"
 
 namespace web {
 
diff --git a/ios/web/public/test/web_view_interaction_test_util.mm b/ios/web/public/test/web_view_interaction_test_util.mm
index f68af9e2..5c75b91 100644
--- a/ios/web/public/test/web_view_interaction_test_util.mm
+++ b/ios/web/public/test/web_view_interaction_test_util.mm
@@ -11,7 +11,7 @@
 #include "base/strings/utf_string_conversions.h"
 #import "base/test/ios/wait_util.h"
 #import "ios/web/js_messaging/crw_js_injector.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/ui/crw_web_view_proxy_impl.h"
 #import "ios/web/web_state/web_state_impl.h"
diff --git a/ios/web/public/ui/BUILD.gn b/ios/web/public/ui/BUILD.gn
new file mode 100644
index 0000000..80726e4e
--- /dev/null
+++ b/ios/web/public/ui/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2019 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.
+
+source_set("ui") {
+  deps = [
+    "//base",
+    "//ios/web/public:web_state_observer",
+  ]
+
+  sources = [
+    "context_menu_params.h",
+    "crw_web_view_proxy.h",
+    "crw_web_view_scroll_view_proxy.h",
+    "java_script_dialog_callback.h",
+    "java_script_dialog_presenter.h",
+    "java_script_dialog_type.h",
+    "page_display_state.h",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
diff --git a/ios/web/public/ui/README.md b/ios/web/public/ui/README.md
new file mode 100644
index 0000000..18aea88
--- /dev/null
+++ b/ios/web/public/ui/README.md
@@ -0,0 +1 @@
+This directory contains callbacks to present UI and inspect UI-related properties.
diff --git a/ios/web/public/web_state/context_menu_params.h b/ios/web/public/ui/context_menu_params.h
similarity index 87%
rename from ios/web/public/web_state/context_menu_params.h
rename to ios/web/public/ui/context_menu_params.h
index 48c40ef..9533e71 100644
--- a/ios/web/public/web_state/context_menu_params.h
+++ b/ios/web/public/ui/context_menu_params.h
@@ -1,8 +1,8 @@
 // Copyright 2016 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 IOS_WEB_PUBLIC_WEB_STATE_CONTEXT_MENU_PARAMS_H_
-#define IOS_WEB_PUBLIC_WEB_STATE_CONTEXT_MENU_PARAMS_H_
+#ifndef IOS_WEB_PUBLIC_UI_CONTEXT_MENU_PARAMS_H_
+#define IOS_WEB_PUBLIC_UI_CONTEXT_MENU_PARAMS_H_
 
 #import <UIKit/UIKit.h>
 
@@ -45,4 +45,4 @@
 
 }  // namespace web
 
-#endif  // IOS_WEB_PUBLIC_WEB_STATE_CONTEXT_MENU_PARAMS_H_
+#endif  // IOS_WEB_PUBLIC_UI_CONTEXT_MENU_PARAMS_H_
diff --git a/ios/web/public/web_state/ui/crw_web_view_proxy.h b/ios/web/public/ui/crw_web_view_proxy.h
similarity index 92%
rename from ios/web/public/web_state/ui/crw_web_view_proxy.h
rename to ios/web/public/ui/crw_web_view_proxy.h
index 3b6f02d..f3ecaa1 100644
--- a/ios/web/public/web_state/ui/crw_web_view_proxy.h
+++ b/ios/web/public/ui/crw_web_view_proxy.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_WEB_STATE_UI_CRW_WEB_VIEW_PROXY_H_
-#define IOS_WEB_PUBLIC_WEB_STATE_UI_CRW_WEB_VIEW_PROXY_H_
+#ifndef IOS_WEB_PUBLIC_UI_CRW_WEB_VIEW_PROXY_H_
+#define IOS_WEB_PUBLIC_UI_CRW_WEB_VIEW_PROXY_H_
 
 #import <UIKit/UIKit.h>
 
@@ -12,7 +12,7 @@
 // Provides an interface for embedders to access the WebState's web view in a
 // limited and controlled manner.
 // TODO(crbug.com/546152): rename protocol to CRWContentViewProxy.
-@protocol CRWWebViewProxy<NSObject>
+@protocol CRWWebViewProxy <NSObject>
 
 // The web view's bounding rectangle (relative to its parent).
 @property(readonly, assign) CGRect bounds;
@@ -75,4 +75,4 @@
 
 @end
 
-#endif  // IOS_WEB_PUBLIC_WEB_STATE_UI_CRW_WEB_VIEW_PROXY_H_
+#endif  // IOS_WEB_PUBLIC_UI_CRW_WEB_VIEW_PROXY_H_
diff --git a/ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h b/ios/web/public/ui/crw_web_view_scroll_view_proxy.h
similarity index 92%
rename from ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h
rename to ios/web/public/ui/crw_web_view_scroll_view_proxy.h
index e160917..4d6dadca 100644
--- a/ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h
+++ b/ios/web/public/ui/crw_web_view_scroll_view_proxy.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_WEB_STATE_UI_CRW_WEB_VIEW_SCROLL_VIEW_PROXY_H_
-#define IOS_WEB_PUBLIC_WEB_STATE_UI_CRW_WEB_VIEW_SCROLL_VIEW_PROXY_H_
+#ifndef IOS_WEB_PUBLIC_UI_CRW_WEB_VIEW_SCROLL_VIEW_PROXY_H_
+#define IOS_WEB_PUBLIC_UI_CRW_WEB_VIEW_SCROLL_VIEW_PROXY_H_
 
 #import <UIKit/UIKit.h>
 
@@ -21,7 +21,7 @@
 // The class forwards some of the methods onto the UIScrollView. For more
 // information look at the UIScrollView documentation.
 // TODO(crbug.com/546152): rename class to CRWContentViewScrollViewProxy.
-@interface CRWWebViewScrollViewProxy : NSObject<UIScrollViewDelegate>
+@interface CRWWebViewScrollViewProxy : NSObject <UIScrollViewDelegate>
 @property(nonatomic, assign) CGPoint contentOffset;
 @property(nonatomic, assign) UIEdgeInsets contentInset;
 @property(nonatomic, readonly, getter=isDecelerating) BOOL decelerating;
@@ -66,7 +66,7 @@
 // UIScrollView.
 // This is an exact mirror of the UIScrollViewDelegate callbacks. For more
 // information look at the UIScrollViewDelegate documentation.
-@protocol CRWWebViewScrollViewObserver<NSObject>
+@protocol CRWWebViewScrollViewObserver <NSObject>
 @optional
 - (void)webViewScrollViewFrameDidChange:
     (CRWWebViewScrollViewProxy*)webViewScrollViewProxy;
@@ -109,11 +109,11 @@
 // CRWWebViewScrollViewProxyObserver.
 // It inherit from CRWWebViewScrollViewScrollViewObserver which only implements
 // methods for listening to scrollview changes.
-@protocol CRWWebViewScrollViewProxyObserver<CRWWebViewScrollViewObserver>
+@protocol CRWWebViewScrollViewProxyObserver <CRWWebViewScrollViewObserver>
 @optional
 // Called when the underlying scrollview of the proxy is set.
 - (void)webViewScrollViewProxyDidSetScrollView:
     (CRWWebViewScrollViewProxy*)webViewScrollViewProxy;
 @end
 
-#endif  // IOS_WEB_PUBLIC_WEB_STATE_UI_CRW_WEB_VIEW_SCROLL_VIEW_PROXY_H_
+#endif  // IOS_WEB_PUBLIC_UI_CRW_WEB_VIEW_SCROLL_VIEW_PROXY_H_
diff --git a/ios/web/public/java_script_dialog_callback.h b/ios/web/public/ui/java_script_dialog_callback.h
similarity index 76%
rename from ios/web/public/java_script_dialog_callback.h
rename to ios/web/public/ui/java_script_dialog_callback.h
index 24f8228f1..3caf7d7 100644
--- a/ios/web/public/java_script_dialog_callback.h
+++ b/ios/web/public/ui/java_script_dialog_callback.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_CALLBACK_H_
-#define IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_CALLBACK_H_
+#ifndef IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_CALLBACK_H_
+#define IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_CALLBACK_H_
 
 #import <Foundation/Foundation.h>
 
@@ -19,4 +19,4 @@
 
 }  // namespace web
 
-#endif  // IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_CALLBACK_H_
+#endif  // IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_CALLBACK_H_
diff --git a/ios/web/public/java_script_dialog_presenter.h b/ios/web/public/ui/java_script_dialog_presenter.h
similarity index 78%
rename from ios/web/public/java_script_dialog_presenter.h
rename to ios/web/public/ui/java_script_dialog_presenter.h
index 23d8134..ba698736 100644
--- a/ios/web/public/java_script_dialog_presenter.h
+++ b/ios/web/public/ui/java_script_dialog_presenter.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_PRESENTER_H_
-#define IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_PRESENTER_H_
+#ifndef IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_PRESENTER_H_
+#define IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_PRESENTER_H_
 
-#import "ios/web/public/java_script_dialog_callback.h"
-#include "ios/web/public/java_script_dialog_type.h"
+#import "ios/web/public/ui/java_script_dialog_callback.h"
+#include "ios/web/public/ui/java_script_dialog_type.h"
 #include "url/gurl.h"
 
 @class NSString;
@@ -34,4 +34,4 @@
 
 }  // namespace web
 
-#endif  // IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_PRESENTER_H_
+#endif  // IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_PRESENTER_H_
diff --git a/ios/web/public/java_script_dialog_type.h b/ios/web/public/ui/java_script_dialog_type.h
similarity index 76%
rename from ios/web/public/java_script_dialog_type.h
rename to ios/web/public/ui/java_script_dialog_type.h
index 03a420d7..e98eee3 100644
--- a/ios/web/public/java_script_dialog_type.h
+++ b/ios/web/public/ui/java_script_dialog_type.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_TYPE_H_
-#define IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_TYPE_H_
+#ifndef IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_TYPE_H_
+#define IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_TYPE_H_
 
 namespace web {
 
@@ -19,4 +19,4 @@
 
 }  // namespace web
 
-#endif  // IOS_WEB_PUBLIC_JAVA_SCRIPT_DIALOG_TYPE_H_
+#endif  // IOS_WEB_PUBLIC_UI_JAVA_SCRIPT_DIALOG_TYPE_H_
diff --git a/ios/web/public/web_state/page_display_state.h b/ios/web/public/ui/page_display_state.h
similarity index 96%
rename from ios/web/public/web_state/page_display_state.h
rename to ios/web/public/ui/page_display_state.h
index 7c975c9c..3f6bb6e 100644
--- a/ios/web/public/web_state/page_display_state.h
+++ b/ios/web/public/ui/page_display_state.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_WEB_PUBLIC_WEB_STATE_PAGE_DISPLAY_STATE_H_
-#define IOS_WEB_PUBLIC_WEB_STATE_PAGE_DISPLAY_STATE_H_
+#ifndef IOS_WEB_PUBLIC_UI_PAGE_DISPLAY_STATE_H_
+#define IOS_WEB_PUBLIC_UI_PAGE_DISPLAY_STATE_H_
 
 #import <UIKit/UIKit.h>
 
@@ -148,4 +148,4 @@
 
 }  // namespace web
 
-#endif  // IOS_WEB_PUBLIC_WEB_STATE_PAGE_DISPLAY_STATE_H_
+#endif  // IOS_WEB_PUBLIC_UI_PAGE_DISPLAY_STATE_H_
diff --git a/ios/web/shell/view_controller.mm b/ios/web/shell/view_controller.mm
index 58828f1..b12d56a 100644
--- a/ios/web/shell/view_controller.mm
+++ b/ios/web/shell/view_controller.mm
@@ -14,7 +14,7 @@
 #include "base/strings/sys_string_conversions.h"
 #import "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/navigation/referrer.h"
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_delegate_bridge.h"
 #import "ios/web/public/web_state/web_state_observer_bridge.h"
diff --git a/ios/web/ui/BUILD.gn b/ios/web/ui/BUILD.gn
new file mode 100644
index 0000000..46f85bb0
--- /dev/null
+++ b/ios/web/ui/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2019 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.
+
+source_set("ui") {
+  deps = [
+    "//base",
+  ]
+
+  sources = [
+    "page_display_state.mm",
+  ]
+
+  configs += [ "//build/config/compiler:enable_arc" ]
+}
diff --git a/ios/web/public/web_state/page_display_state.mm b/ios/web/ui/page_display_state.mm
similarity index 96%
rename from ios/web/public/web_state/page_display_state.mm
rename to ios/web/ui/page_display_state.mm
index 772212d..10146af 100644
--- a/ios/web/public/web_state/page_display_state.mm
+++ b/ios/web/ui/page_display_state.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/web_state/page_display_state.h"
+#import "ios/web/public/ui/page_display_state.h"
 
 #include <cmath>
 
@@ -118,8 +118,7 @@
 }
 
 PageZoomState::PageZoomState()
-    : minimum_zoom_scale_(NAN), maximum_zoom_scale_(NAN), zoom_scale_(NAN) {
-}
+    : minimum_zoom_scale_(NAN), maximum_zoom_scale_(NAN), zoom_scale_(NAN) {}
 
 PageZoomState::PageZoomState(CGFloat minimum_zoom_scale,
                              CGFloat maximum_zoom_scale,
@@ -128,8 +127,7 @@
       maximum_zoom_scale_(maximum_zoom_scale),
       zoom_scale_(zoom_scale) {}
 
-PageZoomState::~PageZoomState() {
-}
+PageZoomState::~PageZoomState() {}
 
 bool PageZoomState::IsValid() const {
   return (!std::isnan(minimum_zoom_scale_) &&
@@ -148,13 +146,11 @@
   return !(*this == other);
 }
 
-PageDisplayState::PageDisplayState() {
-}
+PageDisplayState::PageDisplayState() {}
 
 PageDisplayState::PageDisplayState(const PageScrollState& scroll_state,
                                    const PageZoomState& zoom_state)
-    : scroll_state_(scroll_state), zoom_state_(zoom_state) {
-}
+    : scroll_state_(scroll_state), zoom_state_(zoom_state) {}
 
 PageDisplayState::PageDisplayState(const CGPoint& content_offset,
                                    const UIEdgeInsets& content_inset,
@@ -171,8 +167,7 @@
                        GetFloatValue(kMaxZoomKey, serialization),
                        GetFloatValue(kZoomKey, serialization)) {}
 
-PageDisplayState::~PageDisplayState() {
-}
+PageDisplayState::~PageDisplayState() {}
 
 bool PageDisplayState::IsValid() const {
   return scroll_state_.IsValid() && zoom_state_.IsValid();
diff --git a/ios/web/web_state/context_menu_params.mm b/ios/web/web_state/context_menu_params.mm
index d2c5f10..2d0300cf 100644
--- a/ios/web/web_state/context_menu_params.mm
+++ b/ios/web/web_state/context_menu_params.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/web/web_state/context_menu_params_utils.h b/ios/web/web_state/context_menu_params_utils.h
index 8b0bd9a..44008f4 100644
--- a/ios/web/web_state/context_menu_params_utils.h
+++ b/ios/web/web_state/context_menu_params_utils.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 
 namespace web {
 
diff --git a/ios/web/web_state/context_menu_params_utils_unittest.mm b/ios/web/web_state/context_menu_params_utils_unittest.mm
index 293cd232..8207e8da 100644
--- a/ios/web/web_state/context_menu_params_utils_unittest.mm
+++ b/ios/web/web_state/context_menu_params_utils_unittest.mm
@@ -7,7 +7,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "components/url_formatter/url_formatter.h"
 #include "ios/web/common/referrer_util.h"
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #import "ios/web/web_state/context_menu_constants.h"
 #import "net/base/mac/url_conversions.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ios/web/web_state/js/find_in_page_js_unittest.mm b/ios/web/web_state/js/find_in_page_js_unittest.mm
index 27f04f13..1fc7bae 100644
--- a/ios/web/web_state/js/find_in_page_js_unittest.mm
+++ b/ios/web/web_state/js/find_in_page_js_unittest.mm
@@ -12,8 +12,8 @@
 #import "ios/web/public/js_messaging/web_frame.h"
 #import "ios/web/public/js_messaging/web_frames_manager.h"
 #import "ios/web/public/test/web_test_with_web_state.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #include "testing/gtest_mac.h"
 
diff --git a/ios/web/web_state/page_display_state_unittest.mm b/ios/web/web_state/page_display_state_unittest.mm
index 07353e8..f50350f 100644
--- a/ios/web/web_state/page_display_state_unittest.mm
+++ b/ios/web/web_state/page_display_state_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/web_state/page_display_state.h"
+#import "ios/web/public/ui/page_display_state.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/ios/web/public/web_state/page_viewport_state_unittest.mm b/ios/web/web_state/page_viewport_state_unittest.mm
similarity index 100%
rename from ios/web/public/web_state/page_viewport_state_unittest.mm
rename to ios/web/web_state/page_viewport_state_unittest.mm
diff --git a/ios/web/web_state/ui/crw_context_menu_controller.mm b/ios/web/web_state/ui/crw_context_menu_controller.mm
index 370752d..a802303 100644
--- a/ios/web/web_state/ui/crw_context_menu_controller.mm
+++ b/ios/web/web_state/ui/crw_context_menu_controller.mm
@@ -16,7 +16,7 @@
 #import "ios/web/js_messaging/crw_wk_script_message_router.h"
 #import "ios/web/public/deprecated/crw_context_menu_delegate.h"
 #import "ios/web/public/navigation/navigation_context.h"
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_observer_bridge.h"
 #import "ios/web/web_state/context_menu_constants.h"
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index e0886c3f..fb73e9a3 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -38,9 +38,9 @@
 #import "ios/web/public/deprecated/crw_context_menu_delegate.h"
 #import "ios/web/public/deprecated/crw_native_content_provider.h"
 #include "ios/web/public/js_messaging/web_frame_util.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/page_display_state.h"
 #import "ios/web/public/web_client.h"
-#import "ios/web/public/web_state/page_display_state.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/security/crw_cert_verification_controller.h"
 #import "ios/web/security/crw_ssl_status_updater.h"
 #import "ios/web/web_state/page_viewport_state.h"
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl.h b/ios/web/web_state/ui/crw_web_view_proxy_impl.h
index fb4323a0..a1b06bdef 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl.h
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl.h
@@ -8,7 +8,7 @@
 #import <UIKit/UIKit.h>
 
 #import "ios/web/common/crw_content_view.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
 
 @class CRWWebController;
 
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
index 5e55401..00309dfb 100644
--- a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
+++ b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
@@ -5,7 +5,7 @@
 #import "ios/web/web_state/ui/crw_web_view_proxy_impl.h"
 
 #import "ios/web/common/crw_content_view.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/web_state/ui/crw_web_controller.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm
index 1771191..e1ec04f 100644
--- a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm
+++ b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 
 #import <objc/runtime.h>
 
diff --git a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
index 1aa4772..6772697c 100644
--- a/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
+++ b/ios/web/web_state/ui/crw_web_view_scroll_view_proxy_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 
 #import <UIKit/UIKit.h>
 
diff --git a/ios/web/web_state/ui/crw_wk_ui_handler.mm b/ios/web/web_state/ui/crw_wk_ui_handler.mm
index f17a364..89f657b1 100644
--- a/ios/web/web_state/ui/crw_wk_ui_handler.mm
+++ b/ios/web/web_state/ui/crw_wk_ui_handler.mm
@@ -7,8 +7,8 @@
 #include "base/strings/sys_string_conversions.h"
 #import "ios/web/navigation/wk_navigation_action_util.h"
 #import "ios/web/navigation/wk_navigation_util.h"
-#import "ios/web/public/java_script_dialog_type.h"
 #include "ios/web/public/service/web_state_interface_provider.h"
+#import "ios/web/public/ui/java_script_dialog_type.h"
 #import "ios/web/public/web_client.h"
 #import "ios/web/web_state/ui/crw_context_menu_controller.h"
 #import "ios/web/web_state/ui/crw_wk_ui_handler_delegate.h"
diff --git a/ios/web/web_state/web_state_delegate_bridge.mm b/ios/web/web_state/web_state_delegate_bridge.mm
index 90b44be..7ca8b1f 100644
--- a/ios/web/web_state/web_state_delegate_bridge.mm
+++ b/ios/web/web_state/web_state_delegate_bridge.mm
@@ -5,7 +5,7 @@
 #import "ios/web/public/web_state/web_state_delegate_bridge.h"
 
 #include "base/logging.h"
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
diff --git a/ios/web/web_state/web_state_delegate_bridge_unittest.mm b/ios/web/web_state/web_state_delegate_bridge_unittest.mm
index 89ca7246..1491eb0 100644
--- a/ios/web/web_state/web_state_delegate_bridge_unittest.mm
+++ b/ios/web/web_state/web_state_delegate_bridge_unittest.mm
@@ -12,7 +12,7 @@
 #include "base/strings/utf_string_conversions.h"
 #import "ios/web/public/test/crw_mock_web_state_delegate.h"
 #import "ios/web/public/test/fakes/test_web_state.h"
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
 #include "testing/platform_test.h"
 #import "third_party/ocmock/gtest_support.h"
 #include "ui/base/page_transition_types.h"
diff --git a/ios/web/web_state/web_state_impl.h b/ios/web/web_state/web_state_impl.h
index 32397fb0..00b60a3 100644
--- a/ios/web/web_state/web_state_impl.h
+++ b/ios/web/web_state/web_state_impl.h
@@ -22,10 +22,10 @@
 #import "ios/web/js_messaging/web_frames_manager_impl.h"
 #import "ios/web/navigation/navigation_manager_delegate.h"
 #import "ios/web/navigation/navigation_manager_impl.h"
-#import "ios/web/public/java_script_dialog_callback.h"
-#include "ios/web/public/java_script_dialog_type.h"
 #include "ios/web/public/js_messaging/web_frame.h"
 #import "ios/web/public/navigation/web_state_policy_decider.h"
+#import "ios/web/public/ui/java_script_dialog_callback.h"
+#include "ios/web/public/ui/java_script_dialog_type.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_delegate.h"
 #include "url/gurl.h"
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm
index e7ecb97..2b4996c 100644
--- a/ios/web/web_state/web_state_impl.mm
+++ b/ios/web/web_state/web_state_impl.mm
@@ -27,7 +27,6 @@
 #import "ios/web/public/deprecated/crw_native_content.h"
 #import "ios/web/public/deprecated/crw_native_content_holder.h"
 #include "ios/web/public/favicon/favicon_url.h"
-#import "ios/web/public/java_script_dialog_presenter.h"
 #import "ios/web/public/navigation/navigation_item.h"
 #import "ios/web/public/navigation/web_state_policy_decider.h"
 #include "ios/web/public/service/web_state_interface_provider.h"
@@ -35,8 +34,9 @@
 #import "ios/web/public/session/crw_session_storage.h"
 #import "ios/web/public/session/serializable_user_data_manager.h"
 #include "ios/web/public/thread/web_thread.h"
+#import "ios/web/public/ui/context_menu_params.h"
+#import "ios/web/public/ui/java_script_dialog_presenter.h"
 #import "ios/web/public/web_client.h"
-#import "ios/web/public/web_state/context_menu_params.h"
 #import "ios/web/public/web_state/web_state_delegate.h"
 #include "ios/web/public/web_state/web_state_observer.h"
 #include "ios/web/public/webui/web_ui_ios_controller.h"
diff --git a/ios/web/web_state/web_state_impl_unittest.mm b/ios/web/web_state/web_state_impl_unittest.mm
index 0cb4303..96cc5cea 100644
--- a/ios/web/web_state/web_state_impl_unittest.mm
+++ b/ios/web/web_state/web_state_impl_unittest.mm
@@ -23,7 +23,6 @@
 #import "ios/web/navigation/serializable_user_data_manager_impl.h"
 #import "ios/web/navigation/wk_navigation_util.h"
 #include "ios/web/public/deprecated/global_web_state_observer.h"
-#import "ios/web/public/java_script_dialog_presenter.h"
 #import "ios/web/public/navigation/web_state_policy_decider.h"
 #import "ios/web/public/session/crw_navigation_item_storage.h"
 #import "ios/web/public/session/crw_session_storage.h"
@@ -35,7 +34,8 @@
 #import "ios/web/public/test/fakes/test_web_state_delegate.h"
 #import "ios/web/public/test/fakes/test_web_state_observer.h"
 #include "ios/web/public/test/web_test.h"
-#import "ios/web/public/web_state/context_menu_params.h"
+#import "ios/web/public/ui/context_menu_params.h"
+#import "ios/web/public/ui/java_script_dialog_presenter.h"
 #import "ios/web/public/web_state/web_state_delegate.h"
 #include "ios/web/public/web_state/web_state_observer.h"
 #import "ios/web/security/web_interstitial_impl.h"
diff --git a/ios/web_view/internal/cwv_scroll_view.mm b/ios/web_view/internal/cwv_scroll_view.mm
index aca80ec56..6158a28 100644
--- a/ios/web_view/internal/cwv_scroll_view.mm
+++ b/ios/web_view/internal/cwv_scroll_view.mm
@@ -4,7 +4,7 @@
 
 #import "ios/web_view/public/cwv_scroll_view.h"
 
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web_view/internal/cwv_scroll_view_internal.h"
 #import "ios/web_view/public/cwv_scroll_view_delegate.h"
 
diff --git a/ios/web_view/internal/cwv_scroll_view_unittest.mm b/ios/web_view/internal/cwv_scroll_view_unittest.mm
index 4ac915c..3a84592 100644
--- a/ios/web_view/internal/cwv_scroll_view_unittest.mm
+++ b/ios/web_view/internal/cwv_scroll_view_unittest.mm
@@ -6,7 +6,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web_view/public/cwv_scroll_view_delegate.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #import "testing/gtest_mac.h"
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm
index ddba312e0..d6468497 100644
--- a/ios/web_view/internal/cwv_web_view.mm
+++ b/ios/web_view/internal/cwv_web_view.mm
@@ -27,10 +27,10 @@
 #import "ios/web/public/navigation/navigation_manager.h"
 #include "ios/web/public/navigation/referrer.h"
 #include "ios/web/public/navigation/reload_type.h"
+#import "ios/web/public/ui/context_menu_params.h"
+#import "ios/web/public/ui/crw_web_view_proxy.h"
+#import "ios/web/public/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_client.h"
-#import "ios/web/public/web_state/context_menu_params.h"
-#import "ios/web/public/web_state/ui/crw_web_view_proxy.h"
-#import "ios/web/public/web_state/ui/crw_web_view_scroll_view_proxy.h"
 #import "ios/web/public/web_state/web_state.h"
 #import "ios/web/public/web_state/web_state_delegate_bridge.h"
 #import "ios/web/public/web_state/web_state_observer_bridge.h"
diff --git a/ios/web_view/internal/web_view_java_script_dialog_presenter.h b/ios/web_view/internal/web_view_java_script_dialog_presenter.h
index ddeb8020..a79fbdc2 100644
--- a/ios/web_view/internal/web_view_java_script_dialog_presenter.h
+++ b/ios/web_view/internal/web_view_java_script_dialog_presenter.h
@@ -5,7 +5,7 @@
 #ifndef IOS_WEB_VIEW_INTERNAL_WEB_VIEW_JAVA_SCRIPT_DIALOG_PRESENTER_H_
 #define IOS_WEB_VIEW_INTERNAL_WEB_VIEW_JAVA_SCRIPT_DIALOG_PRESENTER_H_
 
-#import "ios/web/public/java_script_dialog_presenter.h"
+#import "ios/web/public/ui/java_script_dialog_presenter.h"
 
 @class CWVWebView;
 @protocol CWVUIDelegate;
diff --git a/media/base/bitstream_buffer.cc b/media/base/bitstream_buffer.cc
index e434157..40659bc 100644
--- a/media/base/bitstream_buffer.cc
+++ b/media/base/bitstream_buffer.cc
@@ -24,6 +24,18 @@
       presentation_timestamp_(presentation_timestamp) {}
 
 BitstreamBuffer::BitstreamBuffer(int32_t id,
+                                 base::UnsafeSharedMemoryRegion region,
+                                 size_t size,
+                                 off_t offset,
+                                 base::TimeDelta presentation_timestamp)
+    : id_(id),
+      region_(base::UnsafeSharedMemoryRegion::TakeHandleForSerialization(
+          std::move(region))),
+      size_(size),
+      offset_(offset),
+      presentation_timestamp_(presentation_timestamp) {}
+
+BitstreamBuffer::BitstreamBuffer(int32_t id,
                                  base::SharedMemoryHandle handle,
                                  bool read_only,
                                  size_t size,
diff --git a/media/base/bitstream_buffer.h b/media/base/bitstream_buffer.h
index 343ca070..ca5333a6 100644
--- a/media/base/bitstream_buffer.h
+++ b/media/base/bitstream_buffer.h
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/platform_shared_memory_region.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/memory/unsafe_shared_memory_region.h"
 #include "base/time/time.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/decrypt_config.h"
@@ -42,6 +43,13 @@
                   off_t offset = 0,
                   base::TimeDelta presentation_timestamp = kNoTimestamp);
 
+  // As above, creating by unwrapping a base::UnsafeSharedMemoryRegion.
+  BitstreamBuffer(int32_t id,
+                  base::UnsafeSharedMemoryRegion region,
+                  size_t size,
+                  off_t offset = 0,
+                  base::TimeDelta presentation_timestamp = kNoTimestamp);
+
   // As above, but creates by duplicating a SharedMemoryHandle.
   // TODO(https://crbug.com/793446): remove once legacy shared memory has been
   // converted.
diff --git a/media/midi/midi_input_port_android.cc b/media/midi/midi_input_port_android.cc
index b28df74..ee0155aa 100644
--- a/media/midi/midi_input_port_android.cc
+++ b/media/midi/midi_input_port_android.cc
@@ -33,7 +33,6 @@
 }
 
 void MidiInputPortAndroid::OnData(JNIEnv* env,
-                                  const JavaParamRef<jobject>& caller,
                                   const JavaParamRef<jbyteArray>& data,
                                   jint offset,
                                   jint size,
diff --git a/media/midi/midi_input_port_android.h b/media/midi/midi_input_port_android.h
index f641703..35e04ef 100644
--- a/media/midi/midi_input_port_android.h
+++ b/media/midi/midi_input_port_android.h
@@ -33,7 +33,6 @@
 
   // Called by the Java world.
   void OnData(JNIEnv* env,
-              const base::android::JavaParamRef<jobject>& caller,
               const base::android::JavaParamRef<jbyteArray>& data,
               jint offset,
               jint size,
diff --git a/media/midi/midi_manager_android.cc b/media/midi/midi_manager_android.cc
index 8b9d147..a2326b8 100644
--- a/media/midi/midi_manager_android.cc
+++ b/media/midi/midi_manager_android.cc
@@ -118,7 +118,6 @@
 
 void MidiManagerAndroid::OnInitialized(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jobjectArray>& devices) {
   for (auto raw_device : devices.ReadElements<jobject>()) {
     AddDevice(std::make_unique<MidiDeviceAndroid>(env, raw_device, this));
@@ -129,9 +128,7 @@
                      base::Unretained(this), Result::OK));
 }
 
-void MidiManagerAndroid::OnInitializationFailed(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+void MidiManagerAndroid::OnInitializationFailed(JNIEnv* env) {
   service()->task_service()->PostBoundTask(
       TaskService::kDefaultRunnerId,
       base::BindOnce(&MidiManagerAndroid::CompleteInitialization,
@@ -139,13 +136,11 @@
 }
 
 void MidiManagerAndroid::OnAttached(JNIEnv* env,
-                                    const JavaParamRef<jobject>& caller,
                                     const JavaParamRef<jobject>& raw_device) {
   AddDevice(std::make_unique<MidiDeviceAndroid>(env, raw_device, this));
 }
 
 void MidiManagerAndroid::OnDetached(JNIEnv* env,
-                                    const JavaParamRef<jobject>& caller,
                                     const JavaParamRef<jobject>& raw_device) {
   for (auto& device : devices_) {
     if (device->HasRawDevice(env, raw_device)) {
diff --git a/media/midi/midi_manager_android.h b/media/midi/midi_manager_android.h
index 7fd29e2..3f2b42d 100644
--- a/media/midi/midi_manager_android.h
+++ b/media/midi/midi_manager_android.h
@@ -48,16 +48,11 @@
 
   // Called from the Java world.
   void OnInitialized(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& caller,
                      const base::android::JavaParamRef<jobjectArray>& devices);
-  void OnInitializationFailed(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller);
+  void OnInitializationFailed(JNIEnv* env);
   void OnAttached(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& caller,
                   const base::android::JavaParamRef<jobject>& device);
   void OnDetached(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& caller,
                   const base::android::JavaParamRef<jobject>& device);
 
  private:
diff --git a/media/midi/usb_midi_device_android.cc b/media/midi/usb_midi_device_android.cc
index ab6c108..f089abf 100644
--- a/media/midi/usb_midi_device_android.cc
+++ b/media/midi/usb_midi_device_android.cc
@@ -63,7 +63,6 @@
 }
 
 void UsbMidiDeviceAndroid::OnData(JNIEnv* env,
-                                  const JavaParamRef<jobject>& caller,
                                   jint endpoint_number,
                                   const JavaParamRef<jbyteArray>& data) {
   std::vector<uint8_t> bytes;
diff --git a/media/midi/usb_midi_device_android.h b/media/midi/usb_midi_device_android.h
index 85c37941..ab53213 100644
--- a/media/midi/usb_midi_device_android.h
+++ b/media/midi/usb_midi_device_android.h
@@ -36,7 +36,6 @@
 
   // Called by the Java world.
   void OnData(JNIEnv* env,
-              const base::android::JavaParamRef<jobject>& caller,
               jint endpoint_number,
               const base::android::JavaParamRef<jbyteArray>& data);
 
diff --git a/media/midi/usb_midi_device_factory_android.cc b/media/midi/usb_midi_device_factory_android.cc
index 5ba6d6f..99592df6 100644
--- a/media/midi/usb_midi_device_factory_android.cc
+++ b/media/midi/usb_midi_device_factory_android.cc
@@ -53,7 +53,6 @@
 // Called from the Java world.
 void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceRequestDone(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jobjectArray>& devices) {
   UsbMidiDevice::Devices devices_to_pass;
   for (auto raw_device : devices.ReadElements<jobject>()) {
@@ -67,7 +66,6 @@
 // Called from the Java world.
 void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceAttached(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     const JavaParamRef<jobject>& device) {
   delegate_->OnDeviceAttached(
       std::make_unique<UsbMidiDeviceAndroid>(device, delegate_));
@@ -76,7 +74,6 @@
 // Called from the Java world.
 void UsbMidiDeviceFactoryAndroid::OnUsbMidiDeviceDetached(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller,
     jint index) {
   delegate_->OnDeviceDetached(index);
 }
diff --git a/media/midi/usb_midi_device_factory_android.h b/media/midi/usb_midi_device_factory_android.h
index b92c120..d0dae559a 100644
--- a/media/midi/usb_midi_device_factory_android.h
+++ b/media/midi/usb_midi_device_factory_android.h
@@ -30,15 +30,12 @@
 
   void OnUsbMidiDeviceRequestDone(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
       const base::android::JavaParamRef<jobjectArray>& devices);
   void OnUsbMidiDeviceAttached(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
       const base::android::JavaParamRef<jobject>& device);
   void OnUsbMidiDeviceDetached(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& caller,
       jint index);
 
  private:
diff --git a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
index 9e38744..a8d9484 100644
--- a/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
+++ b/media/mojo/test/mojo_video_encode_accelerator_integration_test.cc
@@ -6,6 +6,7 @@
 #include <memory>
 
 #include "base/bind.h"
+#include "base/memory/unsafe_shared_memory_region.h"
 #include "base/run_loop.h"
 #include "base/test/gtest_util.h"
 #include "base/test/scoped_task_environment.h"
@@ -180,15 +181,16 @@
 
   const uint64_t kInvalidShMemSize =
       fake_vea()->minimum_output_buffer_size() / 2;
-  base::SharedMemory shmem;
-  shmem.CreateAnonymous(kInvalidShMemSize);
+
+  base::UnsafeSharedMemoryRegion region =
+      base::UnsafeSharedMemoryRegion::Create(kInvalidShMemSize);
 
   EXPECT_CALL(*mock_vea_client,
               NotifyError(VideoEncodeAccelerator::kInvalidArgumentError));
 
   mojo_vea()->UseOutputBitstreamBuffer(
-      BitstreamBuffer(17 /* id */, shmem.handle(), false /* read_only */,
-                      kInvalidShMemSize, 0 /* offset */, base::TimeDelta()));
+      BitstreamBuffer(17 /* id */, std::move(region), kInvalidShMemSize,
+                      0 /* offset */, base::TimeDelta()));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -202,14 +204,14 @@
   const int32_t kInvalidBistreamBufferId = -18;
 
   const uint64_t kShMemSize = fake_vea()->minimum_output_buffer_size();
-  base::SharedMemory shmem;
-  shmem.CreateAnonymous(kShMemSize);
+  base::UnsafeSharedMemoryRegion region =
+      base::UnsafeSharedMemoryRegion::Create(kShMemSize);
   EXPECT_CALL(*mock_vea_client,
               NotifyError(VideoEncodeAccelerator::kInvalidArgumentError));
 
-  mojo_vea()->UseOutputBitstreamBuffer(BitstreamBuffer(
-      kInvalidBistreamBufferId, shmem.handle(), false /* read_only */,
-      kShMemSize, 0 /* offset */, base::TimeDelta()));
+  mojo_vea()->UseOutputBitstreamBuffer(
+      BitstreamBuffer(kInvalidBistreamBufferId, std::move(region), kShMemSize,
+                      0 /* offset */, base::TimeDelta()));
   base::RunLoop().RunUntilIdle();
 }
 
@@ -222,11 +224,11 @@
   const int32_t kBistreamBufferId = 17;
   {
     const uint64_t kShMemSize = fake_vea()->minimum_output_buffer_size();
-    base::SharedMemory shmem;
-    shmem.CreateAnonymous(kShMemSize);
-    mojo_vea()->UseOutputBitstreamBuffer(BitstreamBuffer(
-        kBistreamBufferId, shmem.handle(), false /* read_only */, kShMemSize,
-        0 /* offset */, base::TimeDelta()));
+    base::UnsafeSharedMemoryRegion region =
+        base::UnsafeSharedMemoryRegion::Create(kShMemSize);
+    mojo_vea()->UseOutputBitstreamBuffer(
+        BitstreamBuffer(kBistreamBufferId, std::move(region), kShMemSize,
+                        0 /* offset */, base::TimeDelta()));
     base::RunLoop().RunUntilIdle();
   }
 
@@ -265,11 +267,11 @@
 
   {
     const uint64_t kShMemSize = fake_vea()->minimum_output_buffer_size();
-    base::SharedMemory shmem;
-    shmem.CreateAnonymous(kShMemSize);
+    base::UnsafeSharedMemoryRegion region =
+        base::UnsafeSharedMemoryRegion::Create(kShMemSize);
     mojo_vea()->UseOutputBitstreamBuffer(
-        BitstreamBuffer(17 /* id */, shmem.handle(), false /* read_only */,
-                        kShMemSize, 0 /* offset */, base::TimeDelta()));
+        BitstreamBuffer(17 /* id */, std::move(region), kShMemSize,
+                        0 /* offset */, base::TimeDelta()));
     base::RunLoop().RunUntilIdle();
   }
 
diff --git a/mojo/public/cpp/bindings/BUILD.gn b/mojo/public/cpp/bindings/BUILD.gn
index 5667582..cf9e74f7 100644
--- a/mojo/public/cpp/bindings/BUILD.gn
+++ b/mojo/public/cpp/bindings/BUILD.gn
@@ -187,6 +187,8 @@
     "remote_set.h",
     "self_owned_receiver.h",
     "sequence_local_sync_event_watcher.h",
+    "service_factory.cc",
+    "service_factory.h",
     "shared_associated_remote.h",
     "shared_remote.h",
     "strong_associated_binding.h",
diff --git a/mojo/public/cpp/bindings/service_factory.cc b/mojo/public/cpp/bindings/service_factory.cc
new file mode 100644
index 0000000..18f12eb
--- /dev/null
+++ b/mojo/public/cpp/bindings/service_factory.cc
@@ -0,0 +1,68 @@
+// Copyright 2019 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 "mojo/public/cpp/bindings/service_factory.h"
+
+#include "base/bind.h"
+
+namespace mojo {
+
+ServiceFactory::~ServiceFactory() = default;
+
+bool ServiceFactory::MaybeRunService(mojo::GenericPendingReceiver* receiver) {
+  DCHECK(receiver->is_valid());
+
+  // We grab a weak handle to the receiver's message pipe first. If any function
+  // accepts the receiver, we will tie its returned object's lifetime to the
+  // connection state of that pipe.
+  MessagePipeHandle pipe = receiver->pipe();
+
+  for (const auto& callback : callbacks_) {
+    if (auto instance = callback.Run(receiver)) {
+      DCHECK(!receiver->is_valid());
+      instance->WatchPipe(
+          pipe, base::BindOnce(&ServiceFactory::OnInstanceDisconnected,
+                               weak_ptr_factory_.GetWeakPtr(), instance.get()));
+      instances_.insert(std::move(instance));
+      return true;
+    }
+
+    DCHECK(receiver->is_valid());
+  }
+
+  return false;
+}
+
+void ServiceFactory::OnInstanceDisconnected(InstanceHolderBase* instance) {
+  instances_.erase(instance);
+}
+
+ServiceFactory::InstanceHolderBase::InstanceHolderBase()
+    : watcher_(FROM_HERE, mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC) {}
+
+ServiceFactory::InstanceHolderBase::~InstanceHolderBase() = default;
+
+void ServiceFactory::InstanceHolderBase::WatchPipe(
+    MessagePipeHandle pipe,
+    base::OnceClosure disconnect_callback) {
+  DCHECK(!disconnect_callback_);
+  disconnect_callback_ = std::move(disconnect_callback);
+  watcher_.Watch(pipe, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
+                 MOJO_TRIGGER_CONDITION_SIGNALS_SATISFIED,
+                 base::BindRepeating(&InstanceHolderBase::OnDisconnect,
+                                     base::Unretained(this)));
+}
+
+void ServiceFactory::InstanceHolderBase::OnDisconnect(
+    MojoResult result,
+    const HandleSignalsState& state) {
+  // It doesn't matter what the parameters are, since the only way the watcher
+  // can signal is if the peer was closed or the local pipe handle was closed.
+  // The callback always destroys |this| when run, so there's also no chance of
+  // this method running more than once.
+  DCHECK(disconnect_callback_);
+  std::move(disconnect_callback_).Run();
+}
+
+}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/service_factory.h b/mojo/public/cpp/bindings/service_factory.h
new file mode 100644
index 0000000..2680007
--- /dev/null
+++ b/mojo/public/cpp/bindings/service_factory.h
@@ -0,0 +1,150 @@
+// Copyright 2019 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 MOJO_PUBLIC_CPP_BINDINGS_SERVICE_FACTORY_H_
+#define MOJO_PUBLIC_CPP_BINDINGS_SERVICE_FACTORY_H_
+
+#include <memory>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/component_export.h"
+#include "base/containers/flat_set.h"
+#include "base/containers/unique_ptr_adapters.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
+#include "mojo/public/cpp/system/message_pipe.h"
+#include "mojo/public/cpp/system/simple_watcher.h"
+
+namespace mojo {
+
+namespace internal {
+template <typename Func>
+struct ServiceFactoryTraits;
+}
+
+// ServiceFactory is a helper that Mojo consumers can use to conveniently handle
+// dynamic service interface requests via a GenericPendingReceiver by matching
+// the receiver's interface type against a series of strongly-typed factory
+// function pointers, each with the signature:
+//
+//   std::unique_ptr<T>(mojo::PendingReceiver<Interface>)
+//
+// where |T| is any type (generally an implementation of |Interface|), and
+// |Interface| is a mojom interface.
+//
+// Any time |MaybeRunService()| is called on the ServiceFactory, it will match
+// the GenericPendingReceiver argument's interface type against the list of
+// factories it has available, and if it finds a match it will run that function
+// and retain ownership of the returned object until the corresponding receiver
+// is disconnected.
+//
+// Typical usage might look something like:
+//
+//     auto RunFooService(mojo::PendingReceiver<foo::mojom::Foo> receiver) {
+//       return std::make_unique<foo::FooImpl>(std::move(receiver));
+//     }
+//
+//     auto RunFooService(mojo::PendingReceiver<foo::mojom::Foo> receiver) {
+//       return std::make_unique<foo::FooImpl>(std::move(receiver));
+//     }
+//
+//     void HandleServiceRequest(mojo::GenericPendingReceiver receiver) {
+//       static base::NoDestructor<mojo::ServiceFactory> factory{
+//         RunFooService,
+//         RunBarService,
+//       };
+//
+//       if (!factory->MaybeRunService(&receiver)) {
+//         // The receiver was for neither the Foo nor Bar service. Sad!
+//         LOG(ERROR) << "Unknown service: " << *receiver.interface_name();
+//       }
+//     }
+//
+class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) ServiceFactory {
+ public:
+  template <typename... Funcs>
+  explicit ServiceFactory(Funcs... fns)
+      : callbacks_({base::BindRepeating(&RunFunction<Funcs>, fns)...}) {}
+  ~ServiceFactory();
+
+  // Attempts to run a service supported by this factory.
+  //
+  // Returns |true| and consumes |*receiver| if it is a suitable match for some
+  // function known by the factory; otherwise returns |false| and leaves
+  // |*receiver| intact.
+  bool MaybeRunService(GenericPendingReceiver* receiver);
+
+ private:
+  class COMPONENT_EXPORT(MOJO_CPP_BINDINGS) InstanceHolderBase {
+   public:
+    InstanceHolderBase();
+    virtual ~InstanceHolderBase();
+
+    void WatchPipe(MessagePipeHandle pipe,
+                   base::OnceClosure disconnect_callback);
+
+   private:
+    void OnDisconnect(MojoResult result, const HandleSignalsState& state);
+
+    SimpleWatcher watcher_;
+    base::OnceClosure disconnect_callback_;
+
+    DISALLOW_COPY_AND_ASSIGN(InstanceHolderBase);
+  };
+
+  template <typename Interface>
+  class InstanceHolder : public InstanceHolderBase {
+   public:
+    explicit InstanceHolder(std::unique_ptr<Interface> instance)
+        : instance_(std::move(instance)) {}
+    ~InstanceHolder() override = default;
+
+   private:
+    const std::unique_ptr<Interface> instance_;
+
+    DISALLOW_COPY_AND_ASSIGN(InstanceHolder);
+  };
+
+  template <typename Func>
+  static std::unique_ptr<InstanceHolderBase> RunFunction(
+      Func fn,
+      GenericPendingReceiver* receiver) {
+    using Interface = typename internal::ServiceFactoryTraits<Func>::Interface;
+    if (auto typed_receiver = receiver->As<Interface>()) {
+      return std::make_unique<InstanceHolder<Interface>>(
+          fn(std::move(typed_receiver)));
+    }
+    return nullptr;
+  }
+
+  void OnInstanceDisconnected(InstanceHolderBase* instance);
+
+  using GenericCallback =
+      base::RepeatingCallback<std::unique_ptr<InstanceHolderBase>(
+          GenericPendingReceiver*)>;
+  const std::vector<GenericCallback> callbacks_;
+
+  base::flat_set<std::unique_ptr<InstanceHolderBase>, base::UniquePtrComparator>
+      instances_;
+
+  base::WeakPtrFactory<ServiceFactory> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(ServiceFactory);
+};
+
+namespace internal {
+
+template <typename Impl, typename InterfaceType>
+struct ServiceFactoryTraits<std::unique_ptr<Impl> (*)(
+    PendingReceiver<InterfaceType>)> {
+  using Interface = InterfaceType;
+};
+
+}  // namespace internal
+
+}  // namespace mojo
+
+#endif  // MOJO_PUBLIC_CPP_BINDINGS_SERVICE_FACTORY_H_
diff --git a/mojo/public/cpp/bindings/tests/BUILD.gn b/mojo/public/cpp/bindings/tests/BUILD.gn
index f98716b..51e2da44 100644
--- a/mojo/public/cpp/bindings/tests/BUILD.gn
+++ b/mojo/public/cpp/bindings/tests/BUILD.gn
@@ -42,6 +42,7 @@
     "router_test_util.h",
     "sample_service_unittest.cc",
     "serialization_warning_unittest.cc",
+    "service_factory_unittest.cc",
     "struct_unittest.cc",
     "sync_handle_registry_unittest.cc",
     "sync_method_unittest.cc",
@@ -136,6 +137,7 @@
     "connection_group_unittest.test-mojom",
     "idle_tracking_unittest.test-mojom",
     "receiver_unittest.test-mojom",
+    "service_factory_unittest.test-mojom",
   ]
 
   public_deps = [
diff --git a/mojo/public/cpp/bindings/tests/service_factory_unittest.cc b/mojo/public/cpp/bindings/tests/service_factory_unittest.cc
new file mode 100644
index 0000000..98f4e37
--- /dev/null
+++ b/mojo/public/cpp/bindings/tests/service_factory_unittest.cc
@@ -0,0 +1,196 @@
+// Copyright 2019 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 "mojo/public/cpp/bindings/service_factory.h"
+#include "base/callback.h"
+#include "base/no_destructor.h"
+#include "base/optional.h"
+#include "base/run_loop.h"
+#include "base/test/bind_test_util.h"
+#include "base/test/scoped_task_environment.h"
+#include "mojo/public/cpp/bindings/generic_pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver.h"
+#include "mojo/public/cpp/bindings/remote.h"
+#include "mojo/public/cpp/bindings/tests/service_factory_unittest.test-mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace mojo {
+namespace test {
+namespace service_factory_unittest {
+
+class ServiceFactoryTest : public testing::Test {
+ public:
+  ServiceFactoryTest() = default;
+
+ private:
+  base::test::ScopedTaskEnvironment task_environment_;
+
+  DISALLOW_COPY_AND_ASSIGN(ServiceFactoryTest);
+};
+
+class TestService1Impl : public mojom::TestService1 {
+ public:
+  explicit TestService1Impl(PendingReceiver<mojom::TestService1> receiver)
+      : receiver_(this, std::move(receiver)) {
+    ++num_instances_;
+  }
+
+  ~TestService1Impl() override {
+    --num_instances_;
+    if (destruction_wait_loop_)
+      destruction_wait_loop_->Quit();
+  }
+
+  static int num_instances() { return num_instances_; }
+
+  static void WaitForInstanceDestruction() {
+    static base::NoDestructor<base::Optional<base::RunLoop>> loop;
+    loop->emplace();
+    destruction_wait_loop_ = &loop->value();
+    (*loop)->Run();
+    destruction_wait_loop_ = nullptr;
+  }
+
+ private:
+  // mojom::TestService1:
+  void GetIdentity(GetIdentityCallback callback) override {
+    std::move(callback).Run(1);
+  }
+
+  void Quit() override { receiver_.reset(); }
+
+  Receiver<mojom::TestService1> receiver_;
+  static int num_instances_;
+  static base::RunLoop* destruction_wait_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestService1Impl);
+};
+
+class TestService2Impl : public mojom::TestService2 {
+ public:
+  explicit TestService2Impl(PendingReceiver<mojom::TestService2> receiver)
+      : receiver_(this, std::move(receiver)) {}
+
+  ~TestService2Impl() override = default;
+
+ private:
+  // mojom::TestService2:
+  void GetIdentity(GetIdentityCallback callback) override {
+    std::move(callback).Run(2);
+  }
+
+  Receiver<mojom::TestService2> receiver_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestService2Impl);
+};
+
+int TestService1Impl::num_instances_ = 0;
+base::RunLoop* TestService1Impl::destruction_wait_loop_ = nullptr;
+
+auto RunTestService1(PendingReceiver<mojom::TestService1> receiver) {
+  return std::make_unique<TestService1Impl>(std::move(receiver));
+}
+
+auto RunTestService2(PendingReceiver<mojom::TestService2> receiver) {
+  return std::make_unique<TestService2Impl>(std::move(receiver));
+}
+
+TEST_F(ServiceFactoryTest, BasicMatching) {
+  ServiceFactory factory{RunTestService1, RunTestService2};
+
+  Remote<mojom::TestService1> remote1;
+  GenericPendingReceiver receiver = remote1.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory.MaybeRunService(&receiver));
+  EXPECT_FALSE(receiver.is_valid());
+
+  // Verify that we connected to an instance of TestService1.
+  int32_t id = 0;
+  EXPECT_TRUE(remote1->GetIdentity(&id));
+  EXPECT_EQ(1, id);
+
+  Remote<mojom::TestService2> remote2;
+  receiver = remote2.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory.MaybeRunService(&receiver));
+  EXPECT_FALSE(receiver.is_valid());
+
+  // Verify that we connected to an instance of TestService2.
+  EXPECT_TRUE(remote2->GetIdentity(&id));
+  EXPECT_EQ(2, id);
+
+  Remote<mojom::TestService3> remote3;
+  receiver = remote3.BindNewPipeAndPassReceiver();
+  EXPECT_FALSE(factory.MaybeRunService(&receiver));
+  EXPECT_TRUE(receiver.is_valid());
+  EXPECT_TRUE(receiver.As<mojom::TestService3>());
+}
+
+TEST_F(ServiceFactoryTest, DestroyInstanceOnClientDisconnect) {
+  ServiceFactory factory{RunTestService1};
+
+  Remote<mojom::TestService1> remote1;
+  GenericPendingReceiver receiver = remote1.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory.MaybeRunService(&receiver));
+
+  Remote<mojom::TestService1> remote2;
+  receiver = remote2.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory.MaybeRunService(&receiver));
+
+  remote1.FlushForTesting();
+  remote2.FlushForTesting();
+  EXPECT_EQ(2, TestService1Impl::num_instances());
+
+  remote1.reset();
+  TestService1Impl::WaitForInstanceDestruction();
+  EXPECT_EQ(1, TestService1Impl::num_instances());
+
+  remote2.FlushForTesting();
+  EXPECT_EQ(1, TestService1Impl::num_instances());
+
+  remote2.reset();
+  TestService1Impl::WaitForInstanceDestruction();
+  EXPECT_EQ(0, TestService1Impl::num_instances());
+}
+
+TEST_F(ServiceFactoryTest, DestroyInstanceOnServiceDisconnect) {
+  ServiceFactory factory{RunTestService1};
+
+  Remote<mojom::TestService1> remote;
+  GenericPendingReceiver receiver = remote.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory.MaybeRunService(&receiver));
+
+  remote.FlushForTesting();
+  EXPECT_EQ(1, TestService1Impl::num_instances());
+  remote->Quit();
+  remote.FlushForTesting();
+  EXPECT_EQ(0, TestService1Impl::num_instances());
+}
+
+TEST_F(ServiceFactoryTest, DestroyInstancesOnFactoryDestruction) {
+  base::Optional<ServiceFactory> factory{base::in_place, RunTestService1};
+
+  Remote<mojom::TestService1> remote1;
+  GenericPendingReceiver receiver = remote1.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory->MaybeRunService(&receiver));
+  remote1.FlushForTesting();
+  EXPECT_EQ(1, TestService1Impl::num_instances());
+
+  Remote<mojom::TestService1> remote2;
+  receiver = remote2.BindNewPipeAndPassReceiver();
+  EXPECT_TRUE(factory->MaybeRunService(&receiver));
+  remote2.FlushForTesting();
+  EXPECT_EQ(2, TestService1Impl::num_instances());
+
+  factory.reset();
+  EXPECT_EQ(0, TestService1Impl::num_instances());
+
+  remote1.FlushForTesting();
+  remote2.FlushForTesting();
+  EXPECT_FALSE(remote1.is_connected());
+  EXPECT_FALSE(remote2.is_connected());
+}
+
+}  // namespace service_factory_unittest
+}  // namespace test
+}  // namespace mojo
diff --git a/mojo/public/cpp/bindings/tests/service_factory_unittest.test-mojom b/mojo/public/cpp/bindings/tests/service_factory_unittest.test-mojom
new file mode 100644
index 0000000..5e0ff68e8
--- /dev/null
+++ b/mojo/public/cpp/bindings/tests/service_factory_unittest.test-mojom
@@ -0,0 +1,17 @@
+// Copyright 2019 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 mojo.test.service_factory_unittest.mojom;
+
+interface TestService1 {
+  [Sync] GetIdentity() => (int32 id);
+  Quit();
+};
+
+interface TestService2 {
+  [Sync] GetIdentity() => (int32 id);
+};
+
+interface TestService3 {};
+
diff --git a/net/disk_cache/blockfile/entry_impl.cc b/net/disk_cache/blockfile/entry_impl.cc
index 8e5fc81..054f8d3 100644
--- a/net/disk_cache/blockfile/entry_impl.cc
+++ b/net/disk_cache/blockfile/entry_impl.cc
@@ -458,7 +458,7 @@
     if (address.is_block_file())
       offset = address.start_block() * address.BlockSize() + kBlockHeaderSize;
 
-    if (!key_file || !key_file->Write(key.data(), key.size(), offset)) {
+    if (!key_file || !key_file->Write(key.data(), key.size() + 1, offset)) {
       DeleteData(address, kKeyFileIndex);
       return false;
     }
@@ -789,7 +789,7 @@
   CacheEntryBlock* entry = const_cast<CacheEntryBlock*>(&entry_);
   int key_len = entry->Data()->key_len;
   if (key_len <= kMaxInternalKeyLength)
-    return std::string(entry->Data()->key);
+    return std::string(entry->Data()->key, key_len);
 
   // We keep a copy of the key so that we can always return it, even if the
   // backend is disabled.
@@ -808,12 +808,18 @@
   if (!key_file)
     return std::string();
 
-  ++key_len;  // We store a trailing \0 on disk that we read back below.
+  ++key_len;  // We store a trailing \0 on disk.
   if (!offset && key_file->GetLength() != static_cast<size_t>(key_len))
     return std::string();
 
-  if (!key_file->Read(base::WriteInto(&key_, key_len), key_len, offset))
+  // WriteInto will ensure that key_.length() == key_len - 1, and so
+  // key_.c_str()[key_len] will be '\0'. Taking advantage of this, do not
+  // attempt read up to the expected on-disk '\0' --- which would be |key_len|
+  // bytes total --- as if due to a corrupt file it isn't |key_| would get its
+  // internal nul messed up.
+  if (!key_file->Read(base::WriteInto(&key_, key_len), key_len - 1, offset))
     key_.clear();
+  DCHECK_LE(strlen(key_.data()), static_cast<size_t>(key_len));
   return key_;
 }
 
diff --git a/net/disk_cache/entry_unittest.cc b/net/disk_cache/entry_unittest.cc
index f39812a5..803260a 100644
--- a/net/disk_cache/entry_unittest.cc
+++ b/net/disk_cache/entry_unittest.cc
@@ -2656,6 +2656,67 @@
   DisableIntegrityCheck();
 }
 
+TEST_F(DiskCacheEntryTest, KeySanityCheck2) {
+  UseCurrentThread();
+  InitCache();
+  std::string key("the first key");
+  disk_cache::Entry* entry;
+  ASSERT_THAT(CreateEntry(key, &entry), IsOk());
+
+  disk_cache::EntryImpl* entry_impl =
+      static_cast<disk_cache::EntryImpl*>(entry);
+  disk_cache::EntryStore* store = entry_impl->entry()->Data();
+
+  // Fill in the rest of inline key store with non-nulls. Unlike in
+  // KeySanityCheck, this does not change the length to identify it as
+  // stored under |long_key|.
+  memset(store->key + key.size(), 'k', sizeof(store->key) - key.size());
+  entry_impl->entry()->set_modified();
+  entry->Close();
+
+  // We have a corrupt entry. Now reload it. We should NOT read beyond the
+  // allocated buffer here.
+  ASSERT_NE(net::OK, OpenEntry(key, &entry));
+  DisableIntegrityCheck();
+}
+
+TEST_F(DiskCacheEntryTest, KeySanityCheck3) {
+  const size_t kVeryLong = 40 * 1024;
+  UseCurrentThread();
+  InitCache();
+  std::string key(kVeryLong, 'a');
+  disk_cache::Entry* entry;
+  ASSERT_THAT(CreateEntry(key, &entry), IsOk());
+
+  disk_cache::EntryImpl* entry_impl =
+      static_cast<disk_cache::EntryImpl*>(entry);
+  disk_cache::EntryStore* store = entry_impl->entry()->Data();
+
+  // Test meaningful when using long keys; and also want this to be
+  // an external file to avoid needing to duplicate offset math here.
+  disk_cache::Addr key_addr(store->long_key);
+  ASSERT_TRUE(key_addr.is_initialized());
+  ASSERT_TRUE(key_addr.is_separate_file());
+
+  // Close the entry before messing up its files.
+  entry->Close();
+
+  // Mess up the terminating null in the external key file.
+  auto key_file =
+      base::MakeRefCounted<disk_cache::File>(true /* want sync ops*/);
+  ASSERT_TRUE(key_file->Init(cache_impl_->GetFileName(key_addr)));
+
+  ASSERT_TRUE(key_file->Write("b", 1u, kVeryLong));
+  key_file = nullptr;
+
+  // This case gets graceful recovery.
+  ASSERT_THAT(OpenEntry(key, &entry), IsOk());
+
+  // Make sure the key object isn't messed up.
+  EXPECT_EQ(kVeryLong, strlen(entry->GetKey().data()));
+  entry->Close();
+}
+
 TEST_F(DiskCacheEntryTest, SimpleCacheInternalAsyncIO) {
   SetSimpleCacheMode();
   InitCache();
diff --git a/pdf/BUILD.gn b/pdf/BUILD.gn
index 7d6bd3f..b78243b 100644
--- a/pdf/BUILD.gn
+++ b/pdf/BUILD.gn
@@ -50,6 +50,8 @@
       "accessibility.cc",
       "accessibility.h",
       "chunk_stream.h",
+      "document_layout.cc",
+      "document_layout.h",
       "document_loader.h",
       "document_loader_impl.cc",
       "document_loader_impl.h",
@@ -151,6 +153,7 @@
     configs += [ ":pdf_common_config" ]
     sources = [
       "chunk_stream_unittest.cc",
+      "document_layout_unittest.cc",
       "document_loader_impl_unittest.cc",
       "draw_utils/coordinates_unittest.cc",
       "out_of_process_instance_unittest.cc",
diff --git a/pdf/document_layout.cc b/pdf/document_layout.cc
new file mode 100644
index 0000000..dee08058
--- /dev/null
+++ b/pdf/document_layout.cc
@@ -0,0 +1,38 @@
+// Copyright 2019 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 "pdf/document_layout.h"
+
+#include "base/logging.h"
+#include "pdf/draw_utils/coordinates.h"
+
+namespace chrome_pdf {
+
+DocumentLayout::DocumentLayout() = default;
+
+DocumentLayout::DocumentLayout(const DocumentLayout& other) = default;
+DocumentLayout& DocumentLayout::operator=(const DocumentLayout& other) =
+    default;
+
+DocumentLayout::~DocumentLayout() = default;
+
+void DocumentLayout::RotatePagesClockwise() {
+  default_page_orientation_ = (default_page_orientation_ + 1) % 4;
+}
+
+void DocumentLayout::RotatePagesCounterclockwise() {
+  default_page_orientation_ = (default_page_orientation_ - 1) % 4;
+}
+
+void DocumentLayout::EnlargeHeight(int height) {
+  DCHECK_GE(height, 0);
+  size_.Enlarge(0, height);
+}
+
+void DocumentLayout::AppendPageRect(const pp::Size& page_rect) {
+  // TODO(kmoon): Inline draw_utils::ExpandDocumentSize().
+  draw_utils::ExpandDocumentSize(page_rect, &size_);
+}
+
+}  // namespace chrome_pdf
diff --git a/pdf/document_layout.h b/pdf/document_layout.h
new file mode 100644
index 0000000..6859575e
--- /dev/null
+++ b/pdf/document_layout.h
@@ -0,0 +1,70 @@
+// Copyright 2019 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 PDF_DOCUMENT_LAYOUT_H_
+#define PDF_DOCUMENT_LAYOUT_H_
+
+#include "ppapi/cpp/size.h"
+
+namespace chrome_pdf {
+
+// Layout of pages within a PDF document. Pages are placed as rectangles
+// (possibly rotated) in a non-overlapping vertical sequence.
+//
+// All layout units are pixels.
+//
+// TODO(crbug.com/51472): Support multiple columns.
+class DocumentLayout final {
+ public:
+  DocumentLayout();
+
+  DocumentLayout(const DocumentLayout& other);
+  DocumentLayout& operator=(const DocumentLayout& other);
+
+  ~DocumentLayout();
+
+  // Returns an integer from 0 to 3 (inclusive), encoding the default
+  // orientation of the document's pages.
+  //
+  // A return value of 0 indicates the original page orientation, with each
+  // increment indicating clockwise rotation by an additional 90 degrees.
+  //
+  // TODO(kmoon): Return an enum (class) instead of an integer.
+  int default_page_orientation() const { return default_page_orientation_; }
+
+  // Rotates all pages 90 degrees clockwise. Does not recompute layout.
+  void RotatePagesClockwise();
+
+  // Rotates all pages 90 degrees counterclockwise. Does not recompute layout.
+  void RotatePagesCounterclockwise();
+
+  // Returns the layout's total size.
+  const pp::Size& size() const { return size_; }
+
+  // Sets the layout's total size.
+  void set_size(const pp::Size& size) { size_ = size; }
+
+  // Increases the layout's total height by |height|.
+  void EnlargeHeight(int height);
+
+  // Appends a rectangle of size |page_rect| to the layout. This will increase
+  // the layout's height by the page's height, and increase the layout's width
+  // to at least the page's width.
+  void AppendPageRect(const pp::Size& page_rect);
+
+ private:
+  // Orientations are non-negative integers modulo 4.
+  //
+  // TODO(kmoon): Doesn't match return type of default_page_orientation().
+  // Callers expect int, but internally, we want unsigned semantics. This will
+  // be cleaned up when we switch to an enum.
+  unsigned int default_page_orientation_ = 0;
+
+  // Layout's total size.
+  pp::Size size_;
+};
+
+}  // namespace chrome_pdf
+
+#endif  // PDF_DOCUMENT_LAYOUT_H_
diff --git a/pdf/document_layout_unittest.cc b/pdf/document_layout_unittest.cc
new file mode 100644
index 0000000..8185464
--- /dev/null
+++ b/pdf/document_layout_unittest.cc
@@ -0,0 +1,128 @@
+// Copyright 2019 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 "pdf/document_layout.h"
+
+#include "base/test/gtest_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chrome_pdf {
+
+namespace {
+
+class DocumentLayoutTest : public testing::Test {
+ protected:
+  DocumentLayout layout_;
+};
+
+using DocumentLayoutDeathTest = DocumentLayoutTest;
+
+// TODO(kmoon): Need to use this with EXPECT_PRED2 instead of just using
+// EXPECT_EQ, due to ADL issues with pp::Size's operator== (defined in global
+// namespace, instead of in "pp").
+inline bool PpSizeEq(const pp::Size& lhs, const pp::Size& rhs) {
+  return lhs == rhs;
+}
+
+TEST_F(DocumentLayoutTest, DefaultConstructor) {
+  EXPECT_EQ(layout_.default_page_orientation(), 0);
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(0, 0));
+}
+
+TEST_F(DocumentLayoutTest, CopyConstructor) {
+  layout_.RotatePagesClockwise();
+  layout_.EnlargeHeight(2);
+
+  DocumentLayout copy(layout_);
+  EXPECT_EQ(copy.default_page_orientation(), 1);
+  EXPECT_PRED2(PpSizeEq, copy.size(), pp::Size(0, 2));
+
+  layout_.RotatePagesClockwise();
+  layout_.EnlargeHeight(5);
+  EXPECT_EQ(copy.default_page_orientation(), 1);
+  EXPECT_PRED2(PpSizeEq, copy.size(), pp::Size(0, 2));
+}
+
+TEST_F(DocumentLayoutTest, CopyAssignment) {
+  layout_.RotatePagesClockwise();
+  layout_.EnlargeHeight(2);
+
+  DocumentLayout copy;
+  EXPECT_EQ(copy.default_page_orientation(), 0);
+  EXPECT_PRED2(PpSizeEq, copy.size(), pp::Size(0, 0));
+
+  copy = layout_;
+  EXPECT_EQ(copy.default_page_orientation(), 1);
+  EXPECT_PRED2(PpSizeEq, copy.size(), pp::Size(0, 2));
+
+  layout_.RotatePagesClockwise();
+  layout_.EnlargeHeight(5);
+  EXPECT_EQ(copy.default_page_orientation(), 1);
+  EXPECT_PRED2(PpSizeEq, copy.size(), pp::Size(0, 2));
+}
+
+TEST_F(DocumentLayoutTest, RotatePagesClockwise) {
+  layout_.RotatePagesClockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 1);
+
+  layout_.RotatePagesClockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 2);
+
+  layout_.RotatePagesClockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 3);
+
+  layout_.RotatePagesClockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 0);
+}
+
+TEST_F(DocumentLayoutTest, RotatePagesCounterclockwise) {
+  layout_.RotatePagesCounterclockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 3);
+
+  layout_.RotatePagesCounterclockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 2);
+
+  layout_.RotatePagesCounterclockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 1);
+
+  layout_.RotatePagesCounterclockwise();
+  EXPECT_EQ(layout_.default_page_orientation(), 0);
+}
+
+TEST_F(DocumentLayoutTest, RotatePagesDoesNotRecomputeLayout) {
+  layout_.EnlargeHeight(2);
+
+  layout_.RotatePagesClockwise();
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(0, 2));
+
+  layout_.RotatePagesCounterclockwise();
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(0, 2));
+}
+
+TEST_F(DocumentLayoutTest, EnlargeHeight) {
+  layout_.EnlargeHeight(5);
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(0, 5));
+
+  layout_.EnlargeHeight(11);
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(0, 16));
+}
+
+TEST_F(DocumentLayoutDeathTest, EnlargeHeightNegativeIncrement) {
+  EXPECT_DCHECK_DEATH(layout_.EnlargeHeight(-5));
+}
+
+TEST_F(DocumentLayoutTest, AppendPageRect) {
+  layout_.AppendPageRect(pp::Size(3, 5));
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(3, 5));
+
+  layout_.AppendPageRect(pp::Size(7, 11));
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(7, 16));
+
+  layout_.AppendPageRect(pp::Size(5, 11));
+  EXPECT_PRED2(PpSizeEq, layout_.size(), pp::Size(7, 27));
+}
+
+}  // namespace
+
+}  // namespace chrome_pdf
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 13a2ff9..73aeda1 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -1161,7 +1161,8 @@
 
   *page_index = page;
   PDFiumPage::Area result = pages_[page]->GetCharIndex(
-      point_in_page, current_rotation_, char_index, form_type, target);
+      point_in_page, layout_.default_page_orientation(), char_index, form_type,
+      target);
   return (client_->IsPrintPreview() && result == PDFiumPage::WEBLINK_AREA)
              ? PDFiumPage::NONSELECTABLE_AREA
              : result;
@@ -2005,7 +2006,7 @@
   // Use zoom of 1.0 since |visible_rect| is without zoom.
   const std::vector<pp::Rect>& rects =
       find_results_[current_find_index_.value()].GetScreenRects(
-          pp::Point(), 1.0, current_rotation_);
+          pp::Point(), 1.0, layout_.default_page_orientation());
   for (const auto& rect : rects)
     bounding_rect = bounding_rect.Union(rect);
   if (!visible_rect.Contains(bounding_rect)) {
@@ -2052,8 +2053,8 @@
     std::vector<pp::Rect>* rect_vector) const {
   for (const auto& range : rect_range) {
     pp::Rect result_rect;
-    const std::vector<pp::Rect>& rects =
-        range.GetScreenRects(offset_point, current_zoom_, current_rotation_);
+    const std::vector<pp::Rect>& rects = range.GetScreenRects(
+        offset_point, current_zoom_, layout_.default_page_orientation());
     for (const auto& rect : rects)
       result_rect = result_rect.Union(rect);
     rect_vector->push_back(result_rect);
@@ -2076,12 +2077,12 @@
 }
 
 void PDFiumEngine::RotateClockwise() {
-  current_rotation_ = (current_rotation_ + 1) % 4;
+  layout_.RotatePagesClockwise();
   RotateInternal();
 }
 
 void PDFiumEngine::RotateCounterclockwise() {
-  current_rotation_ = (current_rotation_ - 1) % 4;
+  layout_.RotatePagesCounterclockwise();
   RotateInternal();
 }
 
@@ -2445,18 +2446,18 @@
   pp::Size page_size = GetPageSize(0);
   page_size.Enlarge(kPageShadowLeft + kPageShadowRight,
                     kPageShadowTop + kPageShadowBottom);
-  pp::Size old_document_size = document_size_;
-  document_size_ = pp::Size(page_size.width(), 0);
+  pp::Size old_document_size = layout_.size();
+  layout_.set_size(pp::Size(page_size.width(), 0));
   for (int i = 0; i < num_pages; ++i) {
     if (i != 0) {
-      // Add space for horizontal separator.
-      document_size_.Enlarge(0, kBottomSeparator);
+      // Add space for bottom separator.
+      layout_.EnlargeHeight(kBottomSeparator);
     }
 
-    pp::Rect rect(pp::Point(0, document_size_.height()), page_size);
+    pp::Rect rect(pp::Point(0, layout_.size().height()), page_size);
     page_rects.push_back(rect);
 
-    document_size_.Enlarge(0, page_size.height());
+    layout_.EnlargeHeight(page_size.height());
   }
 
   // Create blank pages.
@@ -2477,8 +2478,8 @@
   }
 
   CalculateVisiblePages();
-  if (document_size_ != old_document_size)
-    client_->DocumentSizeUpdated(document_size_);
+  if (layout_.size() != old_document_size)
+    client_->DocumentSizeUpdated(layout_.size());
 }
 
 void PDFiumEngine::LoadDocument() {
@@ -2606,8 +2607,8 @@
   if (pages_.empty() && reload)
     return;
   pending_pages_.clear();
-  pp::Size old_document_size = document_size_;
-  document_size_ = pp::Size();
+  pp::Size old_document_size = layout_.size();
+  layout_.set_size(pp::Size());
   std::vector<pp::Rect> page_rects;
   size_t new_page_count = FPDF_GetPageCount(doc());
 
@@ -2616,8 +2617,8 @@
       FPDFAvail_IsLinearized(fpdf_availability()) == PDF_LINEARIZED;
   for (size_t i = 0; i < new_page_count; ++i) {
     if (i != 0) {
-      // Add space for horizontal separator.
-      document_size_.Enlarge(0, kBottomSeparator);
+      // Add space for bottom separator.
+      layout_.EnlargeHeight(kBottomSeparator);
     }
 
     // Get page availability. If |reload| == true and the page is not new,
@@ -2639,15 +2640,15 @@
 
     pp::Size size = page_available ? GetPageSize(i) : default_page_size_;
     EnlargePage(i, new_page_count, &size);
-    pp::Rect rect(pp::Point(0, document_size_.height()), size);
+    pp::Rect rect(pp::Point(0, layout_.size().height()), size);
     page_rects.push_back(rect);
 
-    draw_utils::ExpandDocumentSize(size, &document_size_);
+    layout_.AppendPageRect(size);
   }
 
   for (size_t i = 0; i < new_page_count; ++i) {
     // Center pages relative to the entire document.
-    page_rects[i].set_x((document_size_.width() - page_rects[i].width()) / 2);
+    page_rects[i].set_x((layout_.size().width() - page_rects[i].width()) / 2);
     InsetPage(i, new_page_count, /*multiplier=*/1, &page_rects[i]);
     AppendPageRectToPages(page_rects[i], i, reload);
   }
@@ -2661,8 +2662,8 @@
   }
 
   CalculateVisiblePages();
-  if (document_size_ != old_document_size)
-    client_->DocumentSizeUpdated(document_size_);
+  if (layout_.size() != old_document_size)
+    client_->DocumentSizeUpdated(layout_.size());
 }
 
 void PDFiumEngine::LoadBody() {
@@ -2826,7 +2827,7 @@
         ConvertUnitDouble(width_in_points, kPointsPerInch, kPixelsPerInch));
     int height_in_pixels = static_cast<int>(
         ConvertUnitDouble(height_in_points, kPointsPerInch, kPixelsPerInch));
-    if (current_rotation_ % 2 == 1)
+    if (layout_.default_page_orientation() % 2 == 1)
       std::swap(width_in_pixels, height_in_pixels);
     size = pp::Size(width_in_pixels, height_in_pixels);
   }
@@ -2920,9 +2921,9 @@
     ScopedFPDFBitmap new_bitmap = CreateBitmap(dirty, image_data);
     FPDFBitmap_FillRect(new_bitmap.get(), start_x, start_y, size_x, size_y,
                         0xFFFFFFFF);
-    rv = FPDF_RenderPageBitmap_Start(new_bitmap.get(), page, start_x, start_y,
-                                     size_x, size_y, current_rotation_,
-                                     GetRenderingFlags(), this);
+    rv = FPDF_RenderPageBitmap_Start(
+        new_bitmap.get(), page, start_x, start_y, size_x, size_y,
+        layout_.default_page_orientation(), GetRenderingFlags(), this);
     progressive_paints_[progressive_index].SetBitmapAndImageData(
         std::move(new_bitmap), *image_data);
   }
@@ -2949,7 +2950,8 @@
 
   // Draw the forms.
   FPDF_FFLDraw(form(), bitmap, pages_[page_index]->GetPage(), start_x, start_y,
-               size_x, size_y, current_rotation_, GetRenderingFlags());
+               size_x, size_y, layout_.default_page_orientation(),
+               GetRenderingFlags());
 
   FillPageSides(progressive_index);
 
@@ -2995,9 +2997,9 @@
                         left.height(), client_->GetBackgroundColor());
   }
 
-  if (page_rect.right() < document_size_.width()) {
+  if (page_rect.right() < layout_.size().width()) {
     pp::Rect right = draw_utils::GetRightFillRect(
-        page_rect, inset_sizes, document_size_.width(), kBottomSeparator);
+        page_rect, inset_sizes, layout_.size().width(), kBottomSeparator);
     right = GetScreenRect(right).Intersect(dirty_in_screen);
 
     FPDFBitmap_FillRect(bitmap, right.x() - dirty_in_screen.x(),
@@ -3059,8 +3061,9 @@
     if (range.page_index() != page_index)
       continue;
 
-    const std::vector<pp::Rect>& rects = range.GetScreenRects(
-        visible_rect.point(), current_zoom_, current_rotation_);
+    const std::vector<pp::Rect>& rects =
+        range.GetScreenRects(visible_rect.point(), current_zoom_,
+                             layout_.default_page_orientation());
     for (const auto& rect : rects) {
       pp::Rect visible_selection = rect.Intersect(dirty_in_screen);
       if (visible_selection.IsEmpty())
@@ -3171,7 +3174,7 @@
   }
 
   return GetScreenRect(draw_utils::GetSurroundingRect(
-      page_rect.y(), max_page_height, inset_sizes, document_size_.width(),
+      page_rect.y(), max_page_height, inset_sizes, layout_.size().width(),
       kBottomSeparator));
 }
 
@@ -3281,8 +3284,9 @@
     if (!engine_->IsPageVisible(range.page_index()))
       continue;
 
-    const std::vector<pp::Rect>& selection_rects = range.GetScreenRects(
-        visible_point, engine_->current_zoom_, engine_->current_rotation_);
+    const std::vector<pp::Rect>& selection_rects =
+        range.GetScreenRects(visible_point, engine_->current_zoom_,
+                             engine_->layout_.default_page_orientation());
     rects.insert(rects.end(), selection_rects.begin(), selection_rects.end());
   }
   return rects;
@@ -3341,8 +3345,8 @@
                                 pages_[page_index]->rect().y());
   FPDF_BOOL ret = FPDF_DeviceToPage(
       pages_[page_index]->GetPage(), 0, 0, pages_[page_index]->rect().width(),
-      pages_[page_index]->rect().height(), current_rotation_, temp_x, temp_y,
-      page_x, page_y);
+      pages_[page_index]->rect().height(), layout_.default_page_orientation(),
+      temp_x, temp_y, page_x, page_y);
   DCHECK(ret);
 }
 
@@ -3448,8 +3452,9 @@
                 std::numeric_limits<int32_t>::max(), 0, 0);
   pp::Rect right;
   for (const auto& sel : selection_) {
-    const std::vector<pp::Rect>& screen_rects = sel.GetScreenRects(
-        GetVisibleRect().point(), current_zoom_, current_rotation_);
+    const std::vector<pp::Rect>& screen_rects =
+        sel.GetScreenRects(GetVisibleRect().point(), current_zoom_,
+                           layout_.default_page_orientation());
     for (const auto& rect : screen_rects) {
       if (IsAboveOrDirectlyLeftOf(rect, left))
         left = rect;
diff --git a/pdf/pdfium/pdfium_engine.h b/pdf/pdfium/pdfium_engine.h
index 6e32008..fbeda00 100644
--- a/pdf/pdfium/pdfium_engine.h
+++ b/pdf/pdfium/pdfium_engine.h
@@ -17,6 +17,7 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "pdf/document_layout.h"
 #include "pdf/document_loader.h"
 #include "pdf/pdf_engine.h"
 #include "pdf/pdfium/pdfium_form_filler.h"
@@ -515,7 +516,9 @@
   static FPDF_BOOL Pause_NeedToPauseNow(IFSDK_PAUSE* param);
 
   PDFEngine::Client* const client_;
-  pp::Size document_size_;  // Size of document in pixels.
+
+  // The current document layout.
+  DocumentLayout layout_;
 
   // The scroll position in screen coordinates.
   pp::Point position_;
@@ -524,7 +527,6 @@
   // The plugin size in screen coordinates.
   pp::Size plugin_size_;
   double current_zoom_ = 1.0;
-  unsigned int current_rotation_ = 0;
 
   std::unique_ptr<DocumentLoader> doc_loader_;  // Main document's loader.
   std::string url_;
diff --git a/pdf/pdfium/pdfium_form_filler.cc b/pdf/pdfium/pdfium_form_filler.cc
index f55bb0b..8483efd5 100644
--- a/pdf/pdfium/pdfium_form_filler.cc
+++ b/pdf/pdfium/pdfium_form_filler.cc
@@ -100,7 +100,7 @@
 
   pp::Rect rect = engine->pages_[page_index]->PageToScreen(
       engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right,
-      bottom, engine->current_rotation_);
+      bottom, engine->layout_.default_page_orientation());
   engine->client_->Invalidate(rect);
 }
 
@@ -119,7 +119,7 @@
   }
   pp::Rect rect = engine->pages_[page_index]->PageToScreen(
       engine->GetVisibleRect().point(), engine->current_zoom_, left, top, right,
-      bottom, engine->current_rotation_);
+      bottom, engine->layout_.default_page_orientation());
   if (rect.IsEmpty())
     return;
 
diff --git a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
index 8157e8f..76d31da7 100644
--- a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
+++ b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java
@@ -63,8 +63,7 @@
     // To use these scopes in a debug build, your development account will need to be whitelisted.
     private static final String TOKEN_SCOPE = "oauth2:https://www.googleapis.com/auth/chromoting "
             + "https://www.googleapis.com/auth/chromoting.directory "
-            + "https://www.googleapis.com/auth/tachyon "
-            + "https://www.googleapis.com/auth/googletalk";
+            + "https://www.googleapis.com/auth/tachyon";
 
     /** Result code used for starting {@link DesktopActivity}. */
     public static final int DESKTOP_ACTIVITY = 0;
diff --git a/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java b/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java
index 24609d2c..8e925c30 100644
--- a/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java
+++ b/remoting/android/java/src/org/chromium/chromoting/jni/DirectoryService.java
@@ -7,7 +7,6 @@
 import com.google.protobuf.InvalidProtocolBufferException;
 
 import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JCaller;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chromoting.HostInfo;
@@ -42,7 +41,7 @@
      * with an error-code describing the failure.
      */
     public void retrieveHostList(final HostListCallback callback) {
-        DirectoryServiceJni.get().retrieveHostList(this, mNativeJniDirectoryService, callback);
+        DirectoryServiceJni.get().retrieveHostList(mNativeJniDirectoryService, callback);
     }
 
     /**
@@ -50,12 +49,12 @@
      * otherwise callback.onError() will be called with an error-code describing the failure.
      */
     public void deleteHost(final String hostId, final DeleteCallback callback) {
-        DirectoryServiceJni.get().deleteHost(this, mNativeJniDirectoryService, hostId, callback);
+        DirectoryServiceJni.get().deleteHost(mNativeJniDirectoryService, hostId, callback);
     }
 
     @Override
     public void finalize() {
-        DirectoryServiceJni.get().destroy(this, mNativeJniDirectoryService);
+        DirectoryServiceJni.get().destroy(mNativeJniDirectoryService);
     }
 
     private final long mNativeJniDirectoryService;
@@ -63,11 +62,9 @@
     @NativeMethods
     interface Natives {
         long init();
-        void retrieveHostList(@JCaller DirectoryService self, long nativeJniDirectoryService,
-                HostListCallback callback);
-        void deleteHost(@JCaller DirectoryService self, long nativeJniDirectoryService,
-                String hostId, DeleteCallback callback);
-        void destroy(@JCaller DirectoryService self, long nativeJniDirectoryService);
+        void retrieveHostList(long nativeJniDirectoryService, HostListCallback callback);
+        void deleteHost(long nativeJniDirectoryService, String hostId, DeleteCallback callback);
+        void destroy(long nativeJniDirectoryService);
     }
 
     /**
diff --git a/remoting/client/jni/jni_directory_service.cc b/remoting/client/jni/jni_directory_service.cc
index cad0a43..dd881727 100644
--- a/remoting/client/jni/jni_directory_service.cc
+++ b/remoting/client/jni/jni_directory_service.cc
@@ -58,7 +58,6 @@
 
 void JniDirectoryService::RetrieveHostList(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller,
     const base::android::JavaParamRef<jobject>& callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   grpc_executor_.ExecuteRpc(CreateGrpcAsyncUnaryRequest(
@@ -73,7 +72,6 @@
 
 void JniDirectoryService::DeleteHost(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller,
     const base::android::JavaParamRef<jstring>& host_id,
     const base::android::JavaParamRef<jobject>& callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -88,9 +86,7 @@
                      base::android::ScopedJavaGlobalRef<jobject>(callback))));
 }
 
-void JniDirectoryService::Destroy(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& caller) {
+void JniDirectoryService::Destroy(JNIEnv* env) {
   if (sequence_->RunsTasksInCurrentSequence()) {
     delete this;
   } else {
diff --git a/remoting/client/jni/jni_directory_service.h b/remoting/client/jni/jni_directory_service.h
index 469810b..913c399 100644
--- a/remoting/client/jni/jni_directory_service.h
+++ b/remoting/client/jni/jni_directory_service.h
@@ -34,14 +34,12 @@
   ~JniDirectoryService();
 
   void RetrieveHostList(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& caller,
                         const base::android::JavaParamRef<jobject>& callback);
   void DeleteHost(JNIEnv* env,
-                  const base::android::JavaParamRef<jobject>& caller,
                   const base::android::JavaParamRef<jstring>& host_id,
                   const base::android::JavaParamRef<jobject>& callback);
 
-  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& caller);
+  void Destroy(JNIEnv* env);
 
  private:
   void OnHostListRetrieved(base::android::ScopedJavaGlobalRef<jobject> callback,
diff --git a/remoting/test/test_oauth_token_getter.cc b/remoting/test/test_oauth_token_getter.cc
index 3267c63..f202bbc 100644
--- a/remoting/test/test_oauth_token_getter.cc
+++ b/remoting/test/test_oauth_token_getter.cc
@@ -26,9 +26,8 @@
 namespace {
 
 constexpr char kChromotingAuthScopeValues[] =
-    "https://www.googleapis.com/auth/chromoting "
+    "https://www.googleapis.com/auth/chromoting.me2me.host "
     "https://www.googleapis.com/auth/chromoting.remote.support "
-    "https://www.googleapis.com/auth/googletalk "
     "https://www.googleapis.com/auth/userinfo.email "
     "https://www.googleapis.com/auth/tachyon";
 
diff --git a/sandbox/win/src/sharedmem_ipc_client.cc b/sandbox/win/src/sharedmem_ipc_client.cc
index 2f849be..3ddea76 100644
--- a/sandbox/win/src/sharedmem_ipc_client.cc
+++ b/sandbox/win/src/sharedmem_ipc_client.cc
@@ -144,7 +144,7 @@
   }
 
   // The server has returned an answer, copy it and free the channel.
-  memcpy(answer, params->GetCallReturn(), sizeof(CrossCallReturn));
+  memcpy_wrapper(answer, params->GetCallReturn(), sizeof(CrossCallReturn));
 
   // Return the IPC state It can indicate that while the IPC has
   // completed some error in the Broker has caused to not return valid
diff --git a/services/content/simple_browser/window.cc b/services/content/simple_browser/window.cc
index 3d2f4c45..97e417a9 100644
--- a/services/content/simple_browser/window.cc
+++ b/services/content/simple_browser/window.cc
@@ -77,7 +77,7 @@
 
     if (key_event.key_code() == ui::VKEY_RETURN) {
       navigable_contents_->Navigate(
-          GURL(base::UTF16ToUTF8(location_bar_->text())));
+          GURL(base::UTF16ToUTF8(location_bar_->GetText())));
     }
 
     return false;
diff --git a/services/network/resource_scheduler/resource_scheduler.cc b/services/network/resource_scheduler/resource_scheduler.cc
index 7669025..84918fea 100644
--- a/services/network/resource_scheduler/resource_scheduler.cc
+++ b/services/network/resource_scheduler/resource_scheduler.cc
@@ -537,6 +537,21 @@
     return (!pending_requests_.IsEmpty() || !in_flight_requests_.empty());
   }
 
+  size_t CountInflightDelayableRequests() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return in_flight_delayable_count_;
+  }
+
+  size_t CountInflightNonDelayableRequests() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return in_flight_requests_.size() - in_flight_delayable_count_;
+  }
+
+  size_t CountInflightLayoutBlockingRequests() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    return total_layout_blocking_count_;
+  }
+
  private:
   enum ShouldStartReqResult {
     DO_NOT_START_REQUEST_AND_STOP_SEARCHING,
@@ -594,6 +609,8 @@
     UMA_HISTOGRAM_COUNTS_100(
         "ResourceScheduler.RequestsCount.TotalLayoutBlocking",
         total_layout_blocking_count_);
+
+    resource_scheduler_->RecordGlobalRequestCountMetrics();
   }
 
   void InsertInFlightRequest(ScheduledResourceRequestImpl* request) {
@@ -1370,6 +1387,8 @@
 }
 
 size_t ResourceScheduler::ActiveSchedulerClientsCounter() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   size_t active_scheduler_clients_count = 0;
   for (const auto& client : client_map_) {
     if (client.second->IsActiveResourceSchedulerClient()) {
@@ -1379,6 +1398,34 @@
   return active_scheduler_clients_count;
 }
 
+// Records the metrics related to number of requests in flight that are observed
+// by the global resource scheduler.
+void ResourceScheduler::RecordGlobalRequestCountMetrics() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  size_t global_delayable_count = 0;
+  size_t global_non_delayable_count = 0;
+  size_t global_layout_blocking_count = 0;
+
+  for (const auto& client : client_map_) {
+    global_delayable_count += client.second->CountInflightDelayableRequests();
+    global_non_delayable_count +=
+        client.second->CountInflightNonDelayableRequests();
+    global_layout_blocking_count +=
+        client.second->CountInflightLayoutBlockingRequests();
+  }
+
+  UMA_HISTOGRAM_COUNTS_100("ResourceScheduler.RequestsCount.GlobalAll",
+                           global_delayable_count + global_non_delayable_count);
+  UMA_HISTOGRAM_COUNTS_100("ResourceScheduler.RequestsCount.GlobalDelayable",
+                           global_delayable_count);
+  UMA_HISTOGRAM_COUNTS_100("ResourceScheduler.RequestsCount.GlobalNonDelayable",
+                           global_non_delayable_count);
+  UMA_HISTOGRAM_COUNTS_100(
+      "ResourceScheduler.RequestsCount.GlobalLayoutBlocking",
+      global_layout_blocking_count);
+}
+
 ResourceScheduler::Client* ResourceScheduler::GetClient(int child_id,
                                                         int route_id) {
   ClientId client_id = MakeClientId(child_id, route_id);
diff --git a/services/network/resource_scheduler/resource_scheduler.h b/services/network/resource_scheduler/resource_scheduler.h
index d1d8312..df92a6d 100644
--- a/services/network/resource_scheduler/resource_scheduler.h
+++ b/services/network/resource_scheduler/resource_scheduler.h
@@ -113,6 +113,10 @@
   // Note: the counter is expected to be 0 for the most of time.
   size_t ActiveSchedulerClientsCounter() const;
 
+  // Records the metrics related to number of in-flight requests that are
+  // observed by the global resource scheduler.
+  void RecordGlobalRequestCountMetrics() const;
+
   // Client functions:
 
   // Updates the priority for |request|. Modifies request->priority(), and may
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 9feb0eb..6cde7380 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -1723,53 +1723,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -1909,53 +1862,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -7494,54 +7400,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48I",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -7684,54 +7542,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "LMY48I",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "expiration": 10800,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -13474,53 +13284,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -13660,53 +13423,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index bfd6474..6247311b 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -5494,53 +5494,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -5680,53 +5633,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "KTU84P",
-              "device_os_type": "userdebug",
-              "device_type": "hammerhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -8623,53 +8529,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -8809,53 +8668,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index a483a48..348f4be 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -583,54 +583,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "hard_timeout": 3600,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-features=NetworkServiceInProcess",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
@@ -679,54 +631,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "hard_timeout": 3600,
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--enable-features=NetworkService,NetworkServiceInProcess",
           "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter",
           "--gs-results-bucket=chromium-result-details",
@@ -3757,54 +3661,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -3947,54 +3803,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "isolate_coverage_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
@@ -6058,53 +5866,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-features=NetworkServiceInProcess",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
@@ -6152,53 +5913,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--enable-features=NetworkService,NetworkServiceInProcess",
           "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_webview_instrumentation_test_apk.filter",
           "--gs-results-bucket=chromium-result-details",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 51eb16e..405ec61 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -5461,31 +5461,6 @@
         }
       },
       {
-        "args": [
-          "--additional-driver-flag=--disable-features=NetworkService",
-          "--num-retries=3",
-          "--debug"
-        ],
-        "isolate_name": "blink_web_tests_exparchive",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "non_network_service_webkit_layout_tests",
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-14.04"
-            }
-          ],
-          "shards": 20
-        }
-      },
-      {
         "isolate_name": "telemetry_gpu_unittests",
         "merge": {
           "args": [],
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 4b8abe6..cf6da2df3 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -1079,53 +1079,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
           "--disable-perfetto",
           "--gtest_filter=TracingControllerTest.*:BackgroundTracingManagerBrowserTest.*",
           "--gs-results-bucket=chromium-result-details",
@@ -1265,53 +1218,6 @@
       },
       {
         "args": [
-          "--disable-features=NetworkService",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices"
-        ],
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "non_network_service_content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "non_network_service_content_shell_test_apk",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/luci/logdog/butler/${platform}",
-              "location": "bin",
-              "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c"
-            }
-          ],
-          "dimension_sets": [
-            {
-              "device_os": "MMB29Q",
-              "device_os_type": "userdebug",
-              "device_type": "bullhead",
-              "os": "Android"
-            }
-          ],
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "shards": 5
-        },
-        "test": "content_shell_test_apk"
-      },
-      {
-        "args": [
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices"
         ],
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index a5a592c..187d9a1 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1114,63 +1114,6 @@
       'ToTAndroidCFI',
     ],
   },
-  'non_network_service_content_browsertests': {
-    'remove_from': [
-      # chromium.android
-      'android-asan',
-      # Don't run on trybots; waterfall is enough.
-      'android-kitkat-arm-rel',
-      'android-marshmallow-arm64-rel',
-      # No capacity for tablet testers.
-      'KitKat Tablet Tester',
-      'Lollipop Tablet Tester',
-      'Marshmallow Tablet Tester',
-    ],
-  },
-  'non_network_service_content_shell_test_apk': {
-    'remove_from': [
-      # chromium.android
-      'android-asan',
-      # Don't run on trybots; waterfall is enough.
-      'android-kitkat-arm-rel',
-      'android-marshmallow-arm64-rel',
-      # No capacity for tablet testers.
-      'KitKat Tablet Tester',
-      'Lollipop Tablet Tester',
-      'Marshmallow Tablet Tester',
-    ],
-  },
-  'non_network_service_webkit_layout_tests' : {
-    'remove_from': [
-      # chromium.mac. TODO(https://crbug.com/944117): Remove this.
-      'mac-dummy-rel',
-    ],
-    'modifications': {
-      'Linux Tests': {
-        "args": [
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-        ],
-      },
-      'Linux Tests Code Coverage': {
-        "args": [
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-        ],
-      },
-      'Linux Release Code Coverage (NVIDIA)': {
-        "args": [
-          "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw",
-        ],
-      },
-      'Linux Tests (dbg)(1)': {
-        'args': [
-          '--debug',
-        ],
-        'swarming': {
-          'shards': 20,
-        },
-      },
-    },
-  },
   'non_viz_browser_tests': {
     'modifications': {
       # chromium.fyi
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index d75946d..c7eaea53 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -4367,53 +4367,6 @@
       },
     },
 
-    # These tests will be run on the main Android waterfall since Android
-    # WebView hasn't switched to network service on stable yet.
-    'non_network_service_android_gtests': {
-      'non_network_service_content_browsertests': {
-        'args': [
-          '--disable-features=NetworkService',
-        ],
-        'swarming': {
-          'shards': 5,
-        },
-        'test': 'content_browsertests',
-      },
-      'non_network_service_content_shell_test_apk': {
-        'swarming': {
-          'shards': 5,
-        },
-        'args': [
-          '--disable-features=NetworkService',
-        ],
-        'test': 'content_shell_test_apk',
-      },
-    },
-
-    'non_network_service_isolated_scripts': {
-      'non_network_service_webkit_layout_tests': {
-        'args': [
-          '--additional-driver-flag=--disable-features=NetworkService',
-
-          # layout test failures are retried 3 times when '--test-list' is not
-          # passed, but 0 times when '--test-list' is passed. We want to always
-          # retry 3 times, so we explicitly specify it.
-          '--num-retries=3',
-        ],
-        'isolate_name': 'blink_web_tests_exparchive',
-        'merge': {
-          'args': [
-            '--verbose',
-          ],
-          'script': '//third_party/blink/tools/merge_web_test_results.py',
-        },
-        'results_handler': 'layout tests',
-        'swarming': {
-          'shards': 12,
-        },
-      },
-    },
-
     'ozone_linux_gtests': {
       'services_unittests': {},
       'ozone_unittests': {},
@@ -4916,7 +4869,6 @@
       'linux_flavor_specific_chromium_gtests',
       'vr_platform_specific_chromium_gtests',
       'network_service_android_gtests',
-      'non_network_service_android_gtests',
     ],
 
     'chromium_code_coverage_isolated_scripts_and_fuzzers': [
@@ -4973,7 +4925,6 @@
     'chromium_linux_dbg_isolated_scripts': [
       'desktop_chromium_isolated_scripts',
       'linux_specific_chromium_isolated_scripts',
-      'non_network_service_isolated_scripts',
       'telemetry_perf_unittests_isolated_scripts',
     ],
 
@@ -5564,7 +5515,6 @@
 
     'mojo_android_gtests': [
       'network_service_android_gtests',
-      'non_network_service_android_gtests',
     ],
 
     'mojo_chromiumos_fyi_gtests': [
diff --git a/testing/libfuzzer/AFL.md b/testing/libfuzzer/AFL_integration.md
similarity index 100%
rename from testing/libfuzzer/AFL.md
rename to testing/libfuzzer/AFL_integration.md
diff --git a/testing/libfuzzer/README.md b/testing/libfuzzer/README.md
index 1c48fd7..a93060d 100644
--- a/testing/libfuzzer/README.md
+++ b/testing/libfuzzer/README.md
@@ -1,77 +1,77 @@
-# libFuzzer in Chromium
+# Fuzzing in Chromium
 
-[go/libfuzzer-chromium](https://goto.google.com/libfuzzer-chromium) (Googler only)
+[go/chrome-fuzzing](https://goto.google.com/chrome-fuzzing) (Googler only)
 
-*** aside
-[Getting Started](getting_started.md)
-| [Buildbot]
-| [ClusterFuzz Stats]
-| [Cover Bug]
-***
+[Fuzzing] is a testing technique that feeds randomized inputs to a target code
+in an attempt to crash it. It's one of the most effective methods we have for
+finding security and stability issues ([go/fuzzing-success]).
 
-This directory contains integration between [libFuzzer] and Chromium.
-LibFuzzer is an in-process coverage-driven evolutionary fuzzing engine. It helps
-engineers to uncover potential security & stability problems.
+This documentation covers the in-process guided fuzzing approach employed by
+different fuzzing engines, such as [libFuzzer] or [AFL]. To learn more about
+out-of-process fuzzers, please refer to the [Blackbox fuzzing] page in the
+ClusterFuzz documentation.
 
-*** note
-**Requirements:** libFuzzer in Chromium is supported with Linux, Chrome OS, Mac,
-and Windows.
-***
+[TOC]
 
-## Integration Status
+## Getting Started
 
-Fuzzer tests are well-integrated with Chromium build system and distributed
-ClusterFuzz fuzzing system. Cover bug: [crbug.com/539572].
+In Chromium, you can easily create and submit fuzz targets. The targets are
+automatically discovered by buildbots, built with different fuzzing engines,
+then uploaded to the distributed [ClusterFuzz] fuzzing system to run at scale.
 
-## Documentation
+Create your first fuzz target and submit it by stepping through our [Getting
+Started Guide].
 
-* [Getting Started Guide] walks you through all the steps necessary to create
-your fuzz target and submit it to ClusterFuzz.
-* [Efficient Fuzzer Guide] explains how to measure fuzz target effectiveness and
-ways to improve it.
-* [Guide to libprotobuf-mutator (LPM)] walks through the steps necessary to
-create a fuzz target that expects a protobuf as input (instead of a byte
-stream). In addition to fuzzing code that accepts protobufs, it can be used to
-fuzz code that requires multiple mutated inputs, or to generate inputs defined
-by a grammar.
-* [ClusterFuzz Integration] describes integration between ClusterFuzz and
-libFuzzer.
-* [Reproducing Bugs] describes how to reproduce bugs found by libFuzzer/AFL
-  and reported by ClusterFuzz.
-* [Fuzzing on Chrome OS] describes how to write fuzzers for the non-browser
-  parts of Chrome OS.
-* [AFL Integration] describes AFL's integration with Chromium and ClusterFuzz.
-* [Reference] contains detailed references for different integration parts.
+## Advanced Topics
+
+* Improving fuzz target effectiveness: [Efficient Fuzzer Guide].
+* Creating a fuzz target that expects a protobuf (instead of a byte steam) as
+  input: [Guide to libprotobuf-mutator (LPM)].
+
+  **Note**: you can also use LPM to fuzz code that needs multiple mutated
+  inputs, or to generate inputs defined by a grammar.
+* Reproducing bugs found by libFuzzer/AFL and reported by ClusterFuzz:
+  [Reproducing Bugs].
+
+## Further Reading
+
+* LibFuzzer's integration with Chromium and ClusterFuzz: [LibFuzzer
+  Integration].
+* AFL's integration with Chromium and ClusterFuzz: [AFL Integration].
+* Detailed references for other integration parts: [Reference].
+* Writing fuzzers for the non-browser parts of Chrome OS: [Fuzzing on Chrome
+  OS].
 
 ## Trophies
-* [ClusterFuzz Bugs] - issues found and automatically filed by ClusterFuzz.
-* [Manual Bugs] - issues that were filed manually after running fuzz targets.
-* [Pdfium Bugs] - bugs found in pdfium by manual fuzzing.
-* [OSS Trophies] - bugs found with libFuzzer in open-source projects.
+* Issues found with in-process fuzzing and automatically filed by ClusterFuzz:
+  [ClusterFuzz Bugs].
+* Issues filed manually after running fuzz targets: [Manual Bugs].
+* Bugs found in PDFium by manual fuzzing: [PDFium Bugs].
+* Bugs found with libFuzzer in open-source projects: [OSS Trophies].
 
+## Other Links
+* [Guided in-process fuzzing of Chrome components] blog post.
+* [ClusterFuzz Stats] for fuzz targets built with AddressSanitizer and
+  libFuzzer.
 
-## Blog Posts
-* [Guided in-process fuzzing of Chrome components].
-
-## Project Links
-* [libFuzzer Infrastructure Bugs]
-
-[Buildbot]: https://ci.chromium.org/p/chromium/g/chromium.fuzz/builders
-[Cover Bug]: https://bugs.chromium.org/p/chromium/issues/detail?id=539572
-[Getting Started Guide]: getting_started.md
-[Efficient Fuzzer Guide]: efficient_fuzzer.md
-[Guide to libprotobuf-mutator (LPM)]: libprotobuf-mutator.md
-[ClusterFuzz Integration]: clusterfuzz.md
-[Reproducing Bugs]: reproducing.md
-[Reference]: reference.md
-[AFL Integration]: AFL.md
-[ClusterFuzz Bugs]: https://bugs.chromium.org/p/chromium/issues/list?can=1&q=label:Stability-LibFuzzer%20label:ClusterFuzz&sort=-modified&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified
+[AFL]: http://lcamtuf.coredump.cx/afl/
+[AFL Integration]: AFL_integration.md
+[Blackbox fuzzing]: https://google.github.io/clusterfuzz/setting-up-fuzzing/blackbox-fuzzing/
+[ClusterFuzz]: https://clusterfuzz.com/
+[ClusterFuzz Bugs]: https://bugs.chromium.org/p/chromium/issues/list?sort=-modified&colspec=ID%20Pri%20M%20Stars%20ReleaseBlock%20Component%20Status%20Owner%20Summary%20OS%20Modified&q=label%3AStability-LibFuzzer%2CStability-AFL%20label%3AClusterFuzz%20-status%3AWontFix%2CDuplicate&can=1
 [ClusterFuzz Stats]: https://clusterfuzz.com/fuzzer-stats/by-fuzzer/fuzzer/libFuzzer/job/libfuzzer_chrome_asan
-[Pdfium Bugs]: https://bugs.chromium.org/p/pdfium/issues/list?can=1&q=libfuzzer&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=tiles
+[Efficient Fuzzer Guide]: efficient_fuzzer.md
+[Fuzzing]: https://en.wikipedia.org/wiki/Fuzzing
+[Fuzzing on Chrome OS]: https://chromium.googlesource.com/chromiumos/docs/+/master/fuzzing.md
+[Getting Started Guide]: getting_started.md
+[Guide to libprotobuf-mutator (LPM)]: libprotobuf-mutator.md
+[Guided in-process fuzzing of Chrome components]: https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html
 [Manual Bugs]: https://bugs.chromium.org/p/chromium/issues/list?can=1&q=label%3AStability-LibFuzzer+-label%3AClusterFuzz&sort=-modified&colspec=ID+Pri+M+Stars+ReleaseBlock+Component+Status+Owner+Summary+OS+Modified&x=m&y=releaseblock&cells=ids
 [OSS Trophies]: http://llvm.org/docs/LibFuzzer.html#trophies
-[Guided in-process fuzzing of Chrome components]: https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html
+[PDFium Bugs]: https://bugs.chromium.org/p/pdfium/issues/list?can=1&q=libfuzzer&colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&cells=tiles
+[Reference]: reference.md
+[Reproducing Bugs]: reproducing.md
 [crbug.com/539572]: https://bugs.chromium.org/p/chromium/issues/detail?id=539572
+[go/fuzzing-success]: https://goto.google.com/fuzzing-success
 [libFuzzer]: http://llvm.org/docs/LibFuzzer.html
-[libFuzzer Infrastructure Bugs]: https://bugs.chromium.org/p/chromium/issues/list?q=label:LibFuzzer-Infra
-[Fuzzing on Chrome OS]: https://chromium.googlesource.com/chromiumos/docs/+/master/fuzzing.md
+[libFuzzer Integration]: libFuzzer_integration.md
diff --git a/testing/libfuzzer/efficient_fuzzer.md b/testing/libfuzzer/efficient_fuzzer.md
index 98b60f51..09af434b9 100644
--- a/testing/libfuzzer/efficient_fuzzer.md
+++ b/testing/libfuzzer/efficient_fuzzer.md
@@ -292,8 +292,8 @@
 uses random generator that affects reproducibility of crashes.
 
 [AFL]: http://lcamtuf.coredump.cx/afl/
-[ClusterFuzz Corpus]: clusterfuzz.md#Corpus
-[ClusterFuzz status]: clusterfuzz.md#Status-Links
+[ClusterFuzz Corpus]: libFuzzer_integration.md#Corpus
+[ClusterFuzz status]: libFuzzer_integration.md#Status-Links
 [Corpus GCS Bucket]: https://console.cloud.google.com/storage/clusterfuzz-corpus/libfuzzer
 [issue 638836]: https://bugs.chromium.org/p/chromium/issues/detail?id=638836
 [coverage script]: https://cs.chromium.org/chromium/src/tools/code_coverage/coverage.py
diff --git a/testing/libfuzzer/getting_started.md b/testing/libfuzzer/getting_started.md
index ee68f2b..532e525 100644
--- a/testing/libfuzzer/getting_started.md
+++ b/testing/libfuzzer/getting_started.md
@@ -335,7 +335,7 @@
 
 
 [Address Sanitizer]: http://clang.llvm.org/docs/AddressSanitizer.html
-[ClusterFuzz status]: clusterfuzz.md#Status-Links
+[ClusterFuzz status]: libFuzzer_integration.md#Status-Links
 [Efficient Fuzzer Guide]: efficient_fuzzer.md
 [Fuzzer Dictionary]: efficient_fuzzer.md#Fuzzer-Dictionary
 [Memory Sanitizer]: http://clang.llvm.org/docs/MemorySanitizer.html
diff --git a/testing/libfuzzer/clusterfuzz.md b/testing/libfuzzer/libFuzzer_integration.md
similarity index 100%
rename from testing/libfuzzer/clusterfuzz.md
rename to testing/libfuzzer/libFuzzer_integration.md
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index b5e2f5f6..c86b00e9 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -2381,49 +2381,7 @@
             ]
         }
     ],
-    "GwpAsanMallocMacOSLaunch": [
-        {
-            "platforms": [
-                "mac"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "params": {
-                        "AllocationSamplingRange": "16",
-                        "MaxAllocations": "70",
-                        "MaxMetadata": "255",
-                        "ProcessSamplingProbability": "0.1"
-                    },
-                    "enable_features": [
-                        "GwpAsanMalloc"
-                    ]
-                }
-            ]
-        }
-    ],
-    "GwpAsanMallocWindowsM75Launch": [
-        {
-            "platforms": [
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "params": {
-                        "AllocationSamplingRange": "16",
-                        "MaxAllocations": "70",
-                        "MaxMetadata": "255",
-                        "ProcessSamplingProbability": "0.1"
-                    },
-                    "enable_features": [
-                        "GwpAsanMalloc"
-                    ]
-                }
-            ]
-        }
-    ],
-    "GwpAsanPartitionAllocLaunch": [
+    "GwpAsanUnified": [
         {
             "platforms": [
                 "mac",
@@ -2432,7 +2390,15 @@
             "experiments": [
                 {
                     "name": "Enabled",
+                    "params": {
+                        "AllocationSamplingRange": "16",
+                        "MaxAllocations": "70",
+                        "MaxMetadata": "255",
+                        "ProcessSamplingBoost2": "10",
+                        "ProcessSamplingProbability": "0.1"
+                    },
                     "enable_features": [
+                        "GwpAsanMalloc",
                         "GwpAsanPartitionAlloc"
                     ]
                 }
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 933ba86..2aeb94a 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -110,11 +110,6 @@
 const base::Feature kOffMainThreadServiceWorkerScriptFetch{
     "OffMainThreadServiceWorkerScriptFetch", base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enable off-the-main-thread shared worker script fetch.
-// (https://crbug.com/924041)
-const base::Feature kOffMainThreadSharedWorkerScriptFetch{
-    "OffMainThreadSharedWorkerScriptFetch", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable browser-initiated dedicated worker script loading
 // (PlzDedicatedWorker). https://crbug.com/906991
 const base::Feature kPlzDedicatedWorker{"PlzDedicatedWorker",
@@ -280,14 +275,6 @@
 const base::Feature kScrollbarInjectScrollGestures{
     "ScrollbarInjectScrollGestures", base::FEATURE_ENABLED_BY_DEFAULT};
 
-bool IsOffMainThreadSharedWorkerScriptFetchEnabled() {
-  // Off-the-main-thread shared worker script fetch depends on PlzSharedWorker
-  // (NetworkService).
-  return base::FeatureList::IsEnabled(network::features::kNetworkService) &&
-         base::FeatureList::IsEnabled(
-             features::kOffMainThreadSharedWorkerScriptFetch);
-}
-
 bool IsPlzDedicatedWorkerEnabled() {
   // PlzDedicatedWorker depends on off-the-main-thread dedicated worker script
   // fetch and NetworkService.
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 8f6dbb20..590fb8b 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -154,7 +154,6 @@
     "platform/modules/mediastream/web_media_element_source_utils.h",
     "platform/modules/mediastream/web_media_stream_audio_renderer.h",
     "platform/modules/mediastream/web_media_stream_audio_sink.h",
-    "platform/modules/mediastream/web_media_stream_renderer_factory.h",
     "platform/modules/mediastream/web_media_stream_sink.h",
     "platform/modules/mediastream/web_media_stream_video_renderer.h",
     "platform/modules/mediastream/web_platform_media_stream_source.h",
@@ -389,6 +388,7 @@
     "web/modules/mediastream/remote_media_stream_track_adapter.h",
     "web/modules/mediastream/track_audio_renderer.h",
     "web/modules/mediastream/video_track_adapter_settings.h",
+    "web/modules/mediastream/web_media_stream_renderer_factory.h",
     "web/modules/mediastream/web_media_stream_utils.h",
     "web/modules/mediastream/webaudio_media_stream_audio_sink.h",
     "web/modules/mediastream/webmediaplayer_ms.h",
diff --git a/third_party/blink/public/blink_resources.grd b/third_party/blink/public/blink_resources.grd
index 119dda39..4772ffd 100644
--- a/third_party/blink/public/blink_resources.grd
+++ b/third_party/blink/public/blink_resources.grd
@@ -24,7 +24,7 @@
       <include name="IDR_UASTYLE_THEME_INPUT_MULTIPLE_FIELDS_CSS" file="../renderer/core/html/resources/input_multiple_fields.css" type="BINDATA" compress="gzip"/>
       <include name="IDR_UASTYLE_THEME_WIN_CSS" file="../renderer/core/html/resources/win.css" type="BINDATA" compress="gzip"/>
       <include name="IDR_UASTYLE_THEME_WIN_QUIRKS_CSS" file="../renderer/core/html/resources/win_quirks.css" type="BINDATA" compress="gzip"/>
-      <include name="IDR_UASTYLE_THEME_CONTROLS_REFRESH_CSS" file="../renderer/core/html/resources/controls_refresh.css" type="BINDATA" compress="gzip"/>
+      <include name="IDR_UASTYLE_THEME_CONTROLS_REFRESH_CSS" file="../renderer/core/html/resources/controls_refresh.css" flattenhtml="true" type="BINDATA" compress="gzip"/>
       <include name="IDR_UASTYLE_THEME_FORCED_COLORS_CSS" file="../renderer/core/html/resources/forced_colors.css" type="BINDATA" compress="gzip"/>
       <include name="IDR_UASTYLE_SVG_CSS" file="../renderer/core/css/svg.css" type="BINDATA" compress="gzip"/>
       <include name="IDR_UASTYLE_MATHML_CSS" file="../renderer/core/css/mathml.css" type="BINDATA" compress="gzip"/>
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 7ea1cd7..cfd0b93 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -87,9 +87,6 @@
 
 BLINK_COMMON_EXPORT extern const base::Feature kLightweightNoStatePrefetch;
 
-// Returns true when off-the-main-thread shared worker script fetch is enabled.
-BLINK_COMMON_EXPORT bool IsOffMainThreadSharedWorkerScriptFetchEnabled();
-
 // Returns true when PlzDedicatedWorker is enabled.
 BLINK_COMMON_EXPORT bool IsPlzDedicatedWorkerEnabled();
 
diff --git a/third_party/blink/public/mojom/web_feature/web_feature.mojom b/third_party/blink/public/mojom/web_feature/web_feature.mojom
index 5d7059fb..9ea1923 100644
--- a/third_party/blink/public/mojom/web_feature/web_feature.mojom
+++ b/third_party/blink/public/mojom/web_feature/web_feature.mojom
@@ -2358,6 +2358,7 @@
   kDownloadWithoutUserGesture = 2976,
   kAutoplayDynamicDelegation = 2977,
   kToggleEventHandlerDuringParsing = 2978,
+  kFragmentDoubleHash = 2979,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index 1b7a3a96..049aac2b 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -595,6 +595,11 @@
   // May return null if WebRTC functionality is not implemented.
   virtual rtc::Thread* GetWebRtcWorkerThreadRtcThread() { return nullptr; }
 
+  virtual scoped_refptr<base::SingleThreadTaskRunner>
+  GetWebRtcSignalingTaskRunner() {
+    return nullptr;
+  }
+
   // May return null if WebRTC functionality is not implemented.
   virtual std::unique_ptr<cricket::PortAllocator> CreateWebRtcPortAllocator(
       WebLocalFrame* frame);
diff --git a/third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h b/third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h
similarity index 73%
rename from third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h
rename to third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h
index f33ba00b..fd95475 100644
--- a/third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h
+++ b/third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h
@@ -2,15 +2,15 @@
 // 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_PLATFORM_MODULES_MEDIASTREAM_WEB_MEDIA_STREAM_RENDERER_FACTORY_H_
-#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_MEDIASTREAM_WEB_MEDIA_STREAM_RENDERER_FACTORY_H_
+#ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIASTREAM_WEB_MEDIA_STREAM_RENDERER_FACTORY_H_
+#define THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIASTREAM_WEB_MEDIA_STREAM_RENDERER_FACTORY_H_
 
 #include <string>
 
-#include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_audio_renderer.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_video_renderer.h"
+#include "third_party/blink/public/platform/web_common.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -25,7 +25,7 @@
 // video feeds from a MediaStream provided an URL.
 // The factory methods are virtual in order for Blink web tests to be able to
 // override them.
-class WebMediaStreamRendererFactory {
+class BLINK_MODULES_EXPORT WebMediaStreamRendererFactory {
  public:
   virtual ~WebMediaStreamRendererFactory() {}
 
@@ -39,10 +39,13 @@
 
   virtual scoped_refptr<WebMediaStreamAudioRenderer> GetAudioRenderer(
       const WebMediaStream& web_stream,
-      blink::WebLocalFrame* web_frame,
+      WebLocalFrame* web_frame,
       const std::string& device_id) = 0;
 };
 
+BLINK_MODULES_EXPORT std::unique_ptr<WebMediaStreamRendererFactory>
+CreateWebMediaStreamRendererFactory();
+
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_MODULES_MEDIASTREAM_WEB_MEDIA_STREAM_RENDERER_FACTORY_H_
+#endif  // THIRD_PARTY_BLINK_PUBLIC_WEB_MODULES_MEDIASTREAM_WEB_MEDIA_STREAM_RENDERER_FACTORY_H_
diff --git a/third_party/blink/public/web/web_shared_worker_client.h b/third_party/blink/public/web/web_shared_worker_client.h
index f0d5861..3c493fb 100644
--- a/third_party/blink/public/web/web_shared_worker_client.h
+++ b/third_party/blink/public/web/web_shared_worker_client.h
@@ -37,8 +37,6 @@
 
 namespace blink {
 
-class WebServiceWorkerNetworkProvider;
-
 // Provides an interface back to the in-page script object for a worker.
 // All functions are expected to be called back on the thread that created
 // the Worker object, unless noted.
@@ -53,21 +51,11 @@
   virtual void WorkerReadyForInspection() {}
   virtual void WorkerScriptLoadFailed() = 0;
   virtual void WorkerScriptEvaluated(bool success) = 0;
-  // Called on the main thread during initialization, before requesting the main
-  // script resource. Creates the WebServiceWorkerNetworkProvider which is used
-  // for script loading (i.e., the main script and importScripts). Other
-  // requests (e.g., fetch and XHR) go through WebWorkerFetchContext.
-  virtual std::unique_ptr<WebServiceWorkerNetworkProvider>
-  CreateServiceWorkerNetworkProvider() = 0;
 
-  // Called on the main thread during initialization, after the main script
-  // resource finished loading. Creates a new WebWorkerFetchContext for the
-  // shared worker. This is passed to the worker thread and used for non-script
-  // loading requests from the shared worker (e.g., fetch and XHR). Requests for
-  // script loading (i.e., the main script and importScripts) go through
-  // WebServiceWorkerNetworkProvider.
-  virtual scoped_refptr<WebWorkerFetchContext> CreateWorkerFetchContext(
-      WebServiceWorkerNetworkProvider*) = 0;
+  // Called on the main thread during initialization. Creates a new
+  // WebWorkerFetchContext for the shared worker. This is passed to the worker
+  // thread and used loading requests from the shared worker.
+  virtual scoped_refptr<WebWorkerFetchContext> CreateWorkerFetchContext() = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 48f5bc4..bf313ab9 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -708,13 +708,18 @@
     return kPaused;
   if (internal_play_state_ == kIdle)
     return kIdle;
-  if (current_time_pending_ || (!start_time_ && playback_rate_ != 0))
+  if (NeedsCompositorTimeSync())
     return kPending;
   if (Limited())
     return kFinished;
   return kRunning;
 }
 
+Animation::AnimationPlayState Animation::GetPlayState() const {
+  DCHECK_NE(animation_play_state_, kUnset);
+  return animation_play_state_;
+}
+
 // https://drafts.csswg.org/web-animations/#play-states
 Animation::AnimationPlayState Animation::CalculateAnimationPlayState() const {
   // 1. All of the following conditions are true:
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index 326756d..977874e 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -130,7 +130,7 @@
   bool Paused() const { return paused_ && !is_paused_for_testing_; }
   static const char* PlayStateString(AnimationPlayState);
   String playState() const { return PlayStateString(animation_play_state_); }
-  AnimationPlayState PlayStateInternal() const;
+
   bool pending() const;
 
   void pause(ExceptionState& = ASSERT_NO_EXCEPTION);
@@ -147,6 +147,21 @@
     return !(PlayStateInternal() == kIdle || Limited() || paused_ ||
              is_paused_for_testing_);
   }
+
+  // TODO(crbug/960944): Deprecate. This version of the play state is not to
+  // spec due to the inclusion of a 'pending' state. Whether or not an animation
+  // is pending is separate from the actual play state.
+  AnimationPlayState PlayStateInternal() const;
+
+  // Indicates if the animation is out of sync with the compositor. A change to
+  // the play state (running/paused) requires synchronization with the
+  // compositor.
+  bool NeedsCompositorTimeSync() const {
+    return current_time_pending_ || (!start_time_ && playback_rate_ != 0);
+  }
+
+  AnimationPlayState GetPlayState() const;
+
   bool Limited() const { return Limited(CurrentTimeInternal()); }
   bool FinishedInternal() const { return finished_; }
 
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc
index be4f5e1..7d8a482 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -73,10 +73,12 @@
   if (&animation == &animation_to_add)
     return false;
 
-  switch (animation.PlayStateInternal()) {
+  if (animation.NeedsCompositorTimeSync())
+    return true;
+
+  switch (animation.GetPlayState()) {
     case Animation::kIdle:
       return false;
-    case Animation::kPending:
     case Animation::kRunning:
       return true;
     case Animation::kPaused:
diff --git a/third_party/blink/renderer/core/animation/pending_animations.cc b/third_party/blink/renderer/core/animation/pending_animations.cc
index 47aa3066..c202e91 100644
--- a/third_party/blink/renderer/core/animation/pending_animations.cc
+++ b/third_party/blink/renderer/core/animation/pending_animations.cc
@@ -142,8 +142,7 @@
   animations.swap(waiting_for_compositor_animation_start_);
 
   for (auto animation : animations) {
-    if (animation->startTime() ||
-        animation->PlayStateInternal() != Animation::kPending ||
+    if (animation->startTime() || !animation->NeedsCompositorTimeSync() ||
         !animation->timeline() || !animation->timeline()->IsActive()) {
       // Already started or no longer relevant.
       continue;
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index 7c054b10..2a4cb1b6 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -1648,4 +1648,35 @@
   target->getDisplayLockForBindings()->acquire(script_state, &options);
 }
 
+TEST_F(DisplayLockContextRenderingTest,
+       SelectionOnAnonymousColumnSpannerDoesNotCrash) {
+  SetHtmlInnerHTML(R"HTML(
+    <style>
+      #columns {
+        column-count: 5;
+      }
+      #spanner {
+        column-span: all;
+      }
+    </style>
+    <div id="columns">
+      <div id="spanner"></div>
+    </div>
+  )HTML");
+
+  auto* columns_object =
+      GetDocument().getElementById("columns")->GetLayoutObject();
+  LayoutObject* spanner_placeholder_object = nullptr;
+  for (auto* candidate = columns_object->SlowFirstChild(); candidate;
+       candidate = candidate->NextSibling()) {
+    if (candidate->IsLayoutMultiColumnSpannerPlaceholder()) {
+      spanner_placeholder_object = candidate;
+      break;
+    }
+  }
+
+  ASSERT_TRUE(spanner_placeholder_object);
+  EXPECT_FALSE(spanner_placeholder_object->CanBeSelectionLeaf());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
index 3103559..45dc269 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
@@ -201,6 +201,27 @@
   return nullptr;
 }
 
+Element* DisplayLockUtilities::NearestLockedInclusiveAncestor(
+    const LayoutObject& object) {
+  auto* node = object.GetNode();
+  auto* ancestor = object.Parent();
+  while (ancestor && !node) {
+    node = ancestor->GetNode();
+    ancestor = ancestor->Parent();
+  }
+  return node ? NearestLockedInclusiveAncestor(*node) : nullptr;
+}
+
+Element* DisplayLockUtilities::NearestLockedExclusiveAncestor(
+    const LayoutObject& object) {
+  if (auto* node = object.GetNode())
+    return NearestLockedExclusiveAncestor(*node);
+  // Since we now navigate to an ancestor, use the inclusive version.
+  if (auto* parent = object.Parent())
+    return NearestLockedInclusiveAncestor(*parent);
+  return nullptr;
+}
+
 bool DisplayLockUtilities::IsInLockedSubtreeCrossingFrames(
     const Node& source_node) {
   if (!RuntimeEnabledFeatures::DisplayLockingEnabled())
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities.h b/third_party/blink/renderer/core/display_lock/display_lock_utilities.h
index 9447447..3944b4e 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_utilities.h
+++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities.h
@@ -60,6 +60,10 @@
   // Returns the highest exclusive ancestor of |node| that is display locked.
   static Element* HighestLockedExclusiveAncestor(const Node& node);
 
+  // LayoutObject versions of the NearestLocked* ancestor functions.
+  static Element* NearestLockedInclusiveAncestor(const LayoutObject& object);
+  static Element* NearestLockedExclusiveAncestor(const LayoutObject& object);
+
   // Returns true if the element is in a locked subtree (or is self-locked with
   // no self-updates). This crosses frames while navigating the ancestor chain.
   static bool IsInLockedSubtreeCrossingFrames(const Node& node);
diff --git a/third_party/blink/renderer/core/editing/visible_units.cc b/third_party/blink/renderer/core/editing/visible_units.cc
index 80585db..43363f0 100644
--- a/third_party/blink/renderer/core/editing/visible_units.cc
+++ b/third_party/blink/renderer/core/editing/visible_units.cc
@@ -655,7 +655,7 @@
         layout_object->Style()->Visibility() != EVisibility::kVisible)
       continue;
 
-    if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*current_node))
+    if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*layout_object))
       continue;
 
     if (rule == kCanCrossEditingBoundary && boundary_crossed) {
@@ -734,7 +734,7 @@
   if (!first_letter || first_letter == remaining_text)
     return false;
   return first_letter->StyleRef().Visibility() != EVisibility::kVisible ||
-         DisplayLockUtilities::NearestLockedExclusiveAncestor(*node);
+         DisplayLockUtilities::NearestLockedExclusiveAncestor(*first_letter);
 }
 }  // namespace
 
@@ -805,7 +805,7 @@
         layout_object->Style()->Visibility() != EVisibility::kVisible)
       continue;
 
-    if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*current_node))
+    if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*layout_object))
       continue;
 
     if (rule == kCanCrossEditingBoundary && boundary_crossed)
@@ -902,7 +902,7 @@
   if (layout_object->Style()->Visibility() != EVisibility::kVisible)
     return false;
 
-  if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*anchor_node))
+  if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*layout_object))
     return false;
 
   if (layout_object->IsBR()) {
diff --git a/third_party/blink/renderer/core/execution_context/window_agent_factory.cc b/third_party/blink/renderer/core/execution_context/window_agent_factory.cc
index 169e36b..4267ac4 100644
--- a/third_party/blink/renderer/core/execution_context/window_agent_factory.cc
+++ b/third_party/blink/renderer/core/execution_context/window_agent_factory.cc
@@ -4,9 +4,11 @@
 
 #include "third_party/blink/renderer/core/execution_context/window_agent_factory.h"
 #include "third_party/blink/renderer/core/execution_context/window_agent.h"
+#include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin_hash.h"
 #include "third_party/blink/renderer/platform/wtf/hash_functions.h"
+#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 
 namespace blink {
@@ -44,8 +46,18 @@
   if (registrable_domain.IsNull())
     registrable_domain = origin->Host();
 
+  TupleOriginAgents* tuple_origin_agents = &tuple_origin_agents_;
+
+  // All chrome extensions need to share the same agent because they can
+  // access each other's windows directly.
+  if (origin->Protocol() == "chrome-extension") {
+    DEFINE_STATIC_LOCAL(Persistent<TupleOriginAgents>, static_origin_agents,
+                        (MakeGarbageCollected<TupleOriginAgents>()));
+    tuple_origin_agents = static_origin_agents;
+  }
+
   SchemeAndRegistrableDomain key(origin->Protocol(), registrable_domain);
-  auto inserted = tuple_origin_agents_.insert(key, nullptr);
+  auto inserted = tuple_origin_agents->insert(key, nullptr);
   if (inserted.is_new_entry)
     inserted.stored_value->value = MakeGarbageCollected<WindowAgent>(isolate);
   return inserted.stored_value->value;
diff --git a/third_party/blink/renderer/core/execution_context/window_agent_factory.h b/third_party/blink/renderer/core/execution_context/window_agent_factory.h
index 092b1d8..c289564 100644
--- a/third_party/blink/renderer/core/execution_context/window_agent_factory.h
+++ b/third_party/blink/renderer/core/execution_context/window_agent_factory.h
@@ -99,11 +99,11 @@
       opaque_origin_agents_;
 
   // Use registerable domain as the key for general tuple origins.
-  HeapHashMap<SchemeAndRegistrableDomain,
-              WeakMember<WindowAgent>,
-              SchemeAndRegistrableDomainHash,
-              SchemeAndRegistrableDomainTraits>
-      tuple_origin_agents_;
+  using TupleOriginAgents = HeapHashMap<SchemeAndRegistrableDomain,
+                                        WeakMember<WindowAgent>,
+                                        SchemeAndRegistrableDomainHash,
+                                        SchemeAndRegistrableDomainTraits>;
+  TupleOriginAgents tuple_origin_agents_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
index 720ae27..f089455 100644
--- a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
@@ -161,10 +161,10 @@
   }
 
   if (DrawingRecorder::UseCachedDrawingIfPossible(
-          context, *GetLayoutEmbeddedContent(), DisplayItem::kWebPlugin))
+          context, *element_->GetLayoutObject(), DisplayItem::kWebPlugin))
     return;
 
-  DrawingRecorder recorder(context, *GetLayoutEmbeddedContent(),
+  DrawingRecorder recorder(context, *element_->GetLayoutObject(),
                            DisplayItem::kWebPlugin);
   context.Save();
 
@@ -193,7 +193,7 @@
   if (!IsAttached())
     return;
 
-  LayoutBox* layout_object = GetLayoutEmbeddedContent();
+  LayoutBox* layout_object = ToLayoutBox(element_->GetLayoutObject());
   if (!layout_object)
     return;
 
@@ -371,11 +371,11 @@
 
 void WebPluginContainerImpl::PrintPage(int page_number, GraphicsContext& gc) {
   if (DrawingRecorder::UseCachedDrawingIfPossible(
-          gc, *GetLayoutEmbeddedContent(), DisplayItem::kWebPlugin))
+          gc, *element_->GetLayoutObject(), DisplayItem::kWebPlugin))
     return;
 
   // TODO(wkorman): Do we still need print_rect at all?
-  DrawingRecorder recorder(gc, *GetLayoutEmbeddedContent(),
+  DrawingRecorder recorder(gc, *element_->GetLayoutObject(),
                            DisplayItem::kWebPlugin);
   gc.Save();
 
@@ -648,14 +648,14 @@
     const WebPoint& point_in_root_frame) {
   WebPoint point_in_content =
       ParentFrameView()->ConvertFromRootFrame(point_in_root_frame);
-  return RoundedIntPoint(GetLayoutEmbeddedContent()->AbsoluteToLocalPoint(
+  return RoundedIntPoint(element_->GetLayoutObject()->AbsoluteToLocalPoint(
       PhysicalOffset(point_in_content)));
 }
 
 WebPoint WebPluginContainerImpl::LocalToRootFramePoint(
     const WebPoint& point_in_local) {
   IntPoint absolute_point =
-      RoundedIntPoint(GetLayoutEmbeddedContent()->LocalToAbsolutePoint(
+      RoundedIntPoint(element_->GetLayoutObject()->LocalToAbsolutePoint(
           PhysicalOffset(point_in_local)));
   return ParentFrameView()->ConvertToRootFrame(absolute_point);
 }
@@ -799,7 +799,7 @@
 
   // TODO(dtapuska): Move WebMouseEventBuilder into the anonymous namespace
   // in this class.
-  WebMouseEventBuilder transformed_event(parent, GetLayoutEmbeddedContent(),
+  WebMouseEventBuilder transformed_event(parent, element_->GetLayoutObject(),
                                          event);
   if (transformed_event.GetType() == WebInputEvent::kUndefined)
     return;
@@ -861,7 +861,7 @@
       ParentFrameView()->ConvertFromRootFrame(absolute_location);
 
   FloatPoint local_point =
-      GetLayoutEmbeddedContent()->AbsoluteToLocalFloatPoint(absolute_location);
+      element_->GetLayoutObject()->AbsoluteToLocalFloatPoint(absolute_location);
   WebMouseWheelEvent translated_event = event.NativeEvent().FlattenTransform();
   translated_event.SetPositionInWidget(local_point.X(), local_point.Y());
 
@@ -956,7 +956,7 @@
     absolute_location = parent->ConvertFromRootFrame(absolute_location);
 
     FloatPoint local_point =
-        GetLayoutEmbeddedContent()->AbsoluteToLocalFloatPoint(
+        element_->GetLayoutObject()->AbsoluteToLocalFloatPoint(
             absolute_location);
     transformed_event.touches[i].SetPositionInWidget(local_point);
   }
@@ -1018,7 +1018,7 @@
   WebFloatPoint absolute_root_frame_location =
       event.NativeEvent().PositionInRootFrame();
   FloatPoint local_point =
-      GetLayoutEmbeddedContent()->AbsoluteToLocalFloatPoint(
+      element_->GetLayoutObject()->AbsoluteToLocalFloatPoint(
           absolute_root_frame_location);
   translated_event.FlattenTransform();
   translated_event.SetPositionInWidget(local_point);
@@ -1035,7 +1035,7 @@
 }
 
 void WebPluginContainerImpl::SynthesizeMouseEventIfPossible(TouchEvent& event) {
-  WebMouseEventBuilder web_event(ParentFrameView(), GetLayoutEmbeddedContent(),
+  WebMouseEventBuilder web_event(ParentFrameView(), element_->GetLayoutObject(),
                                  event);
   if (web_event.GetType() == WebInputEvent::kUndefined)
     return;
@@ -1112,7 +1112,7 @@
   // GetDocument().LayoutView() can be null when we receive messages from the
   // plugins while we are destroying a frame.
   // TODO: Can we just check element_->GetDocument().IsActive() ?
-  if (GetLayoutEmbeddedContent()->GetDocument().GetLayoutView()) {
+  if (element_->GetLayoutObject()->GetDocument().GetLayoutView()) {
     // Take our element and get the clip rect from the enclosing layer and
     // frame view.
     ComputeClipRectsForPlugin(element_, window_rect, clip_rect,
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
index dd35ad24..d2ecfc3e 100644
--- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -32,8 +32,6 @@
 
 #include <memory>
 #include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "services/network/public/mojom/fetch_api.mojom-blink.h"
-#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/mojom/devtools/devtools_agent.mojom-blink.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
 #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h"
@@ -55,14 +53,12 @@
 #include "third_party/blink/renderer/core/loader/frame_load_request.h"
 #include "third_party/blink/renderer/core/loader/frame_loader.h"
 #include "third_party/blink/renderer/core/loader/worker_resource_timing_notifier_impl.h"
-#include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/core/script/script.h"
 #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
 #include "third_party/blink/renderer/core/workers/parent_execution_context_task_runners.h"
 #include "third_party/blink/renderer/core/workers/shared_worker_content_settings_proxy.h"
 #include "third_party/blink/renderer/core/workers/shared_worker_global_scope.h"
 #include "third_party/blink/renderer/core/workers/shared_worker_thread.h"
-#include "third_party/blink/renderer/core/workers/worker_classic_script_loader.h"
 #include "third_party/blink/renderer/core/workers/worker_content_settings_client.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
@@ -108,16 +104,6 @@
     // |this| is deleted at this point.
     return;
   }
-  if (main_script_loader_) {
-    main_script_loader_->Cancel();
-    main_script_loader_ = nullptr;
-    client_->WorkerScriptLoadFailed();
-    // The worker thread hasn't been started yet. Immediately notify the client
-    // of worker termination.
-    client_->WorkerContextDestroyed();
-    // |this| is deleted at this point.
-    return;
-  }
   if (worker_thread_) {
     worker_thread_->Terminate();
     DevToolsAgent::WorkerThreadTerminated(shadow_page_->GetDocument(),
@@ -127,33 +113,12 @@
 
 void WebSharedWorkerImpl::OnShadowPageInitialized() {
   DCHECK(IsMainThread());
-  DCHECK(!main_script_loader_);
 
   // This shadow page's address space will be used for creating outside
   // FetchClientSettingsObject.
   shadow_page_->GetDocument()->SetAddressSpace(creation_address_space_);
 
-  shadow_page_->DocumentLoader()->SetServiceWorkerNetworkProvider(
-      client_->CreateServiceWorkerNetworkProvider());
-
-  if (features::IsOffMainThreadSharedWorkerScriptFetchEnabled()) {
-    // Bypass main script loading on the main thread.
-    ContinueStartWorkerContext();
-    return;
-  }
-
-  main_script_loader_ = MakeGarbageCollected<WorkerClassicScriptLoader>();
-  main_script_loader_->LoadTopLevelScriptAsynchronously(
-      *shadow_page_->GetDocument(), shadow_page_->GetDocument()->Fetcher(),
-      script_request_url_, mojom::RequestContextType::SHARED_WORKER,
-      network::mojom::RequestMode::kSameOrigin,
-      network::mojom::CredentialsMode::kSameOrigin,
-      Bind(&WebSharedWorkerImpl::DidReceiveScriptLoaderResponse,
-           WTF::Unretained(this)),
-      Bind(&WebSharedWorkerImpl::OnScriptLoaderFinished,
-           WTF::Unretained(this)));
-  // Do nothing here since OnScriptLoaderFinished() might have been already
-  // invoked and |this| might have been deleted at this point.
+  ContinueStartWorkerContext();
 }
 
 void WebSharedWorkerImpl::ResumeStartup() {
@@ -275,41 +240,10 @@
   shadow_page_->Initialize(script_request_url_);
 }
 
-void WebSharedWorkerImpl::DidReceiveScriptLoaderResponse() {
-  DCHECK(IsMainThread());
-  probe::DidReceiveScriptResponse(shadow_page_->GetDocument(),
-                                  main_script_loader_->Identifier());
-}
-
-void WebSharedWorkerImpl::OnScriptLoaderFinished() {
-  DCHECK(IsMainThread());
-  DCHECK(main_script_loader_);
-  if (asked_to_terminate_)
-    return;
-  if (main_script_loader_->Failed()) {
-    main_script_loader_->Cancel();
-    main_script_loader_ = nullptr;
-    client_->WorkerScriptLoadFailed();
-    // The worker thread hasn't been started yet. Immediately notify the client
-    // of worker termination.
-    client_->WorkerContextDestroyed();
-    // |this| is deleted at this point.
-    return;
-  }
-  DidFetchScript(main_script_loader_->AppCacheID());
-  probe::ScriptImported(shadow_page_->GetDocument(),
-                        main_script_loader_->Identifier(),
-                        main_script_loader_->SourceText());
-
-  ContinueStartWorkerContext();
-}
-
 void WebSharedWorkerImpl::OnAppCacheSelected() {
   DCHECK(IsMainThread());
-  if (features::IsOffMainThreadSharedWorkerScriptFetchEnabled()) {
-    DCHECK(GetWorkerThread());
-    GetWorkerThread()->OnAppCacheSelected();
-  }
+  DCHECK(GetWorkerThread());
+  GetWorkerThread()->OnAppCacheSelected();
 }
 
 void WebSharedWorkerImpl::ContinueStartWorkerContext() {
@@ -335,8 +269,7 @@
           document->Fetcher()->GetProperties().GetFetchClientSettingsObject());
 
   scoped_refptr<WebWorkerFetchContext> web_worker_fetch_context =
-      client_->CreateWorkerFetchContext(
-          shadow_page_->DocumentLoader()->GetServiceWorkerNetworkProvider());
+      client_->CreateWorkerFetchContext();
   DCHECK(web_worker_fetch_context);
   web_worker_fetch_context->SetApplicationCacheHostID(
       document->Loader()->GetApplicationCacheHost()->GetHostID());
@@ -352,65 +285,24 @@
       false /* strictly_block_blockable_mixed_content */,
       GenericFontFamilySettings());
 
-  if (features::IsOffMainThreadSharedWorkerScriptFetchEnabled()) {
-    // Off-the-main-thread script fetch:
-    // Some params (e.g., referrer policy, address space, CSP) passed to
-    // GlobalScopeCreationParams are dummy values. They will be updated after
-    // worker script fetch on the worker thread.
-    // TODO(nhiroki): Currently |origin_trial_tokens| is not updated after
-    // worker script fetch. Update them.
-    auto creation_params = std::make_unique<GlobalScopeCreationParams>(
-        script_request_url_, script_type,
-        OffMainThreadWorkerScriptFetchOption::kEnabled, name_,
-        document->UserAgent(), std::move(web_worker_fetch_context),
-        Vector<CSPHeaderAndType>(), network::mojom::ReferrerPolicy::kDefault,
-        outside_settings_object->GetSecurityOrigin(),
-        document->IsSecureContext(), outside_settings_object->GetHttpsState(),
-        CreateWorkerClients(), base::nullopt /* response_address_space */,
-        nullptr /* origin_trial_tokens */, devtools_worker_token_,
-        std::move(worker_settings), kV8CacheOptionsDefault,
-        nullptr /* worklet_module_response_map */,
-        std::move(pending_interface_provider_), BeginFrameProviderParams(),
-        nullptr /* parent_feature_policy */, base::UnguessableToken());
-    StartWorkerThread(std::move(creation_params), script_request_url_,
-                      String() /* source_code */, *outside_settings_object);
-    return;
-  }
-
-  // On-the-main-thread script fetch:
-  DCHECK(main_script_loader_);
-  DCHECK(!main_script_loader_->Failed());
-
-  WebURL script_response_url = main_script_loader_->ResponseURL();
-  DCHECK(script_request_url_ == script_response_url ||
-         SecurityOrigin::AreSameSchemeHostPort(script_request_url_,
-                                               script_response_url));
-  auto referrer_policy = network::mojom::ReferrerPolicy::kDefault;
-  if (!main_script_loader_->GetReferrerPolicy().IsNull()) {
-    SecurityPolicy::ReferrerPolicyFromHeaderValue(
-        main_script_loader_->GetReferrerPolicy(),
-        kDoNotSupportReferrerPolicyLegacyKeywords, &referrer_policy);
-  }
-  ContentSecurityPolicy* content_security_policy =
-      main_script_loader_->GetContentSecurityPolicy();
-
+  // Some params (e.g., referrer policy, address space, CSP) passed to
+  // GlobalScopeCreationParams are dummy values. They will be updated after
+  // worker script fetch on the worker thread.
   auto creation_params = std::make_unique<GlobalScopeCreationParams>(
-      script_response_url, script_type,
-      OffMainThreadWorkerScriptFetchOption::kDisabled, name_,
+      script_request_url_, script_type,
+      OffMainThreadWorkerScriptFetchOption::kEnabled, name_,
       document->UserAgent(), std::move(web_worker_fetch_context),
-      content_security_policy ? content_security_policy->Headers()
-                              : Vector<CSPHeaderAndType>(),
-      referrer_policy, outside_settings_object->GetSecurityOrigin(),
-      document->IsSecureContext(), outside_settings_object->GetHttpsState(),
-      CreateWorkerClients(), main_script_loader_->ResponseAddressSpace(),
-      main_script_loader_->OriginTrialTokens(), devtools_worker_token_,
+      Vector<CSPHeaderAndType>(), network::mojom::ReferrerPolicy::kDefault,
+      outside_settings_object->GetSecurityOrigin(), document->IsSecureContext(),
+      outside_settings_object->GetHttpsState(), CreateWorkerClients(),
+      base::nullopt /* response_address_space */,
+      nullptr /* origin_trial_tokens */, devtools_worker_token_,
       std::move(worker_settings), kV8CacheOptionsDefault,
       nullptr /* worklet_module_response_map */,
-      std::move(pending_interface_provider_));
-  StartWorkerThread(std::move(creation_params), script_response_url,
-                    main_script_loader_->SourceText(),
-                    *outside_settings_object);
-  main_script_loader_ = nullptr;
+      std::move(pending_interface_provider_), BeginFrameProviderParams(),
+      nullptr /* parent_feature_policy */, base::UnguessableToken());
+  StartWorkerThread(std::move(creation_params), script_request_url_,
+                    String() /* source_code */, *outside_settings_object);
 }
 
 void WebSharedWorkerImpl::StartWorkerThread(
@@ -433,25 +325,14 @@
   GetWorkerThread()->Start(std::move(global_scope_creation_params),
                            thread_startup_data, std::move(devtools_params),
                            parent_execution_context_task_runners_);
-  // TODO(nhiroki): Support module workers (https://crbug.com/680046).
-  if (features::IsOffMainThreadSharedWorkerScriptFetchEnabled()) {
-    // The script has not yet been fetched. Fetch it now.
 
-    // Currently we don't plumb performance timing for toplevel shared worker
-    // script fetch. https://crbug.com/954005
-    auto* resource_timing_notifier =
-        MakeGarbageCollected<NullWorkerResourceTimingNotifier>();
-    GetWorkerThread()->FetchAndRunClassicScript(
-        script_request_url_, outside_settings_object, *resource_timing_notifier,
-        v8_inspector::V8StackTraceId());
-    // We continue in WorkerGlobalScope::EvaluateClassicScript() on the worker
-    // thread.
-  } else {
-    // The script was already fetched on the main thread. Evaluate it now.
-    GetWorkerThread()->EvaluateClassicScript(script_response_url, source_code,
-                                             nullptr /* cached_meta_data */,
-                                             v8_inspector::V8StackTraceId());
-  }
+  // Currently we don't plumb performance timing for toplevel shared worker
+  // script fetch. https://crbug.com/954005
+  auto* resource_timing_notifier =
+      MakeGarbageCollected<NullWorkerResourceTimingNotifier>();
+  GetWorkerThread()->FetchAndRunClassicScript(
+      script_request_url_, outside_settings_object, *resource_timing_notifier,
+      v8_inspector::V8StackTraceId());
 }
 
 WorkerClients* WebSharedWorkerImpl::CreateWorkerClients() {
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.h b/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
index e7bfc5e..65926081 100644
--- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
+++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
@@ -63,7 +63,6 @@
 class WebSharedWorkerClient;
 class WebString;
 class WebURL;
-class WorkerClassicScriptLoader;
 
 // This class is used by the worker process code to talk to the SharedWorker
 // implementation. This is basically accessed on the main thread, but some
@@ -122,8 +121,6 @@
   // Shuts down the worker thread.
   void TerminateWorkerThread();
 
-  void DidReceiveScriptLoaderResponse();
-  void OnScriptLoaderFinished();
   void OnAppCacheSelected();
   void ContinueStartWorkerContext();
   void StartWorkerThread(
@@ -151,9 +148,6 @@
   bool pause_worker_context_on_start_ = false;
   bool is_paused_on_start_ = false;
 
-  // Kept around only while main script loading is ongoing.
-  Persistent<WorkerClassicScriptLoader> main_script_loader_;
-
   WebURL script_request_url_;
   WebString name_;
   mojom::IPAddressSpace creation_address_space_;
diff --git a/third_party/blink/renderer/core/frame/frame_view.cc b/third_party/blink/renderer/core/frame/frame_view.cc
index d19944e5..090ed13 100644
--- a/third_party/blink/renderer/core/frame/frame_view.cc
+++ b/third_party/blink/renderer/core/frame/frame_view.cc
@@ -41,9 +41,7 @@
   // We check the inclusive ancestor to determine whether the subtree is locked,
   // since the contents of the frame are in the subtree of the frame, so they
   // would be locked if the frame owner is itself locked.
-  return owner && owner->GetNode() &&
-         DisplayLockUtilities::NearestLockedInclusiveAncestor(
-             *owner->GetNode());
+  return owner && DisplayLockUtilities::NearestLockedInclusiveAncestor(*owner);
 }
 
 void FrameView::UpdateViewportIntersection(unsigned flags,
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
index b9b75086..1464bb6 100644
--- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
+++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -366,15 +366,17 @@
       MakeGarbageCollected<DateTimeEditElement, Document&,
                            DateTimeEditElement::EditControlOwner&>(document,
                                                                    *this));
-  GetElement().UpdateView();
-  container->AppendChild(
-      MakeGarbageCollected<ClearButtonElement, Document&,
-                           ClearButtonElement::ClearButtonOwner&>(document,
+  if (!RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    GetElement().UpdateView();
+    container->AppendChild(
+        MakeGarbageCollected<ClearButtonElement, Document&,
+                             ClearButtonElement::ClearButtonOwner&>(document,
+                                                                    *this));
+    container->AppendChild(
+        MakeGarbageCollected<SpinButtonElement, Document&,
+                             SpinButtonElement::SpinButtonOwner&>(document,
                                                                   *this));
-  container->AppendChild(
-      MakeGarbageCollected<SpinButtonElement, Document&,
-                           SpinButtonElement::SpinButtonOwner&>(document,
-                                                                *this));
+  }
 
   if (LayoutTheme::GetTheme().SupportsCalendarPicker(
           input_type_->FormControlType()))
@@ -446,7 +448,8 @@
 
 void MultipleFieldsTemporalInputTypeView::DisabledAttributeChanged() {
   EventQueueScope scope;
-  GetSpinButtonElement()->ReleaseCapture();
+  if (SpinButtonElement* spin_button = GetSpinButtonElement())
+    spin_button->ReleaseCapture();
   if (DateTimeEditElement* edit = GetDateTimeEditElement())
     edit->DisabledStateChanged();
 }
@@ -492,7 +495,8 @@
 
 void MultipleFieldsTemporalInputTypeView::ReadonlyAttributeChanged() {
   EventQueueScope scope;
-  GetSpinButtonElement()->ReleaseCapture();
+  if (SpinButtonElement* spin_button = GetSpinButtonElement())
+    spin_button->ReleaseCapture();
   if (DateTimeEditElement* edit = GetDateTimeEditElement())
     edit->ReadOnlyStateChanged();
 }
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.cc b/third_party/blink/renderer/core/html/forms/password_input_type.cc
index 13f82af..ee73bd12 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.cc
@@ -33,11 +33,16 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/dom/dom_token_list.h"
+#include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
+#include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
+#include "third_party/blink/renderer/core/geometry/dom_rect.h"
 #include "third_party/blink/renderer/core/html/forms/form_controller.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
+#include "third_party/blink/renderer/core/html/shadow/shadow_element_names.h"
 #include "third_party/blink/renderer/core/input_type_names.h"
 #include "third_party/blink/renderer/core/layout/layout_text_control_single_line.h"
 #include "third_party/blink/renderer/platform/wtf/assertions.h"
@@ -73,4 +78,126 @@
   return false;
 }
 
+bool PasswordInputType::NeedsContainer() const {
+  return RuntimeEnabledFeatures::FormControlsRefreshEnabled();
+}
+
+void PasswordInputType::CreateShadowSubtree() {
+  BaseTextInputType::CreateShadowSubtree();
+
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    Element* container = ContainerElement();
+    Element* view_port = GetElement().UserAgentShadowRoot()->getElementById(
+        shadow_element_names::EditingViewPort());
+    DCHECK(container);
+    DCHECK(view_port);
+    container->InsertBefore(MakeGarbageCollected<PasswordRevealButtonElement>(
+                                GetElement().GetDocument()),
+                            view_port->nextSibling());
+  }
+}
+
+void PasswordInputType::DidSetValueByUserEdit() {
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    // If the last character is deleted, we hide the reveal button.
+    if (GetElement().value().IsEmpty()) {
+      should_show_reveal_button_ = false;
+    }
+    UpdatePasswordRevealButton();
+  }
+  BaseTextInputType::DidSetValueByUserEdit();
+}
+
+void PasswordInputType::DidSetValue(const String& string, bool value_changed) {
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    if (value_changed) {
+      // Hide the password if the value is changed by script.
+      should_show_reveal_button_ = false;
+      UpdatePasswordRevealButton();
+    }
+  }
+  BaseTextInputType::DidSetValue(string, value_changed);
+}
+
+void PasswordInputType::UpdateView() {
+  BaseTextInputType::UpdateView();
+
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+    UpdatePasswordRevealButton();
+}
+
+void PasswordInputType::UpdatePasswordRevealButton() {
+  Element* button = GetElement().UserAgentShadowRoot()->getElementById(
+      shadow_element_names::PasswordRevealButton());
+
+  // Update the glyph.
+  const AtomicString reveal("reveal");
+  if (GetElement().ShouldRevealPassword())
+    button->classList().Add(reveal);
+  else
+    button->classList().Remove(reveal);
+
+  // Update the visibility.
+  if (should_show_reveal_button_) {
+    // Show the reveal button only when the width is enough for the reveal
+    // button plus a few characters. (The number of characters slightly varies
+    // based on the font size/family).
+    const float kRevealButtonWidthEm = 1.3;  // 1.3em
+    const float kPasswordMinWidthEm =
+        0.7;                       // 0.7em which is enough for ~2 chars.
+    const int kLeftMarginPx = 3;   // 3px
+    const int kRightMarginPx = 3;  // 3px
+    float current_width = GetElement().getBoundingClientRect()->width();
+    float width_needed = GetElement().ComputedStyleRef().FontSize() *
+                             (kRevealButtonWidthEm + kPasswordMinWidthEm) +
+                         kLeftMarginPx + kRightMarginPx;
+
+    if (current_width >= width_needed) {
+      button->RemoveInlineStyleProperty(CSSPropertyID::kDisplay);
+    }
+  } else {
+    button->SetInlineStyleProperty(CSSPropertyID::kDisplay, CSSValueID::kNone);
+    // Always obscure password when the reveal button is hidden.
+    // (ex. out of focus)
+    GetElement().SetShouldRevealPassword(false);
+  }
+}
+
+void PasswordInputType::HandleBlurEvent() {
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    should_show_reveal_button_ = false;
+    UpdatePasswordRevealButton();
+  }
+
+  BaseTextInputType::HandleBlurEvent();
+}
+
+void PasswordInputType::HandleBeforeTextInsertedEvent(
+    BeforeTextInsertedEvent& event) {
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    // This is the only scenario we go from no reveal button to showing the
+    // reveal button: the password is empty and we have some user input.
+    if (GetElement().value().IsEmpty())
+      should_show_reveal_button_ = true;
+  }
+
+  TextFieldInputType::HandleBeforeTextInsertedEvent(event);
+}
+
+void PasswordInputType::HandleKeydownEvent(KeyboardEvent& event) {
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled()) {
+    if (should_show_reveal_button_) {
+      // Alt-F8 to reveal/obscure password
+      if (event.getModifierState("Alt") && event.key() == "F8") {
+        GetElement().SetShouldRevealPassword(
+            !GetElement().ShouldRevealPassword());
+        UpdatePasswordRevealButton();
+        event.SetDefaultHandled();
+      }
+    }
+  }
+
+  if (!event.DefaultHandled())
+    BaseTextInputType::HandleKeydownEvent(event);
+}
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/password_input_type.h b/third_party/blink/renderer/core/html/forms/password_input_type.h
index 33997fcf..10804fb4 100644
--- a/third_party/blink/renderer/core/html/forms/password_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/password_input_type.h
@@ -35,6 +35,8 @@
 
 namespace blink {
 
+class KeyboardEvent;
+
 class PasswordInputType final : public BaseTextInputType {
  public:
   explicit PasswordInputType(HTMLInputElement& element)
@@ -47,6 +49,21 @@
   FormControlState SaveFormControlState() const override;
   void RestoreFormControlState(const FormControlState&) override;
   bool ShouldRespectListAttribute() override;
+
+  bool NeedsContainer() const override;
+  void CreateShadowSubtree() override;
+
+  void UpdateView() override;
+  void UpdatePasswordRevealButton();
+  void DidSetValueByUserEdit() override;
+  void DidSetValue(const String&, bool value_changed) override;
+
+  void HandleKeydownEvent(KeyboardEvent&) override;
+  void HandleBeforeTextInsertedEvent(BeforeTextInsertedEvent&) override;
+
+  void HandleBlurEvent() override;
+
+  bool should_show_reveal_button_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc b/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
index 6f3673eb..661eb8c 100644
--- a/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
+++ b/third_party/blink/renderer/core/html/forms/picker_indicator_element.cc
@@ -57,8 +57,12 @@
   DCHECK(!chooser_);
 }
 
-LayoutObject* PickerIndicatorElement::CreateLayoutObject(const ComputedStyle&,
-                                                         LegacyLayout) {
+LayoutObject* PickerIndicatorElement::CreateLayoutObject(
+    const ComputedStyle& style,
+    LegacyLayout legacy) {
+  if (RuntimeEnabledFeatures::FormControlsRefreshEnabled())
+    return HTMLDivElement::CreateLayoutObject(style, legacy);
+
   return new LayoutDetailsMarker(this);
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
index 439e5b8..fdaf84b 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
@@ -29,6 +29,7 @@
 #include "third_party/blink/renderer/core/css/resolver/style_adjuster.h"
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 #include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/dom/dom_token_list.h"
 #include "third_party/blink/renderer/core/dom/node_computed_style.h"
 #include "third_party/blink/renderer/core/events/mouse_event.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
@@ -178,7 +179,7 @@
           ComputedStyleInitialValues::InitialLineHeight());
     }
 
-    if (ToHTMLInputElement(host)->ShouldRevealPassword())
+    if (To<HTMLInputElement>(host)->ShouldRevealPassword())
       text_block_style->SetTextSecurity(ETextSecurity::kNone);
 
     text_block_style->SetOverflowX(EOverflow::kScroll);
@@ -205,7 +206,7 @@
 
 void SearchFieldCancelButtonElement::DefaultEventHandler(Event& event) {
   // If the element is visible, on mouseup, clear the value, and set selection
-  HTMLInputElement* input(ToHTMLInputElement(OwnerShadowHost()));
+  auto* input = To<HTMLInputElement>(OwnerShadowHost());
   if (!input || input->IsDisabledOrReadOnly()) {
     if (!event.DefaultHandled())
       HTMLDivElement::DefaultEventHandler(event);
@@ -226,11 +227,48 @@
 }
 
 bool SearchFieldCancelButtonElement::WillRespondToMouseClickEvents() {
-  const HTMLInputElement* input = ToHTMLInputElement(OwnerShadowHost());
+  auto* input = To<HTMLInputElement>(OwnerShadowHost());
   if (input && !input->IsDisabledOrReadOnly())
     return true;
 
   return HTMLDivElement::WillRespondToMouseClickEvents();
 }
 
+// ----------------------------
+
+PasswordRevealButtonElement::PasswordRevealButtonElement(Document& document)
+    : HTMLDivElement(document) {
+  SetShadowPseudoId(AtomicString("-internal-reveal"));
+  setAttribute(kIdAttr, shadow_element_names::PasswordRevealButton());
+}
+
+void PasswordRevealButtonElement::DefaultEventHandler(Event& event) {
+  auto* input = To<HTMLInputElement>(OwnerShadowHost());
+  if (!input || input->IsDisabledOrReadOnly()) {
+    if (!event.DefaultHandled())
+      HTMLDivElement::DefaultEventHandler(event);
+    return;
+  }
+
+  // Toggle the should-reveal-password state when clicked.
+  if (event.type() == event_type_names::kClick && event.IsMouseEvent()) {
+    bool shouldRevealPassword = !input->ShouldRevealPassword();
+
+    input->SetShouldRevealPassword(shouldRevealPassword);
+    input->UpdateView();
+
+    event.SetDefaultHandled();
+  }
+
+  if (!event.DefaultHandled())
+    HTMLDivElement::DefaultEventHandler(event);
+}
+
+bool PasswordRevealButtonElement::WillRespondToMouseClickEvents() {
+  auto* input = To<HTMLInputElement>(OwnerShadowHost());
+  if (input && !input->IsDisabledOrReadOnly())
+    return true;
+
+  return HTMLDivElement::WillRespondToMouseClickEvents();
+}
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h
index 8d7c67b..cd0ad1b9 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h
+++ b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.h
@@ -82,6 +82,17 @@
   bool SupportsFocus() const override { return false; }
 };
 
+class PasswordRevealButtonElement final : public HTMLDivElement {
+ public:
+  explicit PasswordRevealButtonElement(Document&);
+
+  void DefaultEventHandler(Event&) override;
+  bool WillRespondToMouseClickEvents() override;
+
+ private:
+  bool SupportsFocus() const override { return false; }
+};
+
 }  // namespace blink
 
 #endif
diff --git a/third_party/blink/renderer/core/html/forms/text_field_input_type.h b/third_party/blink/renderer/core/html/forms/text_field_input_type.h
index 8d81c70..70c4aa1 100644
--- a/third_party/blink/renderer/core/html/forms/text_field_input_type.h
+++ b/third_party/blink/renderer/core/html/forms/text_field_input_type.h
@@ -60,7 +60,8 @@
   void DisabledAttributeChanged() override;
   void ReadonlyAttributeChanged() override;
   bool SupportsReadOnly() const override;
-  void HandleBlurEvent() final;
+  void HandleBlurEvent() override;
+  void HandleBeforeTextInsertedEvent(BeforeTextInsertedEvent&) override;
   String SanitizeValue(const String&) const override;
   void SetValue(const String&,
                 bool value_changed,
@@ -84,7 +85,6 @@
   bool MayTriggerVirtualKeyboard() const final;
   bool IsTextField() const final;
   bool ValueMissing(const String&) const override;
-  void HandleBeforeTextInsertedEvent(BeforeTextInsertedEvent&) override;
   void ForwardEvent(Event&) final;
   bool ShouldSubmitImplicitly(const Event&) final;
   bool ShouldRespectListAttribute() override;
diff --git a/third_party/blink/renderer/core/html/html_link_element.cc b/third_party/blink/renderer/core/html/html_link_element.cc
index 51e5ba2..a5239718 100644
--- a/third_party/blink/renderer/core/html/html_link_element.cc
+++ b/third_party/blink/renderer/core/html/html_link_element.cc
@@ -107,7 +107,7 @@
       icon_sizes_[i] = web_icon_sizes[i];
     Process();
   } else if (name == kMediaAttr) {
-    media_ = value.DeprecatedLower();
+    media_ = value.LowerASCII();
     Process();
   } else if (name == kScopeAttr) {
     scope_ = value;
diff --git a/third_party/blink/renderer/core/html/resources/controls_refresh.css b/third_party/blink/renderer/core/html/resources/controls_refresh.css
index 2cbfb1f..5f0a4df 100644
--- a/third_party/blink/renderer/core/html/resources/controls_refresh.css
+++ b/third_party/blink/renderer/core/html/resources/controls_refresh.css
@@ -47,6 +47,30 @@
   border-color: #c5c5c5;
 }
 
+input[type="password" i]::-internal-reveal {
+  width: 1.3em;
+  height: 1.3em;
+  cursor: default;
+  flex: none;
+  background-image: -webkit-image-set(url(images/password_reveal_on.svg) 1x);
+  background-repeat: no-repeat;
+  background-position: center;
+  background-size: contain;
+  margin-left: 3px;
+  margin-right: 3px;
+}
+
+input[type="password" i]::-internal-reveal.reveal {
+  background-image: -webkit-image-set(url(images/password_reveal_off.svg) 1x);
+}
+
+input[type="password" i]::-internal-reveal:hover,
+input[type="password" i]::-internal-reveal:focus {
+  background-color: #F7F7F7;
+  border-radius: 1px;
+  cursor: pointer;
+}
+
 input[type="range" i] {
   color: #101010;
 }
@@ -79,3 +103,39 @@
   background: #d83b01;
   border-radius: 1px 0px 0px 1px;
 }
+
+input[type="date" i]::-webkit-calendar-picker-indicator,
+input[type="datetime-local" i]::-webkit-calendar-picker-indicator,
+input[type="month" i]::-webkit-calendar-picker-indicator,
+input[type="week" i]::-webkit-calendar-picker-indicator {
+  background-image: -webkit-image-set(url(images/calendar_icon.svg) 1x);
+  background-origin: content-box;
+  background-repeat: no-repeat;
+  background-size: contain;
+  height: 1.2em;
+  opacity: 1;
+  outline: none;
+  padding-bottom: 2px;
+  padding-inline-start: 27px;
+  padding-inline-end: 3px;
+  padding-top: 2px;
+  width: 1.2em;
+}
+
+input::-webkit-calendar-picker-indicator:hover {
+  background-color: initial;
+}
+
+/* Remove focus ring from fields and use highlight color */
+input::-webkit-datetime-edit-ampm-field:focus,
+input::-webkit-datetime-edit-day-field:focus,
+input::-webkit-datetime-edit-hour-field:focus,
+input::-webkit-datetime-edit-millisecond-field:focus,
+input::-webkit-datetime-edit-minute-field:focus,
+input::-webkit-datetime-edit-month-field:focus,
+input::-webkit-datetime-edit-second-field:focus,
+input::-webkit-datetime-edit-week-field:focus,
+input::-webkit-datetime-edit-year-field:focus {
+  background-color: rgba(0, 120, 212, 0.4);
+  outline: none;
+}
diff --git a/third_party/blink/renderer/core/html/resources/images/calendar_icon.svg b/third_party/blink/renderer/core/html/resources/images/calendar_icon.svg
new file mode 100644
index 0000000..f66e72eb
--- /dev/null
+++ b/third_party/blink/renderer/core/html/resources/images/calendar_icon.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6 6H7V7H6V6ZM9 12H10V13H9V12ZM12 6H13V7H12V6ZM9 6H10V7H9V6ZM6 8H7V9H6V8ZM3 8H4V9H3V8ZM12 8H13V9H12V8ZM9 8H10V9H9V8ZM6 10H7V11H6V10ZM3 10H4V11H3V10ZM12 10H13V11H12V10ZM9 10H10V11H9V10ZM6 12H7V13H6V12ZM3 12H4V13H3V12ZM16 1V15H0V1H3V0H4V1H12V0H13V1H16ZM1 2V4H15V2H13V3H12V2H4V3H3V2H1ZM15 14V5H1V14H15Z" fill="#101010"/>
+</svg>
diff --git a/third_party/blink/renderer/core/html/resources/images/password_reveal_off.svg b/third_party/blink/renderer/core/html/resources/images/password_reveal_off.svg
new file mode 100644
index 0000000..0ced2be5f
--- /dev/null
+++ b/third_party/blink/renderer/core/html/resources/images/password_reveal_off.svg
@@ -0,0 +1,4 @@
+<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">

+<path d="M10 4C10.7812 4 11.5417 4.10156 12.2812 4.30469C13.0208 4.50781 13.7292 4.78906 14.4062 5.14844C15.0885 5.5026 15.7292 5.92448 16.3281 6.41406C16.9323 6.90365 17.4896 7.43229 18 8C17.4896 8.57292 16.9323 9.10417 16.3281 9.59375C15.7292 10.0781 15.0885 10.5 14.4062 10.8594C13.7292 11.2135 13.0208 11.4922 12.2812 11.6953C11.5417 11.8984 10.7812 12 10 12C9.21875 12 8.45833 11.8984 7.71875 11.6953C6.97917 11.4922 6.26823 11.2135 5.58594 10.8594C4.90885 10.5 4.26823 10.0781 3.66406 9.59375C3.0599 9.10417 2.50521 8.57292 2 8C2.50521 7.43229 3.0599 6.90365 3.66406 6.41406C4.26823 5.92448 4.90885 5.5026 5.58594 5.14844C6.26823 4.78906 6.97917 4.50781 7.71875 4.30469C8.45833 4.10156 9.21875 4 10 4ZM13 8C13 7.58854 12.9193 7.20052 12.7578 6.83594C12.6016 6.47135 12.388 6.15365 12.1172 5.88281C11.8464 5.61198 11.5286 5.39844 11.1641 5.24219C10.7995 5.08073 10.4115 5 10 5C9.58854 5 9.20052 5.08073 8.83594 5.24219C8.47135 5.39844 8.15365 5.61198 7.88281 5.88281C7.61198 6.15365 7.39583 6.47135 7.23438 6.83594C7.07812 7.20052 7 7.58854 7 8C7 8.41146 7.07812 8.79948 7.23438 9.16406C7.39583 9.52865 7.61198 9.84635 7.88281 10.1172C8.15365 10.388 8.47135 10.6042 8.83594 10.7656C9.20052 10.9219 9.58854 11 10 11C10.4115 11 10.7995 10.9219 11.1641 10.7656C11.5286 10.6042 11.8464 10.388 12.1172 10.1172C12.388 9.84635 12.6016 9.52865 12.7578 9.16406C12.9193 8.79948 13 8.41146 13 8ZM3.38281 8C3.8724 8.47396 4.39323 8.90885 4.94531 9.30469C5.4974 9.69531 6.08854 10.0234 6.71875 10.2891C6.48438 9.95573 6.30469 9.59375 6.17969 9.20312C6.0599 8.80729 6 8.40625 6 8C6 7.59375 6.0599 7.19531 6.17969 6.80469C6.30469 6.40885 6.48438 6.04427 6.71875 5.71094C6.08854 5.97656 5.4974 6.30729 4.94531 6.70312C4.39323 7.09375 3.8724 7.52604 3.38281 8ZM13.2812 10.2891C13.9115 10.0234 14.5026 9.69531 15.0547 9.30469C15.6068 8.90885 16.1276 8.47396 16.6172 8C16.1276 7.52604 15.6068 7.09375 15.0547 6.70312C14.5026 6.30729 13.9115 5.97656 13.2812 5.71094C13.5156 6.04427 13.6927 6.40885 13.8125 6.80469C13.9375 7.19531 14 7.59375 14 8C14 8.40625 13.9375 8.80729 13.8125 9.20312C13.6927 9.59375 13.5156 9.95573 13.2812 10.2891ZM10 9C9.85938 9 9.72917 8.97396 9.60938 8.92188C9.48958 8.86979 9.38281 8.79948 9.28906 8.71094C9.20052 8.61719 9.13021 8.51042 9.07812 8.39062C9.02604 8.27083 9 8.14062 9 8C9 7.85938 9.02604 7.72917 9.07812 7.60938C9.13021 7.48958 9.20052 7.38542 9.28906 7.29688C9.38281 7.20312 9.48958 7.13021 9.60938 7.07812C9.72917 7.02604 9.85938 7 10 7C10.1406 7 10.2708 7.02604 10.3906 7.07812C10.5104 7.13021 10.6146 7.20312 10.7031 7.29688C10.7969 7.38542 10.8698 7.48958 10.9219 7.60938C10.974 7.72917 11 7.85938 11 8C11 8.14062 10.974 8.27083 10.9219 8.39062C10.8698 8.51042 10.7969 8.61719 10.7031 8.71094C10.6146 8.79948 10.5104 8.86979 10.3906 8.92188C10.2708 8.97396 10.1406 9 10 9Z" fill="black"/>

+<line x1="3.36031" y1="14.5754" x2="17.3603" y2="0.575402" stroke="black"/>

+</svg>
\ No newline at end of file
diff --git a/third_party/blink/renderer/core/html/resources/images/password_reveal_on.svg b/third_party/blink/renderer/core/html/resources/images/password_reveal_on.svg
new file mode 100644
index 0000000..f7134a9a
--- /dev/null
+++ b/third_party/blink/renderer/core/html/resources/images/password_reveal_on.svg
@@ -0,0 +1,3 @@
+<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">

+<path d="M10 4C10.7812 4 11.5417 4.10156 12.2812 4.30469C13.0208 4.50781 13.7292 4.78906 14.4062 5.14844C15.0885 5.5026 15.7292 5.92448 16.3281 6.41406C16.9323 6.90365 17.4896 7.43229 18 8C17.4896 8.57292 16.9323 9.10417 16.3281 9.59375C15.7292 10.0781 15.0885 10.5 14.4062 10.8594C13.7292 11.2135 13.0208 11.4922 12.2812 11.6953C11.5417 11.8984 10.7812 12 10 12C9.21875 12 8.45833 11.8984 7.71875 11.6953C6.97917 11.4922 6.26823 11.2135 5.58594 10.8594C4.90885 10.5 4.26823 10.0781 3.66406 9.59375C3.0599 9.10417 2.50521 8.57292 2 8C2.50521 7.43229 3.0599 6.90365 3.66406 6.41406C4.26823 5.92448 4.90885 5.5026 5.58594 5.14844C6.26823 4.78906 6.97917 4.50781 7.71875 4.30469C8.45833 4.10156 9.21875 4 10 4ZM13 8C13 7.58854 12.9193 7.20052 12.7578 6.83594C12.6016 6.47135 12.388 6.15365 12.1172 5.88281C11.8464 5.61198 11.5286 5.39844 11.1641 5.24219C10.7995 5.08073 10.4115 5 10 5C9.58854 5 9.20052 5.08073 8.83594 5.24219C8.47135 5.39844 8.15365 5.61198 7.88281 5.88281C7.61198 6.15365 7.39583 6.47135 7.23438 6.83594C7.07812 7.20052 7 7.58854 7 8C7 8.41146 7.07812 8.79948 7.23438 9.16406C7.39583 9.52865 7.61198 9.84635 7.88281 10.1172C8.15365 10.388 8.47135 10.6042 8.83594 10.7656C9.20052 10.9219 9.58854 11 10 11C10.4115 11 10.7995 10.9219 11.1641 10.7656C11.5286 10.6042 11.8464 10.388 12.1172 10.1172C12.388 9.84635 12.6016 9.52865 12.7578 9.16406C12.9193 8.79948 13 8.41146 13 8ZM3.38281 8C3.8724 8.47396 4.39323 8.90885 4.94531 9.30469C5.4974 9.69531 6.08854 10.0234 6.71875 10.2891C6.48438 9.95573 6.30469 9.59375 6.17969 9.20312C6.0599 8.80729 6 8.40625 6 8C6 7.59375 6.0599 7.19531 6.17969 6.80469C6.30469 6.40885 6.48438 6.04427 6.71875 5.71094C6.08854 5.97656 5.4974 6.30729 4.94531 6.70312C4.39323 7.09375 3.8724 7.52604 3.38281 8ZM13.2812 10.2891C13.9115 10.0234 14.5026 9.69531 15.0547 9.30469C15.6068 8.90885 16.1276 8.47396 16.6172 8C16.1276 7.52604 15.6068 7.09375 15.0547 6.70312C14.5026 6.30729 13.9115 5.97656 13.2812 5.71094C13.5156 6.04427 13.6927 6.40885 13.8125 6.80469C13.9375 7.19531 14 7.59375 14 8C14 8.40625 13.9375 8.80729 13.8125 9.20312C13.6927 9.59375 13.5156 9.95573 13.2812 10.2891ZM10 9C9.85938 9 9.72917 8.97396 9.60938 8.92188C9.48958 8.86979 9.38281 8.79948 9.28906 8.71094C9.20052 8.61719 9.13021 8.51042 9.07812 8.39062C9.02604 8.27083 9 8.14062 9 8C9 7.85938 9.02604 7.72917 9.07812 7.60938C9.13021 7.48958 9.20052 7.38542 9.28906 7.29688C9.38281 7.20312 9.48958 7.13021 9.60938 7.07812C9.72917 7.02604 9.85938 7 10 7C10.1406 7 10.2708 7.02604 10.3906 7.07812C10.5104 7.13021 10.6146 7.20312 10.7031 7.29688C10.7969 7.38542 10.8698 7.48958 10.9219 7.60938C10.974 7.72917 11 7.85938 11 8C11 8.14062 10.974 8.27083 10.9219 8.39062C10.8698 8.51042 10.7969 8.61719 10.7031 8.71094C10.6146 8.79948 10.5104 8.86979 10.3906 8.92188C10.2708 8.97396 10.1406 9 10 9Z" fill="black"/>

+</svg>
\ No newline at end of file
diff --git a/third_party/blink/renderer/core/html/shadow/shadow_element_names.cc b/third_party/blink/renderer/core/html/shadow/shadow_element_names.cc
index 5acf6932e..ccdca29 100644
--- a/third_party/blink/renderer/core/html/shadow/shadow_element_names.cc
+++ b/third_party/blink/renderer/core/html/shadow/shadow_element_names.cc
@@ -84,6 +84,11 @@
   return name;
 }
 
+const AtomicString& PasswordRevealButton() {
+  DEFINE_STATIC_LOCAL(AtomicString, name, ("password-reveal"));
+  return name;
+}
+
 const AtomicString& SearchDecoration() {
   DEFINE_STATIC_LOCAL(AtomicString, name, ("decoration"));
   return name;
diff --git a/third_party/blink/renderer/core/html/shadow/shadow_element_names.h b/third_party/blink/renderer/core/html/shadow/shadow_element_names.h
index 8de9049..3e8859e7 100644
--- a/third_party/blink/renderer/core/html/shadow/shadow_element_names.h
+++ b/third_party/blink/renderer/core/html/shadow/shadow_element_names.h
@@ -49,6 +49,7 @@
 const AtomicString& Placeholder();
 const AtomicString& SearchClearButton();
 const AtomicString& SearchDecoration();
+const AtomicString& PasswordRevealButton();
 CORE_EXPORT const AtomicString& SliderThumb();
 const AtomicString& SliderTrack();
 const AtomicString& TextFieldContainer();
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
index ac2f16c..50053ccf 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -1163,11 +1163,8 @@
       return;
 
     // Skip recursing inside a display-locked tree.
-    if (layout_object->GetNode() &&
-        DisplayLockUtilities::NearestLockedInclusiveAncestor(
-            *layout_object->GetNode())) {
+    if (DisplayLockUtilities::NearestLockedInclusiveAncestor(*layout_object))
       return;
-    }
 
     if (!layout_object->IsAnonymous())
       --descendants_depth;
@@ -1179,11 +1176,8 @@
   }
 
   // Don't gather text on a display-locked tree.
-  if (layout_object->GetNode() &&
-      DisplayLockUtilities::NearestLockedExclusiveAncestor(
-          *layout_object->GetNode())) {
+  if (DisplayLockUtilities::NearestLockedExclusiveAncestor(*layout_object))
     return;
-  }
 
   FontCachePurgePreventer preventer;
   LayoutText* layout_text = ToLayoutText(layout_object);
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
index f66a0f38..610807c 100644
--- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.cc
@@ -173,13 +173,16 @@
   return constraints_obj;
 }
 
+static bool IsUsingLayerLists(const cc::Layer* root) {
+  return root->layer_tree_host() &&
+         root->layer_tree_host()->IsUsingLayerLists();
+}
+
 static std::unique_ptr<protocol::LayerTree::Layer> BuildObjectForLayer(
     const cc::Layer* root,
     const cc::Layer* layer,
     bool report_wheel_event_listeners) {
-  bool using_layer_list =
-      RuntimeEnabledFeatures::CompositeAfterPaintEnabled() ||
-      RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled();
+  bool is_using_layer_lists = IsUsingLayerLists(root);
 
   // When the front-end doesn't show internal layers, it will use the the first
   // DrawsContent layer as the root of the shown layer tree. This doesn't work
@@ -187,13 +190,13 @@
   // all DrawsContent layers. We have to cheat the front-end by setting
   // drawsContent to true for the root layer.
   bool draws_content =
-      (using_layer_list && root == layer) || layer->DrawsContent();
+      (is_using_layer_lists && root == layer) || layer->DrawsContent();
 
   std::unique_ptr<protocol::LayerTree::Layer> layer_object =
       protocol::LayerTree::Layer::create()
           .setLayerId(IdForLayer(layer))
-          .setOffsetX(using_layer_list ? 0 : layer->position().x())
-          .setOffsetY(using_layer_list ? 0 : layer->position().y())
+          .setOffsetX(is_using_layer_lists ? 0 : layer->position().x())
+          .setOffsetY(is_using_layer_lists ? 0 : layer->position().y())
           .setWidth(layer->bounds().width())
           .setHeight(layer->bounds().height())
           .setPaintCount(layer->paint_count())
@@ -208,7 +211,7 @@
 
   gfx::Transform transform;
   gfx::Point3F transform_origin;
-  if (using_layer_list) {
+  if (is_using_layer_lists) {
     transform = layer->ScreenSpaceTransform();
   } else {
     transform = layer->transform();
@@ -348,6 +351,11 @@
           root_frame, cc::EventListenerClass::kMouseWheel) ==
       cc::EventListenerProperties::kBlocking;
 
+  if (IsUsingLayerLists(root_layer)) {
+    // The property trees must be updated for correct screen space transforms.
+    root_layer->layer_tree_host()->UpdatePropertyTrees();
+  }
+
   GatherLayers(root_layer, layers, have_blocking_wheel_event_handlers,
                scrolling_layer_id);
   return layers;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index f3b5dc3..8347467 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3996,7 +3996,7 @@
 
 bool LayoutObject::CanBeSelectionLeaf() const {
   if (SlowFirstChild() || StyleRef().Visibility() != EVisibility::kVisible ||
-      DisplayLockUtilities::NearestLockedExclusiveAncestor(*GetNode())) {
+      DisplayLockUtilities::NearestLockedExclusiveAncestor(*this)) {
     return false;
   }
   return CanBeSelectionLeafInternal();
diff --git a/third_party/blink/renderer/core/layout/layout_quote.cc b/third_party/blink/renderer/core/layout/layout_quote.cc
index 5e0f03d5..19e6bc0 100644
--- a/third_party/blink/renderer/core/layout/layout_quote.cc
+++ b/third_party/blink/renderer/core/layout/layout_quote.cc
@@ -235,7 +235,7 @@
 
   // This could be just a hash table, but doing that adds 200k to LayoutQuote.o
   Language* languages_end = g_languages + base::size(g_languages);
-  std::string lowercase_lang = lang.DeprecatedLower().Utf8();
+  std::string lowercase_lang = lang.LowerASCII().Utf8();
   Language key = {lowercase_lang.c_str(), 0, 0, 0, 0, nullptr};
   Language* match = std::lower_bound(g_languages, languages_end, key);
   if (match == languages_end || strcmp(match->lang, key.lang))
diff --git a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
index d73535f..caf3e53 100644
--- a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
+++ b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
@@ -4,6 +4,7 @@
 
 #include "third_party/blink/renderer/core/page/scrolling/fragment_anchor.h"
 
+#include "base/metrics/histogram_macros.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/page/scrolling/element_fragment_anchor.h"
 #include "third_party/blink/renderer/core/page/scrolling/text_fragment_anchor.h"
@@ -14,23 +15,57 @@
 FragmentAnchor* FragmentAnchor::TryCreate(const KURL& url,
                                           LocalFrame& frame,
                                           bool same_document_navigation) {
+  DCHECK(frame.GetDocument());
+
   FragmentAnchor* anchor = nullptr;
   const bool text_fragment_identifiers_enabled =
       RuntimeEnabledFeatures::TextFragmentIdentifiersEnabled(
           frame.GetDocument());
 
+  // The text fragment anchor will be created if we successfully parsed the
+  // targetText but we only do the text matching later on.
+  bool text_fragment_anchor_created = false;
   if (text_fragment_identifiers_enabled) {
     anchor = TextFragmentAnchor::TryCreateFragmentDirective(
         url, frame, same_document_navigation);
+    text_fragment_anchor_created = anchor;
   }
 
+  // Count how often we see a # in the fragment (i.e. after the # delimiting
+  // the hash). We do this after trying to find a ##targetText so that we don't
+  // pollute this metric with our own feature since we're trying to determine
+  // how prevalent ## is. If a ##targetText is found, it'll strip off the ##
+  // and any text following it.
+  if (url.HasFragmentIdentifier()) {
+    size_t hash_pos = url.FragmentIdentifier().Find("#");
+    if (hash_pos != kNotFound)
+      UseCounter::Count(frame.GetDocument(), WebFeature::kFragmentDoubleHash);
+  }
+
+  bool element_id_anchor_found = false;
   if (!anchor) {
     anchor = ElementFragmentAnchor::TryCreate(url, frame);
+    element_id_anchor_found = anchor;
   }
 
-  if (!anchor && text_fragment_identifiers_enabled) {
-    anchor =
+  if (text_fragment_identifiers_enabled) {
+    FragmentAnchor* text_anchor =
         TextFragmentAnchor::TryCreate(url, frame, same_document_navigation);
+    text_fragment_anchor_created |= static_cast<bool>(text_anchor);
+    // We parse the anchor to determine if we should report the UMA metric
+    // below but we should only use it if we didn't find an element-id based
+    // fragment.
+    if (!anchor)
+      anchor = text_anchor;
+  }
+
+  // Track how often we have a element fragment that we can't find. Only track
+  // if we didn't match a text fragment since we expect those would inflate the
+  // "failed" case.
+  if (frame.GetDocument()->IsHTMLDocument() && url.HasFragmentIdentifier() &&
+      !text_fragment_anchor_created) {
+    UMA_HISTOGRAM_BOOLEAN("TextFragmentAnchor.ElementIdFragmentFound",
+                          element_id_anchor_found);
   }
 
   return anchor;
diff --git a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc
index 9c812ca0b..03cfaf8 100644
--- a/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc
+++ b/third_party/blink/renderer/core/page/scrolling/text_fragment_anchor_metrics_test.cc
@@ -243,6 +243,167 @@
                                      0);
 }
 
+class TextFragmentRelatedMetricTest : public TextFragmentAnchorMetricsTest,
+                                      public testing::WithParamInterface<bool> {
+ public:
+  TextFragmentRelatedMetricTest() : text_fragment_anchors_state_(GetParam()) {}
+
+ private:
+  ScopedTextFragmentIdentifiersForTest text_fragment_anchors_state_;
+};
+
+// These tests will run with and without the TextFragmentIdentifiers feature
+// enabled to ensure we collect metrics correctly under both situations.
+INSTANTIATE_TEST_SUITE_P(,
+                         TextFragmentRelatedMetricTest,
+                         testing::Values(false, true));
+
+// Test that we correctly track failed vs. successful element-id lookups. We
+// only count these in cases where we don't have a targetText, when the REF is
+// enabled.
+TEST_P(TextFragmentRelatedMetricTest, ElementIdSuccessFailureCounts) {
+  const int kUncounted = 0;
+  const int kFound = 1;
+  const int kNotFound = 2;
+
+  // When the TextFragmentAnchors feature is on, we should avoid counting the
+  // result of the element-id fragment if a targetText is successfully parsed.
+  // If the feature is off we treat the targetText as an element-id and should
+  // count the result.
+  const int kUncountedOrNotFound = GetParam() ? kUncounted : kNotFound;
+  const int kUncountedOrFound = GetParam() ? kUncounted : kFound;
+
+  Vector<std::pair<String, int>> test_cases = {
+      {"", kUncounted},
+      {"#element", kFound},
+      {"#doesntExist", kNotFound},
+      {"#element##foo", kNotFound},
+      {"#doesntexist##foo", kNotFound},
+      {"##element", kNotFound},
+      {"#element##targetText=doesntexist", kUncountedOrNotFound},
+      {"#element##targetText=page", kUncountedOrNotFound},
+      {"#targetText=doesntexist", kUncountedOrNotFound},
+      {"#targetText=page", kUncountedOrNotFound},
+      {"#targetText=name", kUncountedOrFound},
+      {"#element##targetText=name", kUncountedOrFound}};
+
+  const int kNotFoundSample = 0;
+  const int kFoundSample = 1;
+  const std::string histogram = "TextFragmentAnchor.ElementIdFragmentFound";
+
+  // Add counts to each histogram so that calls to GetBucketCount won't fail
+  // due to not finding the histogram.
+  UMA_HISTOGRAM_BOOLEAN(histogram, true);
+  UMA_HISTOGRAM_BOOLEAN(histogram, false);
+  int expected_found_count = 1;
+  int expected_not_found_count = 1;
+
+  for (auto test_case : test_cases) {
+    String url = "https://example.com/test.html" + test_case.first;
+    SimRequest request(url, "text/html");
+    LoadURL(url);
+    request.Complete(R"HTML(
+      <!DOCTYPE html>
+      <p id="element">This is a test page</p>
+      <p id="targetText=name">This is a test page</p>
+      <p id="element##targetText=name">This is a test page</p>
+    )HTML");
+    Compositor().BeginFrame();
+
+    RunAsyncMatchingTasks();
+
+    auto not_found_count =
+        histogram_tester_.GetBucketCount(histogram, kNotFoundSample);
+    auto found_count =
+        histogram_tester_.GetBucketCount(histogram, kFoundSample);
+    int result = test_case.second;
+    if (result == kFound) {
+      ++expected_found_count;
+      ASSERT_EQ(expected_found_count, found_count)
+          << "ElementId should have been |Found| but did not UseCount on case: "
+          << test_case.first;
+      ASSERT_EQ(expected_not_found_count, not_found_count)
+          << "ElementId should have been |Found| but reported |NotFound| on "
+             "case: "
+          << test_case.first;
+    } else if (result == kNotFound) {
+      ++expected_not_found_count;
+      ASSERT_EQ(expected_not_found_count, not_found_count)
+          << "ElementId should have been |NotFound| but did not UseCount on "
+             "case: "
+          << test_case.first;
+      ASSERT_EQ(expected_found_count, found_count)
+          << "ElementId should have been |NotFound| but reported |Found| on "
+             "case: "
+          << test_case.first;
+    } else {
+      DCHECK_EQ(result, kUncounted);
+      ASSERT_EQ(expected_found_count, found_count)
+          << "Case should not have been counted but reported |Found| on case: "
+          << test_case.first;
+      ASSERT_EQ(expected_not_found_count, not_found_count)
+          << "Case should not have been counted but reported |NotFound| on "
+             "case: "
+          << test_case.first;
+    }
+  }
+}
+
+// Test that we correctly UseCount when we see a pound character '#' in the
+// fragment. We exclude the case where we see a ##targetText format
+// TextFragment so that we don't count it in uses of our own feature.
+TEST_P(TextFragmentRelatedMetricTest, DoubleHashUseCounter) {
+  const int kUncounted = 0;
+  const int kCounted = 1;
+
+  // When the TextFragmentAnchors feature is on, we should avoid counting a
+  // ##targetText directive as a use of double-hash in this case. When it's
+  // off, we expect to count it.
+  const int kCountedOnlyIfDisabled = !GetParam() ? kCounted : kUncounted;
+
+  Vector<std::pair<String, int>> test_cases = {
+      {"", kUncounted},
+      {"#element", kUncounted},
+      {"#doesntExist", kUncounted},
+      {"#element##foo", kCounted},
+      {"#doesntexist##foo", kCounted},
+      {"##element", kCounted},
+      {"#element#", kCounted},
+      {"#foo#bar#", kCounted},
+      {"#foo%23", kUncounted},
+      {"#element##targetText=doesntexist", kCountedOnlyIfDisabled},
+      {"#element##targetText=doesntexist#", kCountedOnlyIfDisabled},
+      {"#element##targetText=page", kCountedOnlyIfDisabled},
+      {"#element##targetText=page#", kCountedOnlyIfDisabled},
+      {"#targetText=doesntexist", kUncounted},
+      {"#targetText=page", kUncounted}};
+
+  for (auto test_case : test_cases) {
+    String url = "https://example.com/test.html" + test_case.first;
+    SimRequest request(url, "text/html");
+    LoadURL(url);
+    request.Complete(R"HTML(
+      <!DOCTYPE html>
+      <p id="element">This is a test page</p>
+    )HTML");
+    Compositor().BeginFrame();
+
+    RunAsyncMatchingTasks();
+
+    bool is_use_counted =
+        GetDocument().IsUseCounted(WebFeature::kFragmentDoubleHash);
+    if (test_case.second == kCounted) {
+      EXPECT_TRUE(is_use_counted)
+          << "Expected to count double-hash but didn't in case: "
+          << test_case.first;
+    } else {
+      EXPECT_FALSE(is_use_counted)
+          << "Expected not to count double-hash but did in case: "
+          << test_case.first;
+    }
+  }
+}
+
 }  // namespace
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
index 7807fc4..036dae0 100644
--- a/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
+++ b/third_party/blink/renderer/core/paint/compositing/composited_layer_mapping.cc
@@ -3548,25 +3548,25 @@
 bool CompositedLayerMapping::PaintBlockedByDisplayLockIncludingAncestors(
     DisplayLockContextLifecycleTarget target) const {
   auto* node = GetLayoutObject().GetNode();
-  if (!node)
-    return false;
-  auto* element = DynamicTo<Element>(node);
-  if (target == DisplayLockContextLifecycleTarget::kSelf && element) {
-    if (auto* context = element->GetDisplayLockContext()) {
-      if (!context->ShouldPaint(DisplayLockContext::kSelf))
-        return true;
+  if (node) {
+    auto* element = DynamicTo<Element>(node);
+    if (target == DisplayLockContextLifecycleTarget::kSelf && element) {
+      if (auto* context = element->GetDisplayLockContext()) {
+        if (!context->ShouldPaint(DisplayLockContext::kSelf))
+          return true;
+      }
     }
   }
-  return DisplayLockUtilities::NearestLockedExclusiveAncestor(*node);
+  return DisplayLockUtilities::NearestLockedExclusiveAncestor(
+      GetLayoutObject());
 }
 
 void CompositedLayerMapping::NotifyDisplayLockNeedsGraphicsLayerCollection() {
-  if (auto* node = GetLayoutObject().GetNode()) {
-    if (auto* locked_element =
-            DisplayLockUtilities::NearestLockedInclusiveAncestor(*node)) {
-      locked_element->GetDisplayLockContext()
-          ->NotifyNeedsGraphicsLayerCollection();
-    }
+  if (auto* locked_element =
+          DisplayLockUtilities::NearestLockedInclusiveAncestor(
+              GetLayoutObject())) {
+    locked_element->GetDisplayLockContext()
+        ->NotifyNeedsGraphicsLayerCollection();
   }
 }
 
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
index 457d2bdf..270a997 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -54,35 +54,10 @@
     std::unique_ptr<GlobalScopeCreationParams> creation_params,
     SharedWorkerThread* thread,
     base::TimeTicks time_origin) {
-  // Off-the-main-thread worker script fetch:
-  // Initialize() is called after script fetch.
-  if (creation_params->off_main_thread_fetch_option ==
-      OffMainThreadWorkerScriptFetchOption::kEnabled) {
-    return MakeGarbageCollected<SharedWorkerGlobalScope>(
-        std::move(creation_params), thread, time_origin);
-  }
-
-  // Legacy on-the-main-thread worker script fetch (to be removed):
-  KURL response_script_url = creation_params->script_url;
-  network::mojom::ReferrerPolicy response_referrer_policy =
-      creation_params->referrer_policy;
-  mojom::IPAddressSpace response_address_space =
-      *creation_params->response_address_space;
-  // Contrary to the name, |outside_content_security_policy_headers| contains
-  // worker script's response CSP headers in this case.
-  // TODO(nhiroki): Introduce inside's csp headers field in
-  // GlobalScopeCreationParams or deprecate this code path by enabling
-  // off-the-main-thread worker script fetch by default.
-  Vector<CSPHeaderAndType> response_csp_headers =
-      creation_params->outside_content_security_policy_headers;
-  std::unique_ptr<Vector<String>> response_origin_trial_tokens =
-      std::move(creation_params->origin_trial_tokens);
-  auto* global_scope = MakeGarbageCollected<SharedWorkerGlobalScope>(
+  DCHECK_EQ(creation_params->off_main_thread_fetch_option,
+            OffMainThreadWorkerScriptFetchOption::kEnabled);
+  return MakeGarbageCollected<SharedWorkerGlobalScope>(
       std::move(creation_params), thread, time_origin);
-  global_scope->Initialize(response_script_url, response_referrer_policy,
-                           response_address_space, response_csp_headers,
-                           response_origin_trial_tokens.get());
-  return global_scope;
 }
 
 SharedWorkerGlobalScope::SharedWorkerGlobalScope(
@@ -90,10 +65,6 @@
     SharedWorkerThread* thread,
     base::TimeTicks time_origin)
     : WorkerGlobalScope(std::move(creation_params), thread, time_origin) {
-  // When off-the-main-thread script fetch is enabled, ReadyToRunWorkerScript()
-  // will be called after an app cache is selected.
-  if (!features::IsOffMainThreadSharedWorkerScriptFetchEnabled())
-    ReadyToRunWorkerScript();
 }
 
 SharedWorkerGlobalScope::~SharedWorkerGlobalScope() = default;
@@ -143,7 +114,6 @@
     const FetchClientSettingsObjectSnapshot& outside_settings_object,
     WorkerResourceTimingNotifier& outside_resource_timing_notifier,
     const v8_inspector::V8StackTraceId& stack_id) {
-  DCHECK(features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
   DCHECK(!IsContextPaused());
 
   // Step 12. "Fetch a classic worker script given url, outside settings,
@@ -206,14 +176,12 @@
 
 void SharedWorkerGlobalScope::OnAppCacheSelected() {
   DCHECK(IsContextThread());
-  DCHECK(features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
   ReadyToRunWorkerScript();
 }
 
 void SharedWorkerGlobalScope::DidReceiveResponseForClassicScript(
     WorkerClassicScriptLoader* classic_script_loader) {
   DCHECK(IsContextThread());
-  DCHECK(features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
   probe::DidReceiveScriptResponse(this, classic_script_loader->Identifier());
 }
 
@@ -222,7 +190,6 @@
     WorkerClassicScriptLoader* classic_script_loader,
     const v8_inspector::V8StackTraceId& stack_id) {
   DCHECK(IsContextThread());
-  DCHECK(features::IsOffMainThreadSharedWorkerScriptFetchEnabled());
 
   // Step 12. "If the algorithm asynchronously completes with null, then:"
   if (classic_script_loader->Failed()) {
diff --git a/third_party/blink/renderer/devtools/.gitignore b/third_party/blink/renderer/devtools/.gitignore
index 0e4ce8a..bb586679 100644
--- a/third_party/blink/renderer/devtools/.gitignore
+++ b/third_party/blink/renderer/devtools/.gitignore
@@ -18,4 +18,9 @@
 /front_end/protocol_externs.js
 package-lock.json
 .vscode
-/front_end/*/jsconfig.json
\ No newline at end of file
+/front_end/*/jsconfig.json
+
+# These are generated for build and would be put in the symlinked folder (thus this folder)
+front_end/InspectorBackendCommands.js
+front_end/SupportedCSSProperties.js
+front_end/accessibility/ARIAProperties.js
\ No newline at end of file
diff --git a/third_party/blink/renderer/devtools/BUILD.gn b/third_party/blink/renderer/devtools/BUILD.gn
index 537f373c..6a9be7c0 100644
--- a/third_party/blink/renderer/devtools/BUILD.gn
+++ b/third_party/blink/renderer/devtools/BUILD.gn
@@ -1402,10 +1402,6 @@
   action("build_debug_devtools") {
     script = "scripts/build/build_debug_applications.py"
 
-    deps = [
-      ":copy_generated_scripts",
-    ]
-
     inputs = all_devtools_files + application_templates
     outputs = [
       "$resources_out_debug_dir/devtools_app.html",
@@ -1418,16 +1414,17 @@
       "$resources_out_debug_dir/worker_app.html",
     ]
 
-    args = devtools_applications + [
-             "--input_path",
-             rebase_path("front_end", root_build_dir),
-             "--output_path",
-             rebase_path(resources_out_debug_dir, root_build_dir),
-           ]
+    args = [
+      "--input_path",
+      rebase_path("front_end", root_build_dir),
+      "--output_path",
+      rebase_path(resources_out_debug_dir, root_build_dir),
+    ]
   }
 
   copy("copy_generated_scripts") {
     deps = [
+      ":build_debug_devtools",
       ":frontend_protocol_sources",
       ":supported_css_properties",
     ]
diff --git a/third_party/blink/renderer/devtools/scripts/build/build_debug_applications.py b/third_party/blink/renderer/devtools/scripts/build/build_debug_applications.py
index 42f8e4c6..701d614f 100755
--- a/third_party/blink/renderer/devtools/scripts/build/build_debug_applications.py
+++ b/third_party/blink/renderer/devtools/scripts/build/build_debug_applications.py
@@ -25,28 +25,37 @@
         input_path = argv[input_path_flag_index + 1]
         output_path_flag_index = argv.index('--output_path')
         output_path = argv[output_path_flag_index + 1]
-        application_names = argv[1:input_path_flag_index]
     except:
         print('Usage: %s app_1 app_2 ... app_N --input_path <input_path> --output_path <output_path>' % argv[0])
         raise
 
-    loader = modular_build.DescriptorLoader(input_path)
-    for app in application_names:
-        descriptors = loader.load_application(app)
-        builder = DebugBuilder(app, descriptors, input_path, output_path)
-        builder.build_app()
+    symlink_dir_or_copy(input_path, output_path)
 
 
-def symlink_or_copy_file(src, dest, safe=False):
+def symlink_dir_or_copy(src, dest):
+    if hasattr(os, 'symlink'):
+        if path.exists(dest):
+            if os.path.islink(dest):
+                os.unlink(dest)
+            else:
+                shutil.rmtree(dest)
+        os.symlink(join(os.getcwd(), src), dest)
+    else:
+        for filename in os.listdir(src):
+            new_src = join(os.getcwd(), src, filename)
+            if os.path.isdir(new_src):
+                copy_dir(new_src, join(dest, filename))
+            else:
+                copy_file(new_src, join(dest, filename), safe=True)
+
+
+def copy_file(src, dest, safe=False):
     if safe and path.exists(dest):
         os.remove(dest)
-    if hasattr(os, 'symlink'):
-        os.symlink(src, dest)
-    else:
-        shutil.copy(src, dest)
+    shutil.copy(src, dest)
 
 
-def symlink_or_copy_dir(src, dest):
+def copy_dir(src, dest):
     if path.exists(dest):
         shutil.rmtree(dest)
     for src_dir, dirs, files in os.walk(src):
@@ -56,37 +65,7 @@
         for name in files:
             src_name = join(os.getcwd(), src_dir, name)
             dest_name = join(dest_dir, name)
-            symlink_or_copy_file(src_name, dest_name)
-
-
-# Outputs:
-#   <app_name>.html as-is
-#   <app_name>.js as-is
-#   <module_name>/<all_files>
-class DebugBuilder(object):
-
-    def __init__(self, application_name, descriptors, application_dir, output_dir):
-        self.application_name = application_name
-        self.descriptors = descriptors
-        self.application_dir = application_dir
-        self.output_dir = output_dir
-
-    def app_file(self, extension):
-        return self.application_name + '.' + extension
-
-    def build_app(self):
-        if self.descriptors.has_html:
-            self._build_html()
-        for filename in os.listdir(self.application_dir):
-            src = join(os.getcwd(), self.application_dir, filename)
-            if os.path.isdir(src):
-                symlink_or_copy_dir(src, join(self.output_dir, filename))
-            else:
-                symlink_or_copy_file(src, join(self.output_dir, filename), safe=True)
-
-    def _build_html(self):
-        html_name = self.app_file('html')
-        symlink_or_copy_file(join(os.getcwd(), self.application_dir, html_name), join(self.output_dir, html_name), True)
+            copy_file(src_name, dest_name)
 
 
 if __name__ == '__main__':
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index 19be961c..5c355cf 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -545,6 +545,8 @@
       return ButtonRoleType();
     if (type == input_type_names::kRange)
       return ax::mojom::Role::kSlider;
+    if (type == input_type_names::kSearch)
+      return ax::mojom::Role::kSearchBox;
     if (type == input_type_names::kColor)
       return ax::mojom::Role::kColorWell;
     if (type == input_type_names::kTime)
diff --git a/third_party/blink/renderer/modules/mediastream/BUILD.gn b/third_party/blink/renderer/modules/mediastream/BUILD.gn
index 94c5e94..2083beae 100644
--- a/third_party/blink/renderer/modules/mediastream/BUILD.gn
+++ b/third_party/blink/renderer/modules/mediastream/BUILD.gn
@@ -32,6 +32,8 @@
     "media_stream_event.h",
     "media_stream_local_frame_wrapper.cc",
     "media_stream_local_frame_wrapper.h",
+    "media_stream_renderer_factory_impl.cc",
+    "media_stream_renderer_factory_impl.h",
     "media_stream_track.cc",
     "media_stream_track.h",
     "media_stream_track_content_hint.h",
diff --git a/content/renderer/media/stream/media_stream_renderer_factory_impl.cc b/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.cc
similarity index 61%
rename from content/renderer/media/stream/media_stream_renderer_factory_impl.cc
rename to third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.cc
index 35c65e4..387968df 100644
--- a/content/renderer/media/stream/media_stream_renderer_factory_impl.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.cc
@@ -2,17 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/renderer/media/stream/media_stream_renderer_factory_impl.h"
+#include "third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.h"
 
 #include <utility>
 
-#include "base/strings/utf_string_conversions.h"
-#include "content/public/renderer/render_frame.h"
-#include "content/renderer/media/webrtc/peer_connection_dependency_factory.h"
-#include "content/renderer/render_thread_impl.h"
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_track.h"
 #include "third_party/blink/public/platform/modules/webrtc/peer_connection_remote_audio_source.h"
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
+#include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_media_stream.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_renderer_sink.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
@@ -22,14 +19,10 @@
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/webrtc/api/media_stream_interface.h"
 
-namespace content {
+namespace blink {
 
 namespace {
 
-PeerConnectionDependencyFactory* GetPeerConnectionDependencyFactory() {
-  return RenderThreadImpl::current()->GetPeerConnectionDependencyFactory();
-}
-
 // Returns a valid session id if a single WebRTC capture device is currently
 // open (and then the matching session_id), otherwise 0.
 // This is used to pass on a session id to an audio renderer, so that audio will
@@ -37,8 +30,8 @@
 // Note that if there are more than one open capture devices the function
 // will not be able to pick an appropriate device and return 0.
 base::UnguessableToken GetSessionIdForWebRtcAudioRenderer() {
-  blink::WebRtcAudioDeviceImpl* audio_device =
-      GetPeerConnectionDependencyFactory()->GetWebRtcAudioDevice();
+  WebRtcAudioDeviceImpl* audio_device =
+      Platform::Current()->GetWebRtcAudioDevice();
   return audio_device
              ? audio_device->GetAuthorizedDeviceSessionIdForAudioRenderer()
              : base::UnguessableToken();
@@ -46,17 +39,19 @@
 
 }  // namespace
 
-
-MediaStreamRendererFactoryImpl::MediaStreamRendererFactoryImpl() {
+std::unique_ptr<WebMediaStreamRendererFactory>
+CreateWebMediaStreamRendererFactory() {
+  return std::make_unique<MediaStreamRendererFactoryImpl>();
 }
 
-MediaStreamRendererFactoryImpl::~MediaStreamRendererFactoryImpl() {
-}
+MediaStreamRendererFactoryImpl::MediaStreamRendererFactoryImpl() {}
 
-scoped_refptr<blink::WebMediaStreamVideoRenderer>
+MediaStreamRendererFactoryImpl::~MediaStreamRendererFactoryImpl() {}
+
+scoped_refptr<WebMediaStreamVideoRenderer>
 MediaStreamRendererFactoryImpl::GetVideoRenderer(
-    const blink::WebMediaStream& web_stream,
-    const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
+    const WebMediaStream& web_stream,
+    const WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner) {
   DCHECK(!web_stream.IsNull());
@@ -64,28 +59,26 @@
   DVLOG(1) << "MediaStreamRendererFactoryImpl::GetVideoRenderer stream:"
            << web_stream.Id().Utf8();
 
-  blink::WebVector<blink::WebMediaStreamTrack> video_tracks =
-      web_stream.VideoTracks();
+  WebVector<WebMediaStreamTrack> video_tracks = web_stream.VideoTracks();
   if (video_tracks.empty() ||
-      !blink::MediaStreamVideoTrack::GetTrack(video_tracks[0])) {
+      !MediaStreamVideoTrack::GetTrack(video_tracks[0])) {
     return nullptr;
   }
 
-  return new blink::MediaStreamVideoRendererSink(
-      video_tracks[0], repaint_cb, std::move(io_task_runner),
-      std::move(main_render_task_runner));
+  return new MediaStreamVideoRendererSink(video_tracks[0], repaint_cb,
+                                          std::move(io_task_runner),
+                                          std::move(main_render_task_runner));
 }
 
-scoped_refptr<blink::WebMediaStreamAudioRenderer>
+scoped_refptr<WebMediaStreamAudioRenderer>
 MediaStreamRendererFactoryImpl::GetAudioRenderer(
-    const blink::WebMediaStream& web_stream,
-    blink::WebLocalFrame* web_frame,
+    const WebMediaStream& web_stream,
+    WebLocalFrame* web_frame,
     const std::string& device_id) {
   DCHECK(!web_stream.IsNull());
-  blink::WebVector<blink::WebMediaStreamTrack> audio_tracks =
-      web_stream.AudioTracks();
+  WebVector<WebMediaStreamTrack> audio_tracks = web_stream.AudioTracks();
   if (audio_tracks.empty()) {
-    blink::WebRtcLogMessage("No audio tracks in media stream (return null).");
+    WebRtcLogMessage("No audio tracks in media stream (return null).");
     return nullptr;
   }
 
@@ -99,55 +92,54 @@
   // and mixes audio from all the tracks that belong to the media stream.
   // For now, we have separate renderers depending on if the first audio track
   // in the stream is local or remote.
-  blink::MediaStreamAudioTrack* audio_track =
-      blink::MediaStreamAudioTrack::From(audio_tracks[0]);
+  MediaStreamAudioTrack* audio_track =
+      MediaStreamAudioTrack::From(audio_tracks[0]);
   if (!audio_track) {
     // This can happen if the track was cloned.
     // TODO(tommi, perkj): Fix cloning of tracks to handle extra data too.
-    blink::WebRtcLogMessage("Error: No native track for WebMediaStreamTrack");
+    WebRtcLogMessage("Error: No native track for WebMediaStreamTrack");
     return nullptr;
   }
 
   // If the track has a local source, or is a remote track that does not use the
-  // WebRTC audio pipeline, return a new blink::TrackAudioRenderer instance.
-  if (!blink::PeerConnectionRemoteAudioTrack::From(audio_track)) {
+  // WebRTC audio pipeline, return a new TrackAudioRenderer instance.
+  if (!PeerConnectionRemoteAudioTrack::From(audio_track)) {
     // TODO(xians): Add support for the case where the media stream contains
     // multiple audio tracks.
     DVLOG(1) << "Creating TrackAudioRenderer for "
              << (audio_track->is_local_track() ? "local" : "remote")
              << " track.";
-    return new blink::TrackAudioRenderer(
-        audio_tracks[0], web_frame,
-        /*session_id=*/base::UnguessableToken(), device_id);
+    return new TrackAudioRenderer(audio_tracks[0], web_frame,
+                                  /*session_id=*/base::UnguessableToken(),
+                                  device_id);
   }
 
   // This is a remote WebRTC media stream.
-  blink::WebRtcAudioDeviceImpl* audio_device =
-      GetPeerConnectionDependencyFactory()->GetWebRtcAudioDevice();
+  WebRtcAudioDeviceImpl* audio_device =
+      Platform::Current()->GetWebRtcAudioDevice();
   DCHECK(audio_device);
 
   // Share the existing renderer if any, otherwise create a new one.
-  scoped_refptr<blink::WebRtcAudioRenderer> renderer(audio_device->renderer());
+  scoped_refptr<WebRtcAudioRenderer> renderer(audio_device->renderer());
   if (renderer) {
     DVLOG(1) << "Using existing WebRtcAudioRenderer for remote WebRTC track.";
   } else {
     DVLOG(1) << "Creating WebRtcAudioRenderer for remote WebRTC track.";
 
-    renderer = new blink::WebRtcAudioRenderer(
-        GetPeerConnectionDependencyFactory()->GetWebRtcSignalingThread(),
-        web_stream, web_frame, GetSessionIdForWebRtcAudioRenderer(), device_id);
+    renderer = new WebRtcAudioRenderer(
+        Platform::Current()->GetWebRtcSignalingTaskRunner(), web_stream,
+        web_frame, GetSessionIdForWebRtcAudioRenderer(), device_id);
 
     if (!audio_device->SetAudioRenderer(renderer.get())) {
-      blink::WebRtcLogMessage(
-          "Error: SetAudioRenderer failed for remote track.");
+      WebRtcLogMessage("Error: SetAudioRenderer failed for remote track.");
       return nullptr;
     }
   }
 
   auto ret = renderer->CreateSharedAudioRendererProxy(web_stream);
   if (!ret)
-    blink::WebRtcLogMessage("Error: CreateSharedAudioRendererProxy failed.");
+    WebRtcLogMessage("Error: CreateSharedAudioRendererProxy failed.");
   return ret;
 }
 
-}  // namespace content
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.h b/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.h
new file mode 100644
index 0000000..0daed20
--- /dev/null
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_renderer_factory_impl.h
@@ -0,0 +1,38 @@
+// Copyright 2014 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_RENDERER_MODULES_MEDIASTREAM_MEDIA_STREAM_RENDERER_FACTORY_IMPL_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_STREAM_RENDERER_FACTORY_IMPL_H_
+
+#include <string>
+
+#include "base/macros.h"
+#include "third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h"
+
+namespace blink {
+
+class MediaStreamRendererFactoryImpl : public WebMediaStreamRendererFactory {
+ public:
+  MediaStreamRendererFactoryImpl();
+  ~MediaStreamRendererFactoryImpl() override;
+
+  scoped_refptr<WebMediaStreamVideoRenderer> GetVideoRenderer(
+      const WebMediaStream& web_stream,
+      const WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
+      scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
+      scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner)
+      override;
+
+  scoped_refptr<WebMediaStreamAudioRenderer> GetAudioRenderer(
+      const WebMediaStream& web_stream,
+      WebLocalFrame* web_frame,
+      const std::string& device_id) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MediaStreamRendererFactoryImpl);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_MEDIA_STREAM_RENDERER_FACTORY_IMPL_H_
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
index 87d52bee..fa68ea0 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms.cc
@@ -26,7 +26,6 @@
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_track.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_media_element_source_utils.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_audio_renderer.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_media_stream_video_renderer.h"
 #include "third_party/blink/public/platform/modules/webrtc/webrtc_logging.h"
 #include "third_party/blink/public/platform/url_conversion.h"
@@ -37,6 +36,7 @@
 #include "third_party/blink/public/platform/web_surface_layer_bridge.h"
 #include "third_party/blink/public/web/modules/media/webmediaplayer_util.h"
 #include "third_party/blink/public/web/modules/mediastream/media_stream_video_track.h"
+#include "third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/renderer/modules/mediastream/media_stream_local_frame_wrapper.h"
 #include "third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.h"
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
index 321bcd2..fd3b5084 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -21,12 +21,12 @@
 #include "media/base/video_frame.h"
 #include "media/video/mock_gpu_memory_buffer_video_frame_pool.h"
 #include "media/video/mock_gpu_video_accelerator_factories.h"
-#include "third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 #include "third_party/blink/public/platform/web_fullscreen_video_status.h"
 #include "third_party/blink/public/platform/web_media_player.h"
 #include "third_party/blink/public/platform/web_media_player_client.h"
 #include "third_party/blink/public/platform/web_media_player_source.h"
+#include "third_party/blink/public/web/modules/mediastream/web_media_stream_renderer_factory.h"
 #include "third_party/blink/public/web/modules/mediastream/webmediaplayer_ms.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_compositor.h"
diff --git a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
index 200a596..c4721b14 100644
--- a/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/models/test_expectations.py
@@ -1059,24 +1059,25 @@
         if not expectations_dict:
             expectations_dict = port.expectations_dict()
 
-        # Always parse the generic expectations (the generic file is required
-        # to be the first one in the expectations_dict, which must be an OrderedDict).
-        generic_path, generic_exps = expectations_dict.items()[0]
-        expectations = self._parser.parse(generic_path, generic_exps)
-        self._add_expectations(expectations, self._model)
-        self._expectations += expectations
+        if expectations_dict:
+            # Always parse the generic expectations (the generic file is required
+            # to be the first one in the expectations_dict, which must be an OrderedDict).
+            generic_path, generic_exps = expectations_dict.items()[0]
+            expectations = self._parser.parse(generic_path, generic_exps)
+            self._add_expectations(expectations, self._model)
+            self._expectations += expectations
 
-        # Now add the overrides if so requested.
-        if include_overrides:
-            for path, contents in expectations_dict.items()[1:]:
-                expectations = self._parser.parse(path, contents)
-                model = TestExpectationsModel(self._shorten_filename)
-                self._add_expectations(expectations, model)
-                self._expectations += expectations
-                flag_specific_match = re.match('.*' + port.FLAG_EXPECTATIONS_PREFIX + '(.*)', path)
-                if flag_specific_match is not None:
-                    self._model.append_flag_name(flag_specific_match.group(1))
-                self._model.merge_model(model, flag_specific_match is not None)
+            # Now add the overrides if so requested.
+            if include_overrides:
+                for path, contents in expectations_dict.items()[1:]:
+                    expectations = self._parser.parse(path, contents)
+                    model = TestExpectationsModel(self._shorten_filename)
+                    self._add_expectations(expectations, model)
+                    self._expectations += expectations
+                    flag_specific_match = re.match('.*' + port.FLAG_EXPECTATIONS_PREFIX + '(.*)', path)
+                    if flag_specific_match is not None:
+                        self._model.append_flag_name(flag_specific_match.group(1))
+                    self._model.merge_model(model, flag_specific_match is not None)
 
         self.add_extra_skipped_tests(set(port.get_option('ignore_tests', [])))
         self.add_expectations_from_bot()
diff --git a/third_party/blink/tools/blinkpy/web_tests/port/base.py b/third_party/blink/tools/blinkpy/web_tests/port/base.py
index 9d8b62b5..a677c7a8 100644
--- a/third_party/blink/tools/blinkpy/web_tests/port/base.py
+++ b/third_party/blink/tools/blinkpy/web_tests/port/base.py
@@ -1318,9 +1318,10 @@
         # updated to know about the ordered dict.
         expectations = collections.OrderedDict()
 
-        for path in self.expectations_files():
-            if self._filesystem.exists(path):
-                expectations[path] = self._filesystem.read_text_file(path)
+        if not self.get_option('ignore_default_expectations', False):
+            for path in self.expectations_files():
+                if self._filesystem.exists(path):
+                    expectations[path] = self._filesystem.read_text_file(path)
 
         for path in self.get_option('additional_expectations', []):
             expanded_path = self._filesystem.expanduser(path)
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py b/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py
index 5bd63d54..c1d747c 100644
--- a/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py
+++ b/third_party/blink/tools/blinkpy/web_tests/run_web_tests.py
@@ -159,6 +159,10 @@
                 help=('Path to a test_expectations file that will override previous '
                       'expectations. Specify multiple times for multiple sets of overrides.')),
             optparse.make_option(
+                '--ignore-default-expectations',
+                action='store_true',
+                help=('Do not use the default set of TestExpectations files.')),
+            optparse.make_option(
                 '--additional-platform-directory',
                 action='append',
                 default=[],
diff --git a/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py b/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py
index 65e8ee0..5e779d1 100644
--- a/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/run_web_tests_unittest.py
@@ -1218,6 +1218,10 @@
         json_failing_test_results = host.filesystem.read_text_file('/tmp/json_failing_results.json')
         self.assertEqual(json.loads(json_failing_test_results), details.summarized_failing_results)
 
+    def test_no_default_expectations(self):
+        self.assertTrue(passing_run(['failures/expected/text.html']))
+        self.assertFalse(passing_run(['--ignore-default-expectations', 'failures/expected/text.html']))
+
 
 class RebaselineTest(unittest.TestCase, StreamTestingMixin):
     """Tests for flags which cause new baselines to be written.
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests
index c20da0f2..8b1e215 100644
--- a/third_party/blink/web_tests/NeverFixTests
+++ b/third_party/blink/web_tests/NeverFixTests
@@ -778,6 +778,8 @@
 external/wpt/css/css-writing-modes/first-page-vrl-002.xht [ WontFix ]
 external/wpt/css/css-writing-modes/page-flow-direction-002.xht [ WontFix ]
 external/wpt/css/css-writing-modes/page-flow-direction-003.xht [ WontFix ]
+external/wpt/css/css-writing-modes/tcy-white-space-processing-001.html [ WontFix ]
+external/wpt/css/css-writing-modes/tcy-white-space-processing-003.html [ WontFix ]
 external/wpt/html/interaction/focus/focus-02.html [ WontFix ]
 virtual/layout_ng/external/wpt/css/CSS2/linebox/inline-formatting-context-010b.xht [ WontFix ]
 virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inline-block-replaced-height-008.xht [ WontFix ]
@@ -1620,7 +1622,6 @@
 
 # Requires --use-fake-ui-for-media-stream to run.
 external/wpt/mediacapture-streams/MediaStream-default-feature-policy.https.html [ WontFix ]
-virtual/audio-service/external/wpt/mediacapture-streams/MediaStream-default-feature-policy.https.html [ WontFix ]
 
 # These directories have manual tests that don't have to run with
 # run_web_tests.py; see https://crbug.com/359838.
@@ -2136,8 +2137,6 @@
 virtual/blink-cors/external/wpt/xhr/send-authentication-prompt-2-manual.htm [ WontFix ]
 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStream-MediaElement-preload-none-manual.https.html [ WontFix ]
 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStreamTrack-end-manual.https.html [ WontFix ]
-virtual/audio-service/external/wpt/mediacapture-streams/MediaStream-MediaElement-preload-none-manual.https.html [ WontFix ]
-virtual/audio-service/external/wpt/mediacapture-streams/MediaStreamTrack-end-manual.https.html [ WontFix ]
 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-event-is-history-backward-navigation-manual.https.html [ WontFix ]
 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-event-is-history-forward-navigation-manual.https.html [ WontFix ]
 virtual/omt-worker-fetch/external/wpt/service-workers/service-worker/fetch-event-is-reload-navigation-manual.https.html [ WontFix ]
@@ -2249,7 +2248,6 @@
 crbug.com/946022 [ Win7 ] images/image-zoom-to-25.html [ WontFix ]
 crbug.com/946022 [ Win7 ] images/image-zoom-to-500.html [ WontFix ]
 crbug.com/946022 [ Win7 ] media/controls/overflow-menu-hide-on-resize.html [ WontFix ]
-crbug.com/946022 [ Win7 ] virtual/audio-service/media/controls/overflow-menu-hide-on-resize.html [ WontFix ]
 crbug.com/946022 [ Win7 ] paint/invalidation/resize-iframe-text.html [ WontFix ]
 crbug.com/946022 [ Win7 ] paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint.html [ WontFix ]
 crbug.com/946022 [ Win7 ] paint/invalidation/window-resize/ [ WontFix ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 8ad30a0..3b4112f4 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -44,8 +44,6 @@
 crbug.com/24182 jquery/traversing.html [ Slow ]
 crbug.com/24182 media/controls/controls-cast-do-not-fade-out.html [ Slow ]
 crbug.com/24182 media/controls/controls-cast-overlay-slow-fade.html [ Slow ]
-crbug.com/24182 virtual/audio-service/media/controls/controls-cast-do-not-fade-out.html [ Slow ]
-crbug.com/24182 virtual/audio-service/media/controls/controls-cast-overlay-slow-fade.html [ Slow ]
 crbug.com/24182 svg/filters/big-sized-filter.svg [ Slow ]
 crbug.com/24182 tables/mozilla/other/slashlogo.html [ Slow ]
 crbug.com/24182 fast/canvas/color-space/canvas-colorManaged-toBlob-toDataURL.html [ Slow ]
@@ -119,10 +117,6 @@
 crbug.com/73609 http/tests/media/video-preload-metadata.html [ Slow ]
 crbug.com/869829 http/tests/media/video-cancel-load.html [ Slow ]
 crbug.com/870259 http/tests/media/video-throttled-load-metadata.html [ Slow ]
-crbug.com/73609 virtual/audio-service/http/tests/media/video-play-stall.html [ Slow ]
-crbug.com/73609 virtual/audio-service/http/tests/media/video-preload-metadata.html [ Slow ]
-crbug.com/869829 virtual/audio-service/http/tests/media/video-cancel-load.html [ Slow ]
-crbug.com/870259 virtual/audio-service/http/tests/media/video-throttled-load-metadata.html [ Slow ]
 
 # Many of the virtual animations tests are slow.
 crbug.com/243871 virtual/threaded/fast/scroll-behavior/ [ Slow ]
@@ -479,7 +473,6 @@
 crbug.com/874695 inspector-protocol/accessibility/accessibility-nameSources-input-buttons.js [ Slow ]
 crbug.com/874695 inspector-protocol/debugger/debugger-evaluate-in-worker-while-pause-in-page.js [ Slow ]
 crbug.com/874695 media/audio-controls-do-not-fade-out.html [ Slow ]
-crbug.com/874695 virtual/audio-service/media/audio-controls-do-not-fade-out.html [ Slow ]
 crbug.com/874695 media/autoplay-muted.html [ Slow ]
 crbug.com/874695 media/color-profile-video-seek-filter.html [ Slow ]
 crbug.com/874695 media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Slow ]
@@ -657,12 +650,9 @@
 crbug.com/980804 virtual/threaded/fast/scrolling/scrollbars/mouse-autoscrolling-on-scrollbar.html [ Slow ]
 crbug.com/980804 virtual/main_thread_scrollbar_gestures/fast/scrolling/scrollbars/mouse-autoscrolling-on-scrollbar.html [ Slow ]
 
-crbug.com/983642 [ Linux ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
-crbug.com/983642 [ Linux ] virtual/gpu/fast/canvas/canvas-composite-text-alpha.html [ Slow ]
-crbug.com/983642 [ Linux ] virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-e_srgb.html [ Slow ]
-crbug.com/983642 [ Win7 ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
-crbug.com/983642 [ Win7 ] virtual/gpu/fast/canvas/canvas-composite-text-alpha.html [ Slow ]
-crbug.com/983642 [ Win ] virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-e_srgb.html [ Slow ]
+crbug.com/983642 virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/983642 virtual/gpu/fast/canvas/canvas-composite-text-alpha.html [ Slow ]
+crbug.com/983642 virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-e_srgb.html [ Slow ]
 crbug.com/983642 [ Win ] virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-p3.html [ Slow ]
 crbug.com/983642 [ Win ] virtual/gpu/fast/canvas/color-space/canvas-createImageBitmap-rec2020.html [ Slow ]
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 8b8db018..3182792 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -39,7 +39,6 @@
 # These two are left over from crbug.com/881040, I rebaselined them twice and
 # they continue to fail.
 crbug.com/881040 media/controls/lazy-loaded-style.html [ Failure Pass ]
-crbug.com/881040 virtual/audio-service/media/controls/lazy-loaded-style.html [ Failure Pass ]
 
 # With --enable-display-compositor-pixel-dump enabled by default, these three
 # tests fail. See crbug.com/887140 for more info.
@@ -527,7 +526,6 @@
 crbug.com/949909 external/wpt/css/css-text-decor/text-decoration-040-manual.html [ Skip ]
 
 crbug.com/722825 media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Timeout Pass ]
-crbug.com/722825 virtual/audio-service/media/controls/video-enter-exit-fullscreen-while-hovering-shows-controls.html [ Timeout Pass ]
 
 #### crbug.com/783229 overflow
 crbug.com/724701 overflow/overflow-basic-004.html [ Failure ]
@@ -859,7 +857,6 @@
 crbug.com/591099 [ Mac ] images/feature-policy-oversized-images-resize.html [ Failure ]
 crbug.com/974717 [ Linux ] images/feature-policy-oversized-images-resize.html [ Failure Pass ]
 # crbug.com/591099 [ Mac10.11 ] media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
-crbug.com/591099 [ Mac10.11 ] virtual/audio-service/media/track/track-cue-rendering-position-auto-rtl.html [ Failure ]
 crbug.com/591099 [ Mac10.11 ] virtual/scalefactor200/fast/hidpi/static/popup-menu-appearance.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] compositing/geometry/root-layer-update.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] compositing/overlap-blending/reflection-opacity-huge.html [ Failure ]
@@ -1167,9 +1164,7 @@
 crbug.com/591099 [ Mac10.13 ] images/imagemap-focus-ring.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] images/imagemap-overflowing-polygon-focus-ring.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] media/video-colorspace-yuv420.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] virtual/audio-service/media/video-colorspace-yuv420.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] media/video-empty-source.html [ Failure ]
-crbug.com/591099 [ Mac10.13 ] virtual/audio-service/media/video-empty-source.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] paint/invalidation/background/background-misaligned.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] paint/invalidation/block-no-inflow-children.html [ Failure ]
 crbug.com/591099 [ Mac10.13 ] paint/invalidation/bugzilla-7235.html [ Failure ]
@@ -2275,7 +2270,6 @@
 crbug.com/520736 [ Win7 ] media/W3C/video/networkState/networkState_during_progress.html [ Failure Pass ]
 crbug.com/520736 [ Linux ] media/W3C/video/networkState/networkState_during_progress.html [ Failure Pass ]
 crbug.com/909095 [ Mac ] media/W3C/video/networkState/networkState_during_progress.html [ Failure Pass ]
-crbug.com/909095 virtual/audio-service/media/W3C/video/networkState/networkState_during_progress.html [ Failure Pass ]
 
 crbug.com/862716 [ Mac ] css3/filters/effect-brightness-clamping-hw.html [ Failure Pass Timeout ]
 crbug.com/862716 [ Linux ] css3/filters/effect-brightness-clamping-hw.html [ Failure Pass Timeout ]
@@ -2344,7 +2338,6 @@
 
 crbug.com/432129 html/marquee/marquee-scroll.html [ Failure Pass ]
 crbug.com/326139 crbug.com/390125 media/video-frame-accurate-seek.html [ Failure Pass ]
-crbug.com/326139 crbug.com/390125 virtual/audio-service/media/video-frame-accurate-seek.html [ Failure Pass ]
 crbug.com/421283 html/marquee/marquee-scrollamount.html [ Pass Failure ]
 
 # TODO(oshima): Mac Android are currently not supported.
@@ -2572,7 +2565,6 @@
 crbug.com/467635 fast/dom/HTMLImageElement/image-sizes-meta-viewport.html [ Skip ]
 
 crbug.com/636239 [ Win7 ] media/video-zoom-controls.html [ Failure ]
-crbug.com/636239 [ Win7 ] virtual/audio-service/media/video-zoom-controls.html [ Failure ]
 
 # Printing Layout broken in these tests.
 crbug.com/377696 printing/setPrinting.html [ Skip ]
@@ -2611,7 +2603,6 @@
 # with the --mse-audio-buffer-size-limit=1048576 and --mse-video-buffer-size-limit=1048576 command-line parameters.
 crbug.com/630342 virtual/mse-1mb-buffers/http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-default-buffers.html [ Skip ]
 crbug.com/630342 http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-1mb-buffers.html [ Skip ]
-crbug.com/630342 virtual/audio-service/http/tests/media/media-source/stream_memory_tests/mediasource-appendbuffer-quota-exceeded-1mb-buffers.html [ Skip ]
 
 # On these platforms (all but Android) media tests don't currently use gpu-accelerated (proprietary) codecs, so no
 # benefit to running them again with gpu acceleration enabled.
@@ -2623,7 +2614,6 @@
 crbug.com/467477 fast/multicol/vertical-rl/nested-columns.html [ Failure ]
 
 crbug.com/400841 media/video-canvas-draw.html [ Failure ]
-crbug.com/400841 virtual/audio-service/media/video-canvas-draw.html [ Failure ]
 crbug.com/400829 virtual/stable/media/stable/video-object-fit-stable.html [ Failure ]
 
 # These contain faulty expectations. https://chromium-review.googlesource.com/c/v8/v8/+/1350790 should fix the
@@ -3004,15 +2994,10 @@
 crbug.com/654477 fast/layers/video-layer.html [ Failure ]
 # These could likely be removed - see https://chromium-review.googlesource.com/c/chromium/src/+/1252141
 crbug.com/654477 media/controls-focus-ring.html [ Failure ]
-crbug.com/654477 virtual/audio-service/media/controls-focus-ring.html [ Failure ]
 crbug.com/654477 [ Mac10.10 ] http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
 crbug.com/654477 [ Mac10.11 ] http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
 crbug.com/654477 [ Retina ] http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
 crbug.com/638621 [ Win7 ] http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
-crbug.com/654477 [ Mac10.10 ] virtual/audio-service/http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
-crbug.com/654477 [ Mac10.11 ] virtual/audio-service/http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
-crbug.com/654477 [ Retina ] virtual/audio-service/http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
-crbug.com/638621 [ Win7 ] virtual/audio-service/http/tests/media/video-buffered-range-contains-currentTime.html [ Failure ]
 
 crbug.com/637930 http/tests/media/video-buffered.html [ Pass Failure ]
 
@@ -3287,8 +3272,6 @@
 crbug.com/785230 external/wpt/css/css-text-decor/text-decoration-thickness-vertical-002.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
-crbug.com/626703 external/wpt/css/css-writing-modes/tcy-white-space-processing-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-writing-modes/tcy-white-space-processing-003.html [ Failure ]
 crbug.com/626703 [ Mac10.11 ] external/wpt/shape-detection/shapedetection-cross-origin.sub.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.13 ] external/wpt/webaudio/the-audio-api/the-mediastreamaudiosourcenode-interface/mediastreamaudiosourcenode-routing.html [ Timeout ]
 crbug.com/626703 [ Retina ] external/wpt/webaudio/the-audio-api/the-mediastreamaudiosourcenode-interface/mediastreamaudiosourcenode-routing.html [ Timeout ]
@@ -3549,7 +3532,6 @@
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/bidi/start_alignment.html [ Failure ]
 crbug.com/626703 [ Retina ] external/wpt/html/browsers/the-window-object/apis-for-creating-and-navigating-browsing-contexts-by-name/open-features-tokenization-top-left.html [ Timeout ]
 crbug.com/626703 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Timeout ]
-crbug.com/626703 virtual/audio-service/external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Timeout ]
 crbug.com/626703 virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/html/cross-origin/anonymous.tentative.html [ Crash ]
 crbug.com/626703 [ Mac10.12 ] external/wpt/html/cross-origin/anonymous.tentative.html [ Crash ]
@@ -4964,7 +4946,6 @@
 
 # Sheriff failures 2017-02-21
 crbug.com/73609 http/tests/media/video-play-stall.html [ Pass Timeout ]
-crbug.com/73609 virtual/audio-service/http/tests/media/video-play-stall.html [ Pass Timeout ]
 
 # Sheriff failures 2017-03-10
 crbug.com/741210 [ Mac ] inspector-protocol/emulation/device-emulation-restore.js [ Failure ]
@@ -4985,7 +4966,6 @@
 crbug.com/722212 virtual/mouseevent_fractional/fast/events/pointerevents/mouse-pointer-event-properties.html [ Failure Timeout Pass ]
 # Crashes on win
 crbug.com/722943 media/audio-repaint.html [ Skip ]
-crbug.com/722943 virtual/audio-service/media/audio-repaint.html [ Skip ]
 
 # Sheriff failures 2018-08-13
 crbug.com/873454 css3/filters/effect-reference-image-hw.html [ Failure Pass ]
@@ -5012,7 +4992,6 @@
 crbug.com/718155 fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
 crbug.com/718155 fullscreen/full-screen-restrictions.html [ Failure Timeout ]
 crbug.com/718155 media/video-controls-fullscreen-iframe-not-allowed.html [ Failure ]
-crbug.com/718155 virtual/audio-service/media/video-controls-fullscreen-iframe-not-allowed.html [ Failure ]
 crbug.com/718155 virtual/android/fullscreen/full-screen-iframe-not-allowed.html [ Failure ]
 crbug.com/718155 virtual/android/fullscreen/full-screen-restrictions.html [ Failure Timeout ]
 
@@ -5076,9 +5055,7 @@
 crbug.com/745887 [ Win ] fast/frames/sandboxed-iframe-plugins.html [ Failure Pass ]
 
 crbug.com/746128 [ Win7 Debug ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ]
-crbug.com/746128 [ Win7 Debug ] virtual/audio-service/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure ]
 crbug.com/746128 [ Mac ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure Pass ]
-crbug.com/746128 [ Mac ] virtual/audio-service/media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Failure Pass ]
 
 crbug.com/731018 [ Mac ] sensor/accelerometer.html [ Failure Pass Crash ]
 crbug.com/731018 [ Mac ] sensor/ambient-light-sensor.html [ Failure Pass Crash ]
@@ -5088,15 +5065,11 @@
 
 # Tests failing when enabling new modern media controls
 crbug.com/831942 media/webkit-media-controls-webkit-appearance.html [ Failure Pass ]
-crbug.com/831942 virtual/audio-service/media/webkit-media-controls-webkit-appearance.html [ Failure Pass ]
 crbug.com/831957 compositing/video/video-controls-layer-creation-squashing.html [ Failure Pass ]
 crbug.com/832157 external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-cue-rendering-after-controls-added.html [ Skip ]
 crbug.com/832169 media/media-controls-fit-properly-while-zoomed.html [ Failure Pass ]
-crbug.com/832169 virtual/audio-service/media/media-controls-fit-properly-while-zoomed.html [ Failure Pass ]
 crbug.com/832447 media/controls/controls-page-zoom-in.html [ Failure Pass ]
 crbug.com/832447 media/controls/controls-page-zoom-out.html [ Failure Pass ]
-crbug.com/832447 virtual/audio-service/media/controls/controls-page-zoom-in.html [ Failure Pass ]
-crbug.com/832447 virtual/audio-service/media/controls/controls-page-zoom-out.html [ Failure Pass ]
 crbug.com/849694 [ Mac ] http/tests/media/controls/toggle-class-with-state-source-buffer.html [ Failure Pass ]
 
 # ContentSecurityPolicy modifies the SchemeRegistry before some initialization.
@@ -5210,9 +5183,6 @@
 crbug.com/694855 media/audio-src-suspend-after-have-metadata.html [ Skip ]
 crbug.com/694855 media/video-src-skip-suspend-after-have-metadata.html [ Skip ]
 crbug.com/694855 media/video-src-suspend-after-have-metadata.html [ Skip ]
-crbug.com/694855 virtual/audio-service/media/audio-src-suspend-after-have-metadata.html [ Skip ]
-crbug.com/694855 virtual/audio-service/media/video-src-skip-suspend-after-have-metadata.html [ Skip ]
-crbug.com/694855 virtual/audio-service/media/video-src-suspend-after-have-metadata.html [ Skip ]
 
 ### See crbug.com/891427 comment near the top of this file:
 ###crbug.com/849979 media/video-layer-crash.html [ Pass Timeout ]
@@ -5262,7 +5232,6 @@
 
 # Sheriff failures 2017-10-23
 crbug.com/772411 http/tests/media/autoplay-crossorigin.html [ Timeout Failure Pass ]
-crbug.com/772411 virtual/audio-service/http/tests/media/autoplay-crossorigin.html [ Timeout Failure Pass ]
 crbug.com/777222 http/tests/devtools/inspect-iframe-from-different-domain.js [ Pass Failure Timeout ]
 
 crbug.com/778745 http/tests/inspector-protocol/cachestorage/read-cached-response.js [ Pass Failure ]
@@ -5339,12 +5308,6 @@
 crbug.com/783154 [ Mac ] media/controls/doubletap-on-play-button.html [ Skip ]
 crbug.com/783154 [ Mac ] media/controls/doubletap-to-toggle-fullscreen.html [ Skip ]
 crbug.com/783154 [ Mac ] media/controls/click-anywhere-to-play-pause.html [ Skip ]
-crbug.com/783154 [ Mac ] virtual/audio-service/media/controls/doubletap-to-jump-backwards.html [ Skip ]
-crbug.com/783154 [ Mac ] virtual/audio-service/media/controls/doubletap-to-jump-forwards.html [ Skip ]
-crbug.com/783154 [ Mac ] virtual/audio-service/media/controls/doubletap-to-jump-forwards-too-short.html [ Skip ]
-crbug.com/783154 [ Mac ] virtual/audio-service/media/controls/doubletap-on-play-button.html [ Skip ]
-crbug.com/783154 [ Mac ] virtual/audio-service/media/controls/doubletap-to-toggle-fullscreen.html [ Skip ]
-crbug.com/783154 [ Mac ] virtual/audio-service/media/controls/click-anywhere-to-play-pause.html [ Skip ]
 
 # Seen flaky on Linux, suppressing on Windows as well
 crbug.com/831720 [ Win ] media/controls/doubletap-to-jump-forwards-too-short.html [ Pass Failure ]
@@ -5352,11 +5315,6 @@
 crbug.com/831720 [ Mac ] media/controls/tap-to-hide-controls.html [ Pass Failure ]
 crbug.com/831720 [ Win ] media/controls/tap-to-hide-controls.html [ Pass Failure ]
 crbug.com/831720 [ Linux ] media/controls/tap-to-hide-controls.html [ Pass Failure ]
-crbug.com/831720 [ Win ] virtual/audio-service/media/controls/doubletap-to-jump-forwards-too-short.html [ Pass Failure ]
-crbug.com/831720 [ Linux ] virtual/audio-service/media/controls/doubletap-to-jump-forwards-too-short.html [ Pass Failure ]
-crbug.com/831720 [ Mac ] virtual/audio-service/media/controls/tap-to-hide-controls.html [ Pass Failure ]
-crbug.com/831720 [ Win ] virtual/audio-service/media/controls/tap-to-hide-controls.html [ Pass Failure ]
-crbug.com/831720 [ Linux ] virtual/audio-service/media/controls/tap-to-hide-controls.html [ Pass Failure ]
 
 crbug.com/802915 css3/blending/isolation-should-include-non-local-background.html [ Failure ]
 
@@ -5367,7 +5325,6 @@
 
 # Does not work on Mac
 crbug.com/793771 [ Mac ] media/controls/scrubbing.html [ Skip ]
-crbug.com/793771 [ Mac Win ] virtual/audio-service/media/controls/scrubbing.html [ Skip ]
 
 # Different paths may have different anti-aliasing pixels 2018-02-21
 skbug.com/7641 external/wpt/css/css-paint-api/paint2d-paths.https.html [ Failure Pass ]
@@ -5386,7 +5343,6 @@
 
 # Sheriff failures 2018-02-20
 crbug.com/789921 media/controls/repaint-on-resize.html [ Failure Pass ]
-crbug.com/789921 virtual/audio-service/media/controls/repaint-on-resize.html [ Failure Pass ]
 
 # Sheriff failures 2018-02-21
 crbug.com/814585 [ Linux ] fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-cjk.html [ Pass Failure ]
@@ -5413,9 +5369,7 @@
 crbug.com/807110 external/wpt/media-source/mediasource-sequencemode-append-buffer.html [ Failure Pass ]
 crbug.com/807110 external/wpt/media-source/mediasource-sourcebuffer-mode-timestamps.html [ Failure Pass ]
 crbug.com/794338 media/video-rotation.html [ Failure Pass ]
-crbug.com/794338 virtual/audio-service/media/video-rotation.html [ Failure Pass ]
 crbug.com/811605 media/video-poster-after-loadedmetadata.html [ Failure Pass ]
-crbug.com/811605 virtual/audio-service/media/video-poster-after-loadedmetadata.html [ Failure Pass ]
 
 crbug.com/813704 http/tests/images/png-partial-load-as-document.html [ Failure Pass ]
 
@@ -5450,8 +5404,6 @@
 # Sheriff 2018-03-22
 crbug.com/824775 [ Win ] media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
 crbug.com/824775 [ Mac ] media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
-crbug.com/824775 [ Win ] virtual/audio-service/media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
-crbug.com/824775 [ Mac ] virtual/audio-service/media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
 crbug.com/824848 [ Linux ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ]
 crbug.com/824848 [ Mac ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ]
 crbug.com/824848 [ Win ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ]
@@ -5472,9 +5424,7 @@
 
 # Sheriff 2018-03-26
 crbug.com/825733 [ Win ] media/color-profile-video-seek-filter.html [ Pass Timeout Failure ]
-crbug.com/825733 [ Win ] virtual/audio-service/media/color-profile-video-seek-filter.html [ Pass Timeout Failure ]
 crbug.com/754986 media/video-transformed.html [ Pass Failure ]
-crbug.com/754986 virtual/audio-service/media/video-transformed.html [ Pass Failure ]
 
 # Sheriff 2018-03-29
 crbug.com/827209 [ Win ] fast/events/middleClickAutoscroll-latching.html [ Pass Timeout Failure ]
@@ -5515,10 +5465,6 @@
 crbug.com/833658 [ Linux ] media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
 crbug.com/833658 [ Win ] media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
 crbug.com/833658 [ Mac ] media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
-crbug.com/833655 [ Linux ] virtual/audio-service/media/controls/closed-captions-dynamic-update.html [ Skip ]
-crbug.com/833658 [ Linux ] virtual/audio-service/media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
-crbug.com/833658 [ Win ] virtual/audio-service/media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
-crbug.com/833658 [ Mac ] virtual/audio-service/media/video-controls-focus-movement-on-hide.html [ Pass Failure ]
 
 # Sheriff 2018-04-23
 crbug.com/833331 [ Win10 ] inspector-protocol/page/pageNavigateToFragment.js [ Pass Failure ]
@@ -5811,7 +5757,6 @@
 # Sheriff 2018-11-26
 crbug.com/908276 [ Mac ] external/wpt/webstorage/storage_setitem.html [ Pass Timeout ]
 crbug.com/908347 media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ]
-crbug.com/908347 virtual/audio-service/media/autoplay/webaudio-audio-context-resume.html [ Failure Pass ]
 
 # Sheriff 2018-11-29
 crbug.com/910139 custom-elements/form-submission-file.html [ Crash Pass ]
@@ -5832,7 +5777,6 @@
 
 # Sheriff 2018-12-13
 crbug.com/910452 media/controls/buttons-after-reset.html [ Pass Failure ]
-crbug.com/910452 virtual/audio-service/media/controls/buttons-after-reset.html [ Pass Failure ]
 crbug.com/914782 [ Linux ] fast/scrolling/no-hover-during-scroll.html [ Pass Failure ]
 
 # Sheriff 2018-12-14
@@ -5910,9 +5854,6 @@
 crbug.com/922951 media/controls/overflow-menu-hide-on-click-outside-stoppropagation.html [ Skip ]
 crbug.com/922951 media/controls/overflow-menu-hide-on-click-outside.html [ Skip ]
 crbug.com/922951 media/controls/overflow-menu-toggle-class-for-animation.html [ Skip ]
-crbug.com/922951 virtual/audio-service/media/controls/overflow-menu-hide-on-click-outside-stoppropagation.html [ Skip ]
-crbug.com/922951 virtual/audio-service/media/controls/overflow-menu-hide-on-click-outside.html [ Skip ]
-crbug.com/922951 virtual/audio-service/media/controls/overflow-menu-toggle-class-for-animation.html [ Skip ]
 crbug.com/922951 scrollbars/resize-scales-with-dpi-150.html [ Skip ]
 crbug.com/922951 svg/animations/dynamic-modify-transform-without-baseval.html [ Skip ]
 crbug.com/922951 svg/animations/target-condition-crash.html [ Skip ]
@@ -5996,7 +5937,6 @@
 
 # Sheriff 2019-02-12
 crbug.com/931349 [ Mac ] media/video-played-ranges-1.html [ Failure Timeout Pass ]
-crbug.com/931349 [ Mac ] virtual/audio-service/media/video-played-ranges-1.html [ Failure Timeout Pass ]
 
 # Sheriff 2019-02-13
 crbug.com/931646 [ Win7 ] http/tests/preload/meta-viewport-link-headers-imagesrcset.html [ Failure Pass ]
@@ -6034,7 +5974,6 @@
 # Sheriff 2019-02-26
 crbug.com/936083 external/wpt/import-maps/builtin-import-scheme.tentative.html [ Failure Pass ]
 crbug.com/936165 media/autoplay-muted.html [ Timeout Pass ]
-crbug.com/936165 virtual/audio-service/media/autoplay-muted.html [ Timeout Pass ]
 
 # Sheriff 2019-02-27
 crbug.com/936279 external/wpt/import-maps/fallback-disallowed.sub.tentative.html [ Failure Pass Timeout ]
@@ -6068,7 +6007,6 @@
 
 # Caused a revert of a good change.
 crbug.com/931533 media/video-played-collapse.html [ Pass Failure ]
-crbug.com/931533 virtual/audio-service/media/video-played-collapse.html [ Pass Failure ]
 
 # Test was blocking WPT importer
 crbug.com/941471 external/wpt/css/css-transforms/transform-flattening-001.html [ Pass Failure Crash ]
@@ -6126,7 +6064,6 @@
 crbug.com/919789 images/image-zoom-to-25.html [ Pass Timeout ]
 crbug.com/919789 images/image-zoom-to-500.html [ Pass Timeout ]
 crbug.com/919789 media/controls/overflow-menu-hide-on-resize.html [ Pass Timeout ]
-crbug.com/919789 virtual/audio-service/media/controls/overflow-menu-hide-on-resize.html [ Pass Timeout ]
 crbug.com/919789 [ Linux Mac10.13 ] paint/invalidation/resize-iframe-text.html [ Pass Timeout ]
 crbug.com/919789 paint/invalidation/scroll/scrollbar-damage-and-full-viewport-repaint.html [ Pass Timeout ]
 crbug.com/919789 paint/invalidation/window-resize/ [ Pass Timeout ]
@@ -6253,14 +6190,9 @@
 crbug.com/963141 media/video-object-fit-change.html [ Pass Failure ]
 crbug.com/963141 [ Mac Win ] media/controls/video-overlay-cast-light-rendering.html [ Pass Failure ]
 crbug.com/963141 [ Mac ] media/video-aspect-ratio.html [ Pass Failure ]
-crbug.com/963141 [ Mac Win ] virtual/audio-service/media/video-object-fit.html [ Pass Failure ]
-crbug.com/963141 virtual/audio-service/media/video-object-fit-change.html [ Pass Failure ]
-crbug.com/963141 [ Mac Win ] virtual/audio-service/media/controls/video-overlay-cast-light-rendering.html [ Pass Failure ]
-crbug.com/963141 [ Mac ] virtual/audio-service/media/video-aspect-ratio.html [ Pass Failure ]
 
 # Sheriff 2019-05-16
 crbug.com/963141 [ Linux ] media/video-object-fit.html [ Pass Failure ]
-crbug.com/963141 [ Linux ] virtual/audio-service/media/video-object-fit.html [ Pass Failure ]
 crbug.com/963740 compositing/video-frame-size-change.html [ Pass Failure ]
 
 # Sheriff 2019-05-17
@@ -6277,7 +6209,6 @@
 crbug.com/963739 [ Fuchsia ] synthetic_gestures/smooth-scroll-tiny-delta.html [ Pass Timeout ]
 crbug.com/964239 external/wpt/css/css-scroll-snap/scroll-margin.html [ Pass Failure ]
 crbug.com/965389 [ Mac ] media/track/track-cue-rendering-position-auto.html [ Pass Failure ]
-crbug.com/965389 [ Mac ] virtual/audio-service/media/track/track-cue-rendering-position-auto.html [ Pass Failure ]
 
 # Sheriff 2019-05-27
 crbug.com/942411 [ Win ] http/tests/devtools/network/network-search.js [ Pass Timeout ]
@@ -6300,10 +6231,8 @@
 
 # Sheriff 2019-06-05
 crbug.com/971259 media/controls/volumechange-stopimmediatepropagation.html [ Pass Failure ]
-crbug.com/971259 virtual/audio-service/media/controls/volumechange-stopimmediatepropagation.html [ Pass Failure ]
 crbug.com/971262 http/tests/devtools/profiler/live-line-level-heap-profile.js [ Pass Timeout ]
 crbug.com/971319 [ Mac ] media/audio-garbage-collect.html [ Pass Timeout ]
-crbug.com/971319 [ Mac ] virtual/audio-service/media/audio-garbage-collect.html [ Pass Timeout ]
 
 # Sheriff 2019-06-06
 crbug.com/971590 fast/dom/timer-throttling-out-of-view-cross-origin-page.html [ Pass Failure ]
@@ -6426,9 +6355,6 @@
 crbug.com/986666 virtual/threaded/animations/web-animations/animation-state-changes-negative-playback-rate.html [ Pass Failure ]
 crbug.com/986666 virtual/disable-blink-gen-property-trees/animations/web-animations/animation-state-changes-negative-playback-rate.html [ Pass Failure ]
 
-crbug.com/987269 [ Linux ] virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Pass Failure ]
-crbug.com/987269 [ Linux ] virtual/audio-service/http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Pass Failure ]
-
 # Sheriff 2019-07-24
 crbug.com/986019 animations/play-state.html [ Pass Timeout ]
 crbug.com/986019 virtual/threaded/animations/play-state.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 2b6a2dd..db973a8 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -574,93 +574,93 @@
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/content-security-policy/inside-worker",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/content-security-policy/worker-src",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/fetch/",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/html/browsers/offline/appcache/workers/",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/mixed-content/classic-data-worker-fetch",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/mixed-content/module-data-worker-import",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/mixed-content/module-worker-top-level",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/mixed-content/worker-request",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/referrer-policy",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/resource-timing",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/service-workers",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/upgrade-insecure-requests",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/workers",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "external/wpt/xhr",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "fast/workers",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "http/tests/origin_trials",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "http/tests/security/cors-rfc1918",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch",
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch",
              "--enable-blink-features=CorsRFC1918"]
   },
   {
     "prefix": "omt-worker-fetch",
     "base": "http/tests/workers",
-    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch,OffMainThreadSharedWorkerScriptFetch"]
+    "args": ["--enable-features=OffMainThreadDedicatedWorkerScriptFetch,PlzDedicatedWorker,OffMainThreadServiceWorkerScriptFetch"]
   },
   {
     "prefix": "not-omt-sw-fetch",
@@ -1209,20 +1209,5 @@
     "prefix": "conditional-appcache-delay",
     "base": "http/tests/loading/appcache-delay",
     "args": ["--enable-features=VerifyHTMLFetchedFromAppCacheBeforeDelay"]
-  },
-  {
-    "prefix": "audio-service",
-    "base": "http/tests/media",
-    "args": ["--enable-features=AudioServiceOutOfProcess,AudioServiceSandbox"]
-  },
-  {
-    "prefix": "audio-service",
-    "base": "media",
-    "args": ["--enable-features=AudioServiceOutOfProcess,AudioServiceSandbox"]
-  },
-  {
-    "prefix": "audio-service",
-    "base": "external/wpt/mediacapture-streams",
-    "args": ["--enable-features=AudioServiceOutOfProcess,AudioServiceSandbox"]
   }
 ]
diff --git a/third_party/blink/web_tests/accessibility/appearance-affects-role.html b/third_party/blink/web_tests/accessibility/appearance-affects-role.html
index 959c991..1280353 100644
--- a/third_party/blink/web_tests/accessibility/appearance-affects-role.html
+++ b/third_party/blink/web_tests/accessibility/appearance-affects-role.html
@@ -106,7 +106,7 @@
     }, "Test computed AX role for <input type=reset>");
 
     test(function () {
-        check("isearch", "AXRole: AXTextField");
+        check("isearch", "AXRole: AXSearchBox");
     }, "Test computed AX role for <input type=search>");
 
     test(function () {
diff --git a/third_party/blink/web_tests/accessibility/computed-role-expected.txt b/third_party/blink/web_tests/accessibility/computed-role-expected.txt
index 25761d7..299c0af 100644
--- a/third_party/blink/web_tests/accessibility/computed-role-expected.txt
+++ b/third_party/blink/web_tests/accessibility/computed-role-expected.txt
@@ -90,7 +90,6 @@
 PASS implicitRoleElement.computedRole is "textbox"
 PASS implicitRoleElement.computedRole is "textbox"
 PASS implicitRoleElement.computedRole is "textbox"
-PASS implicitRoleElement.computedRole is "textbox"
 PASS roleElement.computedRole is "timer"
 PASS roleElement.computedRole is "toolbar"
 PASS roleElement.computedRole is "tooltip"
diff --git a/third_party/blink/web_tests/accessibility/computed-role.html b/third_party/blink/web_tests/accessibility/computed-role.html
index 00570f9..f22546f 100644
--- a/third_party/blink/web_tests/accessibility/computed-role.html
+++ b/third_party/blink/web_tests/accessibility/computed-role.html
@@ -174,7 +174,7 @@
       <div role="textbox" data-knownFailure>This is a textbox</div>
       <input type="email" data-role="textbox">
       <input type="password" data-role="textbox">
-      <input type="search" data-role="textbox">
+      <input type="search" data-role="searchbox">
       <input type="tel" data-role="textbox">
       <input type="text" data-role="textbox">
       <input type="url" data-role="textbox">
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
index 23eee724..619a6992 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_6.json
@@ -161965,6 +161965,9 @@
    "mathml/support/feature-detection.js": [
     []
    ],
+   "mathml/support/mathml-fragments.js": [
+    []
+   ],
    "mathml/tools/axisheight.py": [
     []
    ],
@@ -197796,6 +197799,12 @@
      {}
     ]
    ],
+   "cookies/cookie-enabled-noncookie-frame.html": [
+    [
+     "cookies/cookie-enabled-noncookie-frame.html",
+     {}
+    ]
+   ],
    "cookies/http-state/attribute-tests.html": [
     [
      "cookies/http-state/attribute-tests.html",
@@ -218136,6 +218145,12 @@
      {}
     ]
    ],
+   "dom/nodes/remove-and-adopt-crash.html": [
+    [
+     "dom/nodes/remove-and-adopt-crash.html",
+     {}
+    ]
+   ],
    "dom/nodes/remove-unscopable.html": [
     [
      "dom/nodes/remove-unscopable.html",
@@ -249813,6 +249828,18 @@
      {}
     ]
    ],
+   "mathml/relations/css-styling/attribute-mapping-001.html": [
+    [
+     "mathml/relations/css-styling/attribute-mapping-001.html",
+     {}
+    ]
+   ],
+   "mathml/relations/css-styling/attribute-mapping-002.html": [
+    [
+     "mathml/relations/css-styling/attribute-mapping-002.html",
+     {}
+    ]
+   ],
    "mathml/relations/css-styling/displaystyle-1.html": [
     [
      "mathml/relations/css-styling/displaystyle-1.html",
@@ -324670,6 +324697,10 @@
    "ed86aebf1837646e2808619e446d03bfe5b86000",
    "support"
   ],
+  "cookies/cookie-enabled-noncookie-frame.html": [
+   "539d715ebd5344de4cf02b6485462b31bc167525",
+   "testharness"
+  ],
   "cookies/http-state/attribute-tests.html": [
    "8cb820564f455ea545ce0124bb477a211141bc5d",
    "testharness"
@@ -412330,6 +412361,10 @@
    "7eb1baf15f05f95545a563fe216eac0655c38a74",
    "support"
   ],
+  "dom/nodes/remove-and-adopt-crash.html": [
+   "d37015ec9f923bfc74319631723defa0b222654d",
+   "testharness"
+  ],
   "dom/nodes/remove-unscopable.html": [
    "0238b0fa97a40dd9e5058d4153d1483553552033",
    "testharness"
@@ -442107,11 +442142,11 @@
    "testharness"
   ],
   "largest-contentful-paint/contracted-image.html": [
-   "7dc9e7a899d4d81074e842396b494a733668e278",
+   "e099a5e42f6d3fd7982a7e298c53b860258f8c70",
    "testharness"
   ],
   "largest-contentful-paint/cross-origin-image.sub.html": [
-   "88775b861a6b98b1af0fb5163222a1025a6df02e",
+   "7669d4647802f54f4d04b7b7a6b0a9ccc19b9f11",
    "testharness"
   ],
   "largest-contentful-paint/element-only-when-fully-active.html": [
@@ -442119,7 +442154,7 @@
    "testharness"
   ],
   "largest-contentful-paint/expanded-image.html": [
-   "766b61d013da2cefddb9e35398648d4fa2a2bded",
+   "9f64189eda60bc74b41d2526e577dcd0e0cf88d2",
    "testharness"
   ],
   "largest-contentful-paint/idlharness.html": [
@@ -442127,11 +442162,11 @@
    "testharness"
   ],
   "largest-contentful-paint/image-src-change.html": [
-   "3e083625bdc1812a2c344b8eefaaa10d3b31e623",
+   "84a49f7ea2220c43c083f91057763ae161035532",
    "testharness"
   ],
   "largest-contentful-paint/loadTime-after-appendChild.html": [
-   "fb0eddb220ec660d529a43b112c576bf146a87e8",
+   "43ec9f6085d605098faeddce311b5ccbc626b073",
    "testharness"
   ],
   "largest-contentful-paint/observe-after-untrusted-scroll.html": [
@@ -442139,15 +442174,15 @@
    "testharness"
   ],
   "largest-contentful-paint/observe-image.html": [
-   "16b3502eb340cbce179bf440c245cafafe4beea4",
+   "a9556ebaa60d04c154c8043fe7c48fbd7ec38700",
    "testharness"
   ],
   "largest-contentful-paint/observe-text.html": [
-   "2cf1344f2557d5bddd22eaf4ae4fed99d89267a1",
+   "a2a376fde335cb2b9e05c8923998bfc15c2695f1",
    "testharness"
   ],
   "largest-contentful-paint/repeated-image.html": [
-   "94406b20d62b417a690ce6a96d909bb29c791081",
+   "d25d4735c9747cb27bffdd640e1127f9fb9c075c",
    "testharness"
   ],
   "largest-contentful-paint/resources/iframe-stores-entry.html": [
@@ -442842,6 +442877,14 @@
    "3eaf9c8fff483232eb6794b603f270bb86c47d3d",
    "testharness"
   ],
+  "mathml/relations/css-styling/attribute-mapping-001.html": [
+   "347b571b1d681640cabec6c0ce7e940e523fa66b",
+   "testharness"
+  ],
+  "mathml/relations/css-styling/attribute-mapping-002.html": [
+   "1a8b7ca16d10ef191276f3dcbbe209eda14111f0",
+   "testharness"
+  ],
   "mathml/relations/css-styling/color-001-ref.html": [
    "0efca480eec5a3da684fe79a429982b139b202e4",
    "support"
@@ -443230,6 +443273,10 @@
    "50ca926d25ea810177068a5f5de29f39749db7e6",
    "support"
   ],
+  "mathml/support/mathml-fragments.js": [
+   "5de537ca42af4a4763c5acf9307d2017214680db",
+   "support"
+  ],
   "mathml/tools/axisheight.py": [
    "43827e7031665bdd57ee54e208ea0f875a9a60ec",
    "support"
@@ -444067,7 +444114,7 @@
    "testharness"
   ],
   "mediacapture-image/ImageCapture-MediaTrackSupportedConstraints.https.html": [
-   "9ec5261b9dc48ea143c60946d72233a9eb5d7261",
+   "fddeb60d0c24d9ceebd8f9df324467ae1cc32550",
    "testharness"
   ],
   "mediacapture-image/ImageCapture-creation.https.html": [
@@ -444091,7 +444138,7 @@
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-applyConstraints-getSettings.html": [
-   "4900336549f4a92f449233d24abf97f84f055102",
+   "9d985de66de4a476ddb68802603b212efd7c40b6",
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-applyConstraints-reject.html": [
@@ -444099,7 +444146,7 @@
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-applyConstraints.html": [
-   "c87f954c682cb6869040ebc67f6245902cec1267",
+   "da3de3ec0f90cbad2563e41c9aa228c1297945e6",
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-getCapabilities-fast.html": [
@@ -444107,11 +444154,11 @@
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-getCapabilities.html": [
-   "9e34f2389cc4e446767df2aa4991cb43b8c95c7a",
+   "e7b196f510a0baee4096f58f0fce7d868a977d88",
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-getConstraints-fast.html": [
-   "16f869cf119faa7eaa043ff6d65fa31b2998315b",
+   "3b1e2e0f2ca51e74222b36cb1d98a32a67e2a20b",
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-getSettings-fast.html": [
@@ -444119,7 +444166,7 @@
    "testharness"
   ],
   "mediacapture-image/MediaStreamTrack-getSettings.html": [
-   "8535f298bfab2ebca9dd3b37a0cc4f8538623203",
+   "a1a864c2445d844c5d6fd88dd48e1f6839ae9528",
    "testharness"
   ],
   "mediacapture-image/detached-HTMLCanvasElement.html": [
@@ -455639,7 +455686,7 @@
    "testharness"
   ],
   "pointerevents/pointerlock/pointerevent_pointermove_in_pointerlock.html": [
-   "b2251d660e7176627204e4d48dc591033501554e",
+   "5ad3de354574d4bde5668dfc3dec479fe252a385",
    "testharness"
   ],
   "pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked.html": [
@@ -466211,7 +466258,7 @@
    "support"
   ],
   "resources/chromium/image_capture.mojom.js": [
-   "50428ffcb80c736c1f63f8a91e0c65ff472ef463",
+   "f145d7a3402543a18229629da0133dea81dd3755",
    "support"
   ],
   "resources/chromium/mock-barcodedetection.js": [
@@ -466231,7 +466278,7 @@
    "support"
   ],
   "resources/chromium/mock-imagecapture.js": [
-   "329cbc3a761dc5720b7a67ed09ef68aec6a8bc3d",
+   "eec414bd032a2dd01f27e18de64df0bde4e4a459",
    "support"
   ],
   "resources/chromium/mojo_bindings.js": [
@@ -471087,7 +471134,7 @@
    "support"
   ],
   "shape-detection/resources/shapedetection-helpers.js": [
-   "91d36658aab0bf9435cfc9d283be45ef1292e2ed",
+   "de1e681de9fb8520d97381b3e6a844bcfc84b1f2",
    "support"
   ],
   "shape-detection/shapedetection-cross-origin.sub.https.html": [
@@ -485187,7 +485234,7 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-createDataChannel-expected.txt": [
-   "8d92a639d7d1dc0e642a262d781ea70d510d7478",
+   "74dac5eded6acf2de528ce5336c2ab23adb2bcea",
    "support"
   ],
   "webrtc/RTCPeerConnection-createDataChannel.html": [
@@ -485259,7 +485306,7 @@
    "testharness"
   ],
   "webrtc/RTCPeerConnection-ondatachannel-expected.txt": [
-   "d04de3ba27102ce318f9cd68e1cb91b1b76da7b6",
+   "1e0c99b89ba14704f795efd5e43f8d7a7d448c40",
    "support"
   ],
   "webrtc/RTCPeerConnection-ondatachannel.html": [
@@ -485611,7 +485658,7 @@
    "testharness"
   ],
   "webrtc/historical-expected.txt": [
-   "4353e8649e10e9f6c79895c7ff82bbbe2324c2c4",
+   "68050e46488fde9f9ec27a45e978ca73790faf18",
    "support"
   ],
   "webrtc/historical.html": [
@@ -485619,7 +485666,7 @@
    "testharness"
   ],
   "webrtc/idlharness.https.window-expected.txt": [
-   "2671b880c6f8d24e05efab15bf321b7064419ca3",
+   "026738e7ccba9aa262368180f21dd6ad46af99f8",
    "support"
   ],
   "webrtc/idlharness.https.window.js": [
@@ -490407,7 +490454,7 @@
    "support"
   ],
   "webxr/resources/webxr_util.js": [
-   "022aca8c93e232f00c2d76de5580231af59ff487",
+   "f8c7f0f81c7014dad1f5292836f3ee208a5b6830",
    "support"
   ],
   "webxr/webGLCanvasContext_create_xrcompatible.https.html": [
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/image-TAO.sub.html b/third_party/blink/web_tests/external/wpt/element-timing/image-TAO.sub.html
index 032ae6b..0906b361 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/image-TAO.sub.html
+++ b/third_party/blink/web_tests/external/wpt/element-timing/image-TAO.sub.html
@@ -45,7 +45,7 @@
           else {
             assert_unreached('Should be in one of valid_tao OR invalid_tao');
           }
-          checkNaturalSize(entry, 20, 20);
+          checkNaturalSize(entry, 100, 100);
           if (img_count == total_images)
             t.done();
         });
diff --git a/third_party/blink/web_tests/external/wpt/element-timing/resources/TAOImage.py b/third_party/blink/web_tests/external/wpt/element-timing/resources/TAOImage.py
index 1e0afb3..6969166 100644
--- a/third_party/blink/web_tests/external/wpt/element-timing/resources/TAOImage.py
+++ b/third_party/blink/web_tests/external/wpt/element-timing/resources/TAOImage.py
@@ -41,5 +41,5 @@
     else:
         pass
     response.headers.set("Cache-Control", "no-cache, must-revalidate");
-    image_path = os.path.join(os.path.dirname(__file__), "square20.png");
+    image_path = os.path.join(os.path.dirname(__file__), "square100.png");
     response.content = open(image_path, mode='rb').read();
diff --git a/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-TAO.sub.html b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-TAO.sub.html
new file mode 100644
index 0000000..9409fd8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/largest-contentful-paint/image-TAO.sub.html
@@ -0,0 +1,60 @@
+<!DOCTYPE HTML>
+<meta charset=utf-8>
+<title>Largest Contentful Paint: observe cross origin images with various Timing-Allow-Origin headers</title>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/element-timing-helpers.js"></script>
+<div id='my_div'></div>
+<script>
+  async_test(t => {
+    if (!window.PerformanceElementTiming) {
+      assert_unreached("PerformanceElementTiming is not implemented");
+    }
+    const remote_img = 'http://{{domains[www]}}:{{ports[http][1]}}/element-timing/resources/TAOImage.py?'
+        + 'origin=' + window.location.origin +'&tao=';
+    const valid_tao = ['wildcard', 'origin', 'multi', 'multi_wildcard', 'match_origin', 'match_wildcard'];
+    const invalid_tao = ['null', 'space', 'uppercase'];
+    const div = document.getElementById('my_div');
+    let img_size = 20;
+    function addImage(tao) {
+      const img = document.createElement('img');
+      img.src = remote_img + tao;
+      img.id = tao;
+      img.height = img_size;
+      img.width = img_size;
+      // Set increasing size so that largest-contentful-paint captures all of them.
+      img_size += 1;
+      div.appendChild(img);
+    }
+    let img_count = 0;
+    const total_images = valid_tao.length + invalid_tao.length;
+    new PerformanceObserver(
+      t.step_func(entryList => {
+        assert_equals(entryList.getEntries().length, 1);
+        const entry = entryList.getEntries()[0];
+        assert_greater_than(entry.loadTime, 0);
+        const tao = entry.id;
+        if (valid_tao.includes(tao))
+          assert_greater_than(entry.renderTime, 0, 'Image with valid TAO should have renderTime');
+        else if (invalid_tao.includes(tao))
+          assert_equals(entry.renderTime, 0, 'Image with invalid TAO should not have renderTime');
+        else
+          assert_unreached('Should be in one of valid_tao OR invalid_tao');
+        img_count++;
+        // Process valid TAO images first.
+        if (img_count < valid_tao.length)
+          addImage(valid_tao[img_count]);
+        // Then add invalid TAO images.
+        else if (img_count < total_images)
+          addImage(invalid_tao[img_count - valid_tao.length]);
+        // Once we've seen all the images, end the test.
+        else
+          t.done();
+      })
+    ).observe({type: 'largest-contentful-paint'});
+    // Add first image, the rest will be added on each observer callback.
+    addImage(valid_tao[0]);
+  }, 'Cross-origin elements with valid TAO have correct renderTime, with invalid TAO have renderTime set to 0.');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/attribute-mapping-001.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/attribute-mapping-001.html
new file mode 100644
index 0000000..347b571
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/attribute-mapping-001.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Attribute mapping</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#legacy-mathml-style-attributes">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#attributes-common-to-html-and-mathml-elements">
+<meta name="assert" content="Verify that dir, mathcolor, mathbackground and mathsize are mapped to CSS">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/mathml-fragments.js"></script>
+<style>
+  #container {
+      color: blue;
+      font-size: 50px;
+  }
+</style>
+<script>
+  setup({ explicit_done: true });
+  window.addEventListener("load", runTests);
+  function runTests() {
+      var container = document.getElementById("container");
+      for (tag in MathMLFragments) {
+          container.insertAdjacentHTML("beforeend", `<math>${MathMLFragments[tag]}</math>`);
+      }
+      Array.from(document.getElementsByClassName("element")).forEach(element => {
+          var tag = element.tagName;
+          var style = window.getComputedStyle(element);
+
+          test(function() {
+              assert_equals(style.getPropertyValue("direction"), "ltr", "no attribute");
+              element.setAttribute("dir", "rtl");
+              assert_equals(style.getPropertyValue("direction"), "rtl", "attribute specified");
+          }, `dir on the ${tag} element is mapped to CSS direction`)
+
+          test(function() {
+              assert_equals(style.getPropertyValue("color"), "rgb(0, 0, 255)", "no attribute");
+              element.setAttribute("mathcolor", "black");
+              assert_equals(style.getPropertyValue("color"), "rgb(0, 0, 0)", "attribute specified");
+          }, `mathcolor on the ${tag} element is mapped to CSS color`);
+
+          test(function() {
+              assert_equals(style.getPropertyValue("background-color"), "rgba(0, 0, 0, 0)", "no attribute");
+              element.setAttribute("mathbackground", "lightblue");
+              assert_equals(style.getPropertyValue("background-color"), "rgb(173, 216, 230)", "attribute specified");
+          }, `mathbackground on the ${tag} element is mapped to CSS background-color`);
+
+          test(function() {
+              assert_equals(style.getPropertyValue("font-size"), "50px", "no attribute");
+              element.setAttribute("mathsize", "20px");
+              assert_equals(style.getPropertyValue("font-size"), "20px", "attribute specified");
+          }, `mathsize on the ${tag} element is mapped to CSS font-size`);
+      });
+
+      done();
+  }
+</script>
+</head>
+<body>
+  <div id="log"></div>
+  <div id="container">
+    <math class="element"></math>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/attribute-mapping-002.html b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/attribute-mapping-002.html
new file mode 100644
index 0000000..1a8b7ca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/relations/css-styling/attribute-mapping-002.html
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>Attribute mapping</title>
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-mathvariant-attribute">
+<link rel="help" href="https://mathml-refresh.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes">
+<meta name="assert" content="Verify that mathvariant, scriptlevel, displaystyle are mapped to CSS">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/mathml/support/mathml-fragments.js"></script>
+<script>
+  setup({ explicit_done: true });
+  window.addEventListener("load", runTests);
+  function runTests() {
+      var container = document.getElementById("container");
+      for (tag in MathMLFragments) {
+          container.insertAdjacentHTML("beforeend", `<math>${MathMLFragments[tag]}</math>`);
+      }
+      Array.from(document.getElementsByClassName("element")).forEach(element => {
+          var tag = element.tagName;
+          var style = window.getComputedStyle(element);
+
+          test(function() {
+              assert_equals(style.getPropertyValue("text-transform"), "none", "no attribute");
+              element.setAttribute("mathvariant", "fraktur");
+              assert_equals(style.getPropertyValue("text-transform"), "math-fraktur", "attribute specified");
+          }, `mathvariant on the ${tag} element is mapped to CSS text-transform`)
+
+          test(function() {
+              assert_equals(style.getPropertyValue("math-script-level"), "0", "no attribute");
+              element.setAttribute("scriptlevel", "10");
+              assert_equals(style.getPropertyValue("math-script-level"), "10", "attribute specified");
+          }, `scriptlevel on the ${tag} element is mapped to CSS math-script-level`);
+
+          test(function() {
+              assert_equals(style.getPropertyValue("math-style"), "inline", "no attribute");
+              element.setAttribute("displaystyle", "true");
+              assert_equals(style.getPropertyValue("math-style"), "display", "attribute specified");
+          }, `displaystyle on the ${tag} element is mapped to CSS math-style`);
+      });
+
+      done();
+  }
+</script>
+</head>
+<body>
+  <div id="log"></div>
+  <div id="container">
+    <math class="element"></math>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/mathml/support/mathml-fragments.js b/third_party/blink/web_tests/external/wpt/mathml/support/mathml-fragments.js
new file mode 100644
index 0000000..5de537c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/mathml/support/mathml-fragments.js
@@ -0,0 +1,117 @@
+var MathMLFragments = {
+    "annotation": "\
+<semantics>\
+  <mrow></mrow>\
+  <annotation class='element text-container'></annotation>\
+</semantics>",
+    "annotation-xml": "\
+<semantics>\
+  <mrow></mrow>\
+  <annotation-xml class='element text-container foreign-container'></annotation-xml>\
+</semantics>",
+    "maction": "\
+<maction class='element' actiontype='statusline'>\
+  <mrow class='mathml-container'></mrow>\
+  <mtext class='text-container'></mtext>\
+</maction>",
+    "menclose": "<menclose class='element mathml-container'></menclose>",
+    "merror": "<merror class='element mathml-container'></merror>",
+    "mfrac": "\
+<mfrac class='element'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</mfrac>",
+    "mi": "<mi class='element text-container foreign-container'></mi>",
+    "mmultiscripts": "\
+<mmultiscripts class='element'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</mmultiscripts>",
+    "mn": "<mn class='element text-container foreign-container'></mn>",
+    "mo": "<mo class='element text-container foreign-container'></mo>",
+    "mover": "\
+<mover class='element'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</mover>",
+    "mpadded": "<mpadded class='element mathml-container'></mpadded>",
+    "mphantom": "<mphantom class='element mathml-container'></mphantom>",
+    "mprescripts": "\
+<mmultiscripts>\
+  <mrow class='mathml-container'></mrow>\
+  <mprescripts class='element'/>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</mmultiscripts>",
+    "mroot": "\
+<mroot class='element'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</mroot>",
+    "mrow": "<mrow class='element mathml-container'></mrow>",
+    "ms": "<ms class='element text-container foreign-container'></ms>",
+    "mspace": "<mspace class='element'></mspace>",
+    "msqrt": "<msqrt class='element mathml-container'></msqrt>",
+    "mstyle": "<mstyle class='element mathml-container'></mstyle>",
+    "msub": "\
+<msub class='element mathml-container'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</msub>",
+    "msubsup": "\
+<msubsup class='element mathml-container'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</msubsup>",
+    "msup": "\
+<msup class='element mathml-container'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</msup>",
+    "mtable": "\
+<mtable class='element'>\
+  <mtr>\
+    <mtd class='mathml-container'>\
+    </mtd>\
+  </mtr>\
+</mtable>",
+    "mtd": "\
+<mtable>\
+  <mtr>\
+    <mtd class='element mathml-container'>\
+    </mtd>\
+  </mtr>\
+</mtable>",
+    "mtext": "<mtext class='element text-container foreign-container'></mtext>",
+    "mtr": "\
+<mtable>\
+  <mtr class='element'>\
+    <mtd class='mathml-container'>\
+    </mtd>\
+  </mtr>\
+</mtable>",
+    "munder": "\
+<munder class='element'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</munder>",
+    "munderover": "\
+<munderover class='element'>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+  <mrow class='mathml-container'></mrow>\
+</munderover>",
+    "none": "\
+<mmultiscripts>\
+  <mrow class='mathml-container'></mrow>\
+  <none class='element'/>\
+  <mrow class='mathml-container'></mrow>\
+</mmultiscripts>",
+    "semantics": "\
+<semantics class='element>\
+  <mrow class='mathml-container'></mrow>\
+  <annotation class='text-container'></annotation>\
+</semantics>"
+};
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..56bc119a
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-appearance-basic.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-appearance-basic.html
new file mode 100644
index 0000000..bd73c66
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-appearance-basic.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<script src="../../../../resources/run-after-layout-and-paint.js"></script>
+<script src="../../resources/common.js"></script>
+<body>
+
+<!-- no style for reference -->
+<ul>
+  <li>Date: <input type="date" /></li>
+</ul>
+
+<!-- disabled, readonly -->
+<ul>
+  <li>Date disabled: <input type="date" disabled/></li>
+  <li>Date readonly: <input type="date" readonly/></li>
+</ul>
+
+<!-- RTL -->
+<ul>
+  <li>Date RTL: <input type="date" value="2019-02-14" dir="rtl"/></li>
+</ul>
+
+<!-- font-size, font-weight -->
+<ul>
+  <li>Date font-size, font-weight: <input type="date" value="2019-02-14" style="font-size: 36px; font-weight: bold;"/> </li>
+</ul>
+
+<!-- hover -->
+<ul>
+  <li>Date hover: <input type="date" id="hoverTarget" value="2019-02-14"/></li>
+</ul>
+
+<!-- small width -->
+<ul>
+  <li>Date width: 10px: <input type="date" value="2019-02-14" style="width: 10px;"/> </li>
+</ul>
+
+<!-- zoom -->
+<ul>
+  <li>Date zoom: 1.5: <input type="date" style="zoom: 1.5;"/></li>
+  <li>Date zoom: 3: <input type="date" style="zoom: 3;"/></li>
+</ul>
+
+<script>
+
+if (window.testRunner)
+  testRunner.setUseMockTheme(false);
+
+runAfterLayoutAndPaint(function() {
+  var target = document.getElementById('hoverTarget');
+  hoverOverElement(target);
+}, true);
+
+</script>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-with-csp-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-with-csp-expected.html
new file mode 100644
index 0000000..6a0d0350b3
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-with-csp-expected.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<head>
+<style>
+#custom-icon::-webkit-calendar-picker-indicator {
+  background-image: none;
+}
+</style>
+</head>
+<body>
+
+<!-- no style for reference -->
+<input type="date" />
+
+<!-- date with custom icon blocked by CSP -->
+<input type="data" id="custom-icon"/>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-with-csp.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-with-csp.html
new file mode 100644
index 0000000..6cc5b5b9
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/date-with-csp.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<head>
+<style>
+#custom-icon::-webkit-calendar-picker-indicator {
+  background-image: -webkit-image-set(url(resources/time_icon.svg) 1x);
+}
+</style>
+<link rel="match" href="date-with-csp-expected.html">
+<meta http-equiv="content-security-policy" content="default-src 'none'">
+</head>
+<body>
+
+<!-- no style for reference -->
+<input type="date" />
+
+<!-- date with custom icon blocked by CSP -->
+<input type="data" id="custom-icon"/>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/date/resources/time_icon.svg b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/resources/time_icon.svg
new file mode 100644
index 0000000..464453a
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/date/resources/time_icon.svg
@@ -0,0 +1,3 @@
+<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M7 14C6.35417 14 5.73177 13.9167 5.13281 13.75C4.53906 13.5833 3.98177 13.349 3.46094 13.0469C2.94531 12.7396 2.47396 12.375 2.04688 11.9531C1.625 11.526 1.26042 11.0547 0.953125 10.5391C0.651042 10.0182 0.416667 9.46094 0.25 8.86719C0.0833333 8.26823 0 7.64583 0 7C0 6.35417 0.0833333 5.73438 0.25 5.14062C0.416667 4.54167 0.651042 3.98438 0.953125 3.46875C1.26042 2.94792 1.625 2.47656 2.04688 2.05469C2.47396 1.6276 2.94531 1.26302 3.46094 0.960938C3.98177 0.653646 4.53906 0.416667 5.13281 0.25C5.73177 0.0833333 6.35417 0 7 0C7.64583 0 8.26562 0.0833333 8.85938 0.25C9.45833 0.416667 10.0156 0.653646 10.5312 0.960938C11.0521 1.26302 11.5234 1.6276 11.9453 2.05469C12.3724 2.47656 12.737 2.94792 13.0391 3.46875C13.3464 3.98438 13.5833 4.54167 13.75 5.14062C13.9167 5.73438 14 6.35417 14 7C14 7.64583 13.9167 8.26823 13.75 8.86719C13.5833 9.46094 13.3464 10.0182 13.0391 10.5391C12.737 11.0547 12.3724 11.526 11.9453 11.9531C11.5234 12.375 11.0521 12.7396 10.5312 13.0469C10.0156 13.349 9.45833 13.5833 8.85938 13.75C8.26562 13.9167 7.64583 14 7 14ZM7 1C6.17188 1 5.39323 1.15885 4.66406 1.47656C3.9401 1.78906 3.30469 2.21875 2.75781 2.76562C2.21615 3.30729 1.78646 3.94271 1.46875 4.67188C1.15625 5.39583 1 6.17188 1 7C1 7.82812 1.15625 8.60677 1.46875 9.33594C1.78646 10.0599 2.21615 10.6953 2.75781 11.2422C3.30469 11.7839 3.9401 12.2135 4.66406 12.5312C5.39323 12.8438 6.17188 13 7 13C7.82812 13 8.60417 12.8438 9.32812 12.5312C10.0573 12.2135 10.6927 11.7839 11.2344 11.2422C11.7812 10.6953 12.2109 10.0599 12.5234 9.33594C12.8411 8.60677 13 7.82812 13 7C13 6.17188 12.8411 5.39583 12.5234 4.67188C12.2109 3.94271 11.7812 3.30729 11.2344 2.76562C10.6927 2.21875 10.0573 1.78906 9.32812 1.47656C8.60417 1.15885 7.82812 1 7 1ZM7 7V3H6V8H10V7H7Z" fill="#101010"/>
+</svg>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..868d1c7a
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic.html
new file mode 100644
index 0000000..7f8aae7
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<script src="../../../../resources/run-after-layout-and-paint.js"></script>
+<script src="../../resources/common.js"></script>
+<body>
+
+<!-- no style for reference -->
+<ul>
+  <li>Datetime-local: <input type="datetime-local" /></li>
+</ul>
+
+<!-- disabled, readonly -->
+<ul>
+  <li>Datetime-local disabled: <input type="datetime-local" disabled/></li>
+  <li>Datetime-local readonly: <input type="datetime-local" readonly/></li>
+</ul>
+
+<!-- RTL -->
+<ul>
+  <li>Datetime-local RTL: <input type="datetime-local" value="2019-02-14T13:02" dir="rtl"/></li>
+</ul>
+
+<!-- font-size, font-weight -->
+<ul>
+  <li>Datetime-local font-size, font-weight: <input type="datetime-local" value="2019-02-14T13:02" style="font-size: 36px; font-weight: bold;"/> </li>
+</ul>
+
+<!-- hover -->
+<ul>
+  <li>Datetime-local hover: <input type="datetime-local" id="hoverTarget" value="2019-02-14T13:02"/></li>
+</ul>
+
+<!-- small width -->
+<ul>
+  <li>Datetime-local width: 10px: <input type="datetime-local" style="width: 10px;"/> </li>
+</ul>
+
+<!-- zoom -->
+<ul>
+  <li>Datetime-local zoom: 1.5: <input type="datetime-local" style="zoom: 1.5;"/></li>
+  <li>Datetime-local zoom: 3: <input type="datetime-local" style="zoom: 3;"/></li>
+</ul>
+
+<script>
+
+if (window.testRunner)
+  testRunner.setUseMockTheme(false);
+
+runAfterLayoutAndPaint(function() {
+  var target = document.getElementById('hoverTarget');
+  hoverOverElement(target);
+}, true);
+
+</script>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..20f99448
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/month/month-appearance-basic.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/month/month-appearance-basic.html
new file mode 100644
index 0000000..e92c586d
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/month/month-appearance-basic.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<script src="../../../../resources/run-after-layout-and-paint.js"></script>
+<script src="../../resources/common.js"></script>
+<body>
+
+<!-- no style for reference -->
+<ul>
+  <li>Month: <input type="month" /></li>
+</ul>
+
+<!-- disabled, readonly -->
+<ul>
+  <li>Month disabled: <input type="month" disabled/></li>
+  <li>Month readonly: <input type="month" readonly/></li>
+</ul>
+
+<!-- RTL -->
+<ul>
+  <li>Month RTL: <input type="month" value="2019-02" dir="rtl"/></li>
+</ul>
+
+<!-- font-size, font-weight -->
+<ul>
+  <li>Month font-size, font-weight: <input type="month" value="2019-02" style="font-size: 36px; font-weight: bold;"/> </li>
+</ul>
+
+<!-- hover -->
+<ul>
+  <li>Month hover: <input type="month" id="hoverTarget" value="2019-02"/></li>
+</ul>
+
+<!-- small width -->
+<ul>
+  <li>Month width: 10px: <input type="month" style="width: 10px;"/> </li>
+</ul>
+
+<!-- zoom -->
+<ul>
+  <li>Month zoom: 1.5: <input type="month" style="zoom: 1.5;"/></li>
+  <li>Month zoom: 3: <input type="month" style="zoom: 3;"/></li>
+</ul>
+
+<script>
+
+if (window.testRunner)
+  testRunner.setUseMockTheme(false);
+
+runAfterLayoutAndPaint(function() {
+  var target = document.getElementById('hoverTarget');
+  hoverOverElement(target);
+}, true);
+
+</script>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..5e166cf
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..5e166cf
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-twice.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-twice.html
new file mode 100644
index 0000000..5df1974
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8-twice.html
@@ -0,0 +1,9 @@
+<input type="password" id="passwd">
+
+<script>
+    // This verifies pressing hotkey Alt-F8 twice can obscure the password again.
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+    eventSender.keyDown('F8', ['altKey']);
+    eventSender.keyDown('F8', ['altKey']);
+</script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8.html
new file mode 100644
index 0000000..4af10a8
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-alt-f8.html
@@ -0,0 +1,8 @@
+<input type="password" id="passwd">
+
+<script>
+    // This verifies pressing hotkey Alt-F8 once can reveal reveal the password.
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+    eventSender.keyDown('F8', ['altKey']);
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..e7c9d6b
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px.html
new file mode 100644
index 0000000..fccb6e37
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px.html
@@ -0,0 +1,7 @@
+<input type="password" id="passwd" style="font-size:48px;">
+
+<script>
+    // This verifies the eye icon scales correctly with different font size. (48px)
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..2399ca6
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px.html
new file mode 100644
index 0000000..b7d1ae24
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px.html
@@ -0,0 +1,7 @@
+<input type="password" id="passwd" style="font-size:4px;">
+
+<script>
+    // This verifies the eye icon scales correctly with different font size. (4px)
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..e2dc95d
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x.html
new file mode 100644
index 0000000..b9273a9f
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x.html
@@ -0,0 +1,7 @@
+<input type="password" id="passwd" style="zoom:0.5;">
+
+<script>
+    // This verifies the eye icon scales correctly with different zoom level. (zoom: 0.5x)
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..67bcee9
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x.html
new file mode 100644
index 0000000..2e1c70e
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x.html
@@ -0,0 +1,7 @@
+<input type="password" id="passwd" style="zoom:4;">
+
+<script>
+    // This verifies the eye icon scales correctly with different zoom level. (zoom: 4x)
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-losing-focus-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-losing-focus-expected.html
new file mode 100644
index 0000000..b631af0
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-losing-focus-expected.html
@@ -0,0 +1 @@
+<input type="text" id="pass1" value="a" style="-webkit-text-security:disc;">
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-losing-focus.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-losing-focus.html
new file mode 100644
index 0000000..bbf74da7
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-losing-focus.html
@@ -0,0 +1,12 @@
+<link rel="match" href="password-losing-focus-expected.html">
+
+<input type="password" id="passwd">
+
+<script>
+    // The verifies the reveal-password button doesn't appear if the password control loses focus.
+    var passwd = document.getElementById("passwd");
+    passwd.focus();
+    eventSender.keyDown('a'); // pass1 shows the reveal-password button.
+    eventSender.keyDown('F8', ['altKey']); // pass1 reveals the password
+    passwd.blur(); // pass1 hides the reveal-password button AND the password.
+</script>
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..5e166cf
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-mismatched_glyph.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-mismatched_glyph.html
new file mode 100644
index 0000000..28ab5ca
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-mismatched_glyph.html
@@ -0,0 +1,13 @@
+<input type="password" id="passwd">
+
+<script>
+    // The verifies the reveal button shows the correct glyph in certain scenario.
+    var passwd = document.getElementById("passwd");
+    passwd.focus();
+    eventSender.keyDown('a'); // The reveal button shows
+    eventSender.keyDown('F8', ['altKey']); // The password is revealed.
+    passwd.blur(); // passwd hides the reveal-password button AND the password.
+    passwd.focus();
+    eventSender.keyDown('Backspace'); // Delete 'a' to make the input empty.
+    eventSender.keyDown('a'); // The reveal button shows again with correct glyph.
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-no-reveal-button-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-no-reveal-button-expected.html
new file mode 100644
index 0000000..ce8998b9
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-no-reveal-button-expected.html
@@ -0,0 +1,6 @@
+<input type="text">
+<input type="text" id="passwd">
+
+<script>
+    document.getElementById("passwd").focus();
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-no-reveal-button.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-no-reveal-button.html
new file mode 100644
index 0000000..909fe14
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-no-reveal-button.html
@@ -0,0 +1,9 @@
+<link rel="match" href="password-no-reveal-button-expected.html">
+
+<input type="password">
+<input type="password" id="passwd">
+
+<script>
+    // This verifies the reveal-password button doesn't show when no character is entered. (regardless focused or not)
+    document.getElementById("passwd").focus();
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-non-empty-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-non-empty-expected.html
new file mode 100644
index 0000000..e5b9e07
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-non-empty-expected.html
@@ -0,0 +1,5 @@
+<input type="text" id="passwd" value="abcd" style="-webkit-text-security:disc;">
+
+<script>
+    document.getElementById("passwd").focus();
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-non-empty.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-non-empty.html
new file mode 100644
index 0000000..20f17a2
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-non-empty.html
@@ -0,0 +1,8 @@
+<link rel="match" href="password-non-empty-expected.html">
+
+<input type="password" id="passwd" value="abcd">
+
+<script>
+    // This verifies the reveal-password button doesn't appear if the password control is not empty when it gets focus.
+    document.getElementById("passwd").focus();
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-script-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-script-expected.html
new file mode 100644
index 0000000..bcfbb41
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-script-expected.html
@@ -0,0 +1,8 @@
+<input type="text" id="passwd" style="-webkit-text-security:disc;">
+<script>
+    var passwd = document.getElementById("passwd");
+    passwd.focus();
+    eventSender.keyDown('a');
+    eventSender.keyDown('F8', ['altKey']);
+    passwd.value = "123";
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-script.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-script.html
new file mode 100644
index 0000000..2753d4d
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-script.html
@@ -0,0 +1,12 @@
+<link rel="match" href="password-script-expected.html">
+
+<input type="password" id="passwd">
+
+<script>
+    // This verifies that changing password's value by script always resets the input to non-revealed state.
+    var passwd = document.getElementById("passwd");
+    passwd.focus();
+    eventSender.keyDown('a');
+    eventSender.keyDown('F8', ['altKey']);
+    passwd.value = "123";
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..a999c83
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-alt-f8.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-alt-f8.html
new file mode 100644
index 0000000..ebd504f
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-alt-f8.html
@@ -0,0 +1,8 @@
+<input type="password" id="passwd" style="width:20px">
+
+<script>
+    // This verifies the password can still be revealed by keyboard when there is no reveal icon due to the width too small.
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+    eventSender.keyDown('F8', ['altKey']);
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-expected.html
new file mode 100644
index 0000000..543e3ae
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size-expected.html
@@ -0,0 +1,6 @@
+<input type="text" id="passwd" style="width:20px; -webkit-text-security:disc;">
+
+<script>
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size.html
new file mode 100644
index 0000000..a3214d7
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-small-size.html
@@ -0,0 +1,9 @@
+<link rel="match" href="password-small-size-expected.html">
+
+<input type="password" id="passwd" style="width:20px">
+
+<script>
+    // This verifies the reveal button is not shown when the width is too small.
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-csp-expected.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-csp-expected.html
new file mode 100644
index 0000000..f9035b48
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-csp-expected.html
@@ -0,0 +1,6 @@
+<input type="password" id="passwd">
+
+<script>
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-csp.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-csp.html
new file mode 100644
index 0000000..3ea7fdff
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-csp.html
@@ -0,0 +1,12 @@
+<head>
+<link rel="match" href="password-with-csp-expected.html">
+<meta http-equiv="content-security-policy" content="img-src 'none'">
+</head>
+
+<input type="password" id="passwd">
+
+<script>
+    // This verifies the eye icon (using data: URL) renders correctly under CSP.
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..5e166cf
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-reveal-button.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-reveal-button.html
new file mode 100644
index 0000000..8d267bc
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/password/password-with-reveal-button.html
@@ -0,0 +1,7 @@
+<input type="password" id="passwd">
+
+<script>
+    // This verifies the reveal-password button appears after a character is entered.
+    document.getElementById("passwd").focus();
+    eventSender.keyDown('a');
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..459e1f5
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/time/time-appearance-basic.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/time/time-appearance-basic.html
new file mode 100644
index 0000000..6c2a166
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/time/time-appearance-basic.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<script src="../../../../resources/run-after-layout-and-paint.js"></script>
+<script src="../../resources/common.js"></script>
+<body>
+
+<!-- no style for reference -->
+<ul>
+  <li>Time: <input type="time" /></li>
+</ul>
+
+<!-- disabled, readonly -->
+<ul>
+  <li>Time disabled: <input type="time" disabled/></li>
+  <li>Time readonly: <input type="time" readonly/></li>
+</ul>
+
+<!-- RTL -->
+<ul>
+  <li>Time RTL: <input type="time" value="13:00" dir="rtl"/></li>
+</ul>
+
+<!-- font-size, font-weight -->
+<ul>
+  <li>Time font-size, font-weight: <input type="time" value="13:00" style="font-size: 36px; font-weight: bold;"/> </li>
+</ul>
+
+<!-- hover -->
+<ul>
+  <li>Time hover: <input type="time" id="hoverTarget" value="13:00"/></li>
+</ul>
+
+<!-- small width -->
+<ul>
+  <li>Time width: 10px: <input type="time" style="width: 10px;"/> </li>
+</ul>
+
+<!-- zoom -->
+<ul>
+  <li>Time zoom: 1.5: <input type="time" style="zoom: 1.5;"/></li>
+  <li>Time zoom: 3: <input type="time" style="zoom: 3;"/></li>
+</ul>
+
+<script>
+
+if (window.testRunner)
+  testRunner.setUseMockTheme(false);
+
+runAfterLayoutAndPaint(function() {
+  var target = document.getElementById('hoverTarget');
+  hoverOverElement(target);
+}, true);
+
+</script>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..dd1d768f
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/fast/forms/controls-new-ui/week/week-appearance-basic.html b/third_party/blink/web_tests/fast/forms/controls-new-ui/week/week-appearance-basic.html
new file mode 100644
index 0000000..6d475cf
--- /dev/null
+++ b/third_party/blink/web_tests/fast/forms/controls-new-ui/week/week-appearance-basic.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<script src="../../../../resources/run-after-layout-and-paint.js"></script>
+<script src="../../resources/common.js"></script>
+<body>
+
+<!-- no style for reference -->
+<ul>
+  <li>Week: <input type="week" /></li>
+</ul>
+
+<!-- disabled, readonly -->
+<ul>
+  <li>Week disabled: <input type="week" disabled/></li>
+  <li>Week readonly: <input type="week" readonly/></li>
+</ul>
+
+<!-- RTL -->
+<ul>
+  <li>Week RTL: <input type="week" value="2019-W08" dir="rtl"/></li>
+</ul>
+
+<!-- font-size, font-weight -->
+<ul>
+  <li>Week font-size, font-weight: <input type="week" value="2019-W08" style="font-size: 36px; font-weight: bold;"/> </li>
+</ul>
+
+<!-- hover -->
+<ul>
+  <li>Week hover: <input type="week" id="hoverTarget" value="2019-W08"/></li>
+</ul>
+
+<!-- small width -->
+<ul>
+  <li>Week width: 10px: <input type="week" style="width: 10px;"/> </li>
+</ul>
+
+<!-- zoom -->
+<ul>
+  <li>Week zoom: 1.5: <input type="week" style="zoom: 1.5;"/></li>
+  <li>Week zoom: 3: <input type="week" style="zoom: 3;"/></li>
+</ul>
+
+<script>
+
+if (window.testRunner)
+  testRunner.setUseMockTheme(false);
+
+runAfterLayoutAndPaint(function() {
+  var target = document.getElementById('hoverTarget');
+  hoverOverElement(target);
+}, true);
+
+</script>
+
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/devtools/layers/layers-3d-view-hit-testing.js b/third_party/blink/web_tests/http/tests/devtools/layers/layers-3d-view-hit-testing.js
index 93e01768..bf7f0fe1 100644
--- a/third_party/blink/web_tests/http/tests/devtools/layers/layers-3d-view-hit-testing.js
+++ b/third_party/blink/web_tests/http/tests/devtools/layers/layers-3d-view-hit-testing.js
@@ -5,6 +5,7 @@
 (async function() {
   TestRunner.addResult(`Tests hit testing in Layers3DView\n`);
   await TestRunner.loadModule('layers_test_runner');
+  await TestRunner.showPanel('layers');
 
   await TestRunner.loadHTML(`
       <div id="a" style="transform:translateZ(0px) translateY(60px) rotateZ(45deg);width:300px;height:300px;margin-left:100px; border: 1px solid black;">
@@ -18,7 +19,6 @@
   var canvas;
   const ButtonByEventType = {mousemove: -1, mousedown: 0, mouseup: 0};
 
-  TestRunner.showPanel('layers');
   await LayersTestRunner.requestLayers();
   initLayers();
   initSizes();
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..e5e61e4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..be67064d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..c653f9f8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..e37a054b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..e37a054b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..d7d41c84
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..92195df
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..09dc56a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..7c78888
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..e37a054b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..9ab870ae
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..e37a054b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..1243a7af
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..9ae712fa
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..1db676e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..7c59657
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..6d0a5d1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..af60577
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..00d476a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..38891a3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..baa8e87
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..13ea14d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..5c31388
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..00d476a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..a5b48be
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..00d476a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..0408090
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..6696c25
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..e2233d6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..dc83091
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..e0a0242
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..785ecdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..785ecdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..f9d776e
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..db23521
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..0bfd5745
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..cb4ca5b5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..785ecdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..a836477
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..785ecdd
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..c5cea92
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..8a00981
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..9afb7e3
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..68638fc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..3d9bc5cb
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..7baccd90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..5a08332
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..f55b3852
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..fb588ea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..59c5be8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..bf38010
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..092a06f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..6d00316
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.10/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..c6d8ca8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..c6d8ca8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..e26b3be
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..1d1aa46
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..f468ec6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..ac47b7be
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..c6d8ca8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..f62fb4ce
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..c6d8ca8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..0cb7eb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..92acff7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..bbe55c7f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..7baccd90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..5a08332
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..f55b3852
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..fb588ea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..59c5be8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..bf38010
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..1d7d3e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..367d7c2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..a82e671
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..a82e671
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..1582f1b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..04acc725
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..07a2b62
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..64dcdcf
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..a82e671
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..83d001f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..a82e671
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..0cb7eb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..92acff7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..bbe55c7f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..7baccd90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..5a08332
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..f55b3852
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..fb588ea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..59c5be8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..bf38010
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..1d7d3e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..367d7c2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.12/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..0cb7eb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..92acff7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..bbe55c7f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..7baccd90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..5a08332
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..f55b3852
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..fb588ea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..59c5be8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..bf38010
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..1d7d3e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..367d7c2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-retina/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..18e0024
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..74e7ae5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..ce8783c9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..91c203fa
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..91c203fa
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..89c6901c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..fc41bd7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..8530af1b
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..4e62e18
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..91c203fa
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..c99346d5
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..91c203fa
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..220c1ca1
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..07267ef
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..0cb7eb6
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..92acff7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..bbe55c7f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..7baccd90
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..5a08332
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..f55b3852
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..fb588ea
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..59c5be8
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..bf38010
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..018026f
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..1d7d3e9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..367d7c2d
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..74ee291
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..a8efab9
--- /dev/null
+++ b/third_party/blink/web_tests/platform/win7/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/audio-service/external/wpt/mediacapture-streams/README.txt b/third_party/blink/web_tests/virtual/audio-service/external/wpt/mediacapture-streams/README.txt
deleted file mode 100644
index 53221e3..0000000
--- a/third_party/blink/web_tests/virtual/audio-service/external/wpt/mediacapture-streams/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Runs external/wpt/mediacapture-streams tests with
---enable-features=AudioServiceOutOfProcess,AudioServiceSandbox
diff --git a/third_party/blink/web_tests/virtual/audio-service/http/tests/media/README.txt b/third_party/blink/web_tests/virtual/audio-service/http/tests/media/README.txt
deleted file mode 100644
index ff4c6ba..0000000
--- a/third_party/blink/web_tests/virtual/audio-service/http/tests/media/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Runs http/tests/media tests with
---enable-features=AudioServiceOutOfProcess,AudioServiceSandbox
diff --git a/third_party/blink/web_tests/virtual/audio-service/media/README.txt b/third_party/blink/web_tests/virtual/audio-service/media/README.txt
deleted file mode 100644
index bcd289d..0000000
--- a/third_party/blink/web_tests/virtual/audio-service/media/README.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-Runs media tests with
---enable-features=AudioServiceOutOfProcess,AudioServiceSandbox
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
new file mode 100644
index 0000000..96310a7
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/date/date-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
new file mode 100644
index 0000000..b7d0a055
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/datetimelocal/datetimelocal-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
new file mode 100644
index 0000000..78e829e
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/month/month-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
new file mode 100644
index 0000000..8652414
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
new file mode 100644
index 0000000..c2c6bad
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-alt-f8-twice-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
new file mode 100644
index 0000000..1149a40
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-48px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
new file mode 100644
index 0000000..9401d2cc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-font-size-4px-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
new file mode 100644
index 0000000..f86663d
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-0.5x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
new file mode 100644
index 0000000..c4f92bcf
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-eye-icon-zoom-4x-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
new file mode 100644
index 0000000..c2c6bad
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-mismatched_glyph-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
new file mode 100644
index 0000000..0e941cb
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-small-size-alt-f8-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
new file mode 100644
index 0000000..c2c6bad
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/password/password-with-reveal-button-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
new file mode 100644
index 0000000..d5ad3127
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/time/time-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
new file mode 100644
index 0000000..e3f93ac
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/controls-refresh/fast/forms/controls-new-ui/week/week-appearance-basic-expected.png
Binary files differ
diff --git a/third_party/closure_compiler/README.chromium b/third_party/closure_compiler/README.chromium
index e501c57..b7014df 100644
--- a/third_party/closure_compiler/README.chromium
+++ b/third_party/closure_compiler/README.chromium
@@ -1,8 +1,8 @@
 Name: Closure compiler
 Short Name: closure-compiler
 URL: http://github.com/google/closure-compiler
-Version: v20190415
-Date: 2019/04/24 00:49
+Version: v20190709
+Date: 2019/07/24 01:19
 License: Apache 2.0
 License File: LICENSE
 Security Critical: no
diff --git a/third_party/closure_compiler/compiler/compiler.jar b/third_party/closure_compiler/compiler/compiler.jar
index b96eacd..a02a48c 100644
--- a/third_party/closure_compiler/compiler/compiler.jar
+++ b/third_party/closure_compiler/compiler/compiler.jar
Binary files differ
diff --git a/third_party/closure_compiler/compiler_test.py b/third_party/closure_compiler/compiler_test.py
index 30249a2..34f71500 100755
--- a/third_party/closure_compiler/compiler_test.py
+++ b/third_party/closure_compiler/compiler_test.py
@@ -107,8 +107,8 @@
 
 cr.addSingletonGetter(Class);
 Class.getInstance().needsNumber("wrong type");
-""", "ERROR - actual parameter 1 of Class.needsNumber does not match formal "
-        "parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of Class.needsNumber does "
+        "not match formal parameter")
 
   def testCrDefineFunctionDefinition(self):
     self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
@@ -122,8 +122,8 @@
 });
 
 a.b.c.needsNumber("wrong type");
-""", "ERROR - actual parameter 1 of a.b.c.needsNumber does not match formal "
-        "parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of a.b.c.needsNumber does "
+        "not match formal parameter")
 
   def testCrDefineFunctionAssignment(self):
     self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
@@ -137,8 +137,8 @@
 });
 
 a.b.c.needsNumber("wrong type");
-""", "ERROR - actual parameter 1 of a.b.c.needsNumber does not match formal "
-        "parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of a.b.c.needsNumber does "
+        "not match formal parameter")
 
   def testCrDefineConstructorDefinitionPrototypeMethod(self):
     self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
@@ -157,8 +157,9 @@
 });
 
 new a.b.c.ClassExternalName().method("wrong type");
-""", "ERROR - actual parameter 1 of a.b.c.ClassExternalName.prototype.method "
-        "does not match formal parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of "
+        "a.b.c.ClassExternalName.prototype.method does not match formal "
+        "parameter")
 
   def testCrDefineConstructorAssignmentPrototypeMethod(self):
     self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
@@ -177,8 +178,9 @@
 });
 
 new a.b.c.ClassExternalName().method("wrong type");
-""", "ERROR - actual parameter 1 of a.b.c.ClassExternalName.prototype.method "
-        "does not match formal parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of "
+        "a.b.c.ClassExternalName.prototype.method does not match formal "
+        "parameter")
 
   def testCrDefineEnum(self):
     self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION + """
@@ -195,8 +197,8 @@
 function needsNumber(num) {}
 
 needsNumber(a.b.c.exportedEnum.key);
-""", "ERROR - actual parameter 1 of needsNumber does not match formal "
-        "parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of needsNumber does not "
+        "match formal parameter")
 
   def testObjectDefineProperty(self):
     self._runCompilerTestExpectSuccess("""
@@ -229,8 +231,8 @@
 function needsNumber(num) {}
 
 needsNumber(new Class().booleanProp);
-""", "ERROR - actual parameter 1 of needsNumber does not match formal "
-        "parameter")
+""", "ERROR - [JSC_TYPE_MISMATCH] actual parameter 1 of needsNumber does not "
+        "match formal parameter")
 
   def testCrDefineOnCrWorks(self):
     self._runCompilerTestExpectSuccess(self._CR_DEFINE_DEFINITION + """
@@ -340,7 +342,8 @@
   def testExportPathNoPath(self):
     self._runCompilerTestExpectError(self._CR_DEFINE_DEFINITION +
         "cr.exportPath();",
-        "ERROR - cr.exportPath() should have at least 1 argument: path name")
+        "ERROR - [JSC_CR_EXPORT_PATH_TOO_FEW_ARGUMENTS] cr.exportPath() should"
+            " have at least 1 argument: path name")
 
   def testMissingReturnAssertNotReached(self):
     template = self._ASSERT_DEFINITION + """
diff --git a/third_party/closure_compiler/externs/chrome_extensions.js b/third_party/closure_compiler/externs/chrome_extensions.js
index 5d9e021..132ad2a 100644
--- a/third_party/closure_compiler/externs/chrome_extensions.js
+++ b/third_party/closure_compiler/externs/chrome_extensions.js
@@ -4677,6 +4677,38 @@
 chrome.input.ime = {};
 
 
+/**
+ * @typedef {?{
+ *   left: number,
+ *   top: number,
+ *   width: number,
+ *   height: number
+ * }}
+ * @see https://developer.chrome.com/extensions/input_ime#type-CreateWindowOptions
+ */
+chrome.input.ime.Bounds;
+
+
+/**
+ * @typedef {?{
+ *   windowType: chrome.input.ime.WindowType,
+ *   url: (string|undefined),
+ *   bounds: (chrome.input.ime.Bounds|undefined)
+ * }}
+ * @see https://developer.chrome.com/extensions/input_ime#type-CreateWindowOptions
+ */
+chrome.input.ime.CreateWindowOptions;
+
+
+/**
+ * @enum {string}
+ * @see https://developer.chrome.com/extensions/system.display#type-MirrorMode
+ */
+chrome.input.ime.WindowType = {
+  NORMAL: '',
+  FOLLOW_CURSOR: '',
+};
+
 
 /**
  * The OnKeyEvent event takes an extra argument.
@@ -4722,9 +4754,16 @@
 
 
 /**
+ * @param {function(boolean): void=} callback Callback function.
+ * @return {undefined}
+ */
+chrome.input.ime.activate = function(callback) {};
+
+
+/**
  * @param {!Object<string,number>} parameters An object with a
  *     'contextID' (number) key.
- * @param {function(boolean): void} callback Callback function.
+ * @param {function(boolean): void=} callback Callback function.
  * @return {undefined}
  */
 chrome.input.ime.clearComposition = function(parameters, callback) {};
@@ -4740,6 +4779,22 @@
 
 
 /**
+ * @param {!chrome.input.ime.CreateWindowOptions} options Options of the created
+ *     IME window.
+ * @param {function(Window): void=} callback Callback function.
+ * @return {undefined}
+ */
+chrome.input.ime.createWindow = function(options, callback) {};
+
+
+/**
+ * @param {function(boolean): void} callback Callback function.
+ * @return {undefined}
+ */
+chrome.input.ime.deactivate = function(callback) {};
+
+
+/**
  * @param {!Object<string,(string|number)>} parameters An object with
  *     'contextID' (number) and 'text' (string) keys.
  * @param {function(boolean): void=} opt_callback Callback function.
@@ -4749,6 +4804,29 @@
 
 
 /**
+ * @return {undefined}
+ */
+chrome.input.ime.hideInputView = function() {};
+
+
+/**
+ * @param {function(boolean): void=} callback Callback function.
+ * @return {undefined}
+ */
+chrome.input.ime.hideWindow = function(callback) {};
+
+
+/**
+ * @param {!Object<number,Array<KeyboardEvent>>}
+ *     parameters An object with 'contextID' (number) and 'keyData'
+ *     (Array<KeyboardEvent>) keys.
+ * @param {function(boolean): void=} callback Callback function.
+ * @return {undefined}
+ */
+chrome.input.ime.sendKeyEvents = function(parameters, callback) {};
+
+
+/**
  * @param {!Object<string,(number|Object<string,(string|number|boolean)>)>}
  *     parameters An object with 'engineID' (string) and 'properties'
  *     (Object) keys.
@@ -4800,6 +4878,13 @@
 
 
 /**
+ * @param {function(boolean): void=} callback Callback function.
+ * @return {undefined}
+ */
+chrome.input.ime.showWindow = function(callback) {};
+
+
+/**
  * @param {!Object<string,(string|Array<Object<string,(string|boolean)>>)>}
  *     parameters An object with  'engineID' (string) and 'items'
  *     (array of object) keys.
diff --git a/third_party/closure_compiler/externs/pending.js b/third_party/closure_compiler/externs/pending.js
index 25d87f42..ae0722d 100644
--- a/third_party/closure_compiler/externs/pending.js
+++ b/third_party/closure_compiler/externs/pending.js
@@ -141,7 +141,6 @@
  * @param {number=} opt_length
  * @extends {ArrayBufferView}
  * @constructor
- * @noalias
  * @throws {Error}
  * @modifies {arguments}
  */
diff --git a/third_party/closure_compiler/externs/web_animations.js b/third_party/closure_compiler/externs/web_animations.js
index c233999..a3d5797e 100644
--- a/third_party/closure_compiler/externs/web_animations.js
+++ b/third_party/closure_compiler/externs/web_animations.js
@@ -104,96 +104,6 @@
 KeyframeEffectOptions.prototype.id;
 
 /**
- * @constructor
- * @param {?Animatable} target
- * @param {?Object} frames
- * @param {number|KeyframeEffectOptions=} opt_options
- * @see https://w3c.github.io/web-animations/#keyframeeffectreadonly
- */
-var KeyframeEffectReadOnly = function(target, frames, opt_options) {};
-
-/** @const {?Animatable} */
-KeyframeEffectReadOnly.prototype.target;
-
-/** @const {IterationCompositeOperation} */
-KeyframeEffectReadOnly.prototype.iterationComposite;
-
-/** @const {CompositeOperation} */
-KeyframeEffectReadOnly.prototype.composite;
-
-/** @const {string} */
-KeyframeEffectReadOnly.prototype.spacing;
-
-/** @return {KeyframeEffect} */
-KeyframeEffectReadOnly.prototype.clone;
-
-/** @return {Array<Object>} */
-KeyframeEffectReadOnly.prototype.getFrames;
-
-/**
- * @constructor
- * @extends KeyframeEffectReadOnly
- * @param {?Animatable} target
- * @param {?Object} frames
- * @param {number|KeyframeEffectOptions=} opt_options
- * @see https://w3c.github.io/web-animations/#keyframeeffect
- */
-var KeyframeEffect = function(target, frames, opt_options) {};
-
-/** @override */
-KeyframeEffect.prototype.target;
-
-/** @override */
-KeyframeEffect.prototype.iterationComposite;
-
-/** @override */
-KeyframeEffect.prototype.composite;
-
-/** @override */
-KeyframeEffect.prototype.spacing;
-
-/** @param {?Object} frames */
-KeyframeEffect.prototype.setFrames;
-
-/**
- * @interface
- * @extends {EventTarget}
- * @see https://w3c.github.io/web-animations/#animation
- */
-var Animation = function() {};
-
-/** @type {string} */
-Animation.prototype.id;
-
-/** @type {?number} */
-Animation.prototype.startTime;
-
-/** @type {?number} */
-Animation.prototype.currentTime;
-
-/** @type {number} */
-Animation.prototype.playbackRate;
-
-/** @type {!Promise<!Animation>} */
-Animation.prototype.finished;
-
-Animation.prototype.finish = function() {};
-
-Animation.prototype.play = function() {};
-
-Animation.prototype.pause = function() {};
-
-Animation.prototype.reverse = function() {};
-
-Animation.prototype.cancel = function() {};
-
-/** @type {EventHandler} */
-Animation.prototype.onfinish;
-
-/** @type {EventHandler} */
-Animation.prototype.oncancel;
-
-/**
  * @interface
  * @see https://w3c.github.io/web-animations/#animatable
  */
diff --git a/third_party/v4l-utils/OWNERS b/third_party/v4l-utils/OWNERS
index ddb0b3f..f0b0b56 100644
--- a/third_party/v4l-utils/OWNERS
+++ b/third_party/v4l-utils/OWNERS
@@ -1,2 +1,3 @@
 henryhsu@chromium.org
 posciak@chromium.org
+# COMPONENT: OS>Kernel>Video
diff --git a/tools/gritsettings/resource_ids b/tools/gritsettings/resource_ids
index 7ac3cf3..e4384796 100644
--- a/tools/gritsettings/resource_ids
+++ b/tools/gritsettings/resource_ids
@@ -81,7 +81,10 @@
   # START chrome/browser section.
   "chrome/browser/browser_resources.grd": {
     "includes": [11000],
-    "structures": [11850],
+    "structures": [11800],
+  },
+  "chrome/browser/resources/bluetooth_internals/resources.grd": {
+    "includes": [11870],
   },
   "chrome/browser/resources/chromeos/camera/camera_resources.grd": {
     "includes": [11930],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a2fe23c6..31bf1c3 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -13488,6 +13488,9 @@
 </enum>
 
 <enum name="DllHash">
+  <obsolete>
+    The blacklist is deprecated in favor of third-party DLL blocking.
+  </obsolete>
 <!-- Generated by chrome/chrome_elf/dll_hash/dll_hash_main.cc -->
 
   <int value="26393601" label="wajam_goblin_64.dll"/>
@@ -24141,6 +24144,7 @@
   <int value="2976" label="DownloadWithoutUserGesture"/>
   <int value="2977" label="AutoplayDynamicDelegation"/>
   <int value="2978" label="ToggleEventHandlerDuringParsing"/>
+  <int value="2979" label="FragmentDoubleHash"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 72f53b67c..f3cd003 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -12527,7 +12527,10 @@
   </summary>
 </histogram>
 
-<histogram name="Blacklist.Blocked" enum="DllHash">
+<histogram name="Blacklist.Blocked" enum="DllHash" expires_after="2019-07-25">
+  <obsolete>
+    The blacklist is deprecated in favor of third-party DLL blocking.
+  </obsolete>
   <owner>csharp@chromium.org</owner>
   <summary>
     Records the name hashes of all the dlls that are blocked from the browser
@@ -43921,8 +43924,10 @@
   </summary>
 </histogram>
 
-<histogram name="ExtensionToolbarModel.BrowserActionsPermanentlyHidden"
-    expires_after="M77">
+<histogram name="ExtensionToolbarModel.BrowserActionsPermanentlyHidden">
+  <obsolete>
+    Stopped recording 2019-07.
+  </obsolete>
   <owner>finnur@chromium.org</owner>
   <summary>
     The number of Browser Action icons the user has elected to permanently hide
@@ -85609,7 +85614,7 @@
 <histogram base="true"
     name="NQE.CongestionAnalyzer.CountInflightRequestsForPeakQueueingDelay"
     units="requests" expires_after="M82">
-  <owner>jfwang@google.com</owner>
+  <owner>jfwang@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
     Records the count of in-flight requests causing the peak queueing delay
@@ -104142,6 +104147,9 @@
 </histogram>
 
 <histogram name="PrefService.CreateProfilePrefsTime" units="ms">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>The amount of time that elapsed during CreateProfilePrefs.</summary>
 </histogram>
@@ -106196,7 +106204,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.ValidPpdReference" enum="BooleanSuccess"
-    expires_after="2019-09-01">
+    expires_after="2020-08-01">
   <owner>skau@chromium.org</owner>
   <owner>luum@chromium.org</owner>
   <summary>
@@ -106755,11 +106763,17 @@
 
 <histogram name="Profile.CreateAndInitializeProfile" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>Length of time to setup profile.</summary>
 </histogram>
 
 <histogram name="Profile.CreateBrowserContextServicesTime" units="ms">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during the CreateBrowserContextServices call
@@ -106769,6 +106783,9 @@
 
 <histogram name="Profile.CreateProfileHelperTime" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during ProfileManager::CreateProfileHelper.
@@ -107002,6 +107019,9 @@
 
 <histogram name="Profile.NotifyProfileCreatedTime" units="ms"
     expires_after="M77">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during the Notify() of
@@ -107156,6 +107176,9 @@
 </histogram>
 
 <histogram name="Profile.OnLocaleReadyTime" units="ms">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during ProfileImpl::OnLocaleReady. This
@@ -107213,6 +107236,9 @@
 </histogram>
 
 <histogram name="Profile.ProfileImplDoFinalInit" units="ms">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during the ProfileImpl::DoFinalInit().
@@ -112918,7 +112944,7 @@
 
 <histogram name="ResourceScheduler.ActiveSchedulerClientsCount" units="clients"
     expires_after="M80">
-  <owner>jfwang@google.com</owner>
+  <owner>jfwang@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
     The number of active resource scheduler clients indicates the severity of
@@ -113109,7 +113135,7 @@
 
 <histogram name="ResourceScheduler.PeakObservedQueueingDelay" units="ms"
     expires_after="M80">
-  <owner>jfwang@google.com</owner>
+  <owner>jfwang@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
     Within a request's lifetime, the peak observed queueing delay tells whether
@@ -113128,7 +113154,9 @@
   </summary>
 </histogram>
 
-<histogram name="ResourceScheduler.RequestsCount" units="requests count">
+<histogram name="ResourceScheduler.RequestsCount" units="requests count"
+    expires_after="M82">
+  <owner>jfwang@chromium.org</owner>
   <owner>tbansal@chromium.org</owner>
   <summary>
     Records the count of number of requests in-flight. Recorded when a request
@@ -113570,7 +113598,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.NavigationObserver.NavigationEventCleanUpCount"
-    expires_after="M77">
+    expires_after="2020-07-24">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -124426,6 +124454,9 @@
 </histogram>
 
 <histogram name="Settings.RegisterProfilePrefsTime" units="ms">
+  <obsolete>
+    Removed 07/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during RegisterProfilePrefs.
@@ -125240,9 +125271,10 @@
   <owner>erikchen@chromium.org</owner>
   <owner>alexilin@chromium.org</owner>
   <summary>
-    A histogram entry is emitted each time a base::SharedMemory object is
-    constructed. The value of the entry indicates the type of error encountered
-    during construction.
+    A histogram entry is emitted each time a shared memory object is constructed
+    (for example, base::ReadOnlySharedMemoryRegion or the deprecated
+    base::SharedMemory). The value of the entry indicates the type of error
+    encountered during construction.
   </summary>
 </histogram>
 
@@ -125258,9 +125290,10 @@
 <histogram name="SharedMemory.CreateWinError" enum="WinGetLastError">
   <owner>bcwhite@chromium.org</owner>
   <summary>
-    A histogram entry is emitted each time a base::SharedMemory object could not
-    be created due to a failed Windows system call. The value of the entry
-    indicates the result of the GetLastError() API call.
+    A histogram entry is emitted each time a shared memory object could not be
+    created due to a failed Windows system call (for example,
+    base::ReadOnlySharedMemoryRegion or the deprecated base::SharedMemory). The
+    value of the entry indicates the result of the GetLastError() API call.
   </summary>
 </histogram>
 
@@ -125433,6 +125466,28 @@
   </summary>
 </histogram>
 
+<histogram name="Sharing.SendAckMessageSuccess" enum="BooleanSuccess"
+    expires_after="2020-02-02">
+  <owner>mvanouwerkerk@chromium.org</owner>
+  <owner>knollr@chromium.org</owner>
+  <summary>
+    Whether an ack message was sent successfully by the Sharing service. Logged
+    in the callback for sending the message to FCM. All platforms.
+  </summary>
+</histogram>
+
+<histogram name="Sharing.SendMessageSuccess" enum="BooleanSuccess"
+    expires_after="2020-02-02">
+  <owner>mvanouwerkerk@chromium.org</owner>
+  <owner>knollr@chromium.org</owner>
+  <summary>
+    Whether a SharingMessage was sent successfully by the Sharing service.
+    Success requires receiving an ack message before the timeout. Logged after
+    the send message callback is run. Not logged for sending ack messages. All
+    platforms.
+  </summary>
+</histogram>
+
 <histogram name="Sharing.VapidKeyCreationResult"
     enum="SharingVapidKeyCreationResult" expires_after="2020-02-02">
   <owner>alexchau@chromium.org</owner>
@@ -132032,7 +132087,8 @@
   </summary>
 </histogram>
 
-<histogram name="Startup.PreMainMessageLoopRunImplLongTime" units="ms">
+<histogram name="Startup.PreMainMessageLoopRunImplLongTime" units="ms"
+    expires_after="M90">
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during
@@ -132042,6 +132098,9 @@
 
 <histogram name="Startup.PreMainMessageLoopRunImplStep1Time" units="ms"
     expires_after="M77">
+  <obsolete>
+    Deprecated as of 7/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during the first untracked section of
@@ -132051,6 +132110,9 @@
 
 <histogram name="Startup.PreMainMessageLoopRunImplStep2Time" units="ms"
     expires_after="M77">
+  <obsolete>
+    Deprecated as of 7/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during the second untracked section of
@@ -132060,6 +132122,9 @@
 
 <histogram name="Startup.PreMainMessageLoopRunImplStep3Time" units="ms"
     expires_after="M77">
+  <obsolete>
+    Deprecated as of 7/2019.
+  </obsolete>
   <owner>rkaplow@chromium.org</owner>
   <summary>
     The amount of time that elapsed during the third untracked section of
@@ -139626,6 +139691,17 @@
   </summary>
 </histogram>
 
+<histogram name="TextFragmentAnchor.ElementIdFragmentFound" enum="Boolean"
+    expires_after="M82">
+  <owner>nburris@chromium.org</owner>
+  <owner>bokan@chromium.org</owner>
+  <summary>
+    Whether an element-id based fragment was found in the document. Counted only
+    when a fragment was specified and it wasn't parsed into a |targetText| style
+    anchor.
+  </summary>
+</histogram>
+
 <histogram name="TextFragmentAnchor.MatchRate" units="%" expires_after="M81">
   <owner>nburris@chromium.org</owner>
   <owner>bokan@chromium.org</owner>
@@ -166870,6 +166946,18 @@
 <histogram_suffixes name="ResourceSchedulerRequestsCount" separator=".">
   <suffix name="All" label="All requests in-flight were counted."/>
   <suffix name="Delayable" label="Delayable requests in-flight were counted."/>
+  <suffix name="GlobalAll"
+      label="All in-flight requests issued by all resource scheduler clients
+             were counted."/>
+  <suffix name="GlobalDelayable"
+      label="Delayable in-flight requests issued by all resource scheduler
+             clients were counted."/>
+  <suffix name="GlobalLayoutBlocking"
+      label="Layout blocking in-flight requests issued by all resource
+             scheduler clients were counted."/>
+  <suffix name="GlobalNonDelayable"
+      label="Non-delayable in-flight requests issued by all resource
+             scheduler clients were counted."/>
   <suffix name="NonDelayable"
       label="Non-delayable requests in-flight were counted."/>
   <suffix name="TotalLayoutBlocking"
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index d64815c..71036d0 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -4793,6 +4793,69 @@
   </metric>
 </event>
 
+<event name="NavigationPredictorPageLinkMetrics" singular="True">
+  <owner>ryansturm@chromium.com</owner>
+  <summary>
+    Metrics that describe aggregate information about the links within a page.
+    Some anchor elements present on a page may not be represented in these
+    metrics, if they are outside the viewport or if their placement in the page
+    is after the 40th anchor element. This event is emitted at most once per
+    page load. Unless otherwise specified, each of the aggregate metrics is
+    bucketted with exponential buckets of size 1.3.
+  </summary>
+  <metric name="MedianLinkLocation">
+    <summary>
+      The median vertical link location in the viewport, as a ratio of the
+      distance from the top of the link to the visible top of the page.
+      Bucketted with a linear bucket size of 10.
+    </summary>
+  </metric>
+  <metric name="NumberOfAnchors.ContainsImage">
+    <summary>
+      The total number of links in the page that are images.
+    </summary>
+  </metric>
+  <metric name="NumberOfAnchors.InIframe">
+    <summary>
+      The total number of links in the page in any iframe.
+    </summary>
+  </metric>
+  <metric name="NumberOfAnchors.SameHost">
+    <summary>
+      The total number of links in the page that point to the same origin as the
+      current page's origin.
+    </summary>
+  </metric>
+  <metric name="NumberOfAnchors.Total">
+    <summary>
+      The total number of links within a page.
+    </summary>
+  </metric>
+  <metric name="NumberOfAnchors.URLIncremented">
+    <summary>
+      The total number of links on the page, where each link only differs from
+      the current page's URL by a number, and that number is incremented by 1 in
+      the link.
+    </summary>
+  </metric>
+  <metric name="TotalClickableSpace">
+    <summary>
+      The total clickable space in the entire page, expressed as a ratio of the
+      visible clickable region to the entire viewport region.
+    </summary>
+  </metric>
+  <metric name="Viewport.Height">
+    <summary>
+      The height of the viewport, in pixels.
+    </summary>
+  </metric>
+  <metric name="Viewport.Width">
+    <summary>
+      The width of the viewport, in pixels.
+    </summary>
+  </metric>
+</event>
+
 <event name="Net.LegacyTLSVersion">
   <owner>davidben@chromium.org</owner>
   <summary>
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc
index 415a9e1..c9aabe3 100644
--- a/ui/accessibility/platform/ax_platform_node_base.cc
+++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -497,7 +497,13 @@
     return GetDelegate()->GetLocalizedRoleDescriptionForUnlabeledImage();
   }
 
-  return GetString16Attribute(ax::mojom::StringAttribute::kRoleDescription);
+  base::string16 role_description =
+      GetString16Attribute(ax::mojom::StringAttribute::kRoleDescription);
+  if (!role_description.empty()) {
+    return role_description;
+  }
+
+  return GetDelegate()->GetLocalizedStringForRoleDescription();
 }
 
 AXPlatformNodeBase* AXPlatformNodeBase::GetSelectionContainer() const {
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h
index 176fef0..e81aa848 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate.h
+++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -321,6 +321,7 @@
   virtual base::string16 GetLocalizedStringForImageAnnotationStatus(
       ax::mojom::ImageAnnotationStatus status) const = 0;
   virtual base::string16 GetLocalizedStringForLandmarkType() const = 0;
+  virtual base::string16 GetLocalizedStringForRoleDescription() const = 0;
   virtual base::string16 GetStyleNameAttributeAsLocalizedString() const = 0;
 
   //
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
index 21bb1b1..b330d65 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate_base.cc
+++ b/ui/accessibility/platform/ax_platform_node_delegate_base.cc
@@ -393,6 +393,11 @@
 }
 
 base::string16
+AXPlatformNodeDelegateBase::GetLocalizedStringForRoleDescription() const {
+  return base::string16();
+}
+
+base::string16
 AXPlatformNodeDelegateBase::GetStyleNameAttributeAsLocalizedString() const {
   return base::string16();
 }
diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.h b/ui/accessibility/platform/ax_platform_node_delegate_base.h
index 594d96d..066cccae 100644
--- a/ui/accessibility/platform/ax_platform_node_delegate_base.h
+++ b/ui/accessibility/platform/ax_platform_node_delegate_base.h
@@ -248,6 +248,7 @@
       ax::mojom::ImageAnnotationStatus status) const override;
   base::string16 GetLocalizedRoleDescriptionForUnlabeledImage() const override;
   base::string16 GetLocalizedStringForLandmarkType() const override;
+  base::string16 GetLocalizedStringForRoleDescription() const override;
   base::string16 GetStyleNameAttributeAsLocalizedString() const override;
 
   //
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc
index 643e409..98d79095 100644
--- a/ui/accessibility/platform/ax_platform_node_win.cc
+++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -3909,18 +3909,17 @@
       }
       break;
 
-    case UIA_LocalizedControlTypePropertyId:
-      if (data.HasStringAttribute(
-              ax::mojom::StringAttribute::kRoleDescription)) {
-        V_VT(result) = VT_BSTR;
-        GetStringAttributeAsBstr(ax::mojom::StringAttribute::kRoleDescription,
-                                 &V_BSTR(result));
+    case UIA_LocalizedControlTypePropertyId: {
+      base::string16 localized_control_type = GetRoleDescription();
+      if (!localized_control_type.empty()) {
+        result->vt = VT_BSTR;
+        result->bstrVal = SysAllocString(localized_control_type.c_str());
       }
       // If a role description has not been provided, leave as VT_EMPTY.
       // UIA core handles Localized Control type for some built-in types and
       // also has a mapping for ARIA roles. To get these defaults, we need to
       // have returned VT_EMPTY.
-      break;
+    } break;
 
     case UIA_NamePropertyId:
       result->vt = VT_BSTR;
@@ -5645,9 +5644,11 @@
       return L"button";
 
     case ax::mojom::Role::kTextField:
-    case ax::mojom::Role::kSearchBox:
       return L"textbox";
 
+    case ax::mojom::Role::kSearchBox:
+      return L"searchbox";
+
     case ax::mojom::Role::kTextFieldWithComboBox:
       return L"combobox";
 
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
index 76aac7b..addf7aeb 100644
--- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc
+++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -3586,8 +3586,6 @@
   root.AddStringAttribute(ax::mojom::StringAttribute::kKeyShortcuts, "Alt+F4");
   root.AddStringAttribute(ax::mojom::StringAttribute::kDescription,
                           "fake description");
-  root.AddStringAttribute(ax::mojom::StringAttribute::kRoleDescription,
-                          "role description");
   root.AddIntAttribute(ax::mojom::IntAttribute::kSetSize, 2);
   root.AddIntAttribute(ax::mojom::IntAttribute::kInvalidState, 1);
   root.id = 0;
@@ -3613,8 +3611,6 @@
                      uia_id.ptr()->bstrVal);
   EXPECT_UIA_BSTR_EQ(root_node, UIA_FullDescriptionPropertyId,
                      L"fake description");
-  EXPECT_UIA_BSTR_EQ(root_node, UIA_LocalizedControlTypePropertyId,
-                     L"role description");
   EXPECT_UIA_BSTR_EQ(root_node, UIA_AriaRolePropertyId, L"list");
   EXPECT_UIA_BSTR_EQ(root_node, UIA_AriaPropertiesPropertyId,
                      L"readonly=true;expanded=false;multiline=false;"
@@ -4076,6 +4072,40 @@
                       UIA_HelpTextPropertyId, ScopedVariant::kEmptyVariant);
 }
 
+TEST_F(AXPlatformNodeWinTest, TestGetPropertyValue_LocalizedControlType) {
+  AXNodeData root;
+  root.role = ax::mojom::Role::kUnknown;
+  root.id = 1;
+  root.AddStringAttribute(ax::mojom::StringAttribute::kRoleDescription,
+                          "root role description");
+
+  AXNodeData child1;
+  child1.id = 2;
+  child1.role = ax::mojom::Role::kSearchBox;
+  child1.AddStringAttribute(ax::mojom::StringAttribute::kRoleDescription,
+                            "child1 role description");
+  root.child_ids.push_back(2);
+
+  AXNodeData child2;
+  child2.id = 3;
+  child2.role = ax::mojom::Role::kSearchBox;
+  root.child_ids.push_back(3);
+
+  Init(root, child1, child2);
+
+  ComPtr<IRawElementProviderSimple> root_node =
+      GetRootIRawElementProviderSimple();
+  EXPECT_UIA_BSTR_EQ(root_node, UIA_LocalizedControlTypePropertyId,
+                     L"root role description");
+  EXPECT_UIA_BSTR_EQ(QueryInterfaceFromNode<IRawElementProviderSimple>(
+                         GetRootNode()->children()[0]),
+                     UIA_LocalizedControlTypePropertyId,
+                     L"child1 role description");
+  EXPECT_UIA_BSTR_EQ(QueryInterfaceFromNode<IRawElementProviderSimple>(
+                         GetRootNode()->children()[1]),
+                     UIA_LocalizedControlTypePropertyId, L"search box");
+}
+
 TEST_F(AXPlatformNodeWinTest, TestUIAGetProviderOptions) {
   AXNodeData root_data;
   Init(root_data);
diff --git a/ui/accessibility/platform/test_ax_node_wrapper.cc b/ui/accessibility/platform/test_ax_node_wrapper.cc
index 412cf1814..ae6c3d7 100644
--- a/ui/accessibility/platform/test_ax_node_wrapper.cc
+++ b/ui/accessibility/platform/test_ax_node_wrapper.cc
@@ -552,6 +552,17 @@
   }
 }
 
+base::string16 TestAXNodeWrapper::GetLocalizedStringForRoleDescription() const {
+  const AXNodeData& data = GetData();
+  switch (data.role) {
+    case ax::mojom::Role::kSearchBox:
+      return base::ASCIIToUTF16("search box");
+
+    default:
+      return {};
+  }
+}
+
 base::string16 TestAXNodeWrapper::GetLocalizedStringForImageAnnotationStatus(
     ax::mojom::ImageAnnotationStatus status) const {
   switch (status) {
diff --git a/ui/accessibility/platform/test_ax_node_wrapper.h b/ui/accessibility/platform/test_ax_node_wrapper.h
index 3ce73fc..9e98cf5 100644
--- a/ui/accessibility/platform/test_ax_node_wrapper.h
+++ b/ui/accessibility/platform/test_ax_node_wrapper.h
@@ -108,6 +108,7 @@
   bool AccessibilityPerformAction(const AXActionData& data) override;
   base::string16 GetLocalizedRoleDescriptionForUnlabeledImage() const override;
   base::string16 GetLocalizedStringForLandmarkType() const override;
+  base::string16 GetLocalizedStringForRoleDescription() const override;
   base::string16 GetLocalizedStringForImageAnnotationStatus(
       ax::mojom::ImageAnnotationStatus status) const override;
   base::string16 GetStyleNameAttributeAsLocalizedString() const override;
diff --git a/ui/base/x/x11_window.cc b/ui/base/x/x11_window.cc
index 7df0a3a..2b07d1d8 100644
--- a/ui/base/x/x11_window.cc
+++ b/ui/base/x/x11_window.cc
@@ -96,7 +96,7 @@
       force_show_in_taskbar(false),
       keep_on_top(false),
       visible_on_all_workspaces(false),
-      remove_standard_frame(false),
+      remove_standard_frame(true),
       prefer_dark_theme(false) {}
 
 XWindow::Configuration::Configuration(const Configuration&) = default;
diff --git a/ui/chromeos/search_box/search_box_view_base.cc b/ui/chromeos/search_box/search_box_view_base.cc
index eefdc35..34b60e7 100644
--- a/ui/chromeos/search_box/search_box_view_base.cc
+++ b/ui/chromeos/search_box/search_box_view_base.cc
@@ -308,7 +308,7 @@
 }
 
 bool SearchBoxViewBase::HasSearch() const {
-  return !search_box_->text().empty();
+  return !search_box_->GetText().empty();
 }
 
 gfx::Rect SearchBoxViewBase::GetViewBoundsForSearchBoxContentsBounds(
@@ -444,14 +444,14 @@
 
 bool SearchBoxViewBase::IsSearchBoxTrimmedQueryEmpty() const {
   base::string16 trimmed_query;
-  base::TrimWhitespace(search_box_->text(), base::TrimPositions::TRIM_ALL,
+  base::TrimWhitespace(search_box_->GetText(), base::TrimPositions::TRIM_ALL,
                        &trimmed_query);
   return trimmed_query.empty();
 }
 
 void SearchBoxViewBase::ClearSearch() {
   // Avoid setting |search_box_| text to empty if it is already empty.
-  if (search_box_->text() == base::string16())
+  if (search_box_->GetText() == base::string16())
     return;
 
   search_box_->SetText(base::string16());
@@ -485,7 +485,7 @@
   DCHECK(close_button_ && assistant_button_);
 
   const bool should_show_close_button =
-      !search_box_->text().empty() ||
+      !search_box_->GetText().empty() ||
       (show_close_button_when_active_ && is_search_box_active_);
   const bool should_show_assistant_button =
       show_assistant_button_ && !should_show_close_button;
@@ -549,7 +549,7 @@
         GetWidget()->GetWindowBoundsInScreen().Contains(
             located_event->root_location());
     if (is_search_box_active_ || !event_is_in_searchbox_bounds ||
-        !search_box_->text().empty())
+        !search_box_->GetText().empty())
       return;
     // If the event was within the searchbox bounds and in an inactive empty
     // search box, enable the search box.
diff --git a/ui/events/blink/web_input_event_traits.cc b/ui/events/blink/web_input_event_traits.cc
index ff87855..7eeceef4 100644
--- a/ui/events/blink/web_input_event_traits.cc
+++ b/ui/events/blink/web_input_event_traits.cc
@@ -208,6 +208,7 @@
     case WebInputEvent::kGestureTapDown:
     case WebInputEvent::kGestureTapCancel:
     case WebInputEvent::kGesturePinchBegin:
+    case WebInputEvent::kGesturePinchUpdate:
     case WebInputEvent::kGesturePinchEnd:
       return false;
 
diff --git a/ui/file_manager/file_manager/foreground/elements/files_message.js b/ui/file_manager/file_manager/foreground/elements/files_message.js
index e018953f..58a15cf 100644
--- a/ui/file_manager/file_manager/foreground/elements/files_message.js
+++ b/ui/file_manager/file_manager/foreground/elements/files_message.js
@@ -75,7 +75,8 @@
  */
 class FilesMessage extends HTMLElement {
   constructor() {
-    FilesMessage.createElement_.call(super());
+    super();
+    this.createElement_();
 
     /**
      * FilesMessage visual signals user callback.
@@ -88,7 +89,7 @@
    * Creates FilesMessage element.
    * @private
    */
-  static createElement_() {
+  createElement_() {
     this.attachShadow({mode: 'open'}).innerHTML = filesMessageTemplate;
   }
 
diff --git a/ui/file_manager/file_manager/foreground/elements/xf_button.js b/ui/file_manager/file_manager/foreground/elements/xf_button.js
index d604bf8..8a8363e 100644
--- a/ui/file_manager/file_manager/foreground/elements/xf_button.js
+++ b/ui/file_manager/file_manager/foreground/elements/xf_button.js
@@ -7,14 +7,15 @@
  */
 class PanelButton extends HTMLElement {
   constructor() {
-    PanelButton.createElement_.call(super());
+    super();
+    this.createElement_();
   }
 
   /**
    * Creates a PanelButton.
    * @private
    */
-  static createElement_() {
+  createElement_() {
     const template = document.createElement('template');
     template.innerHTML = PanelButton.html_();
     const fragment = template.content.cloneNode(true);
diff --git a/ui/file_manager/file_manager/foreground/elements/xf_display_panel.js b/ui/file_manager/file_manager/foreground/elements/xf_display_panel.js
index 7bd9bb3f..5409aa3 100644
--- a/ui/file_manager/file_manager/foreground/elements/xf_display_panel.js
+++ b/ui/file_manager/file_manager/foreground/elements/xf_display_panel.js
@@ -8,7 +8,8 @@
  */
 class DisplayPanel extends HTMLElement {
   constructor() {
-    DisplayPanel.createElement_.call(super());
+    super();
+    this.createElement_();
 
     /** @private {?Element} */
     this.summary_ = this.shadowRoot.querySelector('#summary');
@@ -48,7 +49,7 @@
    * Creates an instance of DisplayPanel, attaching the template clone.
    * @private
    */
-  static createElement_() {
+  createElement_() {
     const template = document.createElement('template');
     template.innerHTML = DisplayPanel.html_();
     const fragment = template.content.cloneNode(true);
diff --git a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
index dfa6b1c..c547ac5c 100644
--- a/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
+++ b/ui/file_manager/file_manager/foreground/js/file_transfer_controller.js
@@ -11,7 +11,7 @@
 const DRAG_AND_DROP_GLOBAL_DATA = '__drag_and_drop_global_data';
 
 /**
- * @typedef {{file:File, externalFileUrl:string}}
+ * @typedef {{file:?File, externalFileUrl:string}}
  */
 let FileAsyncData;
 
@@ -271,7 +271,7 @@
   /**
    * Write the current selection to system clipboard.
    *
-   * @param {!ClipboardData} clipboardData ClipboardData from the event.
+   * @param {DataTransfer} clipboardData DataTransfer from the event.
    * @param {string} effectAllowed Value must be valid for the
    *     |clipboardData.effectAllowed| property.
    * @private
@@ -299,7 +299,7 @@
 
   /**
    * Appends copy or cut information of |entries| to |clipboardData|.
-   * @param {!ClipboardData} clipboardData ClipboardData from the event.
+   * @param {DataTransfer} clipboardData DataTransfer from the event.
    * @param {string} effectAllowed Value must be valid for the
    *     |clipboardData.effectAllowed| property.
    * @param {!VolumeInfo} sourceVolumeInfo
@@ -327,7 +327,7 @@
 
   /**
    * Appends uri-list of |entries| to |clipboardData|.
-   * @param {!ClipboardData} clipboardData ClipboardData from the event.
+   * @param {DataTransfer} clipboardData ClipboardData from the event.
    * @param {!Array<!Entry>} entries
    * @private
    */
@@ -340,7 +340,7 @@
         continue;
       }
       if (this.selectedAsyncData_[url].file) {
-        clipboardData.items.add(this.selectedAsyncData_[url].file);
+        clipboardData.items.add(assert(this.selectedAsyncData_[url].file));
       }
       if (!externalFileUrl) {
         externalFileUrl = this.selectedAsyncData_[url].externalFileUrl;
@@ -375,7 +375,7 @@
    * Extracts source root URL from the |clipboardData| or |dragAndDropData|
    * object.
    *
-   * @param {!ClipboardData} clipboardData DataTransfer object from the event.
+   * @param {!DataTransfer} clipboardData DataTransfer object from the event.
    * @param {Object<string>} dragAndDropData The drag and drop data from
    *     getDragAndDropGlobalData_().
    * @return {string} URL or an empty string (if unknown).
@@ -397,7 +397,7 @@
   }
 
   /**
-   * @param {!ClipboardData} clipboardData DataTransfer object from the event.
+   * @param {!DataTransfer} clipboardData DataTransfer object from the event.
    * @return {boolean} Returns true when missing some file contents.
    * @private
    */
@@ -528,7 +528,7 @@
    * Queue up a file copy operation based on the current system clipboard and
    * drag-and-drop global object.
    *
-   * @param {!ClipboardData} clipboardData System data transfer object.
+   * @param {!DataTransfer} clipboardData System data transfer object.
    * @param {DirectoryEntry=} opt_destinationEntry Paste destination.
    * @param {string=} opt_effect Desired drop/paste effect. Could be
    *     'move'|'copy' (default is copy). Ignored if conflicts with
@@ -772,12 +772,13 @@
   /**
    * Renders a drag-and-drop thumbnail.
    *
-   * @return {!Element} Element containing the thumbnail.
+   * @return {!HTMLElement} Element containing the thumbnail.
    * @private
    */
   renderThumbnail_() {
     const length = this.selectionHandler_.selection.entries.length;
-    const container = this.document_.querySelector('#drag-container');
+    const container = /** @type {HTMLElement} */ (
+        this.document_.querySelector('#drag-container'));
     const contents = this.document_.createElement('div');
     contents.className = 'drag-contents';
     container.appendChild(contents);
@@ -884,7 +885,7 @@
       return;
     }
 
-    const dt = event.dataTransfer;
+    const dt = /** @type {DragEvent} */ (event).dataTransfer;
     const canCopy = this.canCopyOrDrag();
     const canCut = this.canCutOrDrag();
     if (canCopy || canCut) {
@@ -1067,7 +1068,7 @@
    * Sets the drop target.
    *
    * @param {Element} domElement Target of the drop.
-   * @param {!ClipboardData} clipboardData Data transfer object.
+   * @param {!DataTransfer} clipboardData Data transfer object.
    * @param {!DirectoryEntry|!FakeEntry} destinationEntry Destination entry.
    * @private
    */
@@ -1142,6 +1143,19 @@
   }
 
   /**
+   * addEventListener only accepts callback that receives base class Event,
+   * this forces clipboard event handlers to cast event to ClipboardEvent to
+   * be able to use |clipboard| member.
+   * @param {Event} event
+   * @return {!DataTransfer}
+   * @private
+   */
+  getClipboardData_(event) {
+    const clipboardEvent = /** @type {ClipboardEvent} */ (event);
+    return assert(clipboardEvent.clipboardData);
+  }
+
+  /**
    * @return {boolean} Returns false if {@code <input type="text"> or
    *     <cr-input>} element is currently active. Otherwise, returns true.
    * @private
@@ -1167,7 +1181,7 @@
 
     event.preventDefault();
 
-    const clipboardData = assert(event.clipboardData);
+    const clipboardData = this.getClipboardData_(event);
     const effectAllowed = isMove ? 'move' : 'copy';
 
     // If current focus is on DirectoryTree, write selected item of
@@ -1187,7 +1201,7 @@
   /**
    * Performs cut or copy operation dispatched from directory tree.
    * @param {!DirectoryTree} directoryTree
-   * @param {!ClipboardData} clipboardData
+   * @param {!DataTransfer} clipboardData
    * @param {string} effectAllowed
    */
   cutOrCopyFromDirectoryTree(directoryTree, clipboardData, effectAllowed) {
@@ -1300,11 +1314,11 @@
 
     // Need to update here since 'beforepaste' doesn't fire.
     if (!this.isDocumentWideEvent_() ||
-        !this.canPasteOrDrop_(assert(event.clipboardData), destination)) {
+        !this.canPasteOrDrop_(this.getClipboardData_(event), destination)) {
       return;
     }
     event.preventDefault();
-    this.paste(assert(event.clipboardData), destination).then(effect => {
+    this.paste(this.getClipboardData_(event), destination).then(effect => {
       // On cut, we clear the clipboard after the file is pasted/moved so we
       // don't try to move/delete the original file again.
       if (effect === 'move') {
@@ -1326,14 +1340,14 @@
     }
     // queryCommandEnabled returns true if event.defaultPrevented is true.
     if (this.canPasteOrDrop_(
-            assert(event.clipboardData),
+            this.getClipboardData_(event),
             this.directoryModel_.getCurrentDirEntry())) {
       event.preventDefault();
     }
   }
 
   /**
-   * @param {ClipboardData} clipboardData Clipboard data object.
+   * @param {DataTransfer} clipboardData Data transfer object.
    * @param {DirectoryEntry|FilesAppEntry} destinationEntry Destination
    *    entry.
    * @return {boolean} Returns true if items stored in {@code clipboardData} can
@@ -1402,7 +1416,7 @@
     let result;
     this.simulateCommand_('paste', event => {
       result =
-          this.canPasteOrDrop_(assert(event.clipboardData), destinationEntry);
+          this.canPasteOrDrop_(this.getClipboardData_(event), destinationEntry);
     });
     return result;
   }
diff --git a/ui/message_center/views/notification_view_md.cc b/ui/message_center/views/notification_view_md.cc
index 245e7024..b0ba040 100644
--- a/ui/message_center/views/notification_view_md.cc
+++ b/ui/message_center/views/notification_view_md.cc
@@ -453,7 +453,7 @@
   if (event.type() == ui::ET_KEY_PRESSED &&
       event.key_code() == ui::VKEY_RETURN) {
     delegate_->OnNotificationInputSubmit(
-        textfield_->GetProperty(kTextfieldIndexKey), textfield_->text());
+        textfield_->GetProperty(kTextfieldIndexKey), textfield_->GetText());
     textfield_->SetText(base::string16());
     return true;
   }
@@ -465,7 +465,7 @@
   button_->SetImage(
       views::Button::STATE_NORMAL,
       gfx::CreateVectorIcon(kNotificationInlineReplyIcon, kInputReplyButtonSize,
-                            textfield_->text().empty()
+                            textfield_->GetText().empty()
                                 ? kTextfieldPlaceholderIconColorMD
                                 : SK_ColorWHITE));
 }
@@ -474,7 +474,7 @@
                                                  const ui::Event& event) {
   if (sender == button_) {
     delegate_->OnNotificationInputSubmit(
-        textfield_->GetProperty(kTextfieldIndexKey), textfield_->text());
+        textfield_->GetProperty(kTextfieldIndexKey), textfield_->GetText());
   }
 }
 
diff --git a/ui/ozone/platform/x11/x11_window_ozone.cc b/ui/ozone/platform/x11/x11_window_ozone.cc
index f8503f7..39b062b 100644
--- a/ui/ozone/platform/x11/x11_window_ozone.cc
+++ b/ui/ozone/platform/x11/x11_window_ozone.cc
@@ -67,15 +67,14 @@
   config.activatable = properties.activatable;
 #endif
 
-  // TODO(nickdiego): Add missing platform window init properties
-  // config.force_show_in_taskbar = properties.force_show_in_taskbar;
-  // config.keep_on_top = properties.keep_on_top;
-  // config.visible_on_all_workspaces = properties.visible_on_all_workspaces;
-  // config.remove_standard_frame = properties.remove_standard_frame;
-  // config.workspace = properties.workspace;
-  // config.wm_class_name = properties.wm_class_name;
-  // config.wm_class_class = properties.wm_class_class;
-  // config.wm_role_name = properties.wm_role_name;
+  config.force_show_in_taskbar = properties.force_show_in_taskbar;
+  config.keep_on_top = properties.keep_on_top;
+  config.visible_on_all_workspaces = properties.visible_on_all_workspaces;
+  config.remove_standard_frame = properties.remove_standard_frame;
+  config.workspace = properties.workspace;
+  config.wm_class_name = properties.wm_class_name;
+  config.wm_class_class = properties.wm_class_class;
+  config.wm_role_name = properties.wm_role_name;
 
   return config;
 }
diff --git a/ui/platform_window/platform_window_init_properties.h b/ui/platform_window/platform_window_init_properties.h
index 76113f4..18af35a 100644
--- a/ui/platform_window/platform_window_init_properties.h
+++ b/ui/platform_window/platform_window_init_properties.h
@@ -58,6 +58,18 @@
 #endif
 
   bool activatable = false;
+  bool force_show_in_taskbar;
+  bool keep_on_top = false;
+  bool visible_on_all_workspaces = false;
+  bool remove_standard_frame = false;
+  std::string workspace;
+
+  // Only used by X11. Specifies the res_name and res_class fields,
+  // respectively, of the WM_CLASS window property. Controls window grouping
+  // and desktop file matching in Linux window managers.
+  std::string wm_role_name;
+  std::string wm_class_name;
+  std::string wm_class_class;
 };
 
 }  // namespace ui
diff --git a/ui/touch_selection/OWNERS b/ui/touch_selection/OWNERS
index c65e542..2fa7693 100644
--- a/ui/touch_selection/OWNERS
+++ b/ui/touch_selection/OWNERS
@@ -1 +1,3 @@
 mohsen@chromium.org
+# COMPONENT: UI>Browser>Selection
+# TEAM: input-dev@chromium.org
diff --git a/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc b/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
index 5fffc102..137f4087 100644
--- a/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
+++ b/ui/views/accessibility/view_ax_platform_node_delegate_win_unittest.cc
@@ -97,7 +97,7 @@
 
   ScopedBstr new_value(L"New value");
   ASSERT_EQ(S_OK, textfield_accessible->put_accValue(childid_self, new_value));
-  EXPECT_STREQ(L"New value", textfield->text().c_str());
+  EXPECT_STREQ(L"New value", textfield->GetText().c_str());
 }
 
 TEST_F(ViewAXPlatformNodeDelegateWinTest, TextfieldAssociatedLabel) {
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index d925401..bb58136 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -1488,29 +1488,29 @@
         if (event.key_code() == ui::VKEY_RETURN) {
           EXPECT_FALSE(*saw_return);
           *saw_return = true;
-          EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->text());
+          EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->GetText());
         }
         return false;
       },
       &saw_vkey_return));
 
-  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->text());
+  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->GetText());
 
   g_fake_interpret_key_events = &handle_q_in_ime;
   [ns_view_ keyDown:q_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"ㅂ"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"ㅂ"), textfield->GetText());
   EXPECT_FALSE(saw_vkey_return);
 
   g_fake_interpret_key_events = &handle_o_in_ime;
   [ns_view_ keyDown:o_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->GetText());
   EXPECT_FALSE(saw_vkey_return);
 
   // Note the "Enter" should not replace the replacement range, even though a
   // replacement range was set.
   g_fake_interpret_key_events = &handle_return_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->GetText());
 
   // VKEY_RETURN should be seen by via the unhandled key event handler (but not
   // via -insertText:.
@@ -1564,28 +1564,29 @@
         [view doCommandBySelector:@selector(insertNewLine:)];
       });
 
-  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->text());
+  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   object_setClass(ns_view_, [InterpretKeyEventMockedBridgedContentView class]);
   g_fake_interpret_key_events = &handle_m_in_ime;
   [ns_view_ keyDown:m_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"m"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"m"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   g_fake_interpret_key_events = &handle_first_o_in_ime;
   [ns_view_ keyDown:o_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"mo"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"mo"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   g_fake_interpret_key_events = &handle_second_o_in_ime;
   [ns_view_ keyDown:o_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"mô"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"mô"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   g_fake_interpret_key_events = &handle_return_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"mô"), textfield->text());  // No change.
+  EXPECT_EQ(base::SysNSStringToUTF16(@"mô"),
+            textfield->GetText());    // No change.
   EXPECT_EQ(1, enter_view->count());  // Now we see the accelerator.
 }
 
@@ -1617,24 +1618,25 @@
   InterpretKeyEventsCallback handle_second_return_in_ime = base::BindRepeating(
       [](id view) { [view doCommandBySelector:@selector(insertNewLine:)]; });
 
-  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->text());
+  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   object_setClass(ns_view_, [InterpretKeyEventMockedBridgedContentView class]);
   g_fake_interpret_key_events = &handle_a_in_ime;
   [ns_view_ keyDown:a_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   g_fake_interpret_key_events = &handle_first_return_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());  // Not seen as an accelerator.
 
   g_fake_interpret_key_events = &handle_second_return_in_ime;
   [ns_view_
       keyDown:VkeyKeyDown(ui::VKEY_RETURN)];  // Sanity check: send Enter again.
-  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->text());  // No change.
+  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"),
+            textfield->GetText());    // No change.
   EXPECT_EQ(1, enter_view->count());  // Now we see the accelerator.
 }
 
@@ -1683,37 +1685,38 @@
         [view doCommandBySelector:@selector(insertNewLine:)];
       });
 
-  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->text());
+  EXPECT_EQ(base::UTF8ToUTF16(""), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   object_setClass(ns_view_, [InterpretKeyEventMockedBridgedContentView class]);
   g_fake_interpret_key_events = &handle_a_in_ime;
   [ns_view_ keyDown:a_in_ime];
-  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"あ"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   g_fake_interpret_key_events = &handle_tab_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_TAB)];
   // Tab will switch to a Romanji (Latin) character.
-  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());
 
   g_fake_interpret_key_events = &handle_first_return_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
   // Enter just dismisses the IME window. The composition is still active.
-  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());  // Not seen as an accelerator.
 
   g_fake_interpret_key_events = &handle_second_return_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];
   // Enter now confirms the composition (unmarks text). Note there is still no
   // IME window visible but, since there is marked text, IME is still active.
-  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->GetText());
   EXPECT_EQ(0, enter_view->count());  // Not seen as an accelerator.
 
   g_fake_interpret_key_events = &handle_third_return_in_ime;
   [ns_view_ keyDown:VkeyKeyDown(ui::VKEY_RETURN)];  // Send Enter a third time.
-  EXPECT_EQ(base::SysNSStringToUTF16(@"a"), textfield->text());  // No change.
+  EXPECT_EQ(base::SysNSStringToUTF16(@"a"),
+            textfield->GetText());    // No change.
   EXPECT_EQ(1, enter_view->count());  // Now we see the accelerator.
 }
 
@@ -1797,7 +1800,7 @@
   // Starting text (just insert it).
   [ns_view_ insertText:@"ㅂ" replacementRange:NSMakeRange(NSNotFound, 0)];
 
-  EXPECT_EQ(base::SysNSStringToUTF16(@"ㅂ"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"ㅂ"), textfield->GetText());
 
   g_fake_interpret_key_events = &generate_return_and_fake_ime;
   g_update_windows_closure = &update_windows_closure;
@@ -1814,7 +1817,7 @@
 
   // The text inserted during updateWindows should have been inserted, even
   // though we were trying to change the input context.
-  EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(@"배"), textfield->GetText());
 
   EXPECT_TRUE(g_fake_current_input_context);
 
diff --git a/ui/views/controls/editable_combobox/editable_combobox.cc b/ui/views/controls/editable_combobox/editable_combobox.cc
index 83fb37d..21efab10 100644
--- a/ui/views/controls/editable_combobox/editable_combobox.cc
+++ b/ui/views/controls/editable_combobox/editable_combobox.cc
@@ -349,7 +349,7 @@
 }
 
 const base::string16& EditableCombobox::GetText() const {
-  return textfield_->text();
+  return textfield_->GetText();
 }
 
 void EditableCombobox::SetText(const base::string16& text) {
diff --git a/ui/views/controls/message_box_view.cc b/ui/views/controls/message_box_view.cc
index aa9ce75b..f2f9631 100644
--- a/ui/views/controls/message_box_view.cc
+++ b/ui/views/controls/message_box_view.cc
@@ -90,7 +90,7 @@
 MessageBoxView::~MessageBoxView() = default;
 
 base::string16 MessageBoxView::GetInputText() {
-  return prompt_field_ ? prompt_field_->text() : base::string16();
+  return prompt_field_ ? prompt_field_->GetText() : base::string16();
 }
 
 bool MessageBoxView::IsCheckBoxSelected() {
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index c2b79810..d0d900fb 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -326,6 +326,10 @@
       node_data.GetString16Attribute(ax::mojom::StringAttribute::kName));
 }
 
+bool Textfield::GetReadOnly() const {
+  return read_only_;
+}
+
 void Textfield::SetReadOnly(bool read_only) {
   // Update read-only without changing the focusable state (or active, etc.).
   read_only_ = read_only;
@@ -348,6 +352,10 @@
   text_input_flags_ = flags;
 }
 
+const base::string16& Textfield::GetText() const {
+  return model_->text();
+}
+
 void Textfield::SetText(const base::string16& new_text) {
   model_->SetText(new_text);
   OnCaretBoundsChanged();
@@ -422,7 +430,7 @@
     return background_color_;
 
   return GetNativeTheme()->GetSystemColor(
-      read_only() || !GetEnabled()
+      GetReadOnly() || !GetEnabled()
           ? ui::NativeTheme::kColorId_TextfieldReadOnlyBackground
           : ui::NativeTheme::kColorId_TextfieldDefaultBackground);
 }
@@ -528,7 +536,7 @@
 
 void Textfield::ShowVirtualKeyboardIfEnabled() {
   // GetInputMethod() may return nullptr in tests.
-  if (GetEnabled() && !read_only() && GetInputMethod())
+  if (GetEnabled() && !GetReadOnly() && GetInputMethod())
     GetInputMethod()->ShowVirtualKeyboardIfEnabled();
 }
 
@@ -899,13 +907,13 @@
   // Skip backspace accelerator handling; editable textfields handle this key.
   // Also skip processing Windows [Alt]+<num-pad digit> Unicode alt-codes.
   const bool is_backspace = event.key_code() == ui::VKEY_BACK;
-  return (is_backspace && !read_only()) || event.IsUnicodeKeyCode();
+  return (is_backspace && !GetReadOnly()) || event.IsUnicodeKeyCode();
 }
 
 bool Textfield::GetDropFormats(
     int* formats,
     std::set<ui::ClipboardFormatType>* format_types) {
-  if (!GetEnabled() || read_only())
+  if (!GetEnabled() || GetReadOnly())
     return false;
   // TODO(msw): Can we support URL, FILENAME, etc.?
   *formats = ui::OSExchangeData::STRING;
@@ -918,7 +926,7 @@
   int formats;
   std::set<ui::ClipboardFormatType> format_types;
   GetDropFormats(&formats, &format_types);
-  return GetEnabled() && !read_only() &&
+  return GetEnabled() && !GetReadOnly() &&
          data.HasAnyFormat(formats, format_types);
 }
 
@@ -1012,15 +1020,15 @@
   if (GetEnabled()) {
     node_data->SetDefaultActionVerb(ax::mojom::DefaultActionVerb::kActivate);
     // Only readonly if enabled. Don't overwrite the disabled restriction.
-    if (read_only())
+    if (GetReadOnly())
       node_data->SetRestriction(ax::mojom::Restriction::kReadOnly);
   }
   if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) {
     node_data->AddState(ax::mojom::State::kProtected);
     node_data->SetValue(base::string16(
-        text().size(), gfx::RenderText::kPasswordReplacementChar));
+        GetText().size(), gfx::RenderText::kPasswordReplacementChar));
   } else {
-    node_data->SetValue(text());
+    node_data->SetValue(GetText());
   }
   node_data->AddStringAttribute(ax::mojom::StringAttribute::kPlaceholder,
                                 base::UTF16ToUTF8(GetPlaceholderText()));
@@ -1041,7 +1049,7 @@
   }
 
   // Remaining actions cannot be performed on readonly fields.
-  if (read_only())
+  if (GetReadOnly())
     return View::HandleAccessibleAction(action_data);
 
   if (action_data.action == ax::mojom::Action::kSetValue) {
@@ -1227,7 +1235,7 @@
   if (!GetEnabled() || text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD ||
       !GetRenderText()->IsPointInSelection(p)) {
     drag_operations = ui::DragDropTypes::DRAG_NONE;
-  } else if (sender == this && !read_only()) {
+  } else if (sender == this && !GetReadOnly()) {
     drag_operations =
         ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY;
   }
@@ -1464,7 +1472,7 @@
 }
 
 void Textfield::InsertChar(const ui::KeyEvent& event) {
-  if (read_only()) {
+  if (GetReadOnly()) {
     OnEditFailed();
     return;
   }
@@ -1495,7 +1503,7 @@
 }
 
 ui::TextInputType Textfield::GetTextInputType() const {
-  if (read_only() || !GetEnabled())
+  if (GetReadOnly() || !GetEnabled())
     return ui::TEXT_INPUT_TYPE_NONE;
   return text_input_type_;
 }
@@ -1653,7 +1661,7 @@
 
 bool Textfield::IsTextEditCommandEnabled(ui::TextEditCommand command) const {
   base::string16 result;
-  bool editable = !read_only();
+  bool editable = !GetReadOnly();
   bool readable = text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD;
   switch (command) {
     case ui::TextEditCommand::DELETE_BACKWARD:
@@ -1711,7 +1719,8 @@
           ui::ClipboardType::kCopyPaste, &result);
       return editable && !result.empty();
     case ui::TextEditCommand::SELECT_ALL:
-      return !text().empty() && GetSelectedRange().length() != text().length();
+      return !GetText().empty() &&
+             GetSelectedRange().length() != GetText().length();
     case ui::TextEditCommand::TRANSPOSE:
       return editable && !model_->HasSelection() &&
              !model_->HasCompositionText();
@@ -2032,7 +2041,7 @@
 }
 
 bool Textfield::ShouldShowPlaceholderText() const {
-  return text().empty() && !GetPlaceholderText().empty();
+  return GetText().empty() && !GetPlaceholderText().empty();
 }
 
 views::PropertyChangedSubscription Textfield::AddTextChangedCallback(
@@ -2052,7 +2061,7 @@
 }
 
 bool Textfield::IsReadOnly() const {
-  return read_only();
+  return GetReadOnly();
 }
 
 bool Textfield::SupportsDrag() const {
@@ -2101,7 +2110,7 @@
 
 bool Textfield::PasteSelectionClipboard() {
   DCHECK(performing_user_action_);
-  DCHECK(!read_only());
+  DCHECK(!GetReadOnly());
   const base::string16 selection_clipboard_text = GetSelectionClipboardText();
   if (selection_clipboard_text.empty())
     return false;
@@ -2154,7 +2163,7 @@
 void Textfield::UpdateAfterChange(bool text_changed, bool cursor_changed) {
   if (text_changed) {
     if (controller_)
-      controller_->ContentsChanged(this, text());
+      controller_->ContentsChanged(this, GetText());
     NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
   }
   if (cursor_changed) {
@@ -2185,8 +2194,8 @@
 }
 
 int Textfield::GetTextStyle() const {
-  return (read_only() || !GetEnabled()) ? style::STYLE_DISABLED
-                                        : style::STYLE_PRIMARY;
+  return (GetReadOnly() || !GetEnabled()) ? style::STYLE_DISABLED
+                                          : style::STYLE_PRIMARY;
 }
 
 void Textfield::PaintTextAndCursor(gfx::Canvas* canvas) {
@@ -2269,7 +2278,7 @@
 }
 
 bool Textfield::Cut() {
-  if (!read_only() && text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD &&
+  if (!GetReadOnly() && text_input_type_ != ui::TEXT_INPUT_TYPE_PASSWORD &&
       model_->Cut()) {
     if (controller_)
       controller_->OnAfterCutOrCopy(ui::ClipboardType::kCopyPaste);
@@ -2288,7 +2297,7 @@
 }
 
 bool Textfield::Paste() {
-  if (!read_only() && model_->Paste()) {
+  if (!GetReadOnly() && model_->Paste()) {
     if (controller_)
       controller_->OnAfterPaste();
     return true;
@@ -2363,7 +2372,7 @@
 }
 
 bool Textfield::ShouldShowCursor() const {
-  return HasFocus() && !HasSelection() && GetEnabled() && !read_only() &&
+  return HasFocus() && !HasSelection() && GetEnabled() && !GetReadOnly() &&
          !drop_cursor_visible_ && GetRenderText()->cursor_enabled();
 }
 
diff --git a/ui/views/controls/textfield/textfield.h b/ui/views/controls/textfield/textfield.h
index 363d2182..ce24e41 100644
--- a/ui/views/controls/textfield/textfield.h
+++ b/ui/views/controls/textfield/textfield.h
@@ -94,7 +94,7 @@
   }
 
   // Gets/Sets whether or not the Textfield is read-only.
-  bool read_only() const { return read_only_; }
+  bool GetReadOnly() const;
   void SetReadOnly(bool read_only);
 
   // Sets the input type; displays only asterisks for TEXT_INPUT_TYPE_PASSWORD.
@@ -107,7 +107,7 @@
   // Gets the text for the Textfield.
   // NOTE: Call sites should take care to not reveal the text for a password
   // textfield.
-  const base::string16& text() const { return model_->text(); }
+  const base::string16& GetText() const;
 
   // Sets the text currently displayed in the Textfield.  This doesn't
   // change the cursor position if the current cursor is within the
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc
index 1cd9cb3d..1dd7c69 100644
--- a/ui/views/controls/textfield/textfield_unittest.cc
+++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -706,7 +706,7 @@
   void VerifyTextfieldContextMenuContents(bool textfield_has_selection,
                                           bool can_undo,
                                           ui::MenuModel* menu) {
-    const auto& text = textfield_->text();
+    const auto& text = textfield_->GetText();
     const bool is_all_selected = !text.empty() &&
         textfield_->GetSelectedRange().length() == text.length();
 
@@ -819,12 +819,12 @@
   textfield_->SetText(ASCIIToUTF16("this is"));
 
   EXPECT_STR_EQ("this is", model_->text());
-  EXPECT_STR_EQ("this is", textfield_->text());
+  EXPECT_STR_EQ("this is", textfield_->GetText());
   EXPECT_TRUE(last_contents_.empty());
 
   textfield_->AppendText(ASCIIToUTF16(" a test"));
   EXPECT_STR_EQ("this is a test", model_->text());
-  EXPECT_STR_EQ("this is a test", textfield_->text());
+  EXPECT_STR_EQ("this is a test", textfield_->GetText());
   EXPECT_TRUE(last_contents_.empty());
 
   EXPECT_EQ(base::string16(), textfield_->GetSelectedText());
@@ -847,9 +847,9 @@
 
   // On Mac, Caps+Shift remains uppercase.
   if (TestingNativeMac())
-    EXPECT_STR_EQ("TeXT!1!1", textfield_->text());
+    EXPECT_STR_EQ("TeXT!1!1", textfield_->GetText());
   else
-    EXPECT_STR_EQ("TexT!1!1", textfield_->text());
+    EXPECT_STR_EQ("TexT!1!1", textfield_->GetText());
 }
 
 #if defined(OS_LINUX)
@@ -869,7 +869,7 @@
 
   EXPECT_EQ(WideToUTF16(L"\x0448\x044C"
                         L"im"),
-            textfield_->text());
+            textfield_->GetText());
 }
 #endif
 
@@ -910,11 +910,11 @@
   SendKeyPress(ui::VKEY_OEM_MINUS, ctrl | shift);
 
   if (TestingNativeCrOs())
-    EXPECT_STR_EQ("TeTEx34", textfield_->text());
+    EXPECT_STR_EQ("TeTEx34", textfield_->GetText());
   else if (TestingNativeMac())
-    EXPECT_STR_EQ("TheTxE134", textfield_->text());
+    EXPECT_STR_EQ("TheTxE134", textfield_->GetText());
   else
-    EXPECT_STR_EQ("TeTEx234", textfield_->text());
+    EXPECT_STR_EQ("TeTEx234", textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, ControlAndSelectTest) {
@@ -950,7 +950,7 @@
   SendKeyEvent(ui::VKEY_R, true, false);
   SendKeyEvent(ui::VKEY_O, true, false);
   SendKeyEvent(ui::VKEY_SPACE, false, false);
-  EXPECT_STR_EQ("ZERO two three", textfield_->text());
+  EXPECT_STR_EQ("ZERO two three", textfield_->GetText());
 
   SendEndEvent(true);
   EXPECT_STR_EQ("two three", textfield_->GetSelectedText());
@@ -1022,7 +1022,7 @@
   // to cover the whole line.
   SendHomeEvent(true);
 #if defined(OS_MACOSX)
-  EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText());
+  EXPECT_EQ(textfield_->GetText(), textfield_->GetSelectedText());
 #else
   EXPECT_STR_EQ("12 345", textfield_->GetSelectedText());
 #endif
@@ -1031,7 +1031,7 @@
   // Select line towards right.
   SendEndEvent(true);
 #if defined(OS_MACOSX)
-  EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText());
+  EXPECT_EQ(textfield_->GetText(), textfield_->GetSelectedText());
 #else
   EXPECT_STR_EQ("67 89", textfield_->GetSelectedText());
 #endif
@@ -1163,28 +1163,28 @@
   InitTextfield();
   for (size_t i = 0; i < 10; i++)
     SendKeyEvent(static_cast<ui::KeyboardCode>(ui::VKEY_A + i));
-  EXPECT_STR_EQ("abcdefghij", textfield_->text());
+  EXPECT_STR_EQ("abcdefghij", textfield_->GetText());
 
   // Test the delete and backspace keys.
   textfield_->SelectRange(gfx::Range(5));
   for (size_t i = 0; i < 3; i++)
     SendKeyEvent(ui::VKEY_BACK);
-  EXPECT_STR_EQ("abfghij", textfield_->text());
+  EXPECT_STR_EQ("abfghij", textfield_->GetText());
   for (size_t i = 0; i < 3; i++)
     SendKeyEvent(ui::VKEY_DELETE);
-  EXPECT_STR_EQ("abij", textfield_->text());
+  EXPECT_STR_EQ("abij", textfield_->GetText());
 
   // Select all and replace with "k".
   textfield_->SelectAll(false);
   SendKeyEvent(ui::VKEY_K);
-  EXPECT_STR_EQ("k", textfield_->text());
+  EXPECT_STR_EQ("k", textfield_->GetText());
 
   // Delete the previous word from cursor.
   bool shift = false;
   textfield_->SetText(ASCIIToUTF16("one two three four"));
   SendEndEvent(shift);
   SendWordEvent(ui::VKEY_BACK, shift);
-  EXPECT_STR_EQ("one two three ", textfield_->text());
+  EXPECT_STR_EQ("one two three ", textfield_->GetText());
 
   // Delete to a line break on Linux and ChromeOS, to a word break on Windows
   // and Mac.
@@ -1192,9 +1192,9 @@
   shift = true;
   SendWordEvent(ui::VKEY_BACK, shift);
 #if defined(OS_LINUX)
-  EXPECT_STR_EQ("three ", textfield_->text());
+  EXPECT_STR_EQ("three ", textfield_->GetText());
 #else
-  EXPECT_STR_EQ("one three ", textfield_->text());
+  EXPECT_STR_EQ("one three ", textfield_->GetText());
 #endif
 
   // Delete the next word from cursor.
@@ -1203,9 +1203,9 @@
   SendHomeEvent(shift);
   SendWordEvent(ui::VKEY_DELETE, shift);
 #if defined(OS_WIN)  // Delete word incldes space/punctuation.
-  EXPECT_STR_EQ("two three four", textfield_->text());
+  EXPECT_STR_EQ("two three four", textfield_->GetText());
 #else  // Non-Windows: delete word does NOT include space/punctuation.
-  EXPECT_STR_EQ(" two three four", textfield_->text());
+  EXPECT_STR_EQ(" two three four", textfield_->GetText());
 #endif
   // Delete to a line break on Linux and ChromeOS, to a word break on Windows
   // and Mac.
@@ -1213,11 +1213,11 @@
   shift = true;
   SendWordEvent(ui::VKEY_DELETE, shift);
 #if defined(OS_LINUX)
-  EXPECT_STR_EQ(" two", textfield_->text());
+  EXPECT_STR_EQ(" two", textfield_->GetText());
 #elif defined(OS_WIN)
-  EXPECT_STR_EQ("two four", textfield_->text());
+  EXPECT_STR_EQ("two four", textfield_->GetText());
 #else
-  EXPECT_STR_EQ(" two four", textfield_->text());
+  EXPECT_STR_EQ(" two four", textfield_->GetText());
 #endif
 }
 
@@ -1243,7 +1243,7 @@
     // Make selection as - on|e tw|o three.
     SendWordEvent(cases[i].key, cases[i].shift);
     // Verify state is on|o three.
-    EXPECT_STR_EQ("ono three", textfield_->text());
+    EXPECT_STR_EQ("ono three", textfield_->GetText());
     EXPECT_EQ(gfx::Range(2), textfield_->GetSelectedRange());
   }
 }
@@ -1266,7 +1266,7 @@
     textfield_->SetText(ASCIIToUTF16("one two three"));
     textfield_->SelectRange(gfx::Range(4));
     test_api_->ExecuteTextEditCommand(cases[i].command);
-    EXPECT_STR_EQ(cases[i].expected, textfield_->text());
+    EXPECT_STR_EQ(cases[i].expected, textfield_->GetText());
   }
 }
 
@@ -1279,8 +1279,8 @@
 
   last_contents_.clear();
   textfield_->SetText(ASCIIToUTF16("password"));
-  // Ensure text() and the callback returns the actual text instead of "*".
-  EXPECT_STR_EQ("password", textfield_->text());
+  // Ensure GetText() and the callback returns the actual text instead of "*".
+  EXPECT_STR_EQ("password", textfield_->GetText());
   EXPECT_TRUE(last_contents_.empty());
   model_->SelectAll(false);
   SetClipboardText(ui::ClipboardType::kCopyPaste, "foo");
@@ -1294,7 +1294,7 @@
   SendKeyEvent(ui::VKEY_C, false, true);
   SendAlternateCopy();
   EXPECT_STR_EQ("foo", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("password", textfield_->text());
+  EXPECT_STR_EQ("password", textfield_->GetText());
   // [Shift]+[Delete] should just delete without copying text to the clipboard.
   textfield_->SelectAll(false);
   SendKeyEvent(ui::VKEY_DELETE, true, false);
@@ -1305,7 +1305,7 @@
   SendKeyEvent(ui::VKEY_V, false, true);
   SendAlternatePaste();
   EXPECT_STR_EQ("foo", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("foofoofoo", textfield_->text());
+  EXPECT_STR_EQ("foofoofoo", textfield_->GetText());
 }
 
 // Check that text insertion works appropriately for password and read-only
@@ -1328,7 +1328,7 @@
 
   EXPECT_EQ(WideToUTF16(L"a\x05E1"
                         L"b"),
-            textfield_->text());
+            textfield_->GetText());
 
   textfield_->SetReadOnly(true);
   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, textfield_->GetTextInputType());
@@ -1337,7 +1337,7 @@
   // No text should be inserted for read only textfields.
   EXPECT_EQ(WideToUTF16(L"a\x05E1"
                         L"b"),
-            textfield_->text());
+            textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, TextInputType) {
@@ -1431,20 +1431,20 @@
 #endif
 
   SendKeyEvent(ui::VKEY_A, false, false);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   textfield_->clear();
 
   // Undo/Redo command keys are handled by the textfield.
   SendKeyEvent(ui::VKEY_Z, false, true);
   EXPECT_TRUE(textfield_->key_received());
   EXPECT_TRUE(textfield_->key_handled());
-  EXPECT_TRUE(textfield_->text().empty());
+  EXPECT_TRUE(textfield_->GetText().empty());
   textfield_->clear();
 
   SendKeyEvent(ui::VKEY_Z, true, true);
   EXPECT_TRUE(textfield_->key_received());
   EXPECT_TRUE(textfield_->key_handled());
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   textfield_->clear();
 
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
@@ -1465,33 +1465,33 @@
   const bool shift = false;
   SendWordEvent(ui::VKEY_LEFT, shift);
   SendKeyEvent(ui::VKEY_T);
-  EXPECT_STR_EQ("one two thre ", textfield_->text());
+  EXPECT_STR_EQ("one two thre ", textfield_->GetText());
   EXPECT_STR_EQ("one two thre ", last_contents_);
 
 #if defined(OS_WIN)  // Move right by word includes space/punctuation.
   // Ctrl+Right should move the cursor to the end of the last word.
   SendWordEvent(ui::VKEY_RIGHT, shift);
   SendKeyEvent(ui::VKEY_E);
-  EXPECT_STR_EQ("one two thre e", textfield_->text());
+  EXPECT_STR_EQ("one two thre e", textfield_->GetText());
   EXPECT_STR_EQ("one two thre e", last_contents_);
 
   // Ctrl+Right again should not move the cursor, because
   // it is aleady at the end.
   SendWordEvent(ui::VKEY_RIGHT, shift);
   SendKeyEvent(ui::VKEY_BACK);
-  EXPECT_STR_EQ("one two thre ", textfield_->text());
+  EXPECT_STR_EQ("one two thre ", textfield_->GetText());
   EXPECT_STR_EQ("one two thre ", last_contents_);
 #else  // Non-Windows: move right by word does NOT include space/punctuation.
   // Ctrl+Right should move the cursor to the end of the last word.
   SendWordEvent(ui::VKEY_RIGHT, shift);
   SendKeyEvent(ui::VKEY_E);
-  EXPECT_STR_EQ("one two three ", textfield_->text());
+  EXPECT_STR_EQ("one two three ", textfield_->GetText());
   EXPECT_STR_EQ("one two three ", last_contents_);
 
   // Ctrl+Right again should move the cursor to the end.
   SendWordEvent(ui::VKEY_RIGHT, shift);
   SendKeyEvent(ui::VKEY_BACK);
-  EXPECT_STR_EQ("one two three", textfield_->text());
+  EXPECT_STR_EQ("one two three", textfield_->GetText());
   EXPECT_STR_EQ("one two three", last_contents_);
 #endif
   // Test with leading whitespace.
@@ -1508,7 +1508,7 @@
 #endif
   SendWordEvent(ui::VKEY_LEFT, shift);
   SendKeyEvent(ui::VKEY_O);
-  EXPECT_STR_EQ(" one two", textfield_->text());
+  EXPECT_STR_EQ(" one two", textfield_->GetText());
   EXPECT_STR_EQ(" one two", last_contents_);
 
   // Ctrl+Left to move the cursor to the beginning of the first word.
@@ -1516,7 +1516,7 @@
   // Ctrl+Left again should move the cursor back to the very beginning.
   SendWordEvent(ui::VKEY_LEFT, shift);
   SendKeyEvent(ui::VKEY_DELETE);
-  EXPECT_STR_EQ("one two", textfield_->text());
+  EXPECT_STR_EQ("one two", textfield_->GetText());
   EXPECT_STR_EQ("one two", last_contents_);
 }
 
@@ -1685,7 +1685,7 @@
   PressLeftMouseButton();
   DragMouseTo(gfx::Point(0, cursor_y));
   ReleaseLeftMouseButton();
-  EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText());
+  EXPECT_EQ(textfield_->GetText(), textfield_->GetSelectedText());
 }
 
 // Ensures dragging above or below the textfield extends a selection to either
@@ -1753,7 +1753,7 @@
   EXPECT_EQ(ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE,
             textfield_->OnDragUpdated(drop));
   EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, textfield_->OnPerformDrop(drop));
-  EXPECT_STR_EQ("hello string world", textfield_->text());
+  EXPECT_STR_EQ("hello string world", textfield_->GetText());
 
   // Ensure that textfields do not accept non-OSExchangeData::STRING types.
   ui::OSExchangeData bad_data;
@@ -1846,22 +1846,22 @@
   ui::DropTargetEvent drop_a(data, kDropPoint, kDropPoint, operations);
   EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop_a));
   EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnPerformDrop(drop_a));
-  EXPECT_STR_EQ("h welloorld", textfield_->text());
+  EXPECT_STR_EQ("h welloorld", textfield_->GetText());
   textfield_->OnDragDone();
 
   // Undo/Redo the drag&drop change.
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("hello world", textfield_->text());
+  EXPECT_STR_EQ("hello world", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("hello world", textfield_->text());
+  EXPECT_STR_EQ("hello world", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("h welloorld", textfield_->text());
+  EXPECT_STR_EQ("h welloorld", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("h welloorld", textfield_->text());
+  EXPECT_STR_EQ("h welloorld", textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, DragAndDrop_ToTheLeft) {
@@ -1897,22 +1897,22 @@
   ui::DropTargetEvent drop_a(data, drop_point, drop_point, operations);
   EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop_a));
   EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnPerformDrop(drop_a));
-  EXPECT_STR_EQ("h worlellod", textfield_->text());
+  EXPECT_STR_EQ("h worlellod", textfield_->GetText());
   textfield_->OnDragDone();
 
   // Undo/Redo the drag&drop change.
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("hello world", textfield_->text());
+  EXPECT_STR_EQ("hello world", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("hello world", textfield_->text());
+  EXPECT_STR_EQ("hello world", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("h worlellod", textfield_->text());
+  EXPECT_STR_EQ("h worlellod", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("h worlellod", textfield_->text());
+  EXPECT_STR_EQ("h worlellod", textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, DragAndDrop_Canceled) {
@@ -1937,7 +1937,7 @@
   gfx::Point drag_point(GetCursorPositionX(9), cursor_y);
   DragMouseTo(drag_point);
   ReleaseLeftMouseButton();
-  EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->text());
+  EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, ReadOnlyTest) {
@@ -1971,14 +1971,14 @@
   SendKeyEvent(ui::VKEY_X, false, true);
   SendAlternateCut();
   EXPECT_STR_EQ("Test", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("read only", textfield_->text());
+  EXPECT_STR_EQ("read only", textfield_->GetText());
 
   // Paste should be disabled.
   EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE));
   textfield_->ExecuteCommand(IDS_APP_PASTE, 0);
   SendKeyEvent(ui::VKEY_V, false, true);
   SendAlternatePaste();
-  EXPECT_STR_EQ("read only", textfield_->text());
+  EXPECT_STR_EQ("read only", textfield_->GetText());
 
   // Copy should work normally.
   SetClipboardText(ui::ClipboardType::kCopyPaste, "Test");
@@ -1994,7 +1994,7 @@
 
   // SetText should work even in read only mode.
   textfield_->SetText(ASCIIToUTF16(" four five six "));
-  EXPECT_STR_EQ(" four five six ", textfield_->text());
+  EXPECT_STR_EQ(" four five six ", textfield_->GetText());
 
   textfield_->SelectAll(false);
   EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
@@ -2029,7 +2029,7 @@
   EXPECT_STR_EQ("123", substring);
 
   EXPECT_TRUE(client->DeleteRange(range));
-  EXPECT_STR_EQ("0456789", textfield_->text());
+  EXPECT_STR_EQ("0456789", textfield_->GetText());
 
   ui::CompositionText composition;
   composition.text = UTF8ToUTF16("321");
@@ -2045,7 +2045,7 @@
   EXPECT_FALSE(textfield_->key_handled());
   EXPECT_TRUE(client->HasCompositionText());
   EXPECT_TRUE(client->GetCompositionTextRange(&range));
-  EXPECT_STR_EQ("0321456789", textfield_->text());
+  EXPECT_STR_EQ("0321456789", textfield_->GetText());
   EXPECT_EQ(gfx::Range(1, 4), range);
   EXPECT_EQ(1, on_before_user_action_);
   EXPECT_EQ(1, on_after_user_action_);
@@ -2058,7 +2058,7 @@
   EXPECT_FALSE(textfield_->key_handled());
   EXPECT_FALSE(client->HasCompositionText());
   EXPECT_FALSE(input_method_->cancel_composition_called());
-  EXPECT_STR_EQ("0123456789", textfield_->text());
+  EXPECT_STR_EQ("0123456789", textfield_->GetText());
   EXPECT_EQ(1, on_before_user_action_);
   EXPECT_EQ(1, on_after_user_action_);
 
@@ -2067,7 +2067,7 @@
   textfield_->clear();
   DispatchMockInputMethodKeyEvent();
   EXPECT_TRUE(client->HasCompositionText());
-  EXPECT_STR_EQ("0123321456789", textfield_->text());
+  EXPECT_STR_EQ("0123321456789", textfield_->GetText());
 
   on_before_user_action_ = on_after_user_action_ = 0;
   textfield_->clear();
@@ -2076,7 +2076,7 @@
   EXPECT_TRUE(input_method_->cancel_composition_called());
   EXPECT_TRUE(textfield_->key_received());
   EXPECT_TRUE(textfield_->key_handled());
-  EXPECT_STR_EQ("0123321456789", textfield_->text());
+  EXPECT_STR_EQ("0123321456789", textfield_->GetText());
   EXPECT_EQ(8U, textfield_->GetCursorPosition());
   EXPECT_EQ(1, on_before_user_action_);
   EXPECT_EQ(1, on_after_user_action_);
@@ -2085,7 +2085,7 @@
   textfield_->SetText(ASCIIToUTF16("0123456789"));
   EXPECT_TRUE(client->SetEditableSelectionRange(gfx::Range(5, 5)));
   client->ExtendSelectionAndDelete(4, 2);
-  EXPECT_STR_EQ("0789", textfield_->text());
+  EXPECT_STR_EQ("0789", textfield_->GetText());
 
   // On{Before,After}UserAction should be called by whatever user action
   // triggers clearing or setting a selection if appropriate.
@@ -2120,95 +2120,95 @@
 TEST_F(TextfieldTest, UndoRedoTest) {
   InitTextfield();
   SendKeyEvent(ui::VKEY_A);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
 
   // AppendText
   textfield_->AppendText(ASCIIToUTF16("b"));
   last_contents_.clear();  // AppendText doesn't call ContentsChanged.
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
 
   // SetText
   SendKeyEvent(ui::VKEY_C);
   // Undo'ing append moves the cursor to the end for now.
   // A no-op SetText won't add a new edit; see TextfieldModel::SetText.
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   textfield_->SetText(ASCIIToUTF16("abc"));
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   textfield_->SetText(ASCIIToUTF16("123"));
   textfield_->SetText(ASCIIToUTF16("123"));
-  EXPECT_STR_EQ("123", textfield_->text());
+  EXPECT_STR_EQ("123", textfield_->GetText());
   SendKeyEvent(ui::VKEY_END, false, false);
   SendKeyEvent(ui::VKEY_4, false, false);
-  EXPECT_STR_EQ("1234", textfield_->text());
+  EXPECT_STR_EQ("1234", textfield_->GetText());
   last_contents_.clear();
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("123", textfield_->text());
+  EXPECT_STR_EQ("123", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
   // the insert edit "c" and set edit "123" are merged to single edit,
   // so text becomes "ab" after undo.
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("123", textfield_->text());
+  EXPECT_STR_EQ("123", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("1234", textfield_->text());
+  EXPECT_STR_EQ("1234", textfield_->GetText());
 
   // Undoing to the same text shouldn't call ContentsChanged.
   SendKeyEvent(ui::VKEY_A, false, true);  // select all
   SendKeyEvent(ui::VKEY_A);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_B);
   SendKeyEvent(ui::VKEY_C);
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("1234", textfield_->text());
+  EXPECT_STR_EQ("1234", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
 
   // Delete/Backspace
   SendKeyEvent(ui::VKEY_BACK);
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendHomeEvent(false);
   SendKeyEvent(ui::VKEY_DELETE);
-  EXPECT_STR_EQ("b", textfield_->text());
+  EXPECT_STR_EQ("b", textfield_->GetText());
   SendKeyEvent(ui::VKEY_A, false, true);
   SendKeyEvent(ui::VKEY_DELETE);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("b", textfield_->text());
+  EXPECT_STR_EQ("b", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("b", textfield_->text());
+  EXPECT_STR_EQ("b", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
 }
 
 // Most platforms support Ctrl+Y as an alternative to Ctrl+Shift+Z, but on Mac
@@ -2221,15 +2221,15 @@
 TEST_F(TextfieldTest, RedoWithCtrlY) {
   InitTextfield();
   SendKeyEvent(ui::VKEY_A);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Y, false, true);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, false, true);
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   SendKeyEvent(ui::VKEY_Z, true, true);
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
 }
 
 #endif  // !defined(OS_MACOSX)
@@ -2248,51 +2248,51 @@
 
   // Initially the kill buffer should be empty. Hence yanking should delete the
   // selected text.
-  EXPECT_STR_EQ("abef", textfield_->text());
+  EXPECT_STR_EQ("abef", textfield_->GetText());
   EXPECT_EQ(gfx::Range(2), textfield_->GetSelectedRange());
 
   // Press Ctrl+K to delete to end of paragraph. This should place the deleted
   // text in the kill buffer.
   SendKeyPress(ui::VKEY_K, ui::EF_CONTROL_DOWN);
 
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   EXPECT_EQ(gfx::Range(2), textfield_->GetSelectedRange());
 
   // Yank twice.
   SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
   SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
-  EXPECT_STR_EQ("abefef", textfield_->text());
+  EXPECT_STR_EQ("abefef", textfield_->GetText());
   EXPECT_EQ(gfx::Range(6), textfield_->GetSelectedRange());
 
   // Verify pressing backspace does not modify the kill buffer.
   SendKeyEvent(ui::VKEY_BACK);
   SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
-  EXPECT_STR_EQ("abefeef", textfield_->text());
+  EXPECT_STR_EQ("abefeef", textfield_->GetText());
   EXPECT_EQ(gfx::Range(7), textfield_->GetSelectedRange());
 
   // Move focus to next textfield.
   widget_->GetFocusManager()->AdvanceFocus(false);
   EXPECT_EQ(2, GetFocusedView()->GetID());
   Textfield* textfield2 = static_cast<Textfield*>(GetFocusedView());
-  EXPECT_TRUE(textfield2->text().empty());
+  EXPECT_TRUE(textfield2->GetText().empty());
 
   // Verify yanked text persists across multiple textfields and that yanking
   // into a password textfield works.
   textfield2->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
   SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
-  EXPECT_STR_EQ("ef", textfield2->text());
+  EXPECT_STR_EQ("ef", textfield2->GetText());
   EXPECT_EQ(gfx::Range(2), textfield2->GetSelectedRange());
 
   // Verify deletion in a password textfield does not modify the kill buffer.
   textfield2->SetText(ASCIIToUTF16("hello"));
   textfield2->SelectRange(gfx::Range(0));
   SendKeyPress(ui::VKEY_K, ui::EF_CONTROL_DOWN);
-  EXPECT_TRUE(textfield2->text().empty());
+  EXPECT_TRUE(textfield2->GetText().empty());
 
   textfield_->RequestFocus();
   textfield_->SelectRange(gfx::Range(0));
   SendKeyPress(ui::VKEY_Y, ui::EF_CONTROL_DOWN);
-  EXPECT_STR_EQ("efabefeef", textfield_->text());
+  EXPECT_STR_EQ("efabefeef", textfield_->GetText());
 }
 
 #endif  // defined(OS_MACOSX)
@@ -2305,7 +2305,7 @@
   EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_CUT));
   textfield_->ExecuteCommand(IDS_APP_CUT, 0);
   EXPECT_STR_EQ("123", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kCopyPaste, GetAndResetCopiedToClipboard());
 
   // Ensure [Ctrl]+[x] cuts and [Ctrl]+[Alt][x] does nothing.
@@ -2313,11 +2313,11 @@
   textfield_->SelectAll(false);
   SendKeyEvent(ui::VKEY_X, true, false, true, false);
   EXPECT_STR_EQ("123", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("456", textfield_->text());
+  EXPECT_STR_EQ("456", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kMaxValue, GetAndResetCopiedToClipboard());
   SendKeyEvent(ui::VKEY_X, false, true);
   EXPECT_STR_EQ("456", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kCopyPaste, GetAndResetCopiedToClipboard());
 
   // Ensure [Shift]+[Delete] cuts.
@@ -2325,7 +2325,7 @@
   textfield_->SelectAll(false);
   SendAlternateCut();
   EXPECT_STR_EQ("123", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("", textfield_->text());
+  EXPECT_STR_EQ("", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kCopyPaste, GetAndResetCopiedToClipboard());
 
   // Reset clipboard text.
@@ -2336,7 +2336,7 @@
   textfield_->SelectRange(gfx::Range(0));
   SendAlternateCut();
   EXPECT_STR_EQ("", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("123", textfield_->text());
+  EXPECT_STR_EQ("123", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kMaxValue, GetAndResetCopiedToClipboard());
 
   // Ensure IDS_APP_COPY copies.
@@ -2362,7 +2362,7 @@
   textfield_->SelectAll(false);
   SendAlternateCopy();
   EXPECT_STR_EQ("345", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("345", textfield_->text());
+  EXPECT_STR_EQ("345", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kCopyPaste, GetAndResetCopiedToClipboard());
 
   // Ensure IDS_APP_PASTE, [Ctrl]+[V], and [Shift]+[Insert] pastes;
@@ -2371,19 +2371,19 @@
   textfield_->SetText(base::string16());
   EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE));
   textfield_->ExecuteCommand(IDS_APP_PASTE, 0);
-  EXPECT_STR_EQ("abc", textfield_->text());
+  EXPECT_STR_EQ("abc", textfield_->GetText());
   SendKeyEvent(ui::VKEY_V, false, true);
-  EXPECT_STR_EQ("abcabc", textfield_->text());
+  EXPECT_STR_EQ("abcabc", textfield_->GetText());
   SendAlternatePaste();
-  EXPECT_STR_EQ("abcabcabc", textfield_->text());
+  EXPECT_STR_EQ("abcabcabc", textfield_->GetText());
   SendKeyEvent(ui::VKEY_V, true, false, true, false);
-  EXPECT_STR_EQ("abcabcabc", textfield_->text());
+  EXPECT_STR_EQ("abcabcabc", textfield_->GetText());
 
   // Ensure [Ctrl]+[Shift]+[Insert] is a no-op.
   textfield_->SelectAll(false);
   SendKeyEvent(ui::VKEY_INSERT, true, true);
   EXPECT_STR_EQ("abc", GetClipboardText(ui::ClipboardType::kCopyPaste));
-  EXPECT_STR_EQ("abcabcabc", textfield_->text());
+  EXPECT_STR_EQ("abcabcabc", textfield_->GetText());
   EXPECT_EQ(ui::ClipboardType::kMaxValue, GetAndResetCopiedToClipboard());
 }
 
@@ -2400,14 +2400,14 @@
   SendKeyEvent(ui::VKEY_A, false, true);       // Select it.
   SendKeyEvent(ui::VKEY_C, false, true);       // Copy it.
   SendKeyEvent(ui::VKEY_RIGHT, false, false);  // Deselect and navigate to end.
-  EXPECT_STR_EQ("o", textfield_->text());
+  EXPECT_STR_EQ("o", textfield_->GetText());
   SendKeyEvent(ui::VKEY_V, false, true);  // Paste it.
-  EXPECT_STR_EQ("oo", textfield_->text());
+  EXPECT_STR_EQ("oo", textfield_->GetText());
   SendKeyEvent(ui::VKEY_H, false, false);  // Type "h".
-  EXPECT_STR_EQ("ooh", textfield_->text());
+  EXPECT_STR_EQ("ooh", textfield_->GetText());
   SendKeyEvent(ui::VKEY_LEFT, true, false);  // Select "h".
   SendKeyEvent(ui::VKEY_X, false, true);     // Cut it.
-  EXPECT_STR_EQ("oo", textfield_->text());
+  EXPECT_STR_EQ("oo", textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, OvertypeMode) {
@@ -2421,30 +2421,30 @@
   // However, there's no enable-overtype equivalent key combination on OSX.
   SendKeyEvent(ui::VKEY_INSERT);
   SendKeyEvent(ui::VKEY_1, false, false);
-  EXPECT_STR_EQ("12", textfield_->text());
+  EXPECT_STR_EQ("12", textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, TextCursorDisplayTest) {
   InitTextfield();
   // LTR-RTL string in LTR context.
   SendKeyEvent('a');
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   int x = GetCursorBounds().x();
   int prev_x = x;
 
   SendKeyEvent('b');
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_LT(prev_x, x);
   prev_x = x;
 
   SendKeyEvent(0x05E1);
-  EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GE(1, std::abs(x - prev_x));
 
   SendKeyEvent(0x05E2);
-  EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GE(1, std::abs(x - prev_x));
 
@@ -2454,24 +2454,28 @@
 
   // RTL-LTR string in LTR context.
   SendKeyEvent(0x05E1);
-  EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_EQ(GetDisplayRect().x(), x);
   prev_x = x;
 
   SendKeyEvent(0x05E2);
-  EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GE(1, std::abs(x - prev_x));
 
   SendKeyEvent('a');
-  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"a"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2"
+                        L"a"),
+            textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_LT(prev_x, x);
   prev_x = x;
 
   SendKeyEvent('b');
-  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"ab"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2"
+                        L"ab"),
+            textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_LT(prev_x, x);
 }
@@ -2483,24 +2487,24 @@
   InitTextfield();
   // LTR-RTL string in RTL context.
   SendKeyEvent('a');
-  EXPECT_STR_EQ("a", textfield_->text());
+  EXPECT_STR_EQ("a", textfield_->GetText());
   int x = GetCursorBounds().x();
   EXPECT_EQ(GetDisplayRect().right() - 1, x);
   int prev_x = x;
 
   SendKeyEvent('b');
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GE(1, std::abs(x - prev_x));
 
   SendKeyEvent(0x05E1);
-  EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GT(prev_x, x);
   prev_x = x;
 
   SendKeyEvent(0x05E2);
-  EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GT(prev_x, x);
 
@@ -2510,24 +2514,28 @@
 
   // RTL-LTR string in RTL context.
   SendKeyEvent(0x05E1);
-  EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->GetText());
   x = GetCursorBounds().x();
   prev_x = x;
 
   SendKeyEvent(0x05E2);
-  EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GT(prev_x, x);
   prev_x = x;
 
   SendKeyEvent('a');
-  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"a"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2"
+                        L"a"),
+            textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GE(1, std::abs(x - prev_x));
   prev_x = x;
 
   SendKeyEvent('b');
-  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"ab"), textfield_->text());
+  EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2"
+                        L"ab"),
+            textfield_->GetText());
   x = GetCursorBounds().x();
   EXPECT_GE(1, std::abs(x - prev_x));
 
@@ -2544,7 +2552,7 @@
   int text_cursor_position_prev = test_api_->GetCursorViewRect().x();
   SendKeyEvent('a');
   SendKeyEvent('b');
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   int text_cursor_position_new = test_api_->GetCursorViewRect().x();
   // Text cursor stays at same place after inserting new charactors in RTL mode.
   EXPECT_EQ(text_cursor_position_prev, text_cursor_position_new);
@@ -2560,7 +2568,7 @@
   int text_cursor_position_prev = test_api_->GetCursorViewRect().x();
   SendKeyEvent('a');
   SendKeyEvent('b');
-  EXPECT_STR_EQ("ab", textfield_->text());
+  EXPECT_STR_EQ("ab", textfield_->GetText());
   int text_cursor_position_new = test_api_->GetCursorViewRect().x();
   // Text cursor moves to right after inserting new charactors in LTR mode.
   EXPECT_LT(text_cursor_position_prev, text_cursor_position_new);
@@ -2912,7 +2920,7 @@
                         ui::EventTimeForNow(), ui::EF_MIDDLE_MOUSE_BUTTON,
                         ui::EF_MIDDLE_MOUSE_BUTTON);
   textfield_->OnMousePressed(middle);
-  EXPECT_STR_EQ("01230123", textfield_->text());
+  EXPECT_STR_EQ("01230123", textfield_->GetText());
   EXPECT_EQ(gfx::Range(8, 8), textfield_->GetSelectedRange());
   EXPECT_STR_EQ("0123", GetClipboardText(ui::ClipboardType::kSelection));
 
@@ -2921,7 +2929,7 @@
   EXPECT_FALSE(textfield_->HasFocus());
   textfield_->OnMousePressed(middle);
   EXPECT_TRUE(textfield_->HasFocus());
-  EXPECT_STR_EQ("012301230123", textfield_->text());
+  EXPECT_STR_EQ("012301230123", textfield_->GetText());
   EXPECT_EQ(gfx::Range(8, 8), textfield_->GetSelectedRange());
   EXPECT_STR_EQ("0123", GetClipboardText(ui::ClipboardType::kSelection));
 
@@ -2931,7 +2939,7 @@
   EXPECT_FALSE(textfield_->HasFocus());
   textfield_->OnMousePressed(middle);
   EXPECT_TRUE(textfield_->HasFocus());
-  EXPECT_STR_EQ("012301230123", textfield_->text());
+  EXPECT_STR_EQ("012301230123", textfield_->GetText());
   EXPECT_EQ(gfx::Range(4, 4), textfield_->GetSelectedRange());
   EXPECT_TRUE(GetClipboardText(ui::ClipboardType::kSelection).empty());
 
@@ -2941,7 +2949,7 @@
   SetClipboardText(ui::ClipboardType::kCopyPaste, "foo");
   textfield_->SelectRange(gfx::Range(2, 6));
   textfield_->OnMousePressed(middle);
-  EXPECT_STR_EQ("0123foo01230123", textfield_->text());
+  EXPECT_STR_EQ("0123foo01230123", textfield_->GetText());
   EXPECT_EQ(gfx::Range(7, 7), textfield_->GetSelectedRange());
   EXPECT_STR_EQ("foo", GetClipboardText(ui::ClipboardType::kSelection));
 
@@ -3406,14 +3414,14 @@
   EXPECT_EQ(focuser, GetFocusedView());
   SendKeyPress(ui::VKEY_SPACE, 0);
   EXPECT_EQ(textfield_, GetFocusedView());
-  EXPECT_EQ(base::string16(), textfield_->text());
+  EXPECT_EQ(base::string16(), textfield_->GetText());
 
   focuser->set_consume(false);
   focuser->RequestFocus();
   EXPECT_EQ(focuser, GetFocusedView());
   SendKeyPress(ui::VKEY_SPACE, 0);
   EXPECT_EQ(textfield_, GetFocusedView());
-  EXPECT_EQ(base::ASCIIToUTF16(" "), textfield_->text());
+  EXPECT_EQ(base::ASCIIToUTF16(" "), textfield_->GetText());
 }
 
 TEST_F(TextfieldTest, FocusChangesScrollToStart) {
diff --git a/ui/views/controls/tree/tree_view.cc b/ui/views/controls/tree/tree_view.cc
index 7cc025f..aa9d827 100644
--- a/ui/views/controls/tree/tree_view.cc
+++ b/ui/views/controls/tree/tree_view.cc
@@ -227,7 +227,7 @@
 
   DCHECK(selected_node_);
   const bool editor_has_focus = editor_->HasFocus();
-  model_->SetTitle(GetSelectedNode(), editor_->text());
+  model_->SetTitle(GetSelectedNode(), editor_->GetText());
   CancelEdit();
   if (editor_has_focus)
     RequestFocus();
diff --git a/ui/views/controls/views_text_services_context_menu_base.cc b/ui/views/controls/views_text_services_context_menu_base.cc
index dc69290c..b1f7b1d 100644
--- a/ui/views/controls/views_text_services_context_menu_base.cc
+++ b/ui/views/controls/views_text_services_context_menu_base.cc
@@ -32,7 +32,7 @@
   DCHECK(client);
   DCHECK(menu);
   // Not inserted on read-only fields or if the OS/version doesn't support it.
-  if (!client_->read_only() && ui::IsEmojiPanelSupported()) {
+  if (!client_->GetReadOnly() && ui::IsEmojiPanelSupported()) {
     menu->InsertSeparatorAt(0, ui::NORMAL_SEPARATOR);
     menu->InsertItemWithStringIdAt(0, IDS_CONTENT_CONTEXT_EMOJI,
                                    IDS_CONTENT_CONTEXT_EMOJI);
diff --git a/ui/views/examples/animated_image_view_example.cc b/ui/views/examples/animated_image_view_example.cc
index dc26fde..fc81ae4 100644
--- a/ui/views/examples/animated_image_view_example.cc
+++ b/ui/views/examples/animated_image_view_example.cc
@@ -89,9 +89,9 @@
     std::string json;
     base::ScopedAllowBlockingForTesting allow_blocking;
 #if defined(OS_POSIX)
-    base::FilePath path(base::UTF16ToUTF8(file_chooser_->text()));
+    base::FilePath path(base::UTF16ToUTF8(file_chooser_->GetText()));
 #else
-    base::FilePath path(file_chooser_->text());
+    base::FilePath path(file_chooser_->GetText());
 #endif  // defined(OS_POSIX)
     base::ReadFileToString(path, &json);
 
diff --git a/ui/views/examples/box_layout_example.cc b/ui/views/examples/box_layout_example.cc
index 9895f78..40fac8e 100644
--- a/ui/views/examples/box_layout_example.cc
+++ b/ui/views/examples/box_layout_example.cc
@@ -87,11 +87,11 @@
     UpdateLayoutManager();
   } else if (textfield == default_flex_) {
     int default_flex;
-    base::StringToInt(default_flex_->text(), &default_flex);
+    base::StringToInt(default_flex_->GetText(), &default_flex);
     layout_->SetDefaultFlex(default_flex);
   } else if (textfield == min_cross_axis_size_) {
     int min_cross_size;
-    base::StringToInt(min_cross_axis_size_->text(), &min_cross_size);
+    base::StringToInt(min_cross_axis_size_->GetText(), &min_cross_size);
     layout_->set_minimum_cross_axis_size(min_cross_size);
   } else if (textfield == border_insets_[0] || textfield == border_insets_[1] ||
              textfield == border_insets_[2] || textfield == border_insets_[3]) {
@@ -108,9 +108,9 @@
   int child_spacing;
   int default_flex;
   int min_cross_size;
-  base::StringToInt(between_child_spacing_->text(), &child_spacing);
-  base::StringToInt(default_flex_->text(), &default_flex);
-  base::StringToInt(min_cross_axis_size_->text(), &min_cross_size);
+  base::StringToInt(between_child_spacing_->GetText(), &child_spacing);
+  base::StringToInt(default_flex_->GetText(), &default_flex);
+  base::StringToInt(min_cross_axis_size_->GetText(), &min_cross_size);
   auto layout = std::make_unique<BoxLayout>(
       orientation_->GetSelectedIndex() == 0
           ? BoxLayout::Orientation::kHorizontal
diff --git a/ui/views/examples/dialog_example.cc b/ui/views/examples/dialog_example.cc
index 21e9ab7..7f323948 100644
--- a/ui/views/examples/dialog_example.cc
+++ b/ui/views/examples/dialog_example.cc
@@ -39,7 +39,7 @@
 
   void InitDelegate() {
     this->SetLayoutManager(std::make_unique<FillLayout>());
-    Label* body = new Label(parent_->body_->text());
+    Label* body = new Label(parent_->body_->GetText());
     body->SetMultiLine(true);
     body->SetHorizontalAlignment(gfx::ALIGN_LEFT);
     body->SetBackground(CreateSolidBackground(SkColorSetRGB(0, 255, 255)));
@@ -56,14 +56,14 @@
   }
 
   base::string16 GetWindowTitle() const override {
-    return parent_->title_->text();
+    return parent_->title_->GetText();
   }
 
   std::unique_ptr<View> CreateExtraView() override {
     if (!parent_->has_extra_button_->GetChecked())
       return nullptr;
     auto view = MdTextButton::CreateSecondaryUiButton(
-        nullptr, parent_->extra_button_label_->text());
+        nullptr, parent_->extra_button_label_->GetText());
     return view;
   }
 
@@ -72,9 +72,9 @@
   int GetDialogButtons() const override { return parent_->GetDialogButtons(); }
   base::string16 GetDialogButtonLabel(ui::DialogButton button) const override {
     if (button == ui::DIALOG_BUTTON_OK)
-      return parent_->ok_button_label_->text();
+      return parent_->ok_button_label_->GetText();
     if (button == ui::DIALOG_BUTTON_CANCEL)
-      return parent_->cancel_button_label_->text();
+      return parent_->cancel_button_label_->GetText();
     return base::string16();
   }
 
diff --git a/ui/views/examples/label_example.cc b/ui/views/examples/label_example.cc
index c8d8ceb..8bd89d37 100644
--- a/ui/views/examples/label_example.cc
+++ b/ui/views/examples/label_example.cc
@@ -207,7 +207,7 @@
   auto custom_label = std::make_unique<ExamplePreferredSizeLabel>();
   custom_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   custom_label->SetElideBehavior(gfx::NO_ELIDE);
-  custom_label->SetText(textfield_->text());
+  custom_label->SetText(textfield_->GetText());
   custom_label_ = layout->AddView(std::move(custom_label));
 
   // Disable the text selection checkbox if |custom_label_| does not support
diff --git a/ui/views/examples/layout_example_base.cc b/ui/views/examples/layout_example_base.cc
index fe07c1dd..2655e19 100644
--- a/ui/views/examples/layout_example_base.cc
+++ b/ui/views/examples/layout_example_base.cc
@@ -135,7 +135,7 @@
 
 int LayoutExampleBase::ChildPanel::GetFlex() {
   int flex;
-  if (base::StringToInt(flex_->text(), &flex))
+  if (base::StringToInt(flex_->GetText(), &flex))
     return flex;
   return -1;
 }
@@ -317,9 +317,9 @@
                                               const gfx::Size& default_size) {
   int width;
   int height;
-  if (!base::StringToInt(textfields[0]->text(), &width))
+  if (!base::StringToInt(textfields[0]->GetText(), &width))
     width = default_size.width();
-  if (!base::StringToInt(textfields[1]->text(), &height))
+  if (!base::StringToInt(textfields[1]->GetText(), &height))
     height = default_size.height();
   return gfx::Size(std::max(0, width), std::max(0, height));
 }
@@ -331,13 +331,13 @@
   int left;
   int bottom;
   int right;
-  if (!base::StringToInt(textfields[0]->text(), &top))
+  if (!base::StringToInt(textfields[0]->GetText(), &top))
     top = default_insets.top();
-  if (!base::StringToInt(textfields[1]->text(), &left))
+  if (!base::StringToInt(textfields[1]->GetText(), &left))
     left = default_insets.left();
-  if (!base::StringToInt(textfields[2]->text(), &bottom))
+  if (!base::StringToInt(textfields[2]->GetText(), &bottom))
     bottom = default_insets.bottom();
-  if (!base::StringToInt(textfields[3]->text(), &right))
+  if (!base::StringToInt(textfields[3]->GetText(), &right))
     right = default_insets.right();
 
   return gfx::Insets(std::max(0, top), std::max(0, left), std::max(0, bottom),
diff --git a/ui/views/examples/multiline_example.cc b/ui/views/examples/multiline_example.cc
index 9a48182..cc02e7f9 100644
--- a/ui/views/examples/multiline_example.cc
+++ b/ui/views/examples/multiline_example.cc
@@ -188,7 +188,7 @@
 
 void MultilineExample::ButtonPressed(Button* sender, const ui::Event& event) {
   if (sender == label_checkbox_) {
-    label_->SetText(label_checkbox_->GetChecked() ? textfield_->text()
+    label_->SetText(label_checkbox_->GetChecked() ? textfield_->GetText()
                                                   : base::string16());
   } else if (sender == elision_checkbox_) {
     render_text_view_->SetMaxLines(elision_checkbox_->GetChecked() ? 3 : 0);
diff --git a/ui/views/examples/textfield_example.cc b/ui/views/examples/textfield_example.cc
index 6c217df..e1ab1cb 100644
--- a/ui/views/examples/textfield_example.cc
+++ b/ui/views/examples/textfield_example.cc
@@ -130,7 +130,7 @@
 
 void TextfieldExample::ButtonPressed(Button* sender, const ui::Event& event) {
   if (sender == show_password_) {
-    PrintStatus("Password [%s]", UTF16ToUTF8(password_->text()).c_str());
+    PrintStatus("Password [%s]", UTF16ToUTF8(password_->GetText()).c_str());
   } else if (sender == set_background_) {
     password_->SetBackgroundColor(gfx::kGoogleRed300);
   } else if (sender == clear_all_) {
@@ -156,11 +156,11 @@
     invalid_->SetText(ASCIIToUTF16("[set]"));
     rtl_->SetText(ASCIIToUTF16("[set]"));
   } else if (sender == set_style_) {
-    if (!name_->text().empty()) {
+    if (!name_->GetText().empty()) {
       name_->SetColor(SK_ColorGREEN);
 
-      if (name_->text().length() >= 5) {
-        size_t fifth = name_->text().length() / 5;
+      if (name_->GetText().length() >= 5) {
+        size_t fifth = name_->GetText().length() / 5;
         const gfx::Range big_range(1 * fifth, 4 * fifth);
         name_->ApplyStyle(gfx::TEXT_STYLE_UNDERLINE, true, big_range);
         name_->ApplyColor(SK_ColorBLUE, big_range);
diff --git a/ui/views/examples/vector_example.cc b/ui/views/examples/vector_example.cc
index f631b382..ec77c79f 100644
--- a/ui/views/examples/vector_example.cc
+++ b/ui/views/examples/vector_example.cc
@@ -102,9 +102,9 @@
     DCHECK_EQ(file_go_button_, sender);
     base::ScopedAllowBlockingForTesting allow_blocking;
 #if defined(OS_POSIX)
-    base::FilePath path(base::UTF16ToUTF8(file_chooser_->text()));
+    base::FilePath path(base::UTF16ToUTF8(file_chooser_->GetText()));
 #elif defined(OS_WIN)
-    base::FilePath path(file_chooser_->text());
+    base::FilePath path(file_chooser_->GetText());
 #endif
     base::ReadFileToString(path, &contents_);
     // Skip over comments.
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index 93549b36..28637ad1 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -1945,17 +1945,17 @@
 
   // Test setting, appending text.
   textfield->SetText(kText);
-  EXPECT_EQ(kText, textfield->text());
+  EXPECT_EQ(kText, textfield->GetText());
   textfield->AppendText(kExtraText);
-  EXPECT_EQ(kText + kExtraText, textfield->text());
+  EXPECT_EQ(kText + kExtraText, textfield->GetText());
   textfield->SetText(base::string16());
-  EXPECT_TRUE(textfield->text().empty());
+  EXPECT_TRUE(textfield->GetText().empty());
 
   // Test selection related methods.
   textfield->SetText(kText);
   EXPECT_TRUE(textfield->GetSelectedText().empty());
   textfield->SelectAll(false);
-  EXPECT_EQ(kText, textfield->text());
+  EXPECT_EQ(kText, textfield->GetText());
   textfield->ClearSelection();
   EXPECT_TRUE(textfield->GetSelectedText().empty());
 
@@ -2047,18 +2047,18 @@
   // Attempting to paste kNormalText in a read-only text-field should fail.
   read_only->SelectAll(false);
   read_only->ExecuteCommand(IDS_APP_PASTE, 0);
-  EXPECT_EQ(kReadOnlyText, read_only->text());
+  EXPECT_EQ(kReadOnlyText, read_only->GetText());
 
   password->SelectAll(false);
   password->ExecuteCommand(IDS_APP_PASTE, 0);
-  EXPECT_EQ(kNormalText, password->text());
+  EXPECT_EQ(kNormalText, password->GetText());
 
   // Copy from |read_only| to observe a change in the normal textfield text.
   read_only->SelectAll(false);
   read_only->ExecuteCommand(IDS_APP_COPY, 0);
   normal->SelectAll(false);
   normal->ExecuteCommand(IDS_APP_PASTE, 0);
-  EXPECT_EQ(kReadOnlyText, normal->text());
+  EXPECT_EQ(kReadOnlyText, normal->GetText());
   widget->CloseNow();
 }
 
diff --git a/ui/views/widget/ax_native_widget_mac_unittest.mm b/ui/views/widget/ax_native_widget_mac_unittest.mm
index 7a11717f..33e9012 100644
--- a/ui/views/widget/ax_native_widget_mac_unittest.mm
+++ b/ui/views/widget/ax_native_widget_mac_unittest.mm
@@ -517,7 +517,8 @@
       AXObjectHandlesSelector(ax_node, @selector(setAccessibilityValue:)));
   ax_node.accessibilityValue = kTestPlaceholderText;
   EXPECT_NSEQ(kTestPlaceholderText, ax_node.accessibilityValue);
-  EXPECT_EQ(base::SysNSStringToUTF16(kTestPlaceholderText), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(kTestPlaceholderText),
+            textfield->GetText());
 
   // Test a read-only textfield.
   textfield->SetReadOnly(true);
@@ -525,7 +526,8 @@
       isAccessibilitySelectorAllowed:@selector(setAccessibilityValue:)]);
   ax_node.accessibilityValue = kTestStringValue;
   EXPECT_NSEQ(kTestPlaceholderText, ax_node.accessibilityValue);
-  EXPECT_EQ(base::SysNSStringToUTF16(kTestPlaceholderText), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(kTestPlaceholderText),
+            textfield->GetText());
   textfield->SetReadOnly(false);
 
   // Change the selection text when there is no selected text.
@@ -537,14 +539,14 @@
       [kTestStringValue stringByAppendingString:kTestPlaceholderText];
   ax_node.accessibilitySelectedText = kTestStringValue;
   EXPECT_NSEQ(new_string, ax_node.accessibilityValue);
-  EXPECT_EQ(base::SysNSStringToUTF16(new_string), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(new_string), textfield->GetText());
 
   // Replace entire selection.
   gfx::Range test_range(0, [new_string length]);
   textfield->SelectRange(test_range);
   ax_node.accessibilitySelectedText = kTestStringValue;
   EXPECT_NSEQ(kTestStringValue, ax_node.accessibilityValue);
-  EXPECT_EQ(base::SysNSStringToUTF16(kTestStringValue), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(kTestStringValue), textfield->GetText());
   // Make sure the cursor is at the end of the Textfield.
   EXPECT_EQ(gfx::Range([kTestStringValue length]),
             textfield->GetSelectedRange());
@@ -560,7 +562,7 @@
   textfield->SelectRange(test_range);
   ax_node.accessibilitySelectedText = base::SysUTF16ToNSString(replacement);
   EXPECT_NSEQ(new_string, ax_node.accessibilityValue);
-  EXPECT_EQ(base::SysNSStringToUTF16(new_string), textfield->text());
+  EXPECT_EQ(base::SysNSStringToUTF16(new_string), textfield->GetText());
   // Make sure the cursor is at the end of the replacement.
   EXPECT_EQ(gfx::Range(front.length() + replacement.length()),
             textfield->GetSelectedRange());
@@ -589,7 +591,7 @@
   EXPECT_EQ(gfx::Range(2, 7), textfield->GetSelectedRange());
   // If the length is longer than the value length, default to the max possible.
   ax_node.accessibilitySelectedTextRange = NSMakeRange(0, 1000);
-  EXPECT_EQ(gfx::Range(0, textfield->text().length()),
+  EXPECT_EQ(gfx::Range(0, textfield->GetText().length()),
             textfield->GetSelectedRange());
   // Check just moving the cursor works, too.
   ax_node.accessibilitySelectedTextRange = NSMakeRange(5, 0);
@@ -703,7 +705,7 @@
 
   textfield->SelectRange(gfx::Range(2, 3));  // Selects "3".
   ax_node.accessibilitySelectedText = @"ab";
-  EXPECT_EQ(base::ASCIIToUTF16("12ab"), textfield->text());
+  EXPECT_EQ(base::ASCIIToUTF16("12ab"), textfield->GetText());
   EXPECT_NSEQ(@"••••", ax_node.accessibilityValue);
   EXPECT_EQ(4, ax_node.accessibilityNumberOfCharacters);
 }
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
index c8021f1..50340a0 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_platform.cc
@@ -52,6 +52,15 @@
   properties.bounds = params.bounds;
   properties.activatable =
       params.activatable == Widget::InitParams::ACTIVATABLE_YES;
+  properties.force_show_in_taskbar = params.force_show_in_taskbar;
+  properties.keep_on_top =
+      params.EffectiveZOrderLevel() != ui::ZOrderLevel::kNormal;
+  properties.visible_on_all_workspaces = params.visible_on_all_workspaces;
+  properties.remove_standard_frame = params.remove_standard_frame;
+  properties.workspace = params.workspace;
+  properties.wm_class_name = params.wm_class_name;
+  properties.wm_class_class = params.wm_class_class;
+  properties.wm_role_name = params.wm_role_name;
 
   if (params.parent && params.parent->GetHost())
     properties.parent_widget = params.parent->GetHost()->GetAcceleratedWidget();
diff --git a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
index 2c5459e..f47d2d7 100644
--- a/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
+++ b/ui/webui/resources/cr_elements/cr_toolbar/cr_toolbar.js
@@ -87,12 +87,13 @@
   possiblyShowMenuPromo_: function() {
     Polymer.RenderStatus.afterNextRender(this, function() {
       if (this.showMenu && this.showMenuPromo && !this.showingSearch_) {
+        // The call to animate can have 2 methods of passing the keyframes,
+        // however as of the current closure version, only one of them is
+        // supported. See https://crbug.com/987842 for more info.
         this.$$('#menuPromo')
             .animate(
-                {
-                  opacity: [0, .9],
-                },
-                /** @type {!KeyframeEffectOptions} */ ({
+                [{opacity: 0}, {opacity: 0.9}],
+                /** @type {!KeyframeAnimationOptions} */ ({
                   duration: 500,
                   fill: 'forwards'
                 }));
diff --git a/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.js b/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.js
index b3a5d49..9387ff74 100644
--- a/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.js
+++ b/ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager.js
@@ -20,11 +20,12 @@
 const viewAnimations = new Map();
 viewAnimations.set('no-animation', () => Promise.resolve());
 viewAnimations.set('fade-in', element => {
+  // The call to animate can have 2 methods of passing the keyframes, however as
+  // of the current closure version, only one of them is supported. See
+  // https://crbug.com/987842 for more info.
   const animation = element.animate(
-      {
-        opacity: [0, 1],
-      },
-      /** @type {!KeyframeEffectOptions} */ ({
+      [{opacity: 0}, {opacity: 1}],
+      /** @type {!KeyframeAnimationOptions } */ ({
         duration: 180,
         easing: 'ease-in-out',
         iterations: 1,
@@ -33,11 +34,12 @@
   return whenFinished(animation);
 });
 viewAnimations.set('fade-out', element => {
+  // The call to animate can have 2 methods of passing the keyframes, however as
+  // of the current closure version, only one of them is supported. See
+  // https://crbug.com/987842 for more info.
   const animation = element.animate(
-      {
-        opacity: [1, 0],
-      },
-      /** @type {!KeyframeEffectOptions} */ ({
+      [{opacity: 0}, {opacity: 1}],
+      /** @type {!KeyframeAnimationOptions} */ ({
         duration: 180,
         easing: 'ease-in-out',
         iterations: 1,
@@ -112,4 +114,4 @@
     return Promise.all(promises);
   },
 });
-})();
\ No newline at end of file
+})();