diff --git a/DEPS b/DEPS
index 949d969..12d0f45b 100644
--- a/DEPS
+++ b/DEPS
@@ -301,7 +301,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '6df88fdf3ec07c2ccf348bb57f5c5d0b5c340586',
+  'v8_revision': 'd30d5b9e5aa2493033e718d9d35c0b2d3125bb7c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -324,7 +324,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:9.20220801.1.1',
+  'fuchsia_version': 'version:9.20220801.2.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -368,7 +368,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '682d9b1d88952c73fc4a9056e5ba1ea8892d642a',
+  'catapult_revision': '81c03c3de984993f8e62d477b337527705102f64',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -376,7 +376,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '513bcd34bff66e3260339c1f818373eab79762f1',
+  'devtools_frontend_revision': '185fb1f8d476cdfbf07d2a3c07e07c5ee6fb21dc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -412,11 +412,11 @@
   # 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': '86329e286b23a23d284d213e904869fbfc8a53c1',
+  'dawn_revision': '27a70c4d0af5ef849b3952445d2d43442aa56d7d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': 'dcc80b3a0bbb02ae6fdc3f7c749357d8f74df4d3',
+  'quiche_revision': 'fe9c73029c244bf1085be44f7a054bf0fd387347',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -773,7 +773,7 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'a69adf6a0a483e5f89f45d0babb319b3f2ea5c4b',
+    'url': Var('chromium_git') + '/website.git' + '@' + '84f1d0ad752311606ac02d635da82e087e5d0a0f',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1078,7 +1078,7 @@
     Var('dawn_git') + '/dawn.git' + '@' +  Var('dawn_revision'),
 
   'src/third_party/libjxl/src':
-    Var('chromium_git') + '/external/gitlab.com/wg1/jpeg-xl.git' + '@' + Var('libjxl_revision'),
+    Var('chromium_git') + '/external/github.com/libjxl/libjxl.git' + '@' + Var('libjxl_revision'),
 
   'src/third_party/highway/src':
     Var('chromium_git') + '/external/github.com/google/highway.git' + '@' + Var('highway_revision'),
@@ -1732,7 +1732,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '94fd83896c67bb1a995337c501bbed02bd63361f',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '0832e3260da80a05db265bb83fd0d0715561bf13',
+    Var('webrtc_git') + '/src.git' + '@' + 'bf607e25649494536867eb79721dc70661422bb8',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
diff --git a/android_webview/java/src/org/chromium/android_webview/common/services/ServiceHelper.java b/android_webview/java/src/org/chromium/android_webview/common/services/ServiceHelper.java
index 1367a7f..99f66af 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/services/ServiceHelper.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/services/ServiceHelper.java
@@ -25,9 +25,15 @@
     public static boolean bindService(
             Context context, Intent intent, ServiceConnection serviceConnection, int flags) {
         try {
-            return context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+            boolean serviceBindingSuccess =
+                    context.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+            if (!serviceBindingSuccess) {
+                context.unbindService(serviceConnection);
+            }
+            return serviceBindingSuccess;
         } catch (ReceiverCallNotAllowedException e) {
             // If we're running in a BroadcastReceiver Context then we cannot bind to Services.
+            context.unbindService(serviceConnection);
             return false;
         }
     }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
index 6718bc83..b986237 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/PostMessageTest.java
@@ -38,6 +38,8 @@
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.util.TestWebServer;
 
+import java.io.UnsupportedEncodingException;
+import java.util.Random;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
@@ -99,6 +101,10 @@
             public String getStringValue() {
                 return mMessagePayload.getAsString();
             }
+
+            public byte[] getArrayBuffer() {
+                return mMessagePayload.getAsArrayBuffer();
+            }
         }
 
         public void set(MessagePort[] channel) {
@@ -182,6 +188,19 @@
             + "        }"
             + "   </script>"
             + "</body></html>";
+    // Concats all the data fields of the received messages and makes it
+    // available as page title.
+    private static final String TITLE_FROM_POSTMESSAGE_TO_FRAME_ARRAYBUFFER =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        var received = '';"
+            + "        onmessage = function (e) {"
+            + "            const view = new Int8Array(e.data);"
+            + "            received += String.fromCharCode.apply(null, view);"
+            + "            document.title = received;"
+            + "        }"
+            + "   </script>"
+            + "</body></html>";
 
     // Concats all the data fields of the received messages to the transferred channel
     // and makes it available as page title.
@@ -198,6 +217,20 @@
             + "        }"
             + "   </script>"
             + "</body></html>";
+    // Concats all the data fields of the received messages to the transferred channel
+    // and makes it available as page title.
+    private static final String TITLE_FROM_POSTMESSAGE_TO_CHANNEL_ARRAYBUFFER =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        onmessage = function (e) {"
+            + "            var myport = e.ports[0];"
+            + "            myport.onmessage = function (f) {"
+            + "                const view = new Int8Array(f.data);"
+            + "                document.title = String.fromCharCode.apply(null, view);"
+            + "            }"
+            + "        }"
+            + "   </script>"
+            + "</body></html>";
 
     // Call on non-UI thread.
     private void expectTitle(String title) {
@@ -249,6 +282,42 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testPostArrayBuffer() throws Throwable {
+        loadPage(TITLE_FROM_POSTMESSAGE_TO_FRAME_ARRAYBUFFER);
+        final String testString = "TestString";
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            try {
+                mAwContents.postMessageToMainFrame(new MessagePayload(testString.getBytes("UTF-8")),
+                        mWebServer.getBaseUrl(), null);
+            } catch (UnsupportedEncodingException e) {
+                Assert.fail();
+            }
+        });
+        expectTitle(testString);
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testPostArrayBufferOnMessagePort() throws Throwable {
+        loadPage(TITLE_FROM_POSTMESSAGE_TO_CHANNEL_ARRAYBUFFER);
+        final String testString = "TestString";
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            MessagePort[] channel = mAwContents.createMessageChannel();
+            mAwContents.postMessageToMainFrame(new MessagePayload("1"), mWebServer.getBaseUrl(),
+                    new MessagePort[] {channel[1]});
+            try {
+                channel[0].postMessage(new MessagePayload(testString.getBytes("UTF-8")), null);
+            } catch (UnsupportedEncodingException e) {
+            }
+            channel[0].close();
+        });
+        expectTitle(testString);
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
     public void testTransferringSamePortTwiceViaPostMessageToMainFrameNotAllowed()
             throws Throwable {
         loadPage(TEST_PAGE);
@@ -548,6 +617,25 @@
             + "        }"
             + "   </script>"
             + "</body></html>";
+    private static final String ECHO_ARRAY_BUFFER_PAGE = "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.onmessage = function(e) {"
+            + "                myPort.postMessage(e.data, [e.data]); }"
+            + "        }"
+            + "   </script>"
+            + "</body></html>";
+    private static final String ECHO_NON_TRANFERABLE_ARRAY_BUFFER_PAGE =
+            "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.onmessage = function(e) {"
+            + "                myPort.postMessage(e.data, [e.data]); }"
+            + "        }"
+            + "   </script>"
+            + "</body></html>";
 
     private static final String HELLO = "HELLO";
 
@@ -619,6 +707,60 @@
         Assert.assertEquals(HELLO, data.getStringValue());
     }
 
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testMessageChannelSendAndReceiveArrayBuffer() throws Throwable {
+        final byte[] bytes = HELLO.getBytes("UTF-8");
+        verifyEchoArrayBuffer(ECHO_ARRAY_BUFFER_PAGE, bytes);
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testMessageChannelSendAndReceiveLargeArrayBuffer() throws Throwable {
+        final byte[] bytes = new byte[1000 * 1000]; // 1MB
+        new Random(42).nextBytes(bytes);
+
+        verifyEchoArrayBuffer(ECHO_ARRAY_BUFFER_PAGE, bytes);
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testMessageChannelSendAndReceiveNonTransferableArrayBuffer() throws Throwable {
+        final byte[] bytes = HELLO.getBytes("UTF-8");
+        verifyEchoArrayBuffer(ECHO_NON_TRANFERABLE_ARRAY_BUFFER_PAGE, bytes);
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testMessageChannelSendAndReceiveLargeNonTransferableArrayBuffer() throws Throwable {
+        final byte[] bytes = new byte[1000 * 1000]; // 1MB
+        new Random(42).nextBytes(bytes);
+
+        verifyEchoArrayBuffer(ECHO_NON_TRANFERABLE_ARRAY_BUFFER_PAGE, bytes);
+    }
+
+    private void verifyEchoArrayBuffer(final String page, final byte[] bytes) throws Throwable {
+        final ChannelContainer channelContainer = new ChannelContainer();
+        loadPage(page);
+        final MessagePort[] channel =
+                TestThreadUtils.runOnUiThreadBlocking(() -> mAwContents.createMessageChannel());
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            channel[0].setMessageCallback(
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
+            mAwContents.postMessageToMainFrame(new MessagePayload(WEBVIEW_MESSAGE),
+                    mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
+            channel[0].postMessage(new MessagePayload(bytes), null);
+        });
+        // wait for the asynchronous response from JS
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertArrayEquals(bytes, data.getArrayBuffer());
+    }
+
     // Post a message with a pending port to a frame and then post a bunch of messages
     // after that. Make sure that they are not ordered at the receiver side.
     @Test
@@ -638,6 +780,53 @@
         expectTitle("123");
     }
 
+    // Generate an arraybuffer with a given size, and fill with ordered number, 0-255.
+    // Then pass it back over MessagePort.
+    private static final String GENERATE_ARRAY_BUFFER_FROM_JS_PAGE = "<!DOCTYPE html><html><body>"
+            + "    <script>"
+            + "        onmessage = function (e) {"
+            + "            var myPort = e.ports[0];"
+            + "            myPort.onmessage = function(e) {"
+            + "                let length = parseInt(e.data, 10);"
+            + "                var arrayBuffer = new ArrayBuffer(length);"
+            + "                const view = new Uint8Array(arrayBuffer);"
+            + "                for (var i = 0; i < length; ++i) {"
+            + "                    view[i] = i;"
+            + "                }"
+            + "                myPort.postMessage(arrayBuffer, [arrayBuffer]);"
+            + "            };"
+            + "        };"
+            + "    </script>";
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView", "Android-PostMessage"})
+    public void testReceiveArrayBufferFromJsOverMessagePort() throws Throwable {
+        final int bufferLength = 5000;
+        final byte[] expectedBytes = new byte[bufferLength];
+        for (int i = 0; i < bufferLength; ++i) {
+            // Cast to byte implicitly % 256.
+            expectedBytes[i] = (byte) i;
+        }
+
+        final ChannelContainer channelContainer = new ChannelContainer();
+        loadPage(GENERATE_ARRAY_BUFFER_FROM_JS_PAGE);
+        final MessagePort[] channel =
+                TestThreadUtils.runOnUiThreadBlocking(() -> mAwContents.createMessageChannel());
+
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            channel[0].setMessageCallback(
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
+            mAwContents.postMessageToMainFrame(new MessagePayload(WEBVIEW_MESSAGE),
+                    mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
+            channel[0].postMessage(new MessagePayload(String.valueOf(bufferLength)), null);
+        });
+        // wait for the asynchronous response from JS
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        final byte[] bytes = data.getArrayBuffer();
+        Assert.assertEquals(bufferLength, bytes.length);
+        Assert.assertArrayEquals(expectedBytes, bytes);
+    }
+
     private static final String RECEIVE_JS_MESSAGE_CHANNEL_PAGE =
             "<!DOCTYPE html><html><body>"
             + "    <script>"
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 228a24c..66b3301 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -1002,7 +1002,7 @@
         base::UserMetricsAction("VoiceInteraction.Started.Assistant"));
   }
 
-  using chromeos::assistant::AssistantAllowedState;
+  using assistant::AssistantAllowedState;
   switch (AssistantState::Get()->allowed_state().value_or(
       AssistantAllowedState::ALLOWED)) {
     case AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER:
@@ -1057,8 +1057,8 @@
   }
 
   AssistantUiController::Get()->ToggleUi(
-      /*entry_point=*/chromeos::assistant::AssistantEntryPoint::kHotkey,
-      /*exit_point=*/chromeos::assistant::AssistantExitPoint::kHotkey);
+      /*entry_point=*/assistant::AssistantEntryPoint::kHotkey,
+      /*exit_point=*/assistant::AssistantExitPoint::kHotkey);
 }
 
 void HandleSuspend() {
diff --git a/ash/app_list/app_list_bubble_presenter.cc b/ash/app_list/app_list_bubble_presenter.cc
index 26a199f..e35288a 100644
--- a/ash/app_list/app_list_bubble_presenter.cc
+++ b/ash/app_list/app_list_bubble_presenter.cc
@@ -47,7 +47,7 @@
 namespace ash {
 namespace {
 
-using chromeos::assistant::AssistantExitPoint;
+using assistant::AssistantExitPoint;
 
 // Maximum amount of time to spend refreshing zero state search results before
 // opening the launcher.
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc
index 18f4ce0..e938dcd9 100644
--- a/ash/app_list/app_list_controller_impl.cc
+++ b/ash/app_list/app_list_controller_impl.cc
@@ -83,8 +83,8 @@
 
 namespace ash {
 
-using chromeos::assistant::AssistantEntryPoint;
-using chromeos::assistant::AssistantExitPoint;
+using assistant::AssistantEntryPoint;
+using assistant::AssistantExitPoint;
 
 namespace {
 
@@ -982,7 +982,7 @@
 }
 
 void AppListControllerImpl::OnAssistantStatusChanged(
-    chromeos::assistant::AssistantStatus status) {
+    assistant::AssistantStatus status) {
   UpdateAssistantVisibility();
 }
 
@@ -991,7 +991,7 @@
 }
 
 void AppListControllerImpl::OnAssistantFeatureAllowedChanged(
-    chromeos::assistant::AssistantAllowedState state) {
+    assistant::AssistantAllowedState state) {
   UpdateAssistantVisibility();
 }
 
@@ -1525,10 +1525,8 @@
 
   auto* state = AssistantState::Get();
   return state->settings_enabled().value_or(false) &&
-         state->allowed_state() ==
-             chromeos::assistant::AssistantAllowedState::ALLOWED &&
-         state->assistant_status() !=
-             chromeos::assistant::AssistantStatus::NOT_READY;
+         state->allowed_state() == assistant::AssistantAllowedState::ALLOWED &&
+         state->assistant_status() != assistant::AssistantStatus::NOT_READY;
 }
 
 bool AppListControllerImpl::ShouldShowSuggestedContentInfo() const {
diff --git a/ash/app_list/app_list_controller_impl.h b/ash/app_list/app_list_controller_impl.h
index 167380d..d494afb 100644
--- a/ash/app_list/app_list_controller_impl.h
+++ b/ash/app_list/app_list_controller_impl.h
@@ -250,11 +250,10 @@
   void OnWallpaperPreviewEnded() override;
 
   // AssistantStateObserver:
-  void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) override;
+  void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
   void OnAssistantSettingsEnabled(bool enabled) override;
   void OnAssistantFeatureAllowedChanged(
-      chromeos::assistant::AssistantAllowedState state) override;
+      assistant::AssistantAllowedState state) override;
 
   // WindowTreeHostManager::Observer:
   void OnDisplayConfigurationChanged() override;
diff --git a/ash/app_list/app_list_controller_impl_unittest.cc b/ash/app_list/app_list_controller_impl_unittest.cc
index 80d1417..dbf2e64 100644
--- a/ash/app_list/app_list_controller_impl_unittest.cc
+++ b/ash/app_list/app_list_controller_impl_unittest.cc
@@ -1780,9 +1780,9 @@
 
     assistant_test_api_->SetAssistantEnabled(true);
     assistant_test_api_->GetAssistantState()->NotifyFeatureAllowed(
-        chromeos::assistant::AssistantAllowedState::ALLOWED);
+        assistant::AssistantAllowedState::ALLOWED);
     assistant_test_api_->GetAssistantState()->NotifyStatusChanged(
-        chromeos::assistant::AssistantStatus::READY);
+        assistant::AssistantStatus::READY);
     assistant_test_api_->WaitUntilIdle();
   }
 
diff --git a/ash/app_list/app_list_presenter_impl.cc b/ash/app_list/app_list_presenter_impl.cc
index 055a0b8d..f84aa1a 100644
--- a/ash/app_list/app_list_presenter_impl.cc
+++ b/ash/app_list/app_list_presenter_impl.cc
@@ -51,7 +51,7 @@
 namespace ash {
 namespace {
 
-using chromeos::assistant::AssistantExitPoint;
+using assistant::AssistantExitPoint;
 
 inline ui::Layer* GetLayer(views::Widget* widget) {
   return widget->GetNativeView()->layer();
diff --git a/ash/app_list/views/app_list_bubble_view_unittest.cc b/ash/app_list/views/app_list_bubble_view_unittest.cc
index 96337235..de1a671 100644
--- a/ash/app_list/views/app_list_bubble_view_unittest.cc
+++ b/ash/app_list/views/app_list_bubble_view_unittest.cc
@@ -505,7 +505,7 @@
   // Simulate the app list being closed by taking a screenshot with assistant.
   // This makes AppListControllerImpl::ShouldDismissImmediately() return true.
   AssistantUiController::Get()->ToggleUi(
-      absl::nullopt, chromeos::assistant::AssistantExitPoint::kScreenshot);
+      absl::nullopt, assistant::AssistantExitPoint::kScreenshot);
 
   // The bubble dismissed immediately so it is not animating.
   ui::Layer* bubble_layer = GetAppListTestHelper()->GetBubbleView()->layer();
diff --git a/ash/app_list/views/assistant/assistant_page_view_unittest.cc b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
index 84dc1f5..c7b7450d 100644
--- a/ash/app_list/views/assistant/assistant_page_view_unittest.cc
+++ b/ash/app_list/views/assistant/assistant_page_view_unittest.cc
@@ -244,7 +244,7 @@
 
 // Counts the number of Assistant interactions that are started.
 class AssistantInteractionCounter
-    : private chromeos::assistant::AssistantInteractionSubscriber {
+    : private assistant::AssistantInteractionSubscriber {
  public:
   explicit AssistantInteractionCounter(
       chromeos::assistant::Assistant* service) {
@@ -264,8 +264,7 @@
   }
 
   int interaction_count_ = 0;
-  chromeos::assistant::ScopedAssistantInteractionSubscriber
-      interaction_observer_{this};
+  assistant::ScopedAssistantInteractionSubscriber interaction_observer_{this};
 };
 
 TEST_F(AssistantPageNonBubbleTest, ShouldStartInPeekingState) {
diff --git a/ash/app_list/views/assistant/assistant_test_api_impl.cc b/ash/app_list/views/assistant/assistant_test_api_impl.cc
index f4d317f3..9d2bba4 100644
--- a/ash/app_list/views/assistant/assistant_test_api_impl.cc
+++ b/ash/app_list/views/assistant/assistant_test_api_impl.cc
@@ -143,15 +143,14 @@
 void AssistantTestApiImpl::EnableAssistantAndWait() {
   SetAssistantEnabled(true);
   GetAssistantState()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::ALLOWED);
-  GetAssistantState()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+      assistant::AssistantAllowedState::ALLOWED);
+  GetAssistantState()->NotifyStatusChanged(assistant::AssistantStatus::READY);
   WaitUntilIdle();
 }
 
 void AssistantTestApiImpl::SetAssistantEnabled(bool enabled) {
   Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetBoolean(
-      chromeos::assistant::prefs::kAssistantEnabled, enabled);
+      assistant::prefs::kAssistantEnabled, enabled);
 
   // Ensure the value has taken effect.
   ASSERT_EQ(GetAssistantState()->settings_enabled(), enabled)
@@ -162,7 +161,7 @@
 
 void AssistantTestApiImpl::SetScreenContextEnabled(bool enabled) {
   Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetBoolean(
-      chromeos::assistant::prefs::kAssistantContextEnabled, enabled);
+      assistant::prefs::kAssistantContextEnabled, enabled);
 
   // Ensure the value has taken effect.
   ASSERT_EQ(GetAssistantState()->context_enabled(), enabled)
@@ -181,9 +180,9 @@
 }
 
 void AssistantTestApiImpl::SetConsentStatus(
-    chromeos::assistant::prefs::ConsentStatus consent_status) {
+    assistant::prefs::ConsentStatus consent_status) {
   Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetInteger(
-      chromeos::assistant::prefs::kAssistantConsentStatus, consent_status);
+      assistant::prefs::kAssistantConsentStatus, consent_status);
 
   // Ensure the value has taken effect.
   ASSERT_EQ(GetAssistantState()->consent_status(), consent_status)
@@ -199,10 +198,10 @@
 }
 
 void AssistantTestApiImpl::SetOnboardingMode(
-    chromeos::assistant::prefs::AssistantOnboardingMode onboarding_mode) {
+    assistant::prefs::AssistantOnboardingMode onboarding_mode) {
   Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetString(
-      chromeos::assistant::prefs::kAssistantOnboardingMode,
-      chromeos::assistant::prefs::ToOnboardingModeString(onboarding_mode));
+      assistant::prefs::kAssistantOnboardingMode,
+      assistant::prefs::ToOnboardingModeString(onboarding_mode));
 
   // Ensure the value has taken effect.
   ASSERT_EQ(GetAssistantState()->onboarding_mode(), onboarding_mode)
@@ -213,7 +212,7 @@
 
 void AssistantTestApiImpl::SetPreferVoice(bool value) {
   Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetBoolean(
-      chromeos::assistant::prefs::kAssistantLaunchWithMicOpen, value);
+      assistant::prefs::kAssistantLaunchWithMicOpen, value);
 
   // Ensure the value has taken effect.
   ASSERT_EQ(GetAssistantState()->launch_with_mic_open(), value)
diff --git a/ash/app_list/views/assistant/assistant_test_api_impl.h b/ash/app_list/views/assistant/assistant_test_api_impl.h
index 7ab994b..406946a 100644
--- a/ash/app_list/views/assistant/assistant_test_api_impl.h
+++ b/ash/app_list/views/assistant/assistant_test_api_impl.h
@@ -36,10 +36,9 @@
   void SetAssistantEnabled(bool enable) override;
   void SetScreenContextEnabled(bool enabled) override;
   void SetTabletMode(bool enable) override;
-  void SetConsentStatus(chromeos::assistant::prefs::ConsentStatus) override;
+  void SetConsentStatus(assistant::prefs::ConsentStatus) override;
   void SetNumberOfSessionsWhereOnboardingShown(int number_of_sessions) override;
-  void SetOnboardingMode(
-      chromeos::assistant::prefs::AssistantOnboardingMode) override;
+  void SetOnboardingMode(assistant::prefs::AssistantOnboardingMode) override;
   void SetPreferVoice(bool value) override;
   void SetTimeOfLastInteraction(base::Time time) override;
   void StartOverview() override;
diff --git a/ash/ash_prefs.cc b/ash/ash_prefs.cc
index 9199866..2aa3f05 100644
--- a/ash/ash_prefs.cc
+++ b/ash/ash_prefs.cc
@@ -117,7 +117,7 @@
 
   // Provide prefs registered in the browser for ash_unittests.
   if (for_test) {
-    chromeos::assistant::prefs::RegisterProfilePrefs(registry);
+    assistant::prefs::RegisterProfilePrefs(registry);
     quick_answers::prefs::RegisterProfilePrefs(registry);
     registry->RegisterBooleanPref(prefs::kMouseReverseScroll, false);
     registry->RegisterBooleanPref(prefs::kSendFunctionKeys, false);
diff --git a/ash/assistant/assistant_alarm_timer_controller_impl.cc b/ash/assistant/assistant_alarm_timer_controller_impl.cc
index dbb70ff7..7af3daba 100644
--- a/ash/assistant/assistant_alarm_timer_controller_impl.cc
+++ b/ash/assistant/assistant_alarm_timer_controller_impl.cc
@@ -293,7 +293,7 @@
 }
 
 void AssistantAlarmTimerControllerImpl::SetAssistant(
-    chromeos::assistant::Assistant* assistant) {
+    assistant::Assistant* assistant) {
   assistant_ = assistant;
 }
 
@@ -361,10 +361,10 @@
 }
 
 void AssistantAlarmTimerControllerImpl::OnAssistantStatusChanged(
-    chromeos::assistant::AssistantStatus status) {
+    assistant::AssistantStatus status) {
   // If LibAssistant is no longer running we need to clear our cache to
   // accurately reflect LibAssistant alarm/timer state.
-  if (status == chromeos::assistant::AssistantStatus::NOT_READY)
+  if (status == assistant::AssistantStatus::NOT_READY)
     model_.RemoveAllTimers();
 }
 
diff --git a/ash/assistant/assistant_alarm_timer_controller_impl.h b/ash/assistant/assistant_alarm_timer_controller_impl.h
index 97a2ddc..90c0340 100644
--- a/ash/assistant/assistant_alarm_timer_controller_impl.h
+++ b/ash/assistant/assistant_alarm_timer_controller_impl.h
@@ -49,7 +49,7 @@
   ~AssistantAlarmTimerControllerImpl() override;
 
   // Provides a pointer to the |assistant| owned by AssistantService.
-  void SetAssistant(chromeos::assistant::Assistant* assistant);
+  void SetAssistant(assistant::Assistant* assistant);
 
   // AssistantAlarmTimerController:
   const AssistantAlarmTimerModel* GetModel() const override;
@@ -64,8 +64,7 @@
       const std::map<std::string, std::string>& params) override;
 
   // AssistantStateObserver:
-  void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) override;
+  void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
 
   // AssistantAlarmTimerModelObserver:
   void OnTimerAdded(const chromeos::assistant::AssistantTimer& timer) override;
@@ -91,7 +90,7 @@
   std::map<std::string, base::OneShotTimer> tickers_;
 
   // Owned by AssistantService.
-  chromeos::assistant::Assistant* assistant_;
+  assistant::Assistant* assistant_;
 
   base::ScopedObservation<AssistantController, AssistantControllerObserver>
       assistant_controller_observation_{this};
diff --git a/ash/assistant/assistant_controller_impl.cc b/ash/assistant/assistant_controller_impl.cc
index b4160d0..7d6de45 100644
--- a/ash/assistant/assistant_controller_impl.cc
+++ b/ash/assistant/assistant_controller_impl.cc
@@ -66,8 +66,7 @@
   assistant_volume_control_receiver_.Bind(std::move(receiver));
 }
 
-void AssistantControllerImpl::SetAssistant(
-    chromeos::assistant::Assistant* assistant) {
+void AssistantControllerImpl::SetAssistant(assistant::Assistant* assistant) {
   assistant_ = assistant;
 
   // Provide reference to sub-controllers.
@@ -175,7 +174,7 @@
   if (IsAndroidIntent(url)) {
     android_helper->LaunchAndroidIntent(url.spec());
   } else {
-    chromeos::assistant::AssistantBrowserDelegate::Get()->OpenUrl(url);
+    assistant::AssistantBrowserDelegate::Get()->OpenUrl(url);
   }
   NotifyUrlOpened(url, from_server);
 }
@@ -211,13 +210,13 @@
 
       // Close the assistant UI so that the feedback page is visible.
       assistant_ui_controller_.CloseUi(
-          chromeos::assistant::AssistantExitPoint::kUnspecified);
+          assistant::AssistantExitPoint::kUnspecified);
       break;
     case DeepLinkType::kScreenshot:
       // We close the UI before taking the screenshot as it's probably not the
       // user's intention to include the Assistant in the picture.
       assistant_ui_controller_.CloseUi(
-          chromeos::assistant::AssistantExitPoint::kScreenshot);
+          assistant::AssistantExitPoint::kScreenshot);
       CaptureModeController::Get()->CaptureScreenshotsOfAllDisplays();
       break;
     case DeepLinkType::kTaskManager:
@@ -326,16 +325,16 @@
 }
 
 void AssistantControllerImpl::OnAssistantStatusChanged(
-    chromeos::assistant::AssistantStatus status) {
-  if (status == chromeos::assistant::AssistantStatus::NOT_READY)
+    assistant::AssistantStatus status) {
+  if (status == assistant::AssistantStatus::NOT_READY)
     assistant_ui_controller_.CloseUi(
-        chromeos::assistant::AssistantExitPoint::kUnspecified);
+        assistant::AssistantExitPoint::kUnspecified);
 }
 
 void AssistantControllerImpl::OnLockedFullScreenStateChanged(bool enabled) {
   if (enabled)
     assistant_ui_controller_.CloseUi(
-        chromeos::assistant::AssistantExitPoint::kUnspecified);
+        assistant::AssistantExitPoint::kUnspecified);
 }
 
 void AssistantControllerImpl::BindVolumeControl(
diff --git a/ash/assistant/assistant_controller_impl.h b/ash/assistant/assistant_controller_impl.h
index ff87c222..e724fa1 100644
--- a/ash/assistant/assistant_controller_impl.h
+++ b/ash/assistant/assistant_controller_impl.h
@@ -81,7 +81,7 @@
   void OpenAssistantSettings() override;
   void OpenUrl(const GURL& url, bool in_background, bool from_server) override;
   base::WeakPtr<ash::AssistantController> GetWeakPtr() override;
-  void SetAssistant(chromeos::assistant::Assistant* assistant) override;
+  void SetAssistant(assistant::Assistant* assistant) override;
   void StartSpeakerIdEnrollmentFlow() override;
   void SendAssistantFeedback(bool assistant_debug_info_allowed,
                              const std::string& feedback_description,
@@ -140,8 +140,7 @@
   void NotifyUrlOpened(const GURL& url, bool from_server);
 
   // AssistantStateObserver:
-  void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) override;
+  void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
   void OnLockedFullScreenStateChanged(bool enabled) override;
 
   // AssistantInterfaceBinder implementation:
@@ -158,7 +157,7 @@
 
   // |assistant_| can be nullptr if libassistant creation is not yet completed,
   // i.e. it cannot take a request.
-  chromeos::assistant::Assistant* assistant_ = nullptr;
+  assistant::Assistant* assistant_ = nullptr;
 
   // Assistant sub-controllers.
   AssistantAlarmTimerControllerImpl assistant_alarm_timer_controller_{this};
diff --git a/ash/assistant/assistant_interaction_controller_impl.cc b/ash/assistant/assistant_interaction_controller_impl.cc
index 2ce8919..fb18275 100644
--- a/ash/assistant/assistant_interaction_controller_impl.cc
+++ b/ash/assistant/assistant_interaction_controller_impl.cc
@@ -44,7 +44,7 @@
 
 namespace {
 
-using chromeos::assistant::features::IsWaitSchedulingEnabled;
+using assistant::features::IsWaitSchedulingEnabled;
 
 // Android.
 constexpr char kAndroidIntentScheme[] = "intent://";
diff --git a/ash/assistant/assistant_interaction_controller_impl.h b/ash/assistant/assistant_interaction_controller_impl.h
index 6426fc0..cf1c833 100644
--- a/ash/assistant/assistant_interaction_controller_impl.h
+++ b/ash/assistant/assistant_interaction_controller_impl.h
@@ -34,7 +34,7 @@
 
 class AssistantInteractionControllerImpl
     : public AssistantInteractionController,
-      public chromeos::assistant::AssistantInteractionSubscriber,
+      public assistant::AssistantInteractionSubscriber,
       public AssistantControllerObserver,
       public AssistantInteractionModelObserver,
       public AssistantUiModelObserver,
@@ -45,7 +45,7 @@
   using AssistantInteractionMetadata =
       chromeos::assistant::AssistantInteractionMetadata;
   using AssistantInteractionResolution =
-      chromeos::assistant::AssistantInteractionResolution;
+      assistant::AssistantInteractionResolution;
   using AssistantInteractionType =
       chromeos::assistant::AssistantInteractionType;
   using AssistantQuerySource = chromeos::assistant::AssistantQuerySource;
@@ -65,7 +65,7 @@
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
   // Provides a pointer to the |assistant| owned by AssistantService.
-  void SetAssistant(chromeos::assistant::Assistant* assistant);
+  void SetAssistant(assistant::Assistant* assistant);
 
   // AssistantInteractionController:
   const AssistantInteractionModel* GetModel() const override;
@@ -98,7 +98,7 @@
   // HighlighterController::Observer:
   void OnHighlighterSelectionRecognized(const gfx::Rect& rect) override;
 
-  // chromeos::assistant::AssistantInteractionSubscriber:
+  // assistant::AssistantInteractionSubscriber:
   void OnInteractionStarted(
       const AssistantInteractionMetadata& metadata) override;
   void OnInteractionFinished(
@@ -150,7 +150,7 @@
   bool has_had_interaction_ = false;
 
   // Owned by AssistantService.
-  chromeos::assistant::Assistant* assistant_ = nullptr;
+  assistant::Assistant* assistant_ = nullptr;
 
   base::ScopedObservation<AssistantController, AssistantControllerObserver>
       assistant_controller_observation_{this};
diff --git a/ash/assistant/assistant_interaction_controller_impl_unittest.cc b/ash/assistant/assistant_interaction_controller_impl_unittest.cc
index 270f762..e988be84 100644
--- a/ash/assistant/assistant_interaction_controller_impl_unittest.cc
+++ b/ash/assistant/assistant_interaction_controller_impl_unittest.cc
@@ -36,16 +36,16 @@
 
 namespace {
 
+using assistant::AssistantInteractionSubscriber;
+using assistant::ScopedAssistantInteractionSubscriber;
 using chromeos::assistant::AndroidAppInfo;
 using chromeos::assistant::Assistant;
 using chromeos::assistant::AssistantInteractionMetadata;
-using chromeos::assistant::AssistantInteractionSubscriber;
 using chromeos::assistant::AssistantInteractionType;
 using chromeos::assistant::AssistantQuerySource;
 using chromeos::assistant::AssistantSuggestion;
 using chromeos::assistant::AssistantSuggestionType;
 using chromeos::assistant::MockAssistantInteractionSubscriber;
-using chromeos::assistant::ScopedAssistantInteractionSubscriber;
 
 using ::testing::Invoke;
 using ::testing::Mock;
@@ -55,7 +55,7 @@
 // Mocks -----------------------------------------------------------------------
 
 class AssistantInteractionSubscriberMock
-    : public chromeos::assistant::AssistantInteractionSubscriber {
+    : public AssistantInteractionSubscriber {
  public:
   explicit AssistantInteractionSubscriberMock(Assistant* service) {
     scoped_subscriber_.Observe(service);
@@ -69,8 +69,7 @@
               (override));
 
  private:
-  chromeos::assistant::ScopedAssistantInteractionSubscriber scoped_subscriber_{
-      this};
+  ScopedAssistantInteractionSubscriber scoped_subscriber_{this};
 };
 
 // AssistantInteractionControllerImplTest --------------------------------------
@@ -237,7 +236,7 @@
   base::RunLoop().RunUntilIdle();
 
   interaction_controller()->OnInteractionFinished(
-      chromeos::assistant::AssistantInteractionResolution::kError);
+      assistant::AssistantInteractionResolution::kError);
 
   base::RunLoop().RunUntilIdle();
 
diff --git a/ash/assistant/assistant_notification_controller_impl.cc b/ash/assistant/assistant_notification_controller_impl.cc
index 77f417b..f0bc333 100644
--- a/ash/assistant/assistant_notification_controller_impl.cc
+++ b/ash/assistant/assistant_notification_controller_impl.cc
@@ -98,7 +98,7 @@
 }
 
 void AssistantNotificationControllerImpl::SetAssistant(
-    chromeos::assistant::Assistant* assistant) {
+    assistant::Assistant* assistant) {
   receiver_.reset();
 
   assistant_ = assistant;
diff --git a/ash/assistant/assistant_notification_controller_impl.h b/ash/assistant/assistant_notification_controller_impl.h
index 002db1b..2cf57388 100644
--- a/ash/assistant/assistant_notification_controller_impl.h
+++ b/ash/assistant/assistant_notification_controller_impl.h
@@ -44,7 +44,7 @@
   const AssistantNotificationModel* model() const { return &model_; }
 
   // Provides a pointer to the |assistant| owned by AssistantController.
-  void SetAssistant(chromeos::assistant::Assistant* assistant);
+  void SetAssistant(assistant::Assistant* assistant);
 
   // AssistantNotificationController:
   void RemoveNotificationById(const std::string& id, bool from_server) override;
@@ -79,7 +79,7 @@
   AssistantNotificationExpiryMonitor expiry_monitor_;
 
   // Owned by AssistantService
-  chromeos::assistant::Assistant* assistant_ = nullptr;
+  assistant::Assistant* assistant_ = nullptr;
 
   const message_center::NotifierId notifier_id_;
 
diff --git a/ash/assistant/assistant_setup_controller.cc b/ash/assistant/assistant_setup_controller.cc
index 81b14b0..6085db9 100644
--- a/ash/assistant/assistant_setup_controller.cc
+++ b/ash/assistant/assistant_setup_controller.cc
@@ -51,7 +51,7 @@
 }
 
 void AssistantSetupController::OnOptInButtonPressed() {
-  using chromeos::assistant::prefs::ConsentStatus;
+  using assistant::prefs::ConsentStatus;
   if (AssistantState::Get()->consent_status().value_or(
           ConsentStatus::kUnknown) == ConsentStatus::kUnauthorized) {
     AssistantController::Get()->OpenUrl(assistant::util::CreateLocalizedGURL(
@@ -66,8 +66,7 @@
   if (!assistant_setup)
     return;
 
-  AssistantUiController::Get()->CloseUi(
-      chromeos::assistant::AssistantExitPoint::kSetup);
+  AssistantUiController::Get()->CloseUi(assistant::AssistantExitPoint::kSetup);
 
   assistant_setup->StartAssistantOptInFlow(
       type, base::BindOnce(&AssistantSetupController::OnOptInFlowFinished,
@@ -78,7 +77,7 @@
                                                    bool completed) {
   if (relaunch && completed) {
     AssistantUiController::Get()->ShowUi(
-        chromeos::assistant::AssistantEntryPoint::kSetup);
+        assistant::AssistantEntryPoint::kSetup);
   }
 }
 
diff --git a/ash/assistant/assistant_setup_controller_unittest.cc b/ash/assistant/assistant_setup_controller_unittest.cc
index 4af62f7..c0db5a03 100644
--- a/ash/assistant/assistant_setup_controller_unittest.cc
+++ b/ash/assistant/assistant_setup_controller_unittest.cc
@@ -28,7 +28,7 @@
   ShowAssistantUi(AssistantEntryPoint::kUnspecified);
   EXPECT_TRUE(IsVisible());
 
-  SetConsentStatus(chromeos::assistant::prefs::ConsentStatus::kUnknown);
+  SetConsentStatus(assistant::prefs::ConsentStatus::kUnknown);
   EXPECT_TRUE(opt_in_view()->GetVisible());
 
   ClickOnAndWait(opt_in_view());
@@ -43,7 +43,7 @@
   ShowAssistantUi(AssistantEntryPoint::kUnspecified);
   EXPECT_TRUE(IsVisible());
 
-  SetConsentStatus(chromeos::assistant::prefs::ConsentStatus::kUnknown);
+  SetConsentStatus(assistant::prefs::ConsentStatus::kUnknown);
   EXPECT_TRUE(opt_in_view()->GetVisible());
 
   ClickOnAndWait(opt_in_view());
@@ -56,7 +56,7 @@
   ShowAssistantUi(AssistantEntryPoint::kUnspecified);
   EXPECT_TRUE(IsVisible());
 
-  SetConsentStatus(chromeos::assistant::prefs::ConsentStatus::kUnknown);
+  SetConsentStatus(assistant::prefs::ConsentStatus::kUnknown);
   EXPECT_TRUE(opt_in_view()->GetVisible());
 
   ClickOnAndWait(opt_in_view());
@@ -73,7 +73,7 @@
   ShowAssistantUi(AssistantEntryPoint::kUnspecified);
   EXPECT_TRUE(IsVisible());
 
-  SetConsentStatus(chromeos::assistant::prefs::ConsentStatus::kUnknown);
+  SetConsentStatus(assistant::prefs::ConsentStatus::kUnknown);
   EXPECT_TRUE(opt_in_view()->GetVisible());
 
   ClickOnAndWait(opt_in_view());
diff --git a/ash/assistant/assistant_state_controller_unittest.cc b/ash/assistant/assistant_state_controller_unittest.cc
index 5d8744a3..74561fe4 100644
--- a/ash/assistant/assistant_state_controller_unittest.cc
+++ b/ash/assistant/assistant_state_controller_unittest.cc
@@ -18,18 +18,18 @@
 
 namespace {
 
-using chromeos::assistant::prefs::AssistantOnboardingMode;
-using chromeos::assistant::prefs::ConsentStatus;
-using chromeos::assistant::prefs::kAssistantConsentStatus;
-using chromeos::assistant::prefs::kAssistantContextEnabled;
-using chromeos::assistant::prefs::kAssistantEnabled;
-using chromeos::assistant::prefs::kAssistantHotwordAlwaysOn;
-using chromeos::assistant::prefs::kAssistantHotwordEnabled;
-using chromeos::assistant::prefs::kAssistantLaunchWithMicOpen;
-using chromeos::assistant::prefs::kAssistantNotificationEnabled;
-using chromeos::assistant::prefs::kAssistantOnboardingMode;
-using chromeos::assistant::prefs::kAssistantOnboardingModeDefault;
-using chromeos::assistant::prefs::kAssistantOnboardingModeEducation;
+using assistant::prefs::AssistantOnboardingMode;
+using assistant::prefs::ConsentStatus;
+using assistant::prefs::kAssistantConsentStatus;
+using assistant::prefs::kAssistantContextEnabled;
+using assistant::prefs::kAssistantEnabled;
+using assistant::prefs::kAssistantHotwordAlwaysOn;
+using assistant::prefs::kAssistantHotwordEnabled;
+using assistant::prefs::kAssistantLaunchWithMicOpen;
+using assistant::prefs::kAssistantNotificationEnabled;
+using assistant::prefs::kAssistantOnboardingMode;
+using assistant::prefs::kAssistantOnboardingModeDefault;
+using assistant::prefs::kAssistantOnboardingModeEducation;
 
 class TestAssistantStateObserver : public AssistantStateObserver {
  public:
diff --git a/ash/assistant/assistant_suggestions_controller_impl.cc b/ash/assistant/assistant_suggestions_controller_impl.cc
index a11c87e..7a6e0ff 100644
--- a/ash/assistant/assistant_suggestions_controller_impl.cc
+++ b/ash/assistant/assistant_suggestions_controller_impl.cc
@@ -29,9 +29,9 @@
 
 namespace {
 
+using assistant::prefs::AssistantOnboardingMode;
 using chromeos::assistant::AssistantSuggestion;
 using chromeos::assistant::AssistantSuggestionType;
-using chromeos::assistant::prefs::AssistantOnboardingMode;
 
 // Conversation starters -------------------------------------------------------
 
diff --git a/ash/assistant/assistant_suggestions_controller_impl.h b/ash/assistant/assistant_suggestions_controller_impl.h
index b54f9c0f..11e804f 100644
--- a/ash/assistant/assistant_suggestions_controller_impl.h
+++ b/ash/assistant/assistant_suggestions_controller_impl.h
@@ -49,8 +49,7 @@
   // AssistantStateObserver:
   void OnAssistantContextEnabled(bool enabled) override;
   void OnAssistantOnboardingModeChanged(
-      chromeos::assistant::prefs::AssistantOnboardingMode onboarding_mode)
-      override;
+      assistant::prefs::AssistantOnboardingMode onboarding_mode) override;
 
   void UpdateConversationStarters();
   void UpdateOnboardingSuggestions();
diff --git a/ash/assistant/assistant_suggestions_controller_impl_unittest.cc b/ash/assistant/assistant_suggestions_controller_impl_unittest.cc
index 41344c21..9bc0914 100644
--- a/ash/assistant/assistant_suggestions_controller_impl_unittest.cc
+++ b/ash/assistant/assistant_suggestions_controller_impl_unittest.cc
@@ -13,7 +13,7 @@
 
 namespace {
 
-using chromeos::assistant::prefs::AssistantOnboardingMode;
+using assistant::prefs::AssistantOnboardingMode;
 
 const AssistantSuggestionsModel* GetModel() {
   return AssistantSuggestionsController::Get()->GetModel();
diff --git a/ash/assistant/assistant_ui_controller_impl.cc b/ash/assistant/assistant_ui_controller_impl.cc
index ff3261c9..e99c7bc 100644
--- a/ash/assistant/assistant_ui_controller_impl.cc
+++ b/ash/assistant/assistant_ui_controller_impl.cc
@@ -81,8 +81,7 @@
       prefs::kAssistantNumSessionsWhereOnboardingShown, 0);
 }
 
-void AssistantUiControllerImpl::SetAssistant(
-    chromeos::assistant::Assistant* assistant) {
+void AssistantUiControllerImpl::SetAssistant(assistant::Assistant* assistant) {
   assistant_ = assistant;
 }
 
@@ -119,7 +118,7 @@
 
   // TODO(dmblack): Show a more helpful message to the user.
   if (assistant_state->assistant_status() ==
-      chromeos::assistant::AssistantStatus::NOT_READY) {
+      assistant::AssistantStatus::NOT_READY) {
     ShowUnboundErrorToast();
     return;
   }
@@ -144,7 +143,7 @@
   // provided the visibility change hasn't been invalidated.
   return base::ScopedClosureRunner(base::BindOnce(
       [](const base::WeakPtr<AssistantUiControllerImpl>& weak_ptr,
-         chromeos::assistant::AssistantExitPoint exit_point) {
+         assistant::AssistantExitPoint exit_point) {
         if (weak_ptr)
           weak_ptr->model_.SetClosed(exit_point);
       },
diff --git a/ash/assistant/assistant_ui_controller_impl.h b/ash/assistant/assistant_ui_controller_impl.h
index 517e65c7..674cee16 100644
--- a/ash/assistant/assistant_ui_controller_impl.h
+++ b/ash/assistant/assistant_ui_controller_impl.h
@@ -54,7 +54,7 @@
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
 
   // Provides a pointer to the |assistant| owned by AssistantService.
-  void SetAssistant(chromeos::assistant::Assistant* assistant);
+  void SetAssistant(assistant::Assistant* assistant);
 
   // AssistantUiController:
   const AssistantUiModel* GetModel() const override;
@@ -102,7 +102,7 @@
   bool has_shown_onboarding_ = false;
 
   // Owned by AssistantService.
-  chromeos::assistant::Assistant* assistant_ = nullptr;
+  assistant::Assistant* assistant_ = nullptr;
 
   base::ScopedObservation<AssistantController, AssistantControllerObserver>
       assistant_controller_observation_{this};
diff --git a/ash/assistant/assistant_view_delegate_impl.cc b/ash/assistant/assistant_view_delegate_impl.cc
index 0d7cf5dd..a551635 100644
--- a/ash/assistant/assistant_view_delegate_impl.cc
+++ b/ash/assistant/assistant_view_delegate_impl.cc
@@ -120,7 +120,7 @@
 bool AssistantViewDelegateImpl::ShouldShowOnboarding() const {
   // UI developers need to be able to force the onboarding flow.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          chromeos::assistant::switches::kForceAssistantOnboarding)) {
+          assistant::switches::kForceAssistantOnboarding)) {
     return true;
   }
 
diff --git a/ash/assistant/model/assistant_ui_model.h b/ash/assistant/model/assistant_ui_model.h
index 4483d64..78b28f2 100644
--- a/ash/assistant/model/assistant_ui_model.h
+++ b/ash/assistant/model/assistant_ui_model.h
@@ -45,8 +45,8 @@
 // Models the Assistant UI.
 class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantUiModel {
  public:
-  using AssistantEntryPoint = chromeos::assistant::AssistantEntryPoint;
-  using AssistantExitPoint = chromeos::assistant::AssistantExitPoint;
+  using AssistantEntryPoint = assistant::AssistantEntryPoint;
+  using AssistantExitPoint = assistant::AssistantExitPoint;
 
   AssistantUiModel();
 
diff --git a/ash/assistant/model/assistant_ui_model_observer.h b/ash/assistant/model/assistant_ui_model_observer.h
index 8131cb7..42a2f6a 100644
--- a/ash/assistant/model/assistant_ui_model_observer.h
+++ b/ash/assistant/model/assistant_ui_model_observer.h
@@ -10,14 +10,12 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/gfx/geometry/rect.h"
 
-namespace chromeos {
+namespace ash {
+
 namespace assistant {
 enum class AssistantEntryPoint;
 enum class AssistantExitPoint;
 }  // namespace assistant
-}  // namespace chromeos
-
-namespace ash {
 
 enum class AssistantVisibility;
 
@@ -26,8 +24,8 @@
 class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantUiModelObserver
     : public base::CheckedObserver {
  public:
-  using AssistantEntryPoint = chromeos::assistant::AssistantEntryPoint;
-  using AssistantExitPoint = chromeos::assistant::AssistantExitPoint;
+  using AssistantEntryPoint = assistant::AssistantEntryPoint;
+  using AssistantExitPoint = assistant::AssistantExitPoint;
 
   AssistantUiModelObserver(const AssistantUiModelObserver&) = delete;
   AssistantUiModelObserver& operator=(const AssistantUiModelObserver&) = delete;
diff --git a/ash/assistant/test/assistant_ash_test_base.cc b/ash/assistant/test/assistant_ash_test_base.cc
index 04b9044..f2d3776 100644
--- a/ash/assistant/test/assistant_ash_test_base.cc
+++ b/ash/assistant/test/assistant_ash_test_base.cc
@@ -368,7 +368,7 @@
 
   // Set AssistantAllowedState to ALLOWED.
   test_api_->GetAssistantState()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::ALLOWED);
+      assistant::AssistantAllowedState::ALLOWED);
 
   // Set user consent so the suggestion chips are displayed.
   SetConsentStatus(ConsentStatus::kActivityControlAccepted);
@@ -376,7 +376,7 @@
   // At this point our Assistant service is ready for use.
   // Indicate this by changing status from NOT_READY to READY.
   test_api_->GetAssistantState()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+      assistant::AssistantStatus::READY);
 }
 
 }  // namespace ash
diff --git a/ash/assistant/test/assistant_ash_test_base.h b/ash/assistant/test/assistant_ash_test_base.h
index daee313e..a110bf2 100644
--- a/ash/assistant/test/assistant_ash_test_base.h
+++ b/ash/assistant/test/assistant_ash_test_base.h
@@ -43,11 +43,10 @@
 // Helper class to make testing the Assistant Ash UI easier.
 class AssistantAshTestBase : public AshTestBase {
  public:
-  using AssistantEntryPoint = chromeos::assistant::AssistantEntryPoint;
-  using AssistantExitPoint = chromeos::assistant::AssistantExitPoint;
-  using AssistantOnboardingMode =
-      chromeos::assistant::prefs::AssistantOnboardingMode;
-  using ConsentStatus = chromeos::assistant::prefs::ConsentStatus;
+  using AssistantEntryPoint = assistant::AssistantEntryPoint;
+  using AssistantExitPoint = assistant::AssistantExitPoint;
+  using AssistantOnboardingMode = assistant::prefs::AssistantOnboardingMode;
+  using ConsentStatus = assistant::prefs::ConsentStatus;
 
   AssistantAshTestBase();
   explicit AssistantAshTestBase(base::test::TaskEnvironment::TimeSource time);
diff --git a/ash/assistant/test/test_assistant_service.cc b/ash/assistant/test/test_assistant_service.cc
index cc5c97f..ab1ccdcb 100644
--- a/ash/assistant/test/test_assistant_service.cc
+++ b/ash/assistant/test/test_assistant_service.cc
@@ -17,9 +17,9 @@
 
 namespace ash {
 
+using assistant::AssistantInteractionResolution;
+using assistant::AssistantInteractionSubscriber;
 using chromeos::assistant::AssistantInteractionMetadata;
-using chromeos::assistant::AssistantInteractionResolution;
-using chromeos::assistant::AssistantInteractionSubscriber;
 using chromeos::assistant::AssistantInteractionType;
 using chromeos::assistant::AssistantSuggestion;
 
@@ -131,8 +131,7 @@
   Response() = default;
   virtual ~Response() = default;
 
-  virtual void SendTo(
-      chromeos::assistant::AssistantInteractionSubscriber* receiver) = 0;
+  virtual void SendTo(AssistantInteractionSubscriber* receiver) = 0;
 };
 
 class TextResponse : public InteractionResponse::Response {
@@ -144,8 +143,7 @@
 
   ~TextResponse() override = default;
 
-  void SendTo(
-      chromeos::assistant::AssistantInteractionSubscriber* receiver) override {
+  void SendTo(AssistantInteractionSubscriber* receiver) override {
     receiver->OnTextResponse(text_);
   }
 
@@ -160,8 +158,7 @@
   SuggestionsResponse& operator=(const SuggestionsResponse&) = delete;
   ~SuggestionsResponse() override = default;
 
-  void SendTo(
-      chromeos::assistant::AssistantInteractionSubscriber* receiver) override {
+  void SendTo(AssistantInteractionSubscriber* receiver) override {
     std::vector<AssistantSuggestion> suggestions;
     suggestions.emplace_back();
     auto& suggestion = suggestions.back();
@@ -186,8 +183,7 @@
 
   ~ResolutionResponse() override = default;
 
-  void SendTo(
-      chromeos::assistant::AssistantInteractionSubscriber* receiver) override {
+  void SendTo(AssistantInteractionSubscriber* receiver) override {
     receiver->OnInteractionFinished(resolution_);
   }
 
@@ -350,8 +346,7 @@
   responses_.push_back(std::move(response));
 }
 
-void InteractionResponse::SendTo(
-    chromeos::assistant::AssistantInteractionSubscriber* receiver) {
+void InteractionResponse::SendTo(AssistantInteractionSubscriber* receiver) {
   for (auto& response : responses_)
     response->SendTo(receiver);
 }
diff --git a/ash/assistant/test/test_assistant_service.h b/ash/assistant/test/test_assistant_service.h
index 3e220c8..f40a05b 100644
--- a/ash/assistant/test/test_assistant_service.h
+++ b/ash/assistant/test/test_assistant_service.h
@@ -34,7 +34,7 @@
 //     assistant_service()->SetInteractionResponse(std::move(response));
 class InteractionResponse {
  public:
-  using Resolution = chromeos::assistant::AssistantInteractionResolution;
+  using Resolution = assistant::AssistantInteractionResolution;
   class Response;
 
   InteractionResponse();
@@ -52,7 +52,7 @@
   // |resolution| to |AssistantInteractionSubscriber::OnInteractionFinished|.
   InteractionResponse* AddResolution(Resolution resolution);
 
-  void SendTo(chromeos::assistant::AssistantInteractionSubscriber* receiver);
+  void SendTo(assistant::AssistantInteractionSubscriber* receiver);
 
  private:
   void AddResponse(std::unique_ptr<Response> responses);
@@ -71,7 +71,7 @@
 //    - Finish a conversation before starting a new one.
 //    - Not send any responses (text, card, ...) before starting or after
 //      finishing an interaction.
-class TestAssistantService : public chromeos::assistant::Assistant {
+class TestAssistantService : public assistant::Assistant {
  public:
   TestAssistantService();
 
@@ -97,11 +97,11 @@
   void StartVoiceInteraction() override;
   void StopActiveInteraction(bool cancel_conversation) override;
   void AddAssistantInteractionSubscriber(
-      chromeos::assistant::AssistantInteractionSubscriber* subscriber) override;
+      assistant::AssistantInteractionSubscriber* subscriber) override;
   void RemoveAssistantInteractionSubscriber(
-      chromeos::assistant::AssistantInteractionSubscriber* subscriber) override;
+      assistant::AssistantInteractionSubscriber* subscriber) override;
   void AddRemoteConversationObserver(
-      chromeos::assistant::ConversationObserver* observer) override {}
+      assistant::ConversationObserver* observer) override {}
   mojo::PendingReceiver<chromeos::libassistant::mojom::NotificationDelegate>
   GetPendingNotificationDelegate() override;
   void RetrieveNotification(
@@ -137,7 +137,7 @@
 
   absl::optional<bool> dark_mode_enabled_;
 
-  base::ObserverList<chromeos::assistant::AssistantInteractionSubscriber>
+  base::ObserverList<assistant::AssistantInteractionSubscriber>
       interaction_subscribers_;
   bool running_active_interaction_ = false;
 
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.cc b/ash/assistant/ui/main_stage/assistant_footer_view.cc
index 51936a8..16377b8 100644
--- a/ash/assistant/ui/main_stage/assistant_footer_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_footer_view.cc
@@ -74,8 +74,8 @@
   // Initial view state is based on user consent state.
   const bool consent_given =
       AssistantState::Get()->consent_status().value_or(
-          chromeos::assistant::prefs::ConsentStatus::kUnknown) ==
-      chromeos::assistant::prefs::ConsentStatus::kActivityControlAccepted;
+          assistant::prefs::ConsentStatus::kUnknown) ==
+      assistant::prefs::ConsentStatus::kActivityControlAccepted;
 
   // Suggestion container.
   suggestion_container_ =
@@ -106,7 +106,7 @@
 
   const bool consent_given =
       consent_status ==
-      chromeos::assistant::prefs::ConsentStatus::kActivityControlAccepted;
+      assistant::prefs::ConsentStatus::kActivityControlAccepted;
 
   // When the consent state changes, we need to hide/show the appropriate views.
   views::View* hide_view =
@@ -159,8 +159,8 @@
     const ui::CallbackLayerAnimationObserver& observer) {
   const bool consent_given =
       AssistantState::Get()->consent_status().value_or(
-          chromeos::assistant::prefs::ConsentStatus::kUnknown) ==
-      chromeos::assistant::prefs::ConsentStatus::kActivityControlAccepted;
+          assistant::prefs::ConsentStatus::kUnknown) ==
+      assistant::prefs::ConsentStatus::kActivityControlAccepted;
 
   // Only the view relevant to our consent state should process events.
   suggestion_container_->SetCanProcessEventsWithinSubtree(consent_given);
diff --git a/ash/assistant/ui/main_stage/assistant_onboarding_view_unittest.cc b/ash/assistant/ui/main_stage/assistant_onboarding_view_unittest.cc
index d7ec3b1..9a51f12 100644
--- a/ash/assistant/ui/main_stage/assistant_onboarding_view_unittest.cc
+++ b/ash/assistant/ui/main_stage/assistant_onboarding_view_unittest.cc
@@ -83,8 +83,7 @@
 // Mocks -----------------------------------------------------------------------
 
 class MockAssistantInteractionSubscriber
-    : public testing::NiceMock<
-          chromeos::assistant::AssistantInteractionSubscriber> {
+    : public testing::NiceMock<assistant::AssistantInteractionSubscriber> {
  public:
   explicit MockAssistantInteractionSubscriber(Assistant* service) {
     scoped_subscriber_.Observe(service);
@@ -98,8 +97,7 @@
               (override));
 
  private:
-  chromeos::assistant::ScopedAssistantInteractionSubscriber scoped_subscriber_{
-      this};
+  assistant::ScopedAssistantInteractionSubscriber scoped_subscriber_{this};
 };
 
 // ScopedShowUi ----------------------------------------------------------------
@@ -110,7 +108,7 @@
       : original_visibility_(
             AssistantUiController::Get()->GetModel()->visibility()) {
     AssistantUiController::Get()->ShowUi(
-        chromeos::assistant::AssistantEntryPoint::kUnspecified);
+        assistant::AssistantEntryPoint::kUnspecified);
   }
 
   ScopedShowUi(const ScopedShowUi&) = delete;
@@ -120,7 +118,7 @@
     switch (original_visibility_) {
       case AssistantVisibility::kClosed:
         AssistantUiController::Get()->CloseUi(
-            chromeos::assistant::AssistantExitPoint::kUnspecified);
+            assistant::AssistantExitPoint::kUnspecified);
         return;
       case AssistantVisibility::kVisible:
         // No action necessary.
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
index 35f97dd..af36b80 100644
--- a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
@@ -40,8 +40,7 @@
 }
 
 std::u16string GetAction(int consent_status) {
-  return consent_status ==
-                 chromeos::assistant::prefs::ConsentStatus::kUnauthorized
+  return consent_status == assistant::prefs::ConsentStatus::kUnauthorized
              ? l10n_util::GetStringUTF16(
                    IDS_ASH_ASSISTANT_OPT_IN_ASK_ADMINISTRATOR)
              : l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_OPT_IN_GET_STARTED);
@@ -146,7 +145,7 @@
   label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER);
 
   UpdateLabel(AssistantState::Get()->consent_status().value_or(
-      chromeos::assistant::prefs::ConsentStatus::kUnknown));
+      assistant::prefs::ConsentStatus::kUnknown));
 }
 
 void AssistantOptInView::UpdateLabel(int consent_status) {
diff --git a/ash/assistant/util/assistant_util.cc b/ash/assistant/util/assistant_util.cc
index a4ee8301..3f7c5ec6 100644
--- a/ash/assistant/util/assistant_util.cc
+++ b/ash/assistant/util/assistant_util.cc
@@ -20,8 +20,6 @@
 namespace assistant {
 namespace util {
 
-using chromeos::assistant::AssistantEntryPoint;
-
 bool IsStartingSession(AssistantVisibility new_visibility,
                        AssistantVisibility old_visibility) {
   return old_visibility == AssistantVisibility::kClosed &&
diff --git a/ash/assistant/util/assistant_util.h b/ash/assistant/util/assistant_util.h
index e29b09f..96ac324 100644
--- a/ash/assistant/util/assistant_util.h
+++ b/ash/assistant/util/assistant_util.h
@@ -7,13 +7,11 @@
 
 #include "base/component_export.h"
 
-namespace chromeos {
+namespace ash {
+
 namespace assistant {
 enum class AssistantEntryPoint;
-}  // namespace assistant
-}  // namespace chromeos
-
-namespace ash {
+}
 
 enum class AssistantVisibility;
 
@@ -34,8 +32,7 @@
 // |prefer_voice| is true if user prefers voice input modality or if the device
 // is in tablet mode.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
-bool IsVoiceEntryPoint(chromeos::assistant::AssistantEntryPoint entry_point,
-                       bool prefer_voice);
+bool IsVoiceEntryPoint(AssistantEntryPoint entry_point, bool prefer_voice);
 
 COMPONENT_EXPORT(ASSISTANT_UTIL)
 bool IsGoogleDevice();
diff --git a/ash/assistant/util/deep_link_util.cc b/ash/assistant/util/deep_link_util.cc
index aa6ce57..f7339f8 100644
--- a/ash/assistant/util/deep_link_util.cc
+++ b/ash/assistant/util/deep_link_util.cc
@@ -22,7 +22,6 @@
 
 namespace {
 
-using chromeos::assistant::AssistantEntryPoint;
 using chromeos::assistant::AssistantQuerySource;
 
 // Supported deep link param keys. These values must be kept in sync with the
diff --git a/ash/assistant/util/deep_link_util.h b/ash/assistant/util/deep_link_util.h
index 6aeb7d2..c5dbe1c 100644
--- a/ash/assistant/util/deep_link_util.h
+++ b/ash/assistant/util/deep_link_util.h
@@ -14,15 +14,15 @@
 
 class GURL;
 
-namespace chromeos {
-namespace assistant {
-enum class AssistantEntryPoint;
+namespace chromeos::assistant {
 enum class AssistantQuerySource;
-}  // namespace assistant
-}  // namespace chromeos
+}
 
 namespace ash {
 namespace assistant {
+
+enum class AssistantEntryPoint;
+
 namespace util {
 
 // Enumeration of deep link types.
@@ -79,9 +79,8 @@
 // Returns a new deep link, having appended or replaced the entry point param
 // from the original |deep_link| with |entry_point|.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
-GURL AppendOrReplaceEntryPointParam(
-    const GURL& deep_link,
-    chromeos::assistant::AssistantEntryPoint entry_point);
+GURL AppendOrReplaceEntryPointParam(const GURL& deep_link,
+                                    AssistantEntryPoint entry_point);
 
 // Returns a new deep link, having appended or replaced the query source param
 // from the original |deep_link| with |query_source|.
@@ -135,9 +134,9 @@
 // desired parameter is not found or is not mappable to an Assistant entry
 // point, an empty value is returned.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
-absl::optional<chromeos::assistant::AssistantEntryPoint>
-GetDeepLinkParamAsEntryPoint(const std::map<std::string, std::string>& params,
-                             DeepLinkParam param);
+absl::optional<AssistantEntryPoint> GetDeepLinkParamAsEntryPoint(
+    const std::map<std::string, std::string>& params,
+    DeepLinkParam param);
 
 // Returns a specific GURL |param| from the given parameters. If the desired
 // parameter is not found, an absent value is returned.
diff --git a/ash/assistant/util/deep_link_util_unittest.cc b/ash/assistant/util/deep_link_util_unittest.cc
index 8e9c568..581ebf1 100644
--- a/ash/assistant/util/deep_link_util_unittest.cc
+++ b/ash/assistant/util/deep_link_util_unittest.cc
@@ -20,7 +20,6 @@
 namespace assistant {
 namespace util {
 
-using chromeos::assistant::AssistantEntryPoint;
 using chromeos::assistant::AssistantQuerySource;
 
 using DeepLinkUtilTest = AshTestBase;
diff --git a/ash/assistant/util/histogram_util.cc b/ash/assistant/util/histogram_util.cc
index a5ec4c69..011606a2 100644
--- a/ash/assistant/util/histogram_util.cc
+++ b/ash/assistant/util/histogram_util.cc
@@ -13,17 +13,15 @@
 namespace util {
 
 void IncrementAssistantQueryCountForEntryPoint(
-    chromeos::assistant::AssistantEntryPoint entry_point) {
+    AssistantEntryPoint entry_point) {
   UMA_HISTOGRAM_ENUMERATION("Assistant.QueryCountPerEntryPoint", entry_point);
 }
 
-void RecordAssistantEntryPoint(
-    chromeos::assistant::AssistantEntryPoint entry_point) {
+void RecordAssistantEntryPoint(AssistantEntryPoint entry_point) {
   UMA_HISTOGRAM_ENUMERATION("Assistant.EntryPoint", entry_point);
 }
 
-void RecordAssistantExitPoint(
-    chromeos::assistant::AssistantExitPoint exit_point) {
+void RecordAssistantExitPoint(AssistantExitPoint exit_point) {
   UMA_HISTOGRAM_ENUMERATION("Assistant.ExitPoint", exit_point);
 }
 
diff --git a/ash/assistant/util/histogram_util.h b/ash/assistant/util/histogram_util.h
index d7e9a634..44334135 100644
--- a/ash/assistant/util/histogram_util.h
+++ b/ash/assistant/util/histogram_util.h
@@ -17,18 +17,15 @@
 
 // Increment number of queries fired for each entry point.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
-void IncrementAssistantQueryCountForEntryPoint(
-    chromeos::assistant::AssistantEntryPoint entry_point);
+void IncrementAssistantQueryCountForEntryPoint(AssistantEntryPoint entry_point);
 
 // Record the entry point where Assistant UI becomes visible.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
-void RecordAssistantEntryPoint(
-    chromeos::assistant::AssistantEntryPoint entry_point);
+void RecordAssistantEntryPoint(AssistantEntryPoint entry_point);
 
 // Record the exit point where Assistant UI becomes invisible.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
-void RecordAssistantExitPoint(
-    chromeos::assistant::AssistantExitPoint exit_point);
+void RecordAssistantExitPoint(AssistantExitPoint exit_point);
 
 // Count the number of times buttons are clicked on Assistant UI.
 COMPONENT_EXPORT(ASSISTANT_UTIL)
diff --git a/ash/clipboard/clipboard_nudge.cc b/ash/clipboard/clipboard_nudge.cc
index 037acff..1908b7ac 100644
--- a/ash/clipboard/clipboard_nudge.cc
+++ b/ash/clipboard/clipboard_nudge.cc
@@ -51,8 +51,7 @@
 
 bool IsAssistantAvailable() {
   AssistantStateBase* state = AssistantState::Get();
-  return state->allowed_state() ==
-             chromeos::assistant::AssistantAllowedState::ALLOWED &&
+  return state->allowed_state() == assistant::AssistantAllowedState::ALLOWED &&
          state->settings_enabled().value_or(false);
 }
 
diff --git a/ash/components/arc/mojom/BUILD.gn b/ash/components/arc/mojom/BUILD.gn
index 6db8147..31b4e33b 100644
--- a/ash/components/arc/mojom/BUILD.gn
+++ b/ash/components/arc/mojom/BUILD.gn
@@ -237,7 +237,7 @@
       types = [
         {
           mojom = "arc.mojom.DeviceType"
-          cpp = "::chromeos::DeviceType"
+          cpp = "::ash::DeviceType"
         },
         {
           mojom = "arc.mojom.MountEvent"
diff --git a/ash/components/arc/net/arc_net_host_impl.cc b/ash/components/arc/net/arc_net_host_impl.cc
index fcdb1e8..9e065b30 100644
--- a/ash/components/arc/net/arc_net_host_impl.cc
+++ b/ash/components/arc/net/arc_net_host_impl.cc
@@ -863,7 +863,7 @@
   NET_LOG(USER) << __func__ << ":" << is_enabled;
   GetStateHandler()->SetTechnologyEnabled(
       ash::NetworkTypePattern::WiFi(), is_enabled,
-      chromeos::network_handler::ErrorCallback());
+      ash::network_handler::ErrorCallback());
   std::move(callback).Run(true);
 }
 
diff --git a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
index 1266a97..9dfd8b3 100644
--- a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
+++ b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
@@ -171,7 +171,7 @@
       l10n_util::GetStringUTF8(IDS_FILE_BROWSER_MY_FILES_ROOT_LABEL);
 
   // TODO(niwa): Add a new DeviceType enum value for MyFiles.
-  chromeos::DeviceType device_type = chromeos::DeviceType::DEVICE_TYPE_SD;
+  ash::DeviceType device_type = ash::DeviceType::kSD;
 
   // Conditionally set MyFiles to be visible for P and invisible for R. In R, we
   // use IsVisibleRead so this is not needed.
@@ -243,7 +243,7 @@
       DiskMountManager::GetInstance()->FindDiskBySourcePath(
           mount_info.source_path);
   std::string fs_uuid, device_label;
-  chromeos::DeviceType device_type = chromeos::DeviceType::DEVICE_TYPE_UNKNOWN;
+  ash::DeviceType device_type = ash::DeviceType::kUnknown;
   // There are several cases where disk can be null:
   // 1. The disk is removed physically before being ejected/unmounted.
   // 2. The disk is inserted, but then immediately removed physically. The
@@ -291,8 +291,8 @@
   }
 
   if (event == DiskMountManager::MountEvent::MOUNTING &&
-      (device_type == chromeos::DeviceType::DEVICE_TYPE_USB ||
-       device_type == chromeos::DeviceType::DEVICE_TYPE_SD)) {
+      (device_type == ash::DeviceType::kUSB ||
+       device_type == ash::DeviceType::kSD)) {
     // Record visibilities of the mounted devices only when they are removable
     // storages (e.g. USB sticks or SD cards).
     base::UmaHistogramBoolean("Arc.ExternalStorage.MountedMediaVisibility",
@@ -306,7 +306,7 @@
     const std::string& mount_path,
     const std::string& fs_uuid,
     const std::string& device_label,
-    chromeos::DeviceType device_type,
+    ash::DeviceType device_type,
     bool visible) {
   mojom::VolumeMounterInstance* volume_mounter_instance =
       ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->volume_mounter(),
diff --git a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h
index 87abced..9decf77 100644
--- a/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h
+++ b/ash/components/arc/volume_mounter/arc_volume_mounter_bridge.h
@@ -102,7 +102,7 @@
       const std::string& mount_path,
       const std::string& fs_uuid,
       const std::string& device_label,
-      chromeos::DeviceType device_type,
+      ash::DeviceType device_type,
       bool visible);
 
   bool IsVisibleToAndroidApps(const std::string& uuid) const;
diff --git a/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.cc b/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.cc
index c0ac521..c7ba06a 100644
--- a/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.cc
+++ b/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.cc
@@ -9,17 +9,17 @@
 namespace mojo {
 
 arc::mojom::DeviceType
-EnumTraits<arc::mojom::DeviceType, chromeos::DeviceType>::ToMojom(
-    chromeos::DeviceType device_type) {
+EnumTraits<arc::mojom::DeviceType, ash::DeviceType>::ToMojom(
+    ash::DeviceType device_type) {
   switch (device_type) {
-    case chromeos::DeviceType::DEVICE_TYPE_USB:
+    case ash::DeviceType::kUSB:
       return arc::mojom::DeviceType::DEVICE_TYPE_USB;
-    case chromeos::DeviceType::DEVICE_TYPE_SD:
+    case ash::DeviceType::kSD:
       return arc::mojom::DeviceType::DEVICE_TYPE_SD;
-    case chromeos::DeviceType::DEVICE_TYPE_UNKNOWN:
-    case chromeos::DeviceType::DEVICE_TYPE_OPTICAL_DISC:
-    case chromeos::DeviceType::DEVICE_TYPE_MOBILE:
-    case chromeos::DeviceType::DEVICE_TYPE_DVD:
+    case ash::DeviceType::kUnknown:
+    case ash::DeviceType::kOpticalDisc:
+    case ash::DeviceType::kMobile:
+    case ash::DeviceType::kDVD:
       // Android doesn't recognize this device natively. So, propagating
       // UNKNOWN and let Android decides how to handle this.
       return arc::mojom::DeviceType::DEVICE_TYPE_UNKNOWN;
@@ -28,18 +28,18 @@
   return arc::mojom::DeviceType::DEVICE_TYPE_UNKNOWN;
 }
 
-bool EnumTraits<arc::mojom::DeviceType, chromeos::DeviceType>::FromMojom(
+bool EnumTraits<arc::mojom::DeviceType, ash::DeviceType>::FromMojom(
     arc::mojom::DeviceType input,
-    chromeos::DeviceType* out) {
+    ash::DeviceType* out) {
   switch (input) {
     case arc::mojom::DeviceType::DEVICE_TYPE_USB:
-      *out = chromeos::DeviceType::DEVICE_TYPE_USB;
+      *out = ash::DeviceType::kUSB;
       return true;
     case arc::mojom::DeviceType::DEVICE_TYPE_SD:
-      *out = chromeos::DeviceType::DEVICE_TYPE_SD;
+      *out = ash::DeviceType::kSD;
       return true;
     case arc::mojom::DeviceType::DEVICE_TYPE_UNKNOWN:
-      *out = chromeos::DeviceType::DEVICE_TYPE_UNKNOWN;
+      *out = ash::DeviceType::kUnknown;
       return true;
   }
   NOTREACHED();
diff --git a/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.h b/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.h
index 773ccf48..d5ae5d3 100644
--- a/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.h
+++ b/ash/components/arc/volume_mounter/volume_mounter_mojom_traits.h
@@ -11,10 +11,9 @@
 namespace mojo {
 
 template <>
-struct EnumTraits<arc::mojom::DeviceType, chromeos::DeviceType> {
-  static arc::mojom::DeviceType ToMojom(chromeos::DeviceType device_type);
-  static bool FromMojom(arc::mojom::DeviceType input,
-                        chromeos::DeviceType* out);
+struct EnumTraits<arc::mojom::DeviceType, ash::DeviceType> {
+  static arc::mojom::DeviceType ToMojom(ash::DeviceType device_type);
+  static bool FromMojom(arc::mojom::DeviceType input, ash::DeviceType* out);
 };
 
 template <>
diff --git a/ash/components/disks/disk.h b/ash/components/disks/disk.h
index 61f93a6..fe63f5a 100644
--- a/ash/components/disks/disk.h
+++ b/ash/components/disks/disk.h
@@ -159,7 +159,7 @@
   std::string product_name_;
   std::string fs_uuid_;
   std::string storage_device_path_;
-  DeviceType device_type_ = DEVICE_TYPE_UNKNOWN;
+  DeviceType device_type_ = DeviceType::kUnknown;
   int bus_number_ = 0;
   int device_number_ = 0;
   uint64_t total_size_in_bytes_ = 0;
diff --git a/ash/components/disks/disk_mount_manager.cc b/ash/components/disks/disk_mount_manager.cc
index 359297e..ed3168e 100644
--- a/ash/components/disks/disk_mount_manager.cc
+++ b/ash/components/disks/disk_mount_manager.cc
@@ -1094,13 +1094,13 @@
 // static
 std::string DiskMountManager::DeviceTypeToString(DeviceType type) {
   switch (type) {
-    case DEVICE_TYPE_USB:
+    case DeviceType::kUSB:
       return "usb";
-    case DEVICE_TYPE_SD:
+    case DeviceType::kSD:
       return "sd";
-    case DEVICE_TYPE_OPTICAL_DISC:
+    case DeviceType::kOpticalDisc:
       return "optical";
-    case DEVICE_TYPE_MOBILE:
+    case DeviceType::kMobile:
       return "mobile";
     default:
       return "unknown";
diff --git a/ash/components/disks/disk_mount_manager_unittest.cc b/ash/components/disks/disk_mount_manager_unittest.cc
index 2b00271..a87370ae 100644
--- a/ash/components/disks/disk_mount_manager_unittest.cc
+++ b/ash/components/disks/disk_mount_manager_unittest.cc
@@ -63,7 +63,7 @@
   const char* product_name;
   const char* fs_uuid;
   const char* storage_device_path;
-  chromeos::DeviceType device_type;
+  DeviceType device_type;
   uint64_t size_in_bytes;
   bool is_read_only;
   const char* file_system_type;
@@ -92,7 +92,7 @@
         "/device/product_name",
         "/device/fs_uuid",
         "/device/prefix",
-        chromeos::DEVICE_TYPE_USB,
+        DeviceType::kUSB,
         1073741824,  // size in bytes
         false,       // is read only
         kFileSystemType1,
@@ -110,7 +110,7 @@
         "/device/product_name2",
         "/device/fs_uuid2",
         "/device/prefix2",
-        chromeos::DEVICE_TYPE_SD,
+        DeviceType::kSD,
         1073741824,  // size in bytes
         false,       // is read only
         kFileSystemType2,
@@ -128,7 +128,7 @@
         "/device/product_name_3",
         "/device/fs_uuid_3",
         "/device/prefix",
-        chromeos::DEVICE_TYPE_USB,
+        DeviceType::kUSB,
         1073741824,  // size in bytes
         true,        // is read only
         kFileSystemType2,
diff --git a/ash/components/disks/disk_unittest.cc b/ash/components/disks/disk_unittest.cc
index d49718e..7d02a24 100644
--- a/ash/components/disks/disk_unittest.cc
+++ b/ash/components/disks/disk_unittest.cc
@@ -146,7 +146,7 @@
   EXPECT_EQ(kBusNumber, disk.bus_number());
   EXPECT_EQ(kDeviceNumber, disk.device_number());
   EXPECT_EQ(kDeviceSize, disk.total_size_in_bytes());
-  EXPECT_EQ(DEVICE_TYPE_SD, disk.device_type());
+  EXPECT_EQ(DeviceType::kSD, disk.device_type());
   EXPECT_EQ(kStorageDevicePath, disk.storage_device_path());
   EXPECT_EQ(kBaseMountpath, disk.base_mount_path());
   EXPECT_FALSE(disk.is_parent());
diff --git a/ash/components/disks/mock_disk_mount_manager.cc b/ash/components/disks/mock_disk_mount_manager.cc
index 3244101..a110727 100644
--- a/ash/components/disks/mock_disk_mount_manager.cc
+++ b/ash/components/disks/mock_disk_mount_manager.cc
@@ -83,7 +83,7 @@
 
 void MockDiskMountManager::NotifyDeviceInsertEvents() {
   std::unique_ptr<Disk> disk1_ptr = MakeDiskBuilder()
-                                        ->SetDeviceType(DEVICE_TYPE_USB)
+                                        ->SetDeviceType(DeviceType::kUSB)
                                         .SetSizeInBytes(4294967295U)
                                         .Build();
   Disk* disk1 = disk1_ptr.get();
@@ -100,7 +100,7 @@
   // Disk Changed
   std::unique_ptr<Disk> disk2_ptr = MakeDiskBuilder()
                                         ->SetMountPath(kTestMountPath)
-                                        .SetDeviceType(DEVICE_TYPE_MOBILE)
+                                        .SetDeviceType(DeviceType::kMobile)
                                         .SetSizeInBytes(1073741824)
                                         .Build();
   Disk* disk2 = disk2_ptr.get();
@@ -113,7 +113,7 @@
   std::unique_ptr<Disk> disk_ptr = MakeDiskBuilder()
                                        ->SetMountPath(kTestMountPath)
                                        .SetDeviceLabel(kTestDeviceLabel)
-                                       .SetDeviceType(DEVICE_TYPE_SD)
+                                       .SetDeviceType(DeviceType::kSD)
                                        .SetSizeInBytes(1073741824)
                                        .Build();
   Disk* disk = disk_ptr.get();
diff --git a/ash/components/disks/suspend_unmount_manager.cc b/ash/components/disks/suspend_unmount_manager.cc
index 3fa2402..812d0b1 100644
--- a/ash/components/disks/suspend_unmount_manager.cc
+++ b/ash/components/disks/suspend_unmount_manager.cc
@@ -40,8 +40,8 @@
     return;
   std::set<std::string> mount_paths;
   for (const auto& pair : disk_mount_manager_->disks()) {
-    if ((pair.second->device_type() == DEVICE_TYPE_USB ||
-         pair.second->device_type() == DEVICE_TYPE_SD) &&
+    if ((pair.second->device_type() == DeviceType::kUSB ||
+         pair.second->device_type() == DeviceType::kSD) &&
         !pair.second->mount_path().empty()) {
       mount_paths.insert(pair.second->mount_path());
     }
diff --git a/ash/components/disks/suspend_unmount_manager_unittest.cc b/ash/components/disks/suspend_unmount_manager_unittest.cc
index 3041d6d..53e0d2f 100644
--- a/ash/components/disks/suspend_unmount_manager_unittest.cc
+++ b/ash/components/disks/suspend_unmount_manager_unittest.cc
@@ -76,23 +76,21 @@
       DiskMountManager::MountPointInfo("/dummy/device/usb", kDummyMountPathUsb,
                                        MountType::kDevice,
                                        MOUNT_CONDITION_NONE),
-      kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_USB,
-      1024 * 1024, false /* is_parent */, false /* has_media */,
-      false /* on_boot_device */, true /* on_removable_device */,
-      kFileSystemType);
+      kDeviceId, kDeviceLabel, kVendor, kProduct, DeviceType::kUSB, 1024 * 1024,
+      false /* is_parent */, false /* has_media */, false /* on_boot_device */,
+      true /* on_removable_device */, kFileSystemType);
   disk_mount_manager_.CreateDiskEntryForMountDevice(
       DiskMountManager::MountPointInfo("/dummy/device/sd", kDummyMountPathSd,
                                        MountType::kDevice,
                                        MOUNT_CONDITION_NONE),
-      kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_SD,
-      1024 * 1024, false /* is_parent */, false /* has_media */,
-      false /* on_boot_device */, true /* on_removable_device */,
-      kFileSystemType);
+      kDeviceId, kDeviceLabel, kVendor, kProduct, DeviceType::kSD, 1024 * 1024,
+      false /* is_parent */, false /* has_media */, false /* on_boot_device */,
+      true /* on_removable_device */, kFileSystemType);
   disk_mount_manager_.CreateDiskEntryForMountDevice(
       DiskMountManager::MountPointInfo(
           "/dummy/device/unknown", kDummyMountPathUnknown, MountType::kDevice,
           MOUNT_CONDITION_NONE),
-      kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_UNKNOWN,
+      kDeviceId, kDeviceLabel, kVendor, kProduct, DeviceType::kUnknown,
       1024 * 1024, false /* is_parent */, false /* has_media */,
       false /* on_boot_device */, true /* on_removable_device */,
       kFileSystemType);
@@ -125,10 +123,9 @@
       DiskMountManager::MountPointInfo("/dummy/device", kDummyMountPath,
                                        MountType::kDevice,
                                        MOUNT_CONDITION_NONE),
-      kDeviceId, kDeviceLabel, kVendor, kProduct, chromeos::DEVICE_TYPE_USB,
-      1024 * 1024, false /* is_parent */, false /* has_media */,
-      false /* on_boot_device */, true /* on_removable_device */,
-      kFileSystemType);
+      kDeviceId, kDeviceLabel, kVendor, kProduct, DeviceType::kUSB, 1024 * 1024,
+      false /* is_parent */, false /* has_media */, false /* on_boot_device */,
+      true /* on_removable_device */, kFileSystemType);
   disk_mount_manager_.SetupDefaultReplies();
   FakePowerManagerClient::Get()->SendSuspendImminent(
       power_manager::SuspendImminent_Reason_OTHER);
diff --git a/ash/components/phonehub/OWNERS b/ash/components/phonehub/OWNERS
index b44251a0..0fec703 100644
--- a/ash/components/phonehub/OWNERS
+++ b/ash/components/phonehub/OWNERS
@@ -1,3 +1,6 @@
 hansberry@chromium.org
 jonmann@chromium.org
 khorimoto@chromium.org
+
+# For Eche
+dhnishi@chromium.org
diff --git a/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.cc b/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.cc
index b506293..f18b6525 100644
--- a/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.cc
+++ b/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.cc
@@ -73,10 +73,10 @@
 }
 
 bool ProximityAuthLocalStatePrefManager::IsEasyUnlockAllowed() const {
-  const base::Value* user_prefs = GetActiveUserPrefsDictionary();
+  const base::Value::Dict* user_prefs = GetActiveUserPrefsDictionary();
   if (user_prefs) {
-    absl::optional<bool> pref_value = user_prefs->FindBoolKey(
-        ash::multidevice_setup::kSmartLockAllowedPrefName);
+    absl::optional<bool> pref_value =
+        user_prefs->FindBool(ash::multidevice_setup::kSmartLockAllowedPrefName);
     if (pref_value.has_value()) {
       return pref_value.value();
     }
@@ -86,10 +86,10 @@
 }
 
 bool ProximityAuthLocalStatePrefManager::IsEasyUnlockEnabled() const {
-  const base::Value* user_prefs = GetActiveUserPrefsDictionary();
+  const base::Value::Dict* user_prefs = GetActiveUserPrefsDictionary();
   if (user_prefs) {
-    absl::optional<bool> pref_value = user_prefs->FindBoolKey(
-        ash::multidevice_setup::kSmartLockEnabledPrefName);
+    absl::optional<bool> pref_value =
+        user_prefs->FindBool(ash::multidevice_setup::kSmartLockEnabledPrefName);
     if (pref_value.has_value()) {
       return pref_value.value();
     }
@@ -104,9 +104,9 @@
 }
 
 bool ProximityAuthLocalStatePrefManager::IsChromeOSLoginAllowed() const {
-  const base::Value* user_prefs = GetActiveUserPrefsDictionary();
+  const base::Value::Dict* user_prefs = GetActiveUserPrefsDictionary();
   if (user_prefs) {
-    absl::optional<bool> pref_value = user_prefs->FindBoolKey(
+    absl::optional<bool> pref_value = user_prefs->FindBool(
         ash::multidevice_setup::kSmartLockSigninAllowedPrefName);
     if (pref_value.has_value()) {
       return pref_value.value();
@@ -122,10 +122,10 @@
 }
 
 bool ProximityAuthLocalStatePrefManager::IsChromeOSLoginEnabled() const {
-  const base::Value* user_prefs = GetActiveUserPrefsDictionary();
+  const base::Value::Dict* user_prefs = GetActiveUserPrefsDictionary();
   if (user_prefs) {
     absl::optional<bool> pref_value =
-        user_prefs->FindBoolKey(prefs::kProximityAuthIsChromeOSLoginEnabled);
+        user_prefs->FindBool(prefs::kProximityAuthIsChromeOSLoginEnabled);
     if (pref_value.has_value()) {
       return pref_value.value();
     }
@@ -157,28 +157,26 @@
 }
 
 bool ProximityAuthLocalStatePrefManager::HasShownLoginDisabledMessage() const {
-  const base::Value* user_prefs = GetActiveUserPrefsDictionary();
+  const base::Value::Dict* user_prefs = GetActiveUserPrefsDictionary();
   if (!user_prefs)
     return false;
 
-  return user_prefs
-      ->FindBoolKey(prefs::kProximityAuthHasShownLoginDisabledMessage)
+  return user_prefs->FindBool(prefs::kProximityAuthHasShownLoginDisabledMessage)
       .value_or(false);
 }
 
-const base::Value*
+const base::Value::Dict*
 ProximityAuthLocalStatePrefManager::GetActiveUserPrefsDictionary() const {
   if (!active_user_.is_valid()) {
     PA_LOG(ERROR) << "No active account.";
     return nullptr;
   }
 
-  const base::Value* all_user_prefs_dict =
-      local_state_->GetDictionary(prefs::kEasyUnlockLocalStateUserPrefs);
-  DCHECK(all_user_prefs_dict);
+  const base::Value::Dict& all_user_prefs_dict =
+      local_state_->GetValueDict(prefs::kEasyUnlockLocalStateUserPrefs);
 
-  const base::Value* current_user_prefs =
-      all_user_prefs_dict->FindDictKey(active_user_.GetUserEmail());
+  const base::Value::Dict* current_user_prefs =
+      all_user_prefs_dict.FindDict(active_user_.GetUserEmail());
   if (!current_user_prefs) {
     PA_LOG(ERROR) << "Failed to find prefs for current user.";
     return nullptr;
diff --git a/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.h b/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.h
index a340d4bf..e068c9b0 100644
--- a/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.h
+++ b/ash/components/proximity_auth/proximity_auth_local_state_pref_manager.h
@@ -6,15 +6,12 @@
 #define ASH_COMPONENTS_PROXIMITY_AUTH_PROXIMITY_AUTH_LOCAL_STATE_PREF_MANAGER_H_
 
 #include "ash/components/proximity_auth/proximity_auth_pref_manager.h"
+#include "base/values.h"
 #include "components/account_id/account_id.h"
 
 class PrefRegistrySimple;
 class PrefService;
 
-namespace base {
-class Value;
-}  // namespace base
-
 namespace proximity_auth {
 
 // Implementation of ProximityAuthPrefManager based on the device's local state,
@@ -61,7 +58,7 @@
   void SetHasShownLoginDisabledMessage(bool has_shown) override;
   bool HasShownLoginDisabledMessage() const override;
 
-  const base::Value* GetActiveUserPrefsDictionary() const;
+  const base::Value::Dict* GetActiveUserPrefsDictionary() const;
 
   // Contains local state preferences that outlive the lifetime of this object
   // and across process restarts. Not owned and must outlive this instance.
diff --git a/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc b/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc
index f596bce..32d45d3 100644
--- a/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc
+++ b/ash/components/proximity_auth/proximity_auth_profile_pref_manager.cc
@@ -177,21 +177,17 @@
 }
 
 bool ProximityAuthProfilePrefManager::HasShownLoginDisabledMessage() const {
-  const base::Value* all_user_prefs_dict =
-      local_state_->GetDictionary(prefs::kEasyUnlockLocalStateUserPrefs);
-  if (!all_user_prefs_dict) {
-    PA_LOG(ERROR) << "Failed to find local state prefs for current user.";
-    return false;
-  }
-  const base::Value* current_user_prefs =
-      all_user_prefs_dict->FindDictKey(account_id_.GetUserEmail());
+  const base::Value::Dict& all_user_prefs_dict =
+      local_state_->GetValueDict(prefs::kEasyUnlockLocalStateUserPrefs);
+  const base::Value::Dict* current_user_prefs =
+      all_user_prefs_dict.FindDict(account_id_.GetUserEmail());
   if (!current_user_prefs) {
     PA_LOG(ERROR) << "Failed to find local state prefs for current user.";
     return false;
   }
 
   return current_user_prefs
-      ->FindBoolKey(prefs::kProximityAuthHasShownLoginDisabledMessage)
+      ->FindBool(prefs::kProximityAuthHasShownLoginDisabledMessage)
       .value_or(false);
 }
 
diff --git a/ash/components/tether/tether_network_disconnection_handler_unittest.cc b/ash/components/tether/tether_network_disconnection_handler_unittest.cc
index 4f24919..da083cd 100644
--- a/ash/components/tether/tether_network_disconnection_handler_unittest.cc
+++ b/ash/components/tether/tether_network_disconnection_handler_unittest.cc
@@ -90,8 +90,7 @@
 
   void SetWiFiTechnologyStateEnabled(bool enabled) {
     helper_.network_state_handler()->SetTechnologyEnabled(
-        NetworkTypePattern::WiFi(), enabled,
-        chromeos::network_handler::ErrorCallback());
+        NetworkTypePattern::WiFi(), enabled, network_handler::ErrorCallback());
     base::RunLoop().RunUntilIdle();
   }
 
diff --git a/ash/components/tether/wifi_hotspot_connector_unittest.cc b/ash/components/tether/wifi_hotspot_connector_unittest.cc
index 86d86f72..d809c1c 100644
--- a/ash/components/tether/wifi_hotspot_connector_unittest.cc
+++ b/ash/components/tether/wifi_hotspot_connector_unittest.cc
@@ -259,7 +259,7 @@
         NetworkStateHandler::TechnologyState::TECHNOLOGY_ENABLED);
     helper_.network_state_handler()->SetTechnologyEnabled(
         NetworkTypePattern::WiFi(), true /* enabled */,
-        chromeos::network_handler::ErrorCallback());
+        network_handler::ErrorCallback());
     base::RunLoop().RunUntilIdle();
 
     SetUpShillState();
@@ -725,7 +725,7 @@
 TEST_F(WifiHotspotConnectorTest, TestConnect_WifiDisabled_Success) {
   network_state_handler()->SetTechnologyEnabled(
       NetworkTypePattern::WiFi(), false /* enabled */,
-      chromeos::network_handler::ErrorCallback());
+      network_handler::ErrorCallback());
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(
       network_state_handler()->IsTechnologyEnabled(NetworkTypePattern::WiFi()));
@@ -778,7 +778,7 @@
        TestConnect_WifiDisabled_Success_OtherDeviceStatesChange) {
   network_state_handler()->SetTechnologyEnabled(
       NetworkTypePattern::WiFi(), false /* enabled */,
-      chromeos::network_handler::ErrorCallback());
+      network_handler::ErrorCallback());
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(
       network_state_handler()->IsTechnologyEnabled(NetworkTypePattern::WiFi()));
@@ -836,7 +836,7 @@
 TEST_F(WifiHotspotConnectorTest, TestConnect_WifiDisabled_AttemptTimesOut) {
   network_state_handler()->SetTechnologyEnabled(
       NetworkTypePattern::WiFi(), false /* enabled */,
-      chromeos::network_handler::ErrorCallback());
+      network_handler::ErrorCallback());
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(
       network_state_handler()->IsTechnologyEnabled(NetworkTypePattern::WiFi()));
@@ -871,7 +871,7 @@
        TestConnect_WifiDisabled_SecondConnectionWhileWaitingForWifiEnabled) {
   network_state_handler()->SetTechnologyEnabled(
       NetworkTypePattern::WiFi(), false /* enabled */,
-      chromeos::network_handler::ErrorCallback());
+      network_handler::ErrorCallback());
   base::RunLoop().RunUntilIdle();
   EXPECT_FALSE(
       network_state_handler()->IsTechnologyEnabled(NetworkTypePattern::WiFi()));
diff --git a/ash/controls/contextual_tooltip.cc b/ash/controls/contextual_tooltip.cc
index 8fe7aa1..05017cd 100644
--- a/ash/controls/contextual_tooltip.cc
+++ b/ash/controls/contextual_tooltip.cc
@@ -72,8 +72,8 @@
 
 base::Time GetLastShownTime(PrefService* prefs, TooltipType type) {
   const base::Value* last_shown_time =
-      prefs->GetDictionary(prefs::kContextualTooltips)
-          ->FindPath(GetPath(type, kLastTimeShown));
+      prefs->GetValueDict(prefs::kContextualTooltips)
+          .FindByDottedPath(GetPath(type, kLastTimeShown));
   if (!last_shown_time)
     return base::Time();
   return *base::ValueToTime(last_shown_time);
@@ -81,8 +81,8 @@
 
 int GetSuccessCount(PrefService* prefs, TooltipType type) {
   absl::optional<int> success_count =
-      prefs->GetDictionary(prefs::kContextualTooltips)
-          ->FindIntPath(GetPath(type, kSuccessCount));
+      prefs->GetValueDict(prefs::kContextualTooltips)
+          .FindIntByDottedPath(GetPath(type, kSuccessCount));
   return success_count.value_or(0);
 }
 
@@ -210,8 +210,8 @@
 
 int GetShownCount(PrefService* prefs, TooltipType type) {
   absl::optional<int> shown_count =
-      prefs->GetDictionary(prefs::kContextualTooltips)
-          ->FindIntPath(GetPath(type, kShownCount));
+      prefs->GetValueDict(prefs::kContextualTooltips)
+          .FindIntByDottedPath(GetPath(type, kShownCount));
   return shown_count.value_or(0);
 }
 
diff --git a/ash/public/cpp/assistant/assistant_state.cc b/ash/public/cpp/assistant/assistant_state.cc
index 468e50e..3d328f8 100644
--- a/ash/public/cpp/assistant/assistant_state.cc
+++ b/ash/public/cpp/assistant/assistant_state.cc
@@ -35,8 +35,7 @@
   g_assistant_state = nullptr;
 }
 
-void AssistantState::NotifyStatusChanged(
-    chromeos::assistant::AssistantStatus status) {
+void AssistantState::NotifyStatusChanged(assistant::AssistantStatus status) {
   if (assistant_status_ == status)
     return;
 
@@ -44,7 +43,7 @@
 }
 
 void AssistantState::NotifyFeatureAllowed(
-    chromeos::assistant::AssistantAllowedState state) {
+    assistant::AssistantAllowedState state) {
   if (allowed_state_ == state)
     return;
 
diff --git a/ash/public/cpp/assistant/assistant_state.h b/ash/public/cpp/assistant/assistant_state.h
index e6cd429..3d8ede5 100644
--- a/ash/public/cpp/assistant/assistant_state.h
+++ b/ash/public/cpp/assistant/assistant_state.h
@@ -28,8 +28,8 @@
 
   ~AssistantState() override;
 
-  void NotifyStatusChanged(chromeos::assistant::AssistantStatus status);
-  void NotifyFeatureAllowed(chromeos::assistant::AssistantAllowedState state);
+  void NotifyStatusChanged(assistant::AssistantStatus status);
+  void NotifyFeatureAllowed(assistant::AssistantAllowedState state);
   void NotifyLocaleChanged(const std::string& locale);
   void NotifyArcPlayStoreEnabledChanged(bool enabled);
   void NotifyLockedFullScreenStateChanged(bool enabled);
diff --git a/ash/public/cpp/assistant/assistant_state_base.cc b/ash/public/cpp/assistant/assistant_state_base.cc
index b9ac426d..f9c0c37 100644
--- a/ash/public/cpp/assistant/assistant_state_base.cc
+++ b/ash/public/cpp/assistant/assistant_state_base.cc
@@ -19,7 +19,7 @@
 
 namespace {
 
-using chromeos::assistant::prefs::AssistantOnboardingMode;
+using assistant::prefs::AssistantOnboardingMode;
 
 #define PRINT_VALUE(value) PrintValue(&result, #value, value())
 
@@ -87,35 +87,35 @@
   pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
   pref_change_registrar_->Init(pref_service);
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantConsentStatus,
+      assistant::prefs::kAssistantConsentStatus,
       base::BindRepeating(&AssistantStateBase::UpdateConsentStatus,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantContextEnabled,
+      assistant::prefs::kAssistantContextEnabled,
       base::BindRepeating(&AssistantStateBase::UpdateContextEnabled,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantEnabled,
+      assistant::prefs::kAssistantEnabled,
       base::BindRepeating(&AssistantStateBase::UpdateSettingsEnabled,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantHotwordAlwaysOn,
+      assistant::prefs::kAssistantHotwordAlwaysOn,
       base::BindRepeating(&AssistantStateBase::UpdateHotwordAlwaysOn,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantHotwordEnabled,
+      assistant::prefs::kAssistantHotwordEnabled,
       base::BindRepeating(&AssistantStateBase::UpdateHotwordEnabled,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantLaunchWithMicOpen,
+      assistant::prefs::kAssistantLaunchWithMicOpen,
       base::BindRepeating(&AssistantStateBase::UpdateLaunchWithMicOpen,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantNotificationEnabled,
+      assistant::prefs::kAssistantNotificationEnabled,
       base::BindRepeating(&AssistantStateBase::UpdateNotificationEnabled,
                           base::Unretained(this)));
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantOnboardingMode,
+      assistant::prefs::kAssistantOnboardingMode,
       base::BindRepeating(&AssistantStateBase::UpdateOnboardingMode,
                           base::Unretained(this)));
 
@@ -130,8 +130,7 @@
 }
 
 bool AssistantStateBase::IsScreenContextAllowed() const {
-  return allowed_state() ==
-             chromeos::assistant::AssistantAllowedState::ALLOWED &&
+  return allowed_state() == assistant::AssistantAllowedState::ALLOWED &&
          settings_enabled().value_or(false) &&
          context_enabled().value_or(false);
 }
@@ -175,7 +174,7 @@
 
 void AssistantStateBase::UpdateConsentStatus() {
   auto consent_status = pref_change_registrar_->prefs()->GetInteger(
-      chromeos::assistant::prefs::kAssistantConsentStatus);
+      assistant::prefs::kAssistantConsentStatus);
   if (consent_status_.has_value() &&
       consent_status_.value() == consent_status) {
     return;
@@ -187,7 +186,7 @@
 
 void AssistantStateBase::UpdateContextEnabled() {
   auto context_enabled = pref_change_registrar_->prefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantContextEnabled);
+      assistant::prefs::kAssistantContextEnabled);
   if (context_enabled_.has_value() &&
       context_enabled_.value() == context_enabled) {
     return;
@@ -199,7 +198,7 @@
 
 void AssistantStateBase::UpdateSettingsEnabled() {
   auto settings_enabled = pref_change_registrar_->prefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantEnabled);
+      assistant::prefs::kAssistantEnabled);
   if (settings_enabled_.has_value() &&
       settings_enabled_.value() == settings_enabled) {
     return;
@@ -211,7 +210,7 @@
 
 void AssistantStateBase::UpdateHotwordAlwaysOn() {
   auto hotword_always_on = pref_change_registrar_->prefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantHotwordAlwaysOn);
+      assistant::prefs::kAssistantHotwordAlwaysOn);
   if (hotword_always_on_.has_value() &&
       hotword_always_on_.value() == hotword_always_on) {
     return;
@@ -223,7 +222,7 @@
 
 void AssistantStateBase::UpdateHotwordEnabled() {
   auto hotword_enabled = pref_change_registrar_->prefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantHotwordEnabled);
+      assistant::prefs::kAssistantHotwordEnabled);
   if (hotword_enabled_.has_value() &&
       hotword_enabled_.value() == hotword_enabled) {
     return;
@@ -235,7 +234,7 @@
 
 void AssistantStateBase::UpdateLaunchWithMicOpen() {
   auto launch_with_mic_open = pref_change_registrar_->prefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantLaunchWithMicOpen);
+      assistant::prefs::kAssistantLaunchWithMicOpen);
   if (launch_with_mic_open_.has_value() &&
       launch_with_mic_open_.value() == launch_with_mic_open) {
     return;
@@ -247,7 +246,7 @@
 
 void AssistantStateBase::UpdateNotificationEnabled() {
   auto notification_enabled = pref_change_registrar_->prefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantNotificationEnabled);
+      assistant::prefs::kAssistantNotificationEnabled);
   if (notification_enabled_.has_value() &&
       notification_enabled_.value() == notification_enabled) {
     return;
@@ -258,10 +257,9 @@
 }
 
 void AssistantStateBase::UpdateOnboardingMode() {
-  AssistantOnboardingMode onboarding_mode =
-      chromeos::assistant::prefs::ToOnboardingMode(
-          pref_change_registrar_->prefs()->GetString(
-              chromeos::assistant::prefs::kAssistantOnboardingMode));
+  AssistantOnboardingMode onboarding_mode = assistant::prefs::ToOnboardingMode(
+      pref_change_registrar_->prefs()->GetString(
+          assistant::prefs::kAssistantOnboardingMode));
 
   if (onboarding_mode_ == onboarding_mode)
     return;
@@ -272,14 +270,14 @@
 }
 
 void AssistantStateBase::UpdateAssistantStatus(
-    chromeos::assistant::AssistantStatus status) {
+    assistant::AssistantStatus status) {
   assistant_status_ = status;
   for (auto& observer : observers_)
     observer.OnAssistantStatusChanged(assistant_status_);
 }
 
 void AssistantStateBase::UpdateFeatureAllowedState(
-    chromeos::assistant::AssistantAllowedState state) {
+    assistant::AssistantAllowedState state) {
   allowed_state_ = state;
   for (auto& observer : observers_)
     observer.OnAssistantFeatureAllowedChanged(allowed_state_.value());
diff --git a/ash/public/cpp/assistant/assistant_state_base.h b/ash/public/cpp/assistant/assistant_state_base.h
index fa60383..8e26638 100644
--- a/ash/public/cpp/assistant/assistant_state_base.h
+++ b/ash/public/cpp/assistant/assistant_state_base.h
@@ -38,12 +38,11 @@
   virtual void OnAssistantLaunchWithMicOpen(bool launch_with_mic_open) {}
   virtual void OnAssistantNotificationEnabled(bool notification_enabled) {}
   virtual void OnAssistantOnboardingModeChanged(
-      chromeos::assistant::prefs::AssistantOnboardingMode onboarding_mode) {}
+      assistant::prefs::AssistantOnboardingMode onboarding_mode) {}
   virtual void OnAssistantStateDestroyed() {}
-  virtual void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) {}
+  virtual void OnAssistantStatusChanged(assistant::AssistantStatus status) {}
   virtual void OnAssistantFeatureAllowedChanged(
-      chromeos::assistant::AssistantAllowedState state) {}
+      assistant::AssistantAllowedState state) {}
   virtual void OnArcPlayStoreEnabledChanged(bool enabled) {}
   virtual void OnLocaleChanged(const std::string& locale) {}
   virtual void OnLockedFullScreenStateChanged(bool enabled) {}
@@ -63,7 +62,7 @@
 
   virtual ~AssistantStateBase();
 
-  chromeos::assistant::AssistantStatus assistant_status() const {
+  assistant::AssistantStatus assistant_status() const {
     return assistant_status_;
   }
 
@@ -93,13 +92,13 @@
     return notification_enabled_;
   }
 
-  const absl::optional<chromeos::assistant::prefs::AssistantOnboardingMode>&
+  const absl::optional<assistant::prefs::AssistantOnboardingMode>&
   onboarding_mode() const {
     return onboarding_mode_;
   }
 
-  const absl::optional<chromeos::assistant::AssistantAllowedState>&
-  allowed_state() const {
+  const absl::optional<assistant::AssistantAllowedState>& allowed_state()
+      const {
     return allowed_state_;
   }
 
@@ -138,15 +137,14 @@
   void UpdateOnboardingMode();
 
   // Called when new values of the listened states are received.
-  void UpdateAssistantStatus(chromeos::assistant::AssistantStatus status);
-  void UpdateFeatureAllowedState(
-      chromeos::assistant::AssistantAllowedState state);
+  void UpdateAssistantStatus(assistant::AssistantStatus status);
+  void UpdateFeatureAllowedState(assistant::AssistantAllowedState state);
   void UpdateLocale(const std::string& locale);
   void UpdateArcPlayStoreEnabled(bool enabled);
   void UpdateLockedFullScreenState(bool enabled);
 
-  chromeos::assistant::AssistantStatus assistant_status_ =
-      chromeos::assistant::AssistantStatus::NOT_READY;
+  assistant::AssistantStatus assistant_status_ =
+      assistant::AssistantStatus::NOT_READY;
 
   // TODO(b/138679823): Maybe remove Optional for preference values.
   // Whether the Assistant is enabled in system settings. nullopt if the
@@ -174,12 +172,11 @@
   absl::optional<bool> notification_enabled_;
 
   // The mode for the Assistant onboarding experience.
-  absl::optional<chromeos::assistant::prefs::AssistantOnboardingMode>
-      onboarding_mode_;
+  absl::optional<assistant::prefs::AssistantOnboardingMode> onboarding_mode_;
 
   // Whether the Assistant feature is allowed or disallowed for what reason.
   // nullopt if the data is not available yet.
-  absl::optional<chromeos::assistant::AssistantAllowedState> allowed_state_;
+  absl::optional<assistant::AssistantAllowedState> allowed_state_;
 
   absl::optional<std::string> locale_;
 
diff --git a/ash/public/cpp/assistant/controller/assistant_controller.h b/ash/public/cpp/assistant/controller/assistant_controller.h
index 9c611a76..a396bcb 100644
--- a/ash/public/cpp/assistant/controller/assistant_controller.h
+++ b/ash/public/cpp/assistant/controller/assistant_controller.h
@@ -40,7 +40,7 @@
   virtual base::WeakPtr<AssistantController> GetWeakPtr() = 0;
 
   // Provides a reference to the underlying |assistant| service.
-  virtual void SetAssistant(chromeos::assistant::Assistant* assistant) = 0;
+  virtual void SetAssistant(assistant::Assistant* assistant) = 0;
 
   // Methods below may only be called after |SetAssistant| is called.
   // Show speaker id enrollment flow.
diff --git a/ash/public/cpp/assistant/controller/assistant_ui_controller.h b/ash/public/cpp/assistant/controller/assistant_ui_controller.h
index 1100a5a..c62a622 100644
--- a/ash/public/cpp/assistant/controller/assistant_ui_controller.h
+++ b/ash/public/cpp/assistant/controller/assistant_ui_controller.h
@@ -9,14 +9,12 @@
 #include "base/callback_helpers.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
+
 namespace assistant {
 enum class AssistantEntryPoint;
 enum class AssistantExitPoint;
 }  // namespace assistant
-}  // namespace chromeos
-
-namespace ash {
 
 class AssistantUiModel;
 
@@ -40,16 +38,15 @@
   virtual void SetKeyboardTraversalMode(bool) = 0;
 
   // Invoke to show/toggle Assistant UI.
-  virtual void ShowUi(chromeos::assistant::AssistantEntryPoint) = 0;
-  virtual void ToggleUi(
-      absl::optional<chromeos::assistant::AssistantEntryPoint>,
-      absl::optional<chromeos::assistant::AssistantExitPoint>) = 0;
+  virtual void ShowUi(assistant::AssistantEntryPoint) = 0;
+  virtual void ToggleUi(absl::optional<assistant::AssistantEntryPoint>,
+                        absl::optional<assistant::AssistantExitPoint>) = 0;
 
   // Returns a closure to close Assistant UI. If the return value is ignored,
   // the Assistant UI is closed instantly; otherwise, the UI is in closing
   // state until the closure is run.
   virtual absl::optional<base::ScopedClosureRunner> CloseUi(
-      chromeos::assistant::AssistantExitPoint) = 0;
+      assistant::AssistantExitPoint) = 0;
 
   // Sets current AppListBubbleWidth. AssistantCardElement needs to know the
   // width of AppListBubbleWidth to render its html content.
diff --git a/ash/public/cpp/assistant/test_support/mock_assistant_state.cc b/ash/public/cpp/assistant/test_support/mock_assistant_state.cc
index 682dabb..42044e9 100644
--- a/ash/public/cpp/assistant/test_support/mock_assistant_state.cc
+++ b/ash/public/cpp/assistant/test_support/mock_assistant_state.cc
@@ -7,14 +7,14 @@
 namespace ash {
 
 MockAssistantState::MockAssistantState() {
-  allowed_state_ = chromeos::assistant::AssistantAllowedState::ALLOWED;
+  allowed_state_ = assistant::AssistantAllowedState::ALLOWED;
   settings_enabled_ = true;
 }
 
 MockAssistantState::~MockAssistantState() = default;
 
 void MockAssistantState::SetAllowedState(
-    chromeos::assistant::AssistantAllowedState allowed_state) {
+    assistant::AssistantAllowedState allowed_state) {
   if (allowed_state_ != allowed_state) {
     allowed_state_ = allowed_state;
     for (auto& observer : observers_)
diff --git a/ash/public/cpp/assistant/test_support/mock_assistant_state.h b/ash/public/cpp/assistant/test_support/mock_assistant_state.h
index 1bd1477..22585770 100644
--- a/ash/public/cpp/assistant/test_support/mock_assistant_state.h
+++ b/ash/public/cpp/assistant/test_support/mock_assistant_state.h
@@ -16,8 +16,7 @@
   MockAssistantState& operator=(const MockAssistantState&) = delete;
   ~MockAssistantState() override;
 
-  void SetAllowedState(
-      chromeos::assistant::AssistantAllowedState allowed_state);
+  void SetAllowedState(assistant::AssistantAllowedState allowed_state);
 
   void SetSettingsEnabled(bool enabled);
 };
diff --git a/ash/public/cpp/shelf_prefs.cc b/ash/public/cpp/shelf_prefs.cc
index cab2e261..7b5a71b 100644
--- a/ash/public/cpp/shelf_prefs.cc
+++ b/ash/public/cpp/shelf_prefs.cc
@@ -55,11 +55,12 @@
   std::string pref_key = base::NumberToString(display_id);
   bool has_per_display_prefs = false;
   if (!pref_key.empty()) {
-    const base::Value* shelf_prefs =
-        prefs->GetDictionary(prefs::kShelfPreferences);
-    const base::Value* display_pref = shelf_prefs->FindDictKey(pref_key);
+    const base::Value::Dict& shelf_prefs =
+        prefs->GetValueDict(prefs::kShelfPreferences);
+    const base::Value::Dict* display_pref = shelf_prefs.FindDict(pref_key);
     if (display_pref) {
-      const std::string* per_display_value = display_pref->FindStringPath(path);
+      const std::string* per_display_value =
+          display_pref->FindStringByDottedPath(path);
       if (per_display_value)
         return *per_display_value;
     }
@@ -67,7 +68,7 @@
     // If the pref for the specified display is not found, scan the whole prefs
     // and check if the prefs for other display is already specified.
     std::string unused_value;
-    for (const auto iter : shelf_prefs->DictItems()) {
+    for (const auto iter : shelf_prefs) {
       if (iter.second.is_dict() && iter.second.FindStringPath(path)) {
         has_per_display_prefs = true;
         break;
@@ -92,15 +93,14 @@
     return;
 
   // Avoid DictionaryPrefUpdate's notifications for read but unmodified prefs.
-  const base::Value* current_shelf_prefs =
-      prefs->GetDictionary(prefs::kShelfPreferences);
-  DCHECK(current_shelf_prefs);
+  const base::Value::Dict& current_shelf_prefs =
+      prefs->GetValueDict(prefs::kShelfPreferences);
   std::string display_key = base::NumberToString(display_id);
-  const base::Value* current_display_prefs =
-      current_shelf_prefs->FindDictKey(display_key);
+  const base::Value::Dict* current_display_prefs =
+      current_shelf_prefs.FindDict(display_key);
   if (current_display_prefs) {
     const std::string* current_value =
-        current_display_prefs->FindStringPath(pref_key);
+        current_display_prefs->FindStringByDottedPath(pref_key);
     if (current_value && *current_value == value)
       return;
   }
diff --git a/ash/public/cpp/test/assistant_test_api.h b/ash/public/cpp/test/assistant_test_api.h
index 9c2cccd..2feaedf 100644
--- a/ash/public/cpp/test/assistant_test_api.h
+++ b/ash/public/cpp/test/assistant_test_api.h
@@ -63,7 +63,7 @@
   virtual void SetTabletMode(bool enable) = 0;
 
   // Changes the user preference controlling the status of user consent.
-  virtual void SetConsentStatus(chromeos::assistant::prefs::ConsentStatus) = 0;
+  virtual void SetConsentStatus(assistant::prefs::ConsentStatus) = 0;
 
   // Sets the number of user sessions where Assistant onboarding was shown.
   virtual void SetNumberOfSessionsWhereOnboardingShown(
@@ -71,7 +71,7 @@
 
   // Changes the user preference controlling the mode of the onboarding UX.
   virtual void SetOnboardingMode(
-      chromeos::assistant::prefs::AssistantOnboardingMode onboarding_mode) = 0;
+      assistant::prefs::AssistantOnboardingMode onboarding_mode) = 0;
 
   // Changes the user setting controlling whether the user prefers voice or
   // keyboard (internally called |kAssistantLaunchWithMicOpen|).
diff --git a/ash/shelf/assistant_overlay_unittest.cc b/ash/shelf/assistant_overlay_unittest.cc
index cf05234..987ce11d 100644
--- a/ash/shelf/assistant_overlay_unittest.cc
+++ b/ash/shelf/assistant_overlay_unittest.cc
@@ -65,12 +65,11 @@
 
     // Enable Assistant
     Shell::Get()->session_controller()->GetPrimaryUserPrefService()->SetBoolean(
-        chromeos::assistant::prefs::kAssistantEnabled, true);
+        assistant::prefs::kAssistantEnabled, true);
     AssistantState* assistant_state = AssistantState::Get();
     assistant_state->NotifyFeatureAllowed(
-        chromeos::assistant::AssistantAllowedState::ALLOWED);
-    assistant_state->NotifyStatusChanged(
-        chromeos::assistant::AssistantStatus::READY);
+        assistant::AssistantAllowedState::ALLOWED);
+    assistant_state->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
     const TestVariant test_variant = GetParam();
     switch (test_variant) {
diff --git a/ash/shelf/home_button_controller.cc b/ash/shelf/home_button_controller.cc
index 17294c2..b9271a6 100644
--- a/ash/shelf/home_button_controller.cc
+++ b/ash/shelf/home_button_controller.cc
@@ -130,8 +130,7 @@
 
 bool HomeButtonController::IsAssistantAvailable() {
   AssistantStateBase* state = AssistantState::Get();
-  return state->allowed_state() ==
-             chromeos::assistant::AssistantAllowedState::ALLOWED &&
+  return state->allowed_state() == assistant::AssistantAllowedState::ALLOWED &&
          state->settings_enabled().value_or(false);
 }
 
@@ -156,7 +155,7 @@
 }
 
 void HomeButtonController::OnAssistantFeatureAllowedChanged(
-    chromeos::assistant::AssistantAllowedState state) {
+    assistant::AssistantAllowedState state) {
   button_->OnAssistantAvailabilityChanged();
 }
 
diff --git a/ash/shelf/home_button_controller.h b/ash/shelf/home_button_controller.h
index 6db20207..025f354 100644
--- a/ash/shelf/home_button_controller.h
+++ b/ash/shelf/home_button_controller.h
@@ -56,7 +56,7 @@
 
   // AssistantStateObserver:
   void OnAssistantFeatureAllowedChanged(
-      chromeos::assistant::AssistantAllowedState) override;
+      assistant::AssistantAllowedState) override;
   void OnAssistantSettingsEnabled(bool enabled) override;
 
   // AssistantUiModelObserver:
diff --git a/ash/shelf/home_button_unittest.cc b/ash/shelf/home_button_unittest.cc
index f8d615db..7c45e0f 100644
--- a/ash/shelf/home_button_unittest.cc
+++ b/ash/shelf/home_button_unittest.cc
@@ -596,11 +596,10 @@
   CreateUserSessions(2);
 
   // Enable the Assistant in system settings.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
   assistant_state()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::ALLOWED);
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+      assistant::AssistantAllowedState::ALLOWED);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   ShelfNavigationWidget::TestApi test_api(
       GetPrimaryShelf()->navigation_widget());
@@ -615,7 +614,7 @@
             AssistantUiController::Get()->GetModel()->visibility());
 
   AssistantUiController::Get()->CloseUi(
-      chromeos::assistant::AssistantExitPoint::kUnspecified);
+      assistant::AssistantExitPoint::kUnspecified);
   // Test long press gesture on secondary display.
   SendGestureEventToSecondaryDisplay(&long_press);
   GetAppListTestHelper()->WaitUntilIdle();
@@ -628,11 +627,10 @@
   CreateUserSessions(2);
 
   // Enable the Assistant in system settings.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
   assistant_state()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::ALLOWED);
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+      assistant::AssistantAllowedState::ALLOWED);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true);
 
@@ -671,17 +669,16 @@
             AssistantUiController::Get()->GetModel()->visibility());
 
   AssistantUiController::Get()->CloseUi(
-      chromeos::assistant::AssistantExitPoint::kUnspecified);
+      assistant::AssistantExitPoint::kUnspecified);
 }
 
 TEST_P(HomeButtonTest, LongPressGestureWithSecondaryUser) {
   // Disallowed by secondary user.
   assistant_state()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::
-          DISALLOWED_BY_NONPRIMARY_USER);
+      assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER);
 
   // Enable the Assistant in system settings.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
 
   ShelfNavigationWidget::TestApi test_api(
       GetPrimaryShelf()->navigation_widget());
@@ -707,9 +704,9 @@
 
   // Simulate a user who has already completed setup flow, but disabled the
   // Assistant in settings.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, false);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, false);
   assistant_state()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::ALLOWED);
+      assistant::AssistantAllowedState::ALLOWED);
 
   ShelfNavigationWidget::TestApi test_api(
       GetPrimaryShelf()->navigation_widget());
diff --git a/ash/shelf/hotseat_widget_unittest.cc b/ash/shelf/hotseat_widget_unittest.cc
index d3b53de..8f0612a 100644
--- a/ash/shelf/hotseat_widget_unittest.cc
+++ b/ash/shelf/hotseat_widget_unittest.cc
@@ -105,9 +105,9 @@
     if (is_assistant_enabled_) {
       assistant_test_api_->SetAssistantEnabled(true);
       assistant_test_api_->GetAssistantState()->NotifyFeatureAllowed(
-          chromeos::assistant::AssistantAllowedState::ALLOWED);
+          assistant::AssistantAllowedState::ALLOWED);
       assistant_test_api_->GetAssistantState()->NotifyStatusChanged(
-          chromeos::assistant::AssistantStatus::READY);
+          assistant::AssistantStatus::READY);
 
       assistant_test_api_->WaitUntilIdle();
     }
@@ -138,7 +138,7 @@
     if (!navigation_buttons_shown_in_tablet_mode_ &&
         Shell::Get()->tablet_mode_controller()->InTabletMode()) {
       AssistantUiController::Get()->ShowUi(
-          chromeos::assistant::AssistantEntryPoint::kLongPressLauncher);
+          assistant::AssistantEntryPoint::kLongPressLauncher);
       return;
     }
 
diff --git a/ash/system/message_center/ash_notification_view.cc b/ash/system/message_center/ash_notification_view.cc
index d552a0e..e92eebc 100644
--- a/ash/system/message_center/ash_notification_view.cc
+++ b/ash/system/message_center/ash_notification_view.cc
@@ -762,22 +762,6 @@
   return base::Milliseconds(kGeneralCollapseAnimationDuration);
 }
 
-void AshNotificationView::AbortAllLayerAnimations() {
-  layer()->GetAnimator()->AbortAllAnimations();
-
-  // Aborting animations on these views can result in the view being deleted. To
-  // prevent a container overflow we need to copy the view pointers into a
-  // separate vector before calling abort animations on them.
-  std::vector<views::View*> grouped_notifications;
-  std::copy(grouped_notifications_container_->children().begin(),
-            grouped_notifications_container_->children().end(),
-            std::back_inserter(grouped_notifications));
-
-  for (auto* child : grouped_notifications) {
-    child->layer()->GetAnimator()->AbortAllAnimations();
-  }
-}
-
 void AshNotificationView::AddGroupNotification(
     const message_center::Notification& notification) {
   DCHECK(is_grouped_parent_view_);
@@ -892,9 +876,7 @@
         self->expand_button_->UpdateGroupedNotificationsCount(
             self->total_grouped_notifications_);
 
-        // crbug/1347815: Release this view immediately to prevent msan failure.
-        self->grouped_notifications_container_->RemoveChildViewT(to_be_removed)
-            .release();
+        self->grouped_notifications_container_->RemoveChildViewT(to_be_removed);
         self->PreferredSizeChanged();
       },
       weak_factory_.GetWeakPtr(), notification_id);
@@ -1542,7 +1524,7 @@
       grouped_notifications_container_->height();
   size_t removed_index =
       grouped_notifications_container_->GetIndexOf(to_be_removed).value();
-
+  LOG(ERROR) << "Removed after animation";
   grouped_notifications_container_->RemoveChildViewT(to_be_removed).reset();
 
   auto* notification_view_controller = message_center_utils::
diff --git a/ash/system/message_center/ash_notification_view.h b/ash/system/message_center/ash_notification_view.h
index 78f3df1..8deb79c8 100644
--- a/ash/system/message_center/ash_notification_view.h
+++ b/ash/system/message_center/ash_notification_view.h
@@ -68,7 +68,6 @@
   void GroupedNotificationsPreferredSizeChanged();
 
   // message_center::MessageView:
-  void AbortAllLayerAnimations() override;
   void AddGroupNotification(
       const message_center::Notification& notification) override;
   void PopulateGroupNotifications(
diff --git a/ash/system/palette/palette_tray_unittest.cc b/ash/system/palette/palette_tray_unittest.cc
index 593326c..07bea882 100644
--- a/ash/system/palette/palette_tray_unittest.cc
+++ b/ash/system/palette/palette_tray_unittest.cc
@@ -395,12 +395,10 @@
   ui::ScopedAnimationDurationScaleMode animation_duration_mode(
       ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
   assistant_state()->NotifyFeatureAllowed(
-      chromeos::assistant::AssistantAllowedState::ALLOWED);
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      true);
+      assistant::AssistantAllowedState::ALLOWED);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::READY);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, true);
 
   ui::test::EventGenerator* generator = GetEventGenerator();
   generator->EnterPenPointerMode();
@@ -462,8 +460,7 @@
   // Disabling metalayer support in the delegate should disable the palette
   // tool.
   test_api_->palette_tool_manager()->ActivateTool(PaletteToolId::METALAYER);
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      false);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, false);
   EXPECT_FALSE(metalayer_enabled());
 
   // With the metalayer disabled again, press/drag does not activate the
@@ -476,11 +473,9 @@
 TEST_F(PaletteTrayTestWithAssistant, StylusBarrelButtonActivatesHighlighter) {
   ui::ScopedAnimationDurationScaleMode animation_duration_mode(
       ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::NOT_READY);
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, false);
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      false);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::NOT_READY);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, false);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, false);
 
   ui::test::EventGenerator* generator = GetEventGenerator();
   generator->EnterPenPointerMode();
@@ -500,21 +495,19 @@
                              false /* no highlighter on press */);
 
   // Enable one of the two user prefs, should not be sufficient.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, true);
   WaitDragAndAssertMetalayer("one pref enabled", origin,
                              ui::EF_LEFT_MOUSE_BUTTON, false /* no metalayer */,
                              false /* no highlighter on press */);
 
   // Enable the other user pref, still not sufficient.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
   WaitDragAndAssertMetalayer("two prefs enabled", origin,
                              ui::EF_LEFT_MOUSE_BUTTON, false /* no metalayer */,
                              false /* no highlighter on press */);
 
   // Once the service is ready, the button should start working.
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   // Press and drag with no button, still no highlighter.
   WaitDragAndAssertMetalayer("all enabled, no button ", origin, ui::EF_NONE,
@@ -578,8 +571,7 @@
 
   // Disable the metalayer support.
   // This should deactivate both the palette tool and the highlighter.
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      false);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, false);
   EXPECT_FALSE(test_api_->palette_tool_manager()->IsToolActive(
       PaletteToolId::METALAYER));
 
diff --git a/ash/system/palette/tools/metalayer_mode.cc b/ash/system/palette/tools/metalayer_mode.cc
index e0bddd7..48a4dad 100644
--- a/ash/system/palette/tools/metalayer_mode.cc
+++ b/ash/system/palette/tools/metalayer_mode.cc
@@ -163,11 +163,11 @@
     // time.
     toast_event = kDeprecatedToastNotShown;
     if (!GetPrefs()->GetBoolean(
-            chromeos::assistant::prefs::kAssistantDeprecateStylusToast)) {
+            assistant::prefs::kAssistantDeprecateStylusToast)) {
       // Set the deprecate stylus toast assistant pref so that the toast doesn't
       // repeatedly show.
-      GetPrefs()->SetBoolean(
-          chromeos::assistant::prefs::kAssistantDeprecateStylusToast, true);
+      GetPrefs()->SetBoolean(assistant::prefs::kAssistantDeprecateStylusToast,
+                             true);
       Shell::Get()->toast_manager()->Show(
           ToastData(kDeprecateAssistantStylusToastId,
                     ToastCatalogName::kDeprecateAssistantStylus,
@@ -221,7 +221,7 @@
 }
 
 void MetalayerMode::OnAssistantStatusChanged(
-    chromeos::assistant::AssistantStatus status) {
+    assistant::AssistantStatus status) {
   assistant_status_ = status;
   UpdateState();
 }
@@ -237,7 +237,7 @@
 }
 
 void MetalayerMode::OnAssistantFeatureAllowedChanged(
-    chromeos::assistant::AssistantAllowedState state) {
+    assistant::AssistantAllowedState state) {
   assistant_allowed_state_ = state;
   UpdateState();
 }
diff --git a/ash/system/palette/tools/metalayer_mode.h b/ash/system/palette/tools/metalayer_mode.h
index ae01a04..9e1d627 100644
--- a/ash/system/palette/tools/metalayer_mode.h
+++ b/ash/system/palette/tools/metalayer_mode.h
@@ -57,20 +57,20 @@
   bool feature_enabled() const {
     return assistant_enabled_ && assistant_context_enabled_ &&
            assistant_allowed_state_ ==
-               chromeos::assistant::AssistantAllowedState::ALLOWED;
+               assistant::AssistantAllowedState::ALLOWED;
   }
 
   // Whether the tool is in "loading" state.
   bool loading() const {
     return feature_enabled() &&
-           assistant_status_ == chromeos::assistant::AssistantStatus::NOT_READY;
+           assistant_status_ == assistant::AssistantStatus::NOT_READY;
   }
 
   // Whether the tool can be selected from the menu (only true when enabled
   // by the user and fully loaded).
   bool selectable() const {
     return feature_enabled() &&
-           assistant_status_ != chromeos::assistant::AssistantStatus::NOT_READY;
+           assistant_status_ != assistant::AssistantStatus::NOT_READY;
   }
 
   // PaletteTool:
@@ -89,12 +89,11 @@
   void OnGestureEvent(ui::GestureEvent* event) override;
 
   // AssistantStateObserver:
-  void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) override;
+  void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
   void OnAssistantSettingsEnabled(bool enabled) override;
   void OnAssistantContextEnabled(bool enabled) override;
   void OnAssistantFeatureAllowedChanged(
-      chromeos::assistant::AssistantAllowedState state) override;
+      assistant::AssistantAllowedState state) override;
 
   // HighlighterController::Observer:
   void OnHighlighterEnabledChanged(HighlighterEnabledState state) override;
@@ -108,15 +107,15 @@
   // Called when the metalayer session is complete.
   void OnMetalayerSessionComplete();
 
-  chromeos::assistant::AssistantStatus assistant_status_ =
-      chromeos::assistant::AssistantStatus::NOT_READY;
+  assistant::AssistantStatus assistant_status_ =
+      assistant::AssistantStatus::NOT_READY;
 
   bool assistant_enabled_ = false;
 
   bool assistant_context_enabled_ = false;
 
-  chromeos::assistant::AssistantAllowedState assistant_allowed_state_ =
-      chromeos::assistant::AssistantAllowedState::ALLOWED;
+  assistant::AssistantAllowedState assistant_allowed_state_ =
+      assistant::AssistantAllowedState::ALLOWED;
 
   base::TimeTicks previous_stroke_end_;
 
diff --git a/ash/system/palette/tools/metalayer_unittest.cc b/ash/system/palette/tools/metalayer_unittest.cc
index 5cb37e1..8a7c0ed 100644
--- a/ash/system/palette/tools/metalayer_unittest.cc
+++ b/ash/system/palette/tools/metalayer_unittest.cc
@@ -70,37 +70,32 @@
 // The metalayer tool is always visible, but only enabled when the user
 // has enabled the metalayer AND the Assistant framework is ready.
 TEST_F(MetalayerToolTest, PaletteMenuState) {
-  const chromeos::assistant::AssistantStatus kStates[] = {
-      chromeos::assistant::AssistantStatus::NOT_READY,
-      chromeos::assistant::AssistantStatus::READY};
-  const chromeos::assistant::AssistantAllowedState kAllowedStates[] = {
-      chromeos::assistant::AssistantAllowedState::ALLOWED,
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_POLICY,
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_LOCALE,
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_INCOGNITO,
+  const assistant::AssistantStatus kStates[] = {
+      assistant::AssistantStatus::NOT_READY, assistant::AssistantStatus::READY};
+  const assistant::AssistantAllowedState kAllowedStates[] = {
+      assistant::AssistantAllowedState::ALLOWED,
+      assistant::AssistantAllowedState::DISALLOWED_BY_POLICY,
+      assistant::AssistantAllowedState::DISALLOWED_BY_LOCALE,
+      assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
+      assistant::AssistantAllowedState::DISALLOWED_BY_INCOGNITO,
   };
   const std::u16string kLoading(u"loading");
 
   // Iterate over every possible combination of states.
-  for (chromeos::assistant::AssistantStatus state : kStates) {
-    for (chromeos::assistant::AssistantAllowedState allowed_state :
-         kAllowedStates) {
+  for (assistant::AssistantStatus state : kStates) {
+    for (assistant::AssistantAllowedState allowed_state : kAllowedStates) {
       for (int enabled = 0; enabled <= 1; enabled++) {
         for (int context = 0; context <= 1; context++) {
           const bool allowed =
-              allowed_state ==
-              chromeos::assistant::AssistantAllowedState::ALLOWED;
-          const bool ready =
-              state != chromeos::assistant::AssistantStatus::NOT_READY;
+              allowed_state == assistant::AssistantAllowedState::ALLOWED;
+          const bool ready = state != assistant::AssistantStatus::NOT_READY;
           const bool selectable = allowed && enabled && context && ready;
 
           assistant_state()->NotifyStatusChanged(state);
-          prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled,
-                              enabled);
+          prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, enabled);
           assistant_state()->NotifyFeatureAllowed(allowed_state);
-          prefs()->SetBoolean(
-              chromeos::assistant::prefs::kAssistantContextEnabled, context);
+          prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled,
+                              context);
 
           std::unique_ptr<views::View> view =
               base::WrapUnique(tool_->CreateView());
@@ -146,26 +141,23 @@
 
 // Verifies that disabling the metalayer support disables the tool.
 TEST_F(MetalayerToolTest, MetalayerUnsupportedDisablesPaletteTool) {
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, true);
 
   // Disabling the user prefs individually should disable the tool.
   tool_->OnEnable();
   EXPECT_CALL(*palette_tool_delegate_.get(),
               DisableTool(PaletteToolId::METALAYER));
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, false);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, false);
   testing::Mock::VerifyAndClearExpectations(palette_tool_delegate_.get());
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantEnabled, true);
 
   tool_->OnEnable();
   EXPECT_CALL(*palette_tool_delegate_.get(),
               DisableTool(PaletteToolId::METALAYER));
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      false);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, false);
   testing::Mock::VerifyAndClearExpectations(palette_tool_delegate_.get());
-  prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                      true);
+  prefs()->SetBoolean(assistant::prefs::kAssistantContextEnabled, true);
 
   // Test AssistantState changes.
   tool_->OnEnable();
@@ -175,16 +167,14 @@
   EXPECT_CALL(*palette_tool_delegate_.get(),
               DisableTool(PaletteToolId::METALAYER))
       .Times(0);
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::READY);
   testing::Mock::VerifyAndClearExpectations(palette_tool_delegate_.get());
 
   // Changing the state to NOT_READY should disable the tool.
   EXPECT_CALL(*palette_tool_delegate_.get(),
               DisableTool(PaletteToolId::METALAYER))
       .Times(testing::AtLeast(1));
-  assistant_state()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::NOT_READY);
+  assistant_state()->NotifyStatusChanged(assistant::AssistantStatus::NOT_READY);
   testing::Mock::VerifyAndClearExpectations(palette_tool_delegate_.get());
 }
 
diff --git a/ash/wm/desks/desks_restore_util.cc b/ash/wm/desks/desks_restore_util.cc
index 873072f..6d7eec2 100644
--- a/ash/wm/desks/desks_restore_util.cc
+++ b/ash/wm/desks/desks_restore_util.cc
@@ -231,21 +231,19 @@
   desks_controller->RestorePrimaryUserActiveDeskIndex(active_desk_index);
 
   // Restore weekly active desks metrics.
-  auto* weekly_active_desks_dict =
-      primary_user_prefs->GetDictionary(prefs::kDesksWeeklyActiveDesksMetrics);
-  if (weekly_active_desks_dict) {
-    const int report_time =
-        weekly_active_desks_dict->FindIntPath(kReportTimeKey).value_or(-1);
-    const int num_weekly_active_desks =
-        weekly_active_desks_dict->FindIntPath(kWeeklyActiveDesksKey)
-            .value_or(-1);
+  auto& weekly_active_desks_dict =
+      primary_user_prefs->GetValueDict(prefs::kDesksWeeklyActiveDesksMetrics);
+  const int report_time =
+      weekly_active_desks_dict.FindIntByDottedPath(kReportTimeKey).value_or(-1);
+  const int num_weekly_active_desks =
+      weekly_active_desks_dict.FindIntByDottedPath(kWeeklyActiveDesksKey)
+          .value_or(-1);
 
-    // Discard stored metrics if either are corrupted.
-    if (report_time != -1 && num_weekly_active_desks != -1) {
-      desks_controller->RestoreWeeklyActiveDesksMetrics(
-          num_weekly_active_desks,
-          base::Time::FromDeltaSinceWindowsEpoch(base::Minutes(report_time)));
-    }
+  // Discard stored metrics if either are corrupted.
+  if (report_time != -1 && num_weekly_active_desks != -1) {
+    desks_controller->RestoreWeeklyActiveDesksMetrics(
+        num_weekly_active_desks,
+        base::Time::FromDeltaSinceWindowsEpoch(base::Minutes(report_time)));
   }
 }
 
diff --git a/base/allocator/partition_allocator/partition_bucket.cc b/base/allocator/partition_allocator/partition_bucket.cc
index 4da33e2..bbb8090 100644
--- a/base/allocator/partition_allocator/partition_bucket.cc
+++ b/base/allocator/partition_allocator/partition_bucket.cc
@@ -176,8 +176,6 @@
     unsigned int flags,
     size_t raw_size,
     size_t slot_span_alignment) {
-  using ::partition_alloc::internal::ScopedUnlockGuard;
-
   PA_DCHECK((slot_span_alignment >= PartitionPageSize()) &&
             base::bits::IsPowerOfTwo(slot_span_alignment));
 
@@ -687,7 +685,7 @@
       return 0;
 
     // Didn't manage to get a new uncommitted super page -> address space issue.
-    ::partition_alloc::internal::ScopedUnlockGuard unlock{root->lock_};
+    ScopedUnlockGuard unlock{root->lock_};
     PartitionOutOfMemoryMappingFailure(root, kSuperPageSize);
   }
 
@@ -1330,7 +1328,7 @@
     if (flags & AllocFlags::kReturnNull)
       return 0;
     // See comment in PartitionDirectMap() for unlocking.
-    ::partition_alloc::internal::ScopedUnlockGuard unlock{root->lock_};
+    ScopedUnlockGuard unlock{root->lock_};
     root->OutOfMemory(raw_size);
     PA_IMMEDIATE_CRASH();  // Not required, kept as documentation.
   }
diff --git a/base/allocator/partition_allocator/partition_page.cc b/base/allocator/partition_allocator/partition_page.cc
index a02eb9db..17860aa 100644
--- a/base/allocator/partition_allocator/partition_page.cc
+++ b/base/allocator/partition_allocator/partition_page.cc
@@ -35,8 +35,6 @@
 template <bool thread_safe>
 PA_ALWAYS_INLINE void PartitionDirectUnmap(
     SlotSpanMetadata<thread_safe>* slot_span) {
-  using ::partition_alloc::internal::ScopedUnlockGuard;
-
   auto* root = PartitionRoot<thread_safe>::FromSlotSpan(slot_span);
   root->lock_.AssertAcquired();
   auto* extent = PartitionDirectMapExtent<thread_safe>::FromSlotSpan(slot_span);
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 894f5b65..32fd691b 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-9.20220801.2.1
+9.20220802.0.1
diff --git a/chrome/VERSION b/chrome/VERSION
index 497f0ec..6ea8ed5 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=106
 MINOR=0
-BUILD=5214
+BUILD=5215
 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 2aa90c9..3f44208 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -417,7 +417,7 @@
     "//chrome/browser/preferences:java",
     "//chrome/browser/prefetch/android:java",
     "//chrome/browser/privacy:java",
-    "//chrome/browser/privacy_review/android:java",
+    "//chrome/browser/privacy_guide/android:java",
     "//chrome/browser/privacy_sandbox/android:java",
     "//chrome/browser/profiles/android:java",
     "//chrome/browser/safe_browsing/android:java",
diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml
index 31c384b2..22ab317 100644
--- a/chrome/android/java/res/xml/privacy_preferences.xml
+++ b/chrome/android/java/res/xml/privacy_preferences.xml
@@ -12,9 +12,9 @@
         android:summary="@string/clear_browsing_data_summary"
         android:fragment="org.chromium.chrome.browser.browsing_data.ClearBrowsingDataTabsFragment"/>
     <Preference
-        android:key="privacy_review"
-        android:title="@string/prefs_privacy_review_title"
-        android:summary="@string/prefs_privacy_review_summary"/>
+        android:key="privacy_guide"
+        android:title="@string/prefs_privacy_guide_title"
+        android:summary="@string/prefs_privacy_guide_summary"/>
     <Preference
         android:key="safe_browsing"
         android:title="@string/prefs_safe_browsing_title"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasic.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasic.java
index ab0fcc0..609e8a33 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasic.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasic.java
@@ -225,7 +225,7 @@
 
     private boolean isHistorySyncEnabled() {
         SyncService syncService = SyncService.get();
-        return syncService != null && syncService.isSyncRequested()
+        return syncService != null && syncService.isSyncFeatureEnabled()
                 && syncService.getActiveDataTypes().contains(ModelType.HISTORY_DELETE_DIRECTIVES);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
index 0f8d118..0fffc606 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchUma.java
@@ -243,7 +243,7 @@
     public static void logTapResultsSeen(boolean wasPanelSeen) {
         RecordHistogram.recordBooleanHistogram(
                 "Search.ContextualSearch.Tap.ResultsSeen", wasPanelSeen);
-        if (SyncService.get() != null && SyncService.get().isSyncRequested()) {
+        if (SyncService.get() != null && SyncService.get().isSyncFeatureEnabled()) {
             RecordHistogram.recordBooleanHistogram(
                     "Search.ContextualSearch.Tap.SyncEnabled.ResultsSeen", wasPanelSeen);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
index ea4b2bec..d79d25b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy/settings/PrivacySettings.java
@@ -23,7 +23,7 @@
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.prefetch.settings.PreloadPagesSettingsFragment;
 import org.chromium.chrome.browser.privacy.secure_dns.SecureDnsSettings;
-import org.chromium.chrome.browser.privacy_review.PrivacyReviewDialog;
+import org.chromium.chrome.browser.privacy_guide.PrivacyGuideDialog;
 import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxBridge;
 import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxReferrer;
 import org.chromium.chrome.browser.privacy_sandbox.PrivacySandboxSettingsFragment;
@@ -63,7 +63,7 @@
     private static final String PREF_SYNC_AND_SERVICES_LINK = "sync_and_services_link";
     private static final String PREF_CLEAR_BROWSING_DATA = "clear_browsing_data";
     private static final String PREF_PRIVACY_SANDBOX = "privacy_sandbox";
-    private static final String PREF_PRIVACY_REVIEW = "privacy_review";
+    private static final String PREF_PRIVACY_GUIDE = "privacy_guide";
     private static final String PREF_INCOGNITO_LOCK = "incognito_lock";
 
     private ManagedPreferenceDelegate mManagedPreferenceDelegate;
@@ -93,13 +93,13 @@
             });
         }
 
-        Preference privacyReviewPreference = findPreference(PREF_PRIVACY_REVIEW);
-        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_REVIEW)) {
-            getPreferenceScreen().removePreference(privacyReviewPreference);
+        Preference privacyGuidePreference = findPreference(PREF_PRIVACY_GUIDE);
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.PRIVACY_GUIDE)) {
+            getPreferenceScreen().removePreference(privacyGuidePreference);
         } else {
-            // Display the privacy review dialog when the menu item is clicked.
-            privacyReviewPreference.setOnPreferenceClickListener(preference -> {
-                PrivacyReviewDialog dialog = new PrivacyReviewDialog(
+            // Display the privacy guide dialog when the menu item is clicked.
+            privacyGuidePreference.setOnPreferenceClickListener(preference -> {
+                PrivacyGuideDialog dialog = new PrivacyGuideDialog(
                         getContext(), mDialogContainer, mBottomSheetController);
                 dialog.show();
                 return true;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java
index 8e7507a..5d7d13e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java
@@ -81,7 +81,7 @@
     public void syncStateChanged() {
         ThreadUtils.assertOnUiThread();
 
-        if (!mSyncService.isSyncRequested()) {
+        if (!mSyncService.isSyncFeatureEnabled()) {
             cancelNotifications();
         } else if (shouldSyncAuthErrorBeShown()) {
             // Auth errors take precedence over passphrase errors.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
index 31e74e6..ad6a112 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragmentBasicTest.java
@@ -105,7 +105,7 @@
 
     private void setSyncable(boolean syncable) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            when(mMockSyncService.isSyncRequested()).thenReturn(syncable);
+            when(mMockSyncService.isSyncFeatureEnabled()).thenReturn(syncable);
             when(mMockSyncService.getActiveDataTypes())
                     .thenReturn(syncable
                                     ? CollectionUtil.newHashSet(ModelType.HISTORY_DELETE_DIRECTIVES)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java
index a0c9a6a..3b72f70 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordViewingTypeTest.java
@@ -70,7 +70,7 @@
     @SmallTest
     @Feature({"Sync"})
     public void testUserRedirectSyncSettings() {
-        when(mSyncService.isSyncRequested()).thenReturn(true);
+        when(mSyncService.isSyncFeatureEnabled()).thenReturn(true);
         when(mSyncService.isEngineInitialized()).thenReturn(true);
         when(mSyncService.isUsingExplicitPassphrase()).thenReturn(false);
 
@@ -85,7 +85,7 @@
     @Test
     @SmallTest
     public void testSyncingNativePasswordView() {
-        when(mSyncService.isSyncRequested()).thenReturn(true);
+        when(mSyncService.isSyncFeatureEnabled()).thenReturn(true);
         when(mSyncService.isEngineInitialized()).thenReturn(true);
         when(mSyncService.isUsingExplicitPassphrase()).thenReturn(true);
 
@@ -100,7 +100,7 @@
     @Test
     @SmallTest
     public void testNonSyncingNativePasswordView() {
-        when(mSyncService.isSyncRequested()).thenReturn(false);
+        when(mSyncService.isSyncFeatureEnabled()).thenReturn(false);
         when(mSyncService.isEngineInitialized()).thenReturn(false);
         when(mSyncService.isUsingExplicitPassphrase()).thenReturn(false);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java
index ea504ff7..5596431 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninCheckerTest.java
@@ -169,7 +169,7 @@
                 3, SigninCheckerProvider.get().getNumOfChildAccountChecksDoneForTests());
         Assert.assertTrue(
                 actionTester.getActions().contains("Signin_Signin_WipeDataOnChildAccountSignin2"));
-        Assert.assertTrue(SyncTestUtil.isSyncRequested());
+        Assert.assertTrue(SyncTestUtil.isSyncFeatureEnabled());
     }
 
     @Test
@@ -191,7 +191,7 @@
                 3, SigninCheckerProvider.get().getNumOfChildAccountChecksDoneForTests());
         Assert.assertTrue(
                 actionTester.getActions().contains("Signin_Signin_WipeDataOnChildAccountSignin2"));
-        Assert.assertFalse(SyncTestUtil.isSyncRequested());
+        Assert.assertFalse(SyncTestUtil.isSyncFeatureEnabled());
     }
 
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
index c6b8095..df4d5d6a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SyncConsentFragmentTest.java
@@ -69,7 +69,6 @@
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.chrome.test.util.browser.signin.AccountManagerTestRule;
 import org.chromium.chrome.test.util.browser.signin.SigninTestRule;
-import org.chromium.chrome.test.util.browser.sync.SyncTestUtil;
 import org.chromium.components.externalauth.ExternalAuthUtils;
 import org.chromium.components.signin.base.CoreAccountInfo;
 import org.chromium.components.signin.identitymanager.ConsentLevel;
@@ -438,9 +437,10 @@
                     .getIdentityManager()
                     .hasPrimaryAccount(ConsentLevel.SYNC);
         }, CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL, CriteriaHelper.DEFAULT_POLLING_INTERVAL);
-        Assert.assertTrue(SyncTestUtil.isSyncRequested());
-        TestThreadUtils.runOnUiThreadBlocking(
-                () -> { Assert.assertFalse(SyncService.get().isFirstSetupComplete()); });
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            Assert.assertTrue(SyncService.get().isSyncRequested());
+            Assert.assertFalse(SyncService.get().isFirstSetupComplete());
+        });
         // Close the SettingsActivity.
         onView(withId(R.id.cancel_button)).perform(click());
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
index 20340c2b..0e0a69d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/ManageSyncSettingsTest.java
@@ -178,7 +178,7 @@
         }
         // All data types have been unchecked, but Sync itself should still be
         // enabled.
-        Assert.assertTrue(SyncTestUtil.isSyncRequested());
+        Assert.assertTrue(SyncTestUtil.isSyncFeatureEnabled());
     }
 
     @Test
@@ -193,7 +193,7 @@
         // Sync is requested to start. Toggling SyncEverything will call setChosenDataTypes with
         // empty set in the backend. But sync stop request should not be called.
         mSyncTestRule.togglePreference(getSyncEverything(fragment));
-        Assert.assertTrue(SyncTestUtil.isSyncRequested());
+        Assert.assertTrue(SyncTestUtil.isSyncFeatureEnabled());
     }
 
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
index d7391b0..a530f38b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTest.java
@@ -47,7 +47,7 @@
 
         // Signing out should disable sync.
         mSyncTestRule.signOut();
-        Assert.assertFalse(SyncTestUtil.isSyncRequested());
+        Assert.assertFalse(SyncTestUtil.isSyncFeatureEnabled());
 
         // Signing back in should re-enable sync.
         mSyncTestRule.signinAndEnableSync(accountInfo);
@@ -71,7 +71,7 @@
 
         // Clearing server data should turn off sync and sign out of chrome.
         Assert.assertNull(mSyncTestRule.getPrimaryAccount(ConsentLevel.SYNC));
-        Assert.assertFalse(SyncTestUtil.isSyncRequested());
+        Assert.assertFalse(SyncTestUtil.isSyncFeatureEnabled());
         CriteriaHelper.pollUiThread(
                 ()
                         -> !IdentityServicesProvider.get()
@@ -89,7 +89,7 @@
 
         mSyncTestRule.stopSync();
         Assert.assertEquals(accountInfo, mSyncTestRule.getPrimaryAccount(ConsentLevel.SYNC));
-        Assert.assertFalse(SyncTestUtil.isSyncRequested());
+        Assert.assertFalse(SyncTestUtil.isSyncFeatureEnabled());
 
         mSyncTestRule.startSyncAndWait();
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
index e3ea3d12..5664a7e7 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/SyncTestRule.java
@@ -229,7 +229,7 @@
      */
     public CoreAccountInfo addAccount(String accountName) {
         CoreAccountInfo coreAccountInfo = mSigninTestRule.addAccountAndWaitForSeeding(accountName);
-        Assert.assertFalse(SyncTestUtil.isSyncRequested());
+        Assert.assertFalse(SyncTestUtil.isSyncFeatureEnabled());
         return coreAccountInfo;
     }
 
@@ -305,7 +305,7 @@
     public void signOut() {
         mSigninTestRule.signOut();
         Assert.assertNull(mSigninTestRule.getPrimaryAccount(ConsentLevel.SYNC));
-        Assert.assertFalse(SyncTestUtil.isSyncRequested());
+        Assert.assertFalse(SyncTestUtil.isSyncFeatureEnabled());
     }
 
     public void clearServerData() {
@@ -317,7 +317,7 @@
         // tests do.
         SyncTestUtil.triggerSync();
         CriteriaHelper.pollUiThread(() -> {
-            return !SyncService.get().isSyncRequested();
+            return !SyncService.get().isSyncFeatureEnabled();
         }, SyncTestUtil.TIMEOUT_MS, SyncTestUtil.INTERVAL_MS);
     }
 
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 928a9a6..dac01fd 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -1501,7 +1501,7 @@
     Audio and captions
   </message>
   <message name="IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE" desc="In the settings tab, the title of a link that adds additional accessibility features not found in the built-in settings.">
-    Add additional features
+    Find more accessibility tools in the Chrome Web Store
   </message>
   <message name="IDS_SETTINGS_MANAGE_TTS_SETTINGS" desc="Link to manage text-to-speech settings">
     Text-to-Speech voice settings
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE.png.sha1
new file mode 100644
index 0000000..f572269
--- /dev/null
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ACCESSIBILITY_ADDITIONAL_FEATURES_TITLE.png.sha1
@@ -0,0 +1 @@
+7bb01d2f644d9d7755b780ce11e62e1ed18d3c97
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 2c45bad..3ca0bde 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4661,6 +4661,10 @@
       "apps/app_deduplication_service/app_deduplication_service.h",
       "apps/app_deduplication_service/app_deduplication_service_factory.cc",
       "apps/app_deduplication_service/app_deduplication_service_factory.h",
+      "apps/app_deduplication_service/duplicate_group.cc",
+      "apps/app_deduplication_service/duplicate_group.h",
+      "apps/app_deduplication_service/entry_types.cc",
+      "apps/app_deduplication_service/entry_types.h",
       "apps/app_discovery_service/app_discovery_service.cc",
       "apps/app_discovery_service/app_discovery_service.h",
       "apps/app_discovery_service/app_discovery_service_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index c56248f..146d4cf 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2709,23 +2709,6 @@
 };
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-const FeatureEntry::FeatureParam kCategoricalSearch_Unranked[] = {
-    {"ranking", "none"}};
-
-const FeatureEntry::FeatureParam kCategoricalSearch_ByItem[] = {
-    {"ranking", "item"}};
-
-const FeatureEntry::FeatureParam kCategoricalSearch_ByUsage[] = {
-    {"ranking", "usage"}};
-
-const FeatureEntry::FeatureVariation kCategoricalSearchVariations[] = {
-    {"Unranked", kCategoricalSearch_Unranked,
-     std::size(kCategoricalSearch_Unranked), nullptr},
-    {"By item", kCategoricalSearch_ByItem, std::size(kCategoricalSearch_ByItem),
-     nullptr},
-    {"By usage", kCategoricalSearch_ByUsage,
-     std::size(kCategoricalSearch_ByUsage), nullptr}};
-
 const FeatureEntry::FeatureParam kProductivityLauncher_WithoutContinue[] = {
     {"enable_continue", "false"}};
 
@@ -3937,19 +3920,12 @@
     {"debug-packed-apps", flag_descriptions::kDebugPackedAppName,
      flag_descriptions::kDebugPackedAppDescription, kOsDesktop,
      SINGLE_VALUE_TYPE(switches::kDebugPackedApps)},
-    {"username-first-flow", flag_descriptions::kUsernameFirstFlowName,
-     flag_descriptions::kUsernameFirstFlowDescription, kOsAll,
-     FEATURE_VALUE_TYPE(password_manager::features::kUsernameFirstFlow)},
     {"username-first-flow-fallback-crowdsourcing",
      flag_descriptions::kUsernameFirstFlowFallbackCrowdsourcingName,
      flag_descriptions::kUsernameFirstFlowFallbackCrowdsourcingDescription,
      kOsAll,
      FEATURE_VALUE_TYPE(
          password_manager::features::kUsernameFirstFlowFallbackCrowdsourcing)},
-    {"username-first-flow-filling",
-     flag_descriptions::kUsernameFirstFlowFillingName,
-     flag_descriptions::kUsernameFirstFlowFillingDescription, kOsAll,
-     FEATURE_VALUE_TYPE(password_manager::features::kUsernameFirstFlowFilling)},
     {"enable-show-autofill-signatures",
      flag_descriptions::kShowAutofillSignaturesName,
      flag_descriptions::kShowAutofillSignaturesDescription, kOsAll,
@@ -6197,7 +6173,7 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     {"enable-assistant-dsp", flag_descriptions::kEnableGoogleAssistantDspName,
      flag_descriptions::kEnableGoogleAssistantDspDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::assistant::features::kEnableDspHotword)},
+     FEATURE_VALUE_TYPE(ash::assistant::features::kEnableDspHotword)},
 
     {"deprecate-assistant-stylus-features",
      flag_descriptions::kDeprecateAssistantStylusFeaturesName,
@@ -6274,8 +6250,7 @@
     {"enable-assistant-stereo-input",
      flag_descriptions::kEnableGoogleAssistantStereoInputName,
      flag_descriptions::kEnableGoogleAssistantStereoInputDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(
-         chromeos::assistant::features::kEnableStereoAudioInput)},
+     FEATURE_VALUE_TYPE(ash::assistant::features::kEnableStereoAudioInput)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
     {"enable-gpu-service-logging",
@@ -6657,7 +6632,7 @@
     {"enable-assistant-routines",
      flag_descriptions::kEnableAssistantRoutinesName,
      flag_descriptions::kEnableAssistantRoutinesDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::assistant::features::kAssistantRoutines)},
+     FEATURE_VALUE_TYPE(ash::assistant::features::kAssistantRoutines)},
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -6833,7 +6808,7 @@
      FEATURE_VALUE_TYPE(ash::features::kDeviceForceScheduledReboot)},
     {"enable-assistant-aec", flag_descriptions::kEnableGoogleAssistantAecName,
      flag_descriptions::kEnableGoogleAssistantAecDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(chromeos::assistant::features::kAssistantAudioEraser)},
+     FEATURE_VALUE_TYPE(ash::assistant::features::kAssistantAudioEraser)},
 #endif
 
 #if BUILDFLAG(IS_WIN)
@@ -7326,14 +7301,6 @@
      flag_descriptions::kMacAddressRandomizationName,
      flag_descriptions::kMacAddressRandomizationDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kMacAddressRandomization)},
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    {"categorical-search", flag_descriptions::kCategoricalSearchName,
-     flag_descriptions::kCategoricalSearchDescription, kOsCrOS,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(app_list_features::kCategoricalSearch,
-                                    kCategoricalSearchVariations,
-                                    "LauncherCategoricalSearch")},
 
     {"search-result-inline-icon",
      flag_descriptions::kSearchResultInlineIconName,
diff --git a/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc b/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc
index 1065150b..279dcf3 100644
--- a/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc
+++ b/chrome/browser/apps/app_deduplication_service/app_deduplication_service.cc
@@ -2,12 +2,41 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <utility>
+
 #include "chrome/browser/apps/app_deduplication_service/app_deduplication_service.h"
 
-namespace apps {
+namespace apps::deduplication {
 
-AppDeduplicationService::AppDeduplicationService(Profile* profile) {}
+AppDeduplicationService::AppDeduplicationService(Profile* profile) {
+  app_provisioning_data_observeration_.Observe(
+      AppProvisioningDataManager::Get());
+}
 
 AppDeduplicationService::~AppDeduplicationService() = default;
 
-}  // namespace apps
+void AppDeduplicationService::OnDuplicatedAppsMapUpdated(
+    const proto::DuplicatedAppsMap& duplicated_apps_map) {
+  for (auto const& group : duplicated_apps_map.duplicated_apps_map()) {
+    DuplicateGroup duplicate_group;
+    for (auto const& app : group.second.apps()) {
+      const std::string& app_id = app.app_id_for_platform();
+      const std::string& source = app.source_name();
+      AppType app_type = AppType::kUnknown;
+      // TODO(b/238394602): Add more data type when real data is ready.
+      if (source == "arc") {
+        app_type = AppType::kArc;
+      } else if (source == "web") {
+        app_type = AppType::kWeb;
+      }
+      EntryId entry_id(app_id, app_type);
+      entry_to_group_map_[entry_id] = group.first;
+
+      Entry entry(std::move(entry_id));
+      duplicate_group.entries.push_back(std::move(entry));
+    }
+    duplication_map_[group.first] = std::move(duplicate_group);
+  }
+}
+
+}  // namespace apps::deduplication
diff --git a/chrome/browser/apps/app_deduplication_service/app_deduplication_service.h b/chrome/browser/apps/app_deduplication_service/app_deduplication_service.h
index 31cba05b..74b31abf 100644
--- a/chrome/browser/apps/app_deduplication_service/app_deduplication_service.h
+++ b/chrome/browser/apps/app_deduplication_service/app_deduplication_service.h
@@ -5,20 +5,45 @@
 #ifndef CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_APP_DEDUPLICATION_SERVICE_H_
 #define CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_APP_DEDUPLICATION_SERVICE_H_
 
+#include <map>
+#include <string>
+
+#include "base/scoped_observation.h"
+#include "chrome/browser/apps/app_deduplication_service/duplicate_group.h"
+#include "chrome/browser/apps/app_deduplication_service/entry_types.h"
+#include "chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.h"
+#include "chrome/browser/apps/app_provisioning_service/proto/app_data.pb.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 class Profile;
 
-namespace apps {
+namespace apps::deduplication {
 
-class AppDeduplicationService : public KeyedService {
+class AppDeduplicationService : public KeyedService,
+                                public AppProvisioningDataManager::Observer {
  public:
   explicit AppDeduplicationService(Profile* profile);
   ~AppDeduplicationService() override;
   AppDeduplicationService(const AppDeduplicationService&) = delete;
   AppDeduplicationService& operator=(const AppDeduplicationService&) = delete;
+
+ private:
+  friend class AppDeduplicationServiceTest;
+  FRIEND_TEST_ALL_PREFIXES(AppDeduplicationServiceTest,
+                           OnDuplicatedAppsMapUpdated);
+
+  // AppProvisioningDataManager::Observer:
+  void OnDuplicatedAppsMapUpdated(
+      const proto::DuplicatedAppsMap& duplicated_apps_map) override;
+
+  std::map<std::string, DuplicateGroup> duplication_map_;
+  std::map<EntryId, std::string> entry_to_group_map_;
+
+  base::ScopedObservation<AppProvisioningDataManager,
+                          AppProvisioningDataManager::Observer>
+      app_provisioning_data_observeration_{this};
 };
 
-}  // namespace apps
+}  // namespace apps::deduplication
 
 #endif  // CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_APP_DEDUPLICATION_SERVICE_H_
diff --git a/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.cc b/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.cc
index e940ce5..996f3ae 100644
--- a/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.cc
+++ b/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.cc
@@ -19,7 +19,7 @@
     "AppDeduplicationService";
 }  // namespace
 
-namespace apps {
+namespace apps::deduplication {
 
 // static
 AppDeduplicationService* AppDeduplicationServiceFactory::GetForProfile(
@@ -77,4 +77,4 @@
   return BrowserContextKeyedServiceFactory::GetBrowserContextToUse(context);
 }
 
-}  // namespace apps
+}  // namespace apps::deduplication
diff --git a/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.h b/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.h
index ea1e95c..862af72 100644
--- a/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.h
+++ b/chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.h
@@ -10,7 +10,7 @@
 
 class Profile;
 
-namespace apps {
+namespace apps::deduplication {
 
 class AppDeduplicationService;
 
@@ -42,6 +42,6 @@
       content::BrowserContext* context) const override;
 };
 
-}  // namespace apps
+}  // namespace apps::deduplication
 
 #endif  // CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_APP_DEDUPLICATION_SERVICE_FACTORY_H_
diff --git a/chrome/browser/apps/app_deduplication_service/app_deduplication_service_unittest.cc b/chrome/browser/apps/app_deduplication_service/app_deduplication_service_unittest.cc
index e8bb1e7..33321e8 100644
--- a/chrome/browser/apps/app_deduplication_service/app_deduplication_service_unittest.cc
+++ b/chrome/browser/apps/app_deduplication_service/app_deduplication_service_unittest.cc
@@ -6,12 +6,16 @@
 
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/apps/app_deduplication_service/app_deduplication_service_factory.h"
+#include "chrome/browser/apps/app_provisioning_service/app_provisioning_data_manager.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace apps {
+using testing::ElementsAre;
+
+namespace apps::deduplication {
 
 class AppDeduplicationServiceTest : public testing::Test {
  protected:
@@ -30,20 +34,19 @@
 
   // We expect an App Deduplication Service in a regular profile.
   auto profile = profile_builder.Build();
-  EXPECT_TRUE(apps::AppDeduplicationServiceFactory::
+  EXPECT_TRUE(AppDeduplicationServiceFactory::
                   IsAppDeduplicationServiceAvailableForProfile(profile.get()));
-  auto* service =
-      apps::AppDeduplicationServiceFactory::GetForProfile(profile.get());
+  auto* service = AppDeduplicationServiceFactory::GetForProfile(profile.get());
   EXPECT_NE(nullptr, service);
 
   // We expect App Deduplication Service to be unsupported in incognito.
   TestingProfile::Builder incognito_builder;
   auto* incognito_profile = incognito_builder.BuildIncognito(profile.get());
   EXPECT_FALSE(
-      apps::AppDeduplicationServiceFactory::
+      AppDeduplicationServiceFactory::
           IsAppDeduplicationServiceAvailableForProfile(incognito_profile));
-  EXPECT_EQ(nullptr, apps::AppDeduplicationServiceFactory::GetForProfile(
-                         incognito_profile));
+  EXPECT_EQ(nullptr,
+            AppDeduplicationServiceFactory::GetForProfile(incognito_profile));
 
   // We expect a different App Deduplication Service in the Guest Session
   // profile.
@@ -53,21 +56,53 @@
 
   // App Deduplication Service is not available for original profile.
   EXPECT_FALSE(
-      apps::AppDeduplicationServiceFactory::
+      AppDeduplicationServiceFactory::
           IsAppDeduplicationServiceAvailableForProfile(guest_profile.get()));
-  EXPECT_EQ(nullptr, apps::AppDeduplicationServiceFactory::GetForProfile(
-                         guest_profile.get()));
+  EXPECT_EQ(nullptr,
+            AppDeduplicationServiceFactory::GetForProfile(guest_profile.get()));
 
   // App Deduplication Service is available for OTR profile in Guest mode.
   auto* guest_otr_profile =
       guest_profile->GetPrimaryOTRProfile(/*create_if_needed=*/true);
   EXPECT_TRUE(
-      apps::AppDeduplicationServiceFactory::
+      AppDeduplicationServiceFactory::
           IsAppDeduplicationServiceAvailableForProfile(guest_otr_profile));
   auto* guest_otr_service =
-      apps::AppDeduplicationServiceFactory::GetForProfile(guest_otr_profile);
+      AppDeduplicationServiceFactory::GetForProfile(guest_otr_profile);
   EXPECT_NE(nullptr, guest_otr_service);
   EXPECT_NE(guest_otr_service, service);
 }
 
-}  // namespace apps
+TEST_F(AppDeduplicationServiceTest, OnDuplicatedAppsMapUpdated) {
+  TestingProfile::Builder profile_builder;
+  auto profile = profile_builder.Build();
+  ASSERT_TRUE(AppDeduplicationServiceFactory::
+                  IsAppDeduplicationServiceAvailableForProfile(profile.get()));
+  auto* service = AppDeduplicationServiceFactory::GetForProfile(profile.get());
+  EXPECT_NE(nullptr, service);
+
+  std::string binary_pb = "";
+  base::FilePath install_dir("/");
+  apps::AppProvisioningDataManager::Get()->PopulateFromDynamicUpdate(
+      binary_pb, install_dir);
+
+  std::string test_key = "test_key";
+  std::string arc_app_id = "test_arc_app_id";
+  auto it =
+      service->entry_to_group_map_.find(EntryId(arc_app_id, AppType::kArc));
+  ASSERT_NE(it, service->entry_to_group_map_.end());
+  EXPECT_EQ(test_key, it->second);
+
+  std::string web_app_id = "test_web_app_id";
+  it = service->entry_to_group_map_.find(EntryId(web_app_id, AppType::kWeb));
+  ASSERT_NE(it, service->entry_to_group_map_.end());
+  EXPECT_EQ(test_key, it->second);
+
+  auto map_it = service->duplication_map_.find(test_key);
+  ASSERT_FALSE(map_it == service->duplication_map_.end());
+  EXPECT_THAT(map_it->second.entries,
+              ElementsAre(Entry(EntryId(arc_app_id, AppType::kArc)),
+                          Entry(EntryId(web_app_id, AppType::kWeb))));
+}
+
+}  // namespace apps::deduplication
diff --git a/chrome/browser/apps/app_deduplication_service/duplicate_group.cc b/chrome/browser/apps/app_deduplication_service/duplicate_group.cc
new file mode 100644
index 0000000..ba7c261b
--- /dev/null
+++ b/chrome/browser/apps/app_deduplication_service/duplicate_group.cc
@@ -0,0 +1,14 @@
+// Copyright 2022 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/apps/app_deduplication_service/duplicate_group.h"
+
+namespace apps::deduplication {
+
+DuplicateGroup::DuplicateGroup() = default;
+DuplicateGroup::~DuplicateGroup() = default;
+DuplicateGroup::DuplicateGroup(DuplicateGroup&&) = default;
+DuplicateGroup& DuplicateGroup::operator=(DuplicateGroup&&) = default;
+
+}  // namespace apps::deduplication
diff --git a/chrome/browser/apps/app_deduplication_service/duplicate_group.h b/chrome/browser/apps/app_deduplication_service/duplicate_group.h
new file mode 100644
index 0000000..a5001f56
--- /dev/null
+++ b/chrome/browser/apps/app_deduplication_service/duplicate_group.h
@@ -0,0 +1,32 @@
+// Copyright 2022 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_APPS_APP_DEDUPLICATION_SERVICE_DUPLICATE_GROUP_H_
+#define CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_DUPLICATE_GROUP_H_
+
+#include "chrome/browser/apps/app_deduplication_service/entry_types.h"
+
+namespace apps::deduplication {
+
+// Group of duplications. All the entries in this group are considered as
+// duplicates.
+struct DuplicateGroup {
+  DuplicateGroup();
+
+  DuplicateGroup(const DuplicateGroup&) = delete;
+  DuplicateGroup& operator=(const DuplicateGroup&) = delete;
+
+  DuplicateGroup(DuplicateGroup&&);
+  DuplicateGroup& operator=(DuplicateGroup&&);
+
+  ~DuplicateGroup();
+
+  std::vector<Entry> entries;
+
+  // Other deduplication metadata.
+};
+
+}  // namespace apps::deduplication
+
+#endif  // CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_DUPLICATE_GROUP_H_
diff --git a/chrome/browser/apps/app_deduplication_service/entry_types.cc b/chrome/browser/apps/app_deduplication_service/entry_types.cc
new file mode 100644
index 0000000..39fd4a6
--- /dev/null
+++ b/chrome/browser/apps/app_deduplication_service/entry_types.cc
@@ -0,0 +1,44 @@
+// Copyright 2022 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 <utility>
+
+#include "chrome/browser/apps/app_deduplication_service/entry_types.h"
+
+namespace apps::deduplication {
+
+EntryId::EntryId(std::string app_id, AppType app_type)
+    : entry_type(EntryType::kApp), id(std::move(app_id)), app_type(app_type) {}
+EntryId::EntryId(const GURL& url)
+    : entry_type(EntryType::kWebPage), id(url.spec()) {}
+EntryId::EntryId(std::string phone_hub_app_package_name)
+    : entry_type(EntryType::kPhoneHubApp),
+      id(std::move(phone_hub_app_package_name)) {}
+
+bool EntryId::operator==(const EntryId& other) const {
+  return entry_type == other.entry_type && id == other.id &&
+         (entry_type != EntryType::kApp || app_type == other.app_type);
+}
+
+bool EntryId::operator<(const EntryId& other) const {
+  if (entry_type != other.entry_type)
+    return entry_type < other.entry_type;
+
+  if (entry_type == EntryType::kApp)
+    return app_type < other.app_type;
+
+  return id < other.id;
+}
+
+Entry::Entry(EntryId entry_id) : entry_id(std::move(entry_id)) {}
+
+bool Entry::operator==(const Entry& other) const {
+  return entry_id == other.entry_id;
+}
+
+bool Entry::operator<(const Entry& other) const {
+  return entry_id < other.entry_id;
+}
+
+}  // namespace apps::deduplication
diff --git a/chrome/browser/apps/app_deduplication_service/entry_types.h b/chrome/browser/apps/app_deduplication_service/entry_types.h
new file mode 100644
index 0000000..6367a1b8
--- /dev/null
+++ b/chrome/browser/apps/app_deduplication_service/entry_types.h
@@ -0,0 +1,67 @@
+// Copyright 2022 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_APPS_APP_DEDUPLICATION_SERVICE_ENTRY_TYPES_H_
+#define CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_ENTRY_TYPES_H_
+
+#include <string>
+
+#include "components/services/app_service/public/cpp/app_types.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace apps::deduplication {
+
+enum class EntryType {
+  kApp,
+  kWebPage,
+  kPhoneHubApp,
+};
+
+struct EntryId {
+  // Constructor for apps.
+  EntryId(std::string app_id, apps::AppType app_type);
+
+  // Constructor for web pages.
+  explicit EntryId(const GURL& url);
+
+  // Constructor for phone hub app.
+  explicit EntryId(std::string phone_hub_app_package_name);
+
+  EntryId(const EntryId&) = default;
+  EntryId& operator=(const EntryId&) = default;
+  EntryId(EntryId&&) = default;
+  EntryId& operator=(EntryId&&) = default;
+
+  bool operator==(const EntryId& other) const;
+  bool operator<(const EntryId& other) const;
+
+  EntryType entry_type;
+
+  // The identifier id. If it is website, the id is the url.spec().
+  std::string id;
+
+  // The app type for EntryType::kApp.
+  absl::optional<AppType> app_type;
+};
+
+// Deduplication entry, each entry represents an app or a web page that could be
+// identified as duplicates with each other.
+struct Entry {
+  explicit Entry(EntryId entry_id);
+
+  Entry(const Entry&) = default;
+  Entry& operator=(const Entry&) = default;
+  Entry(Entry&&) = default;
+  Entry& operator=(Entry&&) = default;
+
+  bool operator==(const Entry& other) const;
+  bool operator<(const Entry& other) const;
+
+  // Unique identifier for deduplication entry.
+  EntryId entry_id;
+};
+
+}  // namespace apps::deduplication
+
+#endif  // CHROME_BROWSER_APPS_APP_DEDUPLICATION_SERVICE_ENTRY_TYPES_H_
diff --git a/chrome/browser/apps/app_service/app_service_proxy_lacros.cc b/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
index c07dbe0..7a5d68bd 100644
--- a/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
+++ b/chrome/browser/apps/app_service/app_service_proxy_lacros.cc
@@ -297,6 +297,8 @@
   if (app_type == AppType::kWeb) {
     web_app::UninstallImpl(web_app::WebAppProvider::GetForWebApps(profile_),
                            app_id, uninstall_source, parent_window);
+  } else {
+    NOTIMPLEMENTED();
   }
 }
 
diff --git a/chrome/browser/apps/app_service/instance_registry_updater.cc b/chrome/browser/apps/app_service/instance_registry_updater.cc
index ae20ad8..e98d463 100644
--- a/chrome/browser/apps/app_service/instance_registry_updater.cc
+++ b/chrome/browser/apps/app_service/instance_registry_updater.cc
@@ -4,7 +4,11 @@
 
 #include "chrome/browser/apps/app_service/instance_registry_updater.h"
 
+#include "chrome/browser/ash/crosapi/browser_util.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/browser_window.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
+#include "ui/aura/window.h"
 
 namespace apps {
 
@@ -24,6 +28,16 @@
   return state;
 }
 
+bool IsAshBrowserWindow(aura::Window* aura_window) {
+  for (auto* browser : *BrowserList::GetInstance()) {
+    BrowserWindow* window = browser->window();
+    if (window && window->GetNativeWindow() == aura_window) {
+      return true;
+    }
+  }
+  return false;
+}
+
 }  // namespace
 
 InstanceRegistryUpdater::InstanceRegistryUpdater(
@@ -40,7 +54,6 @@
 void InstanceRegistryUpdater::OnBrowserWindowAdded(
     const BrowserWindowInstance& instance) {
   OnBrowserWindowUpdated(instance);
-  window_observations_.AddObservation(instance.window);
 }
 
 void InstanceRegistryUpdater::OnBrowserWindowUpdated(
@@ -54,15 +67,11 @@
     const BrowserWindowInstance& instance) {
   OnInstance(instance.id, instance.GetAppId(), instance.window,
              InstanceState::kDestroyed);
-  window_observations_.RemoveObservation(instance.window);
 }
 
 void InstanceRegistryUpdater::OnBrowserAppAdded(
     const BrowserAppInstance& instance) {
   OnBrowserAppUpdated(instance);
-  if (instance.type == BrowserAppInstance::Type::kAppWindow) {
-    window_observations_.AddObservation(instance.window);
-  }
 }
 
 void InstanceRegistryUpdater::OnBrowserAppUpdated(
@@ -77,13 +86,18 @@
     const BrowserAppInstance& instance) {
   OnInstance(instance.id, instance.app_id, instance.window,
              InstanceState::kDestroyed);
-  if (instance.type == BrowserAppInstance::Type::kAppWindow) {
-    window_observations_.RemoveObservation(instance.window);
-  }
+}
+
+void InstanceRegistryUpdater::OnWindowInitialized(aura::Window* window) {
+  window_observations_.AddObservation(window);
 }
 
 void InstanceRegistryUpdater::OnWindowVisibilityChanged(aura::Window* window,
                                                         bool visible) {
+  if (!crosapi::browser_util::IsLacrosWindow(window) &&
+      !IsAshBrowserWindow(window)) {
+    return;
+  }
   for (const BrowserAppInstance* instance :
        browser_app_instance_registry_.SelectAppInstances(
            [window](const BrowserAppInstance& instance) {
@@ -100,6 +114,10 @@
   }
 }
 
+void InstanceRegistryUpdater::OnWindowDestroying(aura::Window* window) {
+  window_observations_.RemoveObservation(window);
+}
+
 void InstanceRegistryUpdater::OnInstance(
     const base::UnguessableToken& instance_id,
     const std::string& app_id,
diff --git a/chrome/browser/apps/app_service/instance_registry_updater.h b/chrome/browser/apps/app_service/instance_registry_updater.h
index c4a22d67..e9117c9 100644
--- a/chrome/browser/apps/app_service/instance_registry_updater.h
+++ b/chrome/browser/apps/app_service/instance_registry_updater.h
@@ -20,6 +20,7 @@
 // Created in ash-chrome. Listens to |BrowserAppInstanceRegistry| events and
 // aura::Windows associated with them and updates |InstanceRegistry|.
 class InstanceRegistryUpdater : public BrowserAppInstanceObserver,
+                                public aura::EnvObserver,
                                 public aura::WindowObserver {
  public:
   InstanceRegistryUpdater(
@@ -37,8 +38,12 @@
   void OnBrowserAppUpdated(const BrowserAppInstance& instance) override;
   void OnBrowserAppRemoved(const BrowserAppInstance& instance) override;
 
+  // aura::EnvObserver overrides:
+  void OnWindowInitialized(aura::Window* window) override;
+
   // aura::WindowObserver overrides:
   void OnWindowVisibilityChanged(aura::Window* window, bool visible) override;
+  void OnWindowDestroying(aura::Window* window) override;
 
  private:
   BrowserAppInstanceRegistry& browser_app_instance_registry_;
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc
index 1760adc..9a79296 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.cc
+++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -204,9 +204,9 @@
   if (dictation_locale.empty()) {
     return absl::nullopt;
   }
-  const base::Value* offline_nudges = profile->GetPrefs()->GetDictionary(
+  const base::Value::Dict& offline_nudges = profile->GetPrefs()->GetValueDict(
       prefs::kAccessibilityDictationLocaleOfflineNudge);
-  return offline_nudges->FindBoolPath(dictation_locale);
+  return offline_nudges.FindBoolByDottedPath(dictation_locale);
 }
 
 }  // namespace
diff --git a/chrome/browser/ash/assistant/assistant_util.cc b/chrome/browser/ash/assistant/assistant_util.cc
index 62de06f..3070ccb2 100644
--- a/chrome/browser/ash/assistant/assistant_util.cc
+++ b/chrome/browser/ash/assistant/assistant_util.cc
@@ -23,7 +23,7 @@
 
 namespace {
 
-using chromeos::assistant::AssistantAllowedState;
+using ::ash::assistant::AssistantAllowedState;
 
 bool g_override_is_google_device = false;
 
@@ -111,7 +111,7 @@
 
 bool IsAssistantDisabledByPolicy(const Profile* profile) {
   return profile->GetPrefs()->GetBoolean(
-      chromeos::assistant::prefs::kAssistantDisabledByPolicy);
+      ash::assistant::prefs::kAssistantDisabledByPolicy);
 }
 
 bool IsEmailDomainSupported(const Profile* profile) {
diff --git a/chrome/browser/ash/assistant/assistant_util.h b/chrome/browser/ash/assistant/assistant_util.h
index b9fd99b..b63cd90a 100644
--- a/chrome/browser/ash/assistant/assistant_util.h
+++ b/chrome/browser/ash/assistant/assistant_util.h
@@ -12,7 +12,7 @@
 namespace assistant {
 
 // Returns whether Google Assistant feature is allowed for given |profile|.
-chromeos::assistant::AssistantAllowedState IsAssistantAllowedForProfile(
+ash::assistant::AssistantAllowedState IsAssistantAllowedForProfile(
     const Profile* profile);
 
 void OverrideIsGoogleDeviceForTesting(bool is_google_device);
diff --git a/chrome/browser/ash/assistant/assistant_util_unittest.cc b/chrome/browser/ash/assistant/assistant_util_unittest.cc
index 42ca7349..18cf0b8 100644
--- a/chrome/browser/ash/assistant/assistant_util_unittest.cc
+++ b/chrome/browser/ash/assistant/assistant_util_unittest.cc
@@ -270,7 +270,7 @@
   ScopedLogIn login(GetFakeUserManager(), identity_test_env(),
                     GetGaiaUserAccountId(profile()));
 
-  EXPECT_EQ(chromeos::assistant::AssistantAllowedState::ALLOWED,
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::ALLOWED,
             IsAssistantAllowedForProfile(profile()));
 }
 
@@ -282,7 +282,7 @@
                                  GetGaiaUserAccountId(profile()));
 
   EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
+      ash::assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
       IsAssistantAllowedForProfile(profile()));
 }
 
@@ -291,7 +291,7 @@
                     GetGaiaUserAccountId(profile()),
                     user_manager::USER_TYPE_CHILD);
 
-  EXPECT_EQ(chromeos::assistant::AssistantAllowedState::ALLOWED,
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::ALLOWED,
             IsAssistantAllowedForProfile(profile()));
 }
 
@@ -300,7 +300,7 @@
                     GetGuestAccountId(), user_manager::USER_TYPE_GUEST);
 
   EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
+      ash::assistant::AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER,
       IsAssistantAllowedForProfile(profile()));
 }
 
@@ -313,7 +313,7 @@
   ScopedLogIn login(GetFakeUserManager(), identity_test_env(),
                     GetGaiaUserAccountId(profile()));
 
-  EXPECT_EQ(chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_LOCALE,
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_LOCALE,
             IsAssistantAllowedForProfile(profile()));
   icu::Locale::setDefault(old_locale, error_code);
 }
@@ -324,7 +324,7 @@
   ScopedLogIn login(GetFakeUserManager(), identity_test_env(),
                     GetNonGaiaUserAccountId(profile()),
                     user_manager::USER_TYPE_PUBLIC_ACCOUNT);
-  EXPECT_EQ(chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_DEMO_MODE,
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_DEMO_MODE,
             IsAssistantAllowedForProfile(profile()));
 
   ash::DemoSession::SetDemoConfigForTesting(
@@ -335,9 +335,8 @@
   ScopedLogIn login(GetFakeUserManager(), identity_test_env(),
                     GetNonGaiaUserAccountId(profile()),
                     user_manager::USER_TYPE_PUBLIC_ACCOUNT);
-  EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION,
-      IsAssistantAllowedForProfile(profile()));
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION,
+            IsAssistantAllowedForProfile(profile()));
 }
 
 TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForProfile_NonGmail) {
@@ -345,16 +344,15 @@
       GetFakeUserManager(), identity_test_env(),
       GetGaiaUserAccountId("user2@someotherdomain.com", "0123456789"));
 
-  EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE,
-      IsAssistantAllowedForProfile(profile()));
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE,
+            IsAssistantAllowedForProfile(profile()));
 }
 
 TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForProfile_GoogleMail) {
   ScopedLogIn login(GetFakeUserManager(), identity_test_env(),
                     GetGaiaUserAccountId("user2@googlemail.com", "0123456789"));
 
-  EXPECT_EQ(chromeos::assistant::AssistantAllowedState::ALLOWED,
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::ALLOWED,
             IsAssistantAllowedForProfile(profile()));
 }
 
@@ -365,7 +363,7 @@
       GetGaiaUserAccountId("user2@someotherdomain.com", "0123456789"));
 
   ScopedSpoofGoogleBrandedDevice make_google_branded_device;
-  EXPECT_EQ(chromeos::assistant::AssistantAllowedState::ALLOWED,
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::ALLOWED,
             IsAssistantAllowedForProfile(profile()));
 }
 
@@ -375,9 +373,8 @@
                     GetActiveDirectoryUserAccountId(profile()),
                     user_manager::USER_TYPE_ACTIVE_DIRECTORY);
 
-  EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE,
-      IsAssistantAllowedForProfile(profile()));
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE,
+            IsAssistantAllowedForProfile(profile()));
 }
 
 TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForKiosk_KioskApp) {
@@ -385,9 +382,8 @@
                     GetNonGaiaUserAccountId(profile()),
                     user_manager::USER_TYPE_KIOSK_APP);
 
-  EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE,
-      IsAssistantAllowedForProfile(profile()));
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE,
+            IsAssistantAllowedForProfile(profile()));
 }
 
 TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForKiosk_ArcKioskApp) {
@@ -395,9 +391,8 @@
                     GetNonGaiaUserAccountId(profile()),
                     user_manager::USER_TYPE_ARC_KIOSK_APP);
 
-  EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE,
-      IsAssistantAllowedForProfile(profile()));
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE,
+            IsAssistantAllowedForProfile(profile()));
 }
 
 TEST_F(ChromeAssistantUtilTest, IsAssistantAllowedForKiosk_WebKioskApp) {
@@ -405,9 +400,8 @@
                     GetNonGaiaUserAccountId(profile()),
                     user_manager::USER_TYPE_WEB_KIOSK_APP);
 
-  EXPECT_EQ(
-      chromeos::assistant::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE,
-      IsAssistantAllowedForProfile(profile()));
+  EXPECT_EQ(ash::assistant::AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE,
+            IsAssistantAllowedForProfile(profile()));
 }
 
 }  // namespace assistant
diff --git a/chrome/browser/ash/bruschetta/bruschetta_service.cc b/chrome/browser/ash/bruschetta/bruschetta_service.cc
index 171769a1..e0c664e 100644
--- a/chrome/browser/ash/bruschetta/bruschetta_service.cc
+++ b/chrome/browser/ash/bruschetta/bruschetta_service.cc
@@ -10,6 +10,7 @@
 #include "chrome/browser/ash/bruschetta/bruschetta_launcher.h"
 #include "chrome/browser/ash/bruschetta/bruschetta_mount_provider.h"
 #include "chrome/browser/ash/bruschetta/bruschetta_service_factory.h"
+#include "chrome/browser/ash/bruschetta/bruschetta_util.h"
 #include "chrome/browser/ash/guest_os/guest_id.h"
 #include "chrome/browser/ash/guest_os/public/guest_os_service.h"
 #include "chrome/browser/ash/guest_os/public/types.h"
@@ -22,7 +23,8 @@
   // "bru" so hardcode this to get them working while we work on the full
   // installer. Similarly, Bruschetta doesn't have a container but it runs a
   // garcon that identifies itself as in a penguin container, so use that name.
-  guest_os::GuestId alpha_id{guest_os::VmType::BRUSCHETTA, "bru", "penguin"};
+  guest_os::GuestId alpha_id{guest_os::VmType::BRUSCHETTA, kBruschettaVmName,
+                             "penguin"};
   launchers_.insert(
       {alpha_id.vm_name, std::make_unique<BruschettaLauncher>("bru", profile)});
   guest_os::GuestOsService::GetForProfile(profile)
diff --git a/chrome/browser/ash/crostini/crostini_manager.cc b/chrome/browser/ash/crostini/crostini_manager.cc
index 4b5f89ab..5d496c3 100644
--- a/chrome/browser/ash/crostini/crostini_manager.cc
+++ b/chrome/browser/ash/crostini/crostini_manager.cc
@@ -26,6 +26,7 @@
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
+#include "chrome/browser/ash/bruschetta/bruschetta_util.h"
 #include "chrome/browser/ash/crostini/ansible/ansible_management_service.h"
 #include "chrome/browser/ash/crostini/crostini_engagement_metrics_service.h"
 #include "chrome/browser/ash/crostini/crostini_features.h"
@@ -1240,6 +1241,17 @@
   if (crostini::CrostiniFeatures::Get()->IsEnabled(profile_)) {
     for (const auto& container :
          guest_os::GetContainers(profile_, kCrostiniDefaultVmType)) {
+      // For a short while in M106 Bruschetta was getting added to prefs without
+      // a VM type, which meant it defaulted to Termina. If we've got it in
+      // prefs remove it instead of registering it. This'll break anyone who
+      // really has a vm named "bru" which is unfortunate, but we can't tell the
+      // difference between a correct and incorrect pref, so hopefully no one's
+      // done so.
+      // TODO(b/241043433): This code can be removed after M118.
+      if (container.vm_name == bruschetta::kBruschettaVmName) {
+        guest_os::RemoveContainerFromPrefs(profile, container);
+        continue;
+      }
       RegisterContainer(container);
     }
   }
diff --git a/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc b/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc
index b8661e02..791462bf 100644
--- a/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc
+++ b/chrome/browser/ash/file_manager/copy_or_move_io_task_unittest.cc
@@ -393,7 +393,7 @@
     // Register and mount another volume.
     test_volume_path_ = profile_.GetPath().Append("test_volume");
     volume_manager->AddVolumeForTesting(test_volume_path_, VOLUME_TYPE_TESTING,
-                                        chromeos::DEVICE_TYPE_UNKNOWN,
+                                        ash::DeviceType::kUnknown,
                                         false /* read_only */);
   }
 
diff --git a/chrome/browser/ash/file_manager/external_filesystem_apitest.cc b/chrome/browser/ash/file_manager/external_filesystem_apitest.cc
index 219334d..ae2de3b 100644
--- a/chrome/browser/ash/file_manager/external_filesystem_apitest.cc
+++ b/chrome/browser/ash/file_manager/external_filesystem_apitest.cc
@@ -415,7 +415,7 @@
         kLocalMountPointName, storage::kFileSystemTypeLocal,
         storage::FileSystemMountOption(), mount_point_dir_));
     VolumeManager::Get(profile())->AddVolumeForTesting(
-        mount_point_dir_, VOLUME_TYPE_TESTING, chromeos::DEVICE_TYPE_UNKNOWN,
+        mount_point_dir_, VOLUME_TYPE_TESTING, ash::DeviceType::kUnknown,
         false /* read_only */);
   }
 
@@ -445,7 +445,7 @@
         kRestrictedMountPointName, storage::kFileSystemTypeRestrictedLocal,
         storage::FileSystemMountOption(), mount_point_dir_));
     VolumeManager::Get(profile())->AddVolumeForTesting(
-        mount_point_dir_, VOLUME_TYPE_TESTING, chromeos::DEVICE_TYPE_UNKNOWN,
+        mount_point_dir_, VOLUME_TYPE_TESTING, ash::DeviceType::kUnknown,
         true /* read_only */);
   }
 
@@ -649,8 +649,8 @@
         kLocalMountPointName, storage::kFileSystemTypeLocal,
         storage::FileSystemMountOption(), local_mount_point_dir_));
     VolumeManager::Get(profile())->AddVolumeForTesting(
-        local_mount_point_dir_, VOLUME_TYPE_TESTING,
-        chromeos::DEVICE_TYPE_UNKNOWN, false /* read_only */);
+        local_mount_point_dir_, VOLUME_TYPE_TESTING, ash::DeviceType::kUnknown,
+        false /* read_only */);
     test_util::WaitUntilDriveMountPointIsAdded(profile());
   }
 
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
index 754d5b7..afa73fa1 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest_base.cc
@@ -1056,7 +1056,7 @@
  public:
   FakeTestVolume(const std::string& name,
                  VolumeType volume_type,
-                 chromeos::DeviceType device_type)
+                 ash::DeviceType device_type)
       : LocalTestVolume(name),
         volume_type_(volume_type),
         device_type_(device_type) {}
@@ -1138,7 +1138,7 @@
   }
 
   const VolumeType volume_type_;
-  const chromeos::DeviceType device_type_;
+  const ash::DeviceType device_type_;
   const bool read_only_ = false;
 };
 
@@ -1147,7 +1147,7 @@
  public:
   RemovableTestVolume(const std::string& name,
                       VolumeType volume_type,
-                      chromeos::DeviceType device_type,
+                      ash::DeviceType device_type,
                       const base::FilePath& device_path,
                       const std::string& drive_label,
                       const std::string& file_system_type)
@@ -1554,7 +1554,7 @@
   HiddenTestVolume()
       : FakeTestVolume("internal_test",
                        VolumeType::VOLUME_TYPE_SYSTEM_INTERNAL,
-                       chromeos::DeviceType::DEVICE_TYPE_UNKNOWN) {}
+                       ash::DeviceType::kUnknown) {}
   HiddenTestVolume(const HiddenTestVolume&) = delete;
   HiddenTestVolume& operator=(const HiddenTestVolume&) = delete;
 
@@ -2657,8 +2657,8 @@
       file_system = *file_system_param;
     }
     usb_volume_ = std::make_unique<RemovableTestVolume>(
-        "fake-usb", VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
-        chromeos::DEVICE_TYPE_USB, base::FilePath(), "FAKEUSB", file_system);
+        "fake-usb", VOLUME_TYPE_REMOVABLE_DISK_PARTITION, ash::DeviceType::kUSB,
+        base::FilePath(), "FAKEUSB", file_system);
 
     if (name == "mountFakeUsb")
       ASSERT_TRUE(usb_volume_->PrepareTestEntries(profile()));
@@ -2685,10 +2685,10 @@
     // Create partition volumes with the same device path and drive label.
     partition_1_ = std::make_unique<RemovableTestVolume>(
         "partition-1", VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
-        chromeos::DEVICE_TYPE_USB, device_path, "Drive Label", "ext4");
+        ash::DeviceType::kUSB, device_path, "Drive Label", "ext4");
     partition_2_ = std::make_unique<RemovableTestVolume>(
         "partition-2", VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
-        chromeos::DEVICE_TYPE_USB, device_path, "Drive Label", "ext4");
+        ash::DeviceType::kUSB, device_path, "Drive Label", "ext4");
 
     // Create fake entries on partitions.
     ASSERT_TRUE(partition_1_->PrepareTestEntries(profile()));
@@ -2709,13 +2709,13 @@
     // Create partition volumes with the same device path.
     partition_1_ = std::make_unique<RemovableTestVolume>(
         "partition-1", VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
-        chromeos::DEVICE_TYPE_USB, device_path, "Drive Label", "ntfs");
+        ash::DeviceType::kUSB, device_path, "Drive Label", "ntfs");
     partition_2_ = std::make_unique<RemovableTestVolume>(
         "partition-2", VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
-        chromeos::DEVICE_TYPE_USB, device_path, "Drive Label", "ext4");
+        ash::DeviceType::kUSB, device_path, "Drive Label", "ext4");
     partition_3_ = std::make_unique<RemovableTestVolume>(
         "partition-3", VOLUME_TYPE_REMOVABLE_DISK_PARTITION,
-        chromeos::DEVICE_TYPE_USB, device_path, "Drive Label", "vfat");
+        ash::DeviceType::kUSB, device_path, "Drive Label", "vfat");
 
     // Create fake entries on partitions.
     ASSERT_TRUE(partition_1_->PrepareTestEntries(profile()));
@@ -2737,8 +2737,8 @@
   }
 
   if (name == "mountFakeMtp" || name == "mountFakeMtpEmpty") {
-    mtp_volume_ = std::make_unique<FakeTestVolume>(
-        "fake-mtp", VOLUME_TYPE_MTP, chromeos::DEVICE_TYPE_UNKNOWN);
+    mtp_volume_ = std::make_unique<FakeTestVolume>("fake-mtp", VOLUME_TYPE_MTP,
+                                                   ash::DeviceType::kUnknown);
 
     if (name == "mountFakeMtp")
       ASSERT_TRUE(mtp_volume_->PrepareTestEntries(profile()));
diff --git a/chrome/browser/ash/file_manager/file_manager_jstest.cc b/chrome/browser/ash/file_manager/file_manager_jstest.cc
index 77eabd0..33dee06 100644
--- a/chrome/browser/ash/file_manager/file_manager_jstest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_jstest.cc
@@ -167,6 +167,10 @@
   RunTestURL("foreground/js/file_type_filters_controller_unittest.js");
 }
 
+IN_PROC_BROWSER_TEST_F(FileManagerJsTest, AsyncUtil) {
+  RunTestURL("common/js/async_util_unittest.js");
+}
+
 IN_PROC_BROWSER_TEST_F(FileManagerJsTest, FileType) {
   RunTestURL("common/js/file_type_unittest.js");
 }
diff --git a/chrome/browser/ash/file_manager/path_util_unittest.cc b/chrome/browser/ash/file_manager/path_util_unittest.cc
index da43d4f42..b1d39d2 100644
--- a/chrome/browser/ash/file_manager/path_util_unittest.cc
+++ b/chrome/browser/ash/file_manager/path_util_unittest.cc
@@ -1176,7 +1176,7 @@
 
   volume_manager->AddVolumeForTesting(
       base::FilePath("/mount_path/testing"), VOLUME_TYPE_TESTING,
-      chromeos::DEVICE_TYPE_UNKNOWN, false /* read_only */);
+      ash::DeviceType::kUnknown, false /* read_only */);
 
   struct Test {
     std::string path;
diff --git a/chrome/browser/ash/file_manager/volume_manager.cc b/chrome/browser/ash/file_manager/volume_manager.cc
index 07471f3..83428d3b 100644
--- a/chrome/browser/ash/file_manager/volume_manager.cc
+++ b/chrome/browser/ash/file_manager/volume_manager.cc
@@ -260,7 +260,6 @@
 Volume::Volume()
     : source_(SOURCE_FILE),
       type_(VOLUME_TYPE_GOOGLE_DRIVE),
-      device_type_(chromeos::DEVICE_TYPE_UNKNOWN),
       mount_condition_(ash::disks::MOUNT_CONDITION_NONE),
       mount_context_(MOUNT_CONTEXT_UNKNOWN),
       is_parent_(false),
@@ -278,7 +277,7 @@
     const base::FilePath& drive_path) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_GOOGLE_DRIVE;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   volume->source_path_ = drive_path;
   volume->source_ = SOURCE_NETWORK;
   volume->mount_path_ = drive_path;
@@ -295,7 +294,7 @@
     const base::FilePath& downloads_path) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_DOWNLOADS_DIRECTORY;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ = downloads_path;
@@ -332,7 +331,7 @@
     volume->drive_label_ = disk->drive_label();
   } else {
     volume->volume_label_ = volume->mount_path().BaseName().AsUTF8Unsafe();
-    volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+    volume->device_type_ = ash::DeviceType::kUnknown;
     volume->is_read_only_ =
         (mount_point.mount_type == ash::MountType::kArchive);
   }
@@ -432,7 +431,7 @@
   volume->volume_label_ = label;
   volume->source_path_ = mount_path;
   volume->source_ = SOURCE_DEVICE;
-  volume->device_type_ = chromeos::DEVICE_TYPE_MOBILE;
+  volume->device_type_ = ash::DeviceType::kMobile;
   return volume;
 }
 
@@ -444,7 +443,7 @@
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_MTP;
   volume->file_system_type_ = util::kFuseBox;
-  volume->device_type_ = chromeos::DEVICE_TYPE_MOBILE;
+  volume->device_type_ = ash::DeviceType::kMobile;
   volume->source_path_ = mount_path;
   volume->source_ = SOURCE_DEVICE;
   volume->mount_path_ = mount_path;
@@ -465,7 +464,7 @@
     const std::string& root_document_id) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_MEDIA_VIEW;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ = arc::GetDocumentsProviderMountPath(
       arc::kMediaDocumentsProviderAuthority, root_document_id);
@@ -484,7 +483,7 @@
     const base::FilePath& remote_mount_path) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_CROSTINI;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ = sshfs_mount_path;
@@ -505,7 +504,7 @@
     const guest_os::VmType vm_type) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_GUEST_OS;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ = sftp_mount_path;
@@ -523,7 +522,7 @@
     const base::FilePath& mount_path) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_ANDROID_FILES;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ = mount_path;
@@ -546,7 +545,7 @@
     bool read_only) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_DOCUMENTS_PROVIDER;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ =
@@ -570,7 +569,7 @@
                                              const std::string display_name) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_SMB;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_NETWORK;
   volume->mount_path_ = mount_point;
@@ -591,7 +590,7 @@
     const base::FilePath& mount_path) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_SYSTEM_INTERNAL;
-  volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
+  volume->device_type_ = ash::DeviceType::kUnknown;
   // Keep source_path empty.
   volume->source_ = SOURCE_SYSTEM;
   volume->mount_path_ = mount_path;
@@ -607,7 +606,7 @@
 std::unique_ptr<Volume> Volume::CreateForTesting(
     const base::FilePath& path,
     VolumeType volume_type,
-    chromeos::DeviceType device_type,
+    ash::DeviceType device_type,
     bool read_only,
     const base::FilePath& device_path,
     const std::string& drive_label,
@@ -990,7 +989,7 @@
 
 void VolumeManager::AddVolumeForTesting(const base::FilePath& path,
                                         VolumeType volume_type,
-                                        chromeos::DeviceType device_type,
+                                        ash::DeviceType device_type,
                                         bool read_only,
                                         const base::FilePath& device_path,
                                         const std::string& drive_label,
@@ -1011,7 +1010,7 @@
 void VolumeManager::RemoveVolumeForTesting(
     const base::FilePath& path,
     VolumeType volume_type,
-    chromeos::DeviceType device_type,
+    ash::DeviceType device_type,
     bool read_only,
     const base::FilePath& device_path,
     const std::string& drive_label,
diff --git a/chrome/browser/ash/file_manager/volume_manager.h b/chrome/browser/ash/file_manager/volume_manager.h
index dc9db3c..da27500 100644
--- a/chrome/browser/ash/file_manager/volume_manager.h
+++ b/chrome/browser/ash/file_manager/volume_manager.h
@@ -152,7 +152,7 @@
   static std::unique_ptr<Volume> CreateForTesting(
       const base::FilePath& path,
       VolumeType volume_type,
-      chromeos::DeviceType device_type,
+      ash::DeviceType device_type,
       bool read_only,
       const base::FilePath& device_path,
       const std::string& drive_label,
@@ -180,7 +180,7 @@
   }
   Source source() const { return source_; }
   VolumeType type() const { return type_; }
-  chromeos::DeviceType device_type() const { return device_type_; }
+  ash::DeviceType device_type() const { return device_type_; }
   const base::FilePath& source_path() const { return source_path_; }
   const base::FilePath& mount_path() const { return mount_path_; }
   const base::FilePath& remote_mount_path() const { return remote_mount_path_; }
@@ -237,7 +237,7 @@
   VolumeType type_;
 
   // The type of device. (e.g. USB, SD card, DVD etc.)
-  chromeos::DeviceType device_type_;
+  ash::DeviceType device_type_ = ash::DeviceType::kUnknown;
 
   // The source path of the volume.
   // E.g.:
@@ -429,7 +429,7 @@
   // type. Assumes that the mount point is already registered.
   void AddVolumeForTesting(const base::FilePath& path,
                            VolumeType volume_type,
-                           chromeos::DeviceType device_type,
+                           ash::DeviceType device_type,
                            bool read_only,
                            const base::FilePath& device_path = base::FilePath(),
                            const std::string& drive_label = "",
@@ -442,7 +442,7 @@
   void RemoveVolumeForTesting(
       const base::FilePath& path,
       VolumeType volume_type,
-      chromeos::DeviceType device_type,
+      ash::DeviceType device_type,
       bool read_only,
       const base::FilePath& device_path = base::FilePath(),
       const std::string& drive_label = "",
diff --git a/chrome/browser/ash/guest_os/guest_id.cc b/chrome/browser/ash/guest_os/guest_id.cc
index 54cf771..8a004ca 100644
--- a/chrome/browser/ash/guest_os/guest_id.cc
+++ b/chrome/browser/ash/guest_os/guest_id.cc
@@ -131,10 +131,7 @@
     return;
   }
 
-  base::Value new_container(base::Value::Type::DICTIONARY);
-  new_container.SetKey(prefs::kVmNameKey, base::Value(container_id.vm_name));
-  new_container.SetKey(prefs::kContainerNameKey,
-                       base::Value(container_id.container_name));
+  base::Value new_container{container_id.ToDictValue()};
   for (const auto item : properties) {
     if (base::Contains(*kPropertiesAllowList, item.first)) {
       new_container.SetKey(std::move(item.first), std::move(item.second));
@@ -203,6 +200,7 @@
   // when only TERMINA was using prefs..
   auto type = pref.FindIntKey(guest_os::prefs::kVmTypeKey);
   if (!type.has_value()) {
+    LOG(WARNING) << "No VM type in pref, defaulting to termina";
     return VmType::TERMINA;
   }
   if (*type < vm_tools::apps::VmType_MIN ||
diff --git a/chrome/browser/ash/guest_os/guest_id_unittest.cc b/chrome/browser/ash/guest_os/guest_id_unittest.cc
index 61d3a05e..80ab839 100644
--- a/chrome/browser/ash/guest_os/guest_id_unittest.cc
+++ b/chrome/browser/ash/guest_os/guest_id_unittest.cc
@@ -115,4 +115,13 @@
   EXPECT_EQ(VmType::UNKNOWN, VmTypeFromPref(dict));
 }
 
+TEST_F(GuestIdTest, RoundTripViaPrefs) {
+  auto id = guest_os::GuestId(guest_os::VmType::PLUGIN_VM, "vm_name",
+                              "container_name");
+  AddContainerToPrefs(&profile_, id, {});
+  auto list = GetContainers(&profile_, VmType::PLUGIN_VM);
+  ASSERT_EQ(list.size(), 1);
+  EXPECT_EQ(list[0], id);
+}
+
 }  // namespace guest_os
diff --git a/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc b/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc
index 454890a..da2df576 100644
--- a/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc
+++ b/chrome/browser/ash/login/screens/assistant_optin_flow_screen.cc
@@ -62,7 +62,7 @@
 
   if (::assistant::IsAssistantAllowedForProfile(
           ProfileManager::GetActiveUserProfile()) ==
-      chromeos::assistant::AssistantAllowedState::ALLOWED) {
+      assistant::AssistantAllowedState::ALLOWED) {
     return false;
   }
 
diff --git a/chrome/browser/ash/login/screens/assistant_optin_flow_screen_browsertest.cc b/chrome/browser/ash/login/screens/assistant_optin_flow_screen_browsertest.cc
index 3323a4b..1ae1039 100644
--- a/chrome/browser/ash/login/screens/assistant_optin_flow_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/assistant_optin_flow_screen_browsertest.cc
@@ -49,9 +49,6 @@
 
 namespace ash {
 
-// TODO(https://crbug.com/1164001): remove when migrated to ash::
-namespace assistant = ::chromeos::assistant;
-
 namespace {
 
 using ::net::test_server::BasicHttpResponse;
@@ -109,7 +106,7 @@
 constexpr char kAssistantOptInScreenStepCompletionTime[] =
     "OOBE.StepCompletionTime.Assistant-optin-flow";
 
-class ScopedAssistantSettings : public chromeos::assistant::AssistantSettings {
+class ScopedAssistantSettings : public assistant::AssistantSettings {
  public:
   // Flags to configure GetSettings response.
   static constexpr int CONSENT_UI_FLAGS_NONE = 0;
@@ -191,7 +188,7 @@
     speaker_id_enrollment_state_ = SpeakerIdEnrollmentState::IDLE;
   }
 
-  // chromeos::assistant::AssistantSettings:
+  // assistant::AssistantSettings:
   void GetSettings(const std::string& selector,
                    GetSettingsCallback callback) override {}
 
@@ -201,7 +198,7 @@
     ASSERT_TRUE(selector_proto.ParseFromString(selector));
     EXPECT_FALSE(selector_proto.about_me_settings());
     EXPECT_TRUE(selector_proto.has_consent_flow_ui_selector());
-    EXPECT_EQ(assistant::ActivityControlSettingsUiSelector::
+    EXPECT_EQ(chromeos::assistant::ActivityControlSettingsUiSelector::
                   ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS,
               selector_proto.consent_flow_ui_selector().flow_id());
 
@@ -276,12 +273,12 @@
                 update_proto.consent_flow_ui_update().consent_token());
       EXPECT_FALSE(
           update_proto.consent_flow_ui_update().saw_third_party_disclosure());
-      EXPECT_EQ(assistant::ActivityControlSettingsUiSelector::
+      EXPECT_EQ(chromeos::assistant::ActivityControlSettingsUiSelector::
                     ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS,
                 update_proto.consent_flow_ui_update().flow_id());
       collected_optins_.insert(OptIn::ACTIVITY_CONTROL);
       update_result.mutable_consent_flow_update_result()->set_update_status(
-          assistant::ConsentFlowUiUpdateResult::SUCCESS);
+          chromeos::assistant::ConsentFlowUiUpdateResult::SUCCESS);
     }
     std::string message;
     EXPECT_TRUE(update_result.SerializeToString(&message));
@@ -290,8 +287,7 @@
 
   void StartSpeakerIdEnrollment(
       bool skip_cloud_enrollment,
-      base::WeakPtr<chromeos::assistant::SpeakerIdEnrollmentClient> client)
-      override {
+      base::WeakPtr<assistant::SpeakerIdEnrollmentClient> client) override {
     if (speaker_id_enrollment_mode_ == SpeakerIdEnrollmentMode::IMMEDIATE) {
       client->OnSpeakerIdEnrollmentDone();
       return;
@@ -474,8 +470,7 @@
 IN_PROC_BROWSER_TEST_F(AssistantOptInFlowTest, Basic) {
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
@@ -514,8 +509,7 @@
 IN_PROC_BROWSER_TEST_F(AssistantOptInFlowTest, DisableScreenContext) {
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
@@ -555,8 +549,7 @@
   OobeScreenWaiter screen_waiter(AssistantOptInFlowScreenView::kScreenId);
   screen_waiter.Wait();
 
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   test::OobeJS().CreateVisibilityWaiter(true, kAssistantValueProp)->Wait();
   TapWhenEnabled(kValuePropNextButton);
@@ -589,8 +582,7 @@
 
   ShowAssistantOptInFlowScreen();
 
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   OobeScreenWaiter screen_waiter(AssistantOptInFlowScreenView::kScreenId);
   screen_waiter.Wait();
@@ -627,8 +619,7 @@
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
   SetUpAssistantScreensForTest();
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   ShowAssistantOptInFlowScreen();
 
@@ -659,8 +650,7 @@
       ScopedAssistantSettings::CONSENT_UI_FLAG_SKIP_ACTIVITY_CONTROL);
 
   SetUpAssistantScreensForTest();
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   ShowAssistantOptInFlowScreen();
 
@@ -696,8 +686,7 @@
       ScopedAssistantSettings::SpeakerIdEnrollmentMode::STEP_BY_STEP);
 
   SetUpAssistantScreensForTest();
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   ShowAssistantOptInFlowScreen();
 
@@ -766,8 +755,7 @@
       ScopedAssistantSettings::SpeakerIdEnrollmentMode::STEP_BY_STEP);
 
   SetUpAssistantScreensForTest();
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   ShowAssistantOptInFlowScreen();
 
@@ -814,8 +802,7 @@
       ScopedAssistantSettings::SpeakerIdEnrollmentMode::STEP_BY_STEP);
 
   SetUpAssistantScreensForTest();
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   ShowAssistantOptInFlowScreen();
 
@@ -867,8 +854,7 @@
   assistant_settings_->set_consent_ui_flags(
       ScopedAssistantSettings::CONSENT_UI_FLAG_WAA_DISABLED_BY_POLICY);
 
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
 
@@ -891,8 +877,7 @@
   assistant_settings_->set_consent_ui_flags(
       ScopedAssistantSettings::CONSENT_UI_FLAG_ASSISTANT_DISABLED_BY_POLICY);
 
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
 
@@ -913,8 +898,7 @@
 IN_PROC_BROWSER_TEST_F(AssistantOptInFlowTest, AssistantSkippedNoLib) {
   auto force_lib_assistant_disabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(false);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
 
@@ -943,8 +927,7 @@
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
   assistant_settings_->set_setting_zippy_size(2);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
@@ -989,8 +972,7 @@
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
   assistant_settings_->set_setting_zippy_size(2);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
@@ -1021,8 +1003,7 @@
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
   assistant_settings_->set_setting_zippy_size(2);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
@@ -1059,8 +1040,7 @@
   auto force_lib_assistant_enabled =
       AssistantOptInFlowScreen::ForceLibAssistantEnabledForTesting(true);
   assistant_settings_->set_setting_zippy_size(2);
-  AssistantState::Get()->NotifyStatusChanged(
-      chromeos::assistant::AssistantStatus::READY);
+  AssistantState::Get()->NotifyStatusChanged(assistant::AssistantStatus::READY);
 
   SetUpAssistantScreensForTest();
   ShowAssistantOptInFlowScreen();
diff --git a/chrome/browser/ash/net/traffic_counters_handler.cc b/chrome/browser/ash/net/traffic_counters_handler.cc
index b48ab84..82bee8f 100644
--- a/chrome/browser/ash/net/traffic_counters_handler.cc
+++ b/chrome/browser/ash/net/traffic_counters_handler.cc
@@ -20,8 +20,6 @@
 
 namespace {
 
-using chromeos::NetworkGuidId;
-
 // Interval duration to determine the auto reset check frequency.
 constexpr base::TimeDelta kResetCheckInterval = base::Hours(6);
 
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
index 5cee7265..68c43ea4 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
@@ -129,7 +129,7 @@
     auto* const ip_config_client =
         network_handler_test_helper_.ip_config_test();
     network_handler_test_helper_.manager_test()->AddTechnology(
-        ::chromeos::kTypeTether, true);
+        ::ash::kTypeTether, true);
 
     for (const auto& network_data : networks_data) {
       const std::string device_path = DevicePath(network_data.device_name);
@@ -406,7 +406,7 @@
        kInterfaceName, "192.168.86.26" /* ip_address */,
        "192.168.86.2" /* gateway */, true /* is_visible */,
        true /* is_configured */},
-      {"guid3", shill::kStateReady, ::chromeos::kTypeTether,
+      {"guid3", shill::kStateReady, ::ash::kTypeTether,
        0 /* signal_strength */, "tether1", "192.168.86.27" /* ip_address */,
        "192.168.86.3" /* gateway */, true /* is_visible */,
        true /* is_configured */}};
diff --git a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
index e4a5134..03fc1c9 100644
--- a/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
+++ b/chrome/browser/ash/remote_apps/remote_apps_manager_browsertest.cc
@@ -679,10 +679,9 @@
   EXPECT_TRUE(item->GetMetadata()->is_ephemeral);
 
   // Remote app sync item not added to local storage.
-  const base::Value* local_items =
-      profile_->GetPrefs()->GetDictionary(prefs::kAppListLocalState);
-  const base::Value* dict_item =
-      local_items->FindKeyOfType(kId1, base::Value::Type::DICTIONARY);
+  const base::Value::Dict& local_items =
+      profile_->GetPrefs()->GetValueDict(prefs::kAppListLocalState);
+  const base::Value::Dict* dict_item = local_items.FindDict(kId1);
   EXPECT_FALSE(dict_item);
 
   // Remote app sync item not uploaded to sync data.
@@ -724,10 +723,9 @@
   EXPECT_TRUE(item->GetMetadata()->is_ephemeral);
 
   // Remote folder sync item not added to local storage.
-  const base::Value* local_items =
-      profile_->GetPrefs()->GetDictionary(prefs::kAppListLocalState);
-  const base::Value* dict_item =
-      local_items->FindKeyOfType(kId1, base::Value::Type::DICTIONARY);
+  const base::Value::Dict& local_items =
+      profile_->GetPrefs()->GetValueDict(prefs::kAppListLocalState);
+  const base::Value::Dict* dict_item = local_items.FindDict(kId1);
   EXPECT_FALSE(dict_item);
 
   // Remote folder sync item not uploaded to sync data.
diff --git a/chrome/browser/ash/system_logs/network_health_source.cc b/chrome/browser/ash/system_logs/network_health_source.cc
index adc9c4c..32157a0a 100644
--- a/chrome/browser/ash/system_logs/network_health_source.cc
+++ b/chrome/browser/ash/system_logs/network_health_source.cc
@@ -29,7 +29,7 @@
 
   for (const auto& net : network_health->networks) {
     if (scrub) {
-      output << "Name: " << chromeos::NetworkGuidId(net->guid.value_or("N/A"))
+      output << "Name: " << ash::NetworkGuidId(net->guid.value_or("N/A"))
              << "\n";
     } else {
       output << "Name: " << net->name.value_or("N/A") << "\n";
diff --git a/chrome/browser/ash/system_logs/shill_log_source.cc b/chrome/browser/ash/system_logs/shill_log_source.cc
index 87ff855..ecd3dcf 100644
--- a/chrome/browser/ash/system_logs/shill_log_source.cc
+++ b/chrome/browser/ash/system_logs/shill_log_source.cc
@@ -235,7 +235,7 @@
 
   if (base::StartsWith(object_path, kServicePrefix,
                        base::CompareCase::SENSITIVE)) {
-    std::string log_name = chromeos::NetworkPathId(object_path);  // Not PII
+    std::string log_name = ash::NetworkPathId(object_path);  // Not PII
     dict.SetStringKey(shill::kNameProperty, log_name);
   } else if (base::StartsWith(object_path, kDevicePrefix,
                               base::CompareCase::SENSITIVE)) {
diff --git a/chrome/browser/ash/tether/tether_service_unittest.cc b/chrome/browser/ash/tether/tether_service_unittest.cc
index 23e3da3..9750b5f 100644
--- a/chrome/browser/ash/tether/tether_service_unittest.cc
+++ b/chrome/browser/ash/tether/tether_service_unittest.cc
@@ -456,7 +456,7 @@
   void SetCellularTechnologyStateEnabled(bool enabled) {
     network_state_handler()->SetTechnologyEnabled(
         NetworkTypePattern::Cellular(), enabled,
-        chromeos::network_handler::ErrorCallback());
+        network_handler::ErrorCallback());
     base::RunLoop().RunUntilIdle();
   }
 
diff --git a/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc b/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc
index 0f8c89a..2508b42e 100644
--- a/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc
+++ b/chrome/browser/ash/web_applications/help_app/help_app_untrusted_ui_config.cc
@@ -118,11 +118,11 @@
       !ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices().empty());
   // Checks if the Google Assistant is allowed on this device by going through
   // policies.
-  chromeos::assistant::AssistantAllowedState assistant_allowed_state =
-      assistant::IsAssistantAllowedForProfile(profile);
-  source->AddBoolean("assistantAllowed",
-                     assistant_allowed_state ==
-                         chromeos::assistant::AssistantAllowedState::ALLOWED);
+  assistant::AssistantAllowedState assistant_allowed_state =
+      ::assistant::IsAssistantAllowedForProfile(profile);
+  source->AddBoolean(
+      "assistantAllowed",
+      assistant_allowed_state == assistant::AssistantAllowedState::ALLOWED);
   source->AddBoolean("assistantEnabled",
                      AssistantState::Get()->settings_enabled().value_or(false));
   source->AddBoolean("playStoreEnabled",
diff --git a/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc b/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
index 79f0f0a..dd50509b3 100644
--- a/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/media_app/media_app_integration_browsertest.cc
@@ -1621,7 +1621,7 @@
       storage::FileSystemMountOption(), temp_dir.GetPath()));
   file_manager::VolumeManager::Get(profile())->AddVolumeForTesting(
       temp_dir.GetPath(), file_manager::VOLUME_TYPE_MOUNTED_ARCHIVE_FILE,
-      chromeos::DEVICE_TYPE_UNKNOWN, true /* read_only */);
+      ash::DeviceType::kUnknown, true /* read_only */);
 
   // Copy the test image into the new filesystem.
   base::FilePath image_path = temp_dir.GetPath().Append(kFileJpeg640x480);
diff --git a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate_unittest.cc b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate_unittest.cc
index 04cca0a..eb138a18 100644
--- a/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate_unittest.cc
+++ b/chrome/browser/autofill_assistant/password_change/apc_external_action_delegate_unittest.cc
@@ -420,8 +420,6 @@
 
 TEST_F(ApcExternalActionDelegateTest,
        ReceiveBasePromptAction_FromViewClickWithoutResultKey) {
-  // TODO: Check that we do not send a result if the result key field is not
-  // set.
   base::MockOnceCallback<void(
       const autofill_assistant::external::Result& result)>
       result_callback;
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 904cd7d..5eb49213 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -1976,7 +1976,6 @@
   DVLOG(1) << "AutotestPrivateGetLacrosInfoFunction";
   auto* browser_manager = crosapi::BrowserManager::Get();
   auto result = std::make_unique<base::DictionaryValue>();
-  result->SetBoolKey("isRunning", browser_manager->IsRunning());
   result->SetStringKey("state", api::autotest_private::ToString(
                                     ToLacrosState(browser_manager->state_)));
   result->SetBoolKey("isKeepAlive", browser_manager->IsKeepAliveEnabled());
diff --git a/chrome/browser/chromeos/extensions/echo_private/echo_private_api.cc b/chrome/browser/chromeos/extensions/echo_private/echo_private_api.cc
index c4c4561..a1e48e5 100644
--- a/chrome/browser/chromeos/extensions/echo_private/echo_private_api.cc
+++ b/chrome/browser/chromeos/extensions/echo_private/echo_private_api.cc
@@ -145,11 +145,11 @@
 
   const std::string& service_id = params->id;
   PrefService* local_state = g_browser_process->local_state();
-  const base::Value* offer_infos =
-      local_state->GetDictionary(prefs::kEchoCheckedOffers);
+  const base::Value& offer_infos =
+      local_state->GetValue(prefs::kEchoCheckedOffers);
+  DCHECK(offer_infos.is_dict());
 
-  const base::Value* offer_info =
-      offer_infos->FindDictKey("echo." + service_id);
+  const base::Value* offer_info = offer_infos.FindDictKey("echo." + service_id);
   if (!offer_info) {
     return RespondNow(Error("Not found"));
   }
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
index 746c07b..14008d7d1 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
@@ -75,7 +75,7 @@
   const char* product_name;
   const char* fs_uuid;
   const char* storage_device_path;
-  chromeos::DeviceType device_type;
+  ash::DeviceType device_type;
   uint64_t size_in_bytes;
   bool is_parent;
   bool is_read_only_hardware;
@@ -107,7 +107,7 @@
                               "product1",
                               "FFFF-FFFF",
                               "storage_device_path1",
-                              chromeos::DEVICE_TYPE_USB,
+                              ash::DeviceType::kUSB,
                               1073741824,
                               false,
                               false,
@@ -127,7 +127,7 @@
                               "product2",
                               "0FFF-FFFF",
                               "storage_device_path2",
-                              chromeos::DEVICE_TYPE_MOBILE,
+                              ash::DeviceType::kMobile,
                               47723,
                               true,
                               true,
@@ -147,7 +147,7 @@
                               "product3",
                               "00FF-FFFF",
                               "storage_device_path3",
-                              chromeos::DEVICE_TYPE_OPTICAL_DISC,
+                              ash::DeviceType::kOpticalDisc,
                               0,
                               true,
                               false,  // is_hardware_read_only
@@ -174,7 +174,7 @@
       kLocalMountPointName, storage::kFileSystemTypeLocal,
       storage::FileSystemMountOption(), root));
   file_manager::VolumeManager::Get(profile)->AddVolumeForTesting(
-      root, file_manager::VOLUME_TYPE_TESTING, chromeos::DEVICE_TYPE_UNKNOWN,
+      root, file_manager::VOLUME_TYPE_TESTING, ash::DeviceType::kUnknown,
       false /* read_only */);
 }
 
@@ -759,7 +759,7 @@
   file_manager::VolumeManager::Get(browser()->profile())
       ->AddVolumeForTesting(  // IN-TEST
           drive_path_.GetPath(), file_manager::VOLUME_TYPE_GOOGLE_DRIVE,
-          chromeos::DEVICE_TYPE_UNKNOWN,
+          ash::DeviceType::kUnknown,
           /*read_only=*/false);
 
   dlp::CheckFilesTransferResponse check_files_response;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
index 6c1f8f1..e8bbfb91 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc
@@ -263,8 +263,7 @@
       service->GetBoolean(arc::prefs::kArcHasAccessToRemovableMedia);
   std::vector<std::string> folder_shortcuts;
   const auto& value_list =
-      service->GetList(ash::prefs::kFilesAppFolderShortcuts)
-          ->GetListDeprecated();
+      service->GetValueList(ash::prefs::kFilesAppFolderShortcuts);
   for (const base::Value& value : value_list) {
     folder_shortcuts.push_back(value.is_string() ? value.GetString() : "");
   }
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
index d9337a3..a8d8984f 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_util.cc
@@ -540,22 +540,22 @@
   // Fill device_type iff the volume is removable partition.
   if (volume.type() == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) {
     switch (volume.device_type()) {
-      case chromeos::DEVICE_TYPE_UNKNOWN:
+      case ash::DeviceType::kUnknown:
         volume_metadata->device_type =
             file_manager_private::DEVICE_TYPE_UNKNOWN;
         break;
-      case chromeos::DEVICE_TYPE_USB:
+      case ash::DeviceType::kUSB:
         volume_metadata->device_type = file_manager_private::DEVICE_TYPE_USB;
         break;
-      case chromeos::DEVICE_TYPE_SD:
+      case ash::DeviceType::kSD:
         volume_metadata->device_type = file_manager_private::DEVICE_TYPE_SD;
         break;
-      case chromeos::DEVICE_TYPE_OPTICAL_DISC:
-      case chromeos::DEVICE_TYPE_DVD:
+      case ash::DeviceType::kOpticalDisc:
+      case ash::DeviceType::kDVD:
         volume_metadata->device_type =
             file_manager_private::DEVICE_TYPE_OPTICAL;
         break;
-      case chromeos::DEVICE_TYPE_MOBILE:
+      case ash::DeviceType::kMobile:
         volume_metadata->device_type = file_manager_private::DEVICE_TYPE_MOBILE;
         break;
     }
diff --git a/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc b/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc
index 97462f4bb..895381d5 100644
--- a/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/system_notification_manager.cc
@@ -936,7 +936,7 @@
     DCHECK_EQ(notification_buttons.size(), uma_types_for_buttons.size());
     notification->set_buttons(notification_buttons);
   }
-  if (volume.device_type() != chromeos::DEVICE_TYPE_UNKNOWN &&
+  if (volume.device_type() != ash::DeviceType::kUnknown &&
       !volume.storage_device_path().empty()) {
     if (UpdateDeviceMountStatus(event, volume) != MOUNT_STATUS_SUCCESS) {
       notification = MakeMountErrorNotification(event, volume);
@@ -964,7 +964,7 @@
       GetNotificationDisplayService()->Close(
           NotificationHandler::Type::TRANSIENT, kRemovableNotificationId);
 
-      if (volume.device_type() != chromeos::DEVICE_TYPE_UNKNOWN &&
+      if (volume.device_type() != ash::DeviceType::kUnknown &&
           !volume.storage_device_path().empty()) {
         UpdateDeviceMountStatus(event, volume);
       }
diff --git a/chrome/browser/chromeos/extensions/file_manager/system_notification_manager_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/system_notification_manager_unittest.cc
index ffd17d45..7b2341b 100644
--- a/chrome/browser/chromeos/extensions/file_manager/system_notification_manager_unittest.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/system_notification_manager_unittest.cc
@@ -187,7 +187,7 @@
 
     volume_manager->AddVolumeForTesting(
         CreateTestFile("volume/").path(), VOLUME_TYPE_DOWNLOADS_DIRECTORY,
-        chromeos::DEVICE_TYPE_UNKNOWN, false /* read only */);
+        ash::DeviceType::kUnknown, false /* read only */);
   }
 
   void TearDown() override {
@@ -497,7 +497,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -541,7 +541,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/true, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -589,7 +589,7 @@
   service->SetBoolean(arc::prefs::kArcEnabled, true);
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -635,7 +635,7 @@
   service->SetBoolean(arc::prefs::kArcEnabled, true);
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -671,7 +671,7 @@
   service->SetBoolean(arc::prefs::kArcHasAccessToRemovableMedia, true);
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -716,7 +716,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       "", "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -755,7 +755,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -798,7 +798,7 @@
   // Build a supported file system volume and mount it.
   std::unique_ptr<Volume> volume1(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       "", "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -825,7 +825,7 @@
   // Build an unsupported file system volume and mount it on the same device.
   std::unique_ptr<Volume> volume2(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path2")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       "", "unsupported"));
   event.status =
@@ -862,7 +862,7 @@
   // Build a supported file system volume and mount it.
   std::unique_ptr<Volume> volume1(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "FAT32"));
   file_manager_private::MountCompletedEvent event;
@@ -875,7 +875,7 @@
   // Build an unsupported file system volume and mount it on the same device.
   std::unique_ptr<Volume> volume2(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path2")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "unsupported"));
   event.status =
@@ -914,7 +914,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       "", "unknown"));
   file_manager_private::MountCompletedEvent event;
@@ -958,7 +958,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/false, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "unknown"));
   file_manager_private::MountCompletedEvent event;
@@ -1004,7 +1004,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/true, base::FilePath(FILE_PATH_LITERAL("/device/test")), "",
       "unknown"));
   file_manager_private::MountCompletedEvent event;
@@ -1043,7 +1043,7 @@
   base::HistogramTester histogram_tester;
   std::unique_ptr<Volume> volume(Volume::CreateForTesting(
       base::FilePath(FILE_PATH_LITERAL("/mount/path1")),
-      VolumeType::VOLUME_TYPE_TESTING, chromeos::DeviceType::DEVICE_TYPE_USB,
+      VolumeType::VOLUME_TYPE_TESTING, ash::DeviceType::kUSB,
       /*read_only=*/true, base::FilePath(FILE_PATH_LITERAL("/device/test")),
       kDeviceLabel, "unknown"));
   file_manager_private::MountCompletedEvent event;
diff --git a/chrome/browser/chromeos/extensions/input_method_api.cc b/chrome/browser/chromeos/extensions/input_method_api.cc
index eba37ef..ae58a76 100644
--- a/chrome/browser/chromeos/extensions/input_method_api.cc
+++ b/chrome/browser/chromeos/extensions/input_method_api.cc
@@ -387,11 +387,12 @@
   const auto params = GetSettings::Params::Create(args());
   EXTENSION_FUNCTION_VALIDATE(params.get());
 
-  const base::Value* input_methods =
+  const base::Value::Dict& input_methods =
       Profile::FromBrowserContext(browser_context())
           ->GetPrefs()
-          ->GetDictionary(prefs::kLanguageInputMethodSpecificSettings);
-  const base::Value* engine_result = input_methods->FindPath(params->engine_id);
+          ->GetValueDict(prefs::kLanguageInputMethodSpecificSettings);
+  const base::Value* engine_result =
+      input_methods.FindByDottedPath(params->engine_id);
   base::Value result;
   if (engine_result)
     result = engine_result->Clone();
diff --git a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc
index 29426a7..5e81066 100644
--- a/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc
+++ b/chrome/browser/chromeos/extensions/login_screen/login/cleanup/extension_cleanup_handler.cc
@@ -135,10 +135,10 @@
 std::unordered_set<std::string>
 ExtensionCleanupHandler::GetCleanupExemptExtensions() {
   std::unordered_set<std::string> exempt_extensions;
-  const base::Value* exempt_list = profile_->GetPrefs()->GetList(
+  const base::Value::List& exempt_list = profile_->GetPrefs()->GetValueList(
       prefs::kRestrictedManagedGuestSessionExtensionCleanupExemptList);
 
-  for (const base::Value& value : exempt_list->GetListDeprecated()) {
+  for (const base::Value& value : exempt_list) {
     exempt_extensions.insert(value.GetString());
   }
   return exempt_extensions;
diff --git a/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java b/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java
index 62b726dd..4294b1bc 100644
--- a/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java
+++ b/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingFeaturesTest.java
@@ -149,8 +149,8 @@
         when(mIdentityManagerMock.hasPrimaryAccount(anyInt())).thenReturn(isSignedIn);
     }
 
-    private void setTabSyncStatus(boolean isSyncRequested, boolean hasSessions) {
-        when(mSyncServiceMock.isSyncRequested()).thenReturn(isSyncRequested);
+    private void setTabSyncStatus(boolean isSyncFeatureEnabled, boolean hasSessions) {
+        when(mSyncServiceMock.isSyncFeatureEnabled()).thenReturn(isSyncFeatureEnabled);
         when(mSyncServiceMock.getActiveDataTypes())
                 .thenReturn(hasSessions ? CollectionUtil.newHashSet(ModelType.SESSIONS)
                                         : CollectionUtil.newHashSet(ModelType.AUTOFILL));
diff --git a/chrome/browser/devtools/devtools_file_helper.cc b/chrome/browser/devtools/devtools_file_helper.cc
index fc3d8d8..72cc07d 100644
--- a/chrome/browser/devtools/devtools_file_helper.cc
+++ b/chrome/browser/devtools/devtools_file_helper.cc
@@ -195,15 +195,13 @@
 
 using PathToType = std::map<std::string, std::string>;
 PathToType GetAddedFileSystemPaths(Profile* profile) {
-  const base::DictionaryValue* file_systems_paths_value =
-      &base::Value::AsDictionaryValue(
-          *profile->GetPrefs()->GetDictionary(prefs::kDevToolsFileSystemPaths));
+  const base::Value::Dict& file_systems_paths_value =
+      profile->GetPrefs()->GetValueDict(prefs::kDevToolsFileSystemPaths);
   PathToType result;
-  for (base::DictionaryValue::Iterator it(*file_systems_paths_value);
-       !it.IsAtEnd(); it.Advance()) {
+  for (auto pair : file_systems_paths_value) {
     std::string type =
-        it.value().is_string() ? it.value().GetString() : std::string();
-    result[it.key()] = type;
+        pair.second.is_string() ? pair.second.GetString() : std::string();
+    result[pair.first] = type;
   }
   return result;
 }
@@ -249,12 +247,11 @@
     return;
   }
 
-  const base::DictionaryValue* file_map = &base::Value::AsDictionaryValue(
-      *profile_->GetPrefs()->GetDictionary(prefs::kDevToolsEditedFiles));
+  const base::Value::Dict& file_map =
+      profile_->GetPrefs()->GetValueDict(prefs::kDevToolsEditedFiles);
   base::FilePath initial_path;
 
-  const base::Value* path_value;
-  if (file_map->Get(base::MD5String(url), &path_value)) {
+  if (const base::Value* path_value = file_map.Find(base::MD5String(url))) {
     absl::optional<base::FilePath> path = base::ValueToFilePath(*path_value);
     if (path)
       initial_path = std::move(*path);
diff --git a/chrome/browser/devtools/devtools_settings.cc b/chrome/browser/devtools/devtools_settings.cc
index a56ed35..408a53f 100644
--- a/chrome/browser/devtools/devtools_settings.cc
+++ b/chrome/browser/devtools/devtools_settings.cc
@@ -41,7 +41,7 @@
           ? prefs::kDevToolsPreferences
           : GetDictionaryNameForSyncedPrefs();
   const std::string* settings_value =
-      prefs->GetDictionary(dictionary_to_remove_from)->FindStringKey(name);
+      prefs->GetValueDict(dictionary_to_remove_from).FindString(name);
   if (!settings_value) {
     return;
   }
@@ -51,7 +51,7 @@
   // Settings already moved to the synced dictionary on a different device have
   // precedence.
   const std::string* already_synced_value =
-      prefs->GetDictionary(dictionary_to_insert_into)->FindStringKey(name);
+      prefs->GetValueDict(dictionary_to_insert_into).FindString(name);
   if (dictionary_to_insert_into == prefs::kDevToolsPreferences ||
       !already_synced_value) {
     DictionaryPrefUpdate insert_update(profile_->GetPrefs(),
@@ -65,19 +65,19 @@
 }
 
 base::Value DevToolsSettings::Get() {
-  base::Value settings(base::Value::Type::DICTIONARY);
+  base::Value::Dict settings;
 
   PrefService* prefs = profile_->GetPrefs();
   // DevTools expects any kind of preference to be a string. Parsing is
   // happening on the frontend.
-  settings.SetStringKey(
+  settings.Set(
       kSyncDevToolsPreferencesFrontendName,
       prefs->GetBoolean(prefs::kDevToolsSyncPreferences) ? "true" : "false");
-  settings.MergeDictionary(prefs->GetDictionary(prefs::kDevToolsPreferences));
-  settings.MergeDictionary(
-      prefs->GetDictionary(GetDictionaryNameForSyncedPrefs()));
+  settings.Merge(prefs->GetValueDict(prefs::kDevToolsPreferences).Clone());
+  settings.Merge(
+      prefs->GetValueDict(GetDictionaryNameForSyncedPrefs()).Clone());
 
-  return settings;
+  return base::Value(std::move(settings));
 }
 
 absl::optional<base::Value> DevToolsSettings::Get(const std::string& name) {
@@ -171,7 +171,9 @@
 
   DictionaryPrefUpdate target_update(profile_->GetPrefs(), target_dictionary);
   target_update.Get()->MergeDictionary(
-      profile_->GetPrefs()->GetDictionary(source_dictionary));
+      // This should be `PrefService::GetValueDict`, but
+      // `DictionaryPrefUpdate::Get()` currently yields a `base::Value*`.
+      &profile_->GetPrefs()->GetValue(source_dictionary));
   DictionaryPrefUpdate source_update(profile_->GetPrefs(), source_dictionary);
   source_update.Get()->DictClear();
 }
diff --git a/chrome/browser/devtools/devtools_window.cc b/chrome/browser/devtools/devtools_window.cc
index 0b23420..93f7613 100644
--- a/chrome/browser/devtools/devtools_window.cc
+++ b/chrome/browser/devtools/devtools_window.cc
@@ -1658,8 +1658,7 @@
 
 void DevToolsWindow::CreateDevToolsBrowser() {
   PrefService* prefs = profile_->GetPrefs();
-  if (!prefs->GetDictionary(prefs::kAppWindowPlacement)
-           ->FindKey(kDevToolsApp)) {
+  if (!prefs->GetValueDict(prefs::kAppWindowPlacement).Find(kDevToolsApp)) {
     // Ensure there is always a default size so that
     // BrowserFrame::InitBrowserFrame can retrieve it later.
     DictionaryPrefUpdate update(prefs, prefs::kAppWindowPlacement);
diff --git a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
index 969f24f..299a7cb9 100644
--- a/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
+++ b/chrome/browser/extensions/api/cryptotoken_private/cryptotoken_private_api.cc
@@ -57,13 +57,13 @@
 
 // ContainsAppIdByHash returns true iff the SHA-256 hash of one of the
 // elements of |list| equals |hash|.
-bool ContainsAppIdByHash(const base::Value& list,
+bool ContainsAppIdByHash(const base::Value::List& list,
                          const std::vector<uint8_t>& hash) {
   if (hash.size() != crypto::kSHA256Length) {
     return false;
   }
 
-  for (const auto& i : list.GetListDeprecated()) {
+  for (const auto& i : list) {
     const std::string& s = i.GetString();
     if (s.find('/') == std::string::npos) {
       // No slashes mean that this is a webauthn RP ID, not a U2F AppID.
@@ -170,12 +170,12 @@
 
   Profile* const profile = Profile::FromBrowserContext(browser_context());
   const PrefService* const prefs = profile->GetPrefs();
-  const base::Value* const permit_attestation =
-      prefs->GetList(prefs::kSecurityKeyPermitAttestation);
+  const base::Value::List& permit_attestation =
+      prefs->GetValueList(prefs::kSecurityKeyPermitAttestation);
 
   return RespondNow(ArgumentList(
       cryptotoken_private::IsAppIdHashInEnterpriseContext::Results::Create(
-          ContainsAppIdByHash(*permit_attestation, params->app_id_hash))));
+          ContainsAppIdByHash(permit_attestation, params->app_id_hash))));
 }
 
 CryptotokenPrivateCanAppIdGetAttestationFunction::
@@ -200,10 +200,10 @@
   // prompt is shown.
   Profile* const profile = Profile::FromBrowserContext(browser_context());
   const PrefService* const prefs = profile->GetPrefs();
-  const base::Value* const permit_attestation =
-      prefs->GetList(prefs::kSecurityKeyPermitAttestation);
+  const base::Value::List& permit_attestation =
+      prefs->GetValueList(prefs::kSecurityKeyPermitAttestation);
 
-  for (const auto& entry : permit_attestation->GetListDeprecated()) {
+  for (const auto& entry : permit_attestation) {
     if (entry.GetString() == app_id)
       return RespondNow(OneArgument(base::Value(true)));
   }
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
index 805137d..b922e51 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.cc
@@ -132,13 +132,10 @@
     // allowed in chrome/common/extensions/api/_permission_features.json
     return true;
   }
-  const base::Value* list =
-      profile->GetPrefs()->GetList(prefs::kAttestationExtensionAllowlist);
-  DCHECK_NE(list, nullptr);
+  const base::Value::List& list =
+      profile->GetPrefs()->GetValueList(prefs::kAttestationExtensionAllowlist);
   base::Value value(extension->id());
-  return std::find(list->GetListDeprecated().begin(),
-                   list->GetListDeprecated().end(),
-                   value) != list->GetListDeprecated().end();
+  return base::Contains(list, value);
 }
 
 }  // namespace platform_keys
diff --git a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
index e7cf3220..632e52cd 100644
--- a/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
+++ b/chrome/browser/extensions/api/file_system/file_system_apitest_chromeos.cc
@@ -242,7 +242,7 @@
     ASSERT_TRUE(volume_manager);
     volume_manager->AddVolumeForTesting(
         base::FilePath("/a/b/c"), file_manager::VOLUME_TYPE_TESTING,
-        chromeos::DEVICE_TYPE_UNKNOWN, false /* read_only */);
+        ash::DeviceType::kUnknown, false /* read_only */);
   }
 
  protected:
@@ -264,9 +264,9 @@
     VolumeManager* const volume_manager =
         VolumeManager::Get(browser()->profile());
     ASSERT_TRUE(volume_manager);
-    volume_manager->AddVolumeForTesting(
-        mount_point_path, file_manager::VOLUME_TYPE_TESTING,
-        chromeos::DEVICE_TYPE_UNKNOWN, read_only);
+    volume_manager->AddVolumeForTesting(mount_point_path,
+                                        file_manager::VOLUME_TYPE_TESTING,
+                                        ash::DeviceType::kUnknown, read_only);
   }
 
   // Simulates entering the kiosk session.
diff --git a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc
index 8717087..66305167 100644
--- a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc
+++ b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc
@@ -32,8 +32,8 @@
        ++iter) {
     const Disk& disk = *iter->second;
     if (disk.is_parent() && !disk.on_boot_device() && disk.has_media() &&
-        (disk.device_type() == chromeos::DEVICE_TYPE_USB ||
-         disk.device_type() == chromeos::DEVICE_TYPE_SD)) {
+        (disk.device_type() == ash::DeviceType::kUSB ||
+         disk.device_type() == ash::DeviceType::kSD)) {
       api::image_writer_private::RemovableStorageDevice device;
       device.storage_unit_id = disk.device_path();
       device.capacity = disk.total_size_in_bytes();
@@ -42,7 +42,7 @@
       device.model = disk.product_name();
 
       if (device.model.empty() && device.vendor.empty()) {
-        if (disk.device_type() == chromeos::DEVICE_TYPE_USB) {
+        if (disk.device_type() == ash::DeviceType::kUSB) {
           device.model = kUnknownUSBDiskModel;
         } else {
           device.model = kUnknownSDDiskModel;
diff --git a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos_unittest.cc b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos_unittest.cc
index 0b97a5d..160143a 100644
--- a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos_unittest.cc
@@ -46,7 +46,7 @@
   }
 
   void CreateDisk(const std::string& device_path,
-                  chromeos::DeviceType device_type,
+                  ash::DeviceType device_type,
                   bool is_parent,
                   bool has_media,
                   bool on_boot_device) {
@@ -62,7 +62,7 @@
   void CreateDisk(const std::string& device_path,
                   const std::string& vendor_name,
                   const std::string& product_name,
-                  chromeos::DeviceType device_type,
+                  ash::DeviceType device_type,
                   bool is_parent,
                   bool has_media,
                   bool on_boot_device) {
@@ -112,11 +112,11 @@
 // that are parents, have media and are not boot devices.  Other flags are
 // uninteresting or should not occur for these device types.
 TEST_F(RemovableStorageProviderChromeOsUnitTest, GetAllDevices) {
-  CreateDisk(kDevicePathUSB, chromeos::DEVICE_TYPE_USB, true, true, false);
-  CreateDisk(kDevicePathSD, chromeos::DEVICE_TYPE_SD, true, true, false);
-  CreateDisk("/dev/NotParent", chromeos::DEVICE_TYPE_USB, false, true, false);
-  CreateDisk("/dev/NoMedia", chromeos::DEVICE_TYPE_USB, true, false, false);
-  CreateDisk("/dev/OnBootDevice", chromeos::DEVICE_TYPE_USB, true, true, true);
+  CreateDisk(kDevicePathUSB, ash::DeviceType::kUSB, true, true, false);
+  CreateDisk(kDevicePathSD, ash::DeviceType::kSD, true, true, false);
+  CreateDisk("/dev/NotParent", ash::DeviceType::kUSB, false, true, false);
+  CreateDisk("/dev/NoMedia", ash::DeviceType::kUSB, true, false, false);
+  CreateDisk("/dev/OnBootDevice", ash::DeviceType::kUSB, true, true, true);
 
   RemovableStorageProvider::GetAllDevices(
       base::BindOnce(&RemovableStorageProviderChromeOsUnitTest::DevicesCallback,
@@ -134,10 +134,8 @@
 
 // Tests that a USB drive with an empty vendor and product gets a generic name.
 TEST_F(RemovableStorageProviderChromeOsUnitTest, EmptyProductAndModel) {
-  CreateDisk(
-      kDevicePathUSB, "", "", chromeos::DEVICE_TYPE_USB, true, true, false);
-  CreateDisk(
-      kDevicePathSD, "", "", chromeos::DEVICE_TYPE_SD, true, true, false);
+  CreateDisk(kDevicePathUSB, "", "", ash::DeviceType::kUSB, true, true, false);
+  CreateDisk(kDevicePathSD, "", "", ash::DeviceType::kSD, true, true, false);
 
   RemovableStorageProvider::GetAllDevices(
       base::BindOnce(&RemovableStorageProviderChromeOsUnitTest::DevicesCallback,
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.cc b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
index b643dd2..329c192 100644
--- a/chrome/browser/extensions/api/image_writer_private/test_utils.cc
+++ b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
@@ -257,9 +257,8 @@
       ash::disks::DiskMountManager::MountPointInfo(
           test_device_path_.value(), "/dummy/mount", ash::MountType::kDevice,
           ash::disks::MOUNT_CONDITION_NONE),
-      "device_id", "device_label", "Vendor", "Product",
-      chromeos::DEVICE_TYPE_USB, kTestFileSize, true, true, true, false,
-      kTestFileSystemType);
+      "device_id", "device_label", "Vendor", "Product", ash::DeviceType::kUSB,
+      kTestFileSize, true, true, true, false, kTestFileSystemType);
   disk_manager->SetupDefaultReplies();
 #else
   ImageWriterUtilityClient::SetFactoryForTesting(&utility_client_factory_);
diff --git a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
index ac98ad1..2bb375b 100644
--- a/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
+++ b/chrome/browser/extensions/api/language_settings_private/language_settings_private_api.cc
@@ -81,7 +81,7 @@
 // Returns the set of allowed UI locales.
 base::flat_set<std::string> GetAllowedLanguages(PrefService* prefs) {
   const auto& allowed_languages_values =
-      prefs->GetList(prefs::kAllowedLanguages)->GetListDeprecated();
+      prefs->GetValueList(prefs::kAllowedLanguages);
   return base::MakeFlatSet<std::string>(
       allowed_languages_values, {},
       [](const auto& locale_value) { return locale_value.GetString(); });
diff --git a/chrome/browser/extensions/api/printing/print_job_submitter.cc b/chrome/browser/extensions/api/printing/print_job_submitter.cc
index 3a05db9..01133ce9 100644
--- a/chrome/browser/extensions/api/printing/print_job_submitter.cc
+++ b/chrome/browser/extensions/api/printing/print_job_submitter.cc
@@ -77,11 +77,11 @@
                                 const std::string& extension_id) {
   if (g_skip_confirmation_dialog_for_testing)
     return false;
-  const base::Value* list =
+  const base::Value::List& list =
       Profile::FromBrowserContext(browser_context)
           ->GetPrefs()
-          ->GetList(prefs::kPrintingAPIExtensionsAllowlist);
-  return !base::Contains(list->GetList(), base::Value(extension_id));
+          ->GetValueList(prefs::kPrintingAPIExtensionsAllowlist);
+  return !base::Contains(list, base::Value(extension_id));
 }
 
 }  // namespace
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc
index 75975b4..4e2acc7 100644
--- a/chrome/browser/extensions/api/settings_private/prefs_util.cc
+++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -587,24 +587,23 @@
       settings_api::PrefType::PREF_TYPE_NUMBER;
 
   // Google Assistant.
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantConsentStatus] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantConsentStatus] =
       settings_api::PrefType::PREF_TYPE_NUMBER;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantDisabledByPolicy] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantDisabledByPolicy] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantEnabled] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantContextEnabled] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantContextEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantHotwordAlwaysOn] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantHotwordAlwaysOn] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantHotwordEnabled] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantHotwordEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)
-      [chromeos::assistant::prefs::kAssistantVoiceMatchEnabledDuringOobe] =
-          settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantLaunchWithMicOpen] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantVoiceMatchEnabledDuringOobe] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
-  (*s_allowlist)[chromeos::assistant::prefs::kAssistantNotificationEnabled] =
+  (*s_allowlist)[ash::assistant::prefs::kAssistantLaunchWithMicOpen] =
+      settings_api::PrefType::PREF_TYPE_BOOLEAN;
+  (*s_allowlist)[ash::assistant::prefs::kAssistantNotificationEnabled] =
       settings_api::PrefType::PREF_TYPE_BOOLEAN;
 
   // Quick Answers.
@@ -1256,7 +1255,7 @@
 
 bool PrefsUtil::IsHotwordDisabledForChildUser(const std::string& pref_name) {
   const std::string& hotwordEnabledPref =
-      chromeos::assistant::prefs::kAssistantHotwordEnabled;
+      ash::assistant::prefs::kAssistantHotwordEnabled;
   if (!profile_->IsChild() || pref_name != hotwordEnabledPref)
     return false;
 
diff --git a/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc b/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc
index 7db25c1..e5c5240 100644
--- a/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc
+++ b/chrome/browser/extensions/api/shared_storage/shared_storage_private_api_ash.cc
@@ -31,7 +31,8 @@
 ExtensionFunction::ResponseAction SharedStoragePrivateGetFunction::Run() {
   PrefService* prefs =
       Profile::FromBrowserContext(browser_context())->GetPrefs();
-  return RespondNow(OneArgument(prefs->Get(prefs::kSharedStorage)->Clone()));
+  return RespondNow(
+      OneArgument(prefs->GetValue(prefs::kSharedStorage).Clone()));
 }
 
 SharedStoragePrivateSetFunction::SharedStoragePrivateSetFunction() = default;
diff --git a/chrome/browser/extensions/api/terminal/terminal_private_api.cc b/chrome/browser/extensions/api/terminal/terminal_private_api.cc
index a9d129f..2b504e7 100644
--- a/chrome/browser/extensions/api/terminal/terminal_private_api.cc
+++ b/chrome/browser/extensions/api/terminal/terminal_private_api.cc
@@ -217,7 +217,7 @@
   }
   base::Value::List args;
   base::Value prefs(base::Value::Type::DICTIONARY);
-  prefs.SetKey(pref_name, profile->GetPrefs()->Get(pref_name)->Clone());
+  prefs.SetKey(pref_name, profile->GetPrefs()->GetValue(pref_name).Clone());
   args.Append(std::move(prefs));
   auto event = std::make_unique<extensions::Event>(
       extensions::events::TERMINAL_PRIVATE_ON_PREF_CHANGED,
@@ -745,7 +745,7 @@
       guest_os::RecordTerminalSettingsChangesUMAs(
           Profile::FromBrowserContext(browser_context()));
     }
-    result.SetKey(path, service->Get(path)->Clone());
+    result.SetKey(path, service->GetValue(path).Clone());
   }
   return RespondNow(OneArgument(std::move(result)));
 }
diff --git a/chrome/browser/extensions/api/webstore_private/extension_install_status.cc b/chrome/browser/extensions/api/webstore_private/extension_install_status.cc
index f550a67..e6c4bfbd 100644
--- a/chrome/browser/extensions/api/webstore_private/extension_install_status.cc
+++ b/chrome/browser/extensions/api/webstore_private/extension_install_status.cc
@@ -134,8 +134,8 @@
     return kBlockedByPolicy;
 
   if (profile->GetPrefs()
-          ->GetDictionary(prefs::kCloudExtensionRequestIds)
-          ->FindKey(extension_id)) {
+          ->GetValueDict(prefs::kCloudExtensionRequestIds)
+          .Find(extension_id)) {
     return kRequestPending;
   }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 17024838..f0274e87 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -764,11 +764,6 @@
     "expiry_milestone": 105
   },
   {
-    "name": "categorical-search",
-    "owners": [ "tby", "thanhdng", "wrong" ],
-    "expiry_milestone": 100
-  },
-  {
     "name": "cct-brand-transparency",
     "owners": [ "wenyufu" ],
     "expiry_milestone": 110
@@ -1279,7 +1274,7 @@
   {
     "name": "disable-camera-frame-rotation-at-source",
     "owners": [ "chromeos-camera-eng@google.com" ],
-    "expiry_milestone": 104
+    "expiry_milestone": 110
   },
   {
     "name": "disable-cancel-all-touches",
@@ -6381,19 +6376,9 @@
     "expiry_milestone": 112
   },
   {
-    "name": "username-first-flow",
-    "owners": [ "kazinova@google.com", "kolos" ],
-    "expiry_milestone": 105
-  },
-  {
     "name": "username-first-flow-fallback-crowdsourcing",
     "owners": [ "kazinova@google.com", "kolos" ],
-    "expiry_milestone": 105
-  },
-  {
-    "name": "username-first-flow-filling",
-    "owners": [ "kazinova@google.com", "kolos" ],
-    "expiry_milestone": 105
+    "expiry_milestone": 110
   },
   {
     "name": "uxstudy1",
@@ -6640,6 +6625,6 @@
       // For MacOS and Windows
       "video-cmi-mpp@google.com"
     ],
-    "expiry_milestone": 109
+    "expiry_milestone": 110
   }
 ]
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 3d23092..d7c97093 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -471,7 +471,7 @@
     public static final String PREFETCH_NOTIFICATION_SCHEDULING_INTEGRATION =
             "PrefetchNotificationSchedulingIntegration";
     public static final String PRERENDER2 = "Prerender2";
-    public static final String PRIVACY_REVIEW = "PrivacyGuideAndroid";
+    public static final String PRIVACY_GUIDE = "PrivacyGuideAndroid";
     public static final String PRIVACY_SANDBOX_SETTINGS_3 = "PrivacySandboxSettings3";
     public static final String PROBABILISTIC_CRYPTID_RENDERER = "ProbabilisticCryptidRenderer";
     public static final String PUSH_MESSAGING_DISALLOW_SENDER_IDS =
diff --git a/chrome/browser/language/language_model_manager_factory.cc b/chrome/browser/language/language_model_manager_factory.cc
index f0cc4b0..90e4c1a 100644
--- a/chrome/browser/language/language_model_manager_factory.cc
+++ b/chrome/browser/language/language_model_manager_factory.cc
@@ -33,6 +33,8 @@
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
 #include "chrome/browser/language/android/language_bridge.h"
+
+using language::ULPMetricsLogger;
 #endif
 
 namespace {
@@ -48,12 +50,13 @@
   PrefService* pref_service = profile->GetPrefs();
   const std::string app_locale = g_browser_process->GetApplicationLocale();
   logger.RecordInitiationUILanguageInULP(
-      logger.DetermineLanguageStatus(app_locale, ulp_languages));
+      ULPMetricsLogger::DetermineLanguageStatus(app_locale, ulp_languages));
 
   const std::string target_language =
       translate::TranslatePrefs(pref_service).GetRecentTargetLanguage();
   logger.RecordInitiationTranslateTargetInULP(
-      logger.DetermineLanguageStatus(target_language, ulp_languages));
+      ULPMetricsLogger::DetermineLanguageStatus(target_language,
+                                                ulp_languages));
 
   std::vector<std::string> accept_languages;
   language::LanguagePrefs(pref_service)
@@ -62,17 +65,17 @@
   language::ULPLanguageStatus accept_language_status =
       language::ULPLanguageStatus::kLanguageEmpty;
   if (accept_languages.size() > 0) {
-    accept_language_status =
-        logger.DetermineLanguageStatus(accept_languages[0], ulp_languages);
+    accept_language_status = ULPMetricsLogger::DetermineLanguageStatus(
+        accept_languages[0], ulp_languages);
   }
   logger.RecordInitiationTopAcceptLanguageInULP(accept_language_status);
 
   logger.RecordInitiationAcceptLanguagesULPOverlap(
-      logger.ULPLanguagesInAcceptLanguagesRatio(accept_languages,
-                                                ulp_languages));
+      ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(accept_languages,
+                                                           ulp_languages));
 
   std::vector<std::string> never_languages_not_in_ulp =
-      logger.RemoveULPLanguages(
+      ULPMetricsLogger::RemoveULPLanguages(
           translate::TranslatePrefs(pref_service).GetNeverTranslateLanguages(),
           ulp_languages);
   logger.RecordInitiationNeverLanguagesMissingFromULP(
diff --git a/chrome/browser/metrics/assistant_service_metrics_provider.cc b/chrome/browser/metrics/assistant_service_metrics_provider.cc
index aa896949..633a4b8 100644
--- a/chrome/browser/metrics/assistant_service_metrics_provider.cc
+++ b/chrome/browser/metrics/assistant_service_metrics_provider.cc
@@ -17,17 +17,17 @@
     metrics::ChromeUserMetricsExtension* uma_proto_unused) {
   if (assistant::IsAssistantAllowedForProfile(
           ProfileManager::GetActiveUserProfile()) !=
-      chromeos::assistant::AssistantAllowedState::ALLOWED) {
+      ash::assistant::AssistantAllowedState::ALLOWED) {
     return;
   }
 
   UMA_HISTOGRAM_BOOLEAN(
       "Assistant.ServiceEnabledUserCount",
       ProfileManager::GetActiveUserProfile()->GetPrefs()->GetBoolean(
-          chromeos::assistant::prefs::kAssistantEnabled));
+          ash::assistant::prefs::kAssistantEnabled));
 
   UMA_HISTOGRAM_BOOLEAN(
       "Assistant.ContextEnabledUserCount",
       ProfileManager::GetActiveUserProfile()->GetPrefs()->GetBoolean(
-          chromeos::assistant::prefs::kAssistantContextEnabled));
+          ash::assistant::prefs::kAssistantContextEnabled));
 }
diff --git a/chrome/browser/new_tab_page/promos/promo_service_unittest.cc b/chrome/browser/new_tab_page/promos/promo_service_unittest.cc
index a9f56552..f558afc 100644
--- a/chrome/browser/new_tab_page/promos/promo_service_unittest.cc
+++ b/chrome/browser/new_tab_page/promos/promo_service_unittest.cc
@@ -248,16 +248,16 @@
   EXPECT_EQ(service()->promo_data(), promo);
   EXPECT_EQ(service()->promo_status(), PromoService::Status::OK_WITH_PROMO);
 
-  ASSERT_EQ(0u, prefs()->GetDictionary(prefs::kNtpPromoBlocklist)->DictSize());
+  ASSERT_EQ(0u, prefs()->GetValueDict(prefs::kNtpPromoBlocklist).size());
 
   service()->BlocklistPromo("42");
 
   EXPECT_EQ(service()->promo_data(), PromoData());
   EXPECT_EQ(service()->promo_status(), PromoService::Status::OK_BUT_BLOCKED);
 
-  const auto* blocklist = prefs()->GetDictionary(prefs::kNtpPromoBlocklist);
-  ASSERT_EQ(1u, blocklist->DictSize());
-  ASSERT_TRUE(blocklist->FindKey("42"));
+  const auto& blocklist = prefs()->GetValueDict(prefs::kNtpPromoBlocklist);
+  ASSERT_EQ(1u, blocklist.size());
+  ASSERT_TRUE(blocklist.Find("42"));
 }
 
 TEST_F(PromoServiceTest, BlocklistExpiration) {
@@ -271,7 +271,7 @@
     update->SetDoubleKey("42", past.ToDeltaSinceWindowsEpoch().InSecondsF());
   }
 
-  ASSERT_EQ(1u, prefs()->GetDictionary(prefs::kNtpPromoBlocklist)->DictSize());
+  ASSERT_EQ(1u, prefs()->GetValueDict(prefs::kNtpPromoBlocklist).size());
 
   std::string response_string =
       "{\"update\":{\"promos\":{\"middle\":\"<style></style><div><script></"
@@ -282,7 +282,7 @@
   base::RunLoop().RunUntilIdle();
 
   // The year-old entry of {promo_id: "42", time: <1y ago>} should be gone.
-  ASSERT_EQ(0u, prefs()->GetDictionary(prefs::kNtpPromoBlocklist)->DictSize());
+  ASSERT_EQ(0u, prefs()->GetValueDict(prefs::kNtpPromoBlocklist).size());
 
   // The promo should've still been shown, as expiration should take precedence.
   PromoData promo;
@@ -305,7 +305,7 @@
     update->SetStringKey("84", "wrong type");
   }
 
-  ASSERT_GT(prefs()->GetDictionary(prefs::kNtpPromoBlocklist)->DictSize(), 0u);
+  ASSERT_GT(prefs()->GetValueDict(prefs::kNtpPromoBlocklist).size(), 0u);
 
   std::string response_string =
       "{\"update\":{\"promos\":{\"middle\":\"<style></style><div><script></"
@@ -316,7 +316,7 @@
   base::RunLoop().RunUntilIdle();
 
   // All the invalid formats should've been removed from the pref.
-  ASSERT_EQ(0u, prefs()->GetDictionary(prefs::kNtpPromoBlocklist)->DictSize());
+  ASSERT_EQ(0u, prefs()->GetValueDict(prefs::kNtpPromoBlocklist).size());
 }
 
 TEST_F(PromoServiceTest, UndoBlocklistPromo) {
diff --git a/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc b/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc
index 6f77dcb..3022232 100644
--- a/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc
+++ b/chrome/browser/password_manager/password_manager_captured_sites_interactive_uitest.cc
@@ -216,8 +216,7 @@
   void SetUpCommandLine(base::CommandLine* command_line) override {
     feature_list_.InitWithFeaturesAndParameters(
         /*enabled_features=*/{{autofill::features::kAutofillShowTypePredictions,
-                               {}},
-                              {features::kUsernameFirstFlow, {}}},
+                               {}}},
         {});
     command_line->AppendSwitch(autofill::switches::kShowAutofillSignatures);
     captured_sites_test_utils::TestRecipeReplayer::SetUpHostResolverRules(
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 12e43f47..55fa452 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1118,16 +1118,16 @@
     plugin_vm::prefs::kPluginVmRequiredFreeDiskSpaceGB,
     base::Value::Type::INTEGER },
   { key::kAssistantOnboardingMode,
-    chromeos::assistant::prefs::kAssistantOnboardingMode,
+    ash::assistant::prefs::kAssistantOnboardingMode,
     base::Value::Type::STRING },
   { key::kAssistantVoiceMatchEnabledDuringOobe,
-    chromeos::assistant::prefs::kAssistantVoiceMatchEnabledDuringOobe,
+    ash::assistant::prefs::kAssistantVoiceMatchEnabledDuringOobe,
     base::Value::Type::BOOLEAN },
   { key::kVoiceInteractionContextEnabled,
-    chromeos::assistant::prefs::kAssistantContextEnabled,
+    ash::assistant::prefs::kAssistantContextEnabled,
     base::Value::Type::BOOLEAN },
   { key::kVoiceInteractionHotwordEnabled,
-    chromeos::assistant::prefs::kAssistantHotwordEnabled,
+    ash::assistant::prefs::kAssistantHotwordEnabled,
     base::Value::Type::BOOLEAN },
   { key::kDevicePowerPeakShiftEnabled,
     ash::prefs::kPowerPeakShiftEnabled,
diff --git a/chrome/browser/policy/test/assistant_policy_browsertest.cc b/chrome/browser/policy/test/assistant_policy_browsertest.cc
index 295ee564..2325855 100644
--- a/chrome/browser/policy/test/assistant_policy_browsertest.cc
+++ b/chrome/browser/policy/test/assistant_policy_browsertest.cc
@@ -18,12 +18,12 @@
 IN_PROC_BROWSER_TEST_F(AssistantPolicyTest, AssistantContextEnabled) {
   PrefService* prefs = browser()->profile()->GetPrefs();
   EXPECT_FALSE(prefs->IsManagedPreference(
-      chromeos::assistant::prefs::kAssistantContextEnabled));
+      ash::assistant::prefs::kAssistantContextEnabled));
   EXPECT_FALSE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled));
-  prefs->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled, true);
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantContextEnabled));
+  prefs->SetBoolean(ash::assistant::prefs::kAssistantContextEnabled, true);
   EXPECT_TRUE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled));
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantContextEnabled));
 
   // Verifies that the Assistant context can be forced to always disabled.
   PolicyMap policies;
@@ -32,12 +32,12 @@
                nullptr);
   UpdateProviderPolicy(policies);
   EXPECT_TRUE(prefs->IsManagedPreference(
-      chromeos::assistant::prefs::kAssistantContextEnabled));
+      ash::assistant::prefs::kAssistantContextEnabled));
   EXPECT_FALSE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled));
-  prefs->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled, true);
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantContextEnabled));
+  prefs->SetBoolean(ash::assistant::prefs::kAssistantContextEnabled, true);
   EXPECT_FALSE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled));
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantContextEnabled));
 
   // Verifies that the Assistant context can be forced to always enabled.
   policies.Set(key::kVoiceInteractionContextEnabled, POLICY_LEVEL_MANDATORY,
@@ -45,24 +45,23 @@
                nullptr);
   UpdateProviderPolicy(policies);
   EXPECT_TRUE(prefs->IsManagedPreference(
-      chromeos::assistant::prefs::kAssistantContextEnabled));
+      ash::assistant::prefs::kAssistantContextEnabled));
   EXPECT_TRUE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled));
-  prefs->SetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled,
-                    false);
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantContextEnabled));
+  prefs->SetBoolean(ash::assistant::prefs::kAssistantContextEnabled, false);
   EXPECT_TRUE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantContextEnabled));
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantContextEnabled));
 }
 
 IN_PROC_BROWSER_TEST_F(AssistantPolicyTest, AssistantHotwordEnabled) {
   PrefService* prefs = browser()->profile()->GetPrefs();
   EXPECT_FALSE(prefs->IsManagedPreference(
-      chromeos::assistant::prefs::kAssistantHotwordEnabled));
+      ash::assistant::prefs::kAssistantHotwordEnabled));
   EXPECT_FALSE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled));
-  prefs->SetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled, true);
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled));
+  prefs->SetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled, true);
   EXPECT_TRUE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled));
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled));
 
   // Verifies that the Assistant hotword can be forced to always disabled.
   PolicyMap policies;
@@ -71,12 +70,12 @@
                nullptr);
   UpdateProviderPolicy(policies);
   EXPECT_TRUE(prefs->IsManagedPreference(
-      chromeos::assistant::prefs::kAssistantHotwordEnabled));
+      ash::assistant::prefs::kAssistantHotwordEnabled));
   EXPECT_FALSE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled));
-  prefs->SetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled, true);
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled));
+  prefs->SetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled, true);
   EXPECT_FALSE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled));
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled));
 
   // Verifies that the Assistant hotword can be forced to always enabled.
   policies.Set(key::kVoiceInteractionHotwordEnabled, POLICY_LEVEL_MANDATORY,
@@ -84,13 +83,12 @@
                nullptr);
   UpdateProviderPolicy(policies);
   EXPECT_TRUE(prefs->IsManagedPreference(
-      chromeos::assistant::prefs::kAssistantHotwordEnabled));
+      ash::assistant::prefs::kAssistantHotwordEnabled));
   EXPECT_TRUE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled));
-  prefs->SetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled,
-                    false);
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled));
+  prefs->SetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled, false);
   EXPECT_TRUE(
-      prefs->GetBoolean(chromeos::assistant::prefs::kAssistantHotwordEnabled));
+      prefs->GetBoolean(ash::assistant::prefs::kAssistantHotwordEnabled));
 }
 
 }  // namespace policy
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index b290799..5fe15ec 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -1511,7 +1511,7 @@
   ash::ApkWebAppService::RegisterProfilePrefs(registry);
   ash::app_time::AppActivityRegistry::RegisterProfilePrefs(registry);
   ash::app_time::AppTimeController::RegisterProfilePrefs(registry);
-  chromeos::assistant::prefs::RegisterProfilePrefs(registry);
+  ash::assistant::prefs::RegisterProfilePrefs(registry);
   ash::bluetooth::DebugLogsManager::RegisterPrefs(registry);
   chromeos::bluetooth_config::BluetoothPowerControllerImpl::
       RegisterProfilePrefs(registry);
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
index ef3f6f5..0556d964 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
@@ -71,11 +71,13 @@
   ~SearchPrefetchEligibilityReasonRecorder() {
     if (navigation_prefetch_) {
       UMA_HISTOGRAM_ENUMERATION(
-          "Omnibox.SearchPrefetch.PrefetchEligibilityReason.NavigationPrefetch",
+          "Omnibox.SearchPrefetch.PrefetchEligibilityReason2."
+          "NavigationPrefetch",
           reason_);
     } else {
       UMA_HISTOGRAM_ENUMERATION(
-          "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+          "Omnibox.SearchPrefetch.PrefetchEligibilityReason2."
+          "SuggestionPrefetch",
           reason_);
     }
   }
@@ -159,26 +161,8 @@
 
   SearchPrefetchEligibilityReasonRecorder recorder(navigation_prefetch);
 
-  if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) {
-    recorder.reason_ = SearchPrefetchEligibilityReason::kPrefetchDisabled;
-    return false;
-  }
-
-  if (!profile_->GetPrefs() ||
-      !profile_->GetPrefs()->GetBoolean(prefs::kWebKitJavascriptEnabled)) {
-    recorder.reason_ = SearchPrefetchEligibilityReason::kJavascriptDisabled;
-    return false;
-  }
-
-  auto* content_settings =
-      HostContentSettingsMapFactory::GetForProfile(profile_);
-  if (!content_settings ||
-      content_settings->GetContentSetting(
-          url, url, ContentSettingsType::JAVASCRIPT) == CONTENT_SETTING_BLOCK) {
-    recorder.reason_ = SearchPrefetchEligibilityReason::kJavascriptDisabled;
-    return false;
-  }
-
+  // Check for search terms before checking for any other eligibility reasons
+  // for Prefetch to exit early.
   auto* template_url_service =
       TemplateURLServiceFactory::GetForProfile(profile_);
   if (!template_url_service ||
@@ -203,6 +187,26 @@
     return false;
   }
 
+  if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) {
+    recorder.reason_ = SearchPrefetchEligibilityReason::kPrefetchDisabled;
+    return false;
+  }
+
+  if (!profile_->GetPrefs() ||
+      !profile_->GetPrefs()->GetBoolean(prefs::kWebKitJavascriptEnabled)) {
+    recorder.reason_ = SearchPrefetchEligibilityReason::kJavascriptDisabled;
+    return false;
+  }
+
+  auto* content_settings =
+      HostContentSettingsMapFactory::GetForProfile(profile_);
+  if (!content_settings ||
+      content_settings->GetContentSetting(
+          url, url, ContentSettingsType::JAVASCRIPT) == CONTENT_SETTING_BLOCK) {
+    recorder.reason_ = SearchPrefetchEligibilityReason::kJavascriptDisabled;
+    return false;
+  }
+
   if (!navigation_prefetch &&
       (last_error_time_ticks_ + SearchPrefetchErrorBackoffDuration() >
        base::TimeTicks::Now())) {
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
index be1c17e..9d2cdafc 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -314,7 +314,7 @@
   EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url,
                                                         GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchStarted, 1);
   auto prefetch_status =
       search_prefetch_service->GetSearchPrefetchStatusForTesting(
@@ -368,7 +368,7 @@
       search_prefetch_service->GetSearchPrefetchStatusForTesting(
           base::ASCIIToUTF16(search_terms));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kThrottled, 1);
   EXPECT_FALSE(prefetch_status.has_value());
   content::SetBrowserClientForTesting(old_client);
@@ -393,7 +393,7 @@
       search_prefetch_service->GetSearchPrefetchStatusForTesting(
           base::ASCIIToUTF16(search_terms));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kThrottled, 1);
   EXPECT_FALSE(prefetch_status.has_value());
   content::SetBrowserClientForTesting(old_client);
@@ -487,7 +487,7 @@
       search_prefetch_service->GetSearchPrefetchStatusForTesting(
           base::ASCIIToUTF16(search_terms));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kThrottled, 1);
   EXPECT_FALSE(prefetch_status.has_value());
   content::SetBrowserClientForTesting(old_client);
@@ -573,22 +573,22 @@
   EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
       GetSearchServerQueryURL("prefetch_1"), GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchStarted, 1);
   EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
       GetSearchServerQueryURL("prefetch_2"), GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchStarted, 2);
   EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
       GetSearchServerQueryURL("prefetch_3"), GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchStarted, 3);
   EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(
       GetSearchServerQueryURL("prefetch_4"), GetWebContents()));
   histogram_tester.ExpectBucketCount(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kMaxAttemptsReached, 1);
 
   auto prefetch_status =
@@ -706,7 +706,7 @@
   EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url,
                                                         GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchStarted, 1);
 
   WaitUntilStatusChangesTo(base::ASCIIToUTF16(search_terms),
@@ -715,7 +715,7 @@
   EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(prefetch_url,
                                                          GetWebContents()));
   histogram_tester.ExpectBucketCount(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kAttemptedQueryRecently, 1);
 }
 
@@ -732,7 +732,7 @@
   EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(prefetch_url,
                                                          GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kNotDefaultSearchWithTerms, 1);
 }
 
@@ -752,7 +752,7 @@
   EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(prefetch_url,
                                                          GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchDisabled, 1);
 }
 
@@ -771,7 +771,7 @@
   EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url,
                                                         GetWebContents()));
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kPrefetchStarted, 1);
   auto prefetch_status =
       search_prefetch_service->GetSearchPrefetchStatusForTesting(
@@ -1265,7 +1265,7 @@
   EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(
       GetSearchServerQueryURL("other_query"), GetWebContents()));
   histogram_tester.ExpectBucketCount(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kErrorBackoff, 1);
 }
 
@@ -1645,7 +1645,7 @@
   EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(
       GetSearchServerQueryURL("other_query"), GetWebContents()));
   histogram_tester.ExpectBucketCount(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kErrorBackoff, 1);
 }
 
@@ -1933,7 +1933,7 @@
                                                          GetWebContents()));
 
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kJavascriptDisabled, 1);
 }
 
@@ -1957,7 +1957,7 @@
                                                          GetWebContents()));
 
   histogram_tester.ExpectUniqueSample(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kJavascriptDisabled, 1);
 
   auto prefetch_status =
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
index 57023a6..f6ff586 100644
--- a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
+++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
@@ -1045,7 +1045,7 @@
   }
 
   histogram_tester.ExpectBucketCount(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch",
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
       SearchPrefetchEligibilityReason::kAttemptedQueryRecently, 1);
 }
 
diff --git a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
index 5615f27..f3f7a70 100644
--- a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
+++ b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
@@ -875,7 +875,8 @@
           u"prerender222");
   EXPECT_FALSE(prefetch_status.has_value());
   histogram_tester.ExpectTotalCount(
-      "Omnibox.SearchPrefetch.PrefetchEligibilityReason.SuggestionPrefetch", 0);
+      "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch",
+      0);
 
   content::RenderFrameHost* prerender_rfh =
       prerender_helper().GetPrerenderedMainFrameHost(host_id);
diff --git a/chrome/browser/privacy_review/OWNERS b/chrome/browser/privacy_guide/OWNERS
similarity index 100%
rename from chrome/browser/privacy_review/OWNERS
rename to chrome/browser/privacy_guide/OWNERS
diff --git a/chrome/browser/privacy_guide/android/BUILD.gn b/chrome/browser/privacy_guide/android/BUILD.gn
new file mode 100644
index 0000000..66810a21
--- /dev/null
+++ b/chrome/browser/privacy_guide/android/BUILD.gn
@@ -0,0 +1,57 @@
+# Copyright 2021 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.
+
+import("//build/config/android/rules.gni")
+
+android_library("java") {
+  sources = [
+    "java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java",
+    "java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideDialog.java",
+    "java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationHeading.java",
+    "java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationItem.java",
+    "java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuidePagerAdapter.java",
+  ]
+  deps = [
+    ":java_resources",
+    "//components/browser_ui/bottomsheet/android:java",
+    "//components/browser_ui/widget/android:java",
+    "//third_party/androidx:androidx_annotation_annotation_java",
+    "//third_party/androidx:androidx_appcompat_appcompat_java",
+    "//third_party/androidx:androidx_recyclerview_recyclerview_java",
+    "//third_party/androidx:androidx_viewpager2_viewpager2_java",
+    "//ui/android:ui_full_java",
+  ]
+  resources_package = "org.chromium.chrome.browser.privacy_guide"
+}
+
+android_resources("java_resources") {
+  sources = [
+    "java/res/drawable/privacy_guide_cookies_image.xml",
+    "java/res/drawable/privacy_guide_done_image.xml",
+    "java/res/drawable/privacy_guide_illustration.xml",
+    "java/res/drawable/privacy_guide_msbb_image.xml",
+    "java/res/drawable/privacy_guide_sb_image.xml",
+    "java/res/drawable/privacy_guide_sync_image.xml",
+    "java/res/layout/privacy_guide_cookies_step.xml",
+    "java/res/layout/privacy_guide_dialog.xml",
+    "java/res/layout/privacy_guide_done.xml",
+    "java/res/layout/privacy_guide_explanation_heading.xml",
+    "java/res/layout/privacy_guide_explanation_item.xml",
+    "java/res/layout/privacy_guide_msbb_step.xml",
+    "java/res/layout/privacy_guide_sb_enhanced_explanation.xml",
+    "java/res/layout/privacy_guide_sb_standard_explanation.xml",
+    "java/res/layout/privacy_guide_sb_step.xml",
+    "java/res/layout/privacy_guide_steps.xml",
+    "java/res/layout/privacy_guide_sync_step.xml",
+    "java/res/layout/privacy_guide_welcome.xml",
+    "java/res/menu/privacy_guide_toolbar_menu.xml",
+    "java/res/values/attrs.xml",
+    "java/res/values/dimens.xml",
+  ]
+  deps = [
+    "//chrome/browser/ui/android/strings:ui_strings_grd",
+    "//components/browser_ui/styles/android:java_resources",
+    "//components/browser_ui/widget/android:java_resources",
+  ]
+}
diff --git a/chrome/browser/privacy_review/android/java/res/drawable/privacy_review_cookies_image.xml b/chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_cookies_image.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/drawable/privacy_review_cookies_image.xml
rename to chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_cookies_image.xml
diff --git a/chrome/browser/privacy_review/android/java/res/drawable/privacy_review_done_image.xml b/chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_done_image.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/drawable/privacy_review_done_image.xml
rename to chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_done_image.xml
diff --git a/chrome/browser/privacy_review/android/java/res/drawable/privacy_review_illustration.xml b/chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_illustration.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/drawable/privacy_review_illustration.xml
rename to chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_illustration.xml
diff --git a/chrome/browser/privacy_review/android/java/res/drawable/privacy_review_msbb_image.xml b/chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_msbb_image.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/drawable/privacy_review_msbb_image.xml
rename to chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_msbb_image.xml
diff --git a/chrome/browser/privacy_review/android/java/res/drawable/privacy_review_sb_image.xml b/chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_sb_image.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/drawable/privacy_review_sb_image.xml
rename to chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_sb_image.xml
diff --git a/chrome/browser/privacy_review/android/java/res/drawable/privacy_review_sync_image.xml b/chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_sync_image.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/drawable/privacy_review_sync_image.xml
rename to chrome/browser/privacy_guide/android/java/res/drawable/privacy_guide_sync_image.xml
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_cookies_step.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_cookies_step.xml
similarity index 75%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_cookies_step.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_cookies_step.xml
index 34628c0..411452d 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_cookies_step.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_cookies_step.xml
@@ -21,9 +21,9 @@
         <ImageView
             android:id="@+id/image"
             android:layout_marginVertical="16dp"
-            android:layout_height="@dimen/privacy_review_illustration_height"
-            android:layout_width="@dimen/privacy_review_illustration_width"
-            android:src="@drawable/privacy_review_cookies_image"
+            android:layout_height="@dimen/privacy_guide_illustration_height"
+            android:layout_width="@dimen/privacy_guide_illustration_width"
+            android:src="@drawable/privacy_guide_cookies_image"
             android:importantForAccessibility="no" />
 
         <TextView
@@ -33,7 +33,7 @@
             android:layout_marginVertical="8dp"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/privacy_review_cookies_intro"
+            android:text="@string/privacy_guide_cookies_intro"
             style="@style/TextAppearance.TextLarge.Primary" />
 
         <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout
@@ -45,15 +45,15 @@
                 android:id="@+id/block_incognito"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:primaryText="@string/privacy_review_cookies_block_incognito_title"
-                app:descriptionText="@string/privacy_review_cookies_block_incognito_description" />
+                app:primaryText="@string/privacy_guide_cookies_block_incognito_title"
+                app:descriptionText="@string/privacy_guide_cookies_block_incognito_description" />
 
             <org.chromium.components.browser_ui.widget.RadioButtonWithDescription
                 android:id="@+id/block_always"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:primaryText="@string/privacy_review_cookies_block_always_title"
-                app:descriptionText="@string/privacy_review_cookies_block_always_description" />
+                app:primaryText="@string/privacy_guide_cookies_block_always_title"
+                app:descriptionText="@string/privacy_guide_cookies_block_always_description" />
 
         </org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout>
 
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_dialog.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_dialog.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_dialog.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_dialog.xml
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_done.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_done.xml
similarity index 79%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_done.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_done.xml
index 8c97e589..c4f0bcc 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_done.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_done.xml
@@ -27,9 +27,9 @@
             <ImageView
                 android:id="@+id/image"
                 android:layout_marginVertical="32dp"
-                android:layout_height="@dimen/privacy_review_illustration_height"
-                android:layout_width="@dimen/privacy_review_illustration_width"
-                android:src="@drawable/privacy_review_done_image"
+                android:layout_height="@dimen/privacy_guide_illustration_height"
+                android:layout_width="@dimen/privacy_guide_illustration_width"
+                android:src="@drawable/privacy_guide_done_image"
                 android:importantForAccessibility="no" />
 
             <TextView
@@ -38,7 +38,7 @@
                 android:layout_marginHorizontal="16dp"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/privacy_review_done_title"
+                android:text="@string/privacy_guide_done_title"
                 style="@style/TextAppearance.Headline.Primary" />
 
             <TextView
@@ -48,13 +48,13 @@
                 android:layout_marginBottom="8dp"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/privacy_review_done_description"
+                android:text="@string/privacy_guide_done_description"
                 style="@style/TextAppearance.TextLarge.Secondary" />
 
-            <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+            <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:titleText="@string/privacy_review_privacy_sandbox_heading" />
+                app:titleText="@string/privacy_guide_privacy_sandbox_heading" />
 
             <TextView
                 android:id="@+id/privacy_sandbox_description"
@@ -62,20 +62,20 @@
                 android:layout_marginBottom="8dp"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/privacy_review_privacy_sandbox_description"
+                android:text="@string/privacy_guide_privacy_sandbox_description"
                 style="@style/TextAppearance.TextMedium.Secondary" />
 
-            <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+            <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:titleText="@string/privacy_review_web_app_activity_heading" />
+                app:titleText="@string/privacy_guide_web_app_activity_heading" />
 
             <TextView
                 android:id="@+id/web_app_activity_description"
                 android:layout_marginHorizontal="16dp"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/privacy_review_web_app_activity_description"
+                android:text="@string/privacy_guide_web_app_activity_description"
                 style="@style/TextAppearance.TextMedium.Secondary" />
 
         </LinearLayout>
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_explanation_heading.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_explanation_heading.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_explanation_heading.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_explanation_heading.xml
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_explanation_item.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_explanation_item.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_explanation_item.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_explanation_item.xml
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_msbb_step.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_msbb_step.xml
similarity index 65%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_msbb_step.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_msbb_step.xml
index 7ea642a..f0067ea 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_msbb_step.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_msbb_step.xml
@@ -21,9 +21,9 @@
         <ImageView
             android:id="@+id/image"
             android:layout_marginVertical="16dp"
-            android:layout_height="@dimen/privacy_review_illustration_height"
-            android:layout_width="@dimen/privacy_review_illustration_width"
-            android:src="@drawable/privacy_review_msbb_image"
+            android:layout_height="@dimen/privacy_guide_illustration_height"
+            android:layout_width="@dimen/privacy_guide_illustration_width"
+            android:src="@drawable/privacy_guide_msbb_image"
             android:importantForAccessibility="no" />
 
         <com.google.android.material.switchmaterial.SwitchMaterial
@@ -34,39 +34,39 @@
             android:showText="false"
             android:text="@string/url_keyed_anonymized_data_title" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:titleText="@string/privacy_review_when_on" />
+            app:titleText="@string/privacy_guide_when_on" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_flash_on_24dp"
-            app:summaryText="@string/privacy_review_msbb_item_one" />
+            app:summaryText="@string/privacy_guide_msbb_item_one" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_lightbulb_24dp"
-            app:summaryText="@string/privacy_review_msbb_item_two" />
+            app:summaryText="@string/privacy_guide_msbb_item_two" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:titleText="@string/privacy_review_things_to_consider" />
+            app:titleText="@string/privacy_guide_things_to_consider" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_link_24dp"
-            app:summaryText="@string/privacy_review_msbb_item_three" />
+            app:summaryText="@string/privacy_guide_msbb_item_three" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_bar_chart_24dp"
-            app:summaryText="@string/privacy_review_msbb_item_four" />
+            app:summaryText="@string/privacy_guide_msbb_item_four" />
 
     </LinearLayout>
 
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_enhanced_explanation.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_enhanced_explanation.xml
similarity index 61%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_enhanced_explanation.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_enhanced_explanation.xml
index d2f7a3b..b07b818 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_enhanced_explanation.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_enhanced_explanation.xml
@@ -18,62 +18,62 @@
         android:layout_marginVertical="8dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/privacy_review_safe_browsing_enhanced_title"
+        android:text="@string/privacy_guide_safe_browsing_enhanced_title"
         style="@style/TextAppearance.Headline.Primary" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:titleText="@string/privacy_review_when_on" />
+        app:titleText="@string/privacy_guide_when_on" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_security_grey"
         app:iconTint="@macro/default_icon_color"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_one" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_one" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_google_24dp"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_two" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_two" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_globe_24dp"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_three" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_three" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_vpn_key_grey"
         app:iconTint="@macro/default_icon_color"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_four" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_four" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:titleText="@string/privacy_review_things_to_consider" />
+        app:titleText="@string/privacy_guide_things_to_consider" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_bar_chart_24dp"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_five" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_five" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_web_asset_24dp"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_six" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_six" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_account_circle_24dp"
-        app:summaryText="@string/privacy_review_sb_enhanced_item_seven" />
+        app:summaryText="@string/privacy_guide_sb_enhanced_item_seven" />
 
     <!-- Extra empty space, necessary due to crbug.com/1287979. -->
     <View
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_standard_explanation.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_standard_explanation.xml
similarity index 67%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_standard_explanation.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_standard_explanation.xml
index 51e4de30..ada4760 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_standard_explanation.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_standard_explanation.xml
@@ -18,37 +18,37 @@
         android:layout_marginVertical="8dp"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/privacy_review_safe_browsing_standard_title"
+        android:text="@string/privacy_guide_safe_browsing_standard_title"
         style="@style/TextAppearance.Headline.Primary" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:titleText="@string/privacy_review_when_on" />
+        app:titleText="@string/privacy_guide_when_on" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_security_grey"
         app:iconTint="@macro/default_icon_color"
-        app:summaryText="@string/privacy_review_sb_standard_item_one" />
+        app:summaryText="@string/privacy_guide_sb_standard_item_one" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_bar_chart_24dp"
-        app:summaryText="@string/privacy_review_sb_standard_item_two" />
+        app:summaryText="@string/privacy_guide_sb_standard_item_two" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:titleText="@string/privacy_review_things_to_consider" />
+        app:titleText="@string/privacy_guide_things_to_consider" />
 
-    <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+    <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         app:iconImage="@drawable/ic_web_asset_24dp"
-        app:summaryText="@string/privacy_review_sb_standard_item_three" />
+        app:summaryText="@string/privacy_guide_sb_standard_item_three" />
 
     <!-- Extra empty space, necessary due to crbug.com/1287979. -->
     <View
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_step.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_step.xml
similarity index 76%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_step.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_step.xml
index c9342b06..98864e1 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sb_step.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sb_step.xml
@@ -21,9 +21,9 @@
         <ImageView
             android:id="@+id/image"
             android:layout_marginVertical="16dp"
-            android:layout_height="@dimen/privacy_review_illustration_height"
-            android:layout_width="@dimen/privacy_review_illustration_width"
-            android:src="@drawable/privacy_review_sb_image"
+            android:layout_height="@dimen/privacy_guide_illustration_height"
+            android:layout_width="@dimen/privacy_guide_illustration_width"
+            android:src="@drawable/privacy_guide_sb_image"
             android:importantForAccessibility="no" />
 
         <TextView
@@ -33,7 +33,7 @@
             android:layout_marginVertical="8dp"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:text="@string/privacy_review_safe_browsing_intro"
+            android:text="@string/privacy_guide_safe_browsing_intro"
             style="@style/TextAppearance.TextLarge.Primary" />
 
         <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout
@@ -45,15 +45,15 @@
                 android:id="@+id/enhanced_option"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:primaryText="@string/privacy_review_safe_browsing_enhanced_title"
-                app:descriptionText="@string/privacy_review_safe_browsing_enhanced_description" />
+                app:primaryText="@string/privacy_guide_safe_browsing_enhanced_title"
+                app:descriptionText="@string/privacy_guide_safe_browsing_enhanced_description" />
 
             <org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionAndAuxButton
                 android:id="@+id/standard_option"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                app:primaryText="@string/privacy_review_safe_browsing_standard_title"
-                app:descriptionText="@string/privacy_review_safe_browsing_standard_description" />
+                app:primaryText="@string/privacy_guide_safe_browsing_standard_title"
+                app:descriptionText="@string/privacy_guide_safe_browsing_standard_description" />
 
         </org.chromium.components.browser_ui.widget.RadioButtonWithDescriptionLayout>
 
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_steps.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_steps.xml
similarity index 96%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_steps.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_steps.xml
index 300dc42e..65be487 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_steps.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_steps.xml
@@ -63,7 +63,7 @@
             android:layout_height="wrap_content"
             android:layout_margin="16dp"
             android:visibility="gone"
-            android:text="@string/privacy_review_finish_button"
+            android:text="@string/privacy_guide_finish_button"
             style="@style/FilledButton.Flat" />
 
     </LinearLayout>
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sync_step.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sync_step.xml
similarity index 64%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_sync_step.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sync_step.xml
index 8c5bb2e1..ef93bae 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_sync_step.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_sync_step.xml
@@ -21,9 +21,9 @@
         <ImageView
             android:id="@+id/image"
             android:layout_marginVertical="16dp"
-            android:layout_height="@dimen/privacy_review_illustration_height"
-            android:layout_width="@dimen/privacy_review_illustration_width"
-            android:src="@drawable/privacy_review_sync_image"
+            android:layout_height="@dimen/privacy_guide_illustration_height"
+            android:layout_width="@dimen/privacy_guide_illustration_width"
+            android:src="@drawable/privacy_guide_sync_image"
             android:importantForAccessibility="no" />
 
         <com.google.android.material.switchmaterial.SwitchMaterial
@@ -32,35 +32,35 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:showText="false"
-            android:text="@string/privacy_review_sync_toggle" />
+            android:text="@string/privacy_guide_sync_toggle" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:titleText="@string/privacy_review_when_on" />
+            app:titleText="@string/privacy_guide_when_on" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_history_24dp"
-            app:summaryText="@string/privacy_review_sync_item_one" />
+            app:summaryText="@string/privacy_guide_sync_item_one" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_dns_24dp"
-            app:summaryText="@string/privacy_review_sync_item_two" />
+            app:summaryText="@string/privacy_guide_sync_item_two" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationHeading
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationHeading
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            app:titleText="@string/privacy_review_things_to_consider" />
+            app:titleText="@string/privacy_guide_things_to_consider" />
 
-        <org.chromium.chrome.browser.privacy_review.PrivacyReviewExplanationItem
+        <org.chromium.chrome.browser.privacy_guide.PrivacyGuideExplanationItem
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             app:iconImage="@drawable/ic_link_24dp"
-            app:summaryText="@string/privacy_review_sync_item_three" />
+            app:summaryText="@string/privacy_guide_sync_item_three" />
 
     </LinearLayout>
 
diff --git a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_welcome.xml b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_welcome.xml
similarity index 83%
rename from chrome/browser/privacy_review/android/java/res/layout/privacy_review_welcome.xml
rename to chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_welcome.xml
index b62cadd..23ff40c 100644
--- a/chrome/browser/privacy_review/android/java/res/layout/privacy_review_welcome.xml
+++ b/chrome/browser/privacy_guide/android/java/res/layout/privacy_guide_welcome.xml
@@ -26,9 +26,9 @@
             <ImageView
                 android:id="@+id/image"
                 android:layout_marginVertical="32dp"
-                android:layout_height="@dimen/privacy_review_illustration_height"
-                android:layout_width="@dimen/privacy_review_illustration_width"
-                android:src="@drawable/privacy_review_illustration"
+                android:layout_height="@dimen/privacy_guide_illustration_height"
+                android:layout_width="@dimen/privacy_guide_illustration_width"
+                android:src="@drawable/privacy_guide_illustration"
                 android:importantForAccessibility="no" />
 
             <TextView
@@ -36,7 +36,7 @@
                 android:layout_margin="16dp"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/privacy_review_welcome_title"
+                android:text="@string/privacy_guide_welcome_title"
                 style="@style/TextAppearance.Headline.Primary" />
 
             <TextView
@@ -44,7 +44,7 @@
                 android:layout_margin="16dp"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:text="@string/privacy_review_welcome_description"
+                android:text="@string/privacy_guide_welcome_description"
                 style="@style/TextAppearance.TextLarge.Secondary" />
 
         </LinearLayout>
@@ -65,7 +65,7 @@
             android:layout_marginBottom="16dp"
             android:layout_marginLeft="16dp"
             android:layout_marginRight="16dp"
-            android:text="@string/privacy_review_start_button"
+            android:text="@string/privacy_guide_start_button"
             style="@style/FilledButton.Flat" />
     </LinearLayout>
 
diff --git a/chrome/browser/privacy_review/android/java/res/menu/privacy_review_toolbar_menu.xml b/chrome/browser/privacy_guide/android/java/res/menu/privacy_guide_toolbar_menu.xml
similarity index 100%
rename from chrome/browser/privacy_review/android/java/res/menu/privacy_review_toolbar_menu.xml
rename to chrome/browser/privacy_guide/android/java/res/menu/privacy_guide_toolbar_menu.xml
diff --git a/chrome/browser/privacy_review/android/java/res/values/attrs.xml b/chrome/browser/privacy_guide/android/java/res/values/attrs.xml
similarity index 80%
rename from chrome/browser/privacy_review/android/java/res/values/attrs.xml
rename to chrome/browser/privacy_guide/android/java/res/values/attrs.xml
index 023ff34..cd4a8c85 100644
--- a/chrome/browser/privacy_review/android/java/res/values/attrs.xml
+++ b/chrome/browser/privacy_guide/android/java/res/values/attrs.xml
@@ -4,10 +4,10 @@
      found in the LICENSE file. -->
 
 <resources>
-  <declare-styleable name="PrivacyReviewExplanationHeading">
+  <declare-styleable name="PrivacyGuideExplanationHeading">
         <attr name="titleText" format="reference|string" />
   </declare-styleable>
-  <declare-styleable name="PrivacyReviewExplanationItem">
+  <declare-styleable name="PrivacyGuideExplanationItem">
         <attr name="iconImage" format="integer" />
         <attr name="iconTint" format="color" />
         <attr name="summaryText" format="reference|string" />
diff --git a/chrome/browser/privacy_review/android/java/res/values/dimens.xml b/chrome/browser/privacy_guide/android/java/res/values/dimens.xml
similarity index 65%
rename from chrome/browser/privacy_review/android/java/res/values/dimens.xml
rename to chrome/browser/privacy_guide/android/java/res/values/dimens.xml
index 34dd5ab..c53e4888 100644
--- a/chrome/browser/privacy_review/android/java/res/values/dimens.xml
+++ b/chrome/browser/privacy_guide/android/java/res/values/dimens.xml
@@ -4,6 +4,6 @@
      found in the LICENSE file. -->
 
 <resources>
-  <dimen name="privacy_review_illustration_height">120dp</dimen>
-  <dimen name="privacy_review_illustration_width">215dp</dimen>
+  <dimen name="privacy_guide_illustration_height">120dp</dimen>
+  <dimen name="privacy_guide_illustration_width">215dp</dimen>
 </resources>
diff --git a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewBottomSheetView.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java
similarity index 73%
rename from chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewBottomSheetView.java
rename to chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java
index 7b280682..2e4dc52 100644
--- a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewBottomSheetView.java
+++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.privacy_review;
+package org.chromium.chrome.browser.privacy_guide;
 
 import android.view.View;
 
@@ -10,11 +10,11 @@
 
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 
-/** Bottom sheet view for displaying privacy review control explanations */
-public class PrivacyReviewBottomSheetView implements BottomSheetContent {
+/** Bottom sheet view for displaying privacy guide control explanations */
+public class PrivacyGuideBottomSheetView implements BottomSheetContent {
     private final View mContentView;
 
-    PrivacyReviewBottomSheetView(View contentView) {
+    PrivacyGuideBottomSheetView(View contentView) {
         mContentView = contentView;
     }
 
@@ -59,21 +59,21 @@
 
     @Override
     public int getSheetContentDescriptionStringId() {
-        return R.string.privacy_review_explanation_content_description;
+        return R.string.privacy_guide_explanation_content_description;
     }
 
     @Override
     public int getSheetClosedAccessibilityStringId() {
-        return R.string.privacy_review_explanation_closed_description;
+        return R.string.privacy_guide_explanation_closed_description;
     }
 
     @Override
     public int getSheetHalfHeightAccessibilityStringId() {
-        return R.string.privacy_review_explanation_opened_half;
+        return R.string.privacy_guide_explanation_opened_half;
     }
 
     @Override
     public int getSheetFullHeightAccessibilityStringId() {
-        return R.string.privacy_review_explanation_opened_full;
+        return R.string.privacy_guide_explanation_opened_full;
     }
 }
diff --git a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewDialog.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideDialog.java
similarity index 83%
rename from chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewDialog.java
rename to chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideDialog.java
index b24a6e0..97b6dc73 100644
--- a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewDialog.java
+++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideDialog.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.privacy_review;
+package org.chromium.chrome.browser.privacy_guide;
 
 import android.content.Context;
 import android.view.LayoutInflater;
@@ -18,29 +18,29 @@
 import org.chromium.ui.widget.ButtonCompat;
 
 /**
- * UI for the Privacy Review dialog in Privacy and security settings.
+ * UI for the Privacy Guide dialog in Privacy and security settings.
  */
-public class PrivacyReviewDialog {
+public class PrivacyGuideDialog {
     private LayoutInflater mLayoutInflater;
     private ViewGroup mContainer;
     private View mDialogView;
     private ViewPager2 mViewPager;
-    private PrivacyReviewPagerAdapter mPagerAdapter;
+    private PrivacyGuidePagerAdapter mPagerAdapter;
     private ButtonCompat mNextButton;
     private ButtonCompat mBackButton;
     private ButtonCompat mFinishButton;
     private BottomSheetController mBottomSheetController;
 
-    public PrivacyReviewDialog(
+    public PrivacyGuideDialog(
             Context context, ViewGroup container, BottomSheetController controller) {
         mContainer = container;
         mBottomSheetController = controller;
         mLayoutInflater = LayoutInflater.from(context);
-        mDialogView = mLayoutInflater.inflate(R.layout.privacy_review_dialog, null);
+        mDialogView = mLayoutInflater.inflate(R.layout.privacy_guide_dialog, null);
 
         Toolbar toolbar = (Toolbar) mDialogView.findViewById(R.id.toolbar);
-        toolbar.setTitle(R.string.prefs_privacy_review_title);
-        toolbar.inflateMenu(R.menu.privacy_review_toolbar_menu);
+        toolbar.setTitle(R.string.prefs_privacy_guide_title);
+        toolbar.inflateMenu(R.menu.privacy_guide_toolbar_menu);
         toolbar.setOnMenuItemClickListener(this::onMenuItemClick);
 
         displayWelcomePage();
@@ -69,7 +69,7 @@
     private void displayWelcomePage() {
         FrameLayout content = mDialogView.findViewById(R.id.dialog_content);
         content.removeAllViews();
-        mLayoutInflater.inflate(R.layout.privacy_review_welcome, content);
+        mLayoutInflater.inflate(R.layout.privacy_guide_welcome, content);
 
         ButtonCompat welcomeButton = (ButtonCompat) mDialogView.findViewById(R.id.start_button);
         welcomeButton.setOnClickListener((View v) -> displayMainFlow());
@@ -78,10 +78,10 @@
     private void displayMainFlow() {
         FrameLayout content = mDialogView.findViewById(R.id.dialog_content);
         content.removeAllViews();
-        mLayoutInflater.inflate(R.layout.privacy_review_steps, content);
+        mLayoutInflater.inflate(R.layout.privacy_guide_steps, content);
 
         mViewPager = (ViewPager2) mDialogView.findViewById(R.id.review_viewpager);
-        mPagerAdapter = new PrivacyReviewPagerAdapter(mBottomSheetController);
+        mPagerAdapter = new PrivacyGuidePagerAdapter(mBottomSheetController);
         mViewPager.setAdapter(mPagerAdapter);
 
         mNextButton = (ButtonCompat) mDialogView.findViewById(R.id.next_button);
@@ -97,7 +97,7 @@
     private void displayDonePage() {
         FrameLayout content = mDialogView.findViewById(R.id.dialog_content);
         content.removeAllViews();
-        mLayoutInflater.inflate(R.layout.privacy_review_done, content);
+        mLayoutInflater.inflate(R.layout.privacy_guide_done, content);
 
         ButtonCompat doneButton = (ButtonCompat) mDialogView.findViewById(R.id.done_button);
         doneButton.setOnClickListener((View v) -> dismiss());
diff --git a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationHeading.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationHeading.java
similarity index 60%
rename from chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationHeading.java
rename to chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationHeading.java
index 15d75ea6..513ae278 100644
--- a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationHeading.java
+++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationHeading.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.privacy_review;
+package org.chromium.chrome.browser.privacy_guide;
 
 import android.content.Context;
 import android.content.res.TypedArray;
@@ -12,19 +12,19 @@
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
-/** A custom view for a heading of a setting explanation for the privacy review. */
-public class PrivacyReviewExplanationHeading extends LinearLayout {
-    public PrivacyReviewExplanationHeading(Context context, AttributeSet attrs) {
+/** A custom view for a heading of a setting explanation for the privacy guide. */
+public class PrivacyGuideExplanationHeading extends LinearLayout {
+    public PrivacyGuideExplanationHeading(Context context, AttributeSet attrs) {
         super(context, attrs);
 
         View view = LayoutInflater.from(context).inflate(
-                R.layout.privacy_review_explanation_heading, this);
+                R.layout.privacy_guide_explanation_heading, this);
 
         TypedArray styledAttrs = context.obtainStyledAttributes(
-                attrs, R.styleable.PrivacyReviewExplanationHeading, 0, 0);
+                attrs, R.styleable.PrivacyGuideExplanationHeading, 0, 0);
 
         TextView title = (TextView) view.findViewById(R.id.title);
-        title.setText(styledAttrs.getText(R.styleable.PrivacyReviewExplanationHeading_titleText));
+        title.setText(styledAttrs.getText(R.styleable.PrivacyGuideExplanationHeading_titleText));
 
         styledAttrs.recycle();
     }
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationItem.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationItem.java
new file mode 100644
index 0000000..6b8003bc
--- /dev/null
+++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideExplanationItem.java
@@ -0,0 +1,41 @@
+// Copyright 2021 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.chrome.browser.privacy_guide;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.content.res.TypedArray;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+/** A custom view for an item (icon + text) of a setting explanation for the privacy guide. */
+public class PrivacyGuideExplanationItem extends LinearLayout {
+    public PrivacyGuideExplanationItem(Context context, AttributeSet attrs) {
+        super(context, attrs);
+
+        View view =
+                LayoutInflater.from(context).inflate(R.layout.privacy_guide_explanation_item, this);
+
+        TypedArray a = context.obtainStyledAttributes(
+                attrs, R.styleable.PrivacyGuideExplanationItem, 0, 0);
+
+        TextView summary = (TextView) view.findViewById(R.id.summary);
+        summary.setText(a.getText(R.styleable.PrivacyGuideExplanationItem_summaryText));
+
+        Drawable icon = a.getDrawable(R.styleable.PrivacyGuideExplanationItem_iconImage);
+        ColorStateList tint = a.getColorStateList(R.styleable.PrivacyGuideExplanationItem_iconTint);
+        if (icon != null && tint != null) {
+            icon.setColorFilter(tint.getDefaultColor(), PorterDuff.Mode.SRC_IN);
+        }
+        summary.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null, null, null);
+
+        a.recycle();
+    }
+}
diff --git a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewPagerAdapter.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuidePagerAdapter.java
similarity index 82%
rename from chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewPagerAdapter.java
rename to chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuidePagerAdapter.java
index 59eb0f17b..563e0da 100644
--- a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewPagerAdapter.java
+++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuidePagerAdapter.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.chrome.browser.privacy_review;
+package org.chromium.chrome.browser.privacy_guide;
 
 import android.view.LayoutInflater;
 import android.view.View;
@@ -18,10 +18,10 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
-/** Controls the behavior of the ViewPager to navigate between privacy review steps. */
-public class PrivacyReviewPagerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
+/** Controls the behavior of the ViewPager to navigate between privacy guide steps. */
+public class PrivacyGuidePagerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
     /**
-     * The types of views supported. Each view corresponds to a step in the privacy review.
+     * The types of views supported. Each view corresponds to a step in the privacy guide.
      */
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({ViewType.COOKIES, ViewType.MSBB, ViewType.SAFE_BROWSING, ViewType.SYNC,
@@ -77,18 +77,17 @@
             LayoutInflater inflater = LayoutInflater.from(mView.getContext());
             if (clickedButtonId == mEnhancedProtection.getId()) {
                 displayBottomSheet(
-                        inflater.inflate(R.layout.privacy_review_sb_enhanced_explanation, null));
+                        inflater.inflate(R.layout.privacy_guide_sb_enhanced_explanation, null));
             } else if (clickedButtonId == mStandardProtection.getId()) {
                 displayBottomSheet(
-                        inflater.inflate(R.layout.privacy_review_sb_standard_explanation, null));
+                        inflater.inflate(R.layout.privacy_guide_sb_standard_explanation, null));
             } else {
                 assert false : "Should not be reached.";
             }
         }
 
         private void displayBottomSheet(View sheetContent) {
-            PrivacyReviewBottomSheetView bottomSheet =
-                    new PrivacyReviewBottomSheetView(sheetContent);
+            PrivacyGuideBottomSheetView bottomSheet = new PrivacyGuideBottomSheetView(sheetContent);
             mBottomSheetController.requestShowContent(bottomSheet, /* animate= */ true);
         }
     }
@@ -104,7 +103,7 @@
 
     private BottomSheetController mBottomSheetController;
 
-    public PrivacyReviewPagerAdapter(BottomSheetController controller) {
+    public PrivacyGuidePagerAdapter(BottomSheetController controller) {
         super();
         mBottomSheetController = controller;
     }
@@ -124,17 +123,17 @@
         switch (viewType) {
             case ViewType.MSBB:
                 return new MSBBViewHolder(
-                        inflater.inflate(R.layout.privacy_review_msbb_step, parent, false));
+                        inflater.inflate(R.layout.privacy_guide_msbb_step, parent, false));
             case ViewType.SYNC:
                 return new SyncViewHolder(
-                        inflater.inflate(R.layout.privacy_review_sync_step, parent, false));
+                        inflater.inflate(R.layout.privacy_guide_sync_step, parent, false));
             case ViewType.SAFE_BROWSING:
                 return new SafeBrowsingViewHolder(
-                        inflater.inflate(R.layout.privacy_review_sb_step, parent, false),
+                        inflater.inflate(R.layout.privacy_guide_sb_step, parent, false),
                         mBottomSheetController);
             case ViewType.COOKIES:
                 return new CookiesViewHolder(
-                        inflater.inflate(R.layout.privacy_review_cookies_step, parent, false));
+                        inflater.inflate(R.layout.privacy_guide_cookies_step, parent, false));
         }
         return null;
     }
diff --git a/chrome/browser/privacy_review/android/BUILD.gn b/chrome/browser/privacy_review/android/BUILD.gn
deleted file mode 100644
index 25b13e72..0000000
--- a/chrome/browser/privacy_review/android/BUILD.gn
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright 2021 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.
-
-import("//build/config/android/rules.gni")
-
-android_library("java") {
-  sources = [
-    "java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewBottomSheetView.java",
-    "java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewDialog.java",
-    "java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationHeading.java",
-    "java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationItem.java",
-    "java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewPagerAdapter.java",
-  ]
-  deps = [
-    ":java_resources",
-    "//components/browser_ui/bottomsheet/android:java",
-    "//components/browser_ui/widget/android:java",
-    "//third_party/androidx:androidx_annotation_annotation_java",
-    "//third_party/androidx:androidx_appcompat_appcompat_java",
-    "//third_party/androidx:androidx_recyclerview_recyclerview_java",
-    "//third_party/androidx:androidx_viewpager2_viewpager2_java",
-    "//ui/android:ui_full_java",
-  ]
-  resources_package = "org.chromium.chrome.browser.privacy_review"
-}
-
-android_resources("java_resources") {
-  sources = [
-    "java/res/drawable/privacy_review_cookies_image.xml",
-    "java/res/drawable/privacy_review_done_image.xml",
-    "java/res/drawable/privacy_review_illustration.xml",
-    "java/res/drawable/privacy_review_msbb_image.xml",
-    "java/res/drawable/privacy_review_sb_image.xml",
-    "java/res/drawable/privacy_review_sync_image.xml",
-    "java/res/layout/privacy_review_cookies_step.xml",
-    "java/res/layout/privacy_review_dialog.xml",
-    "java/res/layout/privacy_review_done.xml",
-    "java/res/layout/privacy_review_explanation_heading.xml",
-    "java/res/layout/privacy_review_explanation_item.xml",
-    "java/res/layout/privacy_review_msbb_step.xml",
-    "java/res/layout/privacy_review_sb_enhanced_explanation.xml",
-    "java/res/layout/privacy_review_sb_standard_explanation.xml",
-    "java/res/layout/privacy_review_sb_step.xml",
-    "java/res/layout/privacy_review_steps.xml",
-    "java/res/layout/privacy_review_sync_step.xml",
-    "java/res/layout/privacy_review_welcome.xml",
-    "java/res/menu/privacy_review_toolbar_menu.xml",
-    "java/res/values/attrs.xml",
-    "java/res/values/dimens.xml",
-  ]
-  deps = [
-    "//chrome/browser/ui/android/strings:ui_strings_grd",
-    "//components/browser_ui/styles/android:java_resources",
-    "//components/browser_ui/widget/android:java_resources",
-  ]
-}
diff --git a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationItem.java b/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationItem.java
deleted file mode 100644
index e3f34d68..0000000
--- a/chrome/browser/privacy_review/android/java/src/org/chromium/chrome/browser/privacy_review/PrivacyReviewExplanationItem.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2021 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.chrome.browser.privacy_review;
-
-import android.content.Context;
-import android.content.res.ColorStateList;
-import android.content.res.TypedArray;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-/** A custom view for an item (icon + text) of a setting explanation for the privacy review. */
-public class PrivacyReviewExplanationItem extends LinearLayout {
-    public PrivacyReviewExplanationItem(Context context, AttributeSet attrs) {
-        super(context, attrs);
-
-        View view = LayoutInflater.from(context).inflate(
-                R.layout.privacy_review_explanation_item, this);
-
-        TypedArray a = context.obtainStyledAttributes(
-                attrs, R.styleable.PrivacyReviewExplanationItem, 0, 0);
-
-        TextView summary = (TextView) view.findViewById(R.id.summary);
-        summary.setText(a.getText(R.styleable.PrivacyReviewExplanationItem_summaryText));
-
-        Drawable icon = a.getDrawable(R.styleable.PrivacyReviewExplanationItem_iconImage);
-        ColorStateList tint =
-                a.getColorStateList(R.styleable.PrivacyReviewExplanationItem_iconTint);
-        if (icon != null && tint != null) {
-            icon.setColorFilter(tint.getDefaultColor(), PorterDuff.Mode.SRC_IN);
-        }
-        summary.setCompoundDrawablesRelativeWithIntrinsicBounds(icon, null, null, null);
-
-        a.recycle();
-    }
-}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js
index 689115d9..acb6804 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js
@@ -40,19 +40,14 @@
     // Default per session sticky to off.
     localStorage['sticky'] = false;
 
-    this.init(loadExistingSettings);
+    this.init();
   }
 
   /**
    * Merge the default values of all known prefs with what's found in
    * localStorage.
-   * @param {boolean} pullFromLocalStorage or not to pull prefs from local
-   * storage. True if we want to respect changes the user has already made
-   * to prefs, false if we want to overwrite them. Set false if we've made
-   * changes to keyboard shortcuts and need to make sure they aren't
-   * overridden by the old keymap in local storage.
    */
-  init(pullFromLocalStorage) {
+  init() {
     // Set the default value of any pref that isn't already in localStorage.
     for (const pref in ChromeVoxPrefs.DEFAULT_PREFS) {
       if (localStorage[pref] === undefined) {
diff --git a/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn b/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn
index 77a07da..dc5d983 100644
--- a/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn
+++ b/chrome/browser/resources/chromeos/manage_mirrorsync/BUILD.gn
@@ -56,6 +56,7 @@
     ":gen_ts_files_from_html",
   ]
   composite = true
+  deps = [ "//ui/webui/resources/mojo:library" ]
 }
 
 resources_grd_file = "$target_gen_dir/resources.grd"
diff --git a/chrome/browser/resources/chromeos/manage_mirrorsync/components/folder_selector.ts b/chrome/browser/resources/chromeos/manage_mirrorsync/components/folder_selector.ts
index b85115b..78ece1a 100644
--- a/chrome/browser/resources/chromeos/manage_mirrorsync/components/folder_selector.ts
+++ b/chrome/browser/resources/chromeos/manage_mirrorsync/components/folder_selector.ts
@@ -79,7 +79,7 @@
    * parent.
    */
   async addChildFolders(folderPaths: string[]) {
-    let parentContainer: Element|null = null;
+    const parentElements: Map<string, HTMLInputElement> = new Map();
     let parentSelected: boolean = false;
     /**
      * Get the parent container and in the process cache the parent element. All
@@ -87,15 +87,16 @@
      * @param folderPath
      */
     const getParentContainer = (folderPath: string) => {
-      if (!parentContainer) {
-        const parentPath = getParentPath(folderPath);
+      const parentPath = getParentPath(folderPath);
+      if (!parentElements.has(parentPath)) {
         const parentSelector = selectorFromPath(parentPath);
         const parentElement =
             this.shadowRoot!.querySelector(parentSelector) as HTMLInputElement;
+        parentElements.set(parentPath, parentElement);
         parentSelected = parentElement.checked;
-        parentContainer = parentElement!.parentElement!.nextElementSibling!;
       }
-      return parentContainer;
+      parentSelected = parentElements.get(parentPath)!.checked;
+      return parentElements.get(parentPath)!.parentElement!.nextElementSibling!;
     };
 
     for (const path of folderPaths) {
@@ -109,6 +110,13 @@
   }
 
   /**
+   * Returns the list of paths that are currently selected.
+   */
+  get selectedPaths() {
+    return Array.from(this.selectedFolders.values());
+  }
+
+  /**
    * Event listener for when a checkbox for a path is selected. We want to
    * update all descendants to be disabled and checked and ensure the selected
    * path is being kept track of.
diff --git a/chrome/browser/resources/chromeos/manage_mirrorsync/components/manage_mirrorsync.ts b/chrome/browser/resources/chromeos/manage_mirrorsync/components/manage_mirrorsync.ts
index 048f92b..801b9ad4 100644
--- a/chrome/browser/resources/chromeos/manage_mirrorsync/components/manage_mirrorsync.ts
+++ b/chrome/browser/resources/chromeos/manage_mirrorsync/components/manage_mirrorsync.ts
@@ -75,8 +75,8 @@
    */
   private async onFolderExpanded(path: string) {
     const proxy = BrowserProxy.getInstance().handler;
-    const folderPaths =
-        (await proxy.getChildFolders({path})).paths.map(({path}) => path);
+    const childFolders = await proxy.getChildFolders({path});
+    const folderPaths = childFolders.paths.map(({path}) => path);
     this.folderSelector?.addChildFolders(folderPaths);
   }
 }
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index 9c01bdc..45864fa 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -7,19 +7,17 @@
 import("//tools/grit/grit_rule.gni")
 import("//tools/grit/preprocess_if_expr.gni")
 import("//tools/polymer/html_to_js.gni")
-import("//tools/typescript/ts_library.gni")
 import("//ui/webui/resources/tools/generate_grd.gni")
 import("//ui/webui/webui_features.gni")
 import("../../tools/optimize_webui.gni")
 import("./os_settings.gni")
 
-assert(is_chromeos_ash, "ChromeOS Settings is ChromeOS only")
+assert(is_chromeos_ash)
 
 # root_gen_dir is "gen"
 # target_gen_dir is "gen/chrome/browser/resources/settings/chromeos"
 
 preprocessed_folder = "preprocessed"
-preprocessed_ts_folder = "preprocessed_ts"
 web_components_manifest = "web_components_manifest.json"
 non_web_component_files_manifest = "non_web_component_files_manifest.json"
 browser_settings_tsc_manifest = "browser_settings_tsc_manifest.json"
@@ -29,7 +27,7 @@
 if (optimize_webui) {
   build_manifest_v3 = "build_v3_manifest.json"
 
-  optimize_webui("optimize_bundle") {
+  optimize_webui("build_polymer3") {
     host = "os-settings"
     input = rebase_path("$target_gen_dir/$preprocessed_folder", root_build_dir)
     js_module_in_files = [
@@ -44,7 +42,6 @@
     out_manifest = "$target_gen_dir/$build_manifest_v3"
 
     deps = [
-      ":build_ts",
       ":preprocess_browser_settings_tsc",
       ":preprocess_mojo_webui",
       ":preprocess_non_web_component_files",
@@ -98,46 +95,6 @@
   }
 }
 
-# TypeScript Build Configuration
-# TODO(crbug/1315757) Gradually remove JS files from blocked_web_component_files
-# and blocked_non_web_component_files, and add them as input files here.
-# Eventually, ts_library() will be the only build path for all JS/TS files.
-# Any JS file in passed into this build rule is elligble to be converted to TS.
-ts_library("build_ts") {
-  tsconfig_base = "tsconfig_base.json"
-  deps = [
-    "//third_party/polymer/v3_0:library",
-    "//ui/webui/resources:library",
-  ]
-  extra_deps = [
-    ":preprocess_generated_ts_files",
-    ":preprocess_source_ts_files",
-  ]
-  definitions = [
-    "//tools/typescript/definitions/chrome_send.d.ts",
-    "//tools/typescript/definitions/bluetooth.d.ts",
-    "//tools/typescript/definitions/bluetooth_private.d.ts",
-  ]
-  root_dir = "$target_gen_dir/$preprocessed_ts_folder"
-  in_files = source_ts_files + generated_ts_files
-  out_dir = "$target_gen_dir/$preprocessed_folder"
-}
-
-preprocess_if_expr("preprocess_source_ts_files") {
-  defines = chrome_grit_defines
-  in_folder = "../"
-  in_files = source_ts_files
-  out_folder = "$target_gen_dir/$preprocessed_ts_folder"
-}
-
-preprocess_if_expr("preprocess_generated_ts_files") {
-  defines = chrome_grit_defines
-  deps = [ ":generate_web_components" ]
-  in_folder = get_path_info("../", "gen_dir")
-  in_files = generated_ts_files
-  out_folder = "$target_gen_dir/$preprocessed_ts_folder"
-}
-
 # Preprocess all WebUI mojom files, which are bundled in optimized builds.
 preprocess_if_expr("preprocess_mojo_webui") {
   deps = [
@@ -307,7 +264,7 @@
   ]
 
   if (optimize_webui) {
-    deps += [ ":optimize_bundle" ]
+    deps += [ ":build_polymer3" ]
     manifest_files += [ "$target_gen_dir/$build_manifest_v3" ]
     input_files += [ "../../nearby_share/shared/nearby_shared_icons.html" ]
     resource_path_rewrites += [
@@ -319,7 +276,6 @@
     ]
   } else {
     deps += [
-      ":build_ts",
       ":preprocess_browser_settings_tsc",
       ":preprocess_mojo_webui",
       ":preprocess_non_web_component_files",
@@ -333,7 +289,6 @@
       "$target_gen_dir/$non_web_component_files_manifest",
       "$target_gen_dir/$browser_settings_tsc_manifest",
       "$target_gen_dir/$mojo_webui_manifest",
-      "$target_gen_dir/build_ts.manifest",
     ]
     resource_path_rewrites += [ "chromeos/os_settings.html|os_settings.html" ]
   }
@@ -344,7 +299,98 @@
   in_folder = "../"
   out_folder = "$target_gen_dir/$preprocessed_folder"
   out_manifest = "$target_gen_dir/$non_web_component_files_manifest"
-  in_files = blocked_source_ts_files
+  in_files = [
+    "chromeos/deep_linking_behavior.js",
+    "chromeos/metrics_recorder.js",
+    "chromeos/os_settings_routes.js",
+    "chromeos/route_origin_behavior.js",
+    "chromeos/combined_search_handler.js",
+    "chromeos/personalization_search_handler.js",
+    "chromeos/settings_search_handler.js",
+    "chromeos/os_route.js",
+    "chromeos/os_page_visibility.js",
+    "chromeos/os_people_page/lock_state_behavior.js",
+    "chromeos/os_people_page/os_sync_browser_proxy.js",
+    "chromeos/pref_to_setting_metric_converter.js",
+    "chromeos/ensure_lazy_loaded.js",
+    "chromeos/lazy_load.js",
+    "chromeos/crostini_page/crostini_browser_proxy.js",
+    "chromeos/date_time_page/date_time_types.js",
+    "chromeos/date_time_page/timezone_browser_proxy.js",
+    "chromeos/device_page/cros_audio_config.js",
+    "chromeos/device_page/device_page_browser_proxy.js",
+    "chromeos/device_page/drag_behavior.js",
+    "chromeos/device_page/layout_behavior.js",
+    "chromeos/global_scroll_target_behavior.js",
+    "chromeos/google_assistant_page/google_assistant_browser_proxy.js",
+    "chromeos/guest_os/guest_os_browser_proxy.js",
+    "chromeos/os_privacy_page/privacy_hub_browser_proxy.js",
+    "chromeos/internet_page/cellular_setup_settings_delegate.js",
+    "chromeos/internet_page/internet_page_browser_proxy.js",
+    "chromeos/kerberos_page/kerberos_accounts_browser_proxy.js",
+    "chromeos/multidevice_page/multidevice_browser_proxy.js",
+    "chromeos/multidevice_page/multidevice_constants.js",
+    "chromeos/multidevice_page/multidevice_feature_behavior.js",
+    "chromeos/multidevice_page/multidevice_metrics_logger.js",
+    "chromeos/nearby_share_page/nearby_account_manager_browser_proxy.js",
+    "chromeos/nearby_share_page/nearby_share_receive_manager.js",
+    "chromeos/nearby_share_page/types.js",
+    "chromeos/os_a11y_page/manage_a11y_page_browser_proxy.js",
+    "chromeos/os_a11y_page/os_a11y_page_browser_proxy.js",
+    "chromeos/os_a11y_page/switch_access_constants.js",
+    "chromeos/os_a11y_page/switch_access_subpage_browser_proxy.js",
+    "chromeos/os_a11y_page/text_to_speech_page_browser_proxy.js",
+    "chromeos/os_a11y_page/keyboard_and_text_input_page_browser_proxy.js",
+    "chromeos/os_a11y_page/cursor_and_touchpad_page_browser_proxy.js",
+    "chromeos/os_a11y_page/audio_and_captions_page_browser_proxy.js",
+    "chromeos/os_a11y_page/tts_subpage_browser_proxy.js",
+    "chromeos/os_apps_page/android_apps_browser_proxy.js",
+    "chromeos/os_apps_page/app_management_page/actions.js",
+    "chromeos/os_apps_page/app_management_page/api_listener.js",
+    "chromeos/os_apps_page/app_management_page/browser_proxy.js",
+    "chromeos/os_apps_page/app_management_page/fake_page_handler.js",
+    "chromeos/os_apps_page/app_management_page/reducers.js",
+    "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.js",
+    "chromeos/os_apps_page/app_management_page/store.js",
+    "chromeos/os_apps_page/app_management_page/store_client.js",
+    "chromeos/os_apps_page/app_management_page/util.js",
+    "chromeos/os_apps_page/app_management_page/types.js",
+    "chromeos/os_apps_page/app_notifications_page/mojo_interface_provider.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js",
+    "chromeos/os_bluetooth_page/settings_fast_pair_constants.js",
+    "chromeos/os_languages_page/input_method_settings.js",
+    "chromeos/os_languages_page/languages_browser_proxy.js",
+    "chromeos/os_languages_page/languages.js",
+    "chromeos/os_languages_page/languages_types.js",
+    "chromeos/os_languages_page/input_method_util.js",
+    "chromeos/os_languages_page/languages_metrics_proxy.js",
+    "chromeos/os_people_page/fingerprint_browser_proxy.js",
+    "chromeos/os_printing_page/cups_printers_entry_list_behavior.js",
+    "chromeos/os_printing_page/cups_printer_dialog_util.js",
+    "chromeos/os_printing_page/cups_printer_types.js",
+    "chromeos/os_printing_page/cups_printers_browser_proxy.js",
+    "chromeos/os_printing_page/cups_printers_entry_manager.js",
+    "chromeos/os_search_page/search_engines_browser_proxy.js",
+    "chromeos/os_settings_page/main_page_behavior.js",
+    "chromeos/bluetooth_page/bluetooth_page_browser_proxy.js",
+    "chromeos/os_about_page/about_page_browser_proxy.js",
+    "chromeos/os_about_page/device_name_browser_proxy.js",
+    "chromeos/os_about_page/device_name_util.js",
+    "chromeos/os_reset_page/os_reset_browser_proxy.js",
+    "chromeos/os_settings.js",
+    "chromeos/parental_controls_page/parental_controls_browser_proxy.js",
+    "chromeos/personalization_page/change_picture_browser_proxy.js",
+    "chromeos/personalization_page/personalization_hub_browser_proxy.js",
+    "chromeos/personalization_page/wallpaper_browser_proxy.js",
+    "chromeos/prefs_behavior.js",
+    "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.js",
+    "chromeos/os_privacy_page/metrics_consent_browser_proxy.js",
+    "chromeos/os_people_page/account_manager_browser_proxy.js",
+    "chromeos/route_observer_behavior.js",
+    "chromeos/ambient_mode_page/ambient_mode_browser_proxy.js",
+    "chromeos/ambient_mode_page/constants.js",
+    "router.js",
+  ]
 }
 
 # Since Browser Settings is migrating to TypeScript (crbug.com/1234307), and
@@ -357,31 +403,6 @@
   out_folder = "$target_gen_dir/$preprocessed_folder"
   out_manifest = "$target_gen_dir/$browser_settings_tsc_manifest"
 
-  # Files that don't have a corresponding HTML file.
-  in_files = [
-    "appearance_page/fonts_browser_proxy.js",
-    "controls/cr_policy_pref_mixin.js",
-    "controls/pref_control_mixin.js",
-    "controls/settings_boolean_control_mixin.js",
-    "extension_control_browser_proxy.js",
-    "i18n_setup.js",
-    "icons.html.js",
-    "lifetime_browser_proxy.js",
-    "open_window_proxy.js",
-    "people_page/profile_info_browser_proxy.js",
-    "people_page/sync_browser_proxy.js",
-    "prefs/prefs.js",
-    "prefs/prefs_mixin.js",
-    "prefs/prefs_types.js",
-    "prefs/pref_util.js",
-    "privacy_page/privacy_page_browser_proxy.js",
-    "relaunch_mixin.js",
-    "setting_id_param_util.js",
-    "settings_page_styles.css.js",
-    "settings_shared.css.js",
-    "settings_vars.css.js",
-  ]
-
   # Files that have a corresponding HTML wrapper file.
   browser_settings_web_component_files = [
     "a11y_page/captions_subpage.js",
@@ -409,6 +430,31 @@
     "site_favicon.js",
   ]
 
+  in_files = [
+    # Files that don't have a corresponding HTML file.
+    "appearance_page/fonts_browser_proxy.js",
+    "controls/cr_policy_pref_mixin.js",
+    "controls/pref_control_mixin.js",
+    "controls/settings_boolean_control_mixin.js",
+    "extension_control_browser_proxy.js",
+    "i18n_setup.js",
+    "icons.html.js",
+    "lifetime_browser_proxy.js",
+    "open_window_proxy.js",
+    "people_page/profile_info_browser_proxy.js",
+    "people_page/sync_browser_proxy.js",
+    "prefs/prefs.js",
+    "prefs/prefs_mixin.js",
+    "prefs/prefs_types.js",
+    "prefs/pref_util.js",
+    "privacy_page/privacy_page_browser_proxy.js",
+    "relaunch_mixin.js",
+    "setting_id_param_util.js",
+    "settings_page_styles.css.js",
+    "settings_shared.css.js",
+    "settings_vars.css.js",
+  ]
+
   foreach(f, browser_settings_web_component_files) {
     in_files += [
       f,
@@ -423,7 +469,222 @@
   in_folder = get_path_info("../", "gen_dir")
   out_folder = "$target_gen_dir/$preprocessed_folder"
   out_manifest = "$target_gen_dir/$web_components_manifest"
-  in_files = blocked_generated_ts_files
+  in_files = [
+    "chromeos/ambient_mode_page/album_item.js",
+    "chromeos/ambient_mode_page/album_list.js",
+    "chromeos/ambient_mode_page/ambient_mode_page.js",
+    "chromeos/ambient_mode_page/ambient_mode_photos_page.js",
+    "chromeos/ambient_mode_page/art_album_dialog.js",
+    "chromeos/ambient_mode_page/text_with_tooltip.js",
+    "chromeos/ambient_mode_page/topic_source_item.js",
+    "chromeos/ambient_mode_page/topic_source_list.js",
+    "chromeos/bluetooth_page/bluetooth_device_list_item.js",
+    "chromeos/bluetooth_page/bluetooth_page.js",
+    "chromeos/bluetooth_page/bluetooth_subpage.js",
+    "chromeos/crostini_page/bruschetta_subpage.js",
+    "chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.js",
+    "chromeos/crostini_page/crostini_arc_adb.js",
+    "chromeos/crostini_page/crostini_confirmation_dialog.js",
+    "chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.js",
+    "chromeos/crostini_page/crostini_disk_resize_dialog.js",
+    "chromeos/crostini_page/crostini_export_import.js",
+    "chromeos/crostini_page/crostini_extra_containers_create_dialog.js",
+    "chromeos/crostini_page/crostini_extra_containers.js",
+    "chromeos/crostini_page/crostini_import_confirmation_dialog.js",
+    "chromeos/crostini_page/crostini_page.js",
+    "chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.js",
+    "chromeos/crostini_page/crostini_port_forwarding.js",
+    "chromeos/crostini_page/crostini_subpage.js",
+    "chromeos/date_time_page/date_time_page.js",
+    "chromeos/date_time_page/timezone_selector.js",
+    "chromeos/date_time_page/timezone_subpage.js",
+    "chromeos/device_page/audio.js",
+    "chromeos/device_page/device_page.js",
+    "chromeos/device_page/display.js",
+    "chromeos/device_page/display_layout.js",
+    "chromeos/device_page/display_overscan_dialog.js",
+    "chromeos/device_page/keyboard.js",
+    "chromeos/device_page/pointers.js",
+    "chromeos/device_page/power.js",
+    "chromeos/device_page/storage_external_entry.js",
+    "chromeos/device_page/storage_external.js",
+    "chromeos/device_page/storage.js",
+    "chromeos/device_page/stylus.js",
+    "chromeos/google_assistant_page/google_assistant_page.js",
+    "chromeos/guest_os/guest_os_container_select.js",
+    "chromeos/guest_os/guest_os_shared_paths.js",
+    "chromeos/guest_os/guest_os_shared_usb_devices.js",
+    "chromeos/internet_page/cellular_networks_list.js",
+    "chromeos/internet_page/cellular_roaming_toggle_button.js",
+    "chromeos/internet_page/cellular_setup_dialog.js",
+    "chromeos/internet_page/esim_install_error_dialog.js",
+    "chromeos/internet_page/esim_remove_profile_dialog.js",
+    "chromeos/internet_page/esim_rename_dialog.js",
+    "chromeos/internet_page/internet_config.js",
+    "chromeos/internet_page/internet_detail_menu.js",
+    "chromeos/internet_page/internet_detail_page.js",
+    "chromeos/internet_page/internet_known_networks_page.js",
+    "chromeos/internet_page/internet_page.js",
+    "chromeos/internet_page/internet_shared_css.js",
+    "chromeos/internet_page/internet_subpage.js",
+    "chromeos/internet_page/network_always_on_vpn.js",
+    "chromeos/internet_page/network_proxy_section.js",
+    "chromeos/internet_page/network_summary_item.js",
+    "chromeos/internet_page/network_summary.js",
+    "chromeos/internet_page/settings_traffic_counters.js",
+    "chromeos/internet_page/tether_connection_dialog.js",
+    "chromeos/kerberos_page/kerberos_accounts.js",
+    "chromeos/kerberos_page/kerberos_add_account_dialog.js",
+    "chromeos/kerberos_page/kerberos_page.js",
+    "chromeos/keyboard_shortcut_banner/keyboard_shortcut_banner.js",
+    "chromeos/multidevice_page/multidevice_combined_setup_item.js",
+    "chromeos/multidevice_page/multidevice_feature_item.js",
+    "chromeos/multidevice_page/multidevice_feature_toggle.js",
+    "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js",
+    "chromeos/multidevice_page/multidevice_page.js",
+    "chromeos/multidevice_page/multidevice_permissions_setup_dialog.js",
+    "chromeos/multidevice_page/multidevice_radio_button.js",
+    "chromeos/multidevice_page/multidevice_screen_lock_subpage.js",
+    "chromeos/multidevice_page/multidevice_smartlock_item.js",
+    "chromeos/multidevice_page/multidevice_smartlock_subpage.js",
+    "chromeos/multidevice_page/multidevice_subpage.js",
+    "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js",
+    "chromeos/multidevice_page/multidevice_task_continuation_item.js",
+    "chromeos/multidevice_page/multidevice_tether_item.js",
+    "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js",
+    "chromeos/multidevice_page/multidevice_wifi_sync_item.js",
+    "chromeos/nearby_share_page/nearby_share_confirm_page.js",
+    "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js",
+    "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js",
+    "chromeos/nearby_share_page/nearby_share_device_name_dialog.js",
+    "chromeos/nearby_share_page/nearby_share_high_visibility_page.js",
+    "chromeos/nearby_share_page/nearby_share_receive_dialog.js",
+    "chromeos/nearby_share_page/nearby_share_subpage.js",
+    "chromeos/os_a11y_page/change_dictation_locale_dialog.js",
+    "chromeos/os_a11y_page/display_and_magnification_page.js",
+    "chromeos/os_a11y_page/keyboard_and_text_input_page.js",
+    "chromeos/os_a11y_page/cursor_and_touchpad_page.js",
+    "chromeos/os_a11y_page/audio_and_captions_page.js",
+    "chromeos/os_a11y_page/manage_a11y_page.js",
+    "chromeos/os_a11y_page/os_a11y_page.js",
+    "chromeos/os_a11y_page/switch_access_action_assignment_dialog.js",
+    "chromeos/os_a11y_page/switch_access_action_assignment_pane.js",
+    "chromeos/os_a11y_page/switch_access_setup_guide_dialog.js",
+    "chromeos/os_a11y_page/switch_access_setup_guide_warning_dialog.js",
+    "chromeos/os_a11y_page/switch_access_subpage.js",
+    "chromeos/os_a11y_page/text_to_speech_page.js",
+    "chromeos/os_a11y_page/tts_subpage.js",
+    "chromeos/os_about_page/channel_switcher_dialog.js",
+    "chromeos/os_about_page/consumer_auto_update_toggle_dialog.js",
+    "chromeos/os_about_page/detailed_build_info.js",
+    "chromeos/os_about_page/edit_hostname_dialog.js",
+    "chromeos/os_about_page/os_about_page.js",
+    "chromeos/os_about_page/update_warning_dialog.js",
+    "chromeos/os_apps_page/android_apps_subpage.js",
+    "chromeos/os_apps_page/app_management_page/app_details_item.js",
+    "chromeos/os_apps_page/app_management_page/app_detail_view.js",
+    "chromeos/os_apps_page/app_management_page/app_item.js",
+    "chromeos/os_apps_page/app_management_page/app_management_page.js",
+    "chromeos/os_apps_page/app_management_page/arc_detail_view.js",
+    "chromeos/os_apps_page/app_management_page/borealis_page/borealis_detail_view.js",
+    "chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js",
+    "chromeos/os_apps_page/app_management_page/dom_switch.js",
+    "chromeos/os_apps_page/app_management_page/main_view.js",
+    "chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js",
+    "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js",
+    "chromeos/os_apps_page/app_management_page/pwa_detail_view.js",
+    "chromeos/os_apps_page/app_management_page/resize_lock_item.js",
+    "chromeos/os_apps_page/app_management_page/shared_style.js",
+    "chromeos/os_apps_page/app_management_page/shared_vars.js",
+    "chromeos/os_apps_page/app_management_page/supported_links_dialog.js",
+    "chromeos/os_apps_page/app_management_page/supported_links_item.js",
+    "chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js",
+    "chromeos/os_apps_page/app_notifications_page/app_notification_row.js",
+    "chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js",
+    "chromeos/os_apps_page/os_apps_page.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_page.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_pairing_dialog.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_summary.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js",
+    "chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js",
+    "chromeos/os_bluetooth_page/os_paired_bluetooth_list.js",
+    "chromeos/os_bluetooth_page/os_saved_devices_list.js",
+    "chromeos/os_bluetooth_page/os_saved_devices_list_item.js",
+    "chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js",
+    "chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js",
+    "chromeos/os_bluetooth_page/settings_fast_pair_toggle.js",
+    "chromeos/os_files_page/os_files_page.js",
+    "chromeos/os_files_page/smb_shares_page.js",
+    "chromeos/os_icons.js",
+    "chromeos/os_languages_page/add_input_methods_dialog.js",
+    "chromeos/os_languages_page/add_items_dialog.js",
+    "chromeos/os_languages_page/add_spellcheck_languages_dialog.js",
+    "chromeos/os_languages_page/change_device_language_dialog.js",
+    "chromeos/os_languages_page/cr_checkbox_with_policy.js",
+    "chromeos/os_languages_page/input_method_options_page.js",
+    "chromeos/os_languages_page/input_page.js",
+    "chromeos/os_languages_page/os_add_languages_dialog.js",
+    "chromeos/os_languages_page/os_edit_dictionary_page.js",
+    "chromeos/os_languages_page/os_languages_page_v2.js",
+    "chromeos/os_languages_page/os_languages_section.js",
+    "chromeos/os_languages_page/shared_style.js",
+    "chromeos/os_languages_page/shared_vars.js",
+    "chromeos/os_languages_page/smart_inputs_page.js",
+    "chromeos/os_people_page/account_manager.js",
+    "chromeos/os_people_page/fingerprint_list.js",
+    "chromeos/os_people_page/lock_screen.js",
+    "chromeos/os_people_page/lock_screen_password_prompt_dialog.js",
+    "chromeos/os_people_page/os_people_page.js",
+    "chromeos/os_people_page/os_sync_controls.js",
+    "chromeos/os_people_page/pin_autosubmit_dialog.js",
+    "chromeos/os_people_page/setup_fingerprint_dialog.js",
+    "chromeos/os_people_page/setup_pin_dialog.js",
+    "chromeos/os_people_page/user_list.js",
+    "chromeos/os_people_page/users_add_user_dialog.js",
+    "chromeos/os_people_page/users_page.js",
+    "chromeos/os_printing_page/cups_add_printer_dialog.js",
+    "chromeos/os_printing_page/cups_add_printer_manually_dialog.js",
+    "chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.js",
+    "chromeos/os_printing_page/cups_add_print_server_dialog.js",
+    "chromeos/os_printing_page/cups_edit_printer_dialog.js",
+    "chromeos/os_printing_page/cups_enterprise_printers.js",
+    "chromeos/os_printing_page/cups_nearby_printers.js",
+    "chromeos/os_printing_page/cups_printer_dialog_error.js",
+    "chromeos/os_printing_page/cups_printers_entry.js",
+    "chromeos/os_printing_page/cups_printer_shared_css.js",
+    "chromeos/os_printing_page/cups_printers.js",
+    "chromeos/os_printing_page/cups_saved_printers.js",
+    "chromeos/os_printing_page/cups_settings_add_printer_dialog.js",
+    "chromeos/os_printing_page/os_printing_page.js",
+    "chromeos/os_privacy_page/os_privacy_page.js",
+    "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js",
+    "chromeos/os_privacy_page/privacy_hub_page.js",
+    "chromeos/os_privacy_page/smart_privacy_page.js",
+    "chromeos/os_reset_page/os_powerwash_dialog_esim_item.js",
+    "chromeos/os_reset_page/os_powerwash_dialog.js",
+    "chromeos/os_reset_page/os_reset_page.js",
+    "chromeos/os_search_page/os_search_page.js",
+    "chromeos/os_search_page/os_search_selection_dialog.js",
+    "chromeos/os_search_page/search_engine.js",
+    "chromeos/os_search_page/search_subpage.js",
+    "chromeos/os_settings_icons_css.js",
+    "chromeos/os_settings_main/os_settings_main.js",
+    "chromeos/os_settings_menu/os_settings_menu.js",
+    "chromeos/os_settings_page/os_settings_page.js",
+    "chromeos/os_settings_page/settings_idle_load.js",
+    "chromeos/os_settings_search_box/os_search_result_row.js",
+    "chromeos/os_settings_search_box/os_settings_search_box.js",
+    "chromeos/os_settings_ui/os_settings_ui.js",
+    "chromeos/os_toolbar/os_toolbar.js",
+    "chromeos/parental_controls_page/parental_controls_page.js",
+    "chromeos/personalization_page/change_picture.js",
+    "chromeos/personalization_page/personalization_page.js",
+    "chromeos/settings_scheduler_slider/settings_scheduler_slider.js",
+  ]
 }
 
 html_to_js("web_components") {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
index bf9c3a8..4422766 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.html
@@ -412,15 +412,12 @@
 </div>
 
 <template is="dom-if"
-    if="[[shouldShowAdditionalFeaturesLink_(isGuest_, isKioskModeActive_)]]">
+    if="[[shouldShowAdditionalFeaturesLink_(isKioskModeActive_, isGuest_)]]">
   <a class="settings-box inherit-color no-outline" tabindex="-1"
       id="additionalFeaturesLink" target="_blank"
       href="https://chrome.google.com/webstore/category/collection/3p_accessibility_extensions">
     <div class="start settings-box-text">
       $i18n{additionalFeaturesTitle}
-      <div class="secondary" id="moreFeaturesSecondary">
-        $i18n{a11yWebStore}
-      </div>
     </div>
     <cr-icon-button class="icon-external"
         aria-label="$i18n{additionalFeaturesTitle}"
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index 2b4662b..a39bead 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -265,7 +265,10 @@
             'computeShowShelfNavigationButtonsSettings_(isKioskModeActive_)',
       },
 
-      /** @protected */
+      /**
+       * Whether the user is in guest mode.
+       * @protected
+       */
       isGuest_: {
         type: Boolean,
         value() {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html
index a7ab4fa..b2352335 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.html
@@ -66,6 +66,20 @@
         role-description="$i18n{subpageArrowRoleDescription}">
       </cr-link-row>
     </template>
+    <template is="dom-if"
+        if="[[shouldShowAdditionalFeaturesLink_(isKioskModeActive_, isGuest_)]]">
+      <a class="settings-box inherit-color no-outline" tabindex="-1"
+          id="additionalFeaturesLink" target="_blank"
+          href="https://chrome.google.com/webstore/category/collection/3p_accessibility_extensions">
+        <div class="start settings-box-text">
+          $i18n{additionalFeaturesTitle}
+        </div>
+        <cr-icon-button class="icon-external"
+            aria-label="$i18n{additionalFeaturesTitle}"
+            aria-describedby="moreFeaturesSecondary">
+        </cr-icon-button>
+      </a>
+    </template>
   </div>
 
   <template is="dom-if" route-path="/manageAccessibility">
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
index 50f573b..ee9b4fd 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
@@ -148,6 +148,17 @@
       },
 
       /**
+       * Whether the user is in guest mode.
+       * @protected
+       */
+      isGuest_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('isGuest');
+        },
+      },
+
+      /**
        * Used by DeepLinkingBehavior to focus this page's deep links.
        * @type {!Set<!Setting>}
        */
@@ -220,6 +231,17 @@
   }
 
   /**
+   * Whether additional features link should be shown.
+   * @param {boolean} isKiosk
+   * @param {boolean} isGuest
+   * @return {boolean}
+   * @private
+   */
+  shouldShowAdditionalFeaturesLink_(isKiosk, isGuest) {
+    return !isKiosk && !isGuest;
+  }
+
+  /**
    * @private
    * @param {boolean} hasScreenReader Whether a screen reader is enabled.
    */
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 754df883..3534eff 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -5,329 +5,6 @@
 import("//third_party/closure_compiler/compile_js.gni")
 import("../settings.gni")
 
-# TODO(crbug/1315757) These "blocked" files will should be transferred to their
-# respective list (generated_ts_files or source_ts_files) once
-# eligible to be converted to TS and passed to ts_library().
-blocked_generated_ts_files = [
-  "chromeos/internet_page/cellular_networks_list.js",
-  "chromeos/internet_page/cellular_roaming_toggle_button.js",
-  "chromeos/internet_page/cellular_setup_dialog.js",
-  "chromeos/internet_page/esim_install_error_dialog.js",
-  "chromeos/internet_page/esim_remove_profile_dialog.js",
-  "chromeos/internet_page/esim_rename_dialog.js",
-  "chromeos/internet_page/internet_config.js",
-  "chromeos/internet_page/internet_detail_menu.js",
-  "chromeos/internet_page/internet_detail_page.js",
-  "chromeos/internet_page/internet_known_networks_page.js",
-  "chromeos/internet_page/internet_page.js",
-  "chromeos/internet_page/internet_shared_css.js",
-  "chromeos/internet_page/internet_subpage.js",
-  "chromeos/internet_page/network_always_on_vpn.js",
-  "chromeos/internet_page/network_proxy_section.js",
-  "chromeos/internet_page/network_summary_item.js",
-  "chromeos/internet_page/network_summary.js",
-  "chromeos/internet_page/settings_traffic_counters.js",
-  "chromeos/internet_page/tether_connection_dialog.js",
-  "chromeos/multidevice_page/multidevice_combined_setup_item.js",
-  "chromeos/multidevice_page/multidevice_feature_item.js",
-  "chromeos/multidevice_page/multidevice_feature_toggle.js",
-  "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js",
-  "chromeos/multidevice_page/multidevice_page.js",
-  "chromeos/multidevice_page/multidevice_permissions_setup_dialog.js",
-  "chromeos/multidevice_page/multidevice_radio_button.js",
-  "chromeos/multidevice_page/multidevice_screen_lock_subpage.js",
-  "chromeos/multidevice_page/multidevice_smartlock_item.js",
-  "chromeos/multidevice_page/multidevice_smartlock_subpage.js",
-  "chromeos/multidevice_page/multidevice_subpage.js",
-  "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js",
-  "chromeos/multidevice_page/multidevice_task_continuation_item.js",
-  "chromeos/multidevice_page/multidevice_tether_item.js",
-  "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js",
-  "chromeos/multidevice_page/multidevice_wifi_sync_item.js",
-  "chromeos/os_languages_page/add_input_methods_dialog.js",
-  "chromeos/os_languages_page/add_items_dialog.js",
-  "chromeos/os_languages_page/add_spellcheck_languages_dialog.js",
-  "chromeos/os_languages_page/change_device_language_dialog.js",
-  "chromeos/os_languages_page/cr_checkbox_with_policy.js",
-  "chromeos/os_languages_page/input_method_options_page.js",
-  "chromeos/os_languages_page/input_page.js",
-  "chromeos/os_languages_page/os_add_languages_dialog.js",
-  "chromeos/os_languages_page/os_edit_dictionary_page.js",
-  "chromeos/os_languages_page/os_languages_page_v2.js",
-  "chromeos/os_languages_page/os_languages_section.js",
-  "chromeos/os_languages_page/shared_style.js",
-  "chromeos/os_languages_page/shared_vars.js",
-  "chromeos/os_languages_page/smart_inputs_page.js",
-  "chromeos/os_printing_page/cups_add_printer_dialog.js",
-  "chromeos/os_printing_page/cups_add_printer_manually_dialog.js",
-  "chromeos/os_printing_page/cups_add_printer_manufacturer_model_dialog.js",
-  "chromeos/os_printing_page/cups_add_print_server_dialog.js",
-  "chromeos/os_printing_page/cups_edit_printer_dialog.js",
-  "chromeos/os_printing_page/cups_enterprise_printers.js",
-  "chromeos/os_printing_page/cups_nearby_printers.js",
-  "chromeos/os_printing_page/cups_printer_dialog_error.js",
-  "chromeos/os_printing_page/cups_printers_entry.js",
-  "chromeos/os_printing_page/cups_printer_shared_css.js",
-  "chromeos/os_printing_page/cups_printers.js",
-  "chromeos/os_printing_page/cups_saved_printers.js",
-  "chromeos/os_printing_page/cups_settings_add_printer_dialog.js",
-  "chromeos/os_printing_page/os_printing_page.js",
-  "chromeos/os_reset_page/os_powerwash_dialog_esim_item.js",
-  "chromeos/os_reset_page/os_powerwash_dialog.js",
-  "chromeos/os_reset_page/os_reset_page.js",
-]
-
-blocked_source_ts_files = [
-  "chromeos/internet_page/cellular_setup_settings_delegate.js",
-  "chromeos/internet_page/internet_page_browser_proxy.js",
-  "chromeos/multidevice_page/multidevice_browser_proxy.js",
-  "chromeos/multidevice_page/multidevice_constants.js",
-  "chromeos/multidevice_page/multidevice_feature_behavior.js",
-  "chromeos/multidevice_page/multidevice_metrics_logger.js",
-  "chromeos/os_languages_page/input_method_settings.js",
-  "chromeos/os_languages_page/languages_browser_proxy.js",
-  "chromeos/os_languages_page/languages.js",
-  "chromeos/os_languages_page/languages_types.js",
-  "chromeos/os_languages_page/input_method_util.js",
-  "chromeos/os_languages_page/languages_metrics_proxy.js",
-  "chromeos/os_printing_page/cups_printers_entry_list_behavior.js",
-  "chromeos/os_printing_page/cups_printer_dialog_util.js",
-  "chromeos/os_printing_page/cups_printer_types.js",
-  "chromeos/os_printing_page/cups_printers_browser_proxy.js",
-  "chromeos/os_printing_page/cups_printers_entry_manager.js",
-  "chromeos/os_reset_page/os_reset_browser_proxy.js",
-]
-
-# TODO(crbug/1315757) JS files here are available for TS conversion
-# These files are derived from gen_dir and are generated by either html_to_js()
-# or html_to_wrapper()
-generated_ts_files = [
-  "chromeos/os_icons.js",
-  "chromeos/os_settings_icons_css.js",
-  "chromeos/ambient_mode_page/album_item.js",
-  "chromeos/ambient_mode_page/album_list.js",
-  "chromeos/ambient_mode_page/ambient_mode_page.js",
-  "chromeos/ambient_mode_page/ambient_mode_photos_page.js",
-  "chromeos/ambient_mode_page/art_album_dialog.js",
-  "chromeos/ambient_mode_page/text_with_tooltip.js",
-  "chromeos/ambient_mode_page/topic_source_item.js",
-  "chromeos/ambient_mode_page/topic_source_list.js",
-  "chromeos/bluetooth_page/bluetooth_device_list_item.js",
-  "chromeos/bluetooth_page/bluetooth_page.js",
-  "chromeos/bluetooth_page/bluetooth_subpage.js",
-  "chromeos/crostini_page/bruschetta_subpage.js",
-  "chromeos/crostini_page/crostini_arc_adb_confirmation_dialog.js",
-  "chromeos/crostini_page/crostini_arc_adb.js",
-  "chromeos/crostini_page/crostini_confirmation_dialog.js",
-  "chromeos/crostini_page/crostini_disk_resize_confirmation_dialog.js",
-  "chromeos/crostini_page/crostini_disk_resize_dialog.js",
-  "chromeos/crostini_page/crostini_export_import.js",
-  "chromeos/crostini_page/crostini_extra_containers_create_dialog.js",
-  "chromeos/crostini_page/crostini_extra_containers.js",
-  "chromeos/crostini_page/crostini_import_confirmation_dialog.js",
-  "chromeos/crostini_page/crostini_page.js",
-  "chromeos/crostini_page/crostini_port_forwarding_add_port_dialog.js",
-  "chromeos/crostini_page/crostini_port_forwarding.js",
-  "chromeos/crostini_page/crostini_subpage.js",
-  "chromeos/date_time_page/date_time_page.js",
-  "chromeos/date_time_page/timezone_selector.js",
-  "chromeos/date_time_page/timezone_subpage.js",
-  "chromeos/device_page/audio.js",
-  "chromeos/device_page/device_page.js",
-  "chromeos/device_page/display.js",
-  "chromeos/device_page/display_layout.js",
-  "chromeos/device_page/display_overscan_dialog.js",
-  "chromeos/device_page/keyboard.js",
-  "chromeos/device_page/pointers.js",
-  "chromeos/device_page/power.js",
-  "chromeos/device_page/storage_external_entry.js",
-  "chromeos/device_page/storage_external.js",
-  "chromeos/device_page/storage.js",
-  "chromeos/device_page/stylus.js",
-  "chromeos/google_assistant_page/google_assistant_page.js",
-  "chromeos/guest_os/guest_os_container_select.js",
-  "chromeos/guest_os/guest_os_shared_paths.js",
-  "chromeos/guest_os/guest_os_shared_usb_devices.js",
-  "chromeos/kerberos_page/kerberos_accounts.js",
-  "chromeos/kerberos_page/kerberos_add_account_dialog.js",
-  "chromeos/kerberos_page/kerberos_page.js",
-  "chromeos/keyboard_shortcut_banner/keyboard_shortcut_banner.js",
-  "chromeos/nearby_share_page/nearby_share_confirm_page.js",
-  "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_device_name_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_high_visibility_page.js",
-  "chromeos/nearby_share_page/nearby_share_receive_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_subpage.js",
-  "chromeos/os_a11y_page/audio_and_captions_page.js",
-  "chromeos/os_a11y_page/change_dictation_locale_dialog.js",
-  "chromeos/os_a11y_page/cursor_and_touchpad_page.js",
-  "chromeos/os_a11y_page/display_and_magnification_page.js",
-  "chromeos/os_a11y_page/keyboard_and_text_input_page.js",
-  "chromeos/os_a11y_page/manage_a11y_page.js",
-  "chromeos/os_a11y_page/os_a11y_page.js",
-  "chromeos/os_a11y_page/switch_access_action_assignment_dialog.js",
-  "chromeos/os_a11y_page/switch_access_action_assignment_pane.js",
-  "chromeos/os_a11y_page/switch_access_setup_guide_dialog.js",
-  "chromeos/os_a11y_page/switch_access_setup_guide_warning_dialog.js",
-  "chromeos/os_a11y_page/switch_access_subpage.js",
-  "chromeos/os_a11y_page/text_to_speech_page.js",
-  "chromeos/os_a11y_page/tts_subpage.js",
-  "chromeos/os_about_page/channel_switcher_dialog.js",
-  "chromeos/os_about_page/consumer_auto_update_toggle_dialog.js",
-  "chromeos/os_about_page/detailed_build_info.js",
-  "chromeos/os_about_page/edit_hostname_dialog.js",
-  "chromeos/os_about_page/os_about_page.js",
-  "chromeos/os_about_page/update_warning_dialog.js",
-  "chromeos/os_apps_page/android_apps_subpage.js",
-  "chromeos/os_apps_page/app_management_page/app_details_item.js",
-  "chromeos/os_apps_page/app_management_page/app_detail_view.js",
-  "chromeos/os_apps_page/app_management_page/app_item.js",
-  "chromeos/os_apps_page/app_management_page/app_management_page.js",
-  "chromeos/os_apps_page/app_management_page/arc_detail_view.js",
-  "chromeos/os_apps_page/app_management_page/borealis_page/borealis_detail_view.js",
-  "chromeos/os_apps_page/app_management_page/chrome_app_detail_view.js",
-  "chromeos/os_apps_page/app_management_page/dom_switch.js",
-  "chromeos/os_apps_page/app_management_page/main_view.js",
-  "chromeos/os_apps_page/app_management_page/pin_to_shelf_item.js",
-  "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js",
-  "chromeos/os_apps_page/app_management_page/pwa_detail_view.js",
-  "chromeos/os_apps_page/app_management_page/resize_lock_item.js",
-  "chromeos/os_apps_page/app_management_page/shared_style.js",
-  "chromeos/os_apps_page/app_management_page/shared_vars.js",
-  "chromeos/os_apps_page/app_management_page/supported_links_dialog.js",
-  "chromeos/os_apps_page/app_management_page/supported_links_item.js",
-  "chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js",
-  "chromeos/os_apps_page/app_notifications_page/app_notification_row.js",
-  "chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js",
-  "chromeos/os_apps_page/os_apps_page.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_page.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_pairing_dialog.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_summary.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js",
-  "chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js",
-  "chromeos/os_bluetooth_page/os_paired_bluetooth_list.js",
-  "chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js",
-  "chromeos/os_bluetooth_page/os_saved_devices_list.js",
-  "chromeos/os_bluetooth_page/os_saved_devices_list_item.js",
-  "chromeos/os_bluetooth_page/settings_fast_pair_toggle.js",
-  "chromeos/os_files_page/os_files_page.js",
-  "chromeos/os_files_page/smb_shares_page.js",
-  "chromeos/os_people_page/account_manager.js",
-  "chromeos/os_people_page/fingerprint_list.js",
-  "chromeos/os_people_page/lock_screen.js",
-  "chromeos/os_people_page/lock_screen_password_prompt_dialog.js",
-  "chromeos/os_people_page/os_people_page.js",
-  "chromeos/os_people_page/os_sync_controls.js",
-  "chromeos/os_people_page/pin_autosubmit_dialog.js",
-  "chromeos/os_people_page/setup_fingerprint_dialog.js",
-  "chromeos/os_people_page/setup_pin_dialog.js",
-  "chromeos/os_people_page/user_list.js",
-  "chromeos/os_people_page/users_add_user_dialog.js",
-  "chromeos/os_people_page/users_page.js",
-  "chromeos/os_privacy_page/os_privacy_page.js",
-  "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js",
-  "chromeos/os_privacy_page/privacy_hub_page.js",
-  "chromeos/os_privacy_page/smart_privacy_page.js",
-  "chromeos/os_search_page/os_search_page.js",
-  "chromeos/os_search_page/os_search_selection_dialog.js",
-  "chromeos/os_search_page/search_engine.js",
-  "chromeos/os_search_page/search_subpage.js",
-  "chromeos/os_settings_main/os_settings_main.js",
-  "chromeos/os_settings_menu/os_settings_menu.js",
-  "chromeos/os_settings_page/os_settings_page.js",
-  "chromeos/os_settings_page/settings_idle_load.js",
-  "chromeos/os_settings_search_box/os_search_result_row.js",
-  "chromeos/os_settings_search_box/os_settings_search_box.js",
-  "chromeos/os_settings_ui/os_settings_ui.js",
-  "chromeos/os_toolbar/os_toolbar.js",
-  "chromeos/parental_controls_page/parental_controls_page.js",
-  "chromeos/personalization_page/change_picture.js",
-  "chromeos/personalization_page/personalization_page.js",
-  "chromeos/settings_scheduler_slider/settings_scheduler_slider.js",
-]
-
-# TODO(crbug/1315757) JS files here are available for TS conversion
-source_ts_files = [
-  "chromeos/combined_search_handler.js",
-  "chromeos/deep_linking_behavior.js",
-  "chromeos/ensure_lazy_loaded.js",
-  "chromeos/global_scroll_target_behavior.js",
-  "chromeos/lazy_load.js",
-  "chromeos/metrics_recorder.js",
-  "chromeos/os_page_visibility.js",
-  "chromeos/os_route.js",
-  "chromeos/os_settings.js",
-  "chromeos/os_settings_routes.js",
-  "chromeos/personalization_search_handler.js",
-  "chromeos/pref_to_setting_metric_converter.js",
-  "chromeos/prefs_behavior.js",
-  "chromeos/route_observer_behavior.js",
-  "chromeos/route_origin_behavior.js",
-  "chromeos/settings_search_handler.js",
-  "chromeos/ambient_mode_page/ambient_mode_browser_proxy.js",
-  "chromeos/ambient_mode_page/constants.js",
-  "chromeos/bluetooth_page/bluetooth_page_browser_proxy.js",
-  "chromeos/crostini_page/crostini_browser_proxy.js",
-  "chromeos/date_time_page/date_time_types.js",
-  "chromeos/date_time_page/timezone_browser_proxy.js",
-  "chromeos/device_page/cros_audio_config.js",
-  "chromeos/device_page/device_page_browser_proxy.js",
-  "chromeos/device_page/drag_behavior.js",
-  "chromeos/device_page/layout_behavior.js",
-  "chromeos/google_assistant_page/google_assistant_browser_proxy.js",
-  "chromeos/guest_os/guest_os_browser_proxy.js",
-  "chromeos/kerberos_page/kerberos_accounts_browser_proxy.js",
-  "chromeos/nearby_share_page/nearby_account_manager_browser_proxy.js",
-  "chromeos/nearby_share_page/nearby_share_receive_manager.js",
-  "chromeos/nearby_share_page/types.js",
-  "chromeos/os_a11y_page/audio_and_captions_page_browser_proxy.js",
-  "chromeos/os_a11y_page/cursor_and_touchpad_page_browser_proxy.js",
-  "chromeos/os_a11y_page/keyboard_and_text_input_page_browser_proxy.js",
-  "chromeos/os_a11y_page/manage_a11y_page_browser_proxy.js",
-  "chromeos/os_a11y_page/os_a11y_page_browser_proxy.js",
-  "chromeos/os_a11y_page/switch_access_constants.js",
-  "chromeos/os_a11y_page/switch_access_subpage_browser_proxy.js",
-  "chromeos/os_a11y_page/text_to_speech_page_browser_proxy.js",
-  "chromeos/os_a11y_page/tts_subpage_browser_proxy.js",
-  "chromeos/os_about_page/about_page_browser_proxy.js",
-  "chromeos/os_about_page/device_name_browser_proxy.js",
-  "chromeos/os_about_page/device_name_util.js",
-  "chromeos/os_apps_page/android_apps_browser_proxy.js",
-  "chromeos/os_apps_page/app_management_page/actions.js",
-  "chromeos/os_apps_page/app_management_page/api_listener.js",
-  "chromeos/os_apps_page/app_management_page/browser_proxy.js",
-  "chromeos/os_apps_page/app_management_page/fake_page_handler.js",
-  "chromeos/os_apps_page/app_management_page/reducers.js",
-  "chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_browser_proxy.js",
-  "chromeos/os_apps_page/app_management_page/store.js",
-  "chromeos/os_apps_page/app_management_page/store_client.js",
-  "chromeos/os_apps_page/app_management_page/util.js",
-  "chromeos/os_apps_page/app_management_page/types.js",
-  "chromeos/os_apps_page/app_notifications_page/mojo_interface_provider.js",
-  "chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js",
-  "chromeos/os_bluetooth_page/settings_fast_pair_constants.js",
-  "chromeos/os_people_page/account_manager_browser_proxy.js",
-  "chromeos/os_people_page/fingerprint_browser_proxy.js",
-  "chromeos/os_people_page/lock_state_behavior.js",
-  "chromeos/os_people_page/os_sync_browser_proxy.js",
-  "chromeos/os_privacy_page/metrics_consent_browser_proxy.js",
-  "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.js",
-  "chromeos/os_privacy_page/privacy_hub_browser_proxy.js",
-  "chromeos/os_search_page/search_engines_browser_proxy.js",
-  "chromeos/os_settings_page/main_page_behavior.js",
-  "chromeos/parental_controls_page/parental_controls_browser_proxy.js",
-  "chromeos/personalization_page/change_picture_browser_proxy.js",
-  "chromeos/personalization_page/personalization_hub_browser_proxy.js",
-  "chromeos/personalization_page/wallpaper_browser_proxy.js",
-  "router.js",
-]
-
 # TODO(crbug.com/1121865): browser_resolver_prefix_replacements allows path
 # from ../../shared/* to resolve to ../../../nearby_share/shared/* for closure
 # purposes.
diff --git a/chrome/browser/resources/settings/chromeos/tsconfig_base.json b/chrome/browser/resources/settings/chromeos/tsconfig_base.json
deleted file mode 100644
index 3f69ccee..0000000
--- a/chrome/browser/resources/settings/chromeos/tsconfig_base.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "extends": "../../../../../tools/typescript/tsconfig_base.json",
-  "compilerOptions": {
-    "allowJs": true,
-    "noUncheckedIndexedAccess": false,
-    "noUnusedLocals": false,
-    "strictPropertyInitialization": false
-  }
-}
diff --git a/chrome/browser/resources/settings/safety_check_page/OWNERS b/chrome/browser/resources/settings/safety_check_page/OWNERS
index cc11485..77176e9 100644
--- a/chrome/browser/resources/settings/safety_check_page/OWNERS
+++ b/chrome/browser/resources/settings/safety_check_page/OWNERS
@@ -1 +1,2 @@
+rainhard@chromium.org
 sauski@google.com
diff --git a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
index 73f511f..20ef01d2 100644
--- a/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
+++ b/chrome/browser/sync/sessions/sync_sessions_router_tab_helper.cc
@@ -89,9 +89,7 @@
 
 void SyncSessionsRouterTabHelper::OnLanguageDetermined(
     const translate::LanguageDetectionDetails& details) {
-  if (base::FeatureList::IsEnabled(language::kNotifySyncOnLanguageDetermined)) {
-    NotifyRouter();
-  }
+  NotifyRouter();
 }
 
 void SyncSessionsRouterTabHelper::NotifyRouter(bool page_load_completed) {
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 6f24cfc..0ce2e4dc 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1250,143 +1250,143 @@
         <ph name="NUMBER_OF_ITEMS">%1$s<ex>3</ex></ph> items deleted
       </message>
 
-      <!-- Privacy Review -->
-      <message name="IDS_PREFS_PRIVACY_REVIEW_TITLE" desc="The title of the privacy review menu item.">
+      <!-- Privacy Guide -->
+      <message name="IDS_PREFS_PRIVACY_GUIDE_TITLE" desc="The title of the privacy guide menu item.">
         Privacy guide
       </message>
-      <message name="IDS_PREFS_PRIVACY_REVIEW_SUMMARY" desc="The summary of the privacy menu item.">
+      <message name="IDS_PREFS_PRIVACY_GUIDE_SUMMARY" desc="The summary of the privacy menu item.">
         Review key privacy and security controls
       </message>
-      <message name="IDS_PRIVACY_REVIEW_WELCOME_TITLE" desc="Title on the welcome page of the privacy review.">
+      <message name="IDS_PRIVACY_GUIDE_WELCOME_TITLE" desc="Title on the welcome page of the privacy guide.">
         A guide of your privacy choices
       </message>
-      <message name="IDS_PRIVACY_REVIEW_WELCOME_DESCRIPTION" desc="Description on the welcome page of the privacy review.">
+      <message name="IDS_PRIVACY_GUIDE_WELCOME_DESCRIPTION" desc="Description on the welcome page of the privacy guide.">
         Take a guided tour of key privacy and security controls. For more options, go to individual settings.
       </message>
-      <message name="IDS_PRIVACY_REVIEW_START_BUTTON" desc="Text on the privacy review start button on the welcome screen.">
+      <message name="IDS_PRIVACY_GUIDE_START_BUTTON" desc="Text on the privacy guide start button on the welcome screen.">
         Let’s go
       </message>
-      <message name="IDS_PRIVACY_REVIEW_WHEN_ON" desc="Header of a description text that describes the behavior of a particular feature. This description is shown to users alongside the feature itself." meaning="Privacy Guide - feature benefits">
+      <message name="IDS_PRIVACY_GUIDE_WHEN_ON" desc="Header of a description text that describes the behavior of a particular feature. This description is shown to users alongside the feature itself." meaning="Privacy Guide - feature benefits">
         When on
       </message>
-      <message name="IDS_PRIVACY_REVIEW_THINGS_TO_CONSIDER" desc="Header of a text column that describes things users should consider about a feature. This description is shown to users alongside the feature itself." meaning="Privacy Guide - feature considerations">
+      <message name="IDS_PRIVACY_GUIDE_THINGS_TO_CONSIDER" desc="Header of a text column that describes things users should consider about a feature. This description is shown to users alongside the feature itself." meaning="Privacy Guide - feature considerations">
         Things to consider
       </message>
-      <message name="IDS_PRIVACY_REVIEW_MSBB_ITEM_ONE" desc="First bullet point that describes the details of the MSBB toggle.">
+      <message name="IDS_PRIVACY_GUIDE_MSBB_ITEM_ONE" desc="First bullet point that describes the details of the MSBB toggle.">
         You’ll browse faster because content is proactively loaded based on your current webpage visit
       </message>
-      <message name="IDS_PRIVACY_REVIEW_MSBB_ITEM_TWO" desc="Second bullet point that describes the details of the MSBB toggle.">
+      <message name="IDS_PRIVACY_GUIDE_MSBB_ITEM_TWO" desc="Second bullet point that describes the details of the MSBB toggle.">
         You’ll get improved suggestions in the address bar
       </message>
-      <message name="IDS_PRIVACY_REVIEW_MSBB_ITEM_THREE" desc="Third bullet point that describes the details of the MSBB toggle.">
+      <message name="IDS_PRIVACY_GUIDE_MSBB_ITEM_THREE" desc="Third bullet point that describes the details of the MSBB toggle.">
         URLs you visit are sent to Google to predict what sites you might visit next
       </message>
-      <message name="IDS_PRIVACY_REVIEW_MSBB_ITEM_FOUR" desc="Fourth bullet point that describes the details of the MSBB toggle.">
+      <message name="IDS_PRIVACY_GUIDE_MSBB_ITEM_FOUR" desc="Fourth bullet point that describes the details of the MSBB toggle.">
         If you also share Chrome usage reports, those reports include the URLs you visit
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SYNC_TOGGLE" desc="Title for the history sync toggle.">
+      <message name="IDS_PRIVACY_GUIDE_SYNC_TOGGLE" desc="Title for the history sync toggle.">
         History sync
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SYNC_ITEM_ONE" desc="First bullet point that describes the details of the history sync toggle.">
+      <message name="IDS_PRIVACY_GUIDE_SYNC_ITEM_ONE" desc="First bullet point that describes the details of the history sync toggle.">
         You’ll have your history on all your synced devices so you can continue what you were doing
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SYNC_ITEM_TWO" desc="Second bullet point that describes the details of the history sync toggle.">
+      <message name="IDS_PRIVACY_GUIDE_SYNC_ITEM_TWO" desc="Second bullet point that describes the details of the history sync toggle.">
         If Google is also your default search engine, you’ll see better, contextually relevant suggestions
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SYNC_ITEM_THREE" desc="Third bullet point that describes the details of the history sync toggle.">
+      <message name="IDS_PRIVACY_GUIDE_SYNC_ITEM_THREE" desc="Third bullet point that describes the details of the history sync toggle.">
         The URLs you visit are saved to your Google Account
       </message>
-      <message name="IDS_PRIVACY_REVIEW_COOKIES_INTRO" desc="Text introducing the cookies control.">
+      <message name="IDS_PRIVACY_GUIDE_COOKIES_INTRO" desc="Text introducing the cookies control.">
         Choose when to block third-party cookies
       </message>
-      <message name="IDS_PRIVACY_REVIEW_COOKIES_BLOCK_INCOGNITO_TITLE" desc="Title for the radio button for blocking third-party cookies in incognito.">
+      <message name="IDS_PRIVACY_GUIDE_COOKIES_BLOCK_INCOGNITO_TITLE" desc="Title for the radio button for blocking third-party cookies in incognito.">
         Block while using incognito
       </message>
-      <message name="IDS_PRIVACY_REVIEW_COOKIES_BLOCK_INCOGNITO_DESCRIPTION" desc="Description for the radio button for blocking third-party cookies in incognito.">
+      <message name="IDS_PRIVACY_GUIDE_COOKIES_BLOCK_INCOGNITO_DESCRIPTION" desc="Description for the radio button for blocking third-party cookies in incognito.">
         While in incognito, sites can’t use your cookies to see your browsing activity across different sites, for example, to personalize ads. Features on some sites may break.
       </message>
-      <message name="IDS_PRIVACY_REVIEW_COOKIES_BLOCK_ALWAYS_TITLE" desc="Title for the radio button for blocking third-party cookies always.">
+      <message name="IDS_PRIVACY_GUIDE_COOKIES_BLOCK_ALWAYS_TITLE" desc="Title for the radio button for blocking third-party cookies always.">
         Block all the time
       </message>
-      <message name="IDS_PRIVACY_REVIEW_COOKIES_BLOCK_ALWAYS_DESCRIPTION" desc="Description for the radio button for blocking third-party cookies always.">
+      <message name="IDS_PRIVACY_GUIDE_COOKIES_BLOCK_ALWAYS_DESCRIPTION" desc="Description for the radio button for blocking third-party cookies always.">
         Sites can only use your cookies to see your browsing activity only on their own site
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SAFE_BROWSING_INTRO" desc="Text introducing the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SAFE_BROWSING_INTRO" desc="Text introducing the Safe Browsing control.">
         Choose your Safe Browsing protection
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SAFE_BROWSING_ENHANCED_TITLE" desc="Title for the radio button for the enhanced Safe Browsing.">
+      <message name="IDS_PRIVACY_GUIDE_SAFE_BROWSING_ENHANCED_TITLE" desc="Title for the radio button for the enhanced Safe Browsing.">
         Enhanced protection
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SAFE_BROWSING_ENHANCED_DESCRIPTION" desc="Description for the radio button for the enhanced Safe Browsing.">
+      <message name="IDS_PRIVACY_GUIDE_SAFE_BROWSING_ENHANCED_DESCRIPTION" desc="Description for the radio button for the enhanced Safe Browsing.">
         Faster, proactive protection against dangerous websites, downloads, and extensions
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_TITLE" desc="Title for the radio button for the standard Safe Browsing.">
+      <message name="IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_TITLE" desc="Title for the radio button for the standard Safe Browsing.">
         Standard protection
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_DESCRIPTION" desc="Description for the radio button for the standard Safe Browsing.">
+      <message name="IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_DESCRIPTION" desc="Description for the radio button for the standard Safe Browsing.">
         Standard protection against websites, downloads, and extensions that are known to be dangerous
       </message>
-      <message name="IDS_PRIVACY_REVIEW_FINISH_BUTTON" desc="Text on the button to finish the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_FINISH_BUTTON" desc="Text on the button to finish the privacy guide">
         Finish
       </message>
-      <message name="IDS_PRIVACY_REVIEW_DONE_TITLE" desc="Title on the final page of the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_DONE_TITLE" desc="Title on the final page of the privacy guide">
         Review complete!
       </message>
-      <message name="IDS_PRIVACY_REVIEW_DONE_DESCRIPTION" desc="Subtitle on the final page of the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_DONE_DESCRIPTION" desc="Subtitle on the final page of the privacy guide">
         Explore more settings below or finish now
       </message>
-      <message name="IDS_PRIVACY_REVIEW_PRIVACY_SANDBOX_HEADING" desc="Title for the Privacy Sandbox item on the final page of the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_HEADING" desc="Title for the Privacy Sandbox item on the final page of the privacy guide">
         Privacy Sandbox trial
       </message>
-      <message name="IDS_PRIVACY_REVIEW_PRIVACY_SANDBOX_DESCRIPTION" desc="Description for the Privacy Sandbox item on the final page of the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_DESCRIPTION" desc="Description for the Privacy Sandbox item on the final page of the privacy guide">
         See how Chrome plans to safeguard you from cross-site tracking while preserving the open web
       </message>
-      <message name="IDS_PRIVACY_REVIEW_WEB_APP_ACTIVITY_HEADING" desc="Title for the Web and App Activity item on the final page of the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_HEADING" desc="Title for the Web and App Activity item on the final page of the privacy guide">
         Web &amp; App Activity
       </message>
-      <message name="IDS_PRIVACY_REVIEW_WEB_APP_ACTIVITY_DESCRIPTION" desc="Description for the Web and App Activity item on the final page of the privacy review">
+      <message name="IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_DESCRIPTION" desc="Description for the Web and App Activity item on the final page of the privacy guide">
         Choose whether to include Chrome history for more personalized experiences in Google services
       </message>
-      <message name="IDS_PRIVACY_REVIEW_EXPLANATION_CONTENT_DESCRIPTION" desc="The content description for the privacy review explanation bottom sheet. Read as accessibility string when tapping on the bottom sheet.">
+      <message name="IDS_PRIVACY_GUIDE_EXPLANATION_CONTENT_DESCRIPTION" desc="The content description for the privacy guide explanation bottom sheet. Read as accessibility string when tapping on the bottom sheet.">
         Privacy guide explanation
       </message>
-      <message name="IDS_PRIVACY_REVIEW_EXPLANATION_OPENED_HALF" desc="The accessibility string read when the privacy review explanation bottom sheet is half opened.">
+      <message name="IDS_PRIVACY_GUIDE_EXPLANATION_OPENED_HALF" desc="The accessibility string read when the privacy guide explanation bottom sheet is half opened.">
         Privacy guide explanation opened at half height
       </message>
-      <message name="IDS_PRIVACY_REVIEW_EXPLANATION_OPENED_FULL" desc="The accessibility string read when the privacy review explanation bottom sheet is fully opened.">
+      <message name="IDS_PRIVACY_GUIDE_EXPLANATION_OPENED_FULL" desc="The accessibility string read when the privacy guide explanation bottom sheet is fully opened.">
         Privacy guide explanation opened at full height
       </message>
-      <message name="IDS_PRIVACY_REVIEW_EXPLANATION_CLOSED_DESCRIPTION" desc="The accessibility string read when the privacy review explanation bottom sheet is closed.">
+      <message name="IDS_PRIVACY_GUIDE_EXPLANATION_CLOSED_DESCRIPTION" desc="The accessibility string read when the privacy guide explanation bottom sheet is closed.">
         Privacy guide explanation closed
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_ONE" desc="First bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_ONE" desc="First bullet point that describes the details of the Safe Browsing control.">
         Detects and warns you about dangerous events when they happen
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_TWO" desc="Second bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_TWO" desc="Second bullet point that describes the details of the Safe Browsing control.">
         Checks URLs with a list of unsafe sites stored in Chrome
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_THREE" desc="Third bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_THREE" desc="Third bullet point that describes the details of the Safe Browsing control.">
         If a site tries to steal your password, or when you download a harmful file, Chrome may send URLs including bits of page content to Safe Browsing
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_ONE" desc="First bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_ONE" desc="First bullet point that describes the details of the Safe Browsing control.">
         Predicts and warns you about dangerous events before they happen
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_TWO" desc="Second bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_TWO" desc="Second bullet point that describes the details of the Safe Browsing control.">
         Keeps you safe on Chrome and may be used to improve your security in other Google apps when you are signed in
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_THREE" desc="Third bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_THREE" desc="Third bullet point that describes the details of the Safe Browsing control.">
         Improves security for you and everyone on the web
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_FOUR" desc="Fourth bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_FOUR" desc="Fourth bullet point that describes the details of the Safe Browsing control.">
         Warns you if passwords are exposed in a data breach
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_FIVE" desc="Fifth bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_FIVE" desc="Fifth bullet point that describes the details of the Safe Browsing control.">
         Sends URLs to Safe Browsing to check them
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SIX" desc="Sixth bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_SIX" desc="Sixth bullet point that describes the details of the Safe Browsing control.">
         Also sends a small sample of pages, downloads, extension activity, and system information to help discover new threats
       </message>
-      <message name="IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SEVEN" desc="Seventh bullet point that describes the details of the Safe Browsing control.">
+      <message name="IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_SEVEN" desc="Seventh bullet point that describes the details of the Safe Browsing control.">
         Temporarily links this data to your Google Account when you’re signed in, to protect you across Google apps
       </message>
 
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_REVIEW_SUMMARY.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_GUIDE_SUMMARY.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_REVIEW_SUMMARY.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_GUIDE_SUMMARY.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_REVIEW_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_GUIDE_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_REVIEW_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PREFS_PRIVACY_GUIDE_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_ALWAYS_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_ALWAYS_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_ALWAYS_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_ALWAYS_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_ALWAYS_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_ALWAYS_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_ALWAYS_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_ALWAYS_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_INCOGNITO_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_INCOGNITO_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_INCOGNITO_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_INCOGNITO_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_INCOGNITO_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_INCOGNITO_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_BLOCK_INCOGNITO_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_BLOCK_INCOGNITO_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_INTRO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_INTRO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_COOKIES_INTRO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_COOKIES_INTRO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_DONE_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_DONE_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_DONE_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_DONE_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_DONE_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_DONE_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_DONE_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_DONE_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_CLOSED_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_CLOSED_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_CLOSED_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_CLOSED_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_CONTENT_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_CONTENT_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_CONTENT_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_CONTENT_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_OPENED_FULL.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_OPENED_FULL.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_OPENED_FULL.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_OPENED_FULL.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_OPENED_HALF.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_OPENED_HALF.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_EXPLANATION_OPENED_HALF.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_EXPLANATION_OPENED_HALF.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_FINISH_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_FINISH_BUTTON.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_FINISH_BUTTON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_FINISH_BUTTON.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_FOUR.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_FOUR.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_FOUR.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_FOUR.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_ONE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_ONE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_ONE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_ONE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_THREE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_THREE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_THREE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_THREE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_TWO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_TWO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_MSBB_ITEM_TWO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_MSBB_ITEM_TWO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_PRIVACY_SANDBOX_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_PRIVACY_SANDBOX_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_PRIVACY_SANDBOX_HEADING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_HEADING.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_PRIVACY_SANDBOX_HEADING.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_PRIVACY_SANDBOX_HEADING.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_ENHANCED_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_ENHANCED_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_ENHANCED_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_ENHANCED_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_ENHANCED_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_ENHANCED_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_ENHANCED_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_ENHANCED_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_INTRO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_INTRO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_INTRO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_INTRO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_INTRO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_INTRO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_INTRO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_INTRO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SAFE_BROWSING_STANDARD_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SAFE_BROWSING_STANDARD_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_FIVE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_FIVE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_FIVE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_FIVE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_FOUR.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_FOUR.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_FOUR.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_FOUR.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_ONE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_ONE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_ONE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_ONE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SEVEN.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_SEVEN.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SEVEN.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_SEVEN.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SIX.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_SIX.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_SIX.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_SIX.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_THREE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_THREE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_THREE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_THREE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_TWO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_TWO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_ENHANCED_ITEM_TWO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_ENHANCED_ITEM_TWO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_ONE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_ONE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_ONE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_ONE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_THREE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_THREE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_THREE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_THREE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_TWO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_TWO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SB_STANDARD_ITEM_TWO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SB_STANDARD_ITEM_TWO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_START_BUTTON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_START_BUTTON.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_START_BUTTON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_START_BUTTON.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_ITEM_ONE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_ITEM_ONE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_ITEM_ONE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_ITEM_ONE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_ITEM_THREE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_ITEM_THREE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_ITEM_THREE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_ITEM_THREE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_ITEM_TWO.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_ITEM_TWO.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_ITEM_TWO.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_ITEM_TWO.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_TOGGLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_TOGGLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_SYNC_TOGGLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_SYNC_TOGGLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_THINGS_TO_CONSIDER.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_THINGS_TO_CONSIDER.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_THINGS_TO_CONSIDER.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_THINGS_TO_CONSIDER.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WEB_APP_ACTIVITY_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WEB_APP_ACTIVITY_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WEB_APP_ACTIVITY_HEADING.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_HEADING.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WEB_APP_ACTIVITY_HEADING.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WEB_APP_ACTIVITY_HEADING.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WELCOME_DESCRIPTION.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WELCOME_DESCRIPTION.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WELCOME_DESCRIPTION.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WELCOME_DESCRIPTION.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WELCOME_TITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WELCOME_TITLE.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WELCOME_TITLE.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WELCOME_TITLE.png.sha1
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WHEN_ON.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WHEN_ON.png.sha1
similarity index 100%
rename from chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_REVIEW_WHEN_ON.png.sha1
rename to chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_PRIVACY_GUIDE_WHEN_ON.png.sha1
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
index 986aa1d..cc547c5 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
@@ -135,9 +135,9 @@
   }
 
   bool Get(const std::string& app_id) {
-    const base::Value* dict =
-        prefs_->GetDictionary(arc::prefs::kArcSetNotificationsEnabledDeferred);
-    return dict->GetDict().FindBool(app_id).value_or(false);
+    const base::Value::Dict& dict =
+        prefs_->GetValueDict(arc::prefs::kArcSetNotificationsEnabledDeferred);
+    return dict.FindBool(app_id).value_or(false);
   }
 
   void Remove(const std::string& app_id) {
@@ -422,11 +422,9 @@
 
 std::string ArcAppListPrefs::GetAppIdByPackageName(
     const std::string& package_name) const {
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  if (!apps)
-    return std::string();
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
 
-  for (const auto it : apps->DictItems()) {
+  for (const auto it : apps) {
     const base::Value& value = it.second;
     const std::string* installed_package_name =
         value.GetDict().FindString(kPackageName);
@@ -734,11 +732,10 @@
   if (!IsArcAlive() || !IsArcAndroidEnabledForProfile(profile_))
     return nullptr;
 
-  const base::Value* packages = prefs_->GetDictionary(arc::prefs::kArcPackages);
-  if (!packages)
-    return nullptr;
+  const base::Value::Dict& packages =
+      prefs_->GetValueDict(arc::prefs::kArcPackages);
 
-  const base::Value::Dict* package = packages->GetDict().FindDict(package_name);
+  const base::Value::Dict* package = packages.FindDict(package_name);
   if (!package)
     return nullptr;
 
@@ -838,11 +835,10 @@
 
 std::vector<std::string> ArcAppListPrefs::GetAppIdsNoArcEnabledCheck() const {
   std::vector<std::string> ids;
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  DCHECK(apps);
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
 
   // crx_file::id_util is de-facto utility for id generation.
-  for (const auto app : apps->DictItems()) {
+  for (const auto app : apps) {
     if (!crx_file::id_util::IdIsValid(app.first))
       continue;
 
@@ -865,10 +861,8 @@
 
 std::unique_ptr<ArcAppListPrefs::AppInfo> ArcAppListPrefs::GetAppFromPrefs(
     const std::string& app_id) const {
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  if (!apps)
-    return nullptr;
-  const base::Value::Dict* app_dict = apps->GetDict().FindDict(app_id);
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
+  const base::Value::Dict* app_dict = apps.FindDict(app_id);
   if (!app_dict)
     return nullptr;
 
@@ -952,8 +946,8 @@
       !default_apps_->HasApp(app_id))
     return false;
 
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  return apps && apps->FindDictKey(app_id);
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
+  return apps.FindDict(app_id);
 }
 
 bool ArcAppListPrefs::IsDefault(const std::string& app_id) const {
@@ -1915,8 +1909,8 @@
 void ArcAppListPrefs::OnUninstallShortcut(const std::string& package_name,
                                           const std::string& intent_uri) {
   std::vector<std::string> shortcuts_to_remove;
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  for (const auto app : apps->DictItems()) {
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
+  for (const auto app : apps) {
     if (!app.second.is_dict()) {
       VLOG(2) << "Failed to extract information for " << app.first << ".";
       continue;
@@ -1956,8 +1950,8 @@
     bool include_only_launchable_apps,
     bool include_shortcuts) const {
   std::unordered_set<std::string> app_set;
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  for (const auto app : apps->DictItems()) {
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
+  for (const auto app : apps) {
     if (!crx_file::id_util::IdIsValid(app.first))
       continue;
 
@@ -2101,8 +2095,8 @@
 void ArcAppListPrefs::OnNotificationsEnabledChanged(
     const std::string& package_name,
     bool enabled) {
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  for (const auto app : apps->DictItems()) {
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
+  for (const auto app : apps) {
     if (!app.second.is_dict()) {
       NOTREACHED();
       continue;
@@ -2201,9 +2195,9 @@
     return packages;
   }
 
-  const base::Value* package_prefs =
-      prefs_->GetDictionary(arc::prefs::kArcPackages);
-  for (const auto package : package_prefs->DictItems()) {
+  const base::Value::Dict& package_prefs =
+      prefs_->GetValueDict(arc::prefs::kArcPackages);
+  for (const auto package : package_prefs) {
     if (!package.second.is_dict()) {
       NOTREACHED();
       continue;
@@ -2221,15 +2215,13 @@
 }
 
 base::Time ArcAppListPrefs::GetInstallTime(const std::string& app_id) const {
-  const base::Value* apps = prefs_->GetDictionary(arc::prefs::kArcApps);
-  if (!apps)
-    return base::Time();
+  const base::Value::Dict& apps = prefs_->GetValueDict(arc::prefs::kArcApps);
 
-  const base::Value* app = apps->FindDictKey(app_id);
+  const base::Value::Dict* app = apps.FindDict(app_id);
   if (!app)
     return base::Time();
 
-  const std::string* install_time_str = app->GetDict().FindString(kInstallTime);
+  const std::string* install_time_str = app->FindString(kInstallTime);
   if (!install_time_str)
     return base::Time();
 
diff --git a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
index 9595d8a..b9ffecc 100644
--- a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
+++ b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
@@ -117,14 +117,12 @@
 
 // Returns true if default app |app_id| is marked as hidden in the prefs.
 bool IsAppHidden(const PrefService* prefs, const std::string& app_id) {
-  const base::Value* apps_dict = prefs->GetDictionary(kDefaultApps);
-  if (!apps_dict)
-    return false;
+  const base::Value::Dict& apps_dict = prefs->GetValueDict(kDefaultApps);
 
-  const base::Value* app_dict = apps_dict->FindDictKey(app_id);
+  const base::Value::Dict* app_dict = apps_dict.FindDict(app_id);
   if (!app_dict)
     return false;
-  return app_dict->FindBoolPath(kHidden).value_or(false);
+  return app_dict->FindBool(kHidden).value_or(false);
 }
 
 std::string GetBoardName(const base::FilePath& build_prop_path) {
diff --git a/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc b/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
index 90f78a25..4a118cc 100644
--- a/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/assistant_text_search_provider.cc
@@ -27,7 +27,7 @@
 
 namespace {
 
-using chromeos::assistant::AssistantAllowedState;
+using ::ash::assistant::AssistantAllowedState;
 
 constexpr char kIdPrefix[] = "googleassistant_text://";
 
@@ -113,7 +113,7 @@
 }
 
 void AssistantTextSearchProvider::OnAssistantFeatureAllowedChanged(
-    chromeos::assistant::AssistantAllowedState allowed_state) {
+    AssistantAllowedState allowed_state) {
   UpdateResults();
 }
 
diff --git a/chrome/browser/ui/app_list/search/assistant_text_search_provider.h b/chrome/browser/ui/app_list/search/assistant_text_search_provider.h
index f5a0033..cfb3ff90 100644
--- a/chrome/browser/ui/app_list/search/assistant_text_search_provider.h
+++ b/chrome/browser/ui/app_list/search/assistant_text_search_provider.h
@@ -40,7 +40,7 @@
 
   // ash::AssistantStateObserver:
   void OnAssistantFeatureAllowedChanged(
-      chromeos::assistant::AssistantAllowedState allowed_state) override;
+      ash::assistant::AssistantAllowedState allowed_state) override;
   void OnAssistantSettingsEnabled(bool enabled) override;
 
   // Invoke to update results based on current state.
diff --git a/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc b/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc
index 441523a..e9c81da 100644
--- a/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/assistant_text_search_provider_unittest.cc
@@ -21,7 +21,7 @@
 namespace app_list {
 namespace {
 
-using chromeos::assistant::AssistantAllowedState;
+using ::ash::assistant::AssistantAllowedState;
 
 // Parameterized by feature ProductivityLauncher.
 class AssistantTextSearchProviderTest
diff --git a/chrome/browser/ui/app_list/search/files/file_result.cc b/chrome/browser/ui/app_list/search/files/file_result.cc
index bda617d..fb8eee9 100644
--- a/chrome/browser/ui/app_list/search/files/file_result.cc
+++ b/chrome/browser/ui/app_list/search/files/file_result.cc
@@ -22,7 +22,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/ui/app_list/search/common/icon_constants.h"
-#include "chrome/browser/ui/app_list/search/files/justifications.h"
 #include "chrome/browser/ui/app_list/search/search_tags_util.h"
 #include "chrome/browser/ui/ash/thumbnail_loader.h"
 #include "chromeos/ash/components/string_matching/tokenized_string.h"
@@ -250,12 +249,6 @@
                                        ash::SearchResultIconShape::kCircle));
 }
 
-void FileResult::SetDetailsToJustificationString() {
-  GetJustificationStringAsync(
-      filepath_, base::BindOnce(&FileResult::OnJustificationStringReturned,
-                                weak_factory_.GetWeakPtr()));
-}
-
 void FileResult::UpdateIcon() {
   // Launcher search results UI is light by default, so use icons for light
   // background if dark/light mode feature is not enabled. Productivity launcher
@@ -297,12 +290,6 @@
   }
 }
 
-void FileResult::OnJustificationStringReturned(
-    absl::optional<std::u16string> justification) {
-  if (justification)
-    SetDetails(justification.value());
-}
-
 ::std::ostream& operator<<(::std::ostream& os, const FileResult& result) {
   return os << "{" << result.title() << ", " << result.relevance() << "}";
 }
diff --git a/chrome/browser/ui/app_list/search/files/file_result.h b/chrome/browser/ui/app_list/search/files/file_result.h
index c07b6f3..56324eb 100644
--- a/chrome/browser/ui/app_list/search/files/file_result.h
+++ b/chrome/browser/ui/app_list/search/files/file_result.h
@@ -61,10 +61,6 @@
   // the thumbnail.
   void RequestThumbnail(ash::ThumbnailLoader* thumbnail_loader);
 
-  // Asynchronously sets the details string for this result to a Drive-esque
-  // justification string, eg. "You opened yesterday".
-  void SetDetailsToJustificationString();
-
   void set_drive_id(const absl::optional<std::string>& drive_id) {
     drive_id_ = drive_id;
   }
@@ -76,11 +72,6 @@
   // Callback for the result of RequestThumbnail's call to the ThumbnailLoader.
   void OnThumbnailLoaded(const SkBitmap* bitmap, base::File::Error error);
 
-  // Callback for the result of SetDetailsToJustificationString to
-  // GetJustificationStringAsync.
-  void OnJustificationStringReturned(
-      absl::optional<std::u16string> justification);
-
   void UpdateIcon();
 
   const base::FilePath filepath_;
diff --git a/chrome/browser/ui/app_list/search/files/justifications.cc b/chrome/browser/ui/app_list/search/files/justifications.cc
index 1c5d95b..f254f0d3 100644
--- a/chrome/browser/ui/app_list/search/files/justifications.cc
+++ b/chrome/browser/ui/app_list/search/files/justifications.cc
@@ -7,9 +7,6 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
-#include "base/task/task_traits.h"
-#include "base/task/thread_pool.h"
-#include "base/threading/scoped_blocking_call.h"
 #include "base/time/time.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -60,31 +57,14 @@
 
 }  // namespace
 
-void GetJustificationStringAsync(
-    const base::FilePath& path,
-    base::OnceCallback<void(absl::optional<std::u16string>)> callback) {
-  base::ThreadPool::PostTaskAndReplyWithResult(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
-      base::BindOnce(&GetJustificationString, path), std::move(callback));
-}
-
 absl::optional<std::u16string> GetJustificationString(
-    const base::FilePath& path) {
-  base::File::Info info;
-
-  {
-    base::ScopedBlockingCall scoped_blocking_call(
-        FROM_HERE, base::BlockingType::MAY_BLOCK);
-    if (!base::GetFileInfo(path, &info)) {
-      return absl::nullopt;
-    }
-  }
-
+    const base::Time& last_accessed,
+    const base::Time& last_modified) {
   // t1 > t2 means t1 is more recent. When there's a tie, choose modified.
-  if (info.last_modified >= info.last_accessed) {
-    return GetEditStringFromTime(info.last_modified);
+  if (last_modified >= last_accessed) {
+    return GetEditStringFromTime(last_modified);
   } else {
-    return GetOpenStringFromTime(info.last_accessed);
+    return GetOpenStringFromTime(last_accessed);
   }
 }
 
diff --git a/chrome/browser/ui/app_list/search/files/justifications.h b/chrome/browser/ui/app_list/search/files/justifications.h
index 0338d221..465763e 100644
--- a/chrome/browser/ui/app_list/search/files/justifications.h
+++ b/chrome/browser/ui/app_list/search/files/justifications.h
@@ -7,27 +7,18 @@
 
 #include <string>
 
-#include "base/callback.h"
-#include "base/files/file_path.h"
+#include "base/time/time.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace app_list {
 
-// Asynchronous wrapper for the function below, which does the filesystem IO at
-// USER_BLOCKING priority.
-void GetJustificationStringAsync(
-    const base::FilePath& path,
-    base::OnceCallback<void(absl::optional<std::u16string>)> callback);
-
-// Synchronously returns an appropriate justification string for displaying
-// |path| as a file suggestion, for example "Opened yesterday".
-//
-// This uses the most recent of the edited and opened times, and returns a
-// different message for times within the last few minutes, day, two days, week,
-// and month. If there is an error stating |path| or the time is longer than a
+// Returns an appropriate justification string for the given times, for example
+// "Opened yesterday". There are different messages for times within the last
+// few minutes, day, two days, week, and month. If the time is longer than a
 // month ago, nullopt is returned.
 absl::optional<std::u16string> GetJustificationString(
-    const base::FilePath& path);
+    const base::Time& last_accessed,
+    const base::Time& last_modified);
 
 }  // namespace app_list
 
diff --git a/chrome/browser/ui/app_list/search/files/justifications_unittest.cc b/chrome/browser/ui/app_list/search/files/justifications_unittest.cc
index c677f3b..d2e3a23 100644
--- a/chrome/browser/ui/app_list/search/files/justifications_unittest.cc
+++ b/chrome/browser/ui/app_list/search/files/justifications_unittest.cc
@@ -5,105 +5,88 @@
 #include "chrome/browser/ui/app_list/search/files/justifications.h"
 
 #include "ash/strings/grit/ash_strings.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
+#include "base/time/time.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace app_list {
 
-class JustificationsTest : public testing::Test {
- protected:
-  JustificationsTest() = default;
-  ~JustificationsTest() override = default;
+TEST(JustificationsTest, OpenedOrEdited) {
+  base::Time now = base::Time::Now();
 
-  void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
-
-  // Returns a file path with its last_accessed set to |now - accessed_ago|, and
-  // modified set to |now - modified_ago|.
-  base::FilePath TouchFile(base::TimeDelta accessed_ago,
-                           base::TimeDelta modified_ago) {
-    auto now = base::Time::Now();
-    base::FilePath path(temp_dir_.GetPath().Append("somefile"));
-    base::WriteFile(path, "content");
-    base::TouchFile(path, now - accessed_ago, now - modified_ago);
-    return path;
-  }
-
-  base::FilePath TouchFile(base::TimeDelta time) {
-    return TouchFile(time, time);
-  }
-
-  std::u16string Localized(int id) { return l10n_util::GetStringUTF16(id); }
-
-  base::ScopedTempDir temp_dir_;
-};
-
-TEST_F(JustificationsTest, OpenedOrEdited) {
   // Opened more recently than edited.
   EXPECT_EQ(
-      GetJustificationString(TouchFile(base::Seconds(10), base::Seconds(30))),
-      Localized(IDS_APP_LIST_CONTINUE_OPENED_JUST_NOW));
+      GetJustificationString(now - base::Seconds(10), now - base::Seconds(30)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_OPENED_JUST_NOW));
 
   // Edited more recently than opened.
   EXPECT_EQ(
-      GetJustificationString(TouchFile(base::Seconds(30), base::Seconds(10))),
-      Localized(IDS_APP_LIST_CONTINUE_EDITED_JUST_NOW));
+      GetJustificationString(now - base::Seconds(30), now - base::Seconds(10)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_JUST_NOW));
 
   // When tied, should be edited.
   EXPECT_EQ(
-      GetJustificationString(TouchFile(base::Seconds(30), base::Seconds(30))),
-      Localized(IDS_APP_LIST_CONTINUE_EDITED_JUST_NOW));
+      GetJustificationString(now - base::Seconds(30), now - base::Seconds(30)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_JUST_NOW));
 }
 
-TEST_F(JustificationsTest, EditTimes) {
-  // Just now.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Minutes(5))),
-            Localized(IDS_APP_LIST_CONTINUE_EDITED_JUST_NOW));
+TEST(JustificationsTest, EditTimes) {
+  base::Time now = base::Time::Now();
 
-  // Today.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Hours(23))),
-            Localized(IDS_APP_LIST_CONTINUE_EDITED_TODAY));
-
-  // Yesterday.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Hours(47))),
-            Localized(IDS_APP_LIST_CONTINUE_EDITED_YESTERDAY));
-
-  // Past week.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Days(6))),
-            Localized(IDS_APP_LIST_CONTINUE_EDITED_PAST_WEEK));
-
-  // Past month.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Days(30))),
-            Localized(IDS_APP_LIST_CONTINUE_EDITED_PAST_MONTH));
-
-  // No string, file too old.
-  EXPECT_FALSE(GetJustificationString(TouchFile(base::Days(32))));
-}
-
-TEST_F(JustificationsTest, OpenTimes) {
   // Just now.
   EXPECT_EQ(
-      GetJustificationString(TouchFile(base::Minutes(5), base::Days(100))),
-      Localized(IDS_APP_LIST_CONTINUE_OPENED_JUST_NOW));
+      GetJustificationString(now - base::Minutes(5), now - base::Minutes(5)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_JUST_NOW));
 
   // Today.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Hours(23), base::Days(100))),
-            Localized(IDS_APP_LIST_CONTINUE_OPENED_TODAY));
+  EXPECT_EQ(
+      GetJustificationString(now - base::Hours(23), now - base::Hours(23)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_TODAY));
 
   // Yesterday.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Hours(47), base::Days(100))),
-            Localized(IDS_APP_LIST_CONTINUE_OPENED_YESTERDAY));
+  EXPECT_EQ(
+      GetJustificationString(now - base::Hours(47), now - base::Hours(47)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_YESTERDAY));
 
   // Past week.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Days(6), base::Days(100))),
-            Localized(IDS_APP_LIST_CONTINUE_OPENED_PAST_WEEK));
+  EXPECT_EQ(GetJustificationString(now - base::Days(6), now - base::Days(6)),
+            l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_PAST_WEEK));
 
   // Past month.
-  EXPECT_EQ(GetJustificationString(TouchFile(base::Days(30), base::Days(100))),
-            Localized(IDS_APP_LIST_CONTINUE_OPENED_PAST_MONTH));
+  EXPECT_EQ(GetJustificationString(now - base::Days(30), now - base::Days(30)),
+            l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_EDITED_PAST_MONTH));
+
+  // No string, file too old.
+  EXPECT_FALSE(
+      GetJustificationString(now - base::Days(32), now - base::Days(32)));
+}
+
+TEST(JustificationsTest, OpenTimes) {
+  base::Time now = base::Time::Now();
+
+  // Just now.
+  EXPECT_EQ(
+      GetJustificationString(now - base::Minutes(5), now - base::Days(100)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_OPENED_JUST_NOW));
+
+  // Today.
+  EXPECT_EQ(
+      GetJustificationString(now - base::Hours(23), now - base::Days(100)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_OPENED_TODAY));
+
+  // Yesterday.
+  EXPECT_EQ(
+      GetJustificationString(now - base::Hours(47), now - base::Days(100)),
+      l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_OPENED_YESTERDAY));
+
+  // Past week.
+  EXPECT_EQ(GetJustificationString(now - base::Days(6), now - base::Days(100)),
+            l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_OPENED_PAST_WEEK));
+
+  // Past month.
+  EXPECT_EQ(GetJustificationString(now - base::Days(30), now - base::Days(100)),
+            l10n_util::GetStringUTF16(IDS_APP_LIST_CONTINUE_OPENED_PAST_MONTH));
 }
 
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc
index 2bbb6d4..c431195 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.cc
@@ -161,8 +161,7 @@
       max_last_modified_time_(base::Days(base::GetFieldTrialParamByFeatureAsInt(
           ash::features::kProductivityLauncher,
           "max_last_modified_time",
-          8))),
-      enabled_(ash::features::IsProductivityLauncherEnabled()) {
+          8))) {
   DCHECK(profile_);
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
@@ -197,7 +196,7 @@
       ash::features::kProductivityLauncher,
       "itemsuggest_query_on_filesystem_mounted", true);
 
-  if (kUpdateCache && enabled_) {
+  if (kUpdateCache) {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
         base::BindOnce(&ZeroStateDriveProvider::MaybeUpdateCache,
@@ -263,9 +262,6 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   ClearResultsSilently();
 
-  if (!enabled_)
-    return;
-
   // Exit if drive fs isn't mounted, as we launch results via drive fs.
   if (!drive_service_ || !drive_service_->IsMounted()) {
     LogStatus(Status::kDriveFSNotMounted);
@@ -398,9 +394,6 @@
 }
 
 void ZeroStateDriveProvider::MaybeUpdateCache() {
-  if (!enabled_)
-    return;
-
   if (base::Time::Now() - kFirstUpdateDelay > construction_time_) {
     item_suggest_cache_.UpdateCache();
   }
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h
index 1bdbe8c..3b7a026 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h
+++ b/chrome/browser/ui/app_list/search/files/zero_state_drive_provider.h
@@ -136,10 +136,6 @@
   // valid.
   const base::TimeDelta max_last_modified_time_;
 
-  // Whether or not zero-state drive files are enabled. True iff the
-  // productivity launcher is enabled.
-  const bool enabled_;
-
   base::ScopedObservation<drive::DriveIntegrationService,
                           drive::DriveIntegrationServiceObserver>
       drive_observation_{this};
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
index 93288ea0..c640f45 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.cc
@@ -38,23 +38,21 @@
 namespace {
 
 constexpr char kSchema[] = "zero_state_file://";
-
-constexpr base::TimeDelta kSaveDelay = base::Seconds(3);
-
 constexpr size_t kMaxLocalFiles = 10u;
+constexpr base::TimeDelta kSaveDelay = base::Seconds(3);
 
 // Given the output of MrfuCache::GetAll, partition files into:
 // - valid files that exist on-disk and have been modified in the last
 //   |max_last_modified_time| days
 // - invalid files, otherwise.
-internal::ValidAndInvalidResults ValidateFiles(
+ZeroStateFileProvider::ValidAndInvalidResults ValidateFiles(
     const std::vector<std::pair<std::string, float>>& ranker_results,
     const base::TimeDelta& max_last_modified_time) {
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::MAY_BLOCK);
 
-  internal::ScoredResults valid;
-  internal::Results invalid;
+  std::vector<ZeroStateFileProvider::FileInfo> valid_results;
+  std::vector<base::FilePath> invalid_results;
   const base::Time now = base::Time::Now();
   for (const auto& path_score : ranker_results) {
     // We use FilePath::FromUTF8Unsafe to decode the filepath string. As per its
@@ -66,12 +64,13 @@
     base::File::Info info;
     if (base::PathExists(path) && base::GetFileInfo(path, &info) &&
         (now - info.last_modified <= max_last_modified_time)) {
-      valid.emplace_back(path, path_score.second);
+      valid_results.emplace_back(path, path_score.second, info.last_accessed,
+                                 info.last_modified);
     } else {
-      invalid.emplace_back(path);
+      invalid_results.emplace_back(path);
     }
   }
-  return {valid, invalid};
+  return {valid_results, invalid_results};
 }
 
 // TODO(crbug.com/1258415): This exists to reroute results depending on which
@@ -88,6 +87,17 @@
 
 }  // namespace
 
+ZeroStateFileProvider::FileInfo::FileInfo(const base::FilePath& path,
+                                          float score,
+                                          const base::Time& last_accessed,
+                                          const base::Time& last_modified)
+    : path(path),
+      score(score),
+      last_accessed(last_accessed),
+      last_modified(last_modified) {}
+
+ZeroStateFileProvider::FileInfo::~FileInfo() = default;
+
 ZeroStateFileProvider::ZeroStateFileProvider(Profile* profile)
     : profile_(profile),
       thumbnail_loader_(profile),
@@ -161,8 +171,7 @@
                      weak_factory_.GetWeakPtr()));
 }
 
-void ZeroStateFileProvider::SetSearchResults(
-    internal::ValidAndInvalidResults results) {
+void ZeroStateFileProvider::SetSearchResults(ValidAndInvalidResults results) {
   // Delete invalid results from the ranker.
   for (const base::FilePath& path : results.second)
     files_ranker_->Delete(path.value());
@@ -170,18 +179,19 @@
   // Sort valid results high-to-low by score.
   auto& valid_results = results.first;
   std::sort(valid_results.begin(), valid_results.end(),
-            [](const auto& a, const auto& b) { return a.second > b.second; });
+            [](const auto& a, const auto& b) { return a.score > b.score; });
 
   // Use valid results for search results.
   SearchProvider::Results new_results;
   for (size_t i = 0; i < std::min(valid_results.size(), kMaxLocalFiles); ++i) {
-    const auto& filepath = valid_results[i].first;
-    double score = valid_results[i].second;
+    const auto& filepath = valid_results[i].path;
+    const double score = valid_results[i].score;
+    const absl::optional<std::u16string> details = GetJustificationString(
+        valid_results[i].last_accessed, valid_results[i].last_modified);
     auto result = std::make_unique<FileResult>(
-        kSchema, filepath, absl::nullopt,
+        kSchema, filepath, details,
         ash::AppListSearchResultType::kZeroStateFile, GetDisplayType(), score,
         std::u16string(), FileResult::Type::kFile, profile_);
-    result->SetDetailsToJustificationString();
     // TODO(crbug.com/1258415): Only generate thumbnails if the old launcher is
     // enabled. We should implement new thumbnail logic for Continue results if
     // necessary.
@@ -191,9 +201,6 @@
     new_results.push_back(std::move(result));
   }
 
-  if (app_list_features::IsForceShowContinueSectionEnabled())
-    AppendFakeSearchResults(&new_results);
-
   UMA_HISTOGRAM_TIMES("Apps.AppList.ZeroStateFileProvider.Latency",
                       base::TimeTicks::Now() - query_start_time_);
   SwapResults(&new_results);
@@ -224,17 +231,4 @@
   }
 }
 
-void ZeroStateFileProvider::AppendFakeSearchResults(Results* results) {
-  constexpr int kTotalFakeFiles = 3;
-  for (int i = 0; i < kTotalFakeFiles; ++i) {
-    results->emplace_back(std::make_unique<FileResult>(
-        kSchema,
-        base::FilePath(FILE_PATH_LITERAL(
-            base::StrCat({"Fake-file-", base::NumberToString(i), ".png"}))),
-        u"-", ash::AppListSearchResultType::kZeroStateFile,
-        ash::SearchResultDisplayType::kContinue, 0.1f, std::u16string(),
-        FileResult::Type::kFile, profile_));
-  }
-}
-
 }  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
index 5a288d30..03f7219 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_FILES_ZERO_STATE_FILE_PROVIDER_H_
 #define CHROME_BROWSER_UI_APP_LIST_SEARCH_FILES_ZERO_STATE_FILE_PROVIDER_H_
 
-#include <map>
 #include <memory>
 #include <string>
 #include <utility>
@@ -28,19 +27,27 @@
 class Profile;
 
 namespace app_list {
-namespace internal {
 
-using Results = std::vector<base::FilePath>;
-using ScoredResults = std::vector<std::pair<base::FilePath, float>>;
-using ValidAndInvalidResults = std::pair<ScoredResults, Results>;
-
-}  // namespace internal
-
-// ZeroStateFileProvider dispatches queries to extensions and fetches the
-// results from them via chrome.launcherSearchProvider API.
+// ZeroStateFileProvider recommends local files from a cache. Files are added to
+// the cache whenever they are opened.
 class ZeroStateFileProvider : public SearchProvider,
                               file_manager::file_tasks::FileTasksObserver {
  public:
+  struct FileInfo {
+    base::FilePath path;
+    float score;
+    base::Time last_accessed;
+    base::Time last_modified;
+
+    FileInfo(const base::FilePath& path,
+             float score,
+             const base::Time& last_accessed,
+             const base::Time& last_modified);
+    ~FileInfo();
+  };
+  using ValidAndInvalidResults =
+      std::pair<std::vector<FileInfo>, std::vector<base::FilePath>>;
+
   explicit ZeroStateFileProvider(Profile* profile);
 
   ZeroStateFileProvider(const ZeroStateFileProvider&) = delete;
@@ -58,14 +65,10 @@
   void OnFilesOpened(const std::vector<FileOpenEvent>& file_opens) override;
 
  private:
-  // Takes a pair of vectors: <valid paths, invalid paths>, and converts the
-  // valid paths to ZeroStatFilesResults and sets them as this provider's
-  // results. The invalid paths are removed from the model.
-  void SetSearchResults(internal::ValidAndInvalidResults results);
-
-  // TODO(crbug.com/1216084): Remove this after finishing developing Continue
-  // Section. Appends mock results to the driver provider.
-  void AppendFakeSearchResults(Results* results);
+  // Takes a pair of vectors: <valid paths, invalid paths>, converts the valid
+  // paths to FileResults and sets them as this provider's results. The invalid
+  // paths are removed from the model.
+  void SetSearchResults(ValidAndInvalidResults results);
 
   void OnProtoInitialized(ReadStatus status);
 
diff --git a/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc b/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc
index bde7c93..71ae5f3 100644
--- a/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc
+++ b/chrome/browser/ui/app_list/search/files/zero_state_file_provider_unittest.cc
@@ -6,13 +6,10 @@
 
 #include <string>
 
-#include "ash/constants/ash_features.h"
-#include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/test/test_app_list_color_provider.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
@@ -25,7 +22,6 @@
 namespace app_list {
 namespace {
 
-using ::base::test::ScopedFeatureList;
 using ::file_manager::file_tasks::FileTasksObserver;
 using ::testing::UnorderedElementsAre;
 
@@ -35,14 +31,9 @@
 
 }  // namespace
 
-// Parameterized by feature ProductivityLauncher.
-class ZeroStateFileProviderTest : public testing::Test,
-                                  public ::testing::WithParamInterface<bool> {
+class ZeroStateFileProviderTest : public testing::Test {
  protected:
-  ZeroStateFileProviderTest() {
-    feature_list_.InitWithFeatureState(ash::features::kProductivityLauncher,
-                                       GetParam());
-  }
+  ZeroStateFileProviderTest() = default;
   ~ZeroStateFileProviderTest() override = default;
 
   void SetUp() override {
@@ -86,17 +77,12 @@
   }
 
   const SearchProvider::Results& LastResults() {
-    if (app_list_features::IsCategoricalSearchEnabled()) {
-      return search_controller_.last_results();
-    }
-
-    return provider_->results();
+    return search_controller_.last_results();
   }
 
   void Wait() { task_environment_.RunUntilIdle(); }
 
   content::BrowserTaskEnvironment task_environment_;
-  base::test::ScopedFeatureList feature_list_;
 
   std::unique_ptr<Profile> profile_;
   TestSearchController search_controller_;
@@ -104,17 +90,13 @@
   std::unique_ptr<ash::TestAppListColorProvider> app_list_color_provider_;
 };
 
-INSTANTIATE_TEST_SUITE_P(ProductivityLauncher,
-                         ZeroStateFileProviderTest,
-                         testing::Bool());
-
-TEST_P(ZeroStateFileProviderTest, NoResultsWithQuery) {
+TEST_F(ZeroStateFileProviderTest, NoResultsWithQuery) {
   StartSearch(u"query");
   Wait();
   EXPECT_TRUE(LastResults().empty());
 }
 
-TEST_P(ZeroStateFileProviderTest, ResultsProvided) {
+TEST_F(ZeroStateFileProviderTest, ResultsProvided) {
   WriteFile("exists_1.txt");
   WriteFile("exists_2.png");
   WriteFile("exists_3.pdf");
@@ -131,7 +113,7 @@
                                                   Title(u"exists_2.png")));
 }
 
-TEST_P(ZeroStateFileProviderTest, OldFilesNotReturned) {
+TEST_F(ZeroStateFileProviderTest, OldFilesNotReturned) {
   WriteFile("new.txt");
   WriteFile("old.png");
   auto now = base::Time::Now();
diff --git a/chrome/browser/ui/app_list/search/search_controller_factory.cc b/chrome/browser/ui/app_list/search/search_controller_factory.cc
index 4331ed8..935e9092 100644
--- a/chrome/browser/ui/app_list/search/search_controller_factory.cc
+++ b/chrome/browser/ui/app_list/search/search_controller_factory.cc
@@ -151,11 +151,7 @@
             kMaxAppShortcutResults, profile, list_controller));
   }
 
-  // Enable zero-state files aka. the Continue section if:
-  // - unconditionally in the old launcher.
-  // - in the productivity launcher only if the enable_continue parameter is
-  //   true (the default).
-  if (!ash::features::IsProductivityLauncherEnabled() ||
+  if (ash::features::IsProductivityLauncherEnabled() &&
       base::GetFieldTrialParamByFeatureAsBool(
           ash::features::kProductivityLauncher, "enable_continue", false)) {
     size_t zero_state_files_group_id =
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc
index 1b3c4e7..67f5666 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.cc
@@ -188,13 +188,13 @@
   // Store all Arc apps.
   // arc_apps_ and arc_packages_ can be nullptr in tests.
   if (arc_apps_ && arc_packages_) {
-    for (const auto app : arc_apps_->DictItems()) {
+    for (const auto app : *arc_apps_) {
       const base::Value* package_name_value = app.second.FindKey(kPackageName);
       if (!package_name_value) {
         continue;
       }
       const base::Value* package =
-          arc_packages_->FindKey(package_name_value->GetString());
+          arc_packages_->Find(package_name_value->GetString());
       if (!package) {
         continue;
       }
@@ -222,8 +222,8 @@
 
   PrefService* pref_service = profile->GetPrefs();
   if (pref_service) {
-    arc_apps_ = pref_service->GetDictionary(arc::prefs::kArcApps);
-    arc_packages_ = pref_service->GetDictionary(arc::prefs::kArcPackages);
+    arc_apps_ = &pref_service->GetValueDict(arc::prefs::kArcApps);
+    arc_packages_ = &pref_service->GetValueDict(arc::prefs::kArcPackages);
   }
 }
 
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h
index 1abf787..b835c0e 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger.h
@@ -87,9 +87,9 @@
   void EnforceLoggingPolicy();
 
   // The arc apps installed on the device.
-  const base::Value* arc_apps_ = nullptr;
+  const base::Value::Dict* arc_apps_ = nullptr;
   // The arc packages installed on the device.
-  const base::Value* arc_packages_ = nullptr;
+  const base::Value::Dict* arc_packages_ = nullptr;
   // The Chrome extension registry.
   extensions::ExtensionRegistry* registry_ = nullptr;
 
diff --git a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc
index 3e33998..e081699 100644
--- a/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc
+++ b/chrome/browser/ui/app_list/search/search_result_ranker/app_launch_event_logger_unittest.cc
@@ -51,8 +51,8 @@
 class AppLaunchEventLoggerForTest : public AppLaunchEventLogger {
  public:
   AppLaunchEventLoggerForTest(extensions::ExtensionRegistry* registry,
-                              base::DictionaryValue* arc_apps,
-                              base::DictionaryValue* arc_packages,
+                              base::Value::Dict* arc_apps,
+                              base::Value::Dict* arc_packages,
                               Profile* profile)
       : AppLaunchEventLogger(profile) {
     arc_apps_ = arc_apps;
@@ -146,14 +146,14 @@
   base::Value package(base::Value::Type::DICTIONARY);
   package.SetKey(AppLaunchEventLogger::kShouldSync, base::Value(true));
 
-  auto packages = std::make_unique<base::DictionaryValue>();
-  packages->SetKey(kMapsPackageName, package.Clone());
+  auto packages = std::make_unique<base::Value::Dict>();
+  packages->Set(kMapsPackageName, package.Clone());
 
-  base::Value app(base::Value::Type::DICTIONARY);
-  app.SetKey(AppLaunchEventLogger::kPackageName, base::Value(kMapsPackageName));
+  base::Value::Dict app;
+  app.Set(AppLaunchEventLogger::kPackageName, base::Value(kMapsPackageName));
 
-  auto arc_apps = std::make_unique<base::DictionaryValue>();
-  arc_apps->SetKey(kMapsArcApp, app.Clone());
+  auto arc_apps = std::make_unique<base::Value::Dict>();
+  arc_apps->Set(kMapsArcApp, app.Clone());
 
   AppLaunchEventLoggerForTest app_launch_event_logger_(
       nullptr, arc_apps.get(), packages.get(), &profile_);
@@ -188,9 +188,9 @@
   calculator_package.SetKey(AppLaunchEventLogger::kShouldSync,
                             base::Value(true));
 
-  auto packages = std::make_unique<base::DictionaryValue>();
-  packages->SetKey(kMapsPackageName, maps_package.Clone());
-  packages->SetKey(kCalculatorPackageName, calculator_package.Clone());
+  auto packages = std::make_unique<base::Value::Dict>();
+  packages->Set(kMapsPackageName, maps_package.Clone());
+  packages->Set(kCalculatorPackageName, calculator_package.Clone());
 
   base::Value maps_app(base::Value::Type::DICTIONARY);
   base::Value calculator_app(base::Value::Type::DICTIONARY);
@@ -199,9 +199,9 @@
   calculator_app.SetKey(AppLaunchEventLogger::kPackageName,
                         base::Value(kCalculatorPackageName));
 
-  auto arc_apps = std::make_unique<base::DictionaryValue>();
-  arc_apps->SetKey(kMapsArcApp, maps_app.Clone());
-  arc_apps->SetKey(kCalculatorArcApp, calculator_app.Clone());
+  auto arc_apps = std::make_unique<base::Value::Dict>();
+  arc_apps->Set(kMapsArcApp, maps_app.Clone());
+  arc_apps->Set(kCalculatorArcApp, calculator_app.Clone());
 
   AppLaunchEventLoggerForTest app_launch_event_logger_(
       nullptr, arc_apps.get(), packages.get(), &profile_);
diff --git a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc
index e38c5d49..7892a10 100644
--- a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.cc
@@ -59,7 +59,7 @@
 
 void AssistantBrowserDelegateImpl::MaybeInit(Profile* profile) {
   if (assistant::IsAssistantAllowedForProfile(profile) !=
-      chromeos::assistant::AssistantAllowedState::ALLOWED) {
+      ash::assistant::AssistantAllowedState::ALLOWED) {
     return;
   }
 
@@ -98,11 +98,11 @@
   if (!initialized_)
     return;
 
-  chromeos::assistant::AssistantService::Get()->Shutdown();
+  ash::assistant::AssistantService::Get()->Shutdown();
 }
 
 void AssistantBrowserDelegateImpl::OnAssistantStatusChanged(
-    chromeos::assistant::AssistantStatus new_status) {
+    ash::assistant::AssistantStatus new_status) {
   ash::AssistantState::Get()->NotifyStatusChanged(new_status);
 }
 
@@ -214,7 +214,7 @@
 }
 
 void AssistantBrowserDelegateImpl::OnAssistantFeatureAllowedChanged(
-    chromeos::assistant::AssistantAllowedState allowed_state) {
+    ash::assistant::AssistantAllowedState allowed_state) {
   Profile* profile = ProfileManager::GetActiveUserProfile();
 
   MaybeInit(profile);
diff --git a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
index 305117f..31158bc5 100644
--- a/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
+++ b/chrome/browser/ui/ash/assistant/assistant_browser_delegate_impl.h
@@ -26,7 +26,7 @@
 
 // Class to handle all Assistant in-browser-process functionalities.
 class AssistantBrowserDelegateImpl
-    : public chromeos::assistant::AssistantBrowserDelegate,
+    : public ash::assistant::AssistantBrowserDelegate,
       public signin::IdentityManager::Observer,
       public session_manager::SessionManagerObserver,
       public ash::AssistantStateObserver {
@@ -42,7 +42,7 @@
 
   // chromeos::assistant::AssisantClient overrides:
   void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus new_status) override;
+      ash::assistant::AssistantStatus new_status) override;
   void RequestAssistantVolumeControl(
       mojo::PendingReceiver<ash::mojom::AssistantVolumeControl> receiver)
       override;
@@ -87,7 +87,7 @@
 
   // ash::AssistantStateObserver:
   void OnAssistantFeatureAllowedChanged(
-      chromeos::assistant::AssistantAllowedState allowed_state) override;
+      ash::assistant::AssistantAllowedState allowed_state) override;
 
   // Called when the application is terminating
   void OnAppTerminating();
diff --git a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc
index f7b7462d..134d585 100644
--- a/chrome/browser/ui/ash/assistant/assistant_browsertest.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_browsertest.cc
@@ -58,7 +58,7 @@
   AssistantBrowserTest() {
     // TODO(b/190633242): enable sandbox in browser tests.
     feature_list_.InitAndDisableFeature(
-        chromeos::assistant::features::kEnableLibAssistantSandbox);
+        ash::assistant::features::kEnableLibAssistantSandbox);
 
     // Do not log to file in test. Otherwise multiple tests may create/delete
     // the log file at the same time. See http://crbug.com/1307868.
diff --git a/chrome/browser/ui/ash/assistant/assistant_setup.cc b/chrome/browser/ui/ash/assistant/assistant_setup.cc
index 12e17bb..3b291a9 100644
--- a/chrome/browser/ui/ash/assistant/assistant_setup.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_setup.cc
@@ -37,7 +37,7 @@
 AssistantSetup::AssistantSetup() {
   DCHECK(assistant::IsAssistantAllowedForProfile(
              ProfileManager::GetActiveUserProfile()) ==
-         chromeos::assistant::AssistantAllowedState::ALLOWED);
+         ash::assistant::AssistantAllowedState::ALLOWED);
   ash::AssistantState::Get()->AddObserver(this);
 
   search_and_assistant_enabled_checker_ =
@@ -64,7 +64,7 @@
 void AssistantSetup::MaybeStartAssistantOptInFlow() {
   DCHECK(Prefs());
   if (!Prefs()->GetUserPrefValue(
-          chromeos::assistant::prefs::kAssistantConsentStatus)) {
+          ash::assistant::prefs::kAssistantConsentStatus)) {
     base::SequencedTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(&AssistantSetup::StartAssistantOptInFlow,
@@ -77,24 +77,24 @@
   // When there is an error, default the pref to false if the pref is not set
   // yet. The pref value will be synced the next time.
   if (!Prefs()->GetUserPrefValue(
-          chromeos::assistant::prefs::kAssistantDisabledByPolicy)) {
-    Prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantDisabledByPolicy,
+          ash::assistant::prefs::kAssistantDisabledByPolicy)) {
+    Prefs()->SetBoolean(ash::assistant::prefs::kAssistantDisabledByPolicy,
                         false);
   }
 }
 
 void AssistantSetup::OnSearchAndAssistantStateReceived(bool is_disabled) {
-  Prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantDisabledByPolicy,
+  Prefs()->SetBoolean(ash::assistant::prefs::kAssistantDisabledByPolicy,
                       is_disabled);
   if (is_disabled) {
     DVLOG(1) << "Assistant is disabled by domain policy.";
-    Prefs()->SetBoolean(chromeos::assistant::prefs::kAssistantEnabled, false);
+    Prefs()->SetBoolean(ash::assistant::prefs::kAssistantEnabled, false);
   }
 }
 
 void AssistantSetup::OnAssistantStatusChanged(
-    chromeos::assistant::AssistantStatus status) {
-  if (status == chromeos::assistant::AssistantStatus::NOT_READY)
+    ash::assistant::AssistantStatus status) {
+  if (status == ash::assistant::AssistantStatus::NOT_READY)
     return;
 
   SyncSettingsState();
@@ -107,7 +107,7 @@
   consent_flow_ui->set_flow_id(
       chromeos::assistant::ActivityControlSettingsUiSelector::
           ASSISTANT_SUW_ONBOARDING_ON_CHROME_OS);
-  chromeos::assistant::AssistantSettings::Get()->GetSettings(
+  ash::assistant::AssistantSettings::Get()->GetSettings(
       selector.SerializeAsString(),
       base::BindOnce(&AssistantSetup::OnGetSettingsResponse,
                      base::Unretained(this)));
@@ -129,29 +129,27 @@
     case ConsentFlowUi::ASK_FOR_CONSENT:
       if (consent_ui.has_activity_control_ui() &&
           consent_ui.activity_control_ui().setting_zippy().size()) {
-        Prefs()->SetInteger(
-            chromeos::assistant::prefs::kAssistantConsentStatus,
-            chromeos::assistant::prefs::ConsentStatus::kNotFound);
+        Prefs()->SetInteger(ash::assistant::prefs::kAssistantConsentStatus,
+                            ash::assistant::prefs::ConsentStatus::kNotFound);
       } else {
-        Prefs()->SetInteger(chromeos::assistant::prefs::kAssistantConsentStatus,
-                            chromeos::assistant::prefs::ConsentStatus::
-                                kActivityControlAccepted);
+        Prefs()->SetInteger(
+            ash::assistant::prefs::kAssistantConsentStatus,
+            ash::assistant::prefs::ConsentStatus::kActivityControlAccepted);
       }
       break;
     case ConsentFlowUi::ERROR_ACCOUNT:
-      Prefs()->SetInteger(
-          chromeos::assistant::prefs::kAssistantConsentStatus,
-          chromeos::assistant::prefs::ConsentStatus::kUnauthorized);
+      Prefs()->SetInteger(ash::assistant::prefs::kAssistantConsentStatus,
+                          ash::assistant::prefs::ConsentStatus::kUnauthorized);
       break;
     case ConsentFlowUi::ALREADY_CONSENTED:
       Prefs()->SetInteger(
-          chromeos::assistant::prefs::kAssistantConsentStatus,
-          chromeos::assistant::prefs::ConsentStatus::kActivityControlAccepted);
+          ash::assistant::prefs::kAssistantConsentStatus,
+          ash::assistant::prefs::ConsentStatus::kActivityControlAccepted);
       break;
     case ConsentFlowUi::UNSPECIFIED:
     case ConsentFlowUi::ERROR:
-      Prefs()->SetInteger(chromeos::assistant::prefs::kAssistantConsentStatus,
-                          chromeos::assistant::prefs::ConsentStatus::kUnknown);
+      Prefs()->SetInteger(ash::assistant::prefs::kAssistantConsentStatus,
+                          ash::assistant::prefs::ConsentStatus::kUnknown);
       LOG(ERROR) << "Invalid activity control consent status.";
   }
 }
diff --git a/chrome/browser/ui/ash/assistant/assistant_setup.h b/chrome/browser/ui/ash/assistant/assistant_setup.h
index 2165ee36..f7962c6 100644
--- a/chrome/browser/ui/ash/assistant/assistant_setup.h
+++ b/chrome/browser/ui/ash/assistant/assistant_setup.h
@@ -44,7 +44,7 @@
  private:
   // ash::AssistantStateObserver:
   void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) override;
+      ash::assistant::AssistantStatus status) override;
 
   void SyncSettingsState();
   void OnGetSettingsResponse(const std::string& settings);
diff --git a/chrome/browser/ui/ash/assistant/assistant_state_client.cc b/chrome/browser/ui/ash/assistant/assistant_state_client.cc
index cb84392..fbb3e02 100644
--- a/chrome/browser/ui/ash/assistant/assistant_state_client.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_state_client.cc
@@ -32,7 +32,7 @@
 
 void AssistantStateClient::NotifyFeatureAllowed() {
   DCHECK(profile_);
-  chromeos::assistant::AssistantAllowedState state =
+  ash::assistant::AssistantAllowedState state =
       assistant::IsAssistantAllowedForProfile(profile_);
   ash::AssistantState::Get()->NotifyFeatureAllowed(state);
 }
@@ -88,7 +88,7 @@
                           base::Unretained(this)));
 
   pref_change_registrar_->Add(
-      chromeos::assistant::prefs::kAssistantDisabledByPolicy,
+      ash::assistant::prefs::kAssistantDisabledByPolicy,
       base::BindRepeating(&AssistantStateClient::NotifyFeatureAllowed,
                           base::Unretained(this)));
 
diff --git a/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc b/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc
index 3f81e02..080e02e 100644
--- a/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_test_mixin.cc
@@ -51,7 +51,7 @@
 class AssistantStatusWaiter : private ash::AssistantStateObserver {
  public:
   AssistantStatusWaiter(ash::AssistantState* state,
-                        chromeos::assistant::AssistantStatus expected_status)
+                        ash::assistant::AssistantStatus expected_status)
       : state_(state), expected_status_(expected_status) {
     state_->AddObserver(this);
   }
@@ -74,13 +74,13 @@
 
  private:
   void OnAssistantStatusChanged(
-      chromeos::assistant::AssistantStatus status) override {
+      ash::assistant::AssistantStatus status) override {
     if (status == expected_status_ && quit_loop_)
       std::move(quit_loop_).Run();
   }
 
   ash::AssistantState* const state_;
-  chromeos::assistant::AssistantStatus const expected_status_;
+  ash::assistant::AssistantStatus const expected_status_;
 
   base::OnceClosure quit_loop_;
 };
@@ -420,7 +420,7 @@
   SetPreferVoice(false);
 
   AssistantStatusWaiter waiter(test_api_->GetAssistantState(),
-                               chromeos::assistant::AssistantStatus::READY);
+                               ash::assistant::AssistantStatus::READY);
   waiter.RunUntilExpectedStatus();
 }
 
@@ -591,7 +591,7 @@
 
   // Then wait for the Service to shutdown.
   AssistantStatusWaiter waiter(test_api_->GetAssistantState(),
-                               chromeos::assistant::AssistantStatus::NOT_READY);
+                               ash::assistant::AssistantStatus::NOT_READY);
   waiter.RunUntilExpectedStatus();
 }
 
diff --git a/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc b/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc
index fda4c65..51c9abb 100644
--- a/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_timers_browsertest.cc
@@ -195,7 +195,7 @@
   AssistantTimersBrowserTest() {
     // TODO(b/190633242): enable sandbox in browser tests.
     feature_list_.InitAndDisableFeature(
-        chromeos::assistant::features::kEnableLibAssistantSandbox);
+        ash::assistant::features::kEnableLibAssistantSandbox);
 
     // Do not log to file in test. Otherwise multiple tests may create/delete
     // the log file at the same time. See http://crbug.com/1307868.
diff --git a/chrome/browser/ui/ash/assistant/device_actions.cc b/chrome/browser/ui/ash/assistant/device_actions.cc
index 235f537..582e785 100644
--- a/chrome/browser/ui/ash/assistant/device_actions.cc
+++ b/chrome/browser/ui/ash/assistant/device_actions.cc
@@ -101,8 +101,7 @@
 }
 
 void NotifyAndroidAppListRefreshed(
-    base::ObserverList<chromeos::assistant::AppListEventSubscriber>*
-        subscribers) {
+    base::ObserverList<ash::assistant::AppListEventSubscriber>* subscribers) {
   std::vector<AndroidAppInfo> android_apps_info = GetAppsInfo();
   for (auto& subscriber : *subscribers)
     subscriber.OnAndroidAppListRefreshed(android_apps_info);
@@ -126,7 +125,7 @@
   NET_LOG(USER) << __func__ << ":" << enabled;
   NetworkHandler::Get()->network_state_handler()->SetTechnologyEnabled(
       NetworkTypePattern::WiFi(), enabled,
-      chromeos::network_handler::ErrorCallback());
+      ash::network_handler::ErrorCallback());
 }
 
 void DeviceActions::SetBluetoothEnabled(bool enabled) {
@@ -232,7 +231,7 @@
 }
 
 void DeviceActions::AddAndFireAppListEventSubscriber(
-    chromeos::assistant::AppListEventSubscriber* subscriber) {
+    ash::assistant::AppListEventSubscriber* subscriber) {
   auto* prefs = ArcAppListPrefs::Get(ProfileManager::GetActiveUserProfile());
   if (prefs && prefs->package_list_initial_refreshed()) {
     std::vector<AndroidAppInfo> android_apps_info = GetAppsInfo();
@@ -246,7 +245,7 @@
 }
 
 void DeviceActions::RemoveAppListEventSubscriber(
-    chromeos::assistant::AppListEventSubscriber* subscriber) {
+    ash::assistant::AppListEventSubscriber* subscriber) {
   app_list_subscribers_.RemoveObserver(subscriber);
 }
 
diff --git a/chrome/browser/ui/ash/assistant/device_actions.h b/chrome/browser/ui/ash/assistant/device_actions.h
index c79ef5ae..2019fb0 100644
--- a/chrome/browser/ui/ash/assistant/device_actions.h
+++ b/chrome/browser/ui/ash/assistant/device_actions.h
@@ -21,7 +21,7 @@
 #include "mojo/public/cpp/bindings/remote_set.h"
 
 class DeviceActions : public ash::AndroidIntentHelper,
-                      public chromeos::assistant::DeviceActions,
+                      public ash::assistant::DeviceActions,
                       public ArcAppListPrefs::Observer {
  public:
   explicit DeviceActions(std::unique_ptr<DeviceActionsDelegate> delegate);
@@ -31,7 +31,7 @@
 
   ~DeviceActions() override;
 
-  // chromeos::assistant::DeviceActions overrides:
+  // ash::assistant::DeviceActions overrides:
   void SetWifiEnabled(bool enabled) override;
   void SetBluetoothEnabled(bool enabled) override;
   void GetScreenBrightnessLevel(
@@ -45,9 +45,9 @@
       const chromeos::assistant::AndroidAppInfo& app_info) override;
   void LaunchAndroidIntent(const std::string& intent) override;
   void AddAndFireAppListEventSubscriber(
-      chromeos::assistant::AppListEventSubscriber* subscriber) override;
+      ash::assistant::AppListEventSubscriber* subscriber) override;
   void RemoveAppListEventSubscriber(
-      chromeos::assistant::AppListEventSubscriber* subscriber) override;
+      ash::assistant::AppListEventSubscriber* subscriber) override;
 
   // ash::AndroidIntentHelper overrides:
   absl::optional<std::string> GetAndroidAppLaunchIntent(
@@ -64,7 +64,7 @@
 
   base::ScopedMultiSourceObservation<ArcAppListPrefs, ArcAppListPrefs::Observer>
       scoped_prefs_observations_{this};
-  base::ObserverList<chromeos::assistant::AppListEventSubscriber>
+  base::ObserverList<ash::assistant::AppListEventSubscriber>
       app_list_subscribers_;
 
   mojo::Remote<chromeos::bluetooth_config::mojom::CrosBluetoothConfig>
diff --git a/chrome/browser/ui/ash/chrome_shell_delegate.cc b/chrome/browser/ui/ash/chrome_shell_delegate.cc
index 5ae33e5..b70e755f 100644
--- a/chrome/browser/ui/ash/chrome_shell_delegate.cc
+++ b/chrome/browser/ui/ash/chrome_shell_delegate.cc
@@ -258,7 +258,7 @@
   }
 
   if (assistant::IsAssistantAllowedForProfile(profile) ==
-      chromeos::assistant::AssistantAllowedState::ALLOWED) {
+      ash::assistant::AssistantAllowedState::ALLOWED) {
     ash::AssistantState::Get()->NotifyLockedFullScreenStateChanged(locked);
   }
 }
diff --git a/chrome/browser/ui/ash/holding_space/scoped_test_mount_point.cc b/chrome/browser/ui/ash/holding_space/scoped_test_mount_point.cc
index 0849c7d5..cedb96b 100644
--- a/chrome/browser/ui/ash/holding_space/scoped_test_mount_point.cc
+++ b/chrome/browser/ui/ash/holding_space/scoped_test_mount_point.cc
@@ -42,7 +42,7 @@
     if (file_manager::VolumeManager::Get(profile_)) {
       file_manager::VolumeManager::Get(profile_)
           ->RemoveVolumeForTesting(  // IN-TEST
-              temp_dir_.GetPath(), volume_type_, chromeos::DEVICE_TYPE_UNKNOWN,
+              temp_dir_.GetPath(), volume_type_, DeviceType::kUnknown,
               /*read_only=*/false);
     }
   }
@@ -62,7 +62,7 @@
                                 base::FilePath(name_));
   if (file_manager::VolumeManager::Get(profile_)) {
     file_manager::VolumeManager::Get(profile_)->AddVolumeForTesting(  // IN-TEST
-        temp_dir_.GetPath(), volume_type_, chromeos::DEVICE_TYPE_UNKNOWN,
+        temp_dir_.GetPath(), volume_type_, DeviceType::kUnknown,
         /*read_only=*/false);
   }
 }
diff --git a/chrome/browser/ui/ash/system_tray_client_impl.cc b/chrome/browser/ui/ash/system_tray_client_impl.cc
index 653b09c4..81427d1 100644
--- a/chrome/browser/ui/ash/system_tray_client_impl.cc
+++ b/chrome/browser/ui/ash/system_tray_client_impl.cc
@@ -570,7 +570,7 @@
     LOG(ERROR) << "Network not found: " << network_id;
     return;
   }
-  if (network_state->type() == chromeos::kTypeTether &&
+  if (network_state->type() == ash::kTypeTether &&
       !network_state->tether_has_connected_to_host()) {
     ShowNetworkSettingsHelper(network_id, true /* show_configure */);
     return;
diff --git a/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h b/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h
index 78b1388..027ac04 100644
--- a/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h
+++ b/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h
@@ -18,12 +18,13 @@
 
   ~PageInfoCookiesContentView() override;
 
-  // PageInfoUI implementations.
-  void EnsureCookieInfo() override;
-
   void CookiesSettingsLinkClicked(const ui::Event& event);
 
  private:
+  // Ensures the cookie information UI is present, with placeholder information
+  // if necessary.
+  void EnsureCookieInfo();
+
   raw_ptr<PageInfo> presenter_;
 
   // The button that opens Cookie Dialog and displays a number of allowed sites.
diff --git a/chrome/browser/ui/views/page_info/page_info_main_view.h b/chrome/browser/ui/views/page_info/page_info_main_view.h
index 0815c84..aafb177 100644
--- a/chrome/browser/ui/views/page_info/page_info_main_view.h
+++ b/chrome/browser/ui/views/page_info/page_info_main_view.h
@@ -64,7 +64,6 @@
   ~PageInfoMainView() override;
 
   // PageInfoUI implementations.
-  void EnsureCookieInfo() override;
   void SetCookieInfo(const CookieInfoList& cookie_info_list) override;
   void SetPermissionInfo(const PermissionInfoList& permission_info_list,
                          ChosenObjectInfoList chosen_object_info_list) override;
@@ -90,6 +89,10 @@
   friend class PageInfoBubbleViewDialogBrowserTest;
   friend class test::PageInfoBubbleViewTestApi;
 
+  // Ensures the cookie information UI is present, with placeholder information
+  // if necessary.
+  void EnsureCookieInfo();
+
   // Creates a view with vertical box layout that will used a container for
   // other views.
   [[nodiscard]] std::unique_ptr<views::View> CreateContainerView();
diff --git a/chrome/browser/ui/webui/settings/OWNERS b/chrome/browser/ui/webui/settings/OWNERS
index b033c55..f699053 100644
--- a/chrome/browser/ui/webui/settings/OWNERS
+++ b/chrome/browser/ui/webui/settings/OWNERS
@@ -9,7 +9,7 @@
 per-file *site_settings*=sauski@google.com
 per-file safe_browsing_handler*=msramek@chromium.org
 per-file safe_browsing_handler*=sauski@google.com
-per-file safety_check_handler*=andzaytsev@google.com
+per-file safety_check_handler*=andzaytsev@google.com,rainhard@chromium.org
 per-file settings_clear_browsing_data_handler*=sauski@google.com
 per-file settings_cookies_view_handler*=sauski@google.com
 per-file settings_localized_strings_provider*=sauski@google.com
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
index b67b936e..9caaee8 100644
--- a/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/signin/inline_login_handler_chromeos.cc
@@ -283,6 +283,7 @@
              base::Value(GetInlineLoginFlowName(Profile::FromWebUI(web_ui()),
                                                 params.FindString("email"))));
   params.Set("dontResizeNonEmbeddedPages", true);
+  params.Set("enableGaiaActionButtons", true);
 
   // For in-session login flows, request Gaia to ignore third party SAML IdP SSO
   // redirection policies (and redirect to SAML IdPs by default), otherwise some
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 1cf2f88..f58dab5 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1659376786-b058dceac3f82448c682c1d8ccfb02bf2c77a4c3.profdata
+chrome-linux-main-1659419632-27d7bedcc5361a64272e070c6a16f5072c1a1378.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 9ffb8ac6..23df74c 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1659376786-4a669bef463f40eaa50c1b83986ee7ebf9a2bcf5.profdata
+chrome-mac-arm-main-1659419632-19f15dc762cb0325b250e7ec5934f13f73dd7d77.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 3bd70f8..964f6f21 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1659376786-78637f2ed6d0b2ca63a62534d59747fbf39eb645.profdata
+chrome-mac-main-1659419632-e6fb3126d457095d0a1239a0492f697b8419f393.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 09d4601..8a643d7c 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1659386929-2e760f067abd284ca695c24bd397465aa8770241.profdata
+chrome-win32-main-1659419632-b6611a7f8a3988e54799c7cb875b4f0ea28d0e0e.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 25c4c66..1706add 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1659386929-caa903b1eae5b3ec509b8e3551cd7a1463d9af17.profdata
+chrome-win64-main-1659426205-b0d2e1b55f148e5dc269d758d30ed7ab7215726a.profdata
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 7a5b212..332d7bb 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -214,7 +214,7 @@
 // browser by default. Users can still enable link capturing for apps through
 // the intent picker or settings.
 const base::Feature kDefaultLinkCapturingInBrowser{
-    "DefaultLinkCapturingInBrowser", base::FEATURE_DISABLED_BY_DEFAULT};
+    "DefaultLinkCapturingInBrowser", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/common/extensions/api/autotest_private.idl b/chrome/common/extensions/api/autotest_private.idl
index 9dac2fed..06add642 100644
--- a/chrome/common/extensions/api/autotest_private.idl
+++ b/chrome/common/extensions/api/autotest_private.idl
@@ -278,9 +278,6 @@
   };
 
   dictionary LacrosInfo {
-    // True iff lacros is running currently. TODO(neis): Remove once the Tast
-    // use has been eliminated.
-    boolean isRunning;
     // The state of lacros.
     LacrosState state;
     // True iff keepalive is enabled for lacros.
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/sync/SyncTestUtil.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/sync/SyncTestUtil.java
index 2073c1d..260b12b 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/sync/SyncTestUtil.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/sync/SyncTestUtil.java
@@ -35,14 +35,6 @@
     private SyncTestUtil() {}
 
     /**
-     * Returns whether sync is requested.
-     */
-    public static boolean isSyncRequested() {
-        return TestThreadUtils.runOnUiThreadBlockingNoException(
-                () -> SyncService.get().isSyncRequested());
-    }
-
-    /**
      * Returns whether sync-the-feature can start.
      */
     public static boolean canSyncFeatureStart() {
@@ -51,6 +43,14 @@
     }
 
     /**
+     * Returns whether sync-the-feature is enabled.
+     */
+    public static boolean isSyncFeatureEnabled() {
+        return TestThreadUtils.runOnUiThreadBlockingNoException(
+                () -> SyncService.get().isSyncFeatureEnabled());
+    }
+
+    /**
      * Returns whether sync-the-feature is active.
      */
     public static boolean isSyncFeatureActive() {
diff --git a/chrome/test/data/extensions/api_test/terminal/component_extension/test.js b/chrome/test/data/extensions/api_test/terminal/component_extension/test.js
index 83f0d4e76..d501436c 100644
--- a/chrome/test/data/extensions/api_test/terminal/component_extension/test.js
+++ b/chrome/test/data/extensions/api_test/terminal/component_extension/test.js
@@ -9,7 +9,7 @@
 // Ensure this has all distinct characters.
 var testLine = 'abcdefgh\n';
 
-var startCharacter = '#';
+var startChar = '#';
 
 var croshName = 'crosh';
 var invalidName = 'some name';
@@ -28,13 +28,15 @@
   this.id_ = id;
   this.type_= type;
 
+  // Text received before we start matching lines.
+  this.startText_ = '';
+
   this.lineExpectation_ = '';
   this.linesLeftToCheck_ = -1;
   // We receive two streams from the process.
   this.checkedStreamEnd_ = [0, 0];
 
   this.closed_ = false;
-  this.startCharactersFound_ = 0;
   this.started_ = false;
 };
 
@@ -54,7 +56,7 @@
       continue;
     if (this.processReceivedCharacter_(text[i], 1))
       continue;
-    chrome.test.fail("Received: " + text);
+    chrome.test.fail("Received: [" + text + "]");
   }
 };
 
@@ -105,14 +107,6 @@
   this.closed_ = true;
 };
 
-TestProcess.prototype.canStart = function() {
-  return (this.startCharactersFound_ == 2);
-};
-
-TestProcess.prototype.startCharacterFound = function() {
-  this.startCharactersFound_++;
-};
-
 TestProcess.prototype.getCatCommand = function() {
   if (this.type_ == "stdout")
     return catCommand;
@@ -126,21 +120,13 @@
 
 // Set of commands we use to setup terminal for testing (start cat) will produce
 // some output. We don't care about that output, to avoid having to set that
-// output in test expectations, we will send |startCharacter| right after cat is
-// started. After we detect second |startCharacter|s in output, we know process
-// won't produce any output by itself, so it is safe to start actual test.
+// output in test expectations, we will send |startChar| right after cat is
+// started. After we detect `${startChar}\r\n${startChar}\r\n` in output, we
+// know process won't produce any output by itself, so it is safe to start test.
 TestProcess.prototype.maybeKickOffTest = function(text) {
-  var index = 0;
-  while (index != -1) {
-    index = text.indexOf(startCharacter, index);
-    if (index != -1) {
-      this.startCharacterFound();
-      if (this.canStart()) {
-        this.kickOffTest_(testLine, testLineNum);
-        return;
-      }
-      index++;
-    }
+  this.startText_ += text;
+  if (this.startText_.indexOf(`${startChar}\r\n${startChar}\r\n`) !== -1) {
+    this.kickOffTest_(testLine, testLineNum);
   }
 };
 
@@ -210,10 +196,10 @@
 };
 
 function initTest(process) {
-  var sendStartCharacter = function() {
+  var sendStartChar = function() {
       chrome.terminalPrivate.sendInput(
           process.id(),
-          startCharacter + '\n',
+          startChar + '\n',
           function(result) {
               chrome.test.assertTrue(result);
           }
@@ -226,7 +212,7 @@
           process.getCatCommand(),
           function(result) {
             chrome.test.assertTrue(result);
-            sendStartCharacter();
+            sendStartChar();
           }
       );
   };
diff --git a/chrome/test/data/webui/chromeos/manage_mirrorsync/BUILD.gn b/chrome/test/data/webui/chromeos/manage_mirrorsync/BUILD.gn
index 4062824e..228dc46 100644
--- a/chrome/test/data/webui/chromeos/manage_mirrorsync/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/manage_mirrorsync/BUILD.gn
@@ -11,7 +11,7 @@
   tsconfig_base = "tsconfig.json"
   path_mappings = [
     "chrome://manage-mirrorsync/*|" + rebase_path(
-            "$root_gen_dir/chrome/browser/resources/chromeos/manage_mirrorsync/resources/tsc/*",
+            "$root_gen_dir/chrome/browser/resources/chromeos/manage_mirrorsync/tsc/*",
             target_gen_dir),
     "chrome://webui-test/*|" +
         rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
diff --git a/chrome/test/data/webui/chromeos/manage_mirrorsync/manage_mirrorsync_app_test.ts b/chrome/test/data/webui/chromeos/manage_mirrorsync/manage_mirrorsync_app_test.ts
index 65c6589..b84bc8b 100644
--- a/chrome/test/data/webui/chromeos/manage_mirrorsync/manage_mirrorsync_app_test.ts
+++ b/chrome/test/data/webui/chromeos/manage_mirrorsync/manage_mirrorsync_app_test.ts
@@ -5,13 +5,66 @@
 import 'chrome://manage-mirrorsync/components/manage_mirrorsync.js';
 import 'chrome://webui-test/mojo_webui_test_support.js';
 
-import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {BrowserProxy} from 'chrome://manage-mirrorsync/browser_proxy.js';
+import {FolderSelector} from 'chrome://manage-mirrorsync/components/folder_selector.js';
+import {PageHandlerRemote} from 'chrome://manage-mirrorsync/manage_mirrorsync.mojom-webui.js';
+import {assertArrayEquals, assertNotEquals, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+import {isVisible} from 'chrome://webui-test/test_util.js';
+
+/**
+ * A fake BrowserProxy implementation that enables switching out the real one to
+ * mock various mojo responses.
+ */
+class ManageMirrorSyncTestBrowserProxy extends TestBrowserProxy implements
+    BrowserProxy {
+  handler: PageHandlerRemote&TestBrowserProxy;
+
+  constructor() {
+    super(['getChildFolders']);
+    this.handler = TestBrowserProxy.fromClass(PageHandlerRemote);
+  }
+}
+
+/**
+ * Wait until the supplied function evaluates to true, repeating evaluation
+ * every 100ms for a total time of 5s.
+ */
+async function waitUntil(func: () => boolean) {
+  let promiseResolve: (value: null) => void;
+  let promiseReject: (error: Error) => void;
+  const promise = new Promise((resolve, reject) => {
+    promiseResolve = resolve;
+    promiseReject = reject;
+  });
+  const interval = setInterval(() => {
+    if (func()) {
+      clearInterval(interval);
+      promiseResolve(null);
+    }
+  }, 100);
+  setTimeout(() => {
+    clearInterval(interval);
+    promiseReject(new Error('waitUntil has timed out'));
+  }, 5000);
+  return promise;
+}
+
+/**
+ * Helper to sanitize a path by ensuring double quote characters are properly
+ * escaped.
+ */
+function sanitizePath(path: string): string {
+  return path.replace(/"/g, '\\"');
+}
 
 suite('<manage-mirrorsync>', () => {
   /* Holds the <manage-mirrorsync> app */
   let appHolder: HTMLDivElement;
   /* The <manage-mirrorsync> app, this gets cleared before every test */
   let manageMirrorSyncApp: HTMLElement;
+  /* The BrowserProxy element to make assertions on when methods are called */
+  let testProxy: ManageMirrorSyncTestBrowserProxy;
 
   /**
    * Runs prior to all the tests running, attaches a div to enable isolated
@@ -28,8 +81,10 @@
    */
   setup(() => {
     appHolder.innerHTML = '';
+    testProxy = new ManageMirrorSyncTestBrowserProxy();
+    BrowserProxy.setInstance(testProxy);
     manageMirrorSyncApp = document.createElement('manage-mirrorsync');
-    document.body.appendChild(manageMirrorSyncApp);
+    appHolder.appendChild(manageMirrorSyncApp);
   });
 
   /**
@@ -51,22 +106,160 @@
   /**
    * Returns the <folder-selector> element on the page.
    */
-  function getFolderSelector(): HTMLElement {
-    return queryMirrorSyncShadowRoot('folder-selector')!;
+  function getFolderSelector(): FolderSelector {
+    return (queryMirrorSyncShadowRoot('folder-selector')! as FolderSelector);
+  }
+
+  /**
+   * Queries elements in the <folder-selector> shadowRoot.
+   */
+  function queryFolderSelectorShadowRoot(selector: string): HTMLElement|null {
+    return getFolderSelector().shadowRoot!.querySelector(selector);
+  }
+
+  /**
+   * Show the <folder-selector> element by selecting the "Sync selected files or
+   * folders" button.
+   */
+  async function showFolderSelector(): Promise<void> {
+    // <folder-selection> should be hidden to call this method.
+    assertTrue(getFolderSelector().hidden);
+
+    // Click the "Sync selected files or folders" button to show the folder
+    // hierarchy web component.
+    queryMirrorSyncShadowRoot('#selected')!.click();
+
+    // Ensure the <folder-selector> element is visible after pressing the
+    // checkbox.
+    await waitUntil(() => getFolderSelector().hidden === false);
+  }
+
+  /**
+   * Queries all the input elements with data-full-path attributes. Elements
+   * with attributes but empty OR are not visible in the viewport are excluded.
+   * Returns a string array of the data-full-path values.
+   */
+  function getAllVisiblePaths(): string[] {
+    const elements = getFolderSelector().shadowRoot!.querySelectorAll(
+        'input[data-full-path]');
+    if (elements.length === 0) {
+      return [];
+    }
+    const paths: string[] = [];
+    for (const element of elements) {
+      const dataFullPath = element.getAttribute('data-full-path');
+      if (!dataFullPath || !isVisible(element)) {
+        continue;
+      }
+      paths.push(dataFullPath!);
+    }
+    return paths;
+  }
+
+  /**
+   * Wait until the visible paths are the supplied paths then assert that they
+   * actually match the `expectedPaths`.
+   */
+  async function waitAndAssertVisiblePaths(expectedPaths: string[]):
+      Promise<void> {
+    await waitUntil(() => getAllVisiblePaths().length === expectedPaths.length);
+    assertArrayEquals(getAllVisiblePaths(), expectedPaths);
+  }
+
+  function getInputElement(path: string): HTMLInputElement {
+    const element = queryFolderSelectorShadowRoot(
+        `input[data-full-path="${sanitizePath(path)}"]`);
+    assertNotEquals(element, null);
+    return (element as HTMLInputElement);
+  }
+
+  /**
+   * Helper method to expand a particular node in the tree to show all its
+   * children.
+   */
+  function expandPath(path: string) {
+    const input = getInputElement(path);
+    const liElement = input.parentElement as HTMLLIElement;
+    liElement.click();
   }
 
   test(
       'checking individual folder selection shows folder hierarchy',
       async () => {
-        // <folder-selection> should be hidden on startup.
-        assertTrue(getFolderSelector().hidden);
+        // Set result to return an empty array of paths.
+        testProxy.handler.setResultFor('getChildFolders', {paths: []});
 
-        // Click the "Sync selected files or folders" button to show the folder
-        // hierarchy web component.
-        queryMirrorSyncShadowRoot('#selected')!.click();
+        // Show the <folder-selector> element.
+        await showFolderSelector();
 
-        // Ensure the <folder-selector> element is visible after pressing the
-        // checkbox.
-        assertFalse(getFolderSelector().hidden);
+        // The only rendered path should be the root one.
+        await waitAndAssertVisiblePaths(['/']);
+      });
+
+  test(
+      'children of root should be rendered, but not their descendants',
+      async () => {
+        // Set result to return an empty array of paths.
+        testProxy.handler.setResultFor(
+            'getChildFolders',
+            {paths: [{path: '/foo'}, {path: '/foo/bar'}, {path: '/baz'}]});
+
+        // Show the <folder-selector> element.
+        await showFolderSelector();
+
+        // All top-level paths should be visible on startup, but `/foo/bar`
+        // should not be visible.
+        await waitAndAssertVisiblePaths(['/', '/foo', '/baz']);
+      });
+
+  test('when expanding an element its children should be visible', async () => {
+    // Set result to return an empty array of paths.
+    testProxy.handler.setResultFor(
+        'getChildFolders', {paths: [{path: '/foo'}, {path: '/foo/bar'}]});
+
+    // Show the <folder-selector> element.
+    await showFolderSelector();
+
+    // All top-level paths should be visible on startup, but `/foo/bar` should
+    // not be visible.
+    await waitAndAssertVisiblePaths(['/', '/foo']);
+
+    // Expand the /foo path which should make the /foo/bar path visible.
+    expandPath('/foo');
+
+    // After expanding expect that /foo/bar is now visible in the DOM.
+    await waitAndAssertVisiblePaths(['/', '/foo', '/foo/bar']);
+  });
+
+  test(
+      'selecting a path should make its children disabled on expansion',
+      async () => {
+        // Set result to return an empty array of paths.
+        testProxy.handler.setResultFor(
+            'getChildFolders', {paths: [{path: '/foo'}, {path: '/foo/bar'}]});
+
+        // Show the <folder-selector> element.
+        await showFolderSelector();
+
+        // All top-level paths should be visible on startup, but `/foo/bar`
+        // should not be visible.
+        await waitAndAssertVisiblePaths(['/', '/foo']);
+
+        // Select /foo then expand /foo.
+        getInputElement('/foo').click();
+        expandPath('/foo');
+
+        // After selecting and expanding /foo the /foo/bar path should be
+        // expanded.
+        await waitAndAssertVisiblePaths(['/', '/foo', '/foo/bar']);
+
+        // The path should also already be selected and disabled from selecting
+        // as its parent element is already selected.
+        assertTrue(getInputElement('/foo/bar').checked);
+        assertTrue(getInputElement('/foo/bar').disabled);
+
+        // Only the exact selected paths should be returned, not the descendants
+        // (despite being visually shown as checked).
+        assertArrayEquals(getFolderSelector().selectedPaths, ['/foo']);
       });
 });
diff --git a/chrome/test/data/webui/settings/OWNERS b/chrome/test/data/webui/settings/OWNERS
index 7d475a6..2c2215d 100644
--- a/chrome/test/data/webui/settings/OWNERS
+++ b/chrome/test/data/webui/settings/OWNERS
@@ -10,7 +10,7 @@
 per-file privacy_page_test.ts=sauski@google.com
 per-file privacy_guide_page_test.ts=rainhard@chromium.org,sauski@google.com
 per-file recent_site_permissions_test.ts=sauski@google.com
-per-file safety_check_page_test.ts=sauski@google.com
+per-file safety_check_page_test.ts=rainhard@chromium.org,sauski@google.com
 per-file secure_dns_interactive_test.ts=sauski@google.com
 per-file secure_dns_test.ts=sauski@google.com
 per-file security_keys_subpage_test.ts=sauski@google.com
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index 5802311..f289abb 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -250,6 +250,7 @@
         "app/server/win/server.h",
         "app/server/win/service_main.cc",
         "app/server/win/service_main.h",
+        "app/server/win/updater_legacy_idl.h",
         "app/server/win/wrl_classes.cc",
         "device_management/dm_storage_win.cc",
         "policy/win/group_policy_manager.cc",
diff --git a/chrome/updater/app/server/win/BUILD.gn b/chrome/updater/app/server/win/BUILD.gn
index 02d3d8f..adb966a 100644
--- a/chrome/updater/app/server/win/BUILD.gn
+++ b/chrome/updater/app/server/win/BUILD.gn
@@ -27,7 +27,6 @@
 midl("updater_idl_idl") {
   dynamic_guids = "ignore_proxy_stub," + uuid5_guids
 
-  header_file = "updater_idl.h"
   sources = [ "updater_idl.template" ]
 
   writes_tlb = true
@@ -52,33 +51,78 @@
 midl("updater_internal_idl_idl") {
   dynamic_guids = "ignore_proxy_stub," + uuid5_guids
 
-  header_file = "updater_internal_idl.h"
   sources = [ "updater_internal_idl.template" ]
 
   writes_tlb = true
 }
 
-midl("updater_legacy_idl_idl") {
-  header_file = "updater_legacy_idl.h"
+if (is_chrome_branded) {
+  idl_suffix = "chrome_branded"
+} else {
+  idl_suffix = "open_source"
+}
+
+# For cross compilation reasons, the IDL files are generated with different
+# names for chrome-branded and open source. The common template
+# `updater_legacy_idl.template` is copied to the appropriately  suffixed
+# template under the gen dir, and that copied template is used to then generate
+# the MIDL output with substitutible `defines` such as `UPDATER_LEGACY_LIB_UUID`
+# in the `midl("updater_legacy_idl_idl")` action.
+copy("copy_updater_legacy_idl_idl") {
   sources = [ "updater_legacy_idl.template" ]
+  outputs =
+      [ "$root_gen_dir/chrome/updater/updater_legacy_idl_$idl_suffix.template" ]
+}
 
-  # These are the Omaha 3 Legacy GUIDs that Omaha 4 supports.
-  defines = [
-    "UPDATER_LEGACY_LIB_UUID=69464FF0-D9EC-4037-A35F-8AE4358106CC",
-    "ICURRENTSTATE_IID=247954F9-9EDC-4E68-8CC3-150C2B89EADF",
-    "IGOOGLEUPDATE3WEB_IID=494B20CF-282E-4BDD-9F5D-B70CB09D351E",
-    "IAPPBUNDLEWEB_IID=DD42475D-6D46-496a-924E-BD5630B4CBBA",
-    "IAPPWEB_IID=18D0F672-18B4-48e6-AD36-6E6BF01DBBC4",
-    "IAPPCOMMANDWEB_IID=8476CE12-AE1F-4198-805C-BA0F9B783F57",
-    "IPOLICYSTATUS_IID=F63F6F8B-ACD5-413C-A44B-0409136D26CB",
-    "IPOLICYSTATUS2_IID=34527502-D3DB-4205-A69B-789B27EE0414",
-    "IPOLICYSTATUS3_IID=05A30352-EB25-45B6-8449-BCA7B0542CE5",
-    "IPOLICYSTATUSVALUE_IID=27634814-8E41-4C35-8577-980134A96544",
-    "IPROCESSLAUNCHER_IID=128C2DA6-2BC0-44c0-B3F6-4EC22E647964",
-    "IPROCESSLAUNCHER2_IID=D106AB5F-A70E-400E-A21B-96208C1D8DBB",
-  ]
-
+midl("updater_legacy_idl_idl") {
+  sources =
+      [ "$root_gen_dir/chrome/updater/updater_legacy_idl_$idl_suffix.template" ]
   writes_tlb = true
+
+  if (is_chrome_branded) {
+    # Google-specific Legacy GUIDs that Omaha 4 supports.
+    defines = [
+      "UPDATER_LEGACY_LIB_UUID=69464FF0-D9EC-4037-A35F-8AE4358106CC",
+      "GOOGLEUPDATE3WEBUSERCLASS_CLSID=22181302-A8A6-4f84-A541-E5CBFC70CC43",
+      "GOOGLEUPDATE3WEBSYSTEMCLASS_CLSID=8A1D4361-2C08-4700-A351-3EAA9CBFF5E4",
+      "POLICYSTATUSUSERCLASS_CLSID=6DDCE70D-A4AE-4E97-908C-BE7B2DB750AD",
+      "POLICYSTATUSSYSTEMCLASS_CLSID=521FDB42-7130-4806-822A-FC5163FAD983",
+      "PROCESSLAUNCHERCLASS_CLSID=ABC01078-F197-4b0b-ADBC-CFE684B39C82",
+      "ICURRENTSTATE_IID=247954F9-9EDC-4E68-8CC3-150C2B89EADF",
+      "IGOOGLEUPDATE3WEB_IID=494B20CF-282E-4BDD-9F5D-B70CB09D351E",
+      "IAPPBUNDLEWEB_IID=DD42475D-6D46-496a-924E-BD5630B4CBBA",
+      "IAPPWEB_IID=18D0F672-18B4-48e6-AD36-6E6BF01DBBC4",
+      "IAPPCOMMANDWEB_IID=8476CE12-AE1F-4198-805C-BA0F9B783F57",
+      "IPOLICYSTATUS_IID=F63F6F8B-ACD5-413C-A44B-0409136D26CB",
+      "IPOLICYSTATUS2_IID=34527502-D3DB-4205-A69B-789B27EE0414",
+      "IPOLICYSTATUS3_IID=05A30352-EB25-45B6-8449-BCA7B0542CE5",
+      "IPOLICYSTATUSVALUE_IID=27634814-8E41-4C35-8577-980134A96544",
+      "IPROCESSLAUNCHER_IID=128C2DA6-2BC0-44c0-B3F6-4EC22E647964",
+      "IPROCESSLAUNCHER2_IID=D106AB5F-A70E-400E-A21B-96208C1D8DBB",
+    ]
+  } else {
+    defines = [
+      "UPDATER_LEGACY_LIB_UUID=4C61BB05-94D1-4BAB-B69C-C34195AF92CA",
+      "GOOGLEUPDATE3WEBUSERCLASS_CLSID=75828ED1-7BE8-45D0-8950-AA85CBF74510",
+      "GOOGLEUPDATE3WEBSYSTEMCLASS_CLSID=283209B7-C761-41CA-BE8D-B5321CD78FD6",
+      "POLICYSTATUSUSERCLASS_CLSID=4DAC24AB-B340-4B7E-AD01-1504A7F59EEA",
+      "POLICYSTATUSSYSTEMCLASS_CLSID=83FE19AC-72A6-4A72-B136-724444121586",
+      "PROCESSLAUNCHERCLASS_CLSID=811A664F-703E-407C-A323-E6E31D1EFFA0",
+      "ICURRENTSTATE_IID=BE5D3E90-A66C-4A0A-9B7B-1A6B9BF3971E",
+      "IGOOGLEUPDATE3WEB_IID=027234BD-61BB-4F5C-9386-7FE804171C8C",
+      "IAPPBUNDLEWEB_IID=D734C877-21F4-496E-B857-3E5B2E72E4CC",
+      "IAPPWEB_IID=2C6218B9-088D-4D25-A4F8-570558124142",
+      "IAPPCOMMANDWEB_IID=87DBF75E-F590-4802-93FD-F8D07800E2E9",
+      "IPOLICYSTATUS_IID=7D908375-C9D0-44C5-BB98-206F3C24A74C",
+      "IPOLICYSTATUS2_IID=9D31EA63-2E06-4D41-98C7-CB1F307DB597",
+      "IPOLICYSTATUS3_IID=5C674FC1-80E3-48D2-987B-79D9D286065B",
+      "IPOLICYSTATUSVALUE_IID=47C8886A-A4B5-4F6C-865A-41A207074DFA",
+      "IPROCESSLAUNCHER_IID=EED70106-3604-4385-866E-6D540E99CA1A",
+      "IPROCESSLAUNCHER2_IID=BAEE6326-C925-4FA4-AFE9-5FA69902B021",
+    ]
+  }
+
+  deps = [ ":copy_updater_legacy_idl_idl" ]
 }
 
 # The COM server needs to work with Windows 7, so explicitly setting the defines
diff --git a/chrome/updater/app/server/win/com_classes_legacy.cc b/chrome/updater/app/server/win/com_classes_legacy.cc
index cd9e45f..4928067 100644
--- a/chrome/updater/app/server/win/com_classes_legacy.cc
+++ b/chrome/updater/app/server/win/com_classes_legacy.cc
@@ -33,6 +33,7 @@
 #include "base/win/scoped_bstr.h"
 #include "base/win/scoped_handle.h"
 #include "base/win/scoped_process_information.h"
+#include "base/win/win_util.h"
 #include "chrome/updater/app/server/win/server.h"
 #include "chrome/updater/constants.h"
 #include "chrome/updater/external_constants.h"
@@ -680,7 +681,8 @@
           type_lib->GetTypeInfoOfGuid(__uuidof(IAppCommandWeb), &type_info_);
       FAILED(hr)) {
     LOG(ERROR) << __func__ << " ::GetTypeInfoOfGuid failed"
-               << ": " << std::hex << hr;
+               << ": " << std::hex << hr << ": IID_IAppCommand: "
+               << base::win::WStringFromGUID(__uuidof(IAppCommandWeb));
     return hr;
   }
 
diff --git a/chrome/updater/app/server/win/updater_legacy_idl.h b/chrome/updater/app/server/win/updater_legacy_idl.h
new file mode 100644
index 0000000..6cc6430
--- /dev/null
+++ b/chrome/updater/app/server/win/updater_legacy_idl.h
@@ -0,0 +1,20 @@
+// Copyright 2022 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.
+//
+// This header is used to encapsulate choosing between including either the
+// chrome-branded or the open-source `updater_legacy_idl` headers. This reduces
+// the `BUILDFLAG(GOOGLE_CHROME_BRANDING)` clutter.
+
+#ifndef CHROME_UPDATER_APP_SERVER_WIN_UPDATER_LEGACY_IDL_H_
+#define CHROME_UPDATER_APP_SERVER_WIN_UPDATER_LEGACY_IDL_H_
+
+#include "build/branding_buildflags.h"
+
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#include "chrome/updater/app/server/win/updater_legacy_idl_chrome_branded.h"
+#else
+#include "chrome/updater/app/server/win/updater_legacy_idl_open_source.h"
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
+#endif  // CHROME_UPDATER_APP_SERVER_WIN_UPDATER_LEGACY_IDL_H_
diff --git a/chrome/updater/app/server/win/updater_legacy_idl.template b/chrome/updater/app/server/win/updater_legacy_idl.template
index e2140fb..c44cc342 100644
--- a/chrome/updater/app/server/win/updater_legacy_idl.template
+++ b/chrome/updater/app/server/win/updater_legacy_idl.template
@@ -511,7 +511,7 @@
   importlib("stdole2.tlb");
 
   [
-    uuid(22181302-A8A6-4f84-A541-E5CBFC70CC43),
+    uuid(GOOGLEUPDATE3WEBUSERCLASS_CLSID),
     helpstring("GoogleUpdate3WebUserClass Class")
   ]
   coclass GoogleUpdate3WebUserClass
@@ -520,7 +520,7 @@
   }
 
   [
-    uuid(8A1D4361-2C08-4700-A351-3EAA9CBFF5E4),
+    uuid(GOOGLEUPDATE3WEBSYSTEMCLASS_CLSID),
     helpstring("GoogleUpdate3WebSystemClass")
   ]
   coclass GoogleUpdate3WebSystemClass {
@@ -528,7 +528,7 @@
   }
 
   [
-    uuid(6DDCE70D-A4AE-4E97-908C-BE7B2DB750AD),
+    uuid(POLICYSTATUSUSERCLASS_CLSID),
     helpstring("Policy Status for per-user applications.")
   ]
   coclass PolicyStatusUserClass {
@@ -536,7 +536,7 @@
   }
 
   [
-    uuid(521FDB42-7130-4806-822A-FC5163FAD983),
+    uuid(POLICYSTATUSSYSTEMCLASS_CLSID),
     helpstring("Policy Status for system applications.")
   ]
   coclass PolicyStatusSystemClass {
@@ -544,7 +544,7 @@
   }
 
   [
-    uuid(ABC01078-F197-4b0b-ADBC-CFE684B39C82),
+    uuid(PROCESSLAUNCHERCLASS_CLSID),
     helpstring("ProcessLauncherClass Class")
   ]
   coclass ProcessLauncherClass {
diff --git a/chrome/updater/app/server/win/wrl_classes.cc b/chrome/updater/app/server/win/wrl_classes.cc
index f3d1cbf..74b0be9 100644
--- a/chrome/updater/app/server/win/wrl_classes.cc
+++ b/chrome/updater/app/server/win/wrl_classes.cc
@@ -4,7 +4,6 @@
 
 #include <wrl/module.h>
 
-#include "build/branding_buildflags.h"
 #include "chrome/updater/app/server/win/com_classes.h"
 #include "chrome/updater/app/server/win/com_classes_legacy.h"
 
@@ -33,8 +32,6 @@
 CoCreatableClassWithFactoryEx(UpdaterSystemClass,
                               Microsoft::WRL::SimpleClassFactory<UpdaterImpl>,
                               ActiveSystem);
-
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 CoCreatableClassWithFactoryEx(
     GoogleUpdate3WebSystemClass,
     Microsoft::WRL::SimpleClassFactory<LegacyOnDemandImpl>,
@@ -47,13 +44,10 @@
     PolicyStatusSystemClass,
     Microsoft::WRL::SimpleClassFactory<PolicyStatusImpl>,
     ActiveSystem);
-#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
 CoCreatableClassWithFactoryEx(UpdaterUserClass,
                               Microsoft::WRL::SimpleClassFactory<UpdaterImpl>,
                               ActiveUser);
-
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 CoCreatableClassWithFactoryEx(
     GoogleUpdate3WebUserClass,
     Microsoft::WRL::SimpleClassFactory<LegacyOnDemandImpl>,
@@ -62,7 +56,6 @@
     PolicyStatusUserClass,
     Microsoft::WRL::SimpleClassFactory<PolicyStatusImpl>,
     ActiveUser);
-#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
 CoCreatableClassWithFactoryEx(
     UpdaterInternalSystemClass,
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc
index f54cc16f..05fe1d7 100644
--- a/chrome/updater/test/integration_tests.cc
+++ b/chrome/updater/test/integration_tests.cc
@@ -555,7 +555,7 @@
   Clean();
 }
 
-#if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#if BUILDFLAG(IS_WIN)
 TEST_F(IntegrationTest, LegacyUpdate3Web) {
   ScopedServer test_server(test_commands_);
   Install();
@@ -624,7 +624,7 @@
   WaitForUpdaterExit();
   ExpectClean();
 }
-#endif  // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#endif  // BUILDFLAG(IS_WIN)
 
 TEST_F(IntegrationTest, UnregisterUninstalledApp) {
   Install();
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc
index 068b1e1..fa719f6 100644
--- a/chrome/updater/test/integration_tests_win.cc
+++ b/chrome/updater/test/integration_tests_win.cc
@@ -39,7 +39,6 @@
 #include "base/win/registry.h"
 #include "base/win/scoped_bstr.h"
 #include "base/win/scoped_variant.h"
-#include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "chrome/updater/app/server/win/updater_idl.h"
 #include "chrome/updater/app/server/win/updater_internal_idl.h"
@@ -646,36 +645,34 @@
     Microsoft::WRL::ComPtr<IUpdater> updater;
     EXPECT_HRESULT_SUCCEEDED(updater_server.As(&updater));
 
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
     Microsoft::WRL::ComPtr<IUnknown> updater_legacy_server;
-    EXPECT_HRESULT_SUCCEEDED(::CoCreateInstance(
+    ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance(
         scope == UpdaterScope::kSystem ? __uuidof(GoogleUpdate3WebSystemClass)
                                        : __uuidof(GoogleUpdate3WebUserClass),
         nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&updater_legacy_server)));
     Microsoft::WRL::ComPtr<IGoogleUpdate3Web> google_update;
-    EXPECT_HRESULT_SUCCEEDED(updater_legacy_server.As(&google_update));
+    ASSERT_HRESULT_SUCCEEDED(updater_legacy_server.As(&google_update));
     Microsoft::WRL::ComPtr<IAppBundleWeb> app_bundle;
     Microsoft::WRL::ComPtr<IDispatch> dispatch;
-    EXPECT_HRESULT_SUCCEEDED(google_update->createAppBundleWeb(&dispatch));
+    ASSERT_HRESULT_SUCCEEDED(google_update->createAppBundleWeb(&dispatch));
     EXPECT_HRESULT_SUCCEEDED(dispatch.As(&app_bundle));
 
     Microsoft::WRL::ComPtr<IUnknown> policy_status_server;
-    EXPECT_HRESULT_SUCCEEDED(::CoCreateInstance(
+    ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance(
         scope == UpdaterScope::kSystem ? __uuidof(PolicyStatusSystemClass)
                                        : __uuidof(PolicyStatusUserClass),
         nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&policy_status_server)));
     Microsoft::WRL::ComPtr<IPolicyStatus2> policy_status2;
-    EXPECT_HRESULT_SUCCEEDED(policy_status_server.As(&policy_status2));
+    ASSERT_HRESULT_SUCCEEDED(policy_status_server.As(&policy_status2));
     base::win::ScopedBstr updater_version;
-    EXPECT_HRESULT_SUCCEEDED(
+    ASSERT_HRESULT_SUCCEEDED(
         policy_status2->get_updaterVersion(updater_version.Receive()));
     EXPECT_STREQ(updater_version.Get(), kUpdaterVersionUtf16);
-#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
   }
 
   // IUpdaterInternal.
   Microsoft::WRL::ComPtr<IUnknown> updater_internal_server;
-  EXPECT_HRESULT_SUCCEEDED(::CoCreateInstance(
+  ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance(
       scope == UpdaterScope::kSystem ? __uuidof(UpdaterInternalSystemClass)
                                      : __uuidof(UpdaterInternalUserClass),
       nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&updater_internal_server)));
@@ -683,23 +680,22 @@
   EXPECT_HRESULT_SUCCEEDED(updater_internal_server.As(&updater_internal));
 }
 
-HRESULT InitializeBundle(UpdaterScope scope,
-                         Microsoft::WRL::ComPtr<IAppBundleWeb>& bundle_web) {
+void InitializeBundle(UpdaterScope scope,
+                      Microsoft::WRL::ComPtr<IAppBundleWeb>& bundle_web) {
   Microsoft::WRL::ComPtr<IGoogleUpdate3Web> update3web;
-  EXPECT_HRESULT_SUCCEEDED(::CoCreateInstance(
+  ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance(
       scope == UpdaterScope::kSystem ? __uuidof(GoogleUpdate3WebSystemClass)
                                      : __uuidof(GoogleUpdate3WebUserClass),
       nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&update3web)));
 
   Microsoft::WRL::ComPtr<IAppBundleWeb> bundle;
   Microsoft::WRL::ComPtr<IDispatch> dispatch;
-  EXPECT_HRESULT_SUCCEEDED(update3web->createAppBundleWeb(&dispatch));
-  EXPECT_HRESULT_SUCCEEDED(dispatch.As(&bundle));
+  ASSERT_HRESULT_SUCCEEDED(update3web->createAppBundleWeb(&dispatch));
+  ASSERT_HRESULT_SUCCEEDED(dispatch.As(&bundle));
 
   EXPECT_HRESULT_SUCCEEDED(bundle->initialize());
 
   bundle_web = bundle;
-  return S_OK;
 }
 
 HRESULT DoLoopUntilDone(Microsoft::WRL::ComPtr<IAppBundleWeb> bundle,
@@ -866,7 +862,7 @@
                  int expected_final_state,
                  HRESULT expected_error_code) {
   Microsoft::WRL::ComPtr<IAppBundleWeb> bundle;
-  EXPECT_HRESULT_SUCCEEDED(InitializeBundle(scope, bundle));
+  InitializeBundle(scope, bundle);
   EXPECT_HRESULT_SUCCEEDED(bundle->createInstalledApp(appid.Get()));
   EXPECT_HRESULT_SUCCEEDED(bundle->checkForUpdate());
   return DoLoopUntilDone(bundle, expected_final_state, expected_error_code);
@@ -909,10 +905,9 @@
     return;
 
   Microsoft::WRL::ComPtr<IProcessLauncher> process_launcher;
-  EXPECT_HRESULT_SUCCEEDED(::CoCreateInstance(__uuidof(ProcessLauncherClass),
+  ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance(__uuidof(ProcessLauncherClass),
                                               nullptr, CLSCTX_LOCAL_SERVER,
                                               IID_PPV_ARGS(&process_launcher)));
-  EXPECT_TRUE(process_launcher);
 
   constexpr wchar_t kAppId1[] = L"{831EF4D0-B729-4F61-AA34-91526481799D}";
   constexpr wchar_t kCommandId[] = L"CmdExit0";
@@ -956,7 +951,7 @@
   SetupAppCommand(scope, appid, commandid, temp_dir);
 
   Microsoft::WRL::ComPtr<IAppBundleWeb> bundle;
-  ASSERT_HRESULT_SUCCEEDED(InitializeBundle(scope, bundle));
+  InitializeBundle(scope, bundle);
   ASSERT_HRESULT_SUCCEEDED(
       bundle->createInstalledApp(base::win::ScopedBstr(appid).Get()));
 
diff --git a/chrome/updater/win/BUILD.gn b/chrome/updater/win/BUILD.gn
index 2d9ef804..db07c99 100644
--- a/chrome/updater/win/BUILD.gn
+++ b/chrome/updater/win/BUILD.gn
@@ -32,8 +32,16 @@
     "updater.rc",
   ]
 
+  if (is_chrome_branded) {
+    defines = [ "CHROME_BRANDED_TLB=1" ]
+  } else {
+    defines = [ "CHROME_BRANDED_TLB=0" ]
+  }
+
   deps = [
+    "//build:branding_buildflags",
     "//chrome/updater:base",
+    "//chrome/updater/app/server/win:updater_legacy_idl_idl",
     "//chrome/updater/win/ui/resources",
   ]
 
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc
index 5f3c375..09841da1 100644
--- a/chrome/updater/win/setup/setup_util.cc
+++ b/chrome/updater/win/setup/setup_util.cc
@@ -22,7 +22,6 @@
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/win_util.h"
-#include "build/branding_buildflags.h"
 #include "chrome/installer/util/install_service_work_item.h"
 #include "chrome/installer/util/registry_util.h"
 #include "chrome/installer/util/work_item_list.h"
@@ -114,17 +113,25 @@
 
 std::vector<IID> GetActiveInterfaces() {
   return {
-    __uuidof(IUpdateState), __uuidof(IUpdater), __uuidof(IUpdaterObserver),
-        __uuidof(IUpdaterRegisterAppCallback), __uuidof(IUpdaterCallback),
+      __uuidof(IUpdateState),
+      __uuidof(IUpdater),
+      __uuidof(IUpdaterObserver),
+      __uuidof(IUpdaterRegisterAppCallback),
+      __uuidof(IUpdaterCallback),
 
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-        __uuidof(IAppBundleWeb), __uuidof(IAppWeb), __uuidof(IAppCommandWeb),
-        __uuidof(ICompleteStatus), __uuidof(ICurrentState),
-        __uuidof(IGoogleUpdate3Web), __uuidof(IPolicyStatus),
-        __uuidof(IPolicyStatus2), __uuidof(IPolicyStatus3),
-        __uuidof(IPolicyStatusValue), __uuidof(IProcessLauncher),
-        __uuidof(IProcessLauncher2),
-#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+      // legacy interfaces.
+      __uuidof(IAppBundleWeb),
+      __uuidof(IAppWeb),
+      __uuidof(IAppCommandWeb),
+      __uuidof(ICompleteStatus),
+      __uuidof(ICurrentState),
+      __uuidof(IGoogleUpdate3Web),
+      __uuidof(IPolicyStatus),
+      __uuidof(IPolicyStatus2),
+      __uuidof(IPolicyStatus3),
+      __uuidof(IPolicyStatusValue),
+      __uuidof(IProcessLauncher),
+      __uuidof(IProcessLauncher2),
   };
 }
 
@@ -141,21 +148,16 @@
   switch (scope) {
     case UpdaterScope::kUser:
       return {
-        __uuidof(UpdaterUserClass),
-
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-            __uuidof(GoogleUpdate3WebUserClass),
-            __uuidof(PolicyStatusUserClass),
-#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+          __uuidof(UpdaterUserClass),
+          __uuidof(GoogleUpdate3WebUserClass),
+          __uuidof(PolicyStatusUserClass),
       };
     case UpdaterScope::kSystem:
       return {
-        __uuidof(UpdaterSystemClass),
-
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-            __uuidof(GoogleUpdate3WebSystemClass),
-            __uuidof(PolicyStatusSystemClass), __uuidof(ProcessLauncherClass),
-#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+          __uuidof(UpdaterSystemClass),
+          __uuidof(GoogleUpdate3WebSystemClass),
+          __uuidof(PolicyStatusSystemClass),
+          __uuidof(ProcessLauncherClass),
       };
   }
 }
diff --git a/chrome/updater/win/ui/resources/resources_en.rc b/chrome/updater/win/ui/resources/resources_en.rc
index 1e9a51f..11e0f27f 100644
--- a/chrome/updater/win/ui/resources/resources_en.rc
+++ b/chrome/updater/win/ui/resources/resources_en.rc
@@ -55,6 +55,3 @@
     CTEXT           "",IDC_YES_NO_TEXT,7,17,244,34
 END
 
-1 TYPELIB "chrome/updater/app/server/win/updater_idl.tlb"
-2 TYPELIB "chrome/updater/app/server/win/updater_internal_idl.tlb"
-3 TYPELIB "chrome/updater/app/server/win/updater_legacy_idl.tlb"
diff --git a/chrome/updater/win/updater.rc b/chrome/updater/win/updater.rc
index d06565c..f9ab5c3 100644
--- a/chrome/updater/win/updater.rc
+++ b/chrome/updater/win/updater.rc
@@ -3,3 +3,15 @@
 // found in the LICENSE file.
 
 #include "chrome/updater/win/ui/resources/resources_en.rc"
+
+// Language-neutral resources.
+
+1 TYPELIB "chrome/updater/app/server/win/updater_idl.tlb"
+2 TYPELIB "chrome/updater/app/server/win/updater_internal_idl.tlb"
+
+#if CHROME_BRANDED_TLB == 1
+3 TYPELIB "chrome/updater/app/server/win/updater_legacy_idl_chrome_branded.tlb"
+#elif CHROME_BRANDED_TLB == 0
+3 TYPELIB "chrome/updater/app/server/win/updater_legacy_idl_open_source.tlb"
+#endif  // CHROME_BRANDED_TLB == 1
+
diff --git a/chromeos/ash/components/dbus/cros_disks/cros_disks_client.cc b/chromeos/ash/components/dbus/cros_disks/cros_disks_client.cc
index 124c44f..5bed7e6 100644
--- a/chromeos/ash/components/dbus/cros_disks/cros_disks_client.cc
+++ b/chromeos/ash/components/dbus/cros_disks/cros_disks_client.cc
@@ -58,26 +58,26 @@
 // changes in cros-disks.
 DeviceType DeviceMediaTypeToDeviceType(uint32_t media_type_uint32) {
   if (!IsValidMediaType(media_type_uint32))
-    return DEVICE_TYPE_UNKNOWN;
+    return DeviceType::kUnknown;
 
   cros_disks::DeviceMediaType media_type =
       cros_disks::DeviceMediaType(media_type_uint32);
 
   switch (media_type) {
     case (cros_disks::DEVICE_MEDIA_UNKNOWN):
-      return DEVICE_TYPE_UNKNOWN;
+      return DeviceType::kUnknown;
     case (cros_disks::DEVICE_MEDIA_USB):
-      return DEVICE_TYPE_USB;
+      return DeviceType::kUSB;
     case (cros_disks::DEVICE_MEDIA_SD):
-      return DEVICE_TYPE_SD;
+      return DeviceType::kSD;
     case (cros_disks::DEVICE_MEDIA_OPTICAL_DISC):
-      return DEVICE_TYPE_OPTICAL_DISC;
+      return DeviceType::kOpticalDisc;
     case (cros_disks::DEVICE_MEDIA_MOBILE):
-      return DEVICE_TYPE_MOBILE;
+      return DeviceType::kMobile;
     case (cros_disks::DEVICE_MEDIA_DVD):
-      return DEVICE_TYPE_DVD;
+      return DeviceType::kDVD;
     default:
-      return DEVICE_TYPE_UNKNOWN;
+      return DeviceType::kUnknown;
   }
 }
 
@@ -630,7 +630,7 @@
       is_hidden_(true),
       is_virtual_(false),
       is_auto_mountable_(false),
-      device_type_(DEVICE_TYPE_UNKNOWN),
+      device_type_(DeviceType::kUnknown),
       total_size_in_bytes_(0) {
   InitializeFromResponse(response);
 }
diff --git a/chromeos/ash/components/dbus/cros_disks/cros_disks_client.h b/chromeos/ash/components/dbus/cros_disks/cros_disks_client.h
index e4288271..8143ac3 100644
--- a/chromeos/ash/components/dbus/cros_disks/cros_disks_client.h
+++ b/chromeos/ash/components/dbus/cros_disks/cros_disks_client.h
@@ -40,23 +40,24 @@
   kNetworkStorage,
 };
 
+// Type of device.
+enum class DeviceType {
+  kUnknown,
+  kUSB,          // USB stick.
+  kSD,           // SD card.
+  kOpticalDisc,  // e.g. Optical disc excluding DVD.
+  kMobile,       // Storage on a mobile device (e.g. Android).
+  kDVD,          // DVD.
+};
+
 }  // namespace ash
 
 namespace chromeos {
 
 // TODO(https://crbug.com/1164001): remove when the migration is finished.
+using ::ash::DeviceType;
 using ::ash::MountType;
 
-// Type of device.
-enum DeviceType {
-  DEVICE_TYPE_UNKNOWN,
-  DEVICE_TYPE_USB,           // USB stick.
-  DEVICE_TYPE_SD,            // SD card.
-  DEVICE_TYPE_OPTICAL_DISC,  // e.g. Optical disc excluding DVD.
-  DEVICE_TYPE_MOBILE,        // Storage on a mobile device (e.g. Android).
-  DEVICE_TYPE_DVD,           // DVD.
-};
-
 // Mount error code used by cros-disks.
 // These values are NOT the same as cros_disks::MountErrorType.
 // These values are persisted to logs. Entries should not be renumbered and
@@ -454,12 +455,6 @@
 using ::chromeos::CROS_DISKS_DISK_ADDED;
 using ::chromeos::CROS_DISKS_DISK_REMOVED;
 using ::chromeos::CrosDisksClient;
-using ::chromeos::DEVICE_TYPE_MOBILE;
-using ::chromeos::DEVICE_TYPE_OPTICAL_DISC;
-using ::chromeos::DEVICE_TYPE_SD;
-using ::chromeos::DEVICE_TYPE_UNKNOWN;
-using ::chromeos::DEVICE_TYPE_USB;
-using ::chromeos::DeviceType;
 using ::chromeos::DiskInfo;
 using ::chromeos::FORMAT_ERROR_DEVICE_NOT_ALLOWED;
 using ::chromeos::FORMAT_ERROR_NONE;
diff --git a/chromeos/ash/components/dbus/cros_disks/cros_disks_client_unittest.cc b/chromeos/ash/components/dbus/cros_disks/cros_disks_client_unittest.cc
index 2ceecff6..634122d 100644
--- a/chromeos/ash/components/dbus/cros_disks/cros_disks_client_unittest.cc
+++ b/chromeos/ash/components/dbus/cros_disks/cros_disks_client_unittest.cc
@@ -154,7 +154,7 @@
   EXPECT_EQ(kIdLabel, result.label());
   EXPECT_EQ(kIdUuid, result.uuid());
   EXPECT_EQ(kDeviceSize, result.total_size_in_bytes());
-  EXPECT_EQ(DEVICE_TYPE_SD, result.device_type());
+  EXPECT_EQ(DeviceType::kSD, result.device_type());
   EXPECT_EQ(kMountPath, result.mount_path());
   EXPECT_EQ(kFileSystemType, result.file_system_type());
   EXPECT_EQ(kIsAutoMountable, result.is_auto_mountable());
diff --git a/chromeos/ash/components/network/metrics/connection_results.cc b/chromeos/ash/components/network/metrics/connection_results.cc
index 0439173..a12b9d2e 100644
--- a/chromeos/ash/components/network/metrics/connection_results.cc
+++ b/chromeos/ash/components/network/metrics/connection_results.cc
@@ -7,7 +7,7 @@
 #include "chromeos/ash/components/network/network_connection_handler.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
-namespace chromeos {
+namespace ash {
 
 ShillConnectResult ShillErrorToConnectResult(const std::string& error_name) {
   // Flimflam error options.
@@ -197,4 +197,4 @@
   return UserInitiatedConnectResult::kUnknown;
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/metrics/connection_results.h b/chromeos/ash/components/network/metrics/connection_results.h
index d3ce89a..be2fb37f 100644
--- a/chromeos/ash/components/network/metrics/connection_results.h
+++ b/chromeos/ash/components/network/metrics/connection_results.h
@@ -9,7 +9,7 @@
 
 #include "base/component_export.h"
 
-namespace chromeos {
+namespace ash {
 
 // Result of state changes to a network triggered by any connection
 // attempt. With the exception of kSuccess and kUnknown, these enums are
@@ -131,6 +131,11 @@
 UserInitiatedConnectResult NetworkConnectionErrorToConnectResult(
     const std::string& error_name);
 
-}  // namespace chromeos
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::ShillConnectResult;
+}
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_METRICS_CONNECTION_RESULTS_H_
diff --git a/chromeos/ash/components/network/metrics/network_metrics_helper.cc b/chromeos/ash/components/network/metrics/network_metrics_helper.cc
index c7ade165..5606ce7 100644
--- a/chromeos/ash/components/network/metrics/network_metrics_helper.cc
+++ b/chromeos/ash/components/network/metrics/network_metrics_helper.cc
@@ -13,10 +13,15 @@
 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
+// TODO(https://crbug.com/1164001): remove after migrating to ash.
+namespace network_config {
+namespace mojom = ::chromeos::network_config::mojom;
+}
+
 const char kNetworkMetricsPrefix[] = "Network.Ash.";
 const char kAllConnectionResultSuffix[] = ".ConnectionResult.All";
 const char kUserInitiatedConnectionResultSuffix[] =
@@ -257,4 +262,4 @@
 
 NetworkMetricsHelper::~NetworkMetricsHelper() = default;
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/metrics/network_metrics_helper.h b/chromeos/ash/components/network/metrics/network_metrics_helper.h
index 1f0c1bd..ad30be4 100644
--- a/chromeos/ash/components/network/metrics/network_metrics_helper.h
+++ b/chromeos/ash/components/network/metrics/network_metrics_helper.h
@@ -9,7 +9,7 @@
 #include "chromeos/ash/components/network/network_state_handler.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
+namespace ash {
 
 // Provides APIs for logging to general network metrics that apply to all
 // network types and their variants.
@@ -59,6 +59,11 @@
   ~NetworkMetricsHelper();
 };
 
-}  // namespace chromeos
+}  // namespace ash
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::NetworkMetricsHelper;
+}
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_METRICS_NETWORK_METRICS_HELPER_H_
diff --git a/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc b/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc
index a635243..df5429d9 100644
--- a/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc
+++ b/chromeos/ash/components/network/metrics/network_metrics_helper_unittest.cc
@@ -18,7 +18,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -608,4 +608,4 @@
                                       0);
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/network_connection_handler_impl.cc b/chromeos/ash/components/network/network_connection_handler_impl.cc
index 59585e7..e2d2fc2 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl.cc
+++ b/chromeos/ash/components/network/network_connection_handler_impl.cc
@@ -1049,7 +1049,7 @@
       // If a profile path was specified, set it on a successful connection.
       configuration_handler_->SetNetworkProfile(
           service_path, request->profile_path, base::DoNothing(),
-          chromeos::network_handler::ErrorCallback());
+          network_handler::ErrorCallback());
     }
     InvokeConnectSuccessCallback(request->service_path,
                                  std::move(request->success_callback));
diff --git a/chromeos/ash/components/network/network_event_log.cc b/chromeos/ash/components/network/network_event_log.cc
index be011bd..a8baac7 100644
--- a/chromeos/ash/components/network/network_event_log.cc
+++ b/chromeos/ash/components/network/network_event_log.cc
@@ -23,7 +23,7 @@
 
 }  // namespace
 
-namespace chromeos {
+namespace ash {
 
 // Returns a descriptive unique id for |network|
 // e.g.: ethernet_0, wifi_psk_1, cellular_lte_2, vpn_openvpn_3.
@@ -90,4 +90,4 @@
   return guid;
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/network_event_log.h b/chromeos/ash/components/network/network_event_log.h
index 5bb70b0..b78a086 100644
--- a/chromeos/ash/components/network/network_event_log.h
+++ b/chromeos/ash/components/network/network_event_log.h
@@ -8,11 +8,11 @@
 #include <string>
 
 #include "base/component_export.h"
-// TODO(https://crbug.com/1164001): move to forward declaration
-#include "chromeos/ash/components/network/network_state.h"
 #include "components/device_event_log/device_event_log.h"
 
-namespace chromeos {
+namespace ash {
+
+class NetworkState;
 
 // Returns a consistent network identifier for logs. If |network| is null
 // returns "<none>".
@@ -29,13 +29,12 @@
 COMPONENT_EXPORT(CHROMEOS_NETWORK)
 std::string NetworkGuidId(const std::string& guid);
 
-}  // namespace chromeos
-
-// TODO(https://crbug.com/1164001): remove when moved to ash.
-namespace ash {
-using ::chromeos::NetworkGuidId;
-using ::chromeos::NetworkId;
-using ::chromeos::NetworkPathId;
 }  // namespace ash
 
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::NetworkGuidId;
+using ::ash::NetworkPathId;
+}  // namespace chromeos
+
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_EVENT_LOG_H_
diff --git a/chromeos/ash/components/network/network_event_log_unittest.cc b/chromeos/ash/components/network/network_event_log_unittest.cc
index fcb6f3b..143ce93 100644
--- a/chromeos/ash/components/network/network_event_log_unittest.cc
+++ b/chromeos/ash/components/network/network_event_log_unittest.cc
@@ -14,7 +14,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
-namespace chromeos {
+namespace ash {
 
 class NetworkEventLogTest : public testing::Test {
  public:
@@ -155,4 +155,4 @@
   EXPECT_EQ("wifi99_guid", NetworkGuidId("wifi99_guid"));
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/network_handler_callbacks.cc b/chromeos/ash/components/network/network_handler_callbacks.cc
index 1ddbf1b..3546bd4 100644
--- a/chromeos/ash/components/network/network_handler_callbacks.cc
+++ b/chromeos/ash/components/network/network_handler_callbacks.cc
@@ -21,8 +21,7 @@
 
 }  // namespace
 
-namespace chromeos {
-namespace network_handler {
+namespace ash::network_handler {
 
 // This message is not user-facing, it should only appear in logs.
 const char kDBusFailedError[] = "Error.DBusFailed";
@@ -55,5 +54,4 @@
   std::move(error_callback).Run(error_name);
 }
 
-}  // namespace network_handler
-}  // namespace chromeos
+}  // namespace ash::network_handler
diff --git a/chromeos/ash/components/network/network_handler_callbacks.h b/chromeos/ash/components/network/network_handler_callbacks.h
index cb4d9a0e..759c493 100644
--- a/chromeos/ash/components/network/network_handler_callbacks.h
+++ b/chromeos/ash/components/network/network_handler_callbacks.h
@@ -14,8 +14,7 @@
 #include "chromeos/dbus/common/dbus_method_call_status.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
-namespace network_handler {
+namespace ash::network_handler {
 
 COMPONENT_EXPORT(CHROMEOS_NETWORK) extern const char kDBusFailedError[];
 
@@ -58,12 +57,11 @@
                                 const std::string& dbus_error_name,
                                 const std::string& dbus_error_message);
 
-}  // namespace network_handler
-}  // namespace chromeos
+}  // namespace ash::network_handler
 
-namespace ash {
-// TODO(https://crbug.com/1164001): remove when moved to ash.
-namespace network_handler = ::chromeos::network_handler;
-}  // namespace ash
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+namespace network_handler = ::ash::network_handler;
+}
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_NETWORK_HANDLER_CALLBACKS_H_
diff --git a/chromeos/ash/components/network/network_state_unittest.cc b/chromeos/ash/components/network/network_state_unittest.cc
index 1df016ca..160205f 100644
--- a/chromeos/ash/components/network/network_state_unittest.cc
+++ b/chromeos/ash/components/network/network_state_unittest.cc
@@ -21,7 +21,7 @@
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -488,4 +488,4 @@
   EXPECT_EQ(kTestGuid, *dictionary.FindStringKey(shill::kGuidProperty));
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/shill_property_handler.cc b/chromeos/ash/components/network/shill_property_handler.cc
index cd5aa089..8cf4cb72 100644
--- a/chromeos/ash/components/network/shill_property_handler.cc
+++ b/chromeos/ash/components/network/shill_property_handler.cc
@@ -43,8 +43,7 @@
 
 }  // namespace
 
-namespace chromeos {
-namespace internal {
+namespace ash::internal {
 
 // Class to manage Shill service property changed observers. Observers are
 // added on construction and removed on destruction. Runs the handler when
@@ -164,8 +163,8 @@
         prohibited_technologies_.end()) {
       NET_LOG(ERROR) << "Attempt to enable prohibited network technology: "
                      << technology;
-      chromeos::network_handler::RunErrorCallback(std::move(error_callback),
-                                                  "prohibited_technologies");
+      network_handler::RunErrorCallback(std::move(error_callback),
+                                        "prohibited_technologies");
       NetworkMetricsHelper::LogEnableTechnologyResult(technology,
                                                       /*success=*/false);
       return;
@@ -680,5 +679,4 @@
   listener_->UpdateIPConfigProperties(type, path, ip_config_path, *properties);
 }
 
-}  // namespace internal
-}  // namespace chromeos
+}  // namespace ash::internal
diff --git a/chromeos/ash/components/network/shill_property_handler.h b/chromeos/ash/components/network/shill_property_handler.h
index add753108..7398261 100644
--- a/chromeos/ash/components/network/shill_property_handler.h
+++ b/chromeos/ash/components/network/shill_property_handler.h
@@ -16,15 +16,13 @@
 #include "chromeos/ash/components/network/managed_state.h"
 #include "chromeos/ash/components/network/network_handler_callbacks.h"
 #include "chromeos/dbus/common/dbus_method_call_status.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/dbus/shill/shill_manager_client.h"
 #include "chromeos/dbus/shill/shill_property_changed_observer.h"
 #include "chromeos/dbus/shill/shill_service_client.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
-namespace chromeos {
-
-class ShillManagerClient;
-
-namespace internal {
+namespace ash::internal {
 
 class ShillPropertyObserver;
 
@@ -275,7 +273,11 @@
   std::set<std::string> uninitialized_technologies_;
 };
 
-}  // namespace internal
-}  // namespace chromeos
+}  // namespace ash::internal
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::internal {
+using ::ash::internal::ShillPropertyHandler;
+}
 
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_SHILL_PROPERTY_HANDLER_H_
diff --git a/chromeos/ash/components/network/shill_property_handler_unittest.cc b/chromeos/ash/components/network/shill_property_handler_unittest.cc
index c3baa5c..93db63a 100644
--- a/chromeos/ash/components/network/shill_property_handler_unittest.cc
+++ b/chromeos/ash/components/network/shill_property_handler_unittest.cc
@@ -28,7 +28,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 
-namespace chromeos {
+namespace ash {
 
 namespace {
 
@@ -632,4 +632,4 @@
   run_loop.Run();
 }
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/tether_constants.cc b/chromeos/ash/components/network/tether_constants.cc
index ccc5d405..af73b84 100644
--- a/chromeos/ash/components/network/tether_constants.cc
+++ b/chromeos/ash/components/network/tether_constants.cc
@@ -4,7 +4,7 @@
 
 #include "chromeos/ash/components/network/tether_constants.h"
 
-namespace chromeos {
+namespace ash {
 
 const char kTypeTether[] = "wifi-tether";
 const char kTetherBatteryPercentage[] = "Tether.BatteryPercentage";
@@ -14,4 +14,4 @@
 const char kTetherDevicePath[] = "tether-device-path";
 const char kTetherDeviceName[] = "tether-name";
 
-}  // namespace chromeos
+}  // namespace ash
diff --git a/chromeos/ash/components/network/tether_constants.h b/chromeos/ash/components/network/tether_constants.h
index b19ef42..afab557 100644
--- a/chromeos/ash/components/network/tether_constants.h
+++ b/chromeos/ash/components/network/tether_constants.h
@@ -6,7 +6,7 @@
 
 #include "base/component_export.h"
 
-namespace chromeos {
+namespace ash {
 
 // This file contains constants for Chrome OS tether networks which are used
 // wherever Shill constants are appropriate. Tether networks are a Chrome OS
@@ -30,15 +30,17 @@
 // The name used for the tether DeviceState.
 COMPONENT_EXPORT(CHROMEOS_NETWORK) extern const char kTetherDeviceName[];
 
-}  // namespace chromeos
-
-// TODO(https://crbug.com/1164001): remove when it moved to ash.
-namespace ash {
-using ::chromeos::kTetherBatteryPercentage;
-using ::chromeos::kTetherCarrier;
-using ::chromeos::kTetherHasConnectedToHost;
-using ::chromeos::kTetherSignalStrength;
-using ::chromeos::kTypeTether;
 }  // namespace ash
 
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos {
+using ::ash::kTetherBatteryPercentage;
+using ::ash::kTetherCarrier;
+using ::ash::kTetherDeviceName;
+using ::ash::kTetherDevicePath;
+using ::ash::kTetherHasConnectedToHost;
+using ::ash::kTetherSignalStrength;
+using ::ash::kTypeTether;
+}  // namespace chromeos
+
 #endif  // CHROMEOS_ASH_COMPONENTS_NETWORK_TETHER_CONSTANTS_H_
diff --git a/chromeos/ash/components/string_matching/README.md b/chromeos/ash/components/string_matching/README.md
index 7bf4474..884b88b 100644
--- a/chromeos/ash/components/string_matching/README.md
+++ b/chromeos/ash/components/string_matching/README.md
@@ -32,5 +32,5 @@
 Build and run tests:
 
 ```sh
-autoninja -C out/Default chromeos_components_unittests && out/Default/chromeos_components_unittests --gtest_filter=*FuzzyTokenizedStringMatchTest.Benchmark* --v=1
+autoninja -C out/Default chromeos_unittests && out/Default/chromeos_unittests --gtest_filter=*FuzzyTokenizedStringMatchTest.Benchmark* --v=1
 ```
diff --git a/chromeos/ash/components/string_matching/fuzzy_tokenized_string_match_unittest.cc b/chromeos/ash/components/string_matching/fuzzy_tokenized_string_match_unittest.cc
index 6b60ebc..51c3b47 100644
--- a/chromeos/ash/components/string_matching/fuzzy_tokenized_string_match_unittest.cc
+++ b/chromeos/ash/components/string_matching/fuzzy_tokenized_string_match_unittest.cc
@@ -24,13 +24,20 @@
 constexpr bool kUseEditDistance = false;
 constexpr double kPartialMatchPenaltyRate = 0.9;
 
-void ExpectAllNearlyEqual(const std::vector<double>& scores,
-                          double epsilon = kEps) {
-  for (size_t i = 1; i < scores.size(); ++i) {
-    EXPECT_NEAR(scores[0], scores[i], epsilon);
+void ExpectAllNearlyEqualTo(const std::vector<double>& scores,
+                            double target_score,
+                            double abs_error = kEps) {
+  for (const auto score : scores) {
+    EXPECT_NEAR(target_score, score, abs_error);
   }
 }
 
+void ExpectAllNearlyEqual(const std::vector<double>& scores,
+                          double abs_error = kEps) {
+  DCHECK(scores.size() > 0);
+  ExpectAllNearlyEqualTo(scores, scores[0], abs_error);
+}
+
 void ExpectIncreasing(const std::vector<double>& scores,
                       int start_index,
                       int end_index,
@@ -359,6 +366,272 @@
   }
 }
 
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkTokenOrderVariation) {
+  // Case: Two words.
+  std::u16string text_two_words = u"abc def";
+  std::vector<std::u16string> queries_two_words = {u"abc def", u"def abc"};
+  for (const auto& query : queries_two_words) {
+    const double relevance = CalculateRelevance(query, text_two_words);
+    VLOG(1) << FormatRelevanceResult(query, text_two_words, relevance,
+                                     /*query_first*/ false);
+  }
+  // Currently, query "abc def" yields a high score, whereas the inverted query
+  // "def abc" yields a low score.
+  //
+  // TODO(crbug.com/1336160): Support word order flexibility, such that the
+  // resulting relevance scores here are high and nearly equal.
+
+  // Case: Three words.
+  std::u16string text_three_words = u"abc def ghi";
+  std::vector<std::u16string> queries_three_words = {
+      u"abc def ghi", u"abc ghi def", u"def abc ghi",
+      u"def ghi abc", u"ghi abc def", u"ghi def abc"};
+  for (const auto& query : queries_three_words) {
+    const double relevance = CalculateRelevance(query, text_three_words);
+    VLOG(1) << FormatRelevanceResult(query, text_three_words, relevance,
+                                     /*query_first*/ false);
+  }
+  // Currently, query "abc def ghi" yields a high score, whereas all other
+  // queries yield low scores.
+  //
+  // TODO(crbug.com/1336160): Support word order flexibility, such that the
+  // resulting relevance scores here are high and nearly equal.
+
+  // TODO(crbug.com/1336160): [Later] Consider a score boost for when a matched
+  // token is the first token of both text and query.
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkTokensPresentInTextButNotQuery) {
+  std::u16string text = u"abc def ghi";
+
+  // Case: multi-token text, single-token query.
+  std::vector<std::u16string> queries_single_token = {u"abc", u"def", u"ghi"};
+  std::vector<double> scores_query_single_token;
+  for (const auto& query : queries_single_token) {
+    const double relevance = CalculateRelevance(query, text);
+    VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                     /*query_first*/ false);
+    scores_query_single_token.push_back(relevance);
+  }
+  // TODO(crbug.com/1336160): Consider a score boost for when a matched token is
+  // the first token of both text and query.
+  ExpectAllNearlyEqual(scores_query_single_token, /*abs_error*/ 0.1);
+
+  // Case: multi-token text, two-token query.
+  std::vector<std::u16string> queries_two_tokens = {u"abc def", u"abc ghi",
+                                                    u"def ghi"};
+  std::vector<double> scores_query_two_tokens;
+  for (const auto& query : queries_two_tokens) {
+    const double relevance = CalculateRelevance(query, text);
+    VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                     /*query_first*/ false);
+    scores_query_two_tokens.push_back(relevance);
+  }
+
+  // Currently, queries "abc def" and "def ghi" score highly, because they match
+  // to long contiguous regions of the text. "abc ghi" scores poorly, because it
+  // matches two separate regions of the text.
+  //
+  // TODO(crbug.com/1336160): Support flexibility in words being absent from the
+  // query, so that we can:
+  //
+  //   ExpectAllNearlyEqual(scores_query_two_tokens);
+
+  // TODO(crbug.com/1336160): Support text-length agnosticism, whereby
+  // non-matched text tokens have no (or less of) an adverse effect on scoring.
+  // Maybe add some score comparisons between `scores_query_single_token` and
+  // `scores_query_two_tokens`.
+
+  // TODO(crbug.com/1336160): [Later] Consider a score boost for when a matched
+  // token is the first token of both text and query.
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkTokensPresentInQueryButNotText) {
+  // N.B. This test contains the same texts and queries as in
+  // BenchmarkTokensPresentInTextButNotQuery, with the roles of text and query
+  // swapped. The expected/desired behavior is quite different, though.
+
+  // TODO(crbug.com/1336160): Decide how to handle unmatched query tokens. When
+  // a text is very short and a query very long, the text and query are probably
+  // a poor match. However, when both the text and query are long, (e.g. file
+  // names, keyboard shortcuts), it seems useful to allow for some degree of
+  // unmatched query tokens.
+
+  // TODO(crbug.com/1336160): [Later] Consider a score boost for when a matched
+  // token is the first token of both text and query.
+
+  std::u16string query = u"abc def ghi";
+
+  // Case: single-token text.
+  std::vector<std::u16string> text_single_token = {u"abc", u"def", u"ghi"};
+  std::vector<double> scores_text_single_token;
+  for (const auto& text : text_single_token) {
+    const double relevance = CalculateRelevance(query, text);
+    VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                     /*query_first*/ true);
+    scores_text_single_token.push_back(relevance);
+  }
+  ExpectAllNearlyEqual(scores_text_single_token);
+
+  // Case: two-token text.
+  std::vector<std::u16string> text_two_tokens = {u"abc def", u"abc ghi",
+                                                 u"def ghi"};
+  std::vector<double> scores_text_two_tokens;
+  for (const auto& text : text_two_tokens) {
+    const double relevance = CalculateRelevance(query, text);
+    VLOG(1) << FormatRelevanceResult(query, text, relevance,
+                                     /*query_first*/ true);
+    scores_text_two_tokens.push_back(relevance);
+  }
+  ExpectAllNearlyEqual(scores_text_two_tokens);
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest,
+       BenchmarkMultipleQueryTokensMapToOneTextToken) {
+  // This test contains the same strings as
+  // BenchmarkMultipleTextTokensMapToOneQueryToken, with the
+  // roles of text and query swapped.
+  //
+  // N.B. With the upcoming fuzzy matching v2, supporting flexibility around
+  // whitespace in this way may turn out to be too onerous. Consider this a
+  // stretch goal.
+
+  // Case 1: single-token text.
+  std::u16string text1 = u"abcdef";
+
+  // A query containing extra whitespace and which is otherwise a good match to
+  // the text, should score highly. The idea is to treat a small amount of extra
+  // whitespace as a spelling/grammar mistake.
+  //
+  // Here `_ordered` and `_shuffled` refer to the relative positions of the two
+  // query tokens which map onto the text token "abcdef".
+  std::vector<std::u16string> queries1_ordered = {u"ab cdef", u"abc def"};
+  std::vector<double> scores1_ordered;
+  for (const auto& query : queries1_ordered) {
+    const double relevance = CalculateRelevance(query, text1);
+    VLOG(1) << FormatRelevanceResult(query, text1, relevance,
+                                     /*query_first*/ false);
+    scores1_ordered.push_back(relevance);
+  }
+  ExpectAllNearlyEqualTo(scores1_ordered, 0.9, /*abs_error*/ 0.1);
+
+  // Token-merging should only be considered for consecutive tokens, in line
+  // with the spelling/grammar mistake philosophy.
+  std::vector<std::u16string> queries1_shuffled = {u"cdef ab", u"def abc"};
+  std::vector<double> scores1_shuffled;
+  for (const auto& query : queries1_shuffled) {
+    const double relevance = CalculateRelevance(query, text1);
+    VLOG(1) << FormatRelevanceResult(query, text1, relevance,
+                                     /*query_first*/ false);
+    scores1_shuffled.push_back(relevance);
+  }
+  ExpectAllNearlyEqualTo(scores1_shuffled, 0.4, /*abs_error*/ 0.2);
+
+  // Case 2: multi-token text.
+  std::u16string text2 = u"abcdef ghi";
+
+  std::vector<std::u16string> queries2_ordered = {
+      u"ab cdef ghi", u"abc def ghi", u"ghi ab cdef", u"ghi abc def"};
+  std::vector<double> scores2_ordered;
+  for (const auto& query : queries2_ordered) {
+    const double relevance = CalculateRelevance(query, text2);
+    VLOG(1) << FormatRelevanceResult(query, text2, relevance,
+                                     /*query_first*/ false);
+    scores2_ordered.push_back(relevance);
+  }
+  EXPECT_GT(scores2_ordered[0], 0.9);
+  EXPECT_GT(scores2_ordered[1], 0.9);
+  // TODO(crbug.com/1336160): Support token-order flexibility to allow the
+  // following (ish):
+  //
+  //   ExpectAllNearlyEqualTo(scores2_ordered, 0.9, /*abs_error*/ 0.1);
+
+  std::vector<std::u16string> queries2_shuffled = {
+      u"cdef ab ghi", u"cdef ghi ab", u"def abc ghi", u"ghi def abc"};
+  std::vector<double> scores2_shuffled;
+  for (const auto& query : queries2_shuffled) {
+    const double relevance = CalculateRelevance(query, text2);
+    VLOG(1) << FormatRelevanceResult(query, text2, relevance,
+                                     /*query_first*/ false);
+    scores2_shuffled.push_back(relevance);
+  }
+  // TODO(crbug.com/1336160): Perhaps these scores should be higher.
+  ExpectAllNearlyEqualTo(scores2_shuffled, 0.4, /*abs_error*/ 0.25);
+}
+
+TEST_F(FuzzyTokenizedStringMatchTest,
+       BenchmarkMultipleTextTokensMapToOneQueryToken) {
+  // This test contains the same strings as
+  // BenchmarkMultipleQueryTokensMapToOneTextToken, with the
+  // roles of text and query swapped.
+  //
+  // N.B. With the upcoming fuzzy matching v2, supporting flexibility around
+  // whitespace in this way may turn out to be too onerous. Consider this a
+  // stretch goal.
+
+  // Case 1: single-token query.
+  std::u16string query1 = u"abcdef";
+
+  // A text containing extra whitespace and which is otherwise a good match to
+  // the query, should score highly. The idea is to treat a small amount of
+  // extra whitespace as a spelling/grammar mistake.
+  //
+  // Here `_ordered` and `_shuffled` refer to the relative positions of the two
+  // text tokens which map onto the query token "abcdef".
+  std::vector<std::u16string> texts1_ordered = {u"ab cdef", u"abc def"};
+  std::vector<double> scores1_ordered;
+  for (const auto& text : texts1_ordered) {
+    const double relevance = CalculateRelevance(query1, text);
+    VLOG(1) << FormatRelevanceResult(query1, text, relevance,
+                                     /*query_first*/ true);
+    scores1_ordered.push_back(relevance);
+  }
+  ExpectAllNearlyEqualTo(scores1_ordered, 0.9, /*abs_error*/ 0.1);
+
+  // Token-merging should only be considered for consecutive tokens, in line
+  // with the spelling/grammar mistake philosophy.
+  std::vector<std::u16string> texts1_shuffled = {u"cdef ab", u"def abc"};
+  std::vector<double> scores1_shuffled;
+  for (const auto& text : texts1_shuffled) {
+    const double relevance = CalculateRelevance(query1, text);
+    VLOG(1) << FormatRelevanceResult(query1, text, relevance,
+                                     /*query_first*/ true);
+    scores1_shuffled.push_back(relevance);
+  }
+  ExpectAllNearlyEqualTo(scores1_shuffled, 0.4, /*abs_error*/ 0.2);
+
+  // Case 2: multi-token query.
+  std::u16string query2 = u"abcdef ghi";
+
+  std::vector<std::u16string> texts2_ordered = {u"ab cdef ghi", u"abc def ghi",
+                                                u"ghi ab cdef", u"ghi abc def"};
+  std::vector<double> scores2_ordered;
+  for (const auto& text : texts2_ordered) {
+    const double relevance = CalculateRelevance(query2, text);
+    VLOG(1) << FormatRelevanceResult(query2, text, relevance,
+                                     /*query_first*/ true);
+    scores2_ordered.push_back(relevance);
+  }
+  EXPECT_GT(scores2_ordered[0], 0.9);
+  EXPECT_GT(scores2_ordered[1], 0.9);
+  // TODO(crbug.com/1336160): Support token-order flexibility to allow the
+  // following (ish):
+  //
+  //   ExpectAllNearlyEqualTo(scores2_ordered, 0.9, /*abs_error*/ 0.1);
+
+  std::vector<std::u16string> texts2_shuffled = {
+      u"cdef ab ghi", u"cdef ghi ab", u"def abc ghi", u"ghi def abc"};
+  std::vector<double> scores2_shuffled;
+  for (const auto& text : texts2_shuffled) {
+    const double relevance = CalculateRelevance(query2, text);
+    VLOG(1) << FormatRelevanceResult(query2, text, relevance,
+                                     /*query_first*/ true);
+    scores2_shuffled.push_back(relevance);
+  }
+  // TODO(crbug.com/1336160): Perhaps these scores should be higher.
+  ExpectAllNearlyEqualTo(scores2_shuffled, 0.4, /*abs_error*/ 0.25);
+}
+
 TEST_F(FuzzyTokenizedStringMatchTest, BenchmarkPartialMatchPartialMismatch) {
   std::u16string text = u"abcdef";
 
diff --git a/chromeos/ash/services/assistant/device_settings_host.h b/chromeos/ash/services/assistant/device_settings_host.h
index 999e769..ef46bbd 100644
--- a/chromeos/ash/services/assistant/device_settings_host.h
+++ b/chromeos/ash/services/assistant/device_settings_host.h
@@ -6,6 +6,8 @@
 #define CHROMEOS_ASH_SERVICES_ASSISTANT_DEVICE_SETTINGS_HOST_H_
 
 #include "base/component_export.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/services/assistant/public/cpp/device_actions.h"
 #include "chromeos/services/libassistant/public/mojom/device_settings_delegate.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver.h"
@@ -17,7 +19,6 @@
 namespace chromeos {
 namespace assistant {
 
-class DeviceActions;
 class ServiceContext;
 
 class COMPONENT_EXPORT(ASSISTANT_SERVICE) DeviceSettingsHost
diff --git a/chromeos/ash/services/assistant/media_host.h b/chromeos/ash/services/assistant/media_host.h
index 5fd4aca..2f89472 100644
--- a/chromeos/ash/services/assistant/media_host.h
+++ b/chromeos/ash/services/assistant/media_host.h
@@ -8,6 +8,10 @@
 #include "base/component_export.h"
 #include "base/observer_list.h"
 #include "base/unguessable_token.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
 #include "chromeos/services/libassistant/public/mojom/media_controller.mojom-forward.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
@@ -17,8 +21,6 @@
 namespace chromeos {
 namespace assistant {
 
-class AssistantBrowserDelegate;
-class AssistantInteractionSubscriber;
 class AssistantManagerServiceImpl;
 class AssistantMediaSession;
 
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.cc b/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.cc
index 3c288a4..5501de8 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.cc
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.cc
@@ -4,8 +4,7 @@
 
 #include "chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 namespace {
 
@@ -29,5 +28,4 @@
   g_instance = nullptr;
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h b/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h
index 5a106aa..36735f73 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h
@@ -24,8 +24,7 @@
 #include "chromeos/services/libassistant/public/mojom/service.mojom-forward.h"
 #endif  // BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 // Main interface implemented in browser to provide dependencies to
 // |chromeos::assistant::Service|.
@@ -94,7 +93,11 @@
 #endif  // BUILDFLAG(ENABLE_CROS_LIBASSISTANT)
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::AssistantBrowserDelegate;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_BROWSER_DELEGATE_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_enums.h b/chromeos/ash/services/assistant/public/cpp/assistant_enums.h
index 30560f5..b53f834 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_enums.h
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_enums.h
@@ -5,8 +5,7 @@
 #ifndef CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_ENUMS_H_
 #define CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_ENUMS_H_
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 // The initial state is NOT_READY, after Assistant service started it becomes
 // READY. When Assistant UI shows up the state becomes VISIBLE.
 enum AssistantStatus {
@@ -133,7 +132,15 @@
   kMaxValue = kLoaded,
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::AssistantAllowedState;
+using ::ash::assistant::AssistantInteractionResolution;
+using ::ash::assistant::AssistantStatus;
+using ::ash::assistant::LibassistantDlcInstallResult;
+using ::ash::assistant::LibassistantDlcLoadStatus;
+}  // namespace chromeos::assistant
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_ENUMS_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_prefs.cc b/chromeos/ash/services/assistant/public/cpp/assistant_prefs.cc
index 99eb184..0a85872 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_prefs.cc
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_prefs.cc
@@ -7,9 +7,7 @@
 #include "base/notreached.h"
 #include "components/prefs/pref_registry_simple.h"
 
-namespace chromeos {
-namespace assistant {
-namespace prefs {
+namespace ash::assistant::prefs {
 
 // NOTE: These values are persisted in preferences and cannot be changed.
 const char kAssistantOnboardingModeDefault[] = "Default";
@@ -100,6 +98,4 @@
   return std::string();
 }
 
-}  // namespace prefs
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant::prefs
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_prefs.h b/chromeos/ash/services/assistant/public/cpp/assistant_prefs.h
index eeaaaca..beeac92 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_prefs.h
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_prefs.h
@@ -11,9 +11,7 @@
 
 class PrefRegistrySimple;
 
-namespace chromeos {
-namespace assistant {
-namespace prefs {
+namespace ash::assistant::prefs {
 
 // The status of the user's consent. The enum values cannot be changed because
 // they are persisted on disk.
@@ -80,8 +78,11 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 std::string ToOnboardingModeString(AssistantOnboardingMode onboarding_mode);
 
-}  // namespace prefs
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant::prefs
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+namespace prefs = ::ash::assistant::prefs;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_PREFS_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_service.cc b/chromeos/ash/services/assistant/public/cpp/assistant_service.cc
index 412af1c9..8301217 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_service.cc
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_service.cc
@@ -4,8 +4,7 @@
 
 #include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 namespace {
 
@@ -28,5 +27,4 @@
   g_instance = nullptr;
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_service.h b/chromeos/ash/services/assistant/public/cpp/assistant_service.h
index cff50fe..6a5a3e2 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_service.h
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_service.h
@@ -14,6 +14,8 @@
 #include "chromeos/ash/services/assistant/public/cpp/assistant_enums.h"
 #include "chromeos/ash/services/assistant/public/cpp/conversation_observer.h"
 #include "chromeos/services/libassistant/public/cpp/android_app_info.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/services/libassistant/public/cpp/assistant_feedback.h"
 #include "chromeos/services/libassistant/public/cpp/assistant_interaction_metadata.h"
 #include "chromeos/services/libassistant/public/cpp/assistant_notification.h"
 #include "chromeos/services/libassistant/public/mojom/notification_delegate.mojom-forward.h"
@@ -22,10 +24,7 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "ui/accessibility/mojom/ax_assistant_structure.mojom.h"
 
-namespace chromeos {
-namespace assistant {
-
-struct AssistantFeedback;
+namespace ash::assistant {
 
 // Subscribes to Assistant's interaction event. These events are server driven
 // in response to the user's direct interaction with the assistant. Responses
@@ -182,7 +181,13 @@
   virtual Assistant* GetAssistant() = 0;
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::Assistant;
+using ::ash::assistant::AssistantInteractionSubscriber;
+using ::ash::assistant::AssistantService;
+}  // namespace chromeos::assistant
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_SERVICE_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_settings.cc b/chromeos/ash/services/assistant/public/cpp/assistant_settings.cc
index eb8ceb8..1121cd3 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_settings.cc
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_settings.cc
@@ -4,8 +4,7 @@
 
 #include "chromeos/ash/services/assistant/public/cpp/assistant_settings.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 namespace {
 
@@ -40,5 +39,4 @@
   g_instance = nullptr;
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/public/cpp/assistant_settings.h b/chromeos/ash/services/assistant/public/cpp/assistant_settings.h
index ee329a1..942b0b8f 100644
--- a/chromeos/ash/services/assistant/public/cpp/assistant_settings.h
+++ b/chromeos/ash/services/assistant/public/cpp/assistant_settings.h
@@ -13,8 +13,7 @@
 #include "chromeos/services/libassistant/public/mojom/speaker_id_enrollment_controller.mojom.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 class COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) SpeakerIdEnrollmentClient
     : public chromeos::libassistant::mojom::SpeakerIdEnrollmentClient {
@@ -78,7 +77,12 @@
   virtual void SyncSpeakerIdEnrollmentStatus() = 0;
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::AssistantSettings;
+using ::ash::assistant::SpeakerIdEnrollmentClient;
+}  // namespace chromeos::assistant
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_ASSISTANT_SETTINGS_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/conversation_observer.cc b/chromeos/ash/services/assistant/public/cpp/conversation_observer.cc
index f18971f..8ac2254 100644
--- a/chromeos/ash/services/assistant/public/cpp/conversation_observer.cc
+++ b/chromeos/ash/services/assistant/public/cpp/conversation_observer.cc
@@ -4,8 +4,7 @@
 
 #include "chromeos/ash/services/assistant/public/cpp/conversation_observer.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 ConversationObserver::ConversationObserver() = default;
 ConversationObserver::~ConversationObserver() = default;
@@ -17,5 +16,4 @@
   return remote_observer_.BindNewPipeAndPassRemote();
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/public/cpp/conversation_observer.h b/chromeos/ash/services/assistant/public/cpp/conversation_observer.h
index 96cc8137..bb5f5f0 100644
--- a/chromeos/ash/services/assistant/public/cpp/conversation_observer.h
+++ b/chromeos/ash/services/assistant/public/cpp/conversation_observer.h
@@ -11,8 +11,7 @@
 #include "chromeos/services/libassistant/public/mojom/conversation_observer.mojom.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 // Default implementation of |mojom::ConversationObserver|, which allow child
 // child classes to only implement handlers they are interested in.
@@ -47,7 +46,11 @@
       remote_observer_{this};
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::ConversationObserver;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_CONVERSATION_OBSERVER_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/device_actions.cc b/chromeos/ash/services/assistant/public/cpp/device_actions.cc
index eff2d063..1eb79f6f 100644
--- a/chromeos/ash/services/assistant/public/cpp/device_actions.cc
+++ b/chromeos/ash/services/assistant/public/cpp/device_actions.cc
@@ -4,8 +4,7 @@
 
 #include "chromeos/ash/services/assistant/public/cpp/device_actions.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 namespace {
 
@@ -29,5 +28,4 @@
   g_instance = nullptr;
 }
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
diff --git a/chromeos/ash/services/assistant/public/cpp/device_actions.h b/chromeos/ash/services/assistant/public/cpp/device_actions.h
index 6230f27e..ee4bc28 100644
--- a/chromeos/ash/services/assistant/public/cpp/device_actions.h
+++ b/chromeos/ash/services/assistant/public/cpp/device_actions.h
@@ -13,8 +13,7 @@
 #include "base/observer_list_types.h"
 #include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
 
-namespace chromeos {
-namespace assistant {
+namespace ash::assistant {
 
 // Subscribes to App list events.
 class COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) AppListEventSubscriber
@@ -78,7 +77,12 @@
       AppListEventSubscriber* subscriber) = 0;
 };
 
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+using ::ash::assistant::AppListEventSubscriber;
+using ::ash::assistant::DeviceActions;
+}  // namespace chromeos::assistant
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_DEVICE_ACTIONS_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/features.cc b/chromeos/ash/services/assistant/public/cpp/features.cc
index 63d37ea1..60006a9 100644
--- a/chromeos/ash/services/assistant/public/cpp/features.cc
+++ b/chromeos/ash/services/assistant/public/cpp/features.cc
@@ -7,9 +7,7 @@
 #include "ash/constants/ash_features.h"
 #include "base/feature_list.h"
 
-namespace chromeos {
-namespace assistant {
-namespace features {
+namespace ash::assistant::features {
 
 const base::Feature kAssistantAudioEraser{"AssistantAudioEraser",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
@@ -99,6 +97,4 @@
   return base::FeatureList::IsEnabled(kEnableLibAssistantV2);
 }
 
-}  // namespace features
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant::features
diff --git a/chromeos/ash/services/assistant/public/cpp/features.h b/chromeos/ash/services/assistant/public/cpp/features.h
index 07de12fa..a170bbc3 100644
--- a/chromeos/ash/services/assistant/public/cpp/features.h
+++ b/chromeos/ash/services/assistant/public/cpp/features.h
@@ -9,9 +9,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
 
-namespace chromeos {
-namespace assistant {
-namespace features {
+namespace ash::assistant::features {
 
 // Enable Assistant Feedback UI.
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
@@ -83,8 +81,11 @@
 
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC) bool IsLibAssistantV2Enabled();
 
-}  // namespace features
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant::features
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+namespace features = ::ash::assistant::features;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_FEATURES_H_
diff --git a/chromeos/ash/services/assistant/public/cpp/switches.cc b/chromeos/ash/services/assistant/public/cpp/switches.cc
index 4fd2d11..8285341e 100644
--- a/chromeos/ash/services/assistant/public/cpp/switches.cc
+++ b/chromeos/ash/services/assistant/public/cpp/switches.cc
@@ -4,14 +4,10 @@
 
 #include "chromeos/ash/services/assistant/public/cpp/switches.h"
 
-namespace chromeos {
-namespace assistant {
-namespace switches {
+namespace ash::assistant::switches {
 
 const char kForceAssistantOnboarding[] = "force-assistant-onboarding";
 const char kRedirectLibassistantLogging[] = "redirect-libassistant-logging";
 const char kDisableLibAssistantLogfile[] = "disable-libassistant-logfile";
 
-}  // namespace switches
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant::switches
diff --git a/chromeos/ash/services/assistant/public/cpp/switches.h b/chromeos/ash/services/assistant/public/cpp/switches.h
index 3cae5fe88..f3ea9fa 100644
--- a/chromeos/ash/services/assistant/public/cpp/switches.h
+++ b/chromeos/ash/services/assistant/public/cpp/switches.h
@@ -7,9 +7,7 @@
 
 #include "base/component_export.h"
 
-namespace chromeos {
-namespace assistant {
-namespace switches {
+namespace ash::assistant::switches {
 
 // NOTE: Switches are reserved for developer-facing options. End-user facing
 // features should use base::Feature. See features.h.
@@ -29,8 +27,11 @@
 COMPONENT_EXPORT(ASSISTANT_SERVICE_PUBLIC)
 extern const char kDisableLibAssistantLogfile[];
 
-}  // namespace switches
-}  // namespace assistant
-}  // namespace chromeos
+}  // namespace ash::assistant::switches
+
+// TODO(https://crbug.com/1164001): remove when the migration is finished.
+namespace chromeos::assistant {
+namespace switches = ::ash::assistant::switches;
+}
 
 #endif  // CHROMEOS_ASH_SERVICES_ASSISTANT_PUBLIC_CPP_SWITCHES_H_
diff --git a/chromeos/ash/services/assistant/service_context.h b/chromeos/ash/services/assistant/service_context.h
index 31dba51..1717db5 100644
--- a/chromeos/ash/services/assistant/service_context.h
+++ b/chromeos/ash/services/assistant/service_context.h
@@ -12,6 +12,8 @@
 // ash/.
 #include "ash/components/audio/cras_audio_handler.h"
 #include "base/memory/scoped_refptr.h"
+// TODO(https://crbug.com/1164001): move to forward declaration
+#include "chromeos/ash/services/assistant/public/cpp/device_actions.h"
 
 namespace ash {
 class AssistantAlarmTimerController;
@@ -31,8 +33,6 @@
 namespace chromeos {
 namespace assistant {
 
-class DeviceActions;
-
 // Context object passed around so classes can access some of the |Service|
 // functionality without directly depending on the |Service| class.
 class ServiceContext {
diff --git a/chromeos/dbus/shill/shill_manager_client.h b/chromeos/dbus/shill/shill_manager_client.h
index a3d40d94..442626d 100644
--- a/chromeos/dbus/shill/shill_manager_client.h
+++ b/chromeos/dbus/shill/shill_manager_client.h
@@ -251,6 +251,7 @@
 // source migration is finished.
 namespace ash {
 using ::chromeos::ShillManagerClient;
+using ::chromeos::ShillPropertyChangedObserver;
 }
 
 #endif  // CHROMEOS_DBUS_SHILL_SHILL_MANAGER_CLIENT_H_
diff --git a/chromeos/services/libassistant/public/cpp/android_app_info.h b/chromeos/services/libassistant/public/cpp/android_app_info.h
index a8bda075..832979e 100644
--- a/chromeos/services/libassistant/public/cpp/android_app_info.h
+++ b/chromeos/services/libassistant/public/cpp/android_app_info.h
@@ -52,4 +52,10 @@
 }  // namespace assistant
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash::assistant {
+using ::chromeos::assistant::AndroidAppInfo;
+using ::chromeos::assistant::AppStatus;
+}  // namespace ash::assistant
+
 #endif  // CHROMEOS_SERVICES_LIBASSISTANT_PUBLIC_CPP_ANDROID_APP_INFO_H_
diff --git a/chromeos/services/libassistant/public/cpp/assistant_feedback.h b/chromeos/services/libassistant/public/cpp/assistant_feedback.h
index 9e4dce9..de55a7d 100644
--- a/chromeos/services/libassistant/public/cpp/assistant_feedback.h
+++ b/chromeos/services/libassistant/public/cpp/assistant_feedback.h
@@ -33,4 +33,9 @@
 }  // namespace assistant
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash::assistant {
+using ::chromeos::assistant::AssistantFeedback;
+}
+
 #endif  // CHROMEOS_SERVICES_LIBASSISTANT_PUBLIC_CPP_ASSISTANT_FEEDBACK_H_
diff --git a/chromeos/services/libassistant/public/cpp/assistant_interaction_metadata.h b/chromeos/services/libassistant/public/cpp/assistant_interaction_metadata.h
index 23719b3..fadb32ae 100644
--- a/chromeos/services/libassistant/public/cpp/assistant_interaction_metadata.h
+++ b/chromeos/services/libassistant/public/cpp/assistant_interaction_metadata.h
@@ -62,4 +62,9 @@
 }  // namespace assistant
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash::assistant {
+using ::chromeos::assistant::AssistantQuerySource;
+}
+
 #endif  // CHROMEOS_SERVICES_LIBASSISTANT_PUBLIC_CPP_ASSISTANT_INTERACTION_METADATA_H_
diff --git a/chromeos/services/libassistant/public/cpp/assistant_notification.h b/chromeos/services/libassistant/public/cpp/assistant_notification.h
index 188c2da..53a92d5 100644
--- a/chromeos/services/libassistant/public/cpp/assistant_notification.h
+++ b/chromeos/services/libassistant/public/cpp/assistant_notification.h
@@ -104,4 +104,9 @@
 }  // namespace assistant
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash::assistant {
+using ::chromeos::assistant::AssistantNotification;
+}
+
 #endif  // CHROMEOS_SERVICES_LIBASSISTANT_PUBLIC_CPP_ASSISTANT_NOTIFICATION_H_
diff --git a/chromeos/services/libassistant/public/cpp/assistant_suggestion.h b/chromeos/services/libassistant/public/cpp/assistant_suggestion.h
index 47a0ea28..0a59b63f 100644
--- a/chromeos/services/libassistant/public/cpp/assistant_suggestion.h
+++ b/chromeos/services/libassistant/public/cpp/assistant_suggestion.h
@@ -73,4 +73,9 @@
 }  // namespace assistant
 }  // namespace chromeos
 
+// TODO(https://crbug.com/1164001): remove when it moved to ash.
+namespace ash::assistant {
+using ::chromeos::assistant::AssistantSuggestion;
+}
+
 #endif  // CHROMEOS_SERVICES_LIBASSISTANT_PUBLIC_CPP_ASSISTANT_SUGGESTION_H_
diff --git a/components/account_id/account_id.cc b/components/account_id/account_id.cc
index ee0ba4c..16da864 100644
--- a/components/account_id/account_id.cc
+++ b/components/account_id/account_id.cc
@@ -221,19 +221,19 @@
 }
 
 std::string AccountId::Serialize() const {
-  base::DictionaryValue value;
+  base::Value::Dict value;
   switch (GetAccountType()) {
     case AccountType::GOOGLE:
-      value.SetString(kGaiaIdKey, id_);
+      value.Set(kGaiaIdKey, id_);
       break;
     case AccountType::ACTIVE_DIRECTORY:
-      value.SetString(kObjGuid, id_);
+      value.Set(kObjGuid, id_);
       break;
     case AccountType::UNKNOWN:
       break;
   }
-  value.SetString(kAccountTypeKey, AccountTypeToString(GetAccountType()));
-  value.SetString(kEmailKey, user_email_);
+  value.Set(kAccountTypeKey, AccountTypeToString(GetAccountType()));
+  value.Set(kEmailKey, user_email_);
 
   std::string serialized;
   base::JSONWriter::Write(value, &serialized);
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm
index 749485e..d21c17fb 100644
--- a/components/autofill/ios/browser/autofill_agent.mm
+++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -90,9 +90,9 @@
 // modifies the field's value for the select elements.
 void GetFormField(autofill::FormFieldData* field,
                   const autofill::FormData& form,
-                  const std::u16string& fieldIdentifier) {
+                  FieldRendererId fieldIdentifier) {
   for (const auto& currentField : form.fields) {
-    if (currentField.unique_id == fieldIdentifier &&
+    if (currentField.unique_renderer_id == fieldIdentifier &&
         currentField.is_focusable) {
       *field = currentField;
       break;
@@ -308,7 +308,7 @@
 // Sends a request to BrowserAutofillManager to retrieve suggestions for the
 // specified form and field.
 - (void)queryAutofillForForm:(const autofill::FormData&)form
-             fieldIdentifier:(NSString*)fieldIdentifier
+             fieldIdentifier:(FieldRendererId)fieldIdentifier
                         type:(NSString*)type
                   typedValue:(NSString*)typedValue
                      frameID:(NSString*)frameID
@@ -323,7 +323,7 @@
 
   // Find the right field.
   autofill::FormFieldData field;
-  GetFormField(&field, form, SysNSStringToUTF16(fieldIdentifier));
+  GetFormField(&field, form, fieldIdentifier);
 
   // Save the completion and go look for suggestions.
   _suggestionsAvailableCompletion = [completion copy];
@@ -370,7 +370,7 @@
   id completionHandler = ^(BOOL success, const FormDataVector& forms) {
     if (success && forms.size() == 1) {
       [weakSelf queryAutofillForForm:forms[0]
-                     fieldIdentifier:formQuery.fieldIdentifier
+                     fieldIdentifier:formQuery.uniqueFieldID
                                 type:formQuery.type
                           typedValue:formQuery.typedValue
                              frameID:formQuery.frameID
@@ -542,8 +542,9 @@
     base::Value fieldData(base::Value::Type::DICTIONARY);
     DCHECK(form.fields.size() == form.data.fields.size());
     for (size_t i = 0; i < form.fields.size(); i++) {
-      fieldData.SetKey(base::UTF16ToUTF8(form.data.fields[i].unique_id),
-                       base::Value(form.fields[i].overall_type));
+      fieldData.SetKey(
+          NumberToString(form.data.fields[i].unique_renderer_id.value()),
+          base::Value(form.fields[i].overall_type));
     }
     predictionData->SetKey(base::UTF16ToUTF8(form.data.name),
                            std::move(fieldData));
@@ -814,7 +815,7 @@
   // -onFormsFetched:formsData:webFrameId:fieldIdentifier.
   __weak AutofillAgent* weakSelf = self;
   __block const std::string webFrameId = frame->GetFrameId();
-  __block const std::string fieldIdentifier = params.field_identifier;
+  __block FieldRendererId fieldIdentifier = params.unique_field_id;
   auto completionHandler = ^(BOOL success, const FormDataVector& forms) {
     [weakSelf onFormsFetched:success
                    formsData:forms
@@ -976,7 +977,7 @@
 - (void)onFormsFetched:(BOOL)success
              formsData:(const FormDataVector&)forms
             webFrameId:(const std::string&)webFrameId
-       fieldIdentifier:(const std::string&)fieldIdentifier {
+       fieldIdentifier:(FieldRendererId)fieldIdentifier {
   if (!success || forms.size() != 1)
     return;
 
@@ -995,7 +996,7 @@
     return;
 
   autofill::FormFieldData field;
-  GetFormField(&field, forms[0], base::UTF8ToUTF16(fieldIdentifier));
+  GetFormField(&field, forms[0], fieldIdentifier);
   autofillManager->OnTextFieldDidChange(
       forms[0], field, gfx::RectF(), autofill::AutofillTickClock::NowTicks());
 }
diff --git a/components/autofill/ios/browser/resources/autofill_controller.js b/components/autofill/ios/browser/resources/autofill_controller.js
index efe852b1b..24e4720 100644
--- a/components/autofill/ios/browser/resources/autofill_controller.js
+++ b/components/autofill/ios/browser/resources/autofill_controller.js
@@ -556,8 +556,8 @@
       if (!__gCrWeb.fill.isAutofillableElement(element)) {
         continue;
       }
-      const elementName = __gCrWeb.form.getFieldIdentifier(element);
-      const value = formData[elementName];
+      const elementID = __gCrWeb.fill.getUniqueID(element);
+      const value = formData[elementID];
       if (value) {
         element.placeholder = value;
       }
diff --git a/components/autofill_assistant/browser/web/batch_element_checker_browsertest.cc b/components/autofill_assistant/browser/web/batch_element_checker_browsertest.cc
index 38a800b1..ebc66be8 100644
--- a/components/autofill_assistant/browser/web/batch_element_checker_browsertest.cc
+++ b/components/autofill_assistant/browser/web/batch_element_checker_browsertest.cc
@@ -296,7 +296,9 @@
                                DomObjectFrameStack>& elements) {
         EXPECT_TRUE(status.ok());
         EXPECT_EQ(elements.size(), 1u);
-        EXPECT_EQ(elements.count(iframe_button_id), 1u);
+        const auto& entry = elements.find(iframe_button_id);
+        ASSERT_NE(entry, elements.end());
+        EXPECT_TRUE(entry->second.render_frame_id);
         run_loop.Quit();
       });
 
diff --git a/components/autofill_assistant/browser/web/selector_observer.cc b/components/autofill_assistant/browser/web/selector_observer.cc
index 558ad3ee..af967de6 100644
--- a/components/autofill_assistant/browser/web/selector_observer.cc
+++ b/components/autofill_assistant/browser/web/selector_observer.cc
@@ -111,6 +111,12 @@
 
   EnterState(State::RUNNING);
   const DomRoot root(/* frame_id = */ "", DomRoot::kUseMainDoc);
+  // Since it's the root frame, it doesn't belong to an iframe and doesn't have
+  // a devtools_id.
+  frame_ids_.emplace(
+      root, FrameIds{/* devtools_id= */ "",
+                     /* global_frame_id= */ web_contents_->GetPrimaryMainFrame()
+                         ->GetGlobalId()});
   ResolveObjectIdAndInjectFrame(root, 0);
 
   timeout_timer_ = std::make_unique<base::OneShotTimer>();
@@ -177,15 +183,18 @@
     DomObjectFrameStack element_dom_object;
     element_dom_object.object_data.object_id = element_object_id_entry->second;
     element_dom_object.object_data.node_frame_id = dom_root.frame_id();
-
+    const auto entry = frame_ids_.find(dom_root);
+    if (entry != frame_ids_.end()) {
+      element_dom_object.render_frame_id = entry->second.global_frame_id;
+    }
     size_t depth = 1;
     std::string prev_frame_id = "";
     auto it = dom_roots_.find(std::make_pair(element.selector_id, depth++));
     while (it != dom_roots_.end() && it->second != dom_root) {
-      auto entry = iframe_object_ids_.find(it->second);
-      if (entry != iframe_object_ids_.end()) {
+      const auto entry = frame_ids_.find(it->second);
+      if (entry != frame_ids_.end()) {
         JsObjectIdentifier frame;
-        frame.object_id = entry->second;
+        frame.object_id = entry->second.devtools_id;
         frame.node_frame_id = prev_frame_id;
         element_dom_object.frame_stack.push_back(frame);
       }
@@ -363,6 +372,15 @@
       return;
     }
 
+    auto* const frame =
+        FindCorrespondingRenderFrameHost(node->GetFrameId(), web_contents_);
+    if (!frame) {
+      VLOG(1) << __func__ << " Failed to find corresponding owner frame.";
+      FailWithError(ClientStatus(FRAME_HOST_NOT_FOUND));
+      return;
+    }
+    const auto global_frame_id = frame->GetGlobalId();
+
     DomRoot dom_root;
     if (node->HasContentDocument()) {
       // If the frame has a ContentDocument it's considered a local frame.
@@ -373,7 +391,9 @@
       // OOP frame.
       dom_root = DomRoot(node->GetFrameId(), DomRoot::kUseMainDoc);
     }
-    iframe_object_ids_.emplace(dom_root, parent_object_id);
+    frame_ids_.emplace(dom_root,
+                       FrameIds{/* devtools_id= */ parent_object_id,
+                                /* global_frame_id= */ global_frame_id});
     InjectOrAddSelectorsToDomRoot(dom_root, frame_depth, selector_ids);
   } else if (node->HasShadowRoots()) {
     // We aren't entering a frame but a shadow dom.
diff --git a/components/autofill_assistant/browser/web/selector_observer.h b/components/autofill_assistant/browser/web/selector_observer.h
index 0ffb89b..6053688 100644
--- a/components/autofill_assistant/browser/web/selector_observer.h
+++ b/components/autofill_assistant/browser/web/selector_observer.h
@@ -157,6 +157,14 @@
       return second;
     }
   };
+
+  // Contains different identifiers about the frames we are observing.
+  struct FrameIds {
+    // The devtools object id of the iframe node that contains the frame. This
+    // devtools id therefore belongs to the parent frame.
+    std::string devtools_id;
+    content::GlobalRenderFrameHostId global_frame_id;
+  };
   enum class State {
     INITIALIZED = 0,
     RUNNING = 1,
@@ -187,8 +195,8 @@
   // Selector observer script api object id for each DomRoot
   base::flat_map<DomRoot, std::string> script_api_object_ids_;
 
-  // Object id's of containing iframes
-  base::flat_map<DomRoot, std::string> iframe_object_ids_;
+  // Devtools Object id's and render host global id's of containing iframes.
+  base::flat_map<DomRoot, FrameIds> frame_ids_;
 
   // Dom root for each selector's stretch: {selector_id, frame_depth} -> DomRoot
   base::flat_map<std::pair<SelectorId, size_t>, DomRoot> dom_roots_;
diff --git a/components/custom_handlers/protocol_handler_registry_unittest.cc b/components/custom_handlers/protocol_handler_registry_unittest.cc
index 228c9e8..8a05ba1c 100644
--- a/components/custom_handlers/protocol_handler_registry_unittest.cc
+++ b/components/custom_handlers/protocol_handler_registry_unittest.cc
@@ -157,9 +157,9 @@
   }
 
   int InPrefHandlerCount() {
-    const base::Value* in_pref_handlers = GetPrefs()->GetList(
+    const base::Value::List& in_pref_handlers = GetPrefs()->GetValueList(
         custom_handlers::prefs::kRegisteredProtocolHandlers);
-    return static_cast<int>(in_pref_handlers->GetListDeprecated().size());
+    return static_cast<int>(in_pref_handlers.size());
   }
 
   int InMemoryHandlerCount() {
diff --git a/components/feedback/redaction_tool.cc b/components/feedback/redaction_tool.cc
index 59ecec2..0cf6fce 100644
--- a/components/feedback/redaction_tool.cc
+++ b/components/feedback/redaction_tool.cc
@@ -53,6 +53,9 @@
     {"LocAC", "(\\bLocation area code: ')([0-9a-fA-F]+)(')",
      PIIType::kLocationInfo},
 
+    // Android. Must run first since this expression matches the replacement.
+    {"SSID", "(?i-s)(\\SSID: ['\"]??)(.+)(['\"]??)", PIIType::kSSID},
+
     // wpa_supplicant
     {"SSID", "(?i-s)(\\bssid[= ]')(.+)(')", PIIType::kSSID},
     {"SSID", "(?i-s)(\\bssid[= ]\")(.+)(\")", PIIType::kSSID},
diff --git a/components/feedback/redaction_tool_unittest.cc b/components/feedback/redaction_tool_unittest.cc
index 41d6790..75f1de06 100644
--- a/components/feedback/redaction_tool_unittest.cc
+++ b/components/feedback/redaction_tool_unittest.cc
@@ -366,6 +366,16 @@
             RedactCustomPatterns("ssid=\"LittleTsunami\""));
   EXPECT_EQ("* SSID=<SSID: 5>", RedactCustomPatterns("* SSID=agnagna"));
 
+  EXPECT_EQ("Specifier: <ArcNetworkFactory#1> SSID: <SSID: 6>",
+            RedactCustomPatterns(
+                "Specifier: <ArcNetworkFactory#1> SSID: \"GoogleGuest\""));
+  EXPECT_EQ("Specifier: <ArcNetworkFactory#1> SSID: <SSID: 7>",
+            RedactCustomPatterns(
+                "Specifier: <ArcNetworkFactory#1> SSID: 'GoogleGuest'"));
+  EXPECT_EQ("Specifier: <ArcNetworkFactory#1> SSID: <SSID: 8>",
+            RedactCustomPatterns(
+                "Specifier: <ArcNetworkFactory#1> SSID: GoogleGuest"));
+
   EXPECT_EQ("SerialNumber: <Serial: 1>",
             RedactCustomPatterns("SerialNumber: 1217D7EF"));
   EXPECT_EQ("serial  number: <Serial: 2>",
diff --git a/components/history/core/browser/expire_history_backend_unittest.cc b/components/history/core/browser/expire_history_backend_unittest.cc
index 58551a1..842697b 100644
--- a/components/history/core/browser/expire_history_backend_unittest.cc
+++ b/components/history/core/browser/expire_history_backend_unittest.cc
@@ -199,9 +199,8 @@
   // HistoryBackendNotifier:
   void NotifyFaviconsChanged(const std::set<GURL>& page_urls,
                              const GURL& icon_url) override {}
-  void NotifyURLVisited(ui::PageTransition transition,
-                        const URLRow& row,
-                        base::Time visit_time) override {}
+  void NotifyURLVisited(const URLRow& url_row,
+                        const VisitRow& visit_row) override {}
   void NotifyURLsModified(const URLRows& rows,
                           bool is_from_expiration) override {
     urls_modified_notifications_.push_back(
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index 95eba7a..b630f6a 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -1108,20 +1108,20 @@
     visit_info.originator_referring_visit = *originator_referring_visit;
   if (originator_opener_visit.has_value())
     visit_info.originator_opener_visit = *originator_opener_visit;
-  VisitID visit_id = db_->AddVisit(&visit_info, visit_source);
+  visit_info.visit_id = db_->AddVisit(&visit_info, visit_source);
 
   if (visit_info.visit_time < first_recorded_time_)
     first_recorded_time_ = visit_info.visit_time;
 
   // Broadcast a notification of the visit.
-  if (visit_id) {
-    NotifyURLVisited(transition, url_info, time);
+  if (visit_info.visit_id) {
+    NotifyURLVisited(url_info, visit_info);
   } else {
     DVLOG(0) << "Failed to build visit insert statement:  "
              << "url_id = " << url_id;
   }
 
-  return std::make_pair(url_id, visit_id);
+  return std::make_pair(url_id, visit_info.visit_id);
 }
 
 void HistoryBackend::AddPagesWithDetails(const URLRows& urls,
@@ -2739,13 +2739,13 @@
   delegate_->NotifyFaviconsChanged(page_urls, icon_url);
 }
 
-void HistoryBackend::NotifyURLVisited(ui::PageTransition transition,
-                                      const URLRow& row,
-                                      base::Time visit_time) {
+void HistoryBackend::NotifyURLVisited(const URLRow& url_row,
+                                      const VisitRow& visit_row) {
   for (HistoryBackendObserver& observer : observers_)
-    observer.OnURLVisited(this, transition, row, visit_time);
+    observer.OnURLVisited(this, url_row, visit_row);
 
-  delegate_->NotifyURLVisited(transition, row, visit_time);
+  delegate_->NotifyURLVisited(visit_row.transition, url_row,
+                              visit_row.visit_time);
 }
 
 void HistoryBackend::NotifyURLsModified(const URLRows& changed_urls,
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h
index 71169d7..4ef62c4 100644
--- a/components/history/core/browser/history_backend.h
+++ b/components/history/core/browser/history_backend.h
@@ -517,9 +517,7 @@
   bool GetVisitsForURL(URLID id, VisitVector* visits);
 
   // Fetches up to `max_visits` most recent visits for the passed URL.
-  bool GetMostRecentVisitsForURL(URLID id,
-                                 int max_visits,
-                                 VisitVector* visits) override;
+  bool GetMostRecentVisitsForURL(URLID id, int max_visits, VisitVector* visits);
 
   // For each element in `urls`, updates the pre-existing URLRow in the database
   // with the same ID; or ignores the element if no such row exists. Returns the
@@ -814,9 +812,8 @@
   // HistoryBackendNotifier:
   void NotifyFaviconsChanged(const std::set<GURL>& page_urls,
                              const GURL& icon_url) override;
-  void NotifyURLVisited(ui::PageTransition transition,
-                        const URLRow& row,
-                        base::Time visit_time) override;
+  void NotifyURLVisited(const URLRow& url_row,
+                        const VisitRow& visit_row) override;
   void NotifyURLsModified(const URLRows& changed_urls,
                           bool is_from_expiration) override;
   void NotifyURLsDeleted(DeletionInfo deletion_info) override;
diff --git a/components/history/core/browser/history_backend_notifier.h b/components/history/core/browser/history_backend_notifier.h
index 38d313c2..c09bf37 100644
--- a/components/history/core/browser/history_backend_notifier.h
+++ b/components/history/core/browser/history_backend_notifier.h
@@ -19,8 +19,8 @@
 // and main thread).
 class HistoryBackendNotifier {
  public:
-  HistoryBackendNotifier() {}
-  virtual ~HistoryBackendNotifier() {}
+  HistoryBackendNotifier() = default;
+  virtual ~HistoryBackendNotifier() = default;
 
   // Sends notification that the favicons for the given page URLs (e.g.
   // http://www.google.com) and the given icon URL (e.g.
@@ -30,10 +30,10 @@
   virtual void NotifyFaviconsChanged(const std::set<GURL>& page_urls,
                                      const GURL& icon_url) = 0;
 
-  // Sends notification that `transition` to `row` occurred at `visit_time`.
-  virtual void NotifyURLVisited(ui::PageTransition transition,
-                                const URLRow& row,
-                                base::Time visit_time) = 0;
+  // Sends notification that a visit to `url_row` occurred with the details
+  // (transition type, visit time, etc) given in `visit_row`.
+  virtual void NotifyURLVisited(const URLRow& url_row,
+                                const VisitRow& visit_row) = 0;
 
   // Sends notification that `changed_urls` have been changed or added.
   virtual void NotifyURLsModified(const URLRows& changed_urls,
diff --git a/components/history/core/browser/history_backend_observer.h b/components/history/core/browser/history_backend_observer.h
index 60bcf1a..7c7fd21 100644
--- a/components/history/core/browser/history_backend_observer.h
+++ b/components/history/core/browser/history_backend_observer.h
@@ -28,14 +28,13 @@
 
   virtual ~HistoryBackendObserver() = default;
 
-  // Called when user visits an URL.
+  // Called when the user visits an URL.
   //
-  // The `row` ID will be set to the value that is currently in effect in the
+  // The row IDs will be set to the values that are currently in effect in the
   // main history database.
   virtual void OnURLVisited(HistoryBackend* history_backend,
-                            ui::PageTransition transition,
-                            const URLRow& row,
-                            base::Time visit_time) = 0;
+                            const URLRow& url_row,
+                            const VisitRow& visit_row) = 0;
 
   // Called when a URL has been added or modified.
   //
diff --git a/components/history/core/browser/sync/history_backend_for_sync.h b/components/history/core/browser/sync/history_backend_for_sync.h
index 1cba1df..88477a8 100644
--- a/components/history/core/browser/sync/history_backend_for_sync.h
+++ b/components/history/core/browser/sync/history_backend_for_sync.h
@@ -26,9 +26,6 @@
   virtual bool GetURLByID(URLID url_id, URLRow* url_row) = 0;
   virtual bool GetLastVisitByTime(base::Time visit_time,
                                   VisitRow* visit_row) = 0;
-  virtual bool GetMostRecentVisitsForURL(URLID id,
-                                         int max_visits,
-                                         VisitVector* visits) = 0;
   virtual VisitVector GetRedirectChain(VisitRow visit) = 0;
 
   virtual bool GetForeignVisit(const std::string& originator_cache_guid,
diff --git a/components/history/core/browser/sync/history_sync_bridge.cc b/components/history/core/browser/sync/history_sync_bridge.cc
index 0d299e3..93e335c 100644
--- a/components/history/core/browser/sync/history_sync_bridge.cc
+++ b/components/history/core/browser/sync/history_sync_bridge.cc
@@ -40,7 +40,8 @@
   kApplySyncChangesWriteMetadata = 1,
   kOnDatabaseError = 2,
   kLoadMetadata = 3,
-  kOnURLVisitedGetVisit = 4,
+  // Deprecated (call site was removed):
+  // kOnURLVisitedGetVisit = 4,
   kOnURLsDeletedReadMetadata = 5,
   kOnVisitUpdatedGetURL = 6,
   kGetAllDataReadMetadata = 7,
@@ -468,11 +469,9 @@
 }
 
 void HistorySyncBridge::OnURLVisited(HistoryBackend* history_backend,
-                                     ui::PageTransition transition,
-                                     const URLRow& row,
-                                     base::Time visit_time) {
+                                     const URLRow& url_row,
+                                     const VisitRow& visit_row) {
   DCHECK(sequence_checker_.CalledOnValidSequence());
-  DCHECK_GE(row.typed_count(), 0);
 
   if (processing_syncer_changes_) {
     return;  // These are changes originating from us, ignore.
@@ -482,18 +481,6 @@
     return;  // Sync processor not yet ready, don't sync.
   }
 
-  std::vector<VisitRow> visits;
-  if (!history_backend_->GetMostRecentVisitsForURL(row.id(), /*max_visits=*/1,
-                                                   &visits)) {
-    RecordDatabaseError(SyncHistoryDatabaseError::kOnURLVisitedGetVisit);
-    return;
-  }
-  if (visits.size() != 1) {
-    RecordDatabaseError(SyncHistoryDatabaseError::kOnURLVisitedGetVisit);
-    return;
-  }
-  const VisitRow& visit_row = visits[0];
-
   // If this visit is not the end of a redirect chain, ignore it. Note that
   // visits that are not part of a redirect chain are considered to be both
   // start and end of a chain, so these are *not* ignored here.
diff --git a/components/history/core/browser/sync/history_sync_bridge.h b/components/history/core/browser/sync/history_sync_bridge.h
index 5abf1932..6d973ab 100644
--- a/components/history/core/browser/sync/history_sync_bridge.h
+++ b/components/history/core/browser/sync/history_sync_bridge.h
@@ -58,9 +58,8 @@
 
   // HistoryBackendObserver:
   void OnURLVisited(HistoryBackend* history_backend,
-                    ui::PageTransition transition,
-                    const URLRow& row,
-                    base::Time visit_time) override;
+                    const URLRow& url_row,
+                    const VisitRow& visit_row) override;
   void OnURLsModified(HistoryBackend* history_backend,
                       const URLRows& changed_urls,
                       bool is_from_expiration) override;
diff --git a/components/history/core/browser/sync/history_sync_bridge_unittest.cc b/components/history/core/browser/sync/history_sync_bridge_unittest.cc
index b5e1035c..8c8ecfde 100644
--- a/components/history/core/browser/sync/history_sync_bridge_unittest.cc
+++ b/components/history/core/browser/sync/history_sync_bridge_unittest.cc
@@ -503,8 +503,7 @@
 
   // Notify the bridge about the visit - it should be sent to the processor.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row.transition, url_row,
-      visit_row.visit_time);
+      /*history_backend=*/nullptr, url_row, visit_row);
 
   const std::string storage_key =
       HistorySyncMetadataDatabase::StorageKeyFromVisitTime(
@@ -540,8 +539,7 @@
 
   // Notify the bridge about the visit - it should be sent to the processor.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row.transition, url_row,
-      visit_row.visit_time);
+      /*history_backend=*/nullptr, url_row, visit_row);
 
   const std::string storage_key =
       HistorySyncMetadataDatabase::StorageKeyFromVisitTime(
@@ -605,11 +603,11 @@
 
   // Notify the bridge about all of the visits.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row1.transition, url_row1, visit_time);
+      /*history_backend=*/nullptr, url_row1, visit_row1);
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row2.transition, url_row2, visit_time);
+      /*history_backend=*/nullptr, url_row2, visit_row2);
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row3.transition, url_row3, visit_time);
+      /*history_backend=*/nullptr, url_row3, visit_row3);
 
   // The whole chain should have resulting in a single entity being Put().
   const std::string storage_key =
@@ -647,11 +645,9 @@
 
   // Notify the bridge about the visits - they should be sent to the processor.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row1.transition, url_row1,
-      visit_row1.visit_time);
+      /*history_backend=*/nullptr, url_row1, visit_row1);
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row2.transition, url_row2,
-      visit_row2.visit_time);
+      /*history_backend=*/nullptr, url_row2, visit_row2);
 
   EXPECT_EQ(processor()->GetEntities().size(), 2u);
   // The metadata for these entities should now be tracked.
@@ -706,8 +702,7 @@
 
   // Notify the bridge about the visit.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row1.transition, url_row1,
-      visit_row1.visit_time);
+      /*history_backend=*/nullptr, url_row1, visit_row1);
 
   EXPECT_EQ(processor()->GetEntities().size(), 1u);
 
@@ -738,11 +733,9 @@
 
   // Notify the bridge about the visits - they should be sent to the processor.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row1.transition, url_row1,
-      visit_row1.visit_time);
+      /*history_backend=*/nullptr, url_row1, visit_row1);
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row2.transition, url_row2,
-      visit_row2.visit_time);
+      /*history_backend=*/nullptr, url_row2, visit_row2);
   ASSERT_EQ(GetAllMetadata().size(), 2u);
 
   EXPECT_EQ(processor()->GetEntities().size(), 2u);
@@ -774,11 +767,9 @@
 
   // Notify the bridge about the visits - they should be sent to the processor.
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row1.transition, url_row1,
-      visit_row1.visit_time);
+      /*history_backend=*/nullptr, url_row1, visit_row1);
   bridge()->OnURLVisited(
-      /*history_backend=*/nullptr, visit_row2.transition, url_row2,
-      visit_row2.visit_time);
+      /*history_backend=*/nullptr, url_row2, visit_row2);
   ASSERT_EQ(GetAllMetadata().size(), 2u);
 
   EXPECT_EQ(processor()->GetEntities().size(), 2u);
diff --git a/components/history/core/browser/sync/test_history_backend_for_sync.cc b/components/history/core/browser/sync/test_history_backend_for_sync.cc
index 8a9846c..87aca636 100644
--- a/components/history/core/browser/sync/test_history_backend_for_sync.cc
+++ b/components/history/core/browser/sync/test_history_backend_for_sync.cc
@@ -98,27 +98,6 @@
   return visit_row->visit_id != 0;
 }
 
-bool TestHistoryBackendForSync::GetMostRecentVisitsForURL(URLID id,
-                                                          int max_visits,
-                                                          VisitVector* visits) {
-  // HistorySyncBridge only ever asks for the single most-recent visit.
-  DCHECK_EQ(max_visits, 1);
-
-  visits->clear();
-  for (const VisitRow& candidate : visits_) {
-    if (candidate.url_id == id) {
-      if (visits->empty()) {
-        visits->push_back(candidate);
-      } else if (candidate.visit_time > (*visits)[0].visit_time ||
-                 (candidate.visit_time == (*visits)[0].visit_time &&
-                  candidate.visit_id > (*visits)[0].visit_id)) {
-        (*visits)[0] = candidate;
-      }
-    }
-  }
-  return !visits->empty();
-}
-
 VisitVector TestHistoryBackendForSync::GetRedirectChain(VisitRow visit) {
   VisitVector result;
   result.push_back(visit);
diff --git a/components/history/core/browser/sync/test_history_backend_for_sync.h b/components/history/core/browser/sync/test_history_backend_for_sync.h
index a9673ea..8cce20b 100644
--- a/components/history/core/browser/sync/test_history_backend_for_sync.h
+++ b/components/history/core/browser/sync/test_history_backend_for_sync.h
@@ -40,9 +40,6 @@
   bool IsExpiredVisitTime(const base::Time& time) const override;
   bool GetURLByID(URLID url_id, URLRow* url_row) override;
   bool GetLastVisitByTime(base::Time visit_time, VisitRow* visit_row) override;
-  bool GetMostRecentVisitsForURL(URLID id,
-                                 int max_visits,
-                                 VisitVector* visits) override;
   VisitVector GetRedirectChain(VisitRow visit) override;
   bool GetForeignVisit(const std::string& originator_cache_guid,
                        VisitID originator_visit_id,
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.cc b/components/history/core/browser/sync/typed_url_sync_bridge.cc
index 585bffc..0371999 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge.cc
+++ b/components/history/core/browser/sync/typed_url_sync_bridge.cc
@@ -373,12 +373,11 @@
 }
 
 void TypedURLSyncBridge::OnURLVisited(HistoryBackend* history_backend,
-                                      ui::PageTransition transition,
-                                      const URLRow& row,
-                                      base::Time visit_time) {
+                                      const URLRow& url_row,
+                                      const VisitRow& visit_row) {
   DCHECK(sequence_checker_.CalledOnValidSequence());
   DCHECK(sync_metadata_database_);
-  DCHECK_GE(row.typed_count(), 0);
+  DCHECK_GE(url_row.typed_count(), 0);
 
   if (processing_syncer_changes_) {
     return;  // These are changes originating from us, ignore.
@@ -387,14 +386,14 @@
   if (!change_processor()->IsTrackingMetadata()) {
     return;  // Sync processor not yet ready, don't sync.
   }
-  if (!ShouldSyncVisit(row.typed_count(), transition)) {
+  if (!ShouldSyncVisit(url_row.typed_count(), visit_row.transition)) {
     return;
   }
 
   std::unique_ptr<syncer::MetadataChangeList> metadata_change_list =
       CreateMetadataChangeList();
 
-  UpdateSyncFromLocal(row, /*is_from_expiration=*/false,
+  UpdateSyncFromLocal(url_row, /*is_from_expiration=*/false,
                       metadata_change_list.get());
 }
 
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.h b/components/history/core/browser/sync/typed_url_sync_bridge.h
index f697a69..5c76256 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge.h
+++ b/components/history/core/browser/sync/typed_url_sync_bridge.h
@@ -56,9 +56,8 @@
 
   // HistoryBackendObserver:
   void OnURLVisited(HistoryBackend* history_backend,
-                    ui::PageTransition transition,
                     const URLRow& row,
-                    base::Time visit_time) override;
+                    const VisitRow& visit_row) override;
   void OnURLsModified(HistoryBackend* history_backend,
                       const std::vector<URLRow>& changed_urls,
                       bool is_from_expiration) override;
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
index 99798af6..518d888 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
+++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -39,7 +39,6 @@
 using syncer::EntityChange;
 using syncer::EntityChangeList;
 using syncer::EntityData;
-using syncer::KeyAndData;
 using syncer::MetadataBatch;
 using syncer::MetadataChangeList;
 using syncer::MockModelTypeChangeProcessor;
@@ -163,15 +162,14 @@
   Time last_visit_time = SinceEpoch(last_visit);
   history_url.set_last_visit(last_visit_time);
 
+  ui::PageTransition transition = ui::PAGE_TRANSITION_RELOAD;
+  bool incremented_omnibox_typed_score = false;
   if (typed_count > 0) {
-    // Add a typed visit for time `last_visit_time`.
-    visits->push_back(VisitRow(history_url.id(), last_visit_time, 0,
-                               ui::PAGE_TRANSITION_TYPED, 0, true, 0));
-  } else {
-    // Add a non-typed visit for time `last_visit_time`.
-    visits->push_back(VisitRow(history_url.id(), last_visit_time, 0,
-                               ui::PAGE_TRANSITION_RELOAD, 0, false, 0));
+    transition = ui::PAGE_TRANSITION_TYPED;
+    incremented_omnibox_typed_score = true;
   }
+  visits->push_back(VisitRow(history_url.id(), last_visit_time, 0, transition,
+                             0, incremented_omnibox_typed_score, 0));
 
   history_url.set_visit_count(visits->size());
   return history_url;
@@ -838,8 +836,8 @@
   StartSyncing({*typed_url});
 
   // Notify typed url sync service of the update.
-  bridge()->OnURLVisited(fake_history_backend_.get(), ui::PAGE_TRANSITION_TYPED,
-                         server_row, SinceEpoch(7));
+  bridge()->OnURLVisited(fake_history_backend_.get(), server_row,
+                         server_visits.front());
 }
 
 // Starting sync with both local and sync have same typed URL, but different
@@ -976,8 +974,8 @@
   changed_urls.push_back(url_row);
 
   // Notify typed url sync service of the update.
-  bridge()->OnURLVisited(fake_history_backend_.get(),
-                         ui::PAGE_TRANSITION_RELOAD, url_row, SinceEpoch(7));
+  bridge()->OnURLVisited(fake_history_backend_.get(), url_row,
+                         new_visits.front());
   // No change pass to processor
 }
 
@@ -1003,21 +1001,15 @@
   AddNewestVisit(ui::PAGE_TRANSITION_LINK, 6, &url_row, &new_visits);
   fake_history_backend_->SetVisitsForUrl(&url_row, new_visits);
 
-  ui::PageTransition transition = ui::PAGE_TRANSITION_LINK;
   // Notify typed url sync service of non-typed visit, expect no change.
-  bridge()->OnURLVisited(fake_history_backend_.get(), transition, url_row,
-                         SinceEpoch(6));
+  bridge()->OnURLVisited(fake_history_backend_.get(), url_row,
+                         new_visits.front());
   // No change pass to processor
 }
 
 // Appends a series of LINK visits followed by a TYPED one to an existing typed
 // url. Check that sync receives an UPDATE with the newest visit data.
 TEST_F(TypedURLSyncBridgeTest, TypedVisitLocalTypedUrl) {
-  std::vector<URLRow> url_rows;
-  std::vector<std::vector<VisitRow>> visit_vectors;
-  std::vector<std::string> urls;
-  urls.push_back(kURL);
-
   StartSyncing(std::vector<TypedUrlSpecifics>());
 
   // Update the URL row, adding another typed visit to the visit vector.
@@ -1032,9 +1024,7 @@
   EntityData entity_data;
   EXPECT_CALL(mock_processor_, Put(GetStorageKey(kURL), _, _))
       .WillOnce(SaveArgPointeeMove<1>(&entity_data));
-  ui::PageTransition transition = ui::PAGE_TRANSITION_TYPED;
-  bridge()->OnURLVisited(fake_history_backend_.get(), transition, url_row,
-                         Time());
+  bridge()->OnURLVisited(fake_history_backend_.get(), url_row, visits.front());
 
   const sync_pb::TypedUrlSpecifics& url_specifics =
       entity_data.specifics.typed_url();
@@ -1289,12 +1279,10 @@
   fake_history_backend_->SetVisitsForUrl(&url_row, visits);
 
   // Notify typed url sync service of typed visit.
-  const ui::PageTransition transition = ui::PAGE_TRANSITION_TYPED;
   EntityData entity_data;
   EXPECT_CALL(mock_processor_, Put(GetStorageKey(kURL), _, _))
       .WillOnce(SaveArgPointeeMove<1>(&entity_data));
-  bridge()->OnURLVisited(fake_history_backend_.get(), transition, url_row,
-                         Time());
+  bridge()->OnURLVisited(fake_history_backend_.get(), url_row, visits.front());
 
   const sync_pb::TypedUrlSpecifics& url_specifics =
       entity_data.specifics.typed_url();
@@ -1343,9 +1331,7 @@
   fake_history_backend_->SetVisitsForUrl(&url_row, visits);
 
   // Notify typed url sync service of typed visit.
-  ui::PageTransition transition = ui::PAGE_TRANSITION_TYPED;
-  bridge()->OnURLVisited(fake_history_backend_.get(), transition, url_row,
-                         Time());
+  bridge()->OnURLVisited(fake_history_backend_.get(), url_row, visits.front());
 
   visits.clear();
   for (; i % kVisitThrottleMultiple != 1; ++i) {
@@ -1358,8 +1344,7 @@
   EntityData entity_data;
   EXPECT_CALL(mock_processor_, Put(GetStorageKey(kURL), _, _))
       .WillOnce(SaveArgPointeeMove<1>(&entity_data));
-  bridge()->OnURLVisited(fake_history_backend_.get(), transition, url_row,
-                         Time());
+  bridge()->OnURLVisited(fake_history_backend_.get(), url_row, visits.front());
 
   ASSERT_EQ(i, entity_data.specifics.typed_url().visits_size());
 }
diff --git a/components/language/core/browser/ulp_metrics_logger.h b/components/language/core/browser/ulp_metrics_logger.h
index 6dd7f220..32265a2c 100644
--- a/components/language/core/browser/ulp_metrics_logger.h
+++ b/components/language/core/browser/ulp_metrics_logger.h
@@ -75,19 +75,19 @@
 
   // Returns an enum that indicates whether `language` is present in
   // `ulp_languages` and, if so, whether it was the first entry.
-  virtual ULPLanguageStatus DetermineLanguageStatus(
+  static ULPLanguageStatus DetermineLanguageStatus(
       const std::string& language,
       const std::vector<std::string>& ulp_languages);
 
   // Returns a number from 0-100 that indicates the ratio of ulp_languages that
   // are present in accept_languages. Only language bases are compared (e.g
   // pt-BR == pt-MZ).
-  virtual int ULPLanguagesInAcceptLanguagesRatio(
+  static int ULPLanguagesInAcceptLanguagesRatio(
       const std::vector<std::string> accept_languages,
       const std::vector<std::string> ulp_languages);
 
   // Returns a vector with languages that do not have a ULP base language match.
-  virtual std::vector<std::string> RemoveULPLanguages(
+  static std::vector<std::string> RemoveULPLanguages(
       const std::vector<std::string> languages,
       const std::vector<std::string> ulp_languages);
 };
diff --git a/components/language/core/browser/ulp_metrics_logger_unittest.cc b/components/language/core/browser/ulp_metrics_logger_unittest.cc
index 645a291..9a6eb15 100644
--- a/components/language/core/browser/ulp_metrics_logger_unittest.cc
+++ b/components/language/core/browser/ulp_metrics_logger_unittest.cc
@@ -91,81 +91,78 @@
 }
 
 TEST(ULPMetricsLoggerTest, TestDetermineLanguageStatus) {
-  ULPMetricsLogger logger;
   std::vector<std::string> ulp_languages = {"en-US", "es-419", "pt-BR", "de",
                                             "fr-CA"};
 
   EXPECT_EQ(ULPLanguageStatus::kTopULPLanguageExactMatch,
-            logger.DetermineLanguageStatus("en-US", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("en-US", ulp_languages));
 
   EXPECT_EQ(ULPLanguageStatus::kNonTopULPLanguageExactMatch,
-            logger.DetermineLanguageStatus("de", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("de", ulp_languages));
 
   EXPECT_EQ(ULPLanguageStatus::kTopULPLanguageBaseMatch,
-            logger.DetermineLanguageStatus("en-GB", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("en-GB", ulp_languages));
 
   EXPECT_EQ(ULPLanguageStatus::kNonTopULPLanguageBaseMatch,
-            logger.DetermineLanguageStatus("pt", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("pt", ulp_languages));
 
   EXPECT_EQ(ULPLanguageStatus::kLanguageNotInULP,
-            logger.DetermineLanguageStatus("zu", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("zu", ulp_languages));
 
   EXPECT_EQ(ULPLanguageStatus::kLanguageEmpty,
-            logger.DetermineLanguageStatus("", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("", ulp_languages));
 
   EXPECT_EQ(ULPLanguageStatus::kLanguageEmpty,
-            logger.DetermineLanguageStatus("und", ulp_languages));
+            ULPMetricsLogger::DetermineLanguageStatus("und", ulp_languages));
 }
 
 TEST(ULPMetricsLoggerTest, TestULPLanguagesInAcceptLanguagesRatio) {
-  ULPMetricsLogger logger;
   std::vector<std::string> ulp_languages = {"en-US", "es", "pt-BR", "de",
                                             "fr-CA"};
 
-  EXPECT_EQ(0, logger.ULPLanguagesInAcceptLanguagesRatio({"fi-FI", "af", "zu"},
-                                                         ulp_languages));
+  EXPECT_EQ(0, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
+                   {"fi-FI", "af", "zu"}, ulp_languages));
 
-  EXPECT_EQ(20, logger.ULPLanguagesInAcceptLanguagesRatio({"en-GB", "af", "zu"},
-                                                          ulp_languages));
+  EXPECT_EQ(20, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
+                    {"en-GB", "af", "zu"}, ulp_languages));
 
-  EXPECT_EQ(20, logger.ULPLanguagesInAcceptLanguagesRatio({"en", "af", "zu"},
-                                                          ulp_languages));
+  EXPECT_EQ(20, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
+                    {"en", "af", "zu"}, ulp_languages));
 
-  EXPECT_EQ(40, logger.ULPLanguagesInAcceptLanguagesRatio(
+  EXPECT_EQ(40, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
                     {"en-US", "af", "zu", "es"}, ulp_languages));
 
-  EXPECT_EQ(60, logger.ULPLanguagesInAcceptLanguagesRatio(
+  EXPECT_EQ(60, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
                     {"en-US", "af", "pt-BR", "es"}, ulp_languages));
 
-  EXPECT_EQ(60, logger.ULPLanguagesInAcceptLanguagesRatio(
+  EXPECT_EQ(60, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
                     {"en", "af", "pt", "es"}, ulp_languages));
 
-  EXPECT_EQ(60, logger.ULPLanguagesInAcceptLanguagesRatio(
+  EXPECT_EQ(60, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
                     {"en", "af", "pt-PT", "es"}, ulp_languages));
 
-  EXPECT_EQ(80, logger.ULPLanguagesInAcceptLanguagesRatio(
+  EXPECT_EQ(80, ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
                     {"en-US", "af", "pt-BR", "es", "de"}, ulp_languages));
 
   EXPECT_EQ(100,
-            logger.ULPLanguagesInAcceptLanguagesRatio(
+            ULPMetricsLogger::ULPLanguagesInAcceptLanguagesRatio(
                 {"en-US", "af", "pt-BR", "es", "de", "fr-CA"}, ulp_languages));
 }
 
 TEST(ULPMetricsLoggerTest, TestRemoveULPLanguages) {
-  ULPMetricsLogger logger;
   std::vector<std::string> ulp_languages = {"en-US", "es", "pt-BR", "de"};
 
-  EXPECT_THAT(
-      logger.RemoveULPLanguages({"af", "en", "am", "as"}, ulp_languages),
-      ElementsAre("af", "am", "as"));
+  EXPECT_THAT(ULPMetricsLogger::RemoveULPLanguages({"af", "en", "am", "as"},
+                                                   ulp_languages),
+              ElementsAre("af", "am", "as"));
 
-  EXPECT_THAT(logger.RemoveULPLanguages(
+  EXPECT_THAT(ULPMetricsLogger::RemoveULPLanguages(
                   {"en-GB", "af", "en-AU", "am", "pt", "as"}, ulp_languages),
               ElementsAre("af", "am", "as"));
 
-  EXPECT_THAT(
-      logger.RemoveULPLanguages({"en", "pt-BR", "es-MX"}, ulp_languages),
-      IsEmpty());
+  EXPECT_THAT(ULPMetricsLogger::RemoveULPLanguages({"en", "pt-BR", "es-MX"},
+                                                   ulp_languages),
+              IsEmpty());
 }
 
 }  // namespace language
diff --git a/components/language/core/common/language_experiments.cc b/components/language/core/common/language_experiments.cc
index e9d99ac..ee1300a 100644
--- a/components/language/core/common/language_experiments.cc
+++ b/components/language/core/common/language_experiments.cc
@@ -24,8 +24,6 @@
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 const base::Feature kForceAppLanguagePrompt{"ForceAppLanguagePrompt",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kNotifySyncOnLanguageDetermined{
-    "NotifySyncOnLanguageDetermined", base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kDetailedLanguageSettings{"DetailedLanguageSettings",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kDesktopDetailedLanguageSettings{
diff --git a/components/language/core/common/language_experiments.h b/components/language/core/common/language_experiments.h
index f9740ec..41a81876 100644
--- a/components/language/core/common/language_experiments.h
+++ b/components/language/core/common/language_experiments.h
@@ -33,9 +33,6 @@
 extern const char kBackoffThresholdKey[];
 extern const char kContentLanguagesDisableObserversParam[];
 
-// Notify sync to update data on language determined.
-extern const base::Feature kNotifySyncOnLanguageDetermined;
-
 // This feature uses the existing UI for the Full Page Translate bubble.
 extern const base::Feature kUseButtonTranslateBubbleUi;
 
diff --git a/components/nacl/renderer/json_manifest.cc b/components/nacl/renderer/json_manifest.cc
index a8e73cd0..02d916ab1 100644
--- a/components/nacl/renderer/json_manifest.cc
+++ b/components/nacl/renderer/json_manifest.cc
@@ -105,7 +105,7 @@
 // Error messages will be placed in |error_string|, given that the dictionary
 // was the property value of |container_key|.
 // E.g., "container_key" : dictionary
-bool IsValidDictionary(const base::DictionaryValue& dictionary,
+bool IsValidDictionary(const base::Value::Dict& dictionary,
                        const std::string& container_key,
                        const std::string& parent_key,
                        const char* const* valid_keys,
@@ -114,9 +114,7 @@
                        size_t required_key_count,
                        std::string* error_string) {
   // Check for unknown dictionary members.
-  for (base::DictionaryValue::Iterator it(dictionary); !it.IsAtEnd();
-       it.Advance()) {
-    const std::string& property_name = it.key();
+  for (const auto [property_name, unused_value] : dictionary) {
     if (!FindMatchingProperty(property_name,
                               valid_keys,
                               valid_key_count)) {
@@ -129,7 +127,7 @@
   }
   // Check for required members.
   for (size_t i = 0; i < required_key_count; ++i) {
-    if (!dictionary.FindKey(required_keys[i])) {
+    if (!dictionary.Find(required_keys[i])) {
       std::stringstream error_stream;
       error_stream << parent_key << " property '" << container_key
                    << "' does not have required key: '"
@@ -148,8 +146,8 @@
                     const std::string& parent_key,
                     const std::string& sandbox_isa,
                     std::string* error_string) {
-  const base::DictionaryValue* url_dict = nullptr;
-  if (!url_spec.GetAsDictionary(&url_dict)) {
+  const base::Value::Dict* url_dict = url_spec.GetIfDict();
+  if (!url_dict) {
     std::stringstream error_stream;
     error_stream << parent_key << " property '" << container_key
                  << "' is non-dictionary value '" << url_spec << "'.";
@@ -168,7 +166,7 @@
   } else {
     // URL specifications must not contain "pnacl-translate" keys.
     // This prohibits NaCl clients from invoking PNaCl.
-    if (url_dict->FindKey(kPnaclTranslateKey)) {
+    if (url_dict->Find(kPnaclTranslateKey)) {
       std::stringstream error_stream;
       error_stream << "PNaCl-like NMF with application/x-nacl mimetype instead "
                    << "of x-pnacl mimetype (has " << kPnaclTranslateKey << ").";
@@ -186,7 +184,7 @@
   }
   // Verify the correct types of the fields if they exist.
   // URL was already verified above by IsValidDictionary to be required.
-  const base::Value* url = url_dict->FindKey(kUrlKey);
+  const base::Value* url = url_dict->Find(kUrlKey);
   DCHECK(url);
   if (!url->is_string()) {
     std::stringstream error_stream;
@@ -196,7 +194,7 @@
     *error_string = error_stream.str();
     return false;
   }
-  if (const base::Value* opt_level = url_dict->FindKey(kOptLevelKey)) {
+  if (const base::Value* opt_level = url_dict->Find(kOptLevelKey)) {
     if (!opt_level->is_int()) {
       std::stringstream error_stream;
       error_stream << parent_key << " property '" << container_key
@@ -222,8 +220,8 @@
     kPnaclTranslateKey
   };
   static const char* kManifestPnaclSpecRequired[] = { kPnaclTranslateKey };
-  const base::DictionaryValue* pnacl_dict = nullptr;
-  if (!pnacl_spec.GetAsDictionary(&pnacl_dict)) {
+  const base::Value::Dict* pnacl_dict = pnacl_spec.GetIfDict();
+  if (!pnacl_dict) {
     std::stringstream error_stream;
     error_stream << parent_key << " property '" << container_key
                  << "' is non-dictionary value '" << pnacl_spec << "'.";
@@ -238,7 +236,7 @@
     return false;
   }
   // kPnaclTranslateKey checked to be required above.
-  const base::Value* url_spec = pnacl_dict->FindKey(kPnaclTranslateKey);
+  const base::Value* url_spec = pnacl_dict->Find(kPnaclTranslateKey);
   DCHECK(url_spec);
   return IsValidUrlSpec(*url_spec, kPnaclTranslateKey, container_key,
                         sandbox_isa, error_string);
@@ -350,16 +348,16 @@
   return true;
 }
 
-void GrabUrlAndPnaclOptions(const base::DictionaryValue& url_spec,
+void GrabUrlAndPnaclOptions(const base::Value::Dict& url_spec,
                             std::string* url,
                             PP_PNaClOptions* pnacl_options) {
   // url_spec should have been validated as a first pass.
-  const std::string* url_str = url_spec.FindStringKey(kUrlKey);
+  const std::string* url_str = url_spec.FindString(kUrlKey);
   DCHECK(url_str);
   *url = *url_str;
   pnacl_options->translate = PP_TRUE;
-  if (url_spec.FindKey(kOptLevelKey)) {
-    absl::optional<int32_t> opt_raw = url_spec.FindIntKey(kOptLevelKey);
+  if (url_spec.Find(kOptLevelKey)) {
+    absl::optional<int32_t> opt_raw = url_spec.FindInt(kOptLevelKey);
     DCHECK(opt_raw.has_value());
     // Currently only allow 0 or 2, since that is what we test.
     if (opt_raw.value() <= 0)
@@ -392,19 +390,14 @@
                          parsed_json.error().message;
     return false;
   }
-  std::unique_ptr<base::Value> json_data =
-      base::Value::ToUniquePtrValue(std::move(*parsed_json));
+  base::Value json_data = std::move(*parsed_json);
   // Ensure it's actually a dictionary before capturing as dictionary_.
-  base::DictionaryValue* json_dict = nullptr;
-  if (!json_data->GetAsDictionary(&json_dict)) {
+  if (!json_data.is_dict()) {
     error_info->error = PP_NACL_ERROR_MANIFEST_SCHEMA_VALIDATE;
     error_info->string = "manifest: is not a json dictionary.";
     return false;
   }
-  // Can't quite use json_data.swap(dictionary_), since the types are different
-  // so do this kludgy manual swap.
-  DCHECK(json_dict == json_data.get());
-  dictionary_.reset(static_cast<base::DictionaryValue*>(json_data.release()));
+  dictionary_ = std::move(json_data.GetDict());
   // Parse has ensured the string was valid JSON.  Check that it matches the
   // manifest schema.
   return MatchesSchema(error_info);
@@ -419,7 +412,7 @@
   CHECK(error_info);
 
   std::string nexe_url;
-  if (!GetURLFromISADictionary(*dictionary_, kProgramKey, &nexe_url,
+  if (!GetURLFromISADictionary(dictionary_, kProgramKey, &nexe_url,
                                pnacl_options, error_info)) {
     return false;
   }
@@ -444,15 +437,13 @@
 
 void JsonManifest::GetPrefetchableFiles(
     std::vector<NaClResourcePrefetchRequest>* out_files) const {
-  const base::DictionaryValue* files_dict;
-  if (!dictionary_->GetDictionaryWithoutPathExpansion(kFilesKey, &files_dict))
+  const base::Value::Dict* files_dict = dictionary_.FindDict(kFilesKey);
+  if (!files_dict)
     return;
 
-  for (base::DictionaryValue::Iterator it(*files_dict); !it.IsAtEnd();
-       it.Advance()) {
+  for (const auto [file_key, unused_value] : *files_dict) {
     std::string full_url;
     PP_PNaClOptions unused_pnacl_options;  // pnacl does not support "files".
-    const std::string& file_key = it.key();
     // We skip invalid entries in "files".
     if (GetKeyUrl(*files_dict, file_key, &full_url, &unused_pnacl_options)) {
       if (GURL(full_url).SchemeIs("chrome-extension"))
@@ -467,13 +458,13 @@
   if (full_url == NULL || pnacl_options == NULL)
     return false;
 
-  const base::DictionaryValue* files_dict;
-  if (!dictionary_->GetDictionaryWithoutPathExpansion(kFilesKey, &files_dict)) {
+  const base::Value::Dict* files_dict = dictionary_.FindDict(kFilesKey);
+  if (!files_dict) {
     VLOG(1) << "ResolveKey failed: no \"files\" dictionary";
     return false;
   }
 
-  if (!files_dict->FindKey(key)) {
+  if (!files_dict->Find(key)) {
     VLOG(1) << "ResolveKey failed: no such \"files\" entry: " << key;
     return false;
   }
@@ -484,9 +475,7 @@
   // The top level dictionary entries valid in the manifest file.
   static const char* kManifestTopLevelProperties[] = {
       kProgramKey, kInterpreterKey, kFilesKey};
-  for (base::DictionaryValue::Iterator it(*dictionary_); !it.IsAtEnd();
-       it.Advance()) {
-    const std::string& property_name = it.key();
+  for (const auto [property_name, unused_value] : dictionary_) {
     if (!FindMatchingProperty(property_name, kManifestTopLevelProperties,
                               std::size(kManifestTopLevelProperties))) {
       VLOG(1) << "JsonManifest::MatchesSchema: WARNING: unknown top-level "
@@ -495,7 +484,7 @@
   }
 
   // A manifest file must have a program section.
-  if (!dictionary_->FindKey(kProgramKey)) {
+  if (!dictionary_.Find(kProgramKey)) {
     error_info->error = PP_NACL_ERROR_MANIFEST_SCHEMA_VALIDATE;
     error_info->string = std::string("manifest: missing '") + kProgramKey +
                          "' section.";
@@ -505,17 +494,17 @@
   // Validate the program section.
   // There must be a matching (portable or sandbox_isa_) entry for program for
   // NaCl.
-  if (!IsValidISADictionary(dictionary_->GetDict(), kProgramKey, sandbox_isa_,
-                            true, error_info)) {
+  if (!IsValidISADictionary(dictionary_, kProgramKey, sandbox_isa_, true,
+                            error_info)) {
     return false;
   }
 
   // Validate the interpreter section (if given).
   // There must be a matching (portable or sandbox_isa_) entry for interpreter
   // for NaCl.
-  if (dictionary_->FindKey(kInterpreterKey)) {
-    if (!IsValidISADictionary(dictionary_->GetDict(), kInterpreterKey,
-                              sandbox_isa_, true, error_info)) {
+  if (dictionary_.Find(kInterpreterKey)) {
+    if (!IsValidISADictionary(dictionary_, kInterpreterKey, sandbox_isa_, true,
+                              error_info)) {
       return false;
     }
   }
@@ -524,32 +513,30 @@
   // The "files" key does not require a matching (portable or sandbox_isa_)
   // entry at schema validation time for NaCl.  This allows manifests to
   // specify resources that are only loaded for a particular sandbox_isa.
-  if (dictionary_->FindKey(kFilesKey)) {
-    const base::DictionaryValue* files_dictionary = nullptr;
-    if (!dictionary_->GetDictionaryWithoutPathExpansion(kFilesKey,
-                                                        &files_dictionary)) {
+  if (base::Value* files_value = dictionary_.Find(kFilesKey)) {
+    if (base::Value::Dict* files_dictionary = files_value->GetIfDict()) {
+      for (const auto [file_name, unused_value] : *files_dictionary) {
+        if (!IsValidISADictionary(*files_dictionary, file_name, sandbox_isa_,
+                                  false, error_info)) {
+          return false;
+        }
+      }
+    } else {
       error_info->error = PP_NACL_ERROR_MANIFEST_SCHEMA_VALIDATE;
       error_info->string = std::string("manifest: '") + kFilesKey +
                            "' is not a dictionary.";
-    }
-    for (base::DictionaryValue::Iterator it(*files_dictionary); !it.IsAtEnd();
-         it.Advance()) {
-      const std::string& file_name = it.key();
-      if (!IsValidISADictionary(files_dictionary->GetDict(), file_name,
-                                sandbox_isa_, false, error_info)) {
-        return false;
-      }
+      return false;
     }
   }
   return true;
 }
 
-bool JsonManifest::GetKeyUrl(const base::DictionaryValue& dictionary,
+bool JsonManifest::GetKeyUrl(const base::Value::Dict& dictionary,
                              const std::string& key,
                              std::string* full_url,
                              PP_PNaClOptions* pnacl_options) const {
   DCHECK(full_url && pnacl_options);
-  if (!dictionary.FindKey(key)) {
+  if (!dictionary.Find(key)) {
     VLOG(1) << "GetKeyUrl failed: file " << key << " not found in manifest.";
     return false;
   }
@@ -571,16 +558,15 @@
 }
 
 bool JsonManifest::GetURLFromISADictionary(
-    const base::DictionaryValue& parent_dictionary,
+    const base::Value::Dict& parent_dictionary,
     const std::string& parent_key,
     std::string* url,
     PP_PNaClOptions* pnacl_options,
     ErrorInfo* error_info) const {
   DCHECK(url && pnacl_options && error_info);
 
-  const base::DictionaryValue* dictionary = nullptr;
-  if (!parent_dictionary.GetDictionaryWithoutPathExpansion(parent_key,
-                                                           &dictionary)) {
+  const base::Value::Dict* dictionary = parent_dictionary.FindDict(parent_key);
+  if (!dictionary) {
     error_info->error = PP_NACL_ERROR_MANIFEST_RESOLVE_URL;
     error_info->string = std::string("GetURLFromISADictionary failed: ") +
                          parent_key + "'s value is not a json dictionary.";
@@ -590,8 +576,8 @@
   // When the application actually requests a resolved URL, we must have
   // a matching entry (sandbox_isa_ or portable) for NaCl.
   ErrorInfo ignored_error_info;
-  if (!IsValidISADictionary(parent_dictionary.GetDict(), parent_key,
-                            sandbox_isa_, true, &ignored_error_info)) {
+  if (!IsValidISADictionary(parent_dictionary, parent_key, sandbox_isa_, true,
+                            &ignored_error_info)) {
     error_info->error = PP_NACL_ERROR_MANIFEST_RESOLVE_URL;
     error_info->string = "architecture " + sandbox_isa_ +
                          " is not found for file " + parent_key;
@@ -604,9 +590,9 @@
   if (sandbox_isa_ == kPortableKey) {
     chosen_isa = kPortableKey;
   } else {
-    if (dictionary->FindKey(sandbox_isa_)) {
+    if (dictionary->Find(sandbox_isa_)) {
       chosen_isa = sandbox_isa_;
-    } else if (dictionary->FindKey(kPortableKey)) {
+    } else if (dictionary->Find(kPortableKey)) {
       chosen_isa = kPortableKey;
     } else {
       // Should not reach here, because the earlier IsValidISADictionary()
@@ -616,8 +602,8 @@
     }
   }
 
-  const base::DictionaryValue* isa_spec = nullptr;
-  if (!dictionary->GetDictionaryWithoutPathExpansion(chosen_isa, &isa_spec)) {
+  const base::Value::Dict* isa_spec = dictionary->FindDict(chosen_isa);
+  if (!isa_spec) {
     error_info->error = PP_NACL_ERROR_MANIFEST_RESOLVE_URL;
     error_info->string = std::string("GetURLFromISADictionary failed: ") +
                          chosen_isa + "'s value is not a json dictionary.";
@@ -626,10 +612,9 @@
   // If the PNaCl debug flag is turned on, look for pnacl-debug entries first.
   // If found, mark that it is a debug URL. Otherwise, fall back to
   // checking for pnacl-translate URLs, etc. and don't mark it as a debug URL.
-  if (pnacl_debug_ && isa_spec->FindKey(kPnaclDebugKey)) {
-    const base::DictionaryValue* pnacl_dict = nullptr;
-    if (!isa_spec->GetDictionaryWithoutPathExpansion(kPnaclDebugKey,
-                                                     &pnacl_dict)) {
+  if (pnacl_debug_ && isa_spec->Find(kPnaclDebugKey)) {
+    const base::Value::Dict* pnacl_dict = isa_spec->FindDict(kPnaclDebugKey);
+    if (!pnacl_dict) {
       error_info->error = PP_NACL_ERROR_MANIFEST_RESOLVE_URL;
       error_info->string = std::string("GetURLFromISADictionary failed: ") +
                            kPnaclDebugKey +
@@ -638,10 +623,10 @@
     }
     GrabUrlAndPnaclOptions(*pnacl_dict, url, pnacl_options);
     pnacl_options->is_debug = PP_TRUE;
-  } else if (isa_spec->FindKey(kPnaclTranslateKey)) {
-    const base::DictionaryValue* pnacl_dict = nullptr;
-    if (!isa_spec->GetDictionaryWithoutPathExpansion(kPnaclTranslateKey,
-                                                     &pnacl_dict)) {
+  } else if (isa_spec->Find(kPnaclTranslateKey)) {
+    const base::Value::Dict* pnacl_dict =
+        isa_spec->FindDict(kPnaclTranslateKey);
+    if (!pnacl_dict) {
       error_info->error = PP_NACL_ERROR_MANIFEST_RESOLVE_URL;
       error_info->string = std::string("GetURLFromISADictionary failed: ") +
                            kPnaclTranslateKey +
@@ -651,7 +636,7 @@
     GrabUrlAndPnaclOptions(*pnacl_dict, url, pnacl_options);
   } else {
     // The native NaCl case.
-    const std::string* url_str = isa_spec->FindStringKey(kUrlKey);
+    const std::string* url_str = isa_spec->FindString(kUrlKey);
     if (!url_str) {
       error_info->error = PP_NACL_ERROR_MANIFEST_RESOLVE_URL;
       error_info->string = std::string("GetURLFromISADictionary failed: ") +
diff --git a/components/nacl/renderer/json_manifest.h b/components/nacl/renderer/json_manifest.h
index 6c9067b2..c0158ab 100644
--- a/components/nacl/renderer/json_manifest.h
+++ b/components/nacl/renderer/json_manifest.h
@@ -54,11 +54,11 @@
 
  private:
   bool MatchesSchema(ErrorInfo* error_info);
-  bool GetKeyUrl(const base::DictionaryValue& dictionary,
+  bool GetKeyUrl(const base::Value::Dict& dictionary,
                  const std::string& key,
                  std::string* full_url,
                  PP_PNaClOptions* pnacl_options) const;
-  bool GetURLFromISADictionary(const base::DictionaryValue& parent_dictionary,
+  bool GetURLFromISADictionary(const base::Value::Dict& parent_dictionary,
                                const std::string& parent_key,
                                std::string* url,
                                PP_PNaClOptions* pnacl_options,
@@ -69,7 +69,7 @@
   bool pnacl_debug_;
 
   // The dictionary of manifest information parsed in Init().
-  std::unique_ptr<base::DictionaryValue> dictionary_;
+  base::Value::Dict dictionary_;
 };
 
 }  // namespace nacl
diff --git a/components/page_info/page_info_ui.h b/components/page_info/page_info_ui.h
index 3736da6..965e357 100644
--- a/components/page_info/page_info_ui.h
+++ b/components/page_info/page_info_ui.h
@@ -241,10 +241,6 @@
   static std::unique_ptr<SecurityDescription>
   CreateSafetyTipSecurityDescription(const security_state::SafetyTipInfo& info);
 
-  // Ensures the cookie information UI is present, with placeholder information
-  // if necessary.
-  virtual void EnsureCookieInfo() {}
-
   // Sets cookie information.
   virtual void SetCookieInfo(const CookieInfoList& cookie_info_list) {}
 
diff --git a/components/password_manager/core/browser/form_parsing/form_parser.cc b/components/password_manager/core/browser/form_parsing/form_parser.cc
index bb599b93..2bb4826 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser.cc
@@ -331,15 +331,12 @@
         }
         break;
       case CredentialFieldType::kSingleUsername:
-        if (base::FeatureList::IsEnabled(
-                password_manager::features::kUsernameFirstFlowFilling)) {
-          processed_field = FindField(processed_fields, prediction);
-          if (processed_field) {
-            result->username = processed_field->field;
-            result->is_single_username = true;
-            result->ClearAllPasswordFields();
-            return;
-          }
+        processed_field = FindField(processed_fields, prediction);
+        if (processed_field) {
+          result->username = processed_field->field;
+          result->is_single_username = true;
+          result->ClearAllPasswordFields();
+          return;
         }
         break;
       case CredentialFieldType::kCurrentPassword:
diff --git a/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc b/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
index 7c142fc..79ac49c 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser_unittest.cc
@@ -2653,8 +2653,6 @@
 }
 
 TEST(FormParserTest, SingleUsernamePrediction) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlowFilling);
   CheckTestData({
       {
           .description_for_logging = "1 field",
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index 921055c..d6f22d22 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -101,10 +101,6 @@
   return false;
 }
 
-bool IsUsernameFirstFlowFeatureEnabled() {
-  return base::FeatureList::IsEnabled(features::kUsernameFirstFlow);
-}
-
 void LogUsingPossibleUsername(PasswordManagerClient* client,
                               bool is_used,
                               const char* message) {
@@ -749,8 +745,7 @@
   votes_uploader_.clear_single_username_vote_data();
 
   // TODO(crbug.com/959776): Reset possible username after it's used.
-  if (IsUsernameFirstFlowFeatureEnabled() &&
-      parsed_submitted_form_->username_value.empty() &&
+  if (parsed_submitted_form_->username_value.empty() &&
       !parsed_submitted_form_->password_value.empty()) {
     if (IsPossibleSingleUsernameAvailable(possible_username)) {
       // Suggest the possible username value in a prompt if the server confirmed
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc
index 36fd0ba9..4eb4811 100644
--- a/components/password_manager/core/browser/password_form_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -2196,9 +2196,6 @@
 
 // Tests provisional saving of credentials during username first flow.
 TEST_P(PasswordFormManagerTest, UsernameFirstFlowProvisionalSave) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
-
   CreateFormManager(observed_form_only_password_fields_);
   SetNonFederatedAndNotifyFetchCompleted({&saved_match_});
 
@@ -2235,9 +2232,6 @@
 // Tests that username is not taken if domains of possible username field
 // and submitted password form are different.
 TEST_P(PasswordFormManagerTest, UsernameFirstFlowDifferentDomains) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
-
   CreateFormManager(observed_form_only_password_fields_);
   fetcher_->NotifyFetchCompleted();
 
@@ -2265,9 +2259,6 @@
 // Tests that username is not taken during the sign up flow (when there is no
 // current password field in the password form).
 TEST_P(PasswordFormManagerTest, UsernameFirstFlowSignupForm) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
-
   CreateFormManager(observed_form_only_password_fields_);
   fetcher_->NotifyFetchCompleted();
 
@@ -2297,8 +2288,7 @@
 TEST_P(PasswordFormManagerTest, UsernameFirstFlow) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
-      /*enabled_features=*/{features::kUsernameFirstFlow,
-                            features::kUsernameFirstFlowFallbackCrowdsourcing},
+      /*enabled_features=*/{features::kUsernameFirstFlowFallbackCrowdsourcing},
       /*disabled_features=*/{});
 
   for (bool is_password_update : {false, true}) {
@@ -2398,8 +2388,7 @@
 TEST_P(PasswordFormManagerTest, NegativeUsernameFirstFlowVotes) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
-      /*enabled_features=*/{features::kUsernameFirstFlow,
-                            features::kUsernameFirstFlowFallbackCrowdsourcing},
+      /*enabled_features=*/{features::kUsernameFirstFlowFallbackCrowdsourcing},
       /*disabled_features=*/{});
 
   constexpr char16_t kPossibleUsername[] = u"possible_username";
@@ -2492,8 +2481,7 @@
 TEST_P(PasswordFormManagerTest, UsernameFirstFlowVotesNamelessField) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitWithFeatures(
-      /*enabled_features=*/{features::kUsernameFirstFlow,
-                            features::kUsernameFirstFlowFallbackCrowdsourcing},
+      /*enabled_features=*/{features::kUsernameFirstFlowFallbackCrowdsourcing},
       /*disabled_features=*/{});
 
   CreateFormManager(observed_form_only_password_fields_);
@@ -2548,9 +2536,6 @@
 // Tests that server prediction are taken into consideration for offering
 // username on username first flow.
 TEST_P(PasswordFormManagerTest, PossibleUsernameServerPredictions) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
-
   const std::u16string username_field_name = u"username_field";
   const std::u16string possible_username = u"possible_username";
   PossibleUsernameData possible_username_data(
@@ -3274,8 +3259,6 @@
 
 // Tests that username is taken during username first flow.
 TEST_F(PasswordFormManagerTestWithMockedSaver, UsernameFirstFlow) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
   CreateFormManager(observed_form_only_password_fields_);
   SetNonFederatedAndNotifyFetchCompleted({&saved_match_});
 
@@ -3301,8 +3284,6 @@
 // Tests that username is not taken when a possible username is not valid.
 TEST_F(PasswordFormManagerTestWithMockedSaver,
        UsernameFirstFlowDifferentDomains) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
   CreateFormManager(observed_form_only_password_fields_);
   fetcher_->NotifyFetchCompleted();
 
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc
index 6ff6b8d..3972c04f 100644
--- a/components/password_manager/core/browser/password_manager_unittest.cc
+++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -3062,8 +3062,6 @@
 // server predictions are not ignored and used for filling in case there are
 // multiple forms on a page, including forms that have UsernameFirstFlow votes.
 TEST_P(PasswordManagerTest, AutofillPredictionBeforeMultipleFormsParsed) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlowFilling);
   PasswordFormManager::set_wait_for_server_predictions_for_filling(true);
   EXPECT_CALL(client_, IsSavingAndFillingEnabled(_))
       .WillRepeatedly(Return(true));
@@ -3461,8 +3459,6 @@
 
 // Check that a non-password form with SINGLE_USERNAME prediction is filled.
 TEST_P(PasswordManagerTest, FillSingleUsername) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlowFilling);
   PasswordFormManager::set_wait_for_server_predictions_for_filling(true);
   EXPECT_CALL(client_, IsSavingAndFillingEnabled(_))
       .WillRepeatedly(Return(true));
@@ -3550,9 +3546,6 @@
 // Checks that username is suggested in the save prompt and saved on username
 // first flow if SINGLE_USERNAME server prediction is available.
 TEST_P(PasswordManagerTest, UsernameFirstFlowSavingWithServerPredictions) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
-
   PasswordForm saved_form(MakeSavedForm());
   EXPECT_CALL(*store_, GetLogins(_, _))
       .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), saved_form)));
@@ -3605,9 +3598,6 @@
 // Checks that possible single username value is not suggested in the save
 // prompt if SINGLE_USERNAME server prediction is not available.
 TEST_P(PasswordManagerTest, UsernameFirstFlowSavingWithoutServerPredictions) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
-
   PasswordForm saved_form(MakeSavedForm());
   EXPECT_CALL(*store_, GetLogins(_, _))
       .WillRepeatedly(WithArg<1>(InvokeConsumer(store_.get(), saved_form)));
@@ -3659,8 +3649,6 @@
 // credentials if a navigation that cannot be a result of form submission
 // happens between submitting single password and single username forms.
 TEST_P(PasswordManagerTest, UsernameFirstFlowWithNavigationInTheMiddle) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlow);
   EXPECT_CALL(*store_, GetLogins(_, _))
       .WillRepeatedly(WithArg<1>(InvokeEmptyConsumerWithForms(store_.get())));
 
@@ -3705,8 +3693,6 @@
 //  Checks that username is filled on username first flow based on server and
 //  local predictions.
 TEST_P(PasswordManagerTest, UsernameFirstFlowFilling) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(features::kUsernameFirstFlowFilling);
   EXPECT_CALL(*store_, GetLogins(_, _))
       .WillRepeatedly(
           WithArg<1>(InvokeConsumer(store_.get(), MakeSavedForm())));
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index eb920b5..e5a8f4a 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -231,21 +231,11 @@
 const base::Feature kUnifiedPasswordManagerDesktop = {
     "UnifiedPasswordManagerDesktop", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Enables support of sending votes on username first flow. The votes are sent
-// on single username forms and are based on user interaction with the save
-// prompt.
-// TODO(crbug.com/959776): Clean up code 2-3 milestones after the launch.
-const base::Feature kUsernameFirstFlow = {"UsernameFirstFlow",
-                                          base::FEATURE_ENABLED_BY_DEFAULT};
-
-// Enables support of filling and saving on username first flow.
-// TODO(crbug.com/959776): Clean up code 2-3 milestones after the launch.
-const base::Feature kUsernameFirstFlowFilling = {
-    "UsernameFirstFlowFilling", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enables support of sending additional votes on username first flow. The votes
 // are sent on single password forms and contain information about preceding
 // single username forms.
+// TODO(crbug.com/959776): Clean up if the main crowdsourcing is good enough and
+// we don't need additional signals.
 const base::Feature kUsernameFirstFlowFallbackCrowdsourcing = {
     "UsernameFirstFlowFallbackCrowdsourcing",
     base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h
index 5651e84..0583cd5 100644
--- a/components/password_manager/core/common/password_manager_features.h
+++ b/components/password_manager/core/common/password_manager_features.h
@@ -73,8 +73,6 @@
 extern const base::Feature kShowUPMErrorNotification;
 #endif
 extern const base::Feature kUnifiedPasswordManagerDesktop;
-extern const base::Feature kUsernameFirstFlow;
-extern const base::Feature kUsernameFirstFlowFilling;
 extern const base::Feature kUsernameFirstFlowFallbackCrowdsourcing;
 
 // All features parameters are in alphabetical order.
diff --git a/components/performance_manager/v8_memory/v8_context_tracker.h b/components/performance_manager/v8_memory/v8_context_tracker.h
index 7da196a..28ad83b5 100644
--- a/components/performance_manager/v8_memory/v8_context_tracker.h
+++ b/components/performance_manager/v8_memory/v8_context_tracker.h
@@ -97,8 +97,7 @@
     // A pointer to the upstream ExecutionContextState that this V8Context is
     // associated with. Note that this can be nullptr for V8Contexts that are
     // not associated with an ExecutionContext.
-    const raw_ptr<ExecutionContextState, DanglingUntriaged>
-        execution_context_state;
+    raw_ptr<ExecutionContextState> execution_context_state;
 
     // Whether or not this context is detached. A context becomes detached
     // when the blink::ExecutionContext it was associated with is torn down.
diff --git a/components/performance_manager/v8_memory/v8_context_tracker_internal.cc b/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
index bc8a0f2..77d865f8 100644
--- a/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
+++ b/components/performance_manager/v8_memory/v8_context_tracker_internal.cc
@@ -149,9 +149,15 @@
   // If this is the last reference keeping alive a tracked ExecutionContextData,
   // then clean it up as well. Untracked ExecutionContextDatas will go out of
   // scope on their own.
-  if (auto* ecd = GetExecutionContextData()) {
-    if (ecd->DecrementV8ContextCount(PassKey()) && ecd->IsTracked())
-      process_data_->data_store()->Destroy(ecd->GetToken());
+  auto* execution_context_data = GetExecutionContextData();
+  if (execution_context_data &&
+      execution_context_data->DecrementV8ContextCount(PassKey()) &&
+      execution_context_data->IsTracked()) {
+    // Reset the execution_context_state to nullptr because it will be
+    // destroyed using the token below.
+    blink::ExecutionContextToken token = execution_context_data->GetToken();
+    execution_context_state = nullptr;
+    process_data_->data_store()->Destroy(token);
   }
 }
 
diff --git a/components/services/app_service/public/cpp/features.cc b/components/services/app_service/public/cpp/features.cc
index a645228..dd3bdbe1 100644
--- a/components/services/app_service/public/cpp/features.cc
+++ b/components/services/app_service/public/cpp/features.cc
@@ -10,6 +10,6 @@
     "AppServicePreferredAppsWithoutMojom", base::FEATURE_ENABLED_BY_DEFAULT};
 
 const base::Feature kAppServiceLaunchWithoutMojom{
-    "AppServiceLaunchWithoutMojom", base::FEATURE_DISABLED_BY_DEFAULT};
+    "AppServiceLaunchWithoutMojom", base::FEATURE_ENABLED_BY_DEFAULT};
 
 }  // namespace apps
diff --git a/components/services/screen_ai/screen_ai_service_impl.cc b/components/services/screen_ai/screen_ai_service_impl.cc
index 2e7a75c..9b2eb2a 100644
--- a/components/services/screen_ai/screen_ai_service_impl.cc
+++ b/components/services/screen_ai/screen_ai_service_impl.cc
@@ -49,7 +49,8 @@
           /*init_main_content_extraction = */
           features::IsReadAnythingWithScreen2xEnabled(),
           /*debug_mode = */ features::IsScreenAIDebugModeEnabled(),
-          /*models_path = */ GetLibraryFilePath().DirName().MaybeAsASCII())) {
+          /*models_path = */
+          GetLibraryFilePath().DirName().MaybeAsASCII().c_str())) {
     // TODO(https://crbug.com/1278249): Add UMA metrics to monitor failures.
     VLOG(0) << "Screen AI library initialization failed.";
     base::Process::TerminateCurrentProcessImmediately(-1);
@@ -77,13 +78,20 @@
   VLOG(2) << "Screen AI library starting to process " << image.width() << "x"
           << image.height() << " snapshot.";
 
-  std::string annotation_text;
+  char* annotation_proto = nullptr;
+  uint32_t annotation_proto_length = 0;
   // TODO(https://crbug.com/1278249): Consider adding a signature that
   // verifies the data integrity and source.
-  if (annotate_function_(image, annotation_text)) {
+  if (annotate_function_(image, annotation_proto, annotation_proto_length)) {
+    DCHECK(annotation_proto);
+    std::string proto_as_string;
+    proto_as_string.resize(annotation_proto_length);
+    memcpy(static_cast<void*>(proto_as_string.data()), annotation_proto,
+           annotation_proto_length);
+    delete annotation_proto;
     gfx::Rect image_rect(image.width(), image.height());
     update =
-        ScreenAIVisualAnnotationToAXTreeUpdate(annotation_text, image_rect);
+        ScreenAIVisualAnnotationToAXTreeUpdate(proto_as_string, image_rect);
   } else {
     VLOG(1) << "Screen AI library could not process snapshot.";
   }
@@ -96,13 +104,23 @@
   std::string serialized_snapshot = Screen2xSnapshotToViewHierarchy(snapshot);
   std::vector<int32_t> content_node_ids;
 
-  if (!extract_main_content_function_(serialized_snapshot, content_node_ids)) {
+  int32_t* node_ids = nullptr;
+  uint32_t nodes_count = 0;
+  if (!extract_main_content_function_(serialized_snapshot.c_str(),
+                                      serialized_snapshot.length(), node_ids,
+                                      nodes_count)) {
     VLOG(1) << "Screen2x did not return main content.";
   } else {
+    content_node_ids.resize(nodes_count);
+    memcpy(content_node_ids.data(), node_ids, nodes_count * sizeof(int32_t));
+    delete[] node_ids;
+    node_ids = nullptr;
+
     VLOG(2) << "Screen2x returned " << content_node_ids.size() << " node ids:";
     for (int32_t i : content_node_ids)
       VLOG(2) << i;
   }
+
   std::move(callback).Run(content_node_ids);
 }
 
diff --git a/components/services/screen_ai/screen_ai_service_impl.h b/components/services/screen_ai/screen_ai_service_impl.h
index 384e83a..051bda2 100644
--- a/components/services/screen_ai/screen_ai_service_impl.h
+++ b/components/services/screen_ai/screen_ai_service_impl.h
@@ -51,19 +51,35 @@
       mojo::PendingReceiver<mojom::Screen2xMainContentExtractor>
           main_content_extractor) override;
 
+  // Initializes the pipelines.
+  // |models_folder| is a null terminated string pointing to the folder that
+  // includes model files.
   typedef bool (*InitFunction)(bool /*init_visual_annotations*/,
                                bool /*init_main_content_extraction*/,
                                bool /*debug_mode*/,
-                               const std::string& /*models_path*/);
+                               const char* /*models_path*/);
   InitFunction init_function_;
 
-  typedef bool (*AnnotateFunction)(const SkBitmap& /*image*/,
-                                   std::string& /*annotation_text*/);
+  // Sends the given bitmap to ScreenAI pipeline and returns visual annotations.
+  // The annoations will be returned as a serialized VisualAnnotation proto.
+  // |serialized_visual_annotation| will be allocated for the output and the
+  // ownership of the buffer will be passed to the caller function.
+  typedef bool (*AnnotateFunction)(
+      const SkBitmap& /*bitmap*/,
+      char*& /*serialized_visual_annotation*/,
+      uint32_t& /*serialized_visual_annotation_length*/);
   AnnotateFunction annotate_function_;
 
+  // Passes the given accessibility tree proto to Screen2x pipeline and returns
+  // the main content ids.
+  // The input is in form of a serialized ViewHierarchy proto.
+  // |content_node_ids| will be allocated for the outputs and the ownership of
+  // the array will be passed to the caller function.
   typedef bool (*ExtractMainContentFunction)(
-      const std::string& /*serialized_snapshot*/,
-      std::vector<int32_t>& /*content_node_ids*/);
+      const char* /*serialized_view_hierarchy*/,
+      uint32_t /*serialized_view_hierarchy_length*/,
+      int32_t*& /*&content_node_ids*/,
+      uint32_t& /*content_node_ids_length*/);
   ExtractMainContentFunction extract_main_content_function_;
 
   mojo::Receiver<mojom::ScreenAIService> receiver_;
diff --git a/components/storage_monitor/storage_monitor_chromeos.cc b/components/storage_monitor/storage_monitor_chromeos.cc
index 23399ab3..96f392f 100644
--- a/components/storage_monitor/storage_monitor_chromeos.cc
+++ b/components/storage_monitor/storage_monitor_chromeos.cc
@@ -64,7 +64,7 @@
 
   const Disk* disk =
       DiskMountManager::GetInstance()->FindDiskBySourcePath(source_path);
-  if (!disk || disk->device_type() == chromeos::DEVICE_TYPE_UNKNOWN)
+  if (!disk || disk->device_type() == ash::DeviceType::kUnknown)
     return false;
 
   std::string unique_id = MakeDeviceUniqueId(*disk);
diff --git a/components/storage_monitor/storage_monitor_chromeos_unittest.cc b/components/storage_monitor/storage_monitor_chromeos_unittest.cc
index 2273894..fbe7a5e 100644
--- a/components/storage_monitor/storage_monitor_chromeos_unittest.cc
+++ b/components/storage_monitor/storage_monitor_chromeos_unittest.cc
@@ -128,7 +128,7 @@
                    const std::string& device_label,
                    const std::string& vendor_name,
                    const std::string& product_name,
-                   chromeos::DeviceType device_type,
+                   ash::DeviceType device_type,
                    uint64_t device_size_in_bytes);
 
   void UnmountDevice(chromeos::MountError error_code,
@@ -206,7 +206,7 @@
     const std::string& device_label,
     const std::string& vendor_name,
     const std::string& product_name,
-    chromeos::DeviceType device_type,
+    ash::DeviceType device_type,
     uint64_t device_size_in_bytes) {
   if (error_code == chromeos::MOUNT_ERROR_NONE) {
     disk_mount_manager_mock_->CreateDiskEntryForMountDevice(
@@ -266,7 +266,7 @@
               kDevice1Name,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(1, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -291,7 +291,7 @@
               kDevice2Name,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice2SizeInBytes);
   EXPECT_EQ(2, observer().attach_calls());
   EXPECT_EQ(1, observer().detach_calls());
@@ -324,7 +324,7 @@
               kDevice1Name,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(1, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -349,7 +349,7 @@
               kDevice1Name,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(0, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -362,7 +362,7 @@
               kDevice1Name,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(0, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -377,7 +377,7 @@
               kDevice1Name,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(0, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -395,7 +395,7 @@
               kSDCardDeviceName1,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_SD,
+              ash::DeviceType::kSD,
               kSDCardSizeInBytes);
   EXPECT_EQ(1, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -420,7 +420,7 @@
               kSDCardDeviceName2,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_SD,
+              ash::DeviceType::kSD,
               kSDCardSizeInBytes);
   EXPECT_EQ(2, observer().attach_calls());
   EXPECT_EQ(1, observer().detach_calls());
@@ -447,7 +447,7 @@
               kEmptyDeviceLabel,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(1, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -474,7 +474,7 @@
               kEmptyDeviceLabel,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(1, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
@@ -502,7 +502,7 @@
               kEmptyDeviceLabel,
               kVendorName,
               kProductName,
-              chromeos::DEVICE_TYPE_USB,
+              ash::DeviceType::kUSB,
               kDevice1SizeInBytes);
   EXPECT_EQ(1, observer().attach_calls());
   EXPECT_EQ(0, observer().detach_calls());
diff --git a/components/sync/protocol/sync_invalidations_payload.proto b/components/sync/protocol/sync_invalidations_payload.proto
index ded3502..6f7cefe 100644
--- a/components/sync/protocol/sync_invalidations_payload.proto
+++ b/components/sync/protocol/sync_invalidations_payload.proto
@@ -24,7 +24,8 @@
   }
 
   // This field contains information about each data type which needs to be
-  // updated.
+  // updated. Note that it may contain data types which current client is not
+  // interested in.
   repeated DataTypeInvalidation data_type_invalidations = 1;
 
   // Opaque field, which has to be provided as part of resulting GetUpdates
diff --git a/content/browser/android/app_web_message_port.cc b/content/browser/android/app_web_message_port.cc
index 2bd2d2e9..0bf8f21 100644
--- a/content/browser/android/app_web_message_port.cc
+++ b/content/browser/android/app_web_message_port.cc
@@ -100,8 +100,8 @@
   DCHECK(descriptor_.IsValid());
   DCHECK(connector_);
   blink::TransferableMessage transferable_message =
-      CreateTransferableMessageFromJavaMessagePayload(
-          base::android::ScopedJavaLocalRef<jobject>(j_message_payload));
+      blink::EncodeWebMessagePayload(ConvertToWebMessagePayloadFromJava(
+          base::android::ScopedJavaLocalRef<jobject>(j_message_payload)));
   transferable_message.ports =
       blink::MessagePortChannel::CreateFromHandles(Release(env, j_ports));
 
@@ -139,16 +139,24 @@
   blink::TransferableMessage transferable_message;
   if (!blink::mojom::TransferableMessage::DeserializeFromMessage(
           std::move(*message), &transferable_message)) {
+    // Decode mojo message failed.
     return false;
   }
+  auto optional_payload =
+      blink::DecodeToWebMessagePayload(transferable_message);
+  if (!optional_payload) {
+    // Unsupported or invalid payload.
+    return true;
+  }
+  const auto& payload = optional_payload.value();
+
   auto j_ports = CreateJavaMessagePort(
       blink::MessagePortChannel::ReleaseHandles(transferable_message.ports));
   base::android::ScopedJavaLocalRef<jobject> j_message =
-      CreateJavaMessagePayload(transferable_message);
-  if (j_message) {
-    JNIEnv* env = base::android::AttachCurrentThread();
-    Java_AppWebMessagePort_onMessage(env, GetJavaObj(env), j_message, j_ports);
-  }
+      ConvertWebMessagePayloadToJava(payload);
+  DCHECK(j_message);
+  JNIEnv* env = base::android::AttachCurrentThread();
+  Java_AppWebMessagePort_onMessage(env, GetJavaObj(env), j_message, j_ports);
   return true;
 }
 
diff --git a/content/browser/android/message_payload.cc b/content/browser/android/message_payload.cc
index b32cc48..23155ea 100644
--- a/content/browser/android/message_payload.cc
+++ b/content/browser/android/message_payload.cc
@@ -5,41 +5,71 @@
 
 #include <string>
 #include <utility>
+
 #include "base/android/jni_android.h"
+#include "base/android/jni_array.h"
 #include "base/android/jni_string.h"
 #include "base/android/scoped_java_ref.h"
+#include "base/notreached.h"
 #include "content/public/android/content_jni_headers/MessagePayloadJni_jni.h"
+#include "third_party/abseil-cpp/absl/types/variant.h"
 #include "third_party/blink/public/common/messaging/string_message_codec.h"
 #include "third_party/blink/public/common/messaging/transferable_message.h"
 
 namespace content::android {
 
-base::android::ScopedJavaLocalRef<jobject> CreateJavaMessagePayload(
-    const blink::TransferableMessage& transferable_message) {
-  absl::optional<blink::WebMessagePayload> optional_payload =
-      blink::DecodeToWebMessagePayload(transferable_message);
-  if (!optional_payload) {
-    // Unsupported message or decode failed.
-    return nullptr;
+namespace {
+using base::android::ScopedJavaLocalRef;
+
+// Helper methods to convert `blink::WebMessagePayload` to Java
+// `org.chromium.content_public.browser.MessagePayload`.
+struct PayloadToJavaVisitor {
+  ScopedJavaLocalRef<jobject> operator()(const std::u16string& str) {
+    return Java_MessagePayloadJni_createFromString(
+        env_, base::android::ConvertUTF16ToJavaString(env_, str));
   }
-  auto& payload = optional_payload.value();
-  if (!absl::holds_alternative<std::u16string>(payload)) {
-    // TODO: Add support for ArrayBuffer.
-    return nullptr;
+  ScopedJavaLocalRef<jobject> operator()(
+      const std::vector<uint8_t>& array_buffer) {
+    return Java_MessagePayloadJni_createFromArrayBuffer(
+        env_, base::android::ToJavaByteArray(env_, array_buffer.data(),
+                                             array_buffer.size()));
   }
+
+  explicit PayloadToJavaVisitor(JNIEnv* env) : env_(env){};
+  JNIEnv* env_;
+};
+
+};  // namespace
+
+base::android::ScopedJavaLocalRef<jobject> ConvertWebMessagePayloadToJava(
+    const blink::WebMessagePayload& payload) {
   JNIEnv* env = base::android::AttachCurrentThread();
-  return Java_MessagePayloadJni_createFromString(
-      env, base::android::ConvertUTF16ToJavaString(
-               env, absl::get<std::u16string>(payload)));
+  return absl::visit(PayloadToJavaVisitor(env), payload);
 }
 
-blink::TransferableMessage CreateTransferableMessageFromJavaMessagePayload(
+blink::WebMessagePayload ConvertToWebMessagePayloadFromJava(
     const base::android::ScopedJavaLocalRef<jobject>& java_message) {
-  auto string = base::android::ConvertJavaStringToUTF16(
-      Java_MessagePayloadJni_getAsString(base::android::AttachCurrentThread(),
-                                         java_message));
-  return blink::EncodeWebMessagePayload(
-      blink::WebMessagePayload(std::move(string)));
+  CHECK(java_message);
+  JNIEnv* env = base::android::AttachCurrentThread();
+  const MessagePayloadType type = static_cast<MessagePayloadType>(
+      Java_MessagePayloadJni_getType(env, java_message));
+  switch (type) {
+    case MessagePayloadType::kString: {
+      return base::android::ConvertJavaStringToUTF16(
+          Java_MessagePayloadJni_getAsString(env, java_message));
+    }
+    case MessagePayloadType::kArrayBuffer: {
+      auto byte_array =
+          Java_MessagePayloadJni_getAsArrayBuffer(env, java_message);
+      std::vector<uint8_t> vector;
+      base::android::JavaByteArrayToByteVector(env, byte_array, &vector);
+      return vector;
+    }
+    case MessagePayloadType::kInvalid:
+      break;
+  }
+  NOTREACHED() << "Unsupported or invalid Java MessagePayload type.";
+  return std::u16string();
 }
 
 }  // namespace content::android
diff --git a/content/browser/android/message_payload.h b/content/browser/android/message_payload.h
index 90026cf..c712191d 100644
--- a/content/browser/android/message_payload.h
+++ b/content/browser/android/message_payload.h
@@ -8,24 +8,22 @@
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
 #include "content/common/content_export.h"
+#include "content/public/browser/android/message_payload_type.h"
+#include "third_party/blink/public/common/messaging/string_message_codec.h"
 #include "third_party/blink/public/common/messaging/transferable_message.h"
 
 namespace content::android {
 
 // Helper methods to convert between java
 // `org.chromium.content_public.browser.MessagePayload` and
-// `blink::TransferableMessage`. Only payload data (String, ArrayBuffer etc) is
-// converted, the rest in `TransferableMessage` (like MessagePort) is not
-// handled.
+// `blink::WebMessagePayload`.
 
 // Construct Java `org.chromium.content_public.browser.MessagePayload` from
-// `blink::TransferableMessage`.
+// `blink::WebMessagePayload`.
 CONTENT_EXPORT base::android::ScopedJavaLocalRef<jobject>
-CreateJavaMessagePayload(const blink::TransferableMessage&);
+ConvertWebMessagePayloadToJava(const blink::WebMessagePayload& payload);
 
-// Construct `blink::TransferableMessage` from Java MessagePayload.
-CONTENT_EXPORT blink::TransferableMessage
-CreateTransferableMessageFromJavaMessagePayload(
+CONTENT_EXPORT blink::WebMessagePayload ConvertToWebMessagePayloadFromJava(
     const base::android::ScopedJavaLocalRef<
         jobject>& /* org.chromium.content_public.browser.MessagePayload */);
 
diff --git a/content/browser/android/message_payload_unittest.cc b/content/browser/android/message_payload_unittest.cc
index 5220ed1c..baa7a45 100644
--- a/content/browser/android/message_payload_unittest.cc
+++ b/content/browser/android/message_payload_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "content/browser/android/message_payload.h"
+#include <cstddef>
 #include <string>
 
 #include "testing/gtest/include/gtest/gtest.h"
@@ -14,25 +15,24 @@
 
 TEST(MessagePayloadTest, SelfTest_String) {
   std::u16string string = u"Hello";
-  blink::TransferableMessage message = blink::EncodeWebMessagePayload(string);
 
-  auto generated_message =
-      android::CreateTransferableMessageFromJavaMessagePayload(
-          android::CreateJavaMessagePayload(message));
-  EXPECT_EQ(message.encoded_message.size(),
-            generated_message.encoded_message.size());
-  for (size_t i = 0; i != message.encoded_message.size(); ++i) {
-    EXPECT_EQ(message.encoded_message[i], generated_message.encoded_message[i]);
-  }
+  auto generated_message = android::ConvertToWebMessagePayloadFromJava(
+      android::ConvertWebMessagePayloadToJava(string));
+  EXPECT_EQ(blink::WebMessagePayload(string), generated_message);
 }
 
-TEST(MessagePayloadTest, SelfTest_InvalidString) {
-  blink::TransferableMessage message;
-  // Construct invalid message.
-  message.owned_encoded_message = {0x1, 0x2, 0x3};
-  message.encoded_message = message.owned_encoded_message;
-  auto java_msg = android::CreateJavaMessagePayload(message);
-  EXPECT_TRUE(java_msg.is_null());
+TEST(MessagePayloadTest, SelfTest_ArrayBuffer) {
+  std::vector<uint8_t> data(200, 0XFF);
+  auto generated_message = android::ConvertToWebMessagePayloadFromJava(
+      android::ConvertWebMessagePayloadToJava(data));
+  EXPECT_EQ(blink::WebMessagePayload(data), generated_message);
+}
+
+TEST(MessagePayloadTest, SelfTest_ArrayBufferEmpty) {
+  std::vector<uint8_t> data;
+  auto generated_message = android::ConvertToWebMessagePayloadFromJava(
+      android::ConvertWebMessagePayloadToJava(data));
+  EXPECT_EQ(blink::WebMessagePayload(data), generated_message);
 }
 
 }  // namespace
diff --git a/content/browser/message_port_provider.cc b/content/browser/message_port_provider.cc
index 9dccbfb..f0756d2 100644
--- a/content/browser/message_port_provider.cc
+++ b/content/browser/message_port_provider.cc
@@ -19,7 +19,9 @@
 
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/jni_string.h"
+#include "base/android/scoped_java_ref.h"
 #include "content/browser/android/app_web_message_port.h"
+#include "content/browser/android/message_payload.h"
 #endif
 
 using blink::MessagePortChannel;
@@ -77,11 +79,13 @@
     JNIEnv* env,
     const base::android::JavaParamRef<jstring>& source_origin,
     const base::android::JavaParamRef<jstring>& target_origin,
-    const base::android::JavaParamRef<jstring>& data,
+    const base::android::JavaParamRef<jobject>& payload,
     const base::android::JavaParamRef<jobjectArray>& ports) {
   PostMessageToFrameInternal(
       page, ToString16(env, source_origin), ToString16(env, target_origin),
-      ToString16(env, data), android::AppWebMessagePort::Release(env, ports));
+      android::ConvertToWebMessagePayloadFromJava(
+          base::android::ScopedJavaLocalRef<jobject>(payload)),
+      android::AppWebMessagePort::Release(env, ports));
 }
 #endif
 
diff --git a/content/browser/renderer_host/back_forward_cache_metrics.cc b/content/browser/renderer_host/back_forward_cache_metrics.cc
index d950ecfa..de27620 100644
--- a/content/browser/renderer_host/back_forward_cache_metrics.cc
+++ b/content/browser/renderer_host/back_forward_cache_metrics.cc
@@ -191,7 +191,7 @@
       SCOPED_CRASH_KEY_STRING256(
           "BFCacheMismatch", "previous_url",
           navigation->GetPreviousPrimaryMainFrameURL().spec());
-      base::debug::DumpWithoutCrashing();
+      // base::debug::DumpWithoutCrashing();
     }
 
     TRACE_EVENT1("navigation", "HistoryNavigationOutcome", "outcome",
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index cf924d1..b1120c9 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -4792,14 +4792,8 @@
   // to commit.
   absl::optional<base::UnguessableToken> nonce =
       render_frame_host_->ComputeNonce(is_anonymous());
-  url::Origin top_level_origin =
-      render_frame_host_->ComputeTopFrameOrigin(GetOriginToCommit());
-  commit_params_->storage_key = blink::StorageKey::CreateWithOptionalNonce(
-      GetOriginToCommit(), net::SchemefulSite(top_level_origin),
-      base::OptionalOrNullptr(nonce),
-      render_frame_host_->ComputeSiteForCookies().IsNull()
-          ? blink::mojom::AncestorChainBit::kCrossSite
-          : blink::mojom::AncestorChainBit::kSameSite);
+  commit_params_->storage_key = render_frame_host_->CalculateStorageKey(
+      GetOriginToCommit(), base::OptionalOrNullptr(nonce));
 
   if (IsServedFromBackForwardCache() || IsPrerenderedPageActivation()) {
     CommitPageActivation();
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 82816ed..e60b18f 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -1007,10 +1007,18 @@
   run_loop.Run();
 }
 
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
+// http://crbug.com/1347684
+#define MAYBE_DispatchFetchEventToStoppedWorkerSynchronously \
+  DISABLED_DispatchFetchEventToStoppedWorkerSynchronously
+#else
+#define MAYBE_DispatchFetchEventToStoppedWorkerSynchronously \
+  DispatchFetchEventToStoppedWorkerSynchronously
+#endif
 // Make sure that a fetch event is dispatched to a stopped worker in the task
 // which calls ServiceWorkerFetchDispatcher::Run().
 IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest,
-                       DispatchFetchEventToStoppedWorkerSynchronously) {
+                       MAYBE_DispatchFetchEventToStoppedWorkerSynchronously) {
   // Setup the server so that the test doesn't crash when tearing down.
   StartServerAndNavigateToSetup();
 
diff --git a/content/browser/service_worker/service_worker_container_host_unittest.cc b/content/browser/service_worker/service_worker_container_host_unittest.cc
index 08c381d..3308c9c8 100644
--- a/content/browser/service_worker/service_worker_container_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_container_host_unittest.cc
@@ -620,8 +620,8 @@
       blink::mojom::ScriptType::kClassic, 1 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration1_->SetActiveVersion(version);
 
@@ -1341,8 +1341,8 @@
       blink::mojom::ScriptType::kClassic, 1 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration1_->SetActiveVersion(version);
 
@@ -1396,8 +1396,8 @@
       blink::mojom::ScriptType::kClassic, 1 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version1->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version1->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version1->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration1_->SetActiveVersion(version1);
 
@@ -1406,8 +1406,8 @@
       blink::mojom::ScriptType::kClassic, 2 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version2->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version2->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version2->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration2_->SetActiveVersion(version1);
 
@@ -1435,8 +1435,8 @@
       blink::mojom::ScriptType::kClassic, 1 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version1->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version1->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version1->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration1_->SetActiveVersion(version1);
 
@@ -1474,8 +1474,8 @@
       blink::mojom::ScriptType::kClassic, 1 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version1->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version1->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version1->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration1_->SetActiveVersion(version1);
 
@@ -1502,8 +1502,8 @@
       blink::mojom::ScriptType::kClassic, 1 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version1->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version1->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version1->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration1_->SetActiveVersion(version1);
 
@@ -1512,8 +1512,8 @@
       blink::mojom::ScriptType::kClassic, 2 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version2->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version2->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version2->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration2_->SetActiveVersion(version1);
 
@@ -1522,8 +1522,8 @@
       blink::mojom::ScriptType::kClassic, 3 /* version_id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       helper_->context()->AsWeakPtr());
-  version3->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version3->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version3->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration3_->SetActiveVersion(version1);
 
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index 29b5ac4..3b36292 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -470,8 +470,8 @@
       2l /* dummy version id */,
       mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
       context()->AsWeakPtr());
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version->SetStatus(ServiceWorkerVersion::ACTIVATED);
 
   ServiceWorkerRemoteContainerEndpoint endpoint;
@@ -529,8 +529,8 @@
 
   TestServiceWorkerContextObserver observer(context_wrapper());
 
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNoHandler);
   version->SetStatus(ServiceWorkerVersion::Status::ACTIVATED);
   base::RunLoop().RunUntilIdle();
 
@@ -560,8 +560,8 @@
 
   TestServiceWorkerContextObserver observer(context_wrapper());
 
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNoHandler);
   version->SetStatus(ServiceWorkerVersion::Status::REDUNDANT);
   base::RunLoop().RunUntilIdle();
 
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
index 3869bd4..fe8050d 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler_unittest.cc
@@ -172,8 +172,8 @@
 
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, Basic) {
   // Prepare a valid version and registration.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   {
@@ -246,8 +246,8 @@
       SetBrowserClientForTesting(&test_browser_client);
 
   // Store an activated worker.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->registry()->StoreRegistration(registration_.get(), version_.get(),
@@ -275,8 +275,8 @@
   SetUpWithHelper(/*is_parent_frame_secure=*/false);
 
   // Store an activated worker.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->registry()->StoreRegistration(registration_.get(), version_.get(),
@@ -299,8 +299,8 @@
 
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) {
   // Store a registration that is installed but not activated yet.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::INSTALLED);
   registration_->SetWaitingVersion(version_);
   context()->registry()->StoreRegistration(registration_.get(), version_.get(),
@@ -328,8 +328,8 @@
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, InstallingRegistration) {
   // Create an installing registration.
   version_->SetStatus(ServiceWorkerVersion::INSTALLING);
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   registration_->SetInstallingVersion(version_);
   context()->registry()->NotifyInstallingRegistration(registration_.get());
 
@@ -355,8 +355,8 @@
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedContainerHost) {
   // Store a registration so the call to FindRegistrationForDocument will read
   // from the database.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->registry()->StoreRegistration(registration_.get(), version_.get(),
@@ -382,8 +382,8 @@
 
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, SkipServiceWorker) {
   // Store an activated worker.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   base::RunLoop loop;
@@ -425,8 +425,8 @@
 // removed.
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, NullContext) {
   // Store an activated worker.
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   base::RunLoop loop;
@@ -469,8 +469,8 @@
 
 #if BUILDFLAG(ENABLE_OFFLINE_PAGES)
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithOfflineHeader) {
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->registry()->StoreRegistration(registration_.get(), version_.get(),
@@ -491,8 +491,8 @@
 }
 
 TEST_F(ServiceWorkerControlleeRequestHandlerTest, FallbackWithNoOfflineHeader) {
-  version_->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   context()->registry()->StoreRegistration(registration_.get(), version_.get(),
diff --git a/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc b/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
index 2896abe..880f8ed 100644
--- a/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
+++ b/content/browser/service_worker/service_worker_installed_scripts_sender_unittest.cc
@@ -141,8 +141,8 @@
         context()->registry(), registration_.get(),
         GURL("http://www.example.com/test/service_worker.js"),
         blink::mojom::ScriptType::kClassic);
-    version_->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version_->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     version_->SetStatus(ServiceWorkerVersion::INSTALLED);
   }
 
diff --git a/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc b/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
index 984e301..858e62d 100644
--- a/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_main_resource_loader_unittest.cc
@@ -444,8 +444,8 @@
         GetStorageControl(), version_->script_url(), {} /* headers */,
         "I'm the body", "I'm the meta data"));
     version_->script_cache_map()->SetResources(records);
-    version_->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version_->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
     registration_->SetActiveVersion(version_);
 
diff --git a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
index fbcd62b..a43690d6 100644
--- a/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_new_script_loader_unittest.cc
@@ -192,8 +192,8 @@
   // |version_| to null (as subsequent DoRequest() calls should not attempt to
   // install or update |version_|).
   void ActivateVersion() {
-    version_->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+    version_->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNoHandler);
     version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
     registration_->SetActiveVersion(version_);
     version_ = nullptr;
diff --git a/content/browser/service_worker/service_worker_object_host_unittest.cc b/content/browser/service_worker/service_worker_object_host_unittest.cc
index 7bfda43..6b958e4 100644
--- a/content/browser/service_worker/service_worker_object_host_unittest.cc
+++ b/content/browser/service_worker/service_worker_object_host_unittest.cc
@@ -135,8 +135,8 @@
     version_->SetMainScriptResponse(
         std::make_unique<ServiceWorkerVersion::MainScriptResponse>(
             network::mojom::URLResponseHead()));
-    version_->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version_->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     version_->SetStatus(ServiceWorkerVersion::INSTALLING);
 
     // Make the registration findable via storage functions.
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc
index cdd6770..8d0544f1 100644
--- a/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -351,15 +351,15 @@
   scoped_refptr<ServiceWorkerVersion> version_1 = CreateNewServiceWorkerVersion(
       context()->registry(), registration.get(), kScript,
       blink::mojom::ScriptType::kClassic);
-  version_1->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_1->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   registration->SetActiveVersion(version_1);
   version_1->SetStatus(ServiceWorkerVersion::ACTIVATED);
   scoped_refptr<ServiceWorkerVersion> version_2 = CreateNewServiceWorkerVersion(
       context()->registry(), registration.get(), kScript,
       blink::mojom::ScriptType::kClassic);
-  version_2->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version_2->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   registration->SetWaitingVersion(version_2);
   version_2->SetStatus(ServiceWorkerVersion::INSTALLED);
 
@@ -406,8 +406,8 @@
         CreateNewServiceWorkerVersion(context()->registry(),
                                       registration_.get(), kScript,
                                       blink::mojom::ScriptType::kClassic);
-    version_1->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version_1->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     registration_->SetActiveVersion(version_1);
     version_1->SetStatus(ServiceWorkerVersion::ACTIVATED);
 
@@ -462,8 +462,8 @@
     version_2->script_cache_map()->SetResources(records_2);
     version_2->SetMainScriptResponse(
         EmbeddedWorkerTestHelper::CreateMainScriptResponse());
-    version_2->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version_2->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     registration_->SetWaitingVersion(version_2);
 
     // Setup the Mojo implementation fakes for the renderer-side service worker.
@@ -903,8 +903,8 @@
     version->script_cache_map()->SetResources(records);
     version->SetMainScriptResponse(
         EmbeddedWorkerTestHelper::CreateMainScriptResponse());
-    version->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     version->SetStatus(ServiceWorkerVersion::INSTALLING);
     return version;
   }
diff --git a/content/browser/service_worker/service_worker_registry.cc b/content/browser/service_worker/service_worker_registry.cc
index 46a5511..1cd56927 100644
--- a/content/browser/service_worker/service_worker_registry.cc
+++ b/content/browser/service_worker/service_worker_registry.cc
@@ -393,14 +393,7 @@
   data->script = version->script_url();
   data->script_type = version->script_type();
   data->update_via_cache = registration->update_via_cache();
-  data->fetch_handler_type =
-      blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler;
-  if (version->fetch_handler_existence() ==
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS) {
-    // TODO(crbug.com/1347319): implement other fetch_handler_type.
-    data->fetch_handler_type =
-        blink::mojom::ServiceWorkerFetchHandlerType::kNotSkippable;
-  }
+  data->fetch_handler_type = version->fetch_handler_type();
   data->version_id = version->version_id();
   data->last_update_check = registration->last_update_check();
   data->is_active = (version == registration->active_version());
@@ -890,11 +883,7 @@
     version = base::MakeRefCounted<ServiceWorkerVersion>(
         registration.get(), data.script, data.script_type, data.version_id,
         std::move(version_reference), context_->AsWeakPtr());
-    version->set_fetch_handler_existence(
-        (data.fetch_handler_type ==
-         blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler)
-            ? ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST
-            : ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version->set_fetch_handler_type(data.fetch_handler_type);
     version->SetStatus(data.is_active ? ServiceWorkerVersion::ACTIVATED
                                       : ServiceWorkerVersion::INSTALLED);
     version->script_cache_map()->SetResources(resources);
diff --git a/content/browser/service_worker/service_worker_registry_unittest.cc b/content/browser/service_worker/service_worker_registry_unittest.cc
index f5c267d92..6b012c9c 100644
--- a/content/browser/service_worker/service_worker_registry_unittest.cc
+++ b/content/browser/service_worker/service_worker_registry_unittest.cc
@@ -727,8 +727,8 @@
           blink::mojom::ScriptType::kClassic, kVersionId,
           mojo::PendingRemote<storage::mojom::ServiceWorkerLiveVersionRef>(),
           context()->AsWeakPtr());
-  live_version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  live_version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   live_version->SetStatus(ServiceWorkerVersion::INSTALLED);
   live_version->script_cache_map()->SetResources(resources);
   live_version->set_used_features(
@@ -2222,8 +2222,8 @@
   records.push_back(
       storage::mojom::ServiceWorkerResourceRecord::New(1, kScript, 100));
   version->script_cache_map()->SetResources(records);
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version->SetStatus(ServiceWorkerVersion::INSTALLED);
   registration->SetActiveVersion(version);
 
@@ -2270,8 +2270,8 @@
         CreateNewServiceWorkerRegistration(registry(), options, key_);
     scoped_refptr<ServiceWorkerVersion> version = CreateNewServiceWorkerVersion(
         registry(), registration_.get(), script_, options.type);
-    version->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+    version->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNoHandler);
     version->SetStatus(ServiceWorkerVersion::INSTALLED);
 
     std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> resources;
@@ -2515,8 +2515,8 @@
   std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> records;
   records.push_back(CreateResourceRecord(10, live_version->script_url(), 100));
   live_version->script_cache_map()->SetResources(records);
-  live_version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  live_version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
 
   // Writing the registration should move the old version's resources to the
   // purgeable list but keep them available.
@@ -2561,8 +2561,8 @@
   std::vector<storage::mojom::ServiceWorkerResourceRecordPtr> records;
   records.push_back(CreateResourceRecord(10, live_version->script_url(), 100));
   live_version->script_cache_map()->SetResources(records);
-  live_version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  live_version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
 
   // Writing the registration should purge the old version's resources,
   // since it's not live.
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc
index 2fb3837..e04168e 100644
--- a/content/browser/service_worker/service_worker_test_utils.cc
+++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -445,8 +445,8 @@
       storage::mojom::ServiceWorkerResourceRecord::New(resource_id, script,
                                                        /*size_bytes=*/100));
   version->script_cache_map()->SetResources(records);
-  version->set_fetch_handler_existence(
-      ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+  version->set_fetch_handler_type(
+      ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
   version->SetStatus(ServiceWorkerVersion::INSTALLED);
   registration->SetWaitingVersion(version);
   return registration;
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 57398a2c..f37435b5 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -248,7 +248,6 @@
       key_(registration->key()),
       scope_(registration->scope()),
       script_type_(script_type),
-      fetch_handler_existence_(FetchHandlerExistence::UNKNOWN),
       registration_status_(registration->status()),
       ancestor_frame_type_(registration->ancestor_frame_type()),
       context_(context),
@@ -307,10 +306,10 @@
   TRACE_EVENT2("ServiceWorker", "ServiceWorkerVersion::SetStatus", "Script URL",
                script_url_.spec(), "New Status", VersionStatusToString(status));
 
-  // |fetch_handler_existence_| must be set before setting the status to
+  // |fetch_handler_type_| must be set before setting the status to
   // INSTALLED,
   // ACTIVATING or ACTIVATED.
-  DCHECK(fetch_handler_existence_ != FetchHandlerExistence::UNKNOWN ||
+  DCHECK(fetch_handler_type_ ||
          !(status == INSTALLED || status == ACTIVATING || status == ACTIVATED));
 
   status_ = status;
@@ -408,11 +407,27 @@
   return info;
 }
 
-void ServiceWorkerVersion::set_fetch_handler_existence(
-    FetchHandlerExistence existence) {
-  DCHECK_EQ(fetch_handler_existence_, FetchHandlerExistence::UNKNOWN);
-  DCHECK_NE(existence, FetchHandlerExistence::UNKNOWN);
-  fetch_handler_existence_ = existence;
+ServiceWorkerVersion::FetchHandlerExistence
+ServiceWorkerVersion::fetch_handler_existence() const {
+  if (!fetch_handler_type_) {
+    return FetchHandlerExistence::UNKNOWN;
+  }
+  return (fetch_handler_type_ == FetchHandlerType::kNoHandler)
+             ? FetchHandlerExistence::DOES_NOT_EXIST
+             : FetchHandlerExistence::EXISTS;
+}
+
+ServiceWorkerVersion::FetchHandlerType
+ServiceWorkerVersion::fetch_handler_type() const {
+  DCHECK(fetch_handler_type_);
+  return fetch_handler_type_ ? *fetch_handler_type_
+                             : FetchHandlerType::kNoHandler;
+}
+
+void ServiceWorkerVersion::set_fetch_handler_type(
+    FetchHandlerType fetch_handler_type) {
+  DCHECK(!fetch_handler_type_);
+  fetch_handler_type_ = fetch_handler_type;
 }
 
 void ServiceWorkerVersion::StartWorker(ServiceWorkerMetrics::EventType purpose,
@@ -1038,7 +1053,7 @@
       worker_host_->container_host()->CreateServiceWorkerRegistrationObjectInfo(
           std::move(registration)),
       worker_host_->container_host()->CreateServiceWorkerObjectInfoToSend(this),
-      fetch_handler_existence_, std::move(reporting_observer_receiver_),
+      fetch_handler_existence(), std::move(reporting_observer_receiver_),
       ancestor_frame_type_);
 
   is_endpoint_ready_ = true;
@@ -1190,7 +1205,7 @@
 
 void ServiceWorkerVersion::OnStarted(
     blink::mojom::ServiceWorkerStartStatus start_status,
-    blink::mojom::ServiceWorkerFetchHandlerType fetch_handler_type) {
+    FetchHandlerType fetch_handler_type) {
   DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status());
 
   // TODO(falken): This maps kAbruptCompletion to kErrorScriptEvaluated, which
@@ -1201,13 +1216,8 @@
   blink::ServiceWorkerStatusCode status =
       mojo::ConvertTo<blink::ServiceWorkerStatusCode>(start_status);
 
-  if (status == blink::ServiceWorkerStatusCode::kOk &&
-      fetch_handler_existence_ == FetchHandlerExistence::UNKNOWN) {
-    set_fetch_handler_existence(
-        (fetch_handler_type !=
-         blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler)
-            ? FetchHandlerExistence::EXISTS
-            : FetchHandlerExistence::DOES_NOT_EXIST);
+  if (status == blink::ServiceWorkerStatusCode::kOk && !fetch_handler_type_) {
+    set_fetch_handler_type(fetch_handler_type);
   }
 
   // Fire all start callbacks.
@@ -2452,7 +2462,7 @@
   // Currently FetchEvents are the only type of event we need to really process
   // at foreground priority.  If the service worker does not have a FetchEvent
   // handler then we can always allow it to go to the background.
-  if (fetch_handler_existence_ != FetchHandlerExistence::EXISTS)
+  if (fetch_handler_existence() != FetchHandlerExistence::EXISTS)
     return false;
 
   // Keep the service worker at foreground priority if it has clients from
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index 3795768..6bb143e4 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -135,6 +135,7 @@
   using SimpleEventCallback =
       base::OnceCallback<void(blink::mojom::ServiceWorkerEventStatus)>;
   using FetchHandlerExistence = blink::mojom::FetchHandlerExistence;
+  using FetchHandlerType = blink::mojom::ServiceWorkerFetchHandlerType;
 
   // Current version status; some of the status (e.g. INSTALLED and ACTIVATED)
   // should be persisted unlike running status.
@@ -228,10 +229,10 @@
   // This status is set to EXISTS or DOES_NOT_EXIST when the install event has
   // been executed in a new version or when an installed version is loaded from
   // the storage. When a new version is not installed yet, it is UNKNOWN.
-  FetchHandlerExistence fetch_handler_existence() const {
-    return fetch_handler_existence_;
-  }
-  void set_fetch_handler_existence(FetchHandlerExistence existence);
+  FetchHandlerExistence fetch_handler_existence() const;
+  // Returns the fetch handler type if set.  Otherwise, kNoHandler.
+  FetchHandlerType fetch_handler_type() const;
+  void set_fetch_handler_type(FetchHandlerType fetch_handler_type);
 
   base::TimeDelta TimeSinceNoControllees() const {
     return GetTickDuration(no_controllees_time_);
@@ -791,9 +792,8 @@
   // EmbeddedWorkerInstance::Listener overrides:
   void OnScriptEvaluationStart() override;
   void OnStarting() override;
-  void OnStarted(
-      blink::mojom::ServiceWorkerStartStatus status,
-      blink::mojom::ServiceWorkerFetchHandlerType fetch_handler_type) override;
+  void OnStarted(blink::mojom::ServiceWorkerStartStatus status,
+                 FetchHandlerType fetch_handler_type) override;
   void OnStopping() override;
   void OnStopped(EmbeddedWorkerStatus old_status) override;
   void OnDetached(EmbeddedWorkerStatus old_status) override;
@@ -950,7 +950,7 @@
   // "classic" or "module". Unless stated otherwise, it is "classic".
   // https://w3c.github.io/ServiceWorker/#dfn-type
   const blink::mojom::ScriptType script_type_;
-  FetchHandlerExistence fetch_handler_existence_;
+  absl::optional<FetchHandlerType> fetch_handler_type_;
   // The source of truth for navigation preload state is the
   // ServiceWorkerRegistration. |navigation_preload_state_| is essentially a
   // cached value because it must be looked up quickly and a live registration
diff --git a/content/browser/service_worker/service_worker_version_browsertest.cc b/content/browser/service_worker/service_worker_version_browsertest.cc
index 6ada647b..d99b503 100644
--- a/content/browser/service_worker/service_worker_version_browsertest.cc
+++ b/content/browser/service_worker/service_worker_version_browsertest.cc
@@ -478,8 +478,8 @@
             wrapper()->context()->registry(), registration_.get(),
             embedded_test_server()->GetURL(worker_url),
             blink::mojom::ScriptType::kClassic));
-    waiting_version->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    waiting_version->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     waiting_version->SetStatus(ServiceWorkerVersion::INSTALLED);
     registration_->SetWaitingVersion(waiting_version.get());
     registration_->ActivateWaitingVersionWhenReady();
@@ -712,8 +712,8 @@
 
   void SetActiveVersion(ServiceWorkerRegistration* registration,
                         ServiceWorkerVersion* version) {
-    version->set_fetch_handler_existence(
-        ServiceWorkerVersion::FetchHandlerExistence::EXISTS);
+    version->set_fetch_handler_type(
+        ServiceWorkerVersion::FetchHandlerType::kNotSkippable);
     version->SetStatus(ServiceWorkerVersion::ACTIVATED);
     registration->SetActiveVersion(version);
   }
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index b5890664..d025378 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -122,9 +122,8 @@
     version_->script_cache_map()->SetResources(records);
     version_->SetMainScriptResponse(
         EmbeddedWorkerTestHelper::CreateMainScriptResponse());
-    if (GetFetchHandlerExistence() !=
-        ServiceWorkerVersion::FetchHandlerExistence::UNKNOWN) {
-      version_->set_fetch_handler_existence(GetFetchHandlerExistence());
+    if (GetFetchHandlerType()) {
+      version_->set_fetch_handler_type(*GetFetchHandlerType());
     }
 
     // Make the registration findable via storage functions.
@@ -180,9 +179,9 @@
     version_->SetTickClockForTesting(tick_clock);
   }
 
-  virtual ServiceWorkerVersion::FetchHandlerExistence GetFetchHandlerExistence()
-      const {
-    return ServiceWorkerVersion::FetchHandlerExistence::EXISTS;
+  virtual absl::optional<ServiceWorkerVersion::FetchHandlerType>
+  GetFetchHandlerType() const {
+    return ServiceWorkerVersion::FetchHandlerType::kNotSkippable;
   }
 
   // Make the client in a different process from the service worker when
@@ -1490,9 +1489,9 @@
 
 class ServiceWorkerVersionNoFetchHandlerTest : public ServiceWorkerVersionTest {
  protected:
-  ServiceWorkerVersion::FetchHandlerExistence GetFetchHandlerExistence()
+  absl::optional<ServiceWorkerVersion::FetchHandlerType> GetFetchHandlerType()
       const override {
-    return ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST;
+    return ServiceWorkerVersion::FetchHandlerType::kNoHandler;
   }
 };
 
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc
index 67bffa03..4d57232 100644
--- a/content/browser/web_contents/web_contents_android.cc
+++ b/content/browser/web_contents/web_contents_android.cc
@@ -601,7 +601,7 @@
 
 void WebContentsAndroid::PostMessageToMainFrame(
     JNIEnv* env,
-    const JavaParamRef<jstring>& jmessage,
+    const JavaParamRef<jobject>& jmessage,
     const JavaParamRef<jstring>& jsource_origin,
     const JavaParamRef<jstring>& jtarget_origin,
     const JavaParamRef<jobjectArray>& jports) {
diff --git a/content/browser/web_contents/web_contents_android.h b/content/browser/web_contents/web_contents_android.h
index 417cdcc..2b278693 100644
--- a/content/browser/web_contents/web_contents_android.h
+++ b/content/browser/web_contents/web_contents_android.h
@@ -121,7 +121,7 @@
 
   void PostMessageToMainFrame(
       JNIEnv* env,
-      const base::android::JavaParamRef<jstring>& jmessage,
+      const base::android::JavaParamRef<jobject>& jmessage,
       const base::android::JavaParamRef<jstring>& jsource_origin,
       const base::android::JavaParamRef<jstring>& jtarget_origin,
       const base::android::JavaParamRef<jobjectArray>& jports);
diff --git a/content/public/android/BUILD.gn b/content/public/android/BUILD.gn
index 3a1df13..40b7166 100644
--- a/content/public/android/BUILD.gn
+++ b/content/public/android/BUILD.gn
@@ -390,6 +390,7 @@
   sources = [
     "//content/browser/android/select_popup.cc",
     "//content/public/browser/android/child_process_importance.h",
+    "//content/public/browser/android/message_payload_type.h",
     "//content/public/browser/android/motion_event_action.h",
     "//content/public/browser/bluetooth_scanning_prompt.h",
     "//content/public/browser/browser_task_traits.h",
diff --git a/content/public/android/java/src/org/chromium/content/browser/MessagePayloadJni.java b/content/public/android/java/src/org/chromium/content/browser/MessagePayloadJni.java
index 8f64932..52686313 100644
--- a/content/public/android/java/src/org/chromium/content/browser/MessagePayloadJni.java
+++ b/content/public/android/java/src/org/chromium/content/browser/MessagePayloadJni.java
@@ -4,9 +4,13 @@
 
 package org.chromium.content.browser;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.content_public.browser.MessagePayload;
+import org.chromium.content_public.browser.MessagePayloadType;
 
 /**
  * Helper class to call MessagePayload methods from native.
@@ -15,13 +19,29 @@
 final class MessagePayloadJni {
     private MessagePayloadJni() {}
 
+    @MessagePayloadType
     @CalledByNative
-    private static MessagePayload createFromString(String string) {
+    private static int getType(@NonNull MessagePayload payload) {
+        return payload.getType();
+    }
+
+    @CalledByNative
+    private static MessagePayload createFromString(@Nullable String string) {
         return new MessagePayload(string);
     }
 
     @CalledByNative
-    private static String getAsString(MessagePayload payload) {
+    private static String getAsString(@NonNull MessagePayload payload) {
         return payload.getAsString();
     }
-}
\ No newline at end of file
+
+    @CalledByNative
+    private static MessagePayload createFromArrayBuffer(@NonNull byte[] arrayBuffer) {
+        return new MessagePayload(arrayBuffer);
+    }
+
+    @CalledByNative
+    private static byte[] getAsArrayBuffer(@NonNull MessagePayload payload) {
+        return payload.getAsArrayBuffer();
+    }
+}
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
index c38a0ab7..a8c4413 100644
--- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -711,9 +711,8 @@
         if (targetOrigin.equals("*")) {
             targetOrigin = "";
         }
-        WebContentsImplJni.get().postMessageToMainFrame(mNativeWebContentsAndroid,
-                messagePayload.getAsString(), sourceOrigin, targetOrigin,
-                ports);
+        WebContentsImplJni.get().postMessageToMainFrame(
+                mNativeWebContentsAndroid, messagePayload, sourceOrigin, targetOrigin, ports);
     }
 
     @Override
@@ -1125,7 +1124,7 @@
         void evaluateJavaScriptForTests(
                 long nativeWebContentsAndroid, String script, JavaScriptCallback callback);
         void addMessageToDevToolsConsole(long nativeWebContentsAndroid, int level, String message);
-        void postMessageToMainFrame(long nativeWebContentsAndroid, String message,
+        void postMessageToMainFrame(long nativeWebContentsAndroid, MessagePayload payload,
                 String sourceOrigin, String targetOrigin, MessagePort[] ports);
         boolean hasAccessedInitialDocument(long nativeWebContentsAndroid);
         int getThemeColor(long nativeWebContentsAndroid);
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/MessagePayload.java b/content/public/android/java/src/org/chromium/content_public/browser/MessagePayload.java
index 853c9be..a63b73b 100644
--- a/content/public/android/java/src/org/chromium/content_public/browser/MessagePayload.java
+++ b/content/public/android/java/src/org/chromium/content_public/browser/MessagePayload.java
@@ -4,27 +4,22 @@
 
 package org.chromium.content_public.browser;
 
-import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
 
 /**
  * Represents a JavaScript message payload.
  * Currently only STRING is supported.
  */
 public final class MessagePayload {
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(value = {MessagePayloadType.TYPE_STRING})
-    @interface MessagePayloadType {
-        int TYPE_STRING = 0;
-    }
-
     @MessagePayloadType
     private final int mType;
     @Nullable
     private final String mString;
+    @Nullable
+    private final byte[] mArrayBuffer;
 
     /**
      * Create a MessagePayload String type.
@@ -32,8 +27,16 @@
      * JNI.
      */
     public MessagePayload(@Nullable String string) {
-        mType = MessagePayloadType.TYPE_STRING;
+        mType = MessagePayloadType.STRING;
         mString = string;
+        mArrayBuffer = null;
+    }
+
+    public MessagePayload(@NonNull byte[] arrayBuffer) {
+        Objects.requireNonNull(arrayBuffer, "arrayBuffer cannot be null.");
+        mType = MessagePayloadType.ARRAY_BUFFER;
+        mArrayBuffer = arrayBuffer;
+        mString = null;
     }
 
     @MessagePayloadType
@@ -43,9 +46,34 @@
 
     @Nullable
     public String getAsString() {
-        if (mType != MessagePayloadType.TYPE_STRING) {
-            throw new ClassCastException("String expected, but type is " + mType);
-        }
+        checkType(MessagePayloadType.STRING);
         return mString;
     }
+
+    @NonNull
+    public byte[] getAsArrayBuffer() {
+        checkType(MessagePayloadType.ARRAY_BUFFER);
+        Objects.requireNonNull(mArrayBuffer, "mArrayBuffer cannot be null.");
+        return mArrayBuffer;
+    }
+
+    private void checkType(@MessagePayloadType int expectedType) {
+        if (mType != expectedType) {
+            throw new IllegalStateException("Expected " + typeToString(expectedType)
+                    + ", but type is " + typeToString(mType));
+        }
+    }
+
+    @NonNull
+    private static String typeToString(@MessagePayloadType int type) {
+        switch (type) {
+            case MessagePayloadType.STRING:
+                return "String";
+            case MessagePayloadType.ARRAY_BUFFER:
+                return "ArrayBuffer";
+            case MessagePayloadType.INVALID:
+                return "Invalid";
+        }
+        throw new RuntimeException("Unknown type: " + type);
+    }
 }
diff --git a/content/public/android/junit/src/org/chromium/content_public/browser/MessagePayloadTest.java b/content/public/android/junit/src/org/chromium/content_public/browser/MessagePayloadTest.java
index 831f142a..d991641 100644
--- a/content/public/android/junit/src/org/chromium/content_public/browser/MessagePayloadTest.java
+++ b/content/public/android/junit/src/org/chromium/content_public/browser/MessagePayloadTest.java
@@ -11,6 +11,8 @@
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
 
+import java.io.UnsupportedEncodingException;
+
 /**
  * Unit tests for MessagePayload.
  * Note: After new type is added, please add a test case here.
@@ -23,7 +25,57 @@
         final String testStr = "TestStr";
         MessagePayload messagePayload = new MessagePayload(testStr);
         Assert.assertEquals(messagePayload.getAsString(), testStr);
-        Assert.assertEquals(
-                messagePayload.getType(), MessagePayload.MessagePayloadType.TYPE_STRING);
+        Assert.assertEquals(messagePayload.getType(), MessagePayloadType.STRING);
+
+        Assert.assertEquals(messagePayload.getType(), MessagePayloadType.STRING);
+    }
+
+    @Test
+    public void testStringCanBeNull() {
+        MessagePayload jsValue = new MessagePayload((String) null);
+        Assert.assertNull(jsValue.getAsString());
+        Assert.assertEquals(jsValue.getType(), MessagePayloadType.STRING);
+    }
+
+    @Test
+    public void testArrayBuffer() throws UnsupportedEncodingException {
+        final byte[] bytes = "TestStr".getBytes("UTF-8");
+        MessagePayload jsValue = new MessagePayload(bytes);
+        Assert.assertEquals(jsValue.getAsArrayBuffer(), bytes);
+        Assert.assertEquals(jsValue.getType(), MessagePayloadType.ARRAY_BUFFER);
+    }
+
+    @Test
+    public void testArrayBufferCannotBeNull() {
+        try {
+            new MessagePayload((byte[]) null);
+            Assert.fail("Should throw exception");
+        } catch (NullPointerException e) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void testWrongValueTypeString() throws UnsupportedEncodingException {
+        MessagePayload jsValue = new MessagePayload("TestStr".getBytes("UTF-8"));
+        Assert.assertEquals(jsValue.getType(), MessagePayloadType.ARRAY_BUFFER);
+        try {
+            jsValue.getAsString();
+            Assert.fail("Should throw exception");
+        } catch (IllegalStateException e) {
+            // Expected
+        }
+    }
+
+    @Test
+    public void testWrongValueTypeArrayBuffer() {
+        MessagePayload jsValue = new MessagePayload("TestStr");
+        Assert.assertEquals(jsValue.getType(), MessagePayloadType.STRING);
+        try {
+            jsValue.getAsArrayBuffer();
+            Assert.fail("Should throw exception");
+        } catch (IllegalStateException e) {
+            // Expected
+        }
     }
 }
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index ced577d..127128001 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -551,6 +551,7 @@
       "android/java_interfaces.h",
       "android/media_url_interceptor_register.cc",
       "android/media_url_interceptor_register.h",
+      "android/message_payload_type.h",
       "android/message_port_helper.h",
       "android/motion_event_action.h",
       "android/synchronous_compositor.cc",
diff --git a/content/public/browser/android/message_payload_type.h b/content/public/browser/android/message_payload_type.h
new file mode 100644
index 0000000..aced4fc
--- /dev/null
+++ b/content/public/browser/android/message_payload_type.h
@@ -0,0 +1,20 @@
+// Copyright (c) 2022 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_PUBLIC_BROWSER_ANDROID_MESSAGE_PAYLOAD_TYPE_H_
+#define CONTENT_PUBLIC_BROWSER_ANDROID_MESSAGE_PAYLOAD_TYPE_H_
+
+namespace content::android {
+
+// Payload types for Java `org.chromium.content_public.browser.MessagePayload`
+// and JNI.
+// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.content_public.browser
+enum class MessagePayloadType {
+  kInvalid = -1,
+  kString,
+  kArrayBuffer,
+};
+
+}  // namespace content::android
+#endif  // CONTENT_PUBLIC_BROWSER_ANDROID_MESSAGE_PAYLOAD_TYPE_H_
diff --git a/content/public/browser/message_port_provider.h b/content/public/browser/message_port_provider.h
index ca53297..1ce6c31 100644
--- a/content/public/browser/message_port_provider.h
+++ b/content/public/browser/message_port_provider.h
@@ -51,7 +51,8 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jstring>& source_origin,
       const base::android::JavaParamRef<jstring>& target_origin,
-      const base::android::JavaParamRef<jstring>& data,
+      /* org.chromium.content_public.browser.MessagePayload */
+      const base::android::JavaParamRef<jobject>& payload,
       const base::android::JavaParamRef<jobjectArray>& ports);
 #endif  // BUILDFLAG(IS_ANDROID)
 
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index a5c3f7e..cc7d62bf 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -503,12 +503,9 @@
   CHECK_LE(start_timing_->script_evaluation_start_time,
            start_timing_->script_evaluation_end_time);
 
-  instance_host_->OnStarted(
-      status,
-      proxy_->HasFetchHandler()
-          ? blink::mojom::ServiceWorkerFetchHandlerType::kNotSkippable
-          : blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler,
-      WorkerThread::GetCurrentId(), std::move(start_timing_));
+  instance_host_->OnStarted(status, proxy_->FetchHandlerType(),
+                            WorkerThread::GetCurrentId(),
+                            std::move(start_timing_));
 
   TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "ServiceWorkerContextClient",
                                   this);
diff --git a/docs/login/first_user_run_oobe.md b/docs/login/first_user_run_oobe.md
index 9a41f051..3517613 100644
--- a/docs/login/first_user_run_oobe.md
+++ b/docs/login/first_user_run_oobe.md
@@ -94,7 +94,7 @@
 The final step of the opt-in flow is informing the user the Assistant is ready,
 and offering to enable some advanced features, if any are available.
 
-Much of this flow is managed by chromeos::assistant::AssistantSettings service.
+Much of this flow is managed by ash::assistant::AssistantSettings service.
 To effectively test the screen flow, this service should be faked by the test.
 
 # Multi-device Setup screen
diff --git a/docs/updater/dev_manual.md b/docs/updater/dev_manual.md
index 44dc422..b9fd36c9 100644
--- a/docs/updater/dev_manual.md
+++ b/docs/updater/dev_manual.md
@@ -77,3 +77,48 @@
 Start another debugger and attach the server process. Then set a server-side
 breakpoint at the place you want to debug.
 * Continue the client process.
+
+### How to generate the cross-compilation IDL COM headers and TLB files
+
+6 different build flavors need to be built in sequence as outlined below. Each
+of those builds will generate the corresponding IDL files and stop with a
+message to copy the files. Here is an example output to copy generated files.
+After copying the files, the next step is to build the next build flavor and
+copy those files, until all build flavors are built:
+
+
+```
+midl.exe output different from files in gen/chrome/updater/app/server/win, see C:\src\temp\tmppbfwi0ds
+To rebaseline:
+  copy /y C:\src\temp\tmppbfwi0ds\* c:\src\chromium\src\third_party\win_build_output\midl\chrome\updater\app\server\win\x64
+ninja: build stopped: subcommand failed.
+```
+
+
+```
+* call gn gen out\ChromeBrandedDebug "--args=target_cpu=\"arm64\" use_goma=true is_chrome_branded=true is_debug=true enable_nacl=false blink_symbol_level=0 v8_symbol_level=0"
+* autoninja -C out\ChromeBrandedDebug chrome/updater:all
+* copy the generated files
+
+* call gn gen out\ChromeBrandedDebug "--args=target_cpu=\"x64\" use_goma=true is_chrome_branded=true is_debug=true enable_nacl=false blink_symbol_level=0 v8_symbol_level=0"
+* autoninja -C out\ChromeBrandedDebug chrome/updater:all
+* copy the generated files
+
+* call gn gen out\ChromeBrandedDebug "--args=target_cpu=\"x86\" use_goma=true is_chrome_branded=true is_debug=true enable_nacl=false blink_symbol_level=0 v8_symbol_level=0"
+* autoninja -C out\ChromeBrandedDebug chrome/updater:all
+* copy the generated files
+
+* call gn gen out\Default "--args=target_cpu=\"arm64\" use_goma=true is_chrome_branded=false is_debug=true enable_nacl=false blink_symbol_level=0 v8_symbol_level=0"
+* autoninja -C out\Default chrome/updater:all
+* copy the generated files
+
+* call gn gen out\Default "--args=target_cpu=\"x64\" use_goma=true is_chrome_branded=false is_debug=true enable_nacl=false blink_symbol_level=0 v8_symbol_level=0"
+* autoninja -C out\Default chrome/updater:all
+* copy the generated files
+
+* call gn gen out\Default "--args=target_cpu=\"x86\" use_goma=true is_chrome_branded=false is_debug=true enable_nacl=false blink_symbol_level=0 v8_symbol_level=0"
+* autoninja -C out\Default chrome/updater:all
+* copy the generated files
+```
+
+
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md
index 39c0d2d7..d1a535f 100644
--- a/docs/updater/functional_spec.md
+++ b/docs/updater/functional_spec.md
@@ -899,3 +899,4 @@
 
 The updater then downloads and installs the application on all machines where
 the policy is deployed, and where the application is not already installed.
+
diff --git a/extensions/browser/api/bluetooth_low_energy/utils.cc b/extensions/browser/api/bluetooth_low_energy/utils.cc
index 45e108b..8729d2ca 100644
--- a/extensions/browser/api/bluetooth_low_energy/utils.cc
+++ b/extensions/browser/api/bluetooth_low_energy/utils.cc
@@ -47,10 +47,9 @@
   from->characteristic->properties.clear();
   std::unique_ptr<base::DictionaryValue> to = from->ToValue();
 
-  base::DictionaryValue* chrc_value = NULL;
-  to->GetDictionaryWithoutPathExpansion("characteristic", &chrc_value);
+  base::Value::Dict* chrc_value = to->GetDict().FindDict("characteristic");
   DCHECK(chrc_value);
-  chrc_value->SetKey("properties", CharacteristicPropertiesToValue(properties));
+  chrc_value->Set("properties", CharacteristicPropertiesToValue(properties));
   return to;
 }
 
diff --git a/extensions/browser/api/networking_private/networking_private_chromeos.cc b/extensions/browser/api/networking_private/networking_private_chromeos.cc
index ace4d92..7729483 100644
--- a/extensions/browser/api/networking_private/networking_private_chromeos.cc
+++ b/extensions/browser/api/networking_private/networking_private_chromeos.cc
@@ -761,7 +761,7 @@
 
   NET_LOG(USER) << __func__ << ":" << type;
   GetStateHandler()->SetTechnologyEnabled(
-      pattern, true, chromeos::network_handler::ErrorCallback());
+      pattern, true, ash::network_handler::ErrorCallback());
 
   std::move(callback).Run(true);
 }
@@ -772,7 +772,7 @@
 
   NET_LOG(USER) << __func__ << ":" << type;
   GetStateHandler()->SetTechnologyEnabled(
-      pattern, false, chromeos::network_handler::ErrorCallback());
+      pattern, false, ash::network_handler::ErrorCallback());
 
   std::move(callback).Run(true);
 }
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 3c7f9ea..f6d38b8 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -1813,15 +1813,6 @@
   }
 }
 
-const base::Value* ExtensionPrefs::GetPref(const PrefMap& pref) const {
-  DCHECK_EQ(PrefScope::kProfile, pref.scope);
-  const base::Value* pref_value = prefs_->Get(pref.name);
-  DCHECK(CheckPrefType(pref.type, pref_value))
-      << "PrefType does not match the value type of the stored value for "
-      << pref.name;
-  return pref_value;
-}
-
 void ExtensionPrefs::SetPref(const PrefMap& pref,
                              std::unique_ptr<base::Value> value) {
   DCHECK_EQ(PrefScope::kProfile, pref.scope);
diff --git a/extensions/browser/extension_prefs.h b/extensions/browser/extension_prefs.h
index f913b5e..34cda2b 100644
--- a/extensions/browser/extension_prefs.h
+++ b/extensions/browser/extension_prefs.h
@@ -793,8 +793,7 @@
       bool extensions_disabled,
       const std::vector<EarlyExtensionPrefsObserver*>& early_observers);
 
-  // Gets or sets profile wide ExtensionPrefs.
-  const base::Value* GetPref(const PrefMap& pref) const;
+  // Sets profile wide ExtensionPrefs.
   void SetPref(const PrefMap& pref, std::unique_ptr<base::Value> value);
 
   // Updates ExtensionPrefs for a specific extension.
diff --git a/extensions/browser/permissions_manager.cc b/extensions/browser/permissions_manager.cc
index 2bbdfe4..90e26c3b 100644
--- a/extensions/browser/permissions_manager.cc
+++ b/extensions/browser/permissions_manager.cc
@@ -49,15 +49,15 @@
                     const url::Origin& origin) {
   std::unique_ptr<prefs::ScopedDictionaryPrefUpdate> update =
       extension_prefs->CreatePrefUpdate(kUserPermissions);
-  base::ListValue* list = nullptr;
+  base::Value::List* list = nullptr;
 
-  bool pref_exists = (*update)->GetList(pref, &list);
+  bool pref_exists = (*update)->GetListWithoutPathExpansion(pref, &list);
   if (pref_exists) {
     list->Append(origin.Serialize());
   } else {
-    auto sites = std::make_unique<base::Value>(base::Value::Type::LIST);
-    sites->Append(origin.Serialize());
-    (*update)->Set(pref, std::move(sites));
+    base::Value::List sites;
+    sites.Append(origin.Serialize());
+    (*update)->SetKey(pref, base::Value(std::move(sites)));
   }
 }
 
@@ -67,9 +67,10 @@
                          const url::Origin& origin) {
   std::unique_ptr<prefs::ScopedDictionaryPrefUpdate> update =
       extension_prefs->CreatePrefUpdate(kUserPermissions);
-  base::ListValue* list;
-  (*update)->GetList(pref, &list);
-  list->EraseListValue(base::Value(origin.Serialize()));
+  base::Value::List* list = nullptr;
+  (*update)->GetListWithoutPathExpansion(pref, &list);
+  DCHECK(list);
+  list->EraseValue(base::Value(origin.Serialize()));
 }
 
 // Returns sites from `pref` in `extension_prefs`.
diff --git a/extensions/browser/updater/extension_downloader_unittest.cc b/extensions/browser/updater/extension_downloader_unittest.cc
index c9d081b8..4e3b1fe 100644
--- a/extensions/browser/updater/extension_downloader_unittest.cc
+++ b/extensions/browser/updater/extension_downloader_unittest.cc
@@ -75,31 +75,79 @@
     return helper->downloader().pending_tasks_;
   }
 
-  // Creates an update manifest for several extensions. Provided values should
-  // be tuples of (extension id, version, URL to the CRX file).
+  // Struct for creating app entries in the update manifest XML.
+  struct UpdateManifestItem {
+    explicit UpdateManifestItem(ExtensionId id) : id(std::move(id)) {}
+
+    UpdateManifestItem&& codebase(std::string value) && {
+      updatecheck_params.emplace("codebase", std::move(value));
+      return std::move(*this);
+    }
+    UpdateManifestItem&& info(std::string value) && {
+      updatecheck_params.emplace("info", std::move(value));
+      return std::move(*this);
+    }
+    UpdateManifestItem&& prodversionmin(std::string value) && {
+      updatecheck_params.emplace("prodversionmin", std::move(value));
+      return std::move(*this);
+    }
+    UpdateManifestItem&& status(std::string value) && {
+      updatecheck_params.emplace("status", std::move(value));
+      return std::move(*this);
+    }
+    UpdateManifestItem&& version(std::string value) && {
+      updatecheck_params.emplace("version", std::move(value));
+      return std::move(*this);
+    }
+
+    ExtensionId id;
+    std::map<std::string, std::string> updatecheck_params;
+  };
+
+  // A generic method to create an XML update manifest. For each extension an
+  // extension ID should be provided along with parameters of the updatecheck
+  // tag.
   std::string CreateUpdateManifest(
-      const std::vector<std::tuple<ExtensionId, std::string, std::string>>&
-          extensions) {
+      const std::vector<UpdateManifestItem>& extensions) {
     std::string content =
         "<?xml version='1.0' encoding='UTF-8'?>"
         "<gupdate xmlns='http://www.google.com/update2/response'"
         "                protocol='2.0'>";
-    for (const auto& [id, version, codebase] : extensions) {
+    for (const auto& update_item : extensions) {
       content += base::StringPrintf(
           " <app appid='%s'>"
-          "  <updatecheck codebase='%s' version='%s' prodversionmin='1.1' />"
-          " </app>",
-          id.c_str(), codebase.c_str(), version.c_str());
+          "  <updatecheck",
+          update_item.id.c_str());
+      for (const auto& [name, value] : update_item.updatecheck_params) {
+        content += base::StringPrintf(" %s='%s'", name.c_str(), value.c_str());
+      }
+      content +=
+          " />"
+          " </app>";
     }
     content += "</gupdate>";
     return content;
   }
 
-  std::string CreateUpdateManifest(const std::string& extension_id,
-                                   const std::string& extension_version) {
-    return CreateUpdateManifest(
-        {std::make_tuple(extension_id, extension_version,
-                         "http://example.com/extension_1.2.3.4.crx")});
+  // Creates an update manifest for several extensions. Provided values should
+  // be tuples of (extension id, version, URL to the CRX file).
+  std::string CreateUpdateManifest(
+      const std::vector<std::tuple<ExtensionId, std::string, std::string>>&
+          extensions) {
+    std::vector<UpdateManifestItem> extensions_raw;
+    for (const auto& [id, version, codebase] : extensions) {
+      extensions_raw.emplace_back(UpdateManifestItem(id)
+                                      .codebase(codebase)
+                                      .version(version)
+                                      .prodversionmin("1.1"));
+    }
+    return CreateUpdateManifest(extensions_raw);
+  }
+
+  // Create an update manifest with one test extension.
+  std::string CreateDefaultUpdateManifest() {
+    return CreateUpdateManifest({std::make_tuple(
+        kTestExtensionId, "1.1", "http://example.com/extension_1.2.3.4.crx")});
   }
 
   void SetHelperHandlers(ExtensionDownloaderTestHelper* helper,
@@ -119,7 +167,7 @@
   ExtensionDownloaderTestHelper helper;
 
   std::unique_ptr<ManifestFetchData> fetch(CreateTestAppFetchData());
-  const std::string manifest = CreateUpdateManifest(kTestExtensionId, "1.1");
+  const std::string manifest = CreateDefaultUpdateManifest();
   SetHelperHandlers(&helper, fetch->full_url(), manifest);
 
   MockExtensionDownloaderDelegate& delegate = helper.delegate();
@@ -175,7 +223,7 @@
   ExtensionDownloaderTestHelper helper;
 
   std::unique_ptr<ManifestFetchData> fetch(CreateTestAppFetchData());
-  const std::string manifest = CreateUpdateManifest(kTestExtensionId, "1.1");
+  const std::string manifest = CreateDefaultUpdateManifest();
   SetHelperHandlers(&helper, fetch->full_url(), manifest);
 
   MockExtensionDownloaderDelegate& delegate = helper.delegate();
@@ -313,15 +361,9 @@
   GURL fetch_url = fetch->full_url();
 
   const std::string kManifest =
-      "<?xml version='1.0' encoding='UTF-8'?>"
-      "<gupdate xmlns='http://www.google.com/update2/response'"
-      "                protocol='2.0'>"
-      " <app appid='" +
-      std::string(kTestExtensionId) +
-      "'>"
-      "  <updatecheck info='bandwidth limit' status='noupdate' />"
-      " </app>"
-      "</gupdate>";
+      CreateUpdateManifest({UpdateManifestItem(kTestExtensionId)
+                                .status("noupdate")
+                                .info("bandwidth limit")});
   helper.test_url_loader_factory().AddResponse(fetch_url.spec(), kManifest,
                                                net::HTTP_OK);
 
@@ -346,7 +388,7 @@
   ExtensionDownloaderTestHelper helper;
 
   std::unique_ptr<ManifestFetchData> fetch(CreateTestAppFetchData());
-  const std::string manifest = CreateUpdateManifest(kTestExtensionId, "1.1");
+  const std::string manifest = CreateDefaultUpdateManifest();
   SetHelperHandlers(&helper, fetch->full_url(), manifest);
 
   // Create cache and provide it to downloader.
@@ -374,7 +416,7 @@
   ExtensionDownloaderTestHelper helper;
 
   std::unique_ptr<ManifestFetchData> fetch(CreateTestAppFetchData());
-  const std::string manifest = CreateUpdateManifest(kTestExtensionId, "1.1");
+  const std::string manifest = CreateDefaultUpdateManifest();
   SetHelperHandlers(&helper, fetch->full_url(), manifest);
 
   // Create cache and provide it to downloader.
@@ -406,7 +448,7 @@
   ExtensionDownloaderTestHelper helper;
 
   std::unique_ptr<ManifestFetchData> fetch(CreateTestAppFetchData());
-  const std::string manifest = CreateUpdateManifest(kTestExtensionId, "1.1");
+  const std::string manifest = CreateDefaultUpdateManifest();
   SetHelperHandlers(&helper, fetch->full_url(), manifest);
 
   // Create cache and provide it to downloader.
diff --git a/extensions/shell/browser/shell_network_controller_chromeos.cc b/extensions/shell/browser/shell_network_controller_chromeos.cc
index c3c0592..8adc0abd 100644
--- a/extensions/shell/browser/shell_network_controller_chromeos.cc
+++ b/extensions/shell/browser/shell_network_controller_chromeos.cc
@@ -118,7 +118,7 @@
   for (const ash::NetworkState* network : network_list) {
     handler->network_configuration_handler()->SetShillProperties(
         network->path(), properties, base::DoNothing(),
-        chromeos::network_handler::ErrorCallback());
+        ash::network_handler::ErrorCallback());
   }
 }
 
diff --git a/gin/gin_features.cc b/gin/gin_features.cc
index 22a7b58..497ed28 100644
--- a/gin/gin_features.cc
+++ b/gin/gin_features.cc
@@ -89,7 +89,9 @@
                                            base::FEATURE_DISABLED_BY_DEFAULT};
 const base::FeatureParam<int> kV8ConcurrentSparkplugMaxThreads{
     &kV8ConcurrentSparkplug, "V8ConcurrentSparkplugMaxThreads", 0};
-
+const base::Feature kV8ConcurrentSparkplugHighPriorityThreads{
+    "V8ConcurrentSparkplugHighPriorityThreads",
+    base::FEATURE_DISABLED_BY_DEFAULT};
 // Makes sure the experimental Sparkplug compiler is only enabled if short
 // builtin calls are enabled too.
 const base::Feature kV8SparkplugNeedsShortBuiltinCalls{
diff --git a/gin/gin_features.h b/gin/gin_features.h
index 3514091b..1af22c2 100644
--- a/gin/gin_features.h
+++ b/gin/gin_features.h
@@ -17,6 +17,7 @@
 GIN_EXPORT extern const base::Feature kV8ConcurrentSparkplug;
 GIN_EXPORT extern const base::FeatureParam<int>
     kV8ConcurrentSparkplugMaxThreads;
+GIN_EXPORT extern const base::Feature kV8ConcurrentSparkplugHighPriorityThreads;
 GIN_EXPORT extern const base::Feature kV8CrashOnEvacuationFailure;
 GIN_EXPORT extern const base::Feature kV8ExperimentalRegexpEngine;
 GIN_EXPORT extern const base::Feature kV8FlushBytecode;
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
index 7effb71..ab2affb 100644
--- a/gin/v8_initializer.cc
+++ b/gin/v8_initializer.cc
@@ -302,6 +302,9 @@
     if (int max_threads = features::kV8ConcurrentSparkplugMaxThreads.Get()) {
       SetV8FlagsFormatted("--concurrent-sparkplug-max-threads=%i", max_threads);
     }
+    SetV8FlagsIfOverridden(features::kV8ConcurrentSparkplugHighPriorityThreads,
+                           "--concurrent-sparkplug-high-priority-threads",
+                           "--no-concurrent-sparkplug-high-priority-threads");
   }
 
   if (base::FeatureList::IsEnabled(features::kV8FlushBytecode)) {
diff --git a/ios/chrome/browser/follow/BUILD.gn b/ios/chrome/browser/follow/BUILD.gn
index 932eeb3..78670e4 100644
--- a/ios/chrome/browser/follow/BUILD.gn
+++ b/ios/chrome/browser/follow/BUILD.gn
@@ -70,6 +70,16 @@
   configs += [ "//build/config/compiler:enable_arc" ]
 }
 
+source_set("unit_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [ "follow_util_unittest.mm" ]
+  deps = [
+    ":utils",
+    "//testing/gtest",
+  ]
+}
+
 optimize_ts("rss_link_js") {
   visibility = [ ":follow" ]
 
diff --git a/ios/chrome/browser/follow/follow_tab_helper.mm b/ios/chrome/browser/follow/follow_tab_helper.mm
index 50caa371..b6966fd 100644
--- a/ios/chrome/browser/follow/follow_tab_helper.mm
+++ b/ios/chrome/browser/follow/follow_tab_helper.mm
@@ -192,7 +192,7 @@
   // fetching);
   // 3. The IPH was shown too recently.
   if (!recommended_url_ || recommended_url_.absoluteString.length == 0 ||
-      !IsFollowIPHShownFrequencyEligible(recommended_url_)) {
+      !IsFollowIPHShownFrequencyEligible(recommended_url_.host)) {
     return;
   }
 
@@ -270,7 +270,7 @@
   DCHECK(follow_iph_presenter_);
   [follow_iph_presenter_ presentFollowWhileBrowsingIPH];
   if (!experimental_flags::ShouldAlwaysShowFollowIPH()) {
-    StoreFollowIPHPresentingTime(recommended_url_);
+    StoreFollowIPHDisplayEvent(recommended_url_.host);
   }
 }
 
diff --git a/ios/chrome/browser/follow/follow_util.h b/ios/chrome/browser/follow/follow_util.h
index 5c382a8a..85fc8c7d 100644
--- a/ios/chrome/browser/follow/follow_util.h
+++ b/ios/chrome/browser/follow/follow_util.h
@@ -13,15 +13,22 @@
 
 // Key used to store the last shown time of follow in-product help (IPH).
 extern NSString* const kFollowIPHLastShownTime;
+// Key used to store the last shown event of follow in-product help (IPH).
+extern NSString* const kFollowIPHPreviousDisplayEvents;
+// Key used to store the site host when showing the follow in-product help
+// (IPH).
+extern NSString* const kFollowIPHHost;
+// Key used to store the date when showing the follow in-product help (IPH).
+extern NSString* const kFollowIPHDate;
 
 // Returns the Follow action state for |webState|.
 FollowActionState GetFollowActionState(web::WebState* webState);
 
 #pragma mark - For Follow IPH
 // Returns true if the time between the last time a Follow IPH was shown and now
-// is long enough for another Follow IPH appearance.
-bool IsFollowIPHShownFrequencyEligible(NSURL* RSSLink);
-// Stores the Follow IPH presenting time for website with `RSSLink`.
-void StoreFollowIPHPresentingTime(NSURL* RSSLink);
+// is long enough for another Follow IPH appearance for website `host`.
+bool IsFollowIPHShownFrequencyEligible(NSString* host);
+// Stores the Follow IPH display event with website `host`.
+void StoreFollowIPHDisplayEvent(NSString* host);
 
 #endif  // IOS_CHROME_BROWSER_FOLLOW_FOLLOW_UTIL_H_
diff --git a/ios/chrome/browser/follow/follow_util.mm b/ios/chrome/browser/follow/follow_util.mm
index 8005a48..2e786a1 100644
--- a/ios/chrome/browser/follow/follow_util.mm
+++ b/ios/chrome/browser/follow/follow_util.mm
@@ -27,8 +27,10 @@
 }  // namespace
 
 NSString* const kFollowIPHLastShownTime = @"FollowIPHLastShownTime";
-NSString* const kFollowIPHLastShownTimeForSite =
-    @"FollowIPHLastShownTimeForSite";
+NSString* const kFollowIPHPreviousDisplayEvents =
+    @"FollowIPHPreviousDisplayEvents";
+NSString* const kFollowIPHHost = @"host";
+NSString* const kFollowIPHDate = @"date";
 
 FollowActionState GetFollowActionState(web::WebState* webState) {
   // This method should be called only if the feature flag has been enabled.
@@ -62,62 +64,68 @@
 }
 
 #pragma mark - For Follow IPH
-bool IsFollowIPHShownFrequencyEligible(NSURL* RSSLink) {
+bool IsFollowIPHShownFrequencyEligible(NSString* host) {
   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
   NSDate* lastFollowIPHShownTime =
       [defaults objectForKey:kFollowIPHLastShownTime];
   // Return false if its too soon to show another IPH.
-  if ([[NSDate
+  if (lastFollowIPHShownTime &&
+      [[NSDate
           dateWithTimeIntervalSinceNow:-kFollowIPHAppearanceThresholdInSeconds]
-          compare:lastFollowIPHShownTime] == NSOrderedAscending)
+          compare:lastFollowIPHShownTime] == NSOrderedAscending) {
     return false;
+  }
 
-  NSDictionary<NSURL*, NSDate*>* lastFollowIPHShownTimeForSite =
-      [defaults objectForKey:kFollowIPHLastShownTimeForSite];
-  NSDate* lastIPHForSite = [lastFollowIPHShownTimeForSite objectForKey:RSSLink];
+  NSArray<NSDictionary*>* followIPHPreviousDisplayEvents =
+      [defaults objectForKey:kFollowIPHPreviousDisplayEvents];
+  NSDate* lastIPHDate;
+  for (NSDictionary* event in followIPHPreviousDisplayEvents) {
+    if ([[event objectForKey:kFollowIPHHost] isEqualToString:host]) {
+      lastIPHDate = [event objectForKey:kFollowIPHDate];
+      break;
+    }
+  }
+
   // Return true if it is long enough to show another IPH for this specific
   // site.
-  if (!lastIPHForSite ||
+  if (!lastIPHDate ||
       [[NSDate dateWithTimeIntervalSinceNow:
                    -kFollowIPHAppearanceThresholdForSiteInSeconds]
-          compare:lastIPHForSite] != NSOrderedAscending)
+          compare:lastIPHDate] != NSOrderedAscending) {
     return true;
+  }
 
   return false;
 }
 
-void StoreFollowIPHPresentingTime(NSURL* RSSLink) {
+void StoreFollowIPHDisplayEvent(NSString* host) {
   NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
-  NSDictionary<NSURL*, NSDate*>* lastFollowIPHShownTimeForSite =
-      [defaults objectForKey:kFollowIPHLastShownTimeForSite];
+  NSArray<NSDictionary*>* followIPHPreviousDisplayEvents =
+      [defaults objectForKey:kFollowIPHPreviousDisplayEvents];
 
-  // Convert the dictionary to a mutable dictionary.
-  // If the dictionary value hasn't been set in user default, then create a
-  // mutable dictionary.
-  NSMutableDictionary<NSURL*, NSDate*>* mutablelLastFollowIPHShownTimeForSite =
-      lastFollowIPHShownTimeForSite
-          ? [lastFollowIPHShownTimeForSite mutableCopy]
-          : [[NSMutableDictionary<NSURL*, NSDate*> alloc] init];
+  NSMutableArray<NSDictionary*>* updatedDisplayEvents =
+      [[NSMutableArray alloc] init];
 
-  // Update the last follow IPH show time for `RSSLink`.
-  [mutablelLastFollowIPHShownTimeForSite setObject:[NSDate date]
-                                            forKey:RSSLink];
-
+  // Add object to the the recentEvents while cleaning up dictionary that has a
+  // date older than 1 day ago. Since the follow iph will show in a specific
+  // regularity, this clean up logic will not execute often
   NSDate* uselessDate =
       [NSDate dateWithTimeIntervalSinceNow:
                   -kFollowIPHAppearanceThresholdForSiteInSeconds];
-  // Clean up object that has a date older than 1 day ago. Since the follow iph
-  // will show less than 5 times a week, this clean up logic won't execute
-  // every time when page loaded.
-  // TODO(crbug.com/1340154): move the clean up logic to a more fitable place.
-  for (NSURL* key in mutablelLastFollowIPHShownTimeForSite) {
-    if ([[mutablelLastFollowIPHShownTimeForSite objectForKey:key]
-            compare:uselessDate] == NSOrderedAscending) {
-      [mutablelLastFollowIPHShownTimeForSite removeObjectForKey:key];
+
+  for (NSDictionary* event in followIPHPreviousDisplayEvents) {
+    if ([[event objectForKey:kFollowIPHDate] compare:uselessDate] !=
+        NSOrderedAscending) {
+      [updatedDisplayEvents addObject:event];
     }
   }
 
-  [defaults setObject:mutablelLastFollowIPHShownTimeForSite
-               forKey:kFollowIPHLastShownTimeForSite];
+  // Add the last follow IPH event.
+  NSDictionary* IPHPresentingEvent =
+      @{kFollowIPHHost : host, kFollowIPHDate : [NSDate date]};
+  [updatedDisplayEvents addObject:IPHPresentingEvent];
+
+  [defaults setObject:updatedDisplayEvents
+               forKey:kFollowIPHPreviousDisplayEvents];
   [defaults synchronize];
 }
diff --git a/ios/chrome/browser/follow/follow_util_unittest.mm b/ios/chrome/browser/follow/follow_util_unittest.mm
new file mode 100644
index 0000000..3ea02a6
--- /dev/null
+++ b/ios/chrome/browser/follow/follow_util_unittest.mm
@@ -0,0 +1,95 @@
+// Copyright 2022 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.
+
+#import "ios/chrome/browser/follow/follow_util.h"
+
+#import <UIKit/UIKit.h>
+
+#import "testing/platform_test.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+class FollowUtilTest : public PlatformTest {
+ protected:
+  void SetUp() override { ClearUserDefault(); }
+
+  void TearDown() override { ClearUserDefault(); }
+
+  // Clean up the NSUserDefault.
+  void ClearUserDefault() {
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+    [defaults removeObjectForKey:kFollowIPHPreviousDisplayEvents];
+  }
+
+  // Set the follow IPH show time array to the NSUserDefault.
+  void SetFollowIPHShowTimeArray() {
+    NSMutableArray<NSDictionary*>* previousEvents =
+        [[NSMutableArray<NSDictionary*> alloc] init];
+    NSDate* date1 = [NSDate dateWithTimeIntervalSinceNow:-3600 * 28];
+    NSDate* date2 = [NSDate dateWithTimeIntervalSinceNow:-3600 * 25];
+    NSDate* date3 = [NSDate dateWithTimeIntervalSinceNow:-3600 * 20];
+
+    [previousEvents
+        addObject:@{kFollowIPHHost : @"abc.com", kFollowIPHDate : date1}];
+    [previousEvents
+        addObject:@{kFollowIPHHost : @"def.com", kFollowIPHDate : date2}];
+    [previousEvents
+        addObject:@{kFollowIPHHost : @"ghi.com", kFollowIPHDate : date3}];
+
+    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+    [defaults setObject:previousEvents forKey:kFollowIPHPreviousDisplayEvents];
+  }
+};
+
+// Tests follow IPH interval eligiblility.
+TEST_F(FollowUtilTest, TestIPHInterval) {
+  // Test Follow IPH can be shown when there's no Follow IPH have been
+  // displayed.
+  EXPECT_TRUE(IsFollowIPHShownFrequencyEligible(@"now.com"));
+
+  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+
+  NSDate* tenMinutes = [NSDate dateWithTimeIntervalSinceNow:-60 * 10];
+  [defaults setObject:tenMinutes forKey:kFollowIPHLastShownTime];
+  // Test Follow IPH can not be shown within 15 minutes from a previous Follow
+  // IPH.
+  EXPECT_FALSE(IsFollowIPHShownFrequencyEligible(@"now.com"));
+
+  SetFollowIPHShowTimeArray();
+  // Set the IPH last show time, it should be the same as date3/ghi.com in
+  // practice.
+  [defaults setObject:[NSDate dateWithTimeIntervalSinceNow:-3600 * 20]
+               forKey:kFollowIPHLastShownTime];
+  // Test Follow IPH can be shown for specific host if no Follow IPH has been
+  // shown ever for it.
+  EXPECT_TRUE(IsFollowIPHShownFrequencyEligible(@"now.com"));
+  // Test Follow IPH can be shown for specific host if a Follow IPH has been
+  // shown for it a day ago.
+  EXPECT_TRUE(IsFollowIPHShownFrequencyEligible(@"abc.com"));
+  // Test Follow IPH can not be shown for specific host if a Follow IPH has been
+  // shown for it within a day.
+  EXPECT_FALSE(IsFollowIPHShownFrequencyEligible(@"ghi.com"));
+}
+
+// Tests storing follow IPH display event.
+TEST_F(FollowUtilTest, TestStoreFollowIPHDisplayEvent) {
+  // When storing the url and time for the first time.
+  NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
+  StoreFollowIPHDisplayEvent(@"now.com");
+  ASSERT_EQ(
+      1, (int)[[defaults objectForKey:kFollowIPHPreviousDisplayEvents] count]);
+
+  // When storing the url and time to an existing user default.
+  SetFollowIPHShowTimeArray();
+  StoreFollowIPHDisplayEvent(@"now.com");
+  NSArray<NSDictionary*>* updatedArray =
+      [defaults objectForKey:kFollowIPHPreviousDisplayEvents];
+  EXPECT_EQ(2, (int)updatedArray.count);
+  EXPECT_TRUE([[updatedArray[0] objectForKey:kFollowIPHHost]
+      isEqualToString:@"ghi.com"]);
+  EXPECT_TRUE([[updatedArray[1] objectForKey:kFollowIPHHost]
+      isEqualToString:@"now.com"]);
+}
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index b9cc987..29b66f8 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -202,6 +202,7 @@
     "//ios/chrome/browser/favicon:unit_tests",
     "//ios/chrome/browser/find_in_page:unit_tests",
     "//ios/chrome/browser/flags:unit_tests",
+    "//ios/chrome/browser/follow:unit_tests",
     "//ios/chrome/browser/history:unit_tests",
     "//ios/chrome/browser/https_upgrades:unit_tests",
     "//ios/chrome/browser/infobars:unit_tests",
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 1e15c88f..27bbcae 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-5268948920d23c50d0c43f7afa433762849134f5
\ No newline at end of file
+6e507e1b6c81b4eaa5a3714cac371dd16767480e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index b46b2954..8b2e5712 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-166592853e5f77245f7a3413350ba34e77cf8760
\ No newline at end of file
+42ce934cf0d7e7ba07e2702e570bd9c036346b36
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index da59f3f1..67bb977 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-3da3db3b8e3426f3b51186533e4c09f5abf804f9
\ No newline at end of file
+f87291ae1406d8ec5c1cc5dbe7773048afb295b0
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 1b8caf6a..12fd729b 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-fcc213828c38f01ec6c9fde85ad177b86f7d4ee6
\ No newline at end of file
+5f4c09d22a6d327fadef354274f8d988c3c48379
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
index 94fa00a..d59aa62 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-44c194b0a32f3977a4a45d031dc91f171f4107b7
\ No newline at end of file
+d74f74975e69a8cc0057dece69c9f7449168344e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
index d3b1441..b5339fc 100644
--- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-64692b297b72b072769794ad66d268296fb14839
\ No newline at end of file
+895ea533a5f804418e2bb7ed3356458e16524e9f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 44f610f..895b92c 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-1e3d3c916dc1f2457fc1391655eba1fe89b95c5e
\ No newline at end of file
+f9c6bbef7495a01a2f8635f91971298cabbd1f3b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 0bc6ea2..f30b4d9 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-34399045db8ab1086d736a2d72f2ca9e0632b6e1
\ No newline at end of file
+d5691195bfcafef0bf9ee63ae925a17213969cc0
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index bc01591..d804884 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-33ac090e75cb98e76c6b45a001de9cd0800b493d
\ No newline at end of file
+6394bd22612966e4ee8503b8774cdfa5c15852bf
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index f0d27d2..382e114 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-db8e3d533b7640924d4a77b7de6cffd331a6d464
\ No newline at end of file
+64ae1f72c7f716e76dda452eb8fe7a9a67728e50
\ No newline at end of file
diff --git a/media/base/android/BUILD.gn b/media/base/android/BUILD.gn
index 474b610..e2d9961b 100644
--- a/media/base/android/BUILD.gn
+++ b/media/base/android/BUILD.gn
@@ -177,6 +177,7 @@
     ]
     resources_package = "org.chromium.media"
     sources = [
+      "java/src/org/chromium/media/AudioDeviceListener.java",
       "java/src/org/chromium/media/AudioDeviceSelector.java",
       "java/src/org/chromium/media/AudioDeviceSelectorPreS.java",
       "java/src/org/chromium/media/AudioManagerAndroid.java",
diff --git a/media/base/android/java/src/org/chromium/media/AudioDeviceListener.java b/media/base/android/java/src/org/chromium/media/AudioDeviceListener.java
new file mode 100644
index 0000000..4d36be9
--- /dev/null
+++ b/media/base/android/java/src/org/chromium/media/AudioDeviceListener.java
@@ -0,0 +1,363 @@
+// Copyright 2022 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.media;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.hardware.usb.UsbConstants;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbInterface;
+import android.hardware.usb.UsbManager;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.Log;
+
+import java.util.Map;
+
+class AudioDeviceListener {
+    private static final boolean DEBUG = false;
+
+    private static final String TAG = "media";
+
+    // Enabled during initialization if BLUETOOTH permission is granted.
+    private boolean mHasBluetoothPermission;
+
+    // Broadcast receiver for wired headset intent broadcasts.
+    private BroadcastReceiver mWiredHeadsetReceiver;
+
+    // Broadcast receiver for Bluetooth headset intent broadcasts.
+    // Utilized to detect changes in Bluetooth headset availability.
+    private BroadcastReceiver mBluetoothHeadsetReceiver;
+
+    // The UsbManager of this system.
+    private final UsbManager mUsbManager;
+
+    // Broadcast receiver for USB audio devices intent broadcasts.
+    // Utilized to detect if a USB device is attached or detached.
+    private BroadcastReceiver mUsbAudioReceiver;
+
+    private final AudioDeviceSelector.Devices mDeviceStates;
+
+    public AudioDeviceListener(AudioDeviceSelector.Devices devices) {
+        mUsbManager = (UsbManager) ContextUtils.getApplicationContext().getSystemService(
+                Context.USB_SERVICE);
+        mDeviceStates = devices;
+    }
+
+    public void init(boolean hasBluetoothPermission) {
+        // Initialize audio device list with things we know is always available.
+        mDeviceStates.setDeviceExistence(AudioDeviceSelector.Devices.ID_EARPIECE, hasEarpiece());
+        mDeviceStates.setDeviceExistence(AudioDeviceSelector.Devices.ID_USB_AUDIO, hasUsbAudio());
+        mDeviceStates.setDeviceExistence(AudioDeviceSelector.Devices.ID_SPEAKERPHONE, true);
+
+        mHasBluetoothPermission = hasBluetoothPermission;
+
+        // Register receivers for broadcasting intents related to Bluetooth device
+        // and Bluetooth SCO notifications. Requires BLUETOOTH permission.
+        registerBluetoothIntentsIfNeeded();
+
+        // Register receiver for broadcasting intents related to adding/
+        // removing a wired headset (Intent.ACTION_HEADSET_PLUG).
+        registerForWiredHeadsetIntentBroadcast();
+
+        // Register receiver for broadcasting intents related to adding/removing a
+        // USB audio device (ACTION_USB_DEVICE_ATTACHED/DETACHED);
+        registerForUsbAudioIntentBroadcast();
+    }
+
+    public void close() {
+        unregisterForWiredHeadsetIntentBroadcast();
+        unregisterBluetoothIntentsIfNeeded();
+        unregisterForUsbAudioIntentBroadcast();
+    }
+
+    /**
+     * Register for BT intents if we have the BLUETOOTH permission.
+     * Also extends the list of available devices with a BT device if one exists.
+     */
+    private void registerBluetoothIntentsIfNeeded() {
+        // Add a Bluetooth headset to the list of available devices if a BT
+        // headset is detected and if we have the BLUETOOTH permission.
+        // We must do this initial check using a dedicated method since the
+        // broadcasted intent BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
+        // is not sticky and will only be received if a BT headset is connected
+        // after this method has been called.
+        if (!mHasBluetoothPermission) {
+            Log.w(TAG, "registerBluetoothIntentsIfNeeded: Requires BLUETOOTH permission");
+            return;
+        }
+        mDeviceStates.setDeviceExistence(
+                AudioDeviceSelector.Devices.ID_BLUETOOTH_HEADSET, hasBluetoothHeadset());
+
+        // Register receivers for broadcast intents related to changes in
+        // Bluetooth headset availability.
+        registerForBluetoothHeadsetIntentBroadcast();
+    }
+
+    /** Unregister for BT intents if a registration has been made. */
+    private void unregisterBluetoothIntentsIfNeeded() {
+        // No need to unregister if we don't have BT permissions.
+        if (!mHasBluetoothPermission) return;
+
+        ContextUtils.getApplicationContext().unregisterReceiver(mBluetoothHeadsetReceiver);
+        mBluetoothHeadsetReceiver = null;
+    }
+
+    /**
+     * Gets the current Bluetooth headset state.
+     * android.bluetooth.BluetoothAdapter.getProfileConnectionState() requires
+     * the BLUETOOTH permission.
+     */
+    private boolean hasBluetoothHeadset() {
+        if (!mHasBluetoothPermission) {
+            Log.w(TAG, "hasBluetoothHeadset() requires BLUETOOTH permission");
+            return false;
+        }
+
+        BluetoothManager btManager =
+                (BluetoothManager) ContextUtils.getApplicationContext().getSystemService(
+                        Context.BLUETOOTH_SERVICE);
+        BluetoothAdapter btAdapter = btManager.getAdapter();
+
+        if (btAdapter == null) {
+            // Bluetooth not supported on this platform.
+            return false;
+        }
+
+        int profileConnectionState =
+                btAdapter.getProfileConnectionState(android.bluetooth.BluetoothProfile.HEADSET);
+
+        // Ensure that Bluetooth is enabled and that a device which supports the
+        // headset and handsfree profile is connected.
+        // TODO(henrika): it is possible that btAdapter.isEnabled() is
+        // redundant. It might be sufficient to only check the profile state.
+        return btAdapter.isEnabled()
+                && profileConnectionState == android.bluetooth.BluetoothProfile.STATE_CONNECTED;
+    }
+
+    /**
+     * Get the current USB audio device state. Android detects a compatible USB digital audio
+     * peripheral and automatically routes audio playback and capture appropriately on Android5.0
+     * and higher in the order of wired headset first, then USB audio device and earpiece at last.
+     */
+    private boolean hasUsbAudio() {
+        // UsbManager fails internally with NullPointerException on the emulator created without
+        // Google APIs.
+        Map<String, UsbDevice> devices;
+        try {
+            devices = mUsbManager.getDeviceList();
+        } catch (NullPointerException e) {
+            return false;
+        }
+
+        for (UsbDevice device : devices.values()) {
+            // A USB device with USB_CLASS_AUDIO and USB_CLASS_COMM interface is
+            // considerred as a USB audio device here.
+            if (hasUsbAudioCommInterface(device)) {
+                if (DEBUG) {
+                    logd("USB audio device: " + device.getProductName());
+                }
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Registers receiver for the broadcasted intent when a wired headset is
+     * plugged in or unplugged. The received intent will have an extra
+     * 'state' value where 0 means unplugged, and 1 means plugged.
+     */
+    private void registerForWiredHeadsetIntentBroadcast() {
+        IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
+
+        /** Receiver which handles changes in wired headset availability. */
+        mWiredHeadsetReceiver = new BroadcastReceiver() {
+            private static final int STATE_UNPLUGGED = 0;
+            private static final int STATE_PLUGGED = 1;
+            private static final int HAS_NO_MIC = 0;
+            private static final int HAS_MIC = 1;
+
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                int state = intent.getIntExtra("state", STATE_UNPLUGGED);
+                if (DEBUG) {
+                    int microphone = intent.getIntExtra("microphone", HAS_NO_MIC);
+                    String name = intent.getStringExtra("name");
+                    logd("BroadcastReceiver.onReceive: a=" + intent.getAction() + ", s=" + state
+                            + ", m=" + microphone + ", n=" + name
+                            + ", sb=" + isInitialStickyBroadcast());
+                }
+                switch (state) {
+                    case STATE_UNPLUGGED:
+                        mDeviceStates.setDeviceExistence(
+                                AudioDeviceSelector.Devices.ID_WIRED_HEADSET, false);
+                        break;
+                    case STATE_PLUGGED:
+                        mDeviceStates.setDeviceExistence(
+                                AudioDeviceSelector.Devices.ID_WIRED_HEADSET, true);
+                        break;
+                    default:
+                        break;
+                }
+
+                mDeviceStates.onPotentialDeviceStatusChange();
+            }
+        };
+
+        // Note: the intent we register for here is sticky, so it'll tell us
+        // immediately what the last action was (plugged or unplugged).
+        // It will enable us to set the speakerphone correctly.
+        ContextUtils.getApplicationContext().registerReceiver(mWiredHeadsetReceiver, filter);
+    }
+
+    /** Unregister receiver for broadcasted ACTION_HEADSET_PLUG intent. */
+    private void unregisterForWiredHeadsetIntentBroadcast() {
+        ContextUtils.getApplicationContext().unregisterReceiver(mWiredHeadsetReceiver);
+        mWiredHeadsetReceiver = null;
+    }
+
+    /**
+     * Registers receiver for the broadcasted intent related to BT headset
+     * availability or a change in connection state of the local Bluetooth
+     * adapter. Example: triggers when the BT device is turned on or off.
+     * BLUETOOTH permission is required to receive this one.
+     */
+    private void registerForBluetoothHeadsetIntentBroadcast() {
+        IntentFilter filter = new IntentFilter(
+                android.bluetooth.BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
+
+        /** Receiver which handles changes in BT headset availability. */
+        mBluetoothHeadsetReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                // A change in connection state of the Headset profile has
+                // been detected, e.g. BT headset has been connected or
+                // disconnected. This broadcast is *not* sticky.
+                int profileState =
+                        intent.getIntExtra(android.bluetooth.BluetoothHeadset.EXTRA_STATE,
+                                android.bluetooth.BluetoothHeadset.STATE_DISCONNECTED);
+                if (DEBUG) {
+                    logd("BroadcastReceiver.onReceive: a=" + intent.getAction()
+                            + ", s=" + profileState + ", sb=" + isInitialStickyBroadcast());
+                }
+
+                switch (profileState) {
+                    case android.bluetooth.BluetoothProfile.STATE_DISCONNECTED:
+                        // We do not have to explicitly call stopBluetoothSco()
+                        // since BT SCO will be disconnected automatically when
+                        // the BT headset is disabled.
+                        mDeviceStates.setDeviceExistence(
+                                AudioDeviceSelector.Devices.ID_BLUETOOTH_HEADSET, false);
+                        mDeviceStates.onPotentialDeviceStatusChange();
+                        break;
+                    case android.bluetooth.BluetoothProfile.STATE_CONNECTED:
+                        mDeviceStates.setDeviceExistence(
+                                AudioDeviceSelector.Devices.ID_BLUETOOTH_HEADSET, true);
+                        mDeviceStates.onPotentialDeviceStatusChange();
+                        break;
+                    case android.bluetooth.BluetoothProfile.STATE_CONNECTING:
+                        // Bluetooth service is switching from off to on.
+                        break;
+                    case android.bluetooth.BluetoothProfile.STATE_DISCONNECTING:
+                        // Bluetooth service is switching from on to off.
+                        break;
+                    default:
+                        break;
+                }
+            }
+        };
+
+        ContextUtils.getApplicationContext().registerReceiver(mBluetoothHeadsetReceiver, filter);
+    }
+
+    /**
+     * Enumerates the USB interfaces of the given USB device for interface with USB_CLASS_AUDIO
+     * class (USB class for audio devices) and USB_CLASS_COMM subclass (USB class for communication
+     * devices). Any device that supports these conditions will be considered a USB audio device.
+     *
+     * @param device USB device to be checked.
+     * @return Whether the USB device has such an interface.
+     */
+    private boolean hasUsbAudioCommInterface(UsbDevice device) {
+        for (int i = 0; i < device.getInterfaceCount(); ++i) {
+            UsbInterface iface = device.getInterface(i);
+            if (iface.getInterfaceClass() == UsbConstants.USB_CLASS_AUDIO
+                    && iface.getInterfaceSubclass() == UsbConstants.USB_CLASS_COMM) {
+                // There is at least one interface supporting audio communication.
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Registers receiver for the broadcasted intent when a USB device is plugged in or unplugged.
+     * Notice: Android supports multiple USB audio devices connected through a USB hub and OS will
+     * select the capture device and playback device from them. But plugging them in/out during a
+     * call may cause some unexpected result, i.e capturing error or zero capture length.
+     */
+    private void registerForUsbAudioIntentBroadcast() {
+        mUsbAudioReceiver = new BroadcastReceiver() {
+            @Override
+            public void onReceive(Context context, Intent intent) {
+                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
+                if (DEBUG) {
+                    logd("UsbDeviceBroadcastReceiver.onReceive: a= " + intent.getAction()
+                            + ", Device: " + device.toString());
+                }
+
+                // Not a USB audio device.
+                if (!hasUsbAudioCommInterface(device)) return;
+
+                if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
+                    mDeviceStates.setDeviceExistence(
+                            AudioDeviceSelector.Devices.ID_USB_AUDIO, true);
+                } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())
+                        && !hasUsbAudio()) {
+                    mDeviceStates.setDeviceExistence(
+                            AudioDeviceSelector.Devices.ID_USB_AUDIO, false);
+                }
+
+                mDeviceStates.onPotentialDeviceStatusChange();
+            }
+        };
+
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
+        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
+
+        ContextUtils.getApplicationContext().registerReceiver(mUsbAudioReceiver, filter);
+    }
+
+    /** Unregister receiver for broadcasted ACTION_USB_DEVICE_ATTACHED/DETACHED intent. */
+    private void unregisterForUsbAudioIntentBroadcast() {
+        ContextUtils.getApplicationContext().unregisterReceiver(mUsbAudioReceiver);
+        mUsbAudioReceiver = null;
+    }
+
+    /** Gets the current earpiece state. */
+    private boolean hasEarpiece() {
+        return ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
+                PackageManager.FEATURE_TELEPHONY);
+    }
+
+    /** Trivial helper method for debug logging */
+    private static void logd(String msg) {
+        Log.d(TAG, msg);
+    }
+
+    /** Trivial helper method for error logging */
+    private static void loge(String msg) {
+        Log.e(TAG, msg);
+    }
+}
diff --git a/media/base/android/java/src/org/chromium/media/AudioDeviceSelector.java b/media/base/android/java/src/org/chromium/media/AudioDeviceSelector.java
index 60e3df8..2c4f57b 100644
--- a/media/base/android/java/src/org/chromium/media/AudioDeviceSelector.java
+++ b/media/base/android/java/src/org/chromium/media/AudioDeviceSelector.java
@@ -9,7 +9,6 @@
 import org.chromium.base.Log;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 abstract class AudioDeviceSelector {
@@ -17,53 +16,16 @@
 
     protected static final boolean DEBUG = false;
 
-    // Supported audio device types.
-    protected static final int DEVICE_DEFAULT = -2;
-    protected static final int DEVICE_INVALID = -1;
-    protected static final int DEVICE_SPEAKERPHONE = 0;
-    protected static final int DEVICE_WIRED_HEADSET = 1;
-    protected static final int DEVICE_EARPIECE = 2;
-    protected static final int DEVICE_BLUETOOTH_HEADSET = 3;
-    protected static final int DEVICE_USB_AUDIO = 4;
-    protected static final int DEVICE_COUNT = 5;
+    protected Devices mDeviceStates = new Devices();
 
-    // Maps audio device types to string values. This map must be in sync
-    // with the device types above.
-    // TODO(henrika): add support for proper detection of device names and
-    // localize the name strings by using resource strings.
-    // See http://crbug.com/333208 for details.
-    protected static final String[] DEVICE_NAMES = new String[] {
-            "Speakerphone",
-            "Wired headset", // With or without microphone.
-            "Headset earpiece", // Only available on mobile phones.
-            "Bluetooth headset", // Requires BLUETOOTH permission.
-            "USB audio", // Requires Android API level 21 (5.0).
-    };
-
-    // List of valid device types.
-    protected static final Integer[] VALID_DEVICES = new Integer[] {
-            DEVICE_SPEAKERPHONE,
-            DEVICE_WIRED_HEADSET,
-            DEVICE_EARPIECE,
-            DEVICE_BLUETOOTH_HEADSET,
-            DEVICE_USB_AUDIO,
-    };
-
-    // Lock to protect |mAudioDevices| and |mRequestedAudioDevice| which can
-    // be accessed from the main thread and the audio manager thread.
-    protected final Object mLock = new Object();
-
-    // Id of the requested audio device. Can only be modified by
-    // call to setDevice().
-    protected int mRequestedAudioDevice = DEVICE_INVALID;
-
-    // Contains a list of currently available audio devices.
-    protected boolean[] mAudioDevices = new boolean[DEVICE_COUNT];
+    protected final AudioDeviceListener mDeviceListener;
 
     protected final AudioManager mAudioManager;
 
     protected AudioDeviceSelector(AudioManager audioManager) {
         mAudioManager = audioManager;
+
+        mDeviceListener = new AudioDeviceListener(mDeviceStates);
     }
 
     /**
@@ -103,49 +65,23 @@
     protected abstract void setAudioDevice(int device);
 
     public AudioManagerAndroid.AudioDeviceName[] getAudioInputDeviceNames() {
-        boolean devices[] = null;
-        synchronized (mLock) {
-            devices = mAudioDevices.clone();
-        }
-        List<String> list = new ArrayList<String>();
-        AudioManagerAndroid.AudioDeviceName[] array =
-                new AudioManagerAndroid.AudioDeviceName[getNumOfAudioDevices(devices)];
-        int i = 0;
-        for (int id = 0; id < DEVICE_COUNT; ++id) {
-            if (devices[id]) {
-                array[i] = new AudioManagerAndroid.AudioDeviceName(id, DEVICE_NAMES[id]);
-                list.add(DEVICE_NAMES[id]);
-                i++;
-            }
-        }
-        if (DEBUG) logd("getAudioInputDeviceNames: " + list);
-        return array;
+        return mDeviceStates.getAudioInputDeviceNames();
     }
 
-    public boolean setDevice(String deviceId) {
-        int intDeviceId = deviceId.isEmpty() ? DEVICE_DEFAULT : Integer.parseInt(deviceId);
+    /**
+     * Sets the passed ID as the active device if it is available. Also sets the given
+     * ID as the requested device ID, which will be prioritized when a device change
+     * occurs and maybeUpdateSelectedDevice() is called.
+     */
+    public boolean selectDevice(String stringDeviceId) {
+        int deviceId = DeviceHelpers.parseStringId(stringDeviceId);
 
-        if (intDeviceId == DEVICE_DEFAULT) {
-            boolean devices[] = null;
-            synchronized (mLock) {
-                devices = mAudioDevices.clone();
-                mRequestedAudioDevice = DEVICE_DEFAULT;
-            }
-            int defaultDevice = selectDefaultDevice(devices);
-            setAudioDevice(defaultDevice);
-            return true;
-        }
+        int nextDevice = mDeviceStates.setRequestedDeviceIdAndGetNextId(deviceId);
 
-        // A non-default device is specified. Verify that it is valid
-        // device, and if so, start using it.
-        List<Integer> validIds = Arrays.asList(VALID_DEVICES);
-        if (!validIds.contains(intDeviceId) || !mAudioDevices[intDeviceId]) {
-            return false;
-        }
-        synchronized (mLock) {
-            mRequestedAudioDevice = intDeviceId;
-        }
-        setAudioDevice(intDeviceId);
+        // `deviceId` is invalid, or its corresponding device is not available.
+        if (nextDevice == Devices.ID_INVALID) return false;
+
+        setAudioDevice(nextDevice);
         return true;
     }
 
@@ -154,80 +90,208 @@
      * information about if a specific device has been selected or if
      * the default device is selected.
      */
-    protected void updateDeviceActivation() {
-        boolean devices[] = null;
-        int requested = DEVICE_INVALID;
-        synchronized (mLock) {
-            requested = mRequestedAudioDevice;
-            devices = mAudioDevices.clone();
-        }
-        if (requested == DEVICE_INVALID) {
-            loge("Unable to activate device since no device is selected");
-            return;
-        }
+    protected void maybeUpdateSelectedDevice() {
+        int nextDevice = mDeviceStates.getNextDeviceIfRequested();
 
-        // Update default device if it has been selected explicitly, or
-        // the selected device has been removed from the list.
-        if (requested == DEVICE_DEFAULT || !devices[requested]) {
-            // Get default device given current list and activate the device.
-            int defaultDevice = selectDefaultDevice(devices);
-            setAudioDevice(defaultDevice);
-        } else {
-            // Activate the selected device since we know that it exists in
-            // the list.
-            setAudioDevice(requested);
-        }
+        // No device was explicitly requested.
+        if (nextDevice == Devices.ID_INVALID) return;
+
+        setAudioDevice(nextDevice);
     }
 
-    /** Returns true if setDevice() has been called with a valid device id. */
-    protected boolean deviceHasBeenRequested() {
-        synchronized (mLock) {
-            return (mRequestedAudioDevice != DEVICE_INVALID);
-        }
-    }
+    // Collection of static helpers.
+    private static class DeviceHelpers {
+        // Maps audio device types to string values. This map must be in sync
+        // with the Devices.ID_* below.
+        // TODO(henrika): add support for proper detection of device names and
+        // localize the name strings by using resource strings.
+        // See http://crbug.com/333208 for details.
+        public static final String[] DEVICE_NAMES = new String[] {
+                "Speakerphone",
+                "Wired headset", // With or without microphone.
+                "Headset earpiece", // Only available on mobile phones.
+                "Bluetooth headset", // Requires BLUETOOTH permission.
+                "USB audio",
+        };
 
-    /**
-     * Use a special selection scheme if the default device is selected.
-     * The "most unique" device will be selected; Wired headset first, then USB
-     * audio device, then Bluetooth and last the speaker phone.
-     */
-    private static int selectDefaultDevice(boolean[] devices) {
-        if (devices[DEVICE_WIRED_HEADSET]) {
-            return DEVICE_WIRED_HEADSET;
-        } else if (devices[DEVICE_USB_AUDIO]) {
-            return DEVICE_USB_AUDIO;
-        } else if (devices[DEVICE_BLUETOOTH_HEADSET]) {
-            // TODO(henrika): possibly need improvements here if we are
-            // in a state where Bluetooth is turning off.
-            return DEVICE_BLUETOOTH_HEADSET;
-        }
-        return DEVICE_SPEAKERPHONE;
-    }
+        private static final int ID_VALID_LOWER_BOUND = Devices.ID_SPEAKERPHONE;
+        private static final int ID_VALID_UPPER_BOUND = Devices.ID_USB_AUDIO;
 
-    /** Returns number of available devices */
-    private static int getNumOfAudioDevices(boolean[] devices) {
-        int count = 0;
-        for (int i = 0; i < DEVICE_COUNT; ++i) {
-            if (devices[i]) ++count;
-        }
-        return count;
-    }
-
-    /**
-     * For now, just log the state change but the idea is that we should
-     * notify a registered state change listener (if any) that there has
-     * been a change in the state.
-     * TODO(henrika): add support for state change listener.
-     */
-    protected void reportUpdate() {
-        if (!DEBUG) return;
-
-        synchronized (mLock) {
-            List<String> devices = new ArrayList<String>();
-            for (int i = 0; i < DEVICE_COUNT; ++i) {
-                if (mAudioDevices[i]) devices.add(DEVICE_NAMES[i]);
+        /**
+         * Use a special selection scheme if the default device is selected.
+         * The "most unique" device will be selected; Wired headset first, then USB
+         * audio device, then Bluetooth and last the speaker phone.
+         */
+        public static int selectDefaultDevice(boolean[] devices) {
+            if (devices[Devices.ID_WIRED_HEADSET]) {
+                return Devices.ID_WIRED_HEADSET;
             }
-            logd("reportUpdate: requested=" + mRequestedAudioDevice + ", devices=" + devices);
+
+            if (devices[Devices.ID_USB_AUDIO]) {
+                return Devices.ID_USB_AUDIO;
+            }
+
+            if (devices[Devices.ID_BLUETOOTH_HEADSET]) {
+                return Devices.ID_BLUETOOTH_HEADSET;
+            }
+
+            return Devices.ID_SPEAKERPHONE;
+        }
+
+        public static boolean isDeviceValid(int deviceId) {
+            return deviceId >= ID_VALID_LOWER_BOUND && deviceId <= ID_VALID_UPPER_BOUND;
+        }
+
+        public static boolean isDeviceValidOrDefault(int deviceId) {
+            return deviceId == Devices.ID_DEFAULT || isDeviceValid(deviceId);
+        }
+
+        public static int getActiveDeviceCount(boolean[] devices) {
+            int count = 0;
+
+            for (boolean device : devices) {
+                if (device) ++count;
+            }
+
+            return count;
+        }
+
+        public static int parseStringId(String stringDeviceId) {
+            return stringDeviceId.isEmpty() ? Devices.ID_DEFAULT : Integer.parseInt(stringDeviceId);
+        }
+    }
+
+    public class Devices {
+        // Supported audio device types.
+        public static final int ID_DEFAULT = -2;
+        public static final int ID_INVALID = -1;
+        public static final int ID_SPEAKERPHONE = 0;
+        public static final int ID_WIRED_HEADSET = 1;
+        public static final int ID_EARPIECE = 2;
+        public static final int ID_BLUETOOTH_HEADSET = 3;
+        public static final int ID_USB_AUDIO = 4;
+        private static final int DEVICE_COUNT = 5;
+
+        private Object mLock = new Object();
+
+        private int mRequestedAudioDevice = ID_INVALID;
+
+        private boolean[] mDeviceExistence = new boolean[DEVICE_COUNT];
+
+        /**
+         * Sets the whether a device exists.
+         *
+         * @param deviceId The ID of the device.
+         * @param exists Whether or not the device exists.
+         */
+        public void setDeviceExistence(int deviceId, boolean exists) {
+            if (!DeviceHelpers.isDeviceValid(deviceId)) return;
+
+            synchronized (mLock) {
+                mDeviceExistence[deviceId] = exists;
+            }
+        }
+
+        /**
+         * Called when an available device maybe became invalid or vice versa.
+         */
+        public void onPotentialDeviceStatusChange() {
+            maybeUpdateSelectedDevice();
+        }
+
+        /**
+         * Sets the requested device, and gets the device ID that should be currently selected.
+         *
+         * @param deviceId The requested device ID (including the DEVICE_DEFAULT ID).
+         * @return The ID of the audio device which should be selected, or DEVICE_INVALID if the
+         *         requested ID is unavailable.
+         */
+        public int setRequestedDeviceIdAndGetNextId(int deviceId) {
+            if (!DeviceHelpers.isDeviceValidOrDefault(deviceId)) return Devices.ID_INVALID;
+
+            synchronized (mLock) {
+                mRequestedAudioDevice = deviceId;
+                boolean[] availableDevices = getAvailableDevices_Locked();
+
+                // Handle the default device request.
+                if (deviceId == Devices.ID_DEFAULT) {
+                    return DeviceHelpers.selectDefaultDevice(availableDevices);
+                }
+
+                // A non-default device is specified. Verify that it is available before using it.
+                return availableDevices[deviceId] ? mRequestedAudioDevice : ID_INVALID;
+            }
+        }
+
+        /**
+         * Gets the ID of the device which should be currently selected, or ID_INVALID if no
+         * device was ever requested.
+         */
+        public int getNextDeviceIfRequested() {
+            synchronized (mLock) {
+                if (mRequestedAudioDevice == ID_INVALID) return ID_INVALID;
+
+                boolean[] availableDevices = getAvailableDevices_Locked();
+
+                if (mRequestedAudioDevice == ID_DEFAULT
+                        || !availableDevices[mRequestedAudioDevice]) {
+                    return DeviceHelpers.selectDefaultDevice(availableDevices);
+                }
+
+                return mRequestedAudioDevice;
+            }
+        }
+
+        /**
+         * Computes the list of available devices based off of exiting devices.
+         * We consider the availability of wired headsets, USB audio and earpices to be
+         * mutually exclusive.
+         */
+        private boolean[] getAvailableDevices_Locked() {
+            boolean[] availableDevices = mDeviceExistence.clone();
+
+            // Wired headset, USB audio and earpiece are mutually exclusive, and
+            // prioritized in that order.
+            if (availableDevices[ID_WIRED_HEADSET]) {
+                availableDevices[ID_USB_AUDIO] = false;
+                availableDevices[ID_EARPIECE] = false;
+            } else if (availableDevices[ID_USB_AUDIO]) {
+                availableDevices[ID_EARPIECE] = false;
+            }
+
+            return availableDevices;
+        }
+
+        /**
+         * Returns the list of currently available devices, to be used by the native side.
+         */
+        public AudioManagerAndroid.AudioDeviceName[] getAudioInputDeviceNames() {
+            boolean devices[] = null;
+            synchronized (mLock) {
+                devices = getAvailableDevices_Locked();
+            }
+            List<String> list = new ArrayList<String>();
+            int activeDeviceCount = DeviceHelpers.getActiveDeviceCount(devices);
+            AudioManagerAndroid.AudioDeviceName[] array =
+                    new AudioManagerAndroid.AudioDeviceName[activeDeviceCount];
+
+            int i = 0;
+            for (int id = 0; id < devices.length; ++id) {
+                if (devices[id]) {
+                    array[i] = new AudioManagerAndroid.AudioDeviceName(
+                            id, DeviceHelpers.DEVICE_NAMES[id]);
+                    list.add(DeviceHelpers.DEVICE_NAMES[id]);
+                    i++;
+                }
+            }
+            if (DEBUG) logd("getAudioInputDeviceNames: " + list);
+            return array;
+        }
+
+        public void clearRequestedDevice() {
+            synchronized (mLock) {
+                mRequestedAudioDevice = ID_INVALID;
+            }
         }
     }
 
diff --git a/media/base/android/java/src/org/chromium/media/AudioDeviceSelectorPreS.java b/media/base/android/java/src/org/chromium/media/AudioDeviceSelectorPreS.java
index 31b57eed..527da8b 100644
--- a/media/base/android/java/src/org/chromium/media/AudioDeviceSelectorPreS.java
+++ b/media/base/android/java/src/org/chromium/media/AudioDeviceSelectorPreS.java
@@ -4,26 +4,17 @@
 
 package org.chromium.media;
 
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
-import android.hardware.usb.UsbConstants;
-import android.hardware.usb.UsbDevice;
-import android.hardware.usb.UsbInterface;
-import android.hardware.usb.UsbManager;
 import android.media.AudioManager;
 import android.os.Build;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.base.Log;
 import org.chromium.base.compat.ApiHelperForS;
 
-import java.util.Map;
-
 class AudioDeviceSelectorPreS extends AudioDeviceSelector {
     private static final String TAG = "media";
 
@@ -35,72 +26,47 @@
     private static final int STATE_BLUETOOTH_SCO_TURNING_ON = 2;
     private static final int STATE_BLUETOOTH_SCO_TURNING_OFF = 3;
 
-    // Enabled during initialization if BLUETOOTH permission is granted.
-    private boolean mHasBluetoothPermission;
-
     // Stores the audio states related to Bluetooth SCO audio, where some
     // states are needed to keep track of intermediate states while the SCO
     // channel is enabled or disabled (switching state can take a few seconds).
     private int mBluetoothScoState = STATE_BLUETOOTH_SCO_INVALID;
 
-    // Broadcast receiver for wired headset intent broadcasts.
-    private BroadcastReceiver mWiredHeadsetReceiver;
+    private boolean mHasBluetoothPermission;
 
-    // Broadcast receiver for Bluetooth headset intent broadcasts.
-    // Utilized to detect changes in Bluetooth headset availability.
-    private BroadcastReceiver mBluetoothHeadsetReceiver;
+    public AudioDeviceSelectorPreS(AudioManager audioManager) {
+        super(audioManager);
+    }
 
     // Broadcast receiver for Bluetooth SCO broadcasts.
     // Utilized to detect if BT SCO streaming is on or off.
     private BroadcastReceiver mBluetoothScoReceiver;
 
-    // The UsbManager of this system.
-    private final UsbManager mUsbManager;
-    // Broadcast receiver for USB audio devices intent broadcasts.
-    // Utilized to detect if a USB device is attached or detached.
-    private BroadcastReceiver mUsbAudioReceiver;
-
-    public AudioDeviceSelectorPreS(AudioManager audioManager) {
-        super(audioManager);
-        mUsbManager = (UsbManager) ContextUtils.getApplicationContext().getSystemService(
-                Context.USB_SERVICE);
-    }
-
     @Override
     public void init() {
-        // Initialize audio device list with things we know is always available.
-        mAudioDevices[DEVICE_EARPIECE] = hasEarpiece();
-        mAudioDevices[DEVICE_WIRED_HEADSET] = hasWiredHeadset();
-        mAudioDevices[DEVICE_USB_AUDIO] = hasUsbAudio();
-        mAudioDevices[DEVICE_SPEAKERPHONE] = true;
+        mHasBluetoothPermission = hasPermission(android.Manifest.permission.BLUETOOTH);
 
-        // Register receivers for broadcasting intents related to Bluetooth device
-        // and Bluetooth SCO notifications. Requires BLUETOOTH permission.
-        registerBluetoothIntentsIfNeeded();
+        // TODO(crbug.com/1317548): Remove this check once there is an AudioDeviceSelector
+        // for S and above.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+            mHasBluetoothPermission &= ApiHelperForS.hasBluetoothConnectPermission();
+        }
 
-        // Register receiver for broadcasting intents related to adding/
-        // removing a wired headset (Intent.ACTION_HEADSET_PLUG).
-        registerForWiredHeadsetIntentBroadcast();
+        mDeviceListener.init(mHasBluetoothPermission);
 
-        // Register receiver for broadcasting intents related to adding/removing a
-        // USB audio device (ACTION_USB_DEVICE_ATTACHED/DETACHED);
-        registerForUsbAudioIntentBroadcast();
+        if (mHasBluetoothPermission) registerForBluetoothScoIntentBroadcast();
     }
 
     @Override
     public void close() {
-        unregisterForWiredHeadsetIntentBroadcast();
-        unregisterBluetoothIntentsIfNeeded();
-        unregisterForUsbAudioIntentBroadcast();
+        mDeviceListener.close();
+        if (mHasBluetoothPermission) unregisterForBluetoothScoIntentBroadcast();
     }
 
     @Override
     public void setCommunicationAudioModeOn(boolean on) {
         if (!on) {
             stopBluetoothSco();
-            synchronized (mLock) {
-                mRequestedAudioDevice = DEVICE_INVALID;
-            }
+            mDeviceStates.clearRequestedDevice();
         }
     }
 
@@ -125,254 +91,6 @@
     }
 
     /**
-     * Register for BT intents if we have the BLUETOOTH permission.
-     * Also extends the list of available devices with a BT device if one exists.
-     */
-    private void registerBluetoothIntentsIfNeeded() {
-        // Check if this process has the BLUETOOTH permission or not.
-        mHasBluetoothPermission = hasPermission(android.Manifest.permission.BLUETOOTH);
-
-        // TODO(crbug.com/1317548): Remove this check once there is an AudioDeviceSelector
-        // for S and above.
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
-            mHasBluetoothPermission &= ApiHelperForS.hasBluetoothConnectPermission();
-        }
-
-        // Add a Bluetooth headset to the list of available devices if a BT
-        // headset is detected and if we have the BLUETOOTH permission.
-        // We must do this initial check using a dedicated method since the
-        // broadcasted intent BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
-        // is not sticky and will only be received if a BT headset is connected
-        // after this method has been called.
-        if (!mHasBluetoothPermission) {
-            Log.w(TAG, "Requires BLUETOOTH permission");
-            return;
-        }
-        mAudioDevices[DEVICE_BLUETOOTH_HEADSET] = hasBluetoothHeadset();
-
-        // Register receivers for broadcast intents related to changes in
-        // Bluetooth headset availability and usage of the SCO channel.
-        registerForBluetoothHeadsetIntentBroadcast();
-        registerForBluetoothScoIntentBroadcast();
-    }
-
-    /** Unregister for BT intents if a registration has been made. */
-    private void unregisterBluetoothIntentsIfNeeded() {
-        if (mHasBluetoothPermission) {
-            mAudioManager.stopBluetoothSco();
-            unregisterForBluetoothHeadsetIntentBroadcast();
-            unregisterForBluetoothScoIntentBroadcast();
-        }
-    }
-
-    /**
-     * Gets the current Bluetooth headset state.
-     * android.bluetooth.BluetoothAdapter.getProfileConnectionState() requires
-     * the BLUETOOTH permission.
-     */
-    private boolean hasBluetoothHeadset() {
-        if (!mHasBluetoothPermission) {
-            Log.w(TAG, "hasBluetoothHeadset() requires BLUETOOTH permission");
-            return false;
-        }
-
-        BluetoothManager btManager =
-                (BluetoothManager) ContextUtils.getApplicationContext().getSystemService(
-                        Context.BLUETOOTH_SERVICE);
-        BluetoothAdapter btAdapter = btManager.getAdapter();
-
-        if (btAdapter == null) {
-            // Bluetooth not supported on this platform.
-            return false;
-        }
-
-        int profileConnectionState;
-        profileConnectionState =
-                btAdapter.getProfileConnectionState(android.bluetooth.BluetoothProfile.HEADSET);
-
-        // Ensure that Bluetooth is enabled and that a device which supports the
-        // headset and handsfree profile is connected.
-        // TODO(henrika): it is possible that btAdapter.isEnabled() is
-        // redundant. It might be sufficient to only check the profile state.
-        return btAdapter.isEnabled()
-                && profileConnectionState == android.bluetooth.BluetoothProfile.STATE_CONNECTED;
-    }
-
-    /**
-     * Get the current USB audio device state. Android detects a compatible USB digital audio
-     * peripheral and automatically routes audio playback and capture appropriately on Android5.0
-     * and higher in the order of wired headset first, then USB audio device and earpiece at last.
-     */
-    private boolean hasUsbAudio() {
-        // Android 5.0 (API level 21) and above supports USB audio class 1 (UAC1) features for
-        // audio functions, capture and playback, in host mode.
-
-        boolean hasUsbAudio = false;
-        // UsbManager fails internally with NullPointerException on the emulator created without
-        // Google APIs.
-        Map<String, UsbDevice> devices;
-        try {
-            devices = mUsbManager.getDeviceList();
-        } catch (NullPointerException e) {
-            return false;
-        }
-
-        for (UsbDevice device : devices.values()) {
-            // A USB device with USB_CLASS_AUDIO and USB_CLASS_COMM interface is
-            // considerred as a USB audio device here.
-            if (hasUsbAudioCommInterface(device)) {
-                if (DEBUG) {
-                    logd("USB audio device: " + device.getProductName());
-                }
-                hasUsbAudio = true;
-                break;
-            }
-        }
-
-        return hasUsbAudio;
-    }
-
-    /**
-     * Registers receiver for the broadcasted intent when a wired headset is
-     * plugged in or unplugged. The received intent will have an extra
-     * 'state' value where 0 means unplugged, and 1 means plugged.
-     */
-    private void registerForWiredHeadsetIntentBroadcast() {
-        IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG);
-
-        /** Receiver which handles changes in wired headset availability. */
-        mWiredHeadsetReceiver = new BroadcastReceiver() {
-            private static final int STATE_UNPLUGGED = 0;
-            private static final int STATE_PLUGGED = 1;
-            private static final int HAS_NO_MIC = 0;
-            private static final int HAS_MIC = 1;
-
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                int state = intent.getIntExtra("state", STATE_UNPLUGGED);
-                if (DEBUG) {
-                    int microphone = intent.getIntExtra("microphone", HAS_NO_MIC);
-                    String name = intent.getStringExtra("name");
-                    logd("BroadcastReceiver.onReceive: a=" + intent.getAction() + ", s=" + state
-                            + ", m=" + microphone + ", n=" + name
-                            + ", sb=" + isInitialStickyBroadcast());
-                }
-                switch (state) {
-                    case STATE_UNPLUGGED:
-                        synchronized (mLock) {
-                            // Wired headset and earpiece and USB audio are mutually exclusive.
-                            mAudioDevices[DEVICE_WIRED_HEADSET] = false;
-                            if (hasUsbAudio()) {
-                                mAudioDevices[DEVICE_USB_AUDIO] = true;
-                                mAudioDevices[DEVICE_EARPIECE] = false;
-                            } else if (hasEarpiece()) {
-                                mAudioDevices[DEVICE_EARPIECE] = true;
-                                mAudioDevices[DEVICE_USB_AUDIO] = false;
-                            }
-                        }
-                        break;
-                    case STATE_PLUGGED:
-                        synchronized (mLock) {
-                            // Wired headset and earpiece and USB audio are mutually exclusive.
-                            mAudioDevices[DEVICE_WIRED_HEADSET] = true;
-                            mAudioDevices[DEVICE_EARPIECE] = false;
-                            mAudioDevices[DEVICE_USB_AUDIO] = false;
-                        }
-                        break;
-                    default:
-                        loge("Invalid state");
-                        break;
-                }
-
-                // Update the existing device selection, but only if a specific
-                // device has already been selected explicitly.
-                if (deviceHasBeenRequested()) {
-                    updateDeviceActivation();
-                } else if (DEBUG) {
-                    reportUpdate();
-                }
-            }
-        };
-
-        // Note: the intent we register for here is sticky, so it'll tell us
-        // immediately what the last action was (plugged or unplugged).
-        // It will enable us to set the speakerphone correctly.
-        ContextUtils.getApplicationContext().registerReceiver(mWiredHeadsetReceiver, filter);
-    }
-
-    /** Unregister receiver for broadcasted ACTION_HEADSET_PLUG intent. */
-    private void unregisterForWiredHeadsetIntentBroadcast() {
-        ContextUtils.getApplicationContext().unregisterReceiver(mWiredHeadsetReceiver);
-        mWiredHeadsetReceiver = null;
-    }
-
-    /**
-     * Registers receiver for the broadcasted intent related to BT headset
-     * availability or a change in connection state of the local Bluetooth
-     * adapter. Example: triggers when the BT device is turned on or off.
-     * BLUETOOTH permission is required to receive this one.
-     */
-    private void registerForBluetoothHeadsetIntentBroadcast() {
-        IntentFilter filter = new IntentFilter(
-                android.bluetooth.BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
-
-        /** Receiver which handles changes in BT headset availability. */
-        mBluetoothHeadsetReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                // A change in connection state of the Headset profile has
-                // been detected, e.g. BT headset has been connected or
-                // disconnected. This broadcast is *not* sticky.
-                int profileState =
-                        intent.getIntExtra(android.bluetooth.BluetoothHeadset.EXTRA_STATE,
-                                android.bluetooth.BluetoothHeadset.STATE_DISCONNECTED);
-                if (DEBUG) {
-                    logd("BroadcastReceiver.onReceive: a=" + intent.getAction()
-                            + ", s=" + profileState + ", sb=" + isInitialStickyBroadcast());
-                }
-
-                switch (profileState) {
-                    case android.bluetooth.BluetoothProfile.STATE_DISCONNECTED:
-                        // We do not have to explicitly call stopBluetoothSco()
-                        // since BT SCO will be disconnected automatically when
-                        // the BT headset is disabled.
-                        synchronized (mLock) {
-                            // Remove the BT device from the list of devices.
-                            mAudioDevices[DEVICE_BLUETOOTH_HEADSET] = false;
-                        }
-                        break;
-                    case android.bluetooth.BluetoothProfile.STATE_CONNECTED:
-                        synchronized (mLock) {
-                            // Add the BT device to the list of devices.
-                            mAudioDevices[DEVICE_BLUETOOTH_HEADSET] = true;
-                        }
-                        break;
-                    case android.bluetooth.BluetoothProfile.STATE_CONNECTING:
-                        // Bluetooth service is switching from off to on.
-                        break;
-                    case android.bluetooth.BluetoothProfile.STATE_DISCONNECTING:
-                        // Bluetooth service is switching from on to off.
-                        break;
-                    default:
-                        loge("Invalid state");
-                        break;
-                }
-
-                if (DEBUG) {
-                    reportUpdate();
-                }
-            }
-        };
-
-        ContextUtils.getApplicationContext().registerReceiver(mBluetoothHeadsetReceiver, filter);
-    }
-
-    private void unregisterForBluetoothHeadsetIntentBroadcast() {
-        ContextUtils.getApplicationContext().unregisterReceiver(mBluetoothHeadsetReceiver);
-        mBluetoothHeadsetReceiver = null;
-    }
-
-    /**
      * Registers receiver for the broadcasted intent related the existence
      * of a BT SCO channel. Indicates if BT SCO streaming is on or off.
      */
@@ -399,9 +117,7 @@
                             // Bluetooth is probably powered off during the call.
                             // Update the existing device selection, but only if a specific
                             // device has already been selected explicitly.
-                            if (deviceHasBeenRequested()) {
-                                updateDeviceActivation();
-                            }
+                            maybeUpdateSelectedDevice();
                         }
                         mBluetoothScoState = STATE_BLUETOOTH_SCO_OFF;
                         break;
@@ -411,9 +127,6 @@
                     default:
                         loge("Invalid state");
                 }
-                if (DEBUG) {
-                    reportUpdate();
-                }
             }
         };
 
@@ -477,138 +190,30 @@
 
         // Ensure that the Bluetooth SCO audio channel is always disabled
         // unless the BT headset device is selected.
-        if (device == DEVICE_BLUETOOTH_HEADSET) {
+        if (device == Devices.ID_BLUETOOTH_HEADSET) {
             startBluetoothSco();
         } else {
             stopBluetoothSco();
         }
 
         switch (device) {
-            case DEVICE_BLUETOOTH_HEADSET:
+            case Devices.ID_BLUETOOTH_HEADSET:
                 break;
-            case DEVICE_SPEAKERPHONE:
+            case Devices.ID_SPEAKERPHONE:
                 setSpeakerphoneOn(true);
                 break;
-            case DEVICE_WIRED_HEADSET:
+            case Devices.ID_WIRED_HEADSET:
                 setSpeakerphoneOn(false);
                 break;
-            case DEVICE_EARPIECE:
+            case Devices.ID_EARPIECE:
                 setSpeakerphoneOn(false);
                 break;
-            case DEVICE_USB_AUDIO:
+            case Devices.ID_USB_AUDIO:
                 setSpeakerphoneOn(false);
                 break;
             default:
                 loge("Invalid audio device selection");
                 break;
         }
-        reportUpdate();
-    }
-
-    /**
-     * Enumerates the USB interfaces of the given USB device for interface with USB_CLASS_AUDIO
-     * class (USB class for audio devices) and USB_CLASS_COMM subclass (USB class for communication
-     * devices). Any device that supports these conditions will be considered a USB audio device.
-     *
-     * @param device USB device to be checked.
-     * @return Whether the USB device has such an interface.
-     */
-    private boolean hasUsbAudioCommInterface(UsbDevice device) {
-        boolean hasUsbAudioCommInterface = false;
-        for (int i = 0; i < device.getInterfaceCount(); ++i) {
-            UsbInterface iface = device.getInterface(i);
-            if (iface.getInterfaceClass() == UsbConstants.USB_CLASS_AUDIO
-                    && iface.getInterfaceSubclass() == UsbConstants.USB_CLASS_COMM) {
-                // There is at least one interface supporting audio communication.
-                hasUsbAudioCommInterface = true;
-                break;
-            }
-        }
-
-        return hasUsbAudioCommInterface;
-    }
-
-    /**
-     * Registers receiver for the broadcasted intent when a USB device is plugged in or unplugged.
-     * Notice: Android supports multiple USB audio devices connected through a USB hub and OS will
-     * select the capture device and playback device from them. But plugging them in/out during a
-     * call may cause some unexpected result, i.e capturing error or zero capture length.
-     */
-    private void registerForUsbAudioIntentBroadcast() {
-        mUsbAudioReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
-                if (DEBUG) {
-                    logd("UsbDeviceBroadcastReceiver.onReceive: a= " + intent.getAction()
-                            + ", Device: " + device.toString());
-                }
-
-                // Not a USB audio device.
-                if (!hasUsbAudioCommInterface(device)) return;
-
-                if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
-                    synchronized (mLock) {
-                        // Wired headset and earpiece and USB audio are mutually exclusive.
-                        if (!hasWiredHeadset()) {
-                            mAudioDevices[DEVICE_USB_AUDIO] = true;
-                            mAudioDevices[DEVICE_EARPIECE] = false;
-                        }
-                    }
-                } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(intent.getAction())
-                        && !hasUsbAudio()) {
-                    // When a USB audio device is detached, we need to check if there is any other
-                    // USB audio device still connected, e.g. through a USB hub.
-                    // Only update the device list when there is no more USB audio device attached.
-                    synchronized (mLock) {
-                        if (!hasWiredHeadset()) {
-                            mAudioDevices[DEVICE_USB_AUDIO] = false;
-                            // Wired headset and earpiece and USB audio are mutually exclusive.
-                            if (hasEarpiece()) {
-                                mAudioDevices[DEVICE_EARPIECE] = true;
-                            }
-                        }
-                    }
-                }
-
-                // Update the existing device selection, but only if a specific
-                // device has already been selected explicitly.
-                if (deviceHasBeenRequested()) {
-                    updateDeviceActivation();
-                } else if (DEBUG) {
-                    reportUpdate();
-                }
-            }
-        };
-
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
-        filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
-
-        ContextUtils.getApplicationContext().registerReceiver(mUsbAudioReceiver, filter);
-    }
-
-    /** Unregister receiver for broadcasted ACTION_USB_DEVICE_ATTACHED/DETACHED intent. */
-    private void unregisterForUsbAudioIntentBroadcast() {
-        ContextUtils.getApplicationContext().unregisterReceiver(mUsbAudioReceiver);
-        mUsbAudioReceiver = null;
-    }
-
-    /** Gets the current earpiece state. */
-    private boolean hasEarpiece() {
-        return ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_TELEPHONY);
-    }
-
-    /**
-     * Checks whether a wired headset is connected or not.
-     * This is not a valid indication that audio playback is actually over
-     * the wired headset as audio routing depends on other conditions. We
-     * only use it as an early indicator (during initialization) of an attached
-     * wired headset.
-     */
-    @Deprecated
-    private boolean hasWiredHeadset() {
-        return mAudioManager.isWiredHeadsetOn();
     }
 }
diff --git a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
index 9b5cede..2056357b 100644
--- a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
+++ b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
@@ -165,6 +165,8 @@
             return;
         }
 
+        // TODO(crbug.com/1317548): Should we exit early if we are already in/out of
+        // communication mode?
         if (on) {
             // Store microphone mute state and speakerphone state so it can
             // be restored when closing.
@@ -241,7 +243,7 @@
             return false;
         }
 
-        return mAudioDeviceSelector.setDevice(deviceId);
+        return mAudioDeviceSelector.selectDevice(deviceId);
     }
 
     /**
diff --git a/media/capture/video/win/video_capture_device_mf_win.cc b/media/capture/video/win/video_capture_device_mf_win.cc
index 37aa8fc..0afde08 100644
--- a/media/capture/video/win/video_capture_device_mf_win.cc
+++ b/media/capture/video/win/video_capture_device_mf_win.cc
@@ -606,6 +606,9 @@
   return S_OK;
 }
 
+// Destruction helper. Can't use base::DoNothingAs<> since ComPtr isn't POD.
+void DestroyCaptureEngine(Microsoft::WRL::ComPtr<IMFCaptureEngine>) {}
+
 }  // namespace
 
 class MFVideoCallback final
@@ -944,6 +947,15 @@
   if (video_callback_) {
     video_callback_->Shutdown();
   }
+
+  // In case there's about to be a new device created with a different config,
+  // defer destruction of the IMFCaptureEngine since it force unloads a bunch of
+  // DLLs which are expensive to reload.
+  if (engine_) {
+    main_thread_task_runner_->PostDelayedTask(
+        FROM_HERE, base::BindOnce(&DestroyCaptureEngine, std::move(engine_)),
+        base::Seconds(5));
+  }
 }
 
 bool VideoCaptureDeviceMFWin::Init() {
diff --git a/media/gpu/h265_decoder_unittest.cc b/media/gpu/h265_decoder_unittest.cc
index 3660b9b..7a61509 100644
--- a/media/gpu/h265_decoder_unittest.cc
+++ b/media/gpu/h265_decoder_unittest.cc
@@ -524,4 +524,11 @@
   EXPECT_TRUE(decoder_->Flush());
 }
 
+TEST_F(H265DecoderTest, DecodeMultiFrameInput) {
+  SetInputFrameFiles({"bear.hevc"});
+  EXPECT_EQ(AcceleratedVideoDecoder::kConfigChange, Decode());
+  EXPECT_EQ(AcceleratedVideoDecoder::kRanOutOfStreamData, Decode());
+  EXPECT_TRUE(decoder_->Flush());
+}
+
 }  // namespace media
diff --git a/media/video/h265_parser.cc b/media/video/h265_parser.cc
index 29ded0b3..74367e15 100644
--- a/media/video/h265_parser.cc
+++ b/media/video/h265_parser.cc
@@ -1227,7 +1227,7 @@
     SKIP_BITS_OR_RETURN(slice_segment_header_extension_length * 8);
   }
 
-  if (prior_shdr) {
+  if (prior_shdr && !shdr->first_slice_segment_in_pic_flag) {
     // Validate the fields that must match between slice headers for the same
     // picture.
     EQ_OR_RETURN(shdr, prior_shdr, slice_pic_parameter_set_id);
diff --git a/media/video/h265_parser_unittest.cc b/media/video/h265_parser_unittest.cc
index b6e3186..1a30b397 100644
--- a/media/video/h265_parser_unittest.cc
+++ b/media/video/h265_parser_unittest.cc
@@ -5,6 +5,7 @@
 #include <memory>
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "base/files/file_path.h"
 #include "base/files/memory_mapped_file.h"
 #include "base/logging.h"
@@ -314,4 +315,40 @@
   EXPECT_TRUE(shdr.slice_loop_filter_across_slices_enabled_flag);
 }
 
+TEST_F(H265ParserTest, SliceHeaderParsingNoValidationOnFirstSliceInFrame) {
+  LoadParserFile("bear.hevc");
+  H265SliceHeader curr_slice_header;
+  H265SliceHeader last_slice_header;
+
+  while (true) {
+    H265NALU nalu;
+    H265Parser::Result result = parser_.AdvanceToNextNALU(&nalu);
+    ASSERT_TRUE(result == H265Parser::kOk || result == H265Parser::kEOStream);
+    if (result == H265Parser::kEOStream)
+      break;
+
+    switch (nalu.nal_unit_type) {
+      case H265NALU::TRAIL_R:
+        [[fallthrough]];
+      case H265NALU::IDR_W_RADL:
+        result = parser_.ParseSliceHeader(nalu, &curr_slice_header,
+                                          &last_slice_header);
+        EXPECT_EQ(result, H265Parser::kOk);
+        last_slice_header = curr_slice_header;
+        break;
+      case H265NALU::SPS_NUT:
+        int sps_id;
+        EXPECT_EQ(parser_.ParseSPS(&sps_id), H265Parser::kOk);
+        EXPECT_NE(parser_.GetSPS(sps_id), nullptr);
+        break;
+      case H265NALU::PPS_NUT:
+        int pps_id;
+        EXPECT_EQ(parser_.ParsePPS(nalu, &pps_id), H265Parser::kOk);
+        EXPECT_NE(parser_.GetPPS(pps_id), nullptr);
+        break;
+      default:
+        break;
+    }
+  }
+}
 }  // namespace media
diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc
index a0deb96d..c26e46d7 100644
--- a/net/http/http_cache_unittest.cc
+++ b/net/http/http_cache_unittest.cc
@@ -13519,8 +13519,7 @@
       const MockTransaction& trans_info,
       const NetworkIsolationKey& network_isolation_key,
       const std::string& checksum) {
-    MockTransaction transaction(trans_info);
-    AddMockTransaction(&transaction);
+    ScopedMockTransaction transaction(trans_info);
 
     MockHttpRequest request(transaction);
     request.network_isolation_key = network_isolation_key;
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index a333fa4..d91504d 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -811,7 +811,8 @@
 
 void QuicChromiumClientSession::ConnectionMigrationValidationResultDelegate::
     OnPathValidationSuccess(
-        std::unique_ptr<quic::QuicPathValidationContext> context) {
+        std::unique_ptr<quic::QuicPathValidationContext> context,
+        quic::QuicTime start_time) {
   auto* chrome_context =
       static_cast<QuicChromiumPathValidationContext*>(context.get());
   session_->OnConnectionMigrationProbeSucceeded(
@@ -838,7 +839,8 @@
 
 void QuicChromiumClientSession::PortMigrationValidationResultDelegate::
     OnPathValidationSuccess(
-        std::unique_ptr<quic::QuicPathValidationContext> context) {
+        std::unique_ptr<quic::QuicPathValidationContext> context,
+        quic::QuicTime start_time) {
   auto* chrome_context =
       static_cast<QuicChromiumPathValidationContext*>(context.get());
   session_->OnPortMigrationProbeSucceeded(
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h
index b019701..4a75846 100644
--- a/net/quic/quic_chromium_client_session.h
+++ b/net/quic/quic_chromium_client_session.h
@@ -464,7 +464,8 @@
         QuicChromiumClientSession* session);
 
     void OnPathValidationSuccess(
-        std::unique_ptr<quic::QuicPathValidationContext> context) override;
+        std::unique_ptr<quic::QuicPathValidationContext> context,
+        quic::QuicTime start_time) override;
 
     void OnPathValidationFailure(
         std::unique_ptr<quic::QuicPathValidationContext> context) override;
@@ -483,7 +484,8 @@
         QuicChromiumClientSession* session);
 
     void OnPathValidationSuccess(
-        std::unique_ptr<quic::QuicPathValidationContext> context) override;
+        std::unique_ptr<quic::QuicPathValidationContext> context,
+        quic::QuicTime start_time) override;
 
     void OnPathValidationFailure(
         std::unique_ptr<quic::QuicPathValidationContext> context) override;
diff --git a/services/device/compute_pressure/BUILD.gn b/services/device/compute_pressure/BUILD.gn
index 5725f7da..184d1eb 100644
--- a/services/device/compute_pressure/BUILD.gn
+++ b/services/device/compute_pressure/BUILD.gn
@@ -54,4 +54,15 @@
 
     all_dependent_configs = [ ":compute_pressure_win_linker_flags" ]
   }
+
+  if (is_mac) {
+    sources += [
+      "core_times.cc",
+      "core_times.h",
+      "cpu_probe_mac.cc",
+      "cpu_probe_mac.h",
+      "host_processor_info_scanner.cc",
+      "host_processor_info_scanner.h",
+    ]
+  }
 }
diff --git a/services/device/compute_pressure/cpu_probe.cc b/services/device/compute_pressure/cpu_probe.cc
index 26e16b9..aac522d44 100644
--- a/services/device/compute_pressure/cpu_probe.cc
+++ b/services/device/compute_pressure/cpu_probe.cc
@@ -14,6 +14,8 @@
 #include "services/device/compute_pressure/cpu_probe_linux.h"
 #elif BUILDFLAG(IS_WIN)
 #include "services/device/compute_pressure/cpu_probe_win.h"
+#elif BUILDFLAG(IS_MAC)
+#include "services/device/compute_pressure/cpu_probe_mac.h"
 #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 
 namespace device {
@@ -58,6 +60,8 @@
   return CpuProbeLinux::Create();
 #elif BUILDFLAG(IS_WIN)
   return CpuProbeWin::Create();
+#elif BUILDFLAG(IS_MAC)
+  return CpuProbeMac::Create();
 #else
   return std::make_unique<NullCpuProbe>();
 #endif  // BUILDFLAG(IS_ANDROID)
diff --git a/services/device/compute_pressure/cpu_probe_linux.cc b/services/device/compute_pressure/cpu_probe_linux.cc
index 612a625..7dc84fa 100644
--- a/services/device/compute_pressure/cpu_probe_linux.cc
+++ b/services/device/compute_pressure/cpu_probe_linux.cc
@@ -29,8 +29,7 @@
 }
 
 CpuProbeLinux::CpuProbeLinux(base::FilePath procfs_stat_path)
-    : stat_parser_(std::move(procfs_stat_path)),
-      last_sample_(CpuProbe::kUnsupportedValue) {
+    : stat_parser_(std::move(procfs_stat_path)) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
@@ -40,26 +39,26 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   stat_parser_.Update();
-  const std::vector<CoreTimes>& core_times = stat_parser_.core_times();
+  const std::vector<CoreTimes>& per_core_times = stat_parser_.core_times();
 
   double utilization_sum = 0.0;
   int utilization_cores = 0;
-  for (size_t i = 0; i < core_times.size(); ++i) {
-    DCHECK_GE(last_core_times_.size(), i);
+  for (size_t i = 0; i < per_core_times.size(); ++i) {
+    DCHECK_GE(last_per_core_times_.size(), i);
 
-    const CoreTimes& current_core_times = core_times[i];
+    const CoreTimes& core_times = per_core_times[i];
 
-    if (last_core_times_.size() == i) {
-      InitializeCore(i, current_core_times);
+    if (last_per_core_times_.size() == i) {
+      InitializeCore(i, core_times);
       continue;
     }
 
     double core_utilization =
-        current_core_times.TimeUtilization(last_core_times_[i]);
+        core_times.TimeUtilization(last_per_core_times_[i]);
     if (core_utilization >= 0) {
-      // Only overwrite `last_core_times_` if the /proc/stat counters are
+      // Only overwrite `last_per_core_times_` if the /proc/stat counters are
       // monotonically increasing. Otherwise, discard the measurement.
-      last_core_times_[i] = current_core_times;
+      last_per_core_times_[i] = core_times;
 
       utilization_sum += core_utilization;
       ++utilization_cores;
@@ -69,7 +68,7 @@
   if (utilization_cores > 0) {
     last_sample_.cpu_utilization = utilization_sum / utilization_cores;
   } else {
-    last_sample_ = CpuProbe::kUnsupportedValue;
+    last_sample_ = kUnsupportedValue;
   }
 }
 
@@ -81,10 +80,9 @@
 void CpuProbeLinux::InitializeCore(size_t core_index,
                                    const CoreTimes& initial_core_times) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK_GE(core_index, 0u);
-  DCHECK_EQ(last_core_times_.size(), core_index);
+  DCHECK_EQ(last_per_core_times_.size(), core_index);
 
-  last_core_times_.push_back(initial_core_times);
+  last_per_core_times_.push_back(initial_core_times);
 }
 
 }  // namespace device
diff --git a/services/device/compute_pressure/cpu_probe_linux.h b/services/device/compute_pressure/cpu_probe_linux.h
index f19c9eb..591f078c 100644
--- a/services/device/compute_pressure/cpu_probe_linux.h
+++ b/services/device/compute_pressure/cpu_probe_linux.h
@@ -53,9 +53,11 @@
   ProcfsStatCpuParser stat_parser_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   // Most recent per-core times from /proc/stat.
-  std::vector<CoreTimes> last_core_times_ GUARDED_BY_CONTEXT(sequence_checker_);
+  std::vector<CoreTimes> last_per_core_times_
+      GUARDED_BY_CONTEXT(sequence_checker_);
 
-  PressureSample last_sample_ GUARDED_BY_CONTEXT(sequence_checker_);
+  PressureSample last_sample_ GUARDED_BY_CONTEXT(sequence_checker_) =
+      kUnsupportedValue;
 };
 
 }  // namespace device
diff --git a/services/device/compute_pressure/cpu_probe_mac.cc b/services/device/compute_pressure/cpu_probe_mac.cc
new file mode 100644
index 0000000..8a39e074
--- /dev/null
+++ b/services/device/compute_pressure/cpu_probe_mac.cc
@@ -0,0 +1,77 @@
+// Copyright 2022 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 "services/device/compute_pressure/cpu_probe_mac.h"
+
+#include "base/check_op.h"
+#include "base/memory/ptr_util.h"
+
+namespace device {
+
+// static
+std::unique_ptr<CpuProbeMac> CpuProbeMac::Create() {
+  return base::WrapUnique(new CpuProbeMac());
+}
+
+CpuProbeMac::CpuProbeMac() {
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
+
+CpuProbeMac::~CpuProbeMac() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+void CpuProbeMac::Update() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  processor_info_scanner_.Update();
+  const std::vector<CoreTimes>& per_core_times =
+      processor_info_scanner_.core_times();
+
+  double utilization_sum = 0.0;
+  int utilization_cores = 0;
+  for (size_t i = 0; i < per_core_times.size(); ++i) {
+    DCHECK_GE(last_per_core_times_.size(), i);
+
+    const CoreTimes& core_times = per_core_times[i];
+
+    if (last_per_core_times_.size() == i) {
+      InitializeCore(i, core_times);
+      continue;
+    }
+
+    double core_utilization =
+        core_times.TimeUtilization(last_per_core_times_[i]);
+    if (core_utilization >= 0) {
+      // Only overwrite `last_per_core_times_` if the cpu time counters are
+      // monotonically increasing. Otherwise, discard the measurement.
+      last_per_core_times_[i] = core_times;
+
+      utilization_sum += core_utilization;
+      ++utilization_cores;
+    }
+  }
+
+  if (utilization_cores > 0) {
+    last_sample_.cpu_utilization = utilization_sum / utilization_cores;
+  } else {
+    last_sample_ = kUnsupportedValue;
+  }
+}
+
+PressureSample CpuProbeMac::LastSample() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  return last_sample_;
+}
+
+void CpuProbeMac::InitializeCore(size_t core_index,
+                                 const CoreTimes& initial_core_times) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_EQ(last_per_core_times_.size(), core_index);
+
+  last_per_core_times_.push_back(initial_core_times);
+}
+
+}  // namespace device
diff --git a/services/device/compute_pressure/cpu_probe_mac.h b/services/device/compute_pressure/cpu_probe_mac.h
new file mode 100644
index 0000000..27f5ca58
--- /dev/null
+++ b/services/device/compute_pressure/cpu_probe_mac.h
@@ -0,0 +1,55 @@
+// Copyright 2022 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 SERVICES_DEVICE_COMPUTE_PRESSURE_CPU_PROBE_MAC_H_
+#define SERVICES_DEVICE_COMPUTE_PRESSURE_CPU_PROBE_MAC_H_
+
+#include <vector>
+
+#include "base/sequence_checker.h"
+#include "base/thread_annotations.h"
+#include "services/device/compute_pressure/core_times.h"
+#include "services/device/compute_pressure/cpu_probe.h"
+#include "services/device/compute_pressure/host_processor_info_scanner.h"
+#include "services/device/compute_pressure/pressure_sample.h"
+
+namespace device {
+
+class CpuProbeMac : public CpuProbe {
+ public:
+  // Factory method for production instances.
+  static std::unique_ptr<CpuProbeMac> Create();
+
+  ~CpuProbeMac() override;
+
+  CpuProbeMac(const CpuProbeMac&) = delete;
+  CpuProbeMac& operator=(const CpuProbeMac&) = delete;
+
+  // CpuProbe implementation.
+  void Update() override;
+  PressureSample LastSample() override;
+
+ private:
+  CpuProbeMac();
+
+  // Called when a core is seen the first time.
+  void InitializeCore(size_t core_index, const CoreTimes& initial_core_times);
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  // Used to derive CPU utilization.
+  HostProcessorInfoScanner processor_info_scanner_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  // Most recent per-core times.
+  std::vector<CoreTimes> last_per_core_times_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  PressureSample last_sample_ GUARDED_BY_CONTEXT(sequence_checker_) =
+      kUnsupportedValue;
+};
+
+}  // namespace device
+
+#endif  // SERVICES_DEVICE_COMPUTE_PRESSURE_CPU_PROBE_MAC_H_
diff --git a/services/device/compute_pressure/host_processor_info_scanner.cc b/services/device/compute_pressure/host_processor_info_scanner.cc
new file mode 100644
index 0000000..9904a24
--- /dev/null
+++ b/services/device/compute_pressure/host_processor_info_scanner.cc
@@ -0,0 +1,73 @@
+// Copyright 2022 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 "services/device/compute_pressure/host_processor_info_scanner.h"
+
+#include <mach/mach.h>
+#include <mach/mach_host.h>
+#include <stdint.h>
+
+#include "base/mac/mac_util.h"
+#include "base/mac/scoped_mach_port.h"
+#include "base/mac/scoped_mach_vm.h"
+#include "base/system/sys_info.h"
+#include "services/device/compute_pressure/core_times.h"
+
+namespace device {
+
+HostProcessorInfoScanner::HostProcessorInfoScanner() {
+  core_times_.reserve(base::SysInfo::NumberOfProcessors());
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+}
+
+HostProcessorInfoScanner::~HostProcessorInfoScanner() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+bool HostProcessorInfoScanner::Update() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (base::mac::GetCPUType() == base::mac::CPUType::kTranslatedIntel) {
+    // ARM-based macs are not supported because Rosetta's simulation is not
+    // complete. We will skip obtaining CPU usage information. See
+    // https://crbug.com/1138707#c42 for details.
+    return false;
+  }
+
+  natural_t number_of_processors;
+  base::mac::ScopedMachSendRight host(mach_host_self());
+  mach_msg_type_number_t type;
+  processor_cpu_load_info_data_t* cpu_infos;
+
+  if (host_processor_info(host.get(), PROCESSOR_CPU_LOAD_INFO,
+                          &number_of_processors,
+                          reinterpret_cast<processor_info_array_t*>(&cpu_infos),
+                          &type) != KERN_SUCCESS) {
+    return false;
+  }
+
+  base::mac::ScopedMachVM vm_owner(
+      reinterpret_cast<vm_address_t>(cpu_infos),
+      mach_vm_round_page(number_of_processors *
+                         sizeof(processor_cpu_load_info)));
+
+  for (natural_t i = 0; i < number_of_processors; ++i) {
+    DCHECK_GE(core_times_.size(), i);
+
+    if (core_times_.size() <= i) {
+      core_times_.resize(i + 1);
+      CoreTimes core_time;
+      core_times_[i] = std::move(core_time);
+    }
+
+    core_times_[i].times[0] = cpu_infos[i].cpu_ticks[CPU_STATE_USER];
+    core_times_[i].times[1] = cpu_infos[i].cpu_ticks[CPU_STATE_NICE];
+    core_times_[i].times[2] = cpu_infos[i].cpu_ticks[CPU_STATE_SYSTEM];
+    core_times_[i].times[3] = cpu_infos[i].cpu_ticks[CPU_STATE_IDLE];
+  }
+
+  return true;
+}
+
+}  // namespace device
diff --git a/services/device/compute_pressure/host_processor_info_scanner.h b/services/device/compute_pressure/host_processor_info_scanner.h
new file mode 100644
index 0000000..199e98f
--- /dev/null
+++ b/services/device/compute_pressure/host_processor_info_scanner.h
@@ -0,0 +1,45 @@
+// Copyright 2022 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 SERVICES_DEVICE_COMPUTE_PRESSURE_HOST_PROCESSOR_INFO_SCANNER_H_
+#define SERVICES_DEVICE_COMPUTE_PRESSURE_HOST_PROCESSOR_INFO_SCANNER_H_
+
+#include <vector>
+
+#include "base/sequence_checker.h"
+#include "base/thread_annotations.h"
+#include "services/device/compute_pressure/core_times.h"
+
+namespace device {
+
+// Parses CPU time usage stats from host_processor_info.
+//
+// This class is not thread-safe. Each instance must be used on the same
+// sequence, which must allow blocking I/O. The constructor may be used on a
+// different sequence.
+class HostProcessorInfoScanner {
+ public:
+  HostProcessorInfoScanner();
+  ~HostProcessorInfoScanner();
+
+  HostProcessorInfoScanner(const HostProcessorInfoScanner&) = delete;
+  HostProcessorInfoScanner& operator=(const HostProcessorInfoScanner&) = delete;
+
+  const std::vector<CoreTimes>& core_times() const {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+    return core_times_;
+  }
+
+  bool Update();
+
+ private:
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  std::vector<CoreTimes> core_times_ GUARDED_BY_CONTEXT(sequence_checker_);
+};
+
+}  // namespace device
+
+#endif  // SERVICES_DEVICE_COMPUTE_PRESSURE_HOST_PROCESSOR_INFO_SCANNER_H_
diff --git a/services/preferences/public/cpp/dictionary_value_update.cc b/services/preferences/public/cpp/dictionary_value_update.cc
index b4204dc..3e9aa7e 100644
--- a/services/preferences/public/cpp/dictionary_value_update.cc
+++ b/services/preferences/public/cpp/dictionary_value_update.cc
@@ -183,17 +183,6 @@
   return true;
 }
 
-bool DictionaryValueUpdate::GetList(base::StringPiece path,
-                                    const base::ListValue** out_value) const {
-  return base::as_const(value_)->GetList(path, out_value);
-}
-
-bool DictionaryValueUpdate::GetList(base::StringPiece path,
-                                    base::ListValue** out_value) {
-  RecordPath(path);
-  return value_->GetList(path, out_value);
-}
-
 bool DictionaryValueUpdate::GetBooleanWithoutPathExpansion(
     base::StringPiece key,
     bool* out_value) const {
diff --git a/services/preferences/public/cpp/dictionary_value_update.h b/services/preferences/public/cpp/dictionary_value_update.h
index e987b131..396ddb1 100644
--- a/services/preferences/public/cpp/dictionary_value_update.h
+++ b/services/preferences/public/cpp/dictionary_value_update.h
@@ -15,12 +15,6 @@
 #include "base/values.h"
 #include "services/preferences/public/cpp/scoped_pref_update.h"
 
-namespace base {
-class DictionaryValue;
-class ListValue;
-class Value;
-}  // namespace base
-
 namespace prefs {
 
 // A wrapper around base::DictionaryValue that reports changes to its contents
@@ -99,8 +93,6 @@
                      const base::DictionaryValue** out_value) const;
   bool GetDictionary(base::StringPiece path,
                      std::unique_ptr<DictionaryValueUpdate>* out_value);
-  bool GetList(base::StringPiece path, const base::ListValue** out_value) const;
-  bool GetList(base::StringPiece path, base::ListValue** out_value);
 
   // Like Get(), but without special treatment of '.'.  This allows e.g. URLs to
   // be used as paths.
diff --git a/testing/buildbot/chromium.accessibility.json b/testing/buildbot/chromium.accessibility.json
index f289945..4ce4648 100644
--- a/testing/buildbot/chromium.accessibility.json
+++ b/testing/buildbot/chromium.accessibility.json
@@ -9,6 +9,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=force-renderer-accessibility"
         ],
@@ -45,6 +46,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=force-renderer-accessibility"
         ],
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 964d632..2a6e823 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -9928,6 +9928,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--platform=fuchsia"
         ],
@@ -9964,6 +9965,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--platform=fuchsia"
         ],
@@ -23122,6 +23124,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -23158,6 +23161,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -26743,6 +26747,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -26780,6 +26785,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/chromium.devtools-frontend.json b/testing/buildbot/chromium.devtools-frontend.json
index dad87fb..cf249b18 100644
--- a/testing/buildbot/chromium.devtools-frontend.json
+++ b/testing/buildbot/chromium.devtools-frontend.json
@@ -29,6 +29,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -64,6 +65,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/chromium.fuchsia.json b/testing/buildbot/chromium.fuchsia.json
index 339303c..695656a3 100644
--- a/testing/buildbot/chromium.fuchsia.json
+++ b/testing/buildbot/chromium.fuchsia.json
@@ -2427,6 +2427,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--platform=fuchsia",
           "--jobs=1"
@@ -2464,6 +2465,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--platform=fuchsia",
           "--jobs=1"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 6381041..f0ec92b 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -5707,6 +5707,7 @@
           "--skipped=always",
           "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
           "--flag-specific=skia-vulkan-swiftshader",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -7239,6 +7240,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -7275,6 +7277,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -79630,6 +79633,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--debug"
         ],
@@ -79666,6 +79670,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--debug"
         ],
@@ -80428,6 +80433,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -80463,6 +80469,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -80503,6 +80510,7 @@
         "args": [
           "--flag-specific=highdpi",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -80538,6 +80546,7 @@
         "args": [
           "--flag-specific=highdpi",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -81299,6 +81308,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -81334,6 +81344,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -84713,6 +84724,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
@@ -84750,6 +84762,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
@@ -84924,6 +84937,7 @@
         "args": [
           "--flag-specific=highdpi",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -84960,6 +84974,7 @@
         "args": [
           "--flag-specific=highdpi",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -85019,6 +85034,7 @@
         "args": [
           "--flag-specific=disable-site-isolation-trials",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
@@ -85057,6 +85073,7 @@
         "args": [
           "--flag-specific=disable-site-isolation-trials",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -85198,6 +85215,7 @@
           "--skipped=always",
           "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
           "--flag-specific=skia-vulkan-swiftshader",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -94215,6 +94233,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -94252,6 +94271,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96432,6 +96452,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96470,6 +96491,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96512,6 +96534,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96548,6 +96571,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96588,6 +96612,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96627,6 +96652,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96670,6 +96696,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96707,6 +96734,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96748,6 +96776,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -96784,6 +96813,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -100656,6 +100686,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -100692,6 +100723,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 1d42f68..75c6d4f 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -3551,6 +3551,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
@@ -3589,6 +3590,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
@@ -3810,6 +3812,7 @@
         "args": [
           "--flag-specific=highdpi",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -3846,6 +3849,7 @@
         "args": [
           "--flag-specific=highdpi",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -3905,6 +3909,7 @@
         "args": [
           "--flag-specific=disable-site-isolation-trials",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-env-var=LLVM_PROFILE_FILE=${ISOLATED_OUTDIR}/profraw/default-%2m.profraw"
         ],
@@ -3944,6 +3949,7 @@
         "args": [
           "--flag-specific=disable-site-isolation-trials",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -4110,6 +4116,7 @@
           "--skipped=always",
           "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter",
           "--flag-specific=skia-vulkan-swiftshader",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -7568,6 +7575,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--debug"
         ],
@@ -7604,6 +7612,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--debug"
         ],
@@ -7706,6 +7715,7 @@
         "args": [
           "--flag-specific=disable-site-isolation-trials",
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -7983,6 +7993,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=enable-back-forward-cache-same-site"
         ],
@@ -8019,6 +8030,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=enable-back-forward-cache-same-site",
           "--ignore-tests=external/wpt/html/browsers/browsing-the-web/back-forward-cache/events.html"
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 8568ab7..33700cd 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -1478,6 +1478,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -1514,6 +1515,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -3267,6 +3269,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -3303,6 +3306,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -5064,6 +5068,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -5100,6 +5105,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -6937,6 +6943,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -6975,6 +6982,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -8854,6 +8862,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -8892,6 +8901,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -10688,6 +10698,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--debug"
         ],
@@ -10726,6 +10737,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--debug"
         ],
@@ -21881,6 +21893,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -21918,6 +21931,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -23704,6 +23718,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -23741,6 +23756,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 5ca9c3a..add1406 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -14226,6 +14226,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-expectations",
           "../../third_party/blink/web_tests/ASANExpectations",
@@ -14266,6 +14267,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-expectations",
           "../../third_party/blink/web_tests/ASANExpectations",
@@ -14313,6 +14315,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-expectations",
           "../../third_party/blink/web_tests/LeakExpectations",
@@ -14353,6 +14356,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-expectations",
           "../../third_party/blink/web_tests/LeakExpectations",
@@ -14397,6 +14401,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-expectations",
           "../../third_party/blink/web_tests/MSANExpectations",
@@ -14440,6 +14445,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--additional-expectations",
           "../../third_party/blink/web_tests/MSANExpectations",
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index d1d330e..a46b331 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -6,6 +6,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -41,6 +42,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -4114,6 +4116,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--target",
           "Release_x64"
@@ -4153,6 +4156,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--target",
           "Release_x64"
@@ -8512,6 +8516,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--target",
           "Release_x64"
@@ -8551,6 +8556,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--target",
           "Release_x64"
diff --git a/testing/buildbot/client.devtools-frontend.integration.json b/testing/buildbot/client.devtools-frontend.integration.json
index d1e628f2..fb30115 100644
--- a/testing/buildbot/client.devtools-frontend.integration.json
+++ b/testing/buildbot/client.devtools-frontend.integration.json
@@ -50,6 +50,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -85,6 +86,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -198,6 +200,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -233,6 +236,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index b78c6fc..58708fa 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -1468,6 +1468,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -1503,6 +1504,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -1565,6 +1567,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "-t",
           "Debug",
@@ -1603,6 +1606,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "-t",
           "Debug",
@@ -1668,6 +1672,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=future-js"
         ],
@@ -1704,6 +1709,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=future-js"
         ],
@@ -1768,6 +1774,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -1804,6 +1811,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -1847,6 +1855,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -1882,6 +1891,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index dbb84ff1..bd763c9 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -216,6 +216,13 @@
       },
     },
   },
+  'blink_tests_write_run_histories': {
+    '$mixin_append': {
+      'args': [
+        '--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json',
+      ],
+    },
+  },
   'bullhead': {
     'swarming': {
       'dimensions': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 06c9641..3863a03 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -1263,6 +1263,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
            # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1291,7 +1292,8 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
-           # TODO(crbug.com/1327314): Enable for blink web tests.
+          'blink_tests_write_run_histories',
+          # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
         ],
@@ -1337,6 +1339,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1368,6 +1371,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1398,6 +1402,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1425,6 +1430,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1648,6 +1654,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1675,6 +1682,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1768,6 +1776,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -1795,6 +1804,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -3917,6 +3927,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -3950,6 +3961,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
@@ -4796,6 +4808,7 @@
           'script': '//third_party/blink/tools/merge_web_test_results.py',
         },
         'mixins': [
+          'blink_tests_write_run_histories',
           # TODO(crbug.com/1327314): Enable for blink web tests.
           'disable_check_flakiness_web_tests',
           'skia_gold_test',
diff --git a/testing/buildbot/tryserver.blink.json b/testing/buildbot/tryserver.blink.json
index 72f1ce7..e674128 100644
--- a/testing/buildbot/tryserver.blink.json
+++ b/testing/buildbot/tryserver.blink.json
@@ -6,6 +6,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -42,6 +43,7 @@
         "args": [
           "--num-retries=3",
           "--step-name=blink-wpt-tests",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -102,6 +104,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -138,6 +141,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -178,6 +182,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -214,6 +219,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -254,6 +260,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--target",
           "Release_x64"
@@ -292,6 +299,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--target",
           "Release_x64"
diff --git a/testing/buildbot/tryserver.chromium.linux.json b/testing/buildbot/tryserver.chromium.linux.json
index 25ec78e..1da29a3 100644
--- a/testing/buildbot/tryserver.chromium.linux.json
+++ b/testing/buildbot/tryserver.chromium.linux.json
@@ -14,6 +14,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=enable-editing-ng"
         ],
@@ -50,6 +51,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=enable-editing-ng"
         ],
@@ -117,6 +119,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=disable-layout-ng"
         ],
@@ -154,6 +157,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "--flag-specific=disable-layout-ng"
         ],
diff --git a/testing/buildbot/tryserver.devtools-frontend.json b/testing/buildbot/tryserver.devtools-frontend.json
index b41a51a..a504114 100644
--- a/testing/buildbot/tryserver.devtools-frontend.json
+++ b/testing/buildbot/tryserver.devtools-frontend.json
@@ -29,6 +29,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "http/tests/devtools"
         ],
@@ -122,6 +123,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}",
           "http/tests/devtools"
         ],
@@ -192,6 +194,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -227,6 +230,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/testing/buildbot/tryserver.v8.json b/testing/buildbot/tryserver.v8.json
index f195932..ca73b391 100644
--- a/testing/buildbot/tryserver.v8.json
+++ b/testing/buildbot/tryserver.v8.json
@@ -6,6 +6,7 @@
       {
         "args": [
           "--num-retries=3",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
@@ -42,6 +43,7 @@
         "args": [
           "--num-retries=3",
           "--step-name=blink-wpt-tests",
+          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index 298a562..2b03b63 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -4181,8 +4181,11 @@
   # Requests database names for given security origin.
   command requestDatabaseNames
     parameters
+      # At least and at most one of securityOrigin, storageKey must be specified.
       # Security origin.
-      string securityOrigin
+      optional string securityOrigin
+      # Storage key.
+      optional string storageKey
     returns
       # Database names for origin.
       array of string databaseNames
diff --git a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h
index c9ef9df..7a69308 100644
--- a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h
+++ b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h
@@ -35,6 +35,7 @@
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-shared.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom-shared.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_fetch_handler_type.mojom-shared.h"
 #include "third_party/blink/public/platform/cross_variant_mojo_util.h"
 
 #include <memory>
@@ -72,7 +73,7 @@
   virtual bool IsWindowInteractionAllowed() = 0;
   virtual void PauseEvaluation() = 0;
   virtual void ResumeEvaluation() = 0;
-  virtual bool HasFetchHandler() = 0;
+  virtual mojom::ServiceWorkerFetchHandlerType FetchHandlerType() = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
index da6cb5a..b5aad95a 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
@@ -12,7 +12,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_code_cache.h"
 #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
 #include "third_party/blink/renderer/core/loader/resource/script_resource.h"
-#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
+#include "third_party/blink/renderer/platform/bindings/v8_binding.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/loader/fetch/cached_metadata.h"
 #include "third_party/blink/renderer/platform/loader/fetch/url_loader/cached_metadata_handler.h"
@@ -52,7 +52,7 @@
                                          WrapCrossThreadWeakPersistent(this)));
   } else {
     // If the consume task failed to be created, consider the consumption
-    // immediately completed. TakeConsumeTask will return nullptr, but this is
+    // immediately completed. TakeV8ConsumeTask will return nullptr, but this is
     // allowed.
     AdvanceState(State::kConsumeFinished);
   }
@@ -62,7 +62,9 @@
     State new_state_bit) {
   // We should only be setting a single state bit at a time.
   DCHECK(new_state_bit == State::kConsumeFinished ||
-         new_state_bit == State::kClientReady);
+         new_state_bit == State::kClientReady ||
+         new_state_bit == State::kMergeDoneOrNotNeededBit ||
+         new_state_bit == State::kCalledFinishCallbackBit);
 
   State state = state_.load(std::memory_order_relaxed);
   while (true) {
@@ -96,17 +98,46 @@
 
   State new_state = AdvanceState(State::kConsumeFinished);
   if (new_state == State::kFinishedAndReady) {
-    CHECK(finish_callback_task_runner_);
-    PostCrossThreadTask(
-        *finish_callback_task_runner_, FROM_HERE,
-        WTF::CrossThreadBindOnce(
-            &ScriptCacheConsumer::CallFinishCallback,
-            WrapCrossThreadWeakPersistent(this),
-            WTF::CrossThreadUnretained(
-                "v8.deserializeOnBackground.finishedAfterResource")));
+    finish_trace_name_ = "v8.deserializeOnBackground.finishedAfterResource";
+    if (consume_task_->ShouldMergeWithExistingScript()) {
+      RunMergeTaskOffThread();
+    } else {
+      AdvanceState(State::kMergeDoneOrNotNeededBit);
+      PostFinishCallbackTask();
+    }
   }
 }
 
+void ScriptCacheConsumer::PostFinishCallbackTask() {
+  DCHECK(!WTF::IsMainThread());
+  CHECK(finish_callback_task_runner_);
+  PostCrossThreadTask(
+      *finish_callback_task_runner_, FROM_HERE,
+      WTF::CrossThreadBindOnce(&ScriptCacheConsumer::CallFinishCallback,
+                               WrapCrossThreadWeakPersistent(this)));
+}
+
+void ScriptCacheConsumer::RunMergeTaskOffThread() {
+  DCHECK(!WTF::IsMainThread());
+  DCHECK_EQ(state_, State::kFinishedAndReady);
+
+  TRACE_EVENT_WITH_FLOW1(
+      "v8,devtools.timeline," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+      "v8.deserializeOnBackground.mergeWithExistingScript",
+      TRACE_ID_LOCAL(this),
+      TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "data",
+      [&](perfetto::TracedValue context) {
+        inspector_deserialize_script_event::Data(
+            std::move(context), script_resource_identifier_,
+            script_url_string_.IsolatedCopy());
+      });
+
+  consume_task_->MergeWithExistingScript();
+
+  AdvanceState(State::kMergeDoneOrNotNeededBit);
+  PostFinishCallbackTask();
+}
+
 void ScriptCacheConsumer::Trace(Visitor* visitor) const {
   visitor->Trace(finish_callback_client_);
 }
@@ -125,13 +156,43 @@
   CHECK(!finish_callback_task_runner_);
   finish_callback_task_runner_ = task_runner;
 
+  {
+    v8::Isolate* isolate = V8PerIsolateData::MainThreadIsolate();
+    v8::HandleScope scope(isolate);
+    const ParkableString& source_text = client->GetSourceText();
+    v8::ScriptOrigin origin = client->GetScriptOrigin();
+    if (consume_task_) {
+      consume_task_->SourceTextAvailable(
+          isolate, V8String(isolate, source_text), origin);
+    }
+  }
+
   State new_state = AdvanceState(State::kClientReady);
   if (new_state == State::kFinishedAndReady) {
-    CallFinishCallback("v8.deserializeOnBackground.finishedBeforeResource");
+    finish_trace_name_ = "v8.deserializeOnBackground.finishedBeforeResource";
+    if (consume_task_ && consume_task_->ShouldMergeWithExistingScript()) {
+      TRACE_EVENT_WITH_FLOW1(
+          "v8," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
+          "v8.deserializeOnBackground.startMergeWithExistingScript",
+          TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_OUT, "data",
+          [&](perfetto::TracedValue context) {
+            inspector_deserialize_script_event::Data(
+                std::move(context), script_resource_identifier_,
+                script_url_string_);
+          });
+
+      worker_pool::PostTask(
+          FROM_HERE,
+          WTF::CrossThreadBindOnce(&ScriptCacheConsumer::RunMergeTaskOffThread,
+                                   WrapCrossThreadWeakPersistent(this)));
+    } else {
+      AdvanceState(State::kMergeDoneOrNotNeededBit);
+      CallFinishCallback();
+    }
   }
 }
 
-void ScriptCacheConsumer::CallFinishCallback(const char* trace_name) {
+void ScriptCacheConsumer::CallFinishCallback() {
   DCHECK(WTF::IsMainThread());
 
   ScriptCacheConsumerClient* client = finish_callback_client_.Get();
@@ -141,7 +202,7 @@
     return;
 
   TRACE_EVENT_WITH_FLOW1("v8," TRACE_DISABLED_BY_DEFAULT("v8.compile"),
-                         trace_name, TRACE_ID_LOCAL(this),
+                         finish_trace_name_, TRACE_ID_LOCAL(this),
                          TRACE_EVENT_FLAG_FLOW_IN, "data",
                          [&](perfetto::TracedValue context) {
                            inspector_deserialize_script_event::Data(
@@ -149,11 +210,12 @@
                                script_url_string_);
                          });
 
-  CHECK_EQ(state_, State::kFinishedAndReady);
+  CHECK_EQ(state_, State::kMergeDoneOrNotNeeded);
   // Clear the task runner, we don't need it anymore since we've already made
   // our way to the main thread.
   finish_callback_task_runner_.reset();
   client->NotifyCacheConsumeFinished();
+  AdvanceState(State::kCalledFinishCallbackBit);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h
index c8e8ed75..5b03e52 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h
@@ -80,7 +80,7 @@
   // Also, may return nullptr if no consume task was ever created.
   v8::ScriptCompiler::ConsumeCodeCacheTask* TakeV8ConsumeTask(
       CachedMetadata* cached_metadata) {
-    CHECK_EQ(state_, kFinishedAndReady);
+    CHECK_EQ(state_, kCalledFinishCallback);
     if (cached_metadata != cached_metadata_) {
       consume_task_.reset();
       return nullptr;
@@ -103,14 +103,27 @@
   //                     '--------.---------'
   //     NotifyClientWaiting()    |     RunTaskOffThread()
   //                              v
-  //                        kBothFinished
+  //                      kFinishedAndReady
+  //                              |
+  //                              | RunTaskOffThread(), RunMergeTaskOffThread(),
+  //                              | or NotifyClientWaiting()
+  //                              v
+  //                    kMergeDoneOrNotNeeded
+  //                              |
+  //                              | CallFinishCallback()
+  //                              v
+  //                    kCalledFinishCallback
   //
   // These states are represented as a bit field.
   enum State {
     kRunning = 0,
     kConsumeFinished = 0b10,
     kClientReady = 0b01,
-    kFinishedAndReady = 0b11
+    kFinishedAndReady = 0b11,
+    kMergeDoneOrNotNeededBit = 0b100,
+    kMergeDoneOrNotNeeded = kFinishedAndReady | kMergeDoneOrNotNeededBit,
+    kCalledFinishCallbackBit = 0b1000,
+    kCalledFinishCallback = kMergeDoneOrNotNeeded | kCalledFinishCallbackBit,
   };
   static_assert(
       (kConsumeFinished & kClientReady) == 0,
@@ -119,15 +132,15 @@
       (kConsumeFinished | kClientReady) == kFinishedAndReady,
       "kFinishedAndReady has to mean kConsumeFinished and kClientReady");
 
-  // Advance the state with either the kConsumeFinished or the kClientReady
-  // bit. Returns the new state, which is either the given state or
-  // kFinishedAndReady.
+  // Advance the state by setting a single bit. Returns the new state.
   State AdvanceState(State new_state_bit);
 
   // Helper methods for running the consume task off-thread and posting back
   // from it.
   void RunTaskOffThread();
-  void CallFinishCallback(const char* trace_name);
+  void RunMergeTaskOffThread();
+  void PostFinishCallbackTask();
+  void CallFinishCallback();
 
   // The cached metadata storing the code cache. This is held by the consumer
   // to keep the cached data alive even if it is cleared on the script resource.
@@ -151,6 +164,8 @@
   // Keep the script resource dentifier for event tracing.
   const uint64_t script_resource_identifier_;
 
+  const char* finish_trace_name_ = nullptr;
+
   // The state of this ScriptCacheConsumer, advanced atomically when this
   // consume task completes, and when the resource completes.
   std::atomic<State> state_;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer_client.h b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer_client.h
index 493b4bb..3e1bb8e 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer_client.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer_client.h
@@ -5,7 +5,9 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_SCRIPT_CACHE_CONSUMER_CLIENT_H_
 #define THIRD_PARTY_BLINK_RENDERER_BINDINGS_CORE_V8_SCRIPT_CACHE_CONSUMER_CLIENT_H_
 
+#include "third_party/blink/renderer/platform/bindings/parkable_string.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
+#include "v8/include/v8-script.h"
 
 namespace blink {
 
@@ -14,6 +16,8 @@
 class ScriptCacheConsumerClient : public GarbageCollectedMixin {
  public:
   virtual void NotifyCacheConsumeFinished() = 0;
+  virtual const ParkableString& GetSourceText() = 0;
+  virtual v8::ScriptOrigin GetScriptOrigin() = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_script_runner_test.cc b/third_party/blink/renderer/bindings/core/v8/v8_script_runner_test.cc
index fc869c0..39fb116f 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_script_runner_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_script_runner_test.cc
@@ -626,19 +626,28 @@
     : public GarbageCollected<StubScriptCacheConsumerClient>,
       public ScriptCacheConsumerClient {
  public:
-  explicit StubScriptCacheConsumerClient(base::OnceClosure finish_closure)
-      : finish_closure_(std::move(finish_closure)) {}
+  StubScriptCacheConsumerClient(base::OnceClosure finish_closure,
+                                v8::Isolate* isolate)
+      : finish_closure_(std::move(finish_closure)), isolate_(isolate) {}
 
   void NotifyCacheConsumeFinished() override {
     cache_consume_finished_ = true;
     std::move(finish_closure_).Run();
   }
 
+  const ParkableString& GetSourceText() override { return source_text_; }
+
+  v8::ScriptOrigin GetScriptOrigin() override {
+    return v8::ScriptOrigin(isolate_, V8String(isolate_, ""));
+  }
+
   bool cache_consume_finished() { return cache_consume_finished_; }
 
  private:
   base::OnceClosure finish_closure_;
   bool cache_consume_finished_ = false;
+  ParkableString source_text_;
+  v8::Isolate* isolate_;
 };
 
 }  // namespace
@@ -660,7 +669,7 @@
   EXPECT_NE(cache_consumer, nullptr);
 
   auto* consumer_client = MakeGarbageCollected<StubScriptCacheConsumerClient>(
-      run_loop_.QuitClosure());
+      run_loop_.QuitClosure(), scope.GetIsolate());
   cache_consumer->NotifyClientWaiting(consumer_client,
                                       base::ThreadTaskRunnerHandle::Get());
 
@@ -708,7 +717,7 @@
   EXPECT_NE(cache_consumer, nullptr);
 
   auto* consumer_client = MakeGarbageCollected<StubScriptCacheConsumerClient>(
-      run_loop_.QuitClosure());
+      run_loop_.QuitClosure(), scope.GetIsolate());
   cache_consumer->NotifyClientWaiting(consumer_client,
                                       base::ThreadTaskRunnerHandle::Get());
 
@@ -762,7 +771,7 @@
   EXPECT_NE(cache_consumer, nullptr);
 
   auto* consumer_client = MakeGarbageCollected<StubScriptCacheConsumerClient>(
-      run_loop_.QuitClosure());
+      run_loop_.QuitClosure(), scope.GetIsolate());
   cache_consumer->NotifyClientWaiting(consumer_client,
                                       base::ThreadTaskRunnerHandle::Get());
 
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index 21334606..cbc5740b 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -139,10 +139,12 @@
                                   AtomicString& class_name,
                                   AtomicString& attr_name,
                                   AtomicString& attr_value,
+                                  bool& is_exact_attr,
                                   AtomicString& custom_pseudo_element_name,
                                   AtomicString& tag_name,
                                   AtomicString& part_name,
                                   CSSSelector::PseudoType& pseudo_type) {
+  is_exact_attr = false;
   switch (selector->Match()) {
     case CSSSelector::kId:
       id = selector->Value();
@@ -191,9 +193,10 @@
           // like a normal selector (save for specificity), and we can put it
           // into a bucket based on that selector.
           if (selector_list->HasOneSelector()) {
-            ExtractSelectorValues(
-                selector_list->First(), id, class_name, attr_name, attr_value,
-                custom_pseudo_element_name, tag_name, part_name, pseudo_type);
+            ExtractSelectorValues(selector_list->First(), id, class_name,
+                                  attr_name, attr_value, is_exact_attr,
+                                  custom_pseudo_element_name, tag_name,
+                                  part_name, pseudo_type);
           }
         } break;
         default:
@@ -201,6 +204,8 @@
       }
       break;
     case CSSSelector::kAttributeExact:
+      is_exact_attr = true;
+      [[fallthrough]];
     case CSSSelector::kAttributeSet:
     case CSSSelector::kAttributeHyphen:
     case CSSSelector::kAttributeList:
@@ -225,6 +230,7 @@
     AtomicString& class_name,
     AtomicString& attr_name,
     AtomicString& attr_value,
+    bool& is_exact_attr,
     AtomicString& custom_pseudo_element_name,
     AtomicString& tag_name,
     AtomicString& part_name,
@@ -233,13 +239,13 @@
   for (; it && it->Relation() == CSSSelector::kSubSelector;
        it = it->TagHistory()) {
     ExtractSelectorValues(it, id, class_name, attr_name, attr_value,
-                          custom_pseudo_element_name, tag_name, part_name,
-                          pseudo_type);
+                          is_exact_attr, custom_pseudo_element_name, tag_name,
+                          part_name, pseudo_type);
   }
   if (it) {
     ExtractSelectorValues(it, id, class_name, attr_name, attr_value,
-                          custom_pseudo_element_name, tag_name, part_name,
-                          pseudo_type);
+                          is_exact_attr, custom_pseudo_element_name, tag_name,
+                          part_name, pseudo_type);
   }
   return it;
 }
@@ -259,8 +265,9 @@
   all_rules_.push_back(rule_data);
 #endif
 
+  bool is_exact_attr;
   const CSSSelector* it = ExtractBestSelectorValues(
-      component, id, class_name, attr_name, attr_value,
+      component, id, class_name, attr_name, attr_value, is_exact_attr,
       custom_pseudo_element_name, tag_name, part_name, pseudo_type);
 
   // Prefer rule sets in order of most likely to apply infrequently.
@@ -688,17 +695,27 @@
       AtomicString custom_pseudo_element_name;
       AtomicString tag_name;
       AtomicString part_name;
+      bool is_exact_attr;
       CSSSelector::PseudoType pseudo_type = CSSSelector::kPseudoUnknown;
-      ExtractBestSelectorValues(rule.Selector(), id, class_name, attr_name,
-                                attr_value, custom_pseudo_element_name,
-                                tag_name, part_name, pseudo_type);
+      ExtractBestSelectorValues(
+          rule.Selector(), id, class_name, attr_name, attr_value, is_exact_attr,
+          custom_pseudo_element_name, tag_name, part_name, pseudo_type);
       DCHECK(!attr_name.IsEmpty());
 
       if (attr_value.IsEmpty()) {
-        // The empty string would make the entire tree useless (it is
-        // a substring of every possible value), so as a special case,
-        // we ignore it, and have a separate check in CanIgnoreEntireList().
-        continue;
+        if (is_exact_attr) {
+          // The empty string would make the entire tree useless
+          // (it is a substring of every possible value),
+          // so as a special case, we ignore it, and have a separate
+          // check in CanIgnoreEntireList().
+          continue;
+        } else {
+          // This rule would indeed match every element containing the
+          // given attribute (e.g. [foo] or [foo^=""]), so building a tree
+          // would be wrong.
+          patterns.clear();
+          break;
+        }
       }
 
       std::string pattern = attr_value.LowerASCII().Utf8();
@@ -716,6 +733,10 @@
       ++rule_index;
     }
 
+    if (patterns.empty()) {
+      continue;
+    }
+
     auto substring_matcher = std::make_unique<SubstringSetMatcher>();
     if (!substring_matcher->Build(patterns)) {
       // Should never really happen unless there are megabytes and megabytes
diff --git a/third_party/blink/renderer/core/css/rule_set_test.cc b/third_party/blink/renderer/core/css/rule_set_test.cc
index e42b5377..3959c18 100644
--- a/third_party/blink/renderer/core/css/rule_set_test.cc
+++ b/third_party/blink/renderer/core/css/rule_set_test.cc
@@ -329,15 +329,13 @@
   ASSERT_EQ(1u, rules->size());
 }
 
-TEST(RuleSetTest, LargeNumberOfAttributeRules) {
-  base::test::ScopedFeatureList feature_list;
+static void AddManyAttributeRules(base::test::ScopedFeatureList& feature_list,
+                                  css_test_helpers::TestStyleSheet& sheet) {
   feature_list.InitWithFeatures(
       /*enabled_features=*/{blink::features::
                                 kSubstringSetTreeForAttributeBuckets},
       /*disabled_features=*/{});
 
-  css_test_helpers::TestStyleSheet sheet;
-
   // Create more than 50 rules, in order to trigger building the Aho-Corasick
   // tree.
   for (int i = 0; i < 100; ++i) {
@@ -345,6 +343,13 @@
     snprintf(buf, sizeof(buf), "[attr=\"value%d\"] {}", i);
     sheet.AddCSSRules(buf);
   }
+}
+
+TEST(RuleSetTest, LargeNumberOfAttributeRules) {
+  base::test::ScopedFeatureList feature_list;
+  css_test_helpers::TestStyleSheet sheet;
+  AddManyAttributeRules(feature_list, sheet);
+
   sheet.AddCSSRules("[otherattr=\"value\"] {}");
 
   RuleSet& rule_set = sheet.GetRuleSet();
@@ -367,20 +372,9 @@
 
 TEST(RuleSetTest, LargeNumberOfAttributeRulesWithEmpty) {
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures(
-      /*enabled_features=*/{blink::features::
-                                kSubstringSetTreeForAttributeBuckets},
-      /*disabled_features=*/{});
-
   css_test_helpers::TestStyleSheet sheet;
+  AddManyAttributeRules(feature_list, sheet);
 
-  // Create more than 50 rules, in order to trigger building the Aho-Corasick
-  // tree.
-  for (int i = 0; i < 100; ++i) {
-    char buf[256];
-    snprintf(buf, sizeof(buf), "[attr=\"value%d\"] {}", i);
-    sheet.AddCSSRules(buf);
-  }
   sheet.AddCSSRules("[attr=\"\"] {}");
 
   RuleSet& rule_set = sheet.GetRuleSet();
@@ -390,6 +384,38 @@
   EXPECT_FALSE(rule_set.CanIgnoreEntireList(list, "attr", ""));
 }
 
+TEST(RuleSetTest, LargeNumberOfAttributeRulesWithCatchAll) {
+  base::test::ScopedFeatureList feature_list;
+  css_test_helpers::TestStyleSheet sheet;
+  AddManyAttributeRules(feature_list, sheet);
+
+  // This should match everything, so we cannot reject anything.
+  sheet.AddCSSRules("[attr] {}");
+
+  RuleSet& rule_set = sheet.GetRuleSet();
+
+  const HeapVector<RuleData>* list = rule_set.AttrRules("attr");
+  ASSERT_NE(nullptr, list);
+  EXPECT_FALSE(rule_set.CanIgnoreEntireList(list, "attr", "notfound"));
+  EXPECT_FALSE(rule_set.CanIgnoreEntireList(list, "attr", ""));
+}
+
+TEST(RuleSetTest, LargeNumberOfAttributeRulesWithCatchAll2) {
+  base::test::ScopedFeatureList feature_list;
+  css_test_helpers::TestStyleSheet sheet;
+  AddManyAttributeRules(feature_list, sheet);
+
+  // This should _also_ match everything, so we cannot reject anything.
+  sheet.AddCSSRules("[attr^=\"\"] {}");
+
+  RuleSet& rule_set = sheet.GetRuleSet();
+
+  const HeapVector<RuleData>* list = rule_set.AttrRules("attr");
+  ASSERT_NE(nullptr, list);
+  EXPECT_FALSE(rule_set.CanIgnoreEntireList(list, "attr", "notfound"));
+  EXPECT_FALSE(rule_set.CanIgnoreEntireList(list, "attr", ""));
+}
+
 TEST(RuleSetTest, SelectorIndexLimit) {
   // It's not feasible to run this test for a large number of bits. If the
   // number of bits have increased to a large number, consider removing this
diff --git a/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc b/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
index e321066e..9a44f43 100644
--- a/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
+++ b/third_party/blink/renderer/core/editing/caret_display_item_client_test.cc
@@ -516,24 +516,6 @@
   EXPECT_EQ(PhysicalRect(70, 0, 1, 10), CaretLocalRect());
 }
 
-// http://crbug.com/1330093
-TEST_P(CaretDisplayItemClientTest, CaretAtStartInWhiteSpacePreWrapRTL) {
-  LoadNoto();
-  SetBodyInnerHTML(
-      "<style>"
-      "  body { margin: 0; padding: 0; }"
-      "  div { white-space: pre-wrap; width: 90px; margin: 0; padding: 5px; "
-      "  font: 20px NotoArabic }"
-      "</style>"
-      "<div dir=rtl contenteditable>&#1575;&#1582;&#1578;&#1576;&#1585; "
-      "</div>");
-
-  const Element& div = *GetDocument().QuerySelector("div");
-  const Position& position = Position::FirstPositionInNode(div);
-  const PhysicalRect& rect = ComputeCaretRect(PositionWithAffinity(position));
-  EXPECT_EQ(94, rect.X());
-}
-
 class ParameterizedComputeCaretRectTest
     : public EditingTestBase,
       private ScopedLayoutNGForTest,
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni
index b61682e..225ecaef 100644
--- a/third_party/blink/renderer/core/html/build.gni
+++ b/third_party/blink/renderer/core/html/build.gni
@@ -260,6 +260,7 @@
   "forms/validity_state.h",
   "forms/week_input_type.cc",
   "forms/week_input_type.h",
+  "frame_edge_info.h",
   "html_all_collection.cc",
   "html_all_collection.h",
   "html_anchor_element.cc",
diff --git a/third_party/blink/renderer/core/html/frame_edge_info.h b/third_party/blink/renderer/core/html/frame_edge_info.h
new file mode 100644
index 0000000..72ba41b
--- /dev/null
+++ b/third_party/blink/renderer/core/html/frame_edge_info.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
+ *           (C) 2000 Simon Hausmann <hausmann@kde.org>
+ * Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FRAME_EDGE_INFO_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FRAME_EDGE_INFO_H_
+
+#include "third_party/blink/renderer/platform/wtf/vector.h"
+
+namespace blink {
+
+enum FrameEdge {
+  kLeftFrameEdge = 0,
+  kRightFrameEdge,
+  kTopFrameEdge,
+  kBottomFrameEdge,
+};
+constexpr size_t kFrameEdgeCount = kBottomFrameEdge + 1;
+
+// Represents border and resize capability of a <frame> or a <frameset>.
+class FrameEdgeInfo {
+  STACK_ALLOCATED();
+
+ public:
+  FrameEdgeInfo(bool prevent_resize, bool allow_border)
+      : prevent_resize_(kFrameEdgeCount), allow_border_(kFrameEdgeCount) {
+    prevent_resize_.Fill(prevent_resize);
+    allow_border_.Fill(allow_border);
+  }
+
+  bool PreventResize(FrameEdge edge) const { return prevent_resize_[edge]; }
+  bool AllowBorder(FrameEdge edge) const { return allow_border_[edge]; }
+
+  void SetPreventResize(FrameEdge edge, bool prevent_resize) {
+    prevent_resize_[edge] = prevent_resize;
+  }
+  void SetAllowBorder(FrameEdge edge, bool allow_border) {
+    allow_border_[edge] = allow_border;
+  }
+
+ private:
+  Vector<bool> prevent_resize_;
+  Vector<bool> allow_border_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_FRAME_EDGE_INFO_H_
diff --git a/third_party/blink/renderer/core/html/html_frame_element.cc b/third_party/blink/renderer/core/html/html_frame_element.cc
index 848a50f..724c5550 100644
--- a/third_party/blink/renderer/core/html/html_frame_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_element.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom-blink.h"
 #include "third_party/blink/public/mojom/permissions_policy/policy_value.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/dom/element_traversal.h"
+#include "third_party/blink/renderer/core/html/frame_edge_info.h"
 #include "third_party/blink/renderer/core/html/html_frame_set_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/layout/layout_frame.h"
@@ -53,6 +54,10 @@
   return FastHasAttribute(html_names::kNoresizeAttr);
 }
 
+FrameEdgeInfo HTMLFrameElement::EdgeInfo() const {
+  return FrameEdgeInfo(NoResize(), HasFrameBorder());
+}
+
 void HTMLFrameElement::AttachLayoutTree(AttachContext& context) {
   HTMLFrameElementBase::AttachLayoutTree(context);
 
diff --git a/third_party/blink/renderer/core/html/html_frame_element.h b/third_party/blink/renderer/core/html/html_frame_element.h
index f63b80e1..2acfd563 100644
--- a/third_party/blink/renderer/core/html/html_frame_element.h
+++ b/third_party/blink/renderer/core/html/html_frame_element.h
@@ -30,6 +30,8 @@
 
 namespace blink {
 
+class FrameEdgeInfo;
+
 class CORE_EXPORT HTMLFrameElement final : public HTMLFrameElementBase {
   DEFINE_WRAPPERTYPEINFO();
 
@@ -37,8 +39,8 @@
   explicit HTMLFrameElement(Document&);
 
   bool HasFrameBorder() const { return frame_border_; }
-
   bool NoResize() const;
+  FrameEdgeInfo EdgeInfo() const;
 
   ParsedPermissionsPolicy ConstructContainerPolicy() const override;
 
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index 67f79dd..d6159549 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -316,21 +316,16 @@
 }
 
 const base::TimeDelta GetLazyEmbedsTimeoutMs() {
-  if (!base::FeatureList::IsEnabled(
-          features::kAutomaticLazyFrameLoadingToEmbeds)) {
-    return base::Milliseconds(
-        features::kTimeoutMillisForLazyEmbeds.default_value);
-  }
-
+  DCHECK(base::FeatureList::IsEnabled(
+      features::kAutomaticLazyFrameLoadingToEmbeds));
   static const base::TimeDelta timeout_ms =
       base::Milliseconds(features::kTimeoutMillisForLazyEmbeds.Get());
   return timeout_ms;
 }
 
 const base::TimeDelta GetLazyAdsTimeoutMs() {
-  if (!base::FeatureList::IsEnabled(features::kAutomaticLazyFrameLoadingToAds))
-    return base::Milliseconds(features::kTimeoutMillisForLazyAds.default_value);
-
+  DCHECK(
+      base::FeatureList::IsEnabled(features::kAutomaticLazyFrameLoadingToAds));
   static const base::TimeDelta timeout_ms =
       base::Milliseconds(features::kTimeoutMillisForLazyAds.Get());
   return timeout_ms;
diff --git a/third_party/blink/renderer/core/html/html_frame_set_element.cc b/third_party/blink/renderer/core/html/html_frame_set_element.cc
index 4af639d..f681be48e9 100644
--- a/third_party/blink/renderer/core/html/html_frame_set_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_set_element.cc
@@ -31,6 +31,7 @@
 #include "third_party/blink/renderer/core/events/mouse_event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/local_frame_client.h"
+#include "third_party/blink/renderer/core/html/frame_edge_info.h"
 #include "third_party/blink/renderer/core/html/html_collection.h"
 #include "third_party/blink/renderer/core/html/html_frame_element.h"
 #include "third_party/blink/renderer/core/html_names.h"
@@ -78,20 +79,16 @@
       row_lengths_ = ParseListOfDimensions(value.GetString());
       SetNeedsStyleRecalc(kSubtreeStyleChange,
                           StyleChangeReasonForTracing::FromAttribute(name));
-      if (GetLayoutObject() && TotalRows() != resize_rows_.deltas_.size()) {
-        resize_rows_.Resize(TotalRows());
-        resize_cols_.Resize(TotalCols());
-      }
+      if (GetLayoutObject() && TotalRows() != resize_rows_.deltas_.size())
+        ResizeChildrenData();
     }
   } else if (name == html_names::kColsAttr) {
     if (!value.IsNull()) {
       col_lengths_ = ParseListOfDimensions(value.GetString());
       SetNeedsStyleRecalc(kSubtreeStyleChange,
                           StyleChangeReasonForTracing::FromAttribute(name));
-      if (GetLayoutObject() && TotalCols() != resize_cols_.deltas_.size()) {
-        resize_rows_.Resize(TotalRows());
-        resize_cols_.Resize(TotalCols());
-      }
+      if (GetLayoutObject() && TotalCols() != resize_cols_.deltas_.size())
+        ResizeChildrenData();
     }
   } else if (name == html_names::kFrameborderAttr) {
     if (!value.IsNull()) {
@@ -233,6 +230,74 @@
   }
 }
 
+FrameEdgeInfo HTMLFrameSetElement::EdgeInfo() const {
+  FrameEdgeInfo result(NoResize(), true);
+
+  wtf_size_t rows_count = TotalRows();
+  wtf_size_t cols_count = TotalCols();
+  DCHECK_GT(rows_count, 0u);
+  DCHECK_GT(cols_count, 0u);
+  result.SetPreventResize(kLeftFrameEdge, resize_cols_.prevent_resize_[0]);
+  result.SetAllowBorder(kLeftFrameEdge, allow_border_cols_[0]);
+  result.SetPreventResize(kRightFrameEdge,
+                          resize_cols_.prevent_resize_[cols_count]);
+  result.SetAllowBorder(kRightFrameEdge, allow_border_cols_[cols_count]);
+  result.SetPreventResize(kTopFrameEdge, resize_rows_.prevent_resize_[0]);
+  result.SetAllowBorder(kTopFrameEdge, allow_border_rows_[0]);
+  result.SetPreventResize(kBottomFrameEdge,
+                          resize_rows_.prevent_resize_[rows_count]);
+  result.SetAllowBorder(kBottomFrameEdge, allow_border_rows_[rows_count]);
+  return result;
+}
+
+void HTMLFrameSetElement::FillFromEdgeInfo(const FrameEdgeInfo& edge_info,
+                                           wtf_size_t r,
+                                           wtf_size_t c) {
+  if (edge_info.AllowBorder(kLeftFrameEdge))
+    allow_border_cols_[c] = true;
+  if (edge_info.AllowBorder(kRightFrameEdge))
+    allow_border_cols_[c + 1] = true;
+  if (edge_info.PreventResize(kLeftFrameEdge))
+    resize_cols_.prevent_resize_[c] = true;
+  if (edge_info.PreventResize(kRightFrameEdge))
+    resize_cols_.prevent_resize_[c + 1] = true;
+
+  if (edge_info.AllowBorder(kTopFrameEdge))
+    allow_border_rows_[r] = true;
+  if (edge_info.AllowBorder(kBottomFrameEdge))
+    allow_border_rows_[r + 1] = true;
+  if (edge_info.PreventResize(kTopFrameEdge))
+    resize_rows_.prevent_resize_[r] = true;
+  if (edge_info.PreventResize(kBottomFrameEdge))
+    resize_rows_.prevent_resize_[r + 1] = true;
+}
+
+void HTMLFrameSetElement::CollectEdgeInfo() {
+  resize_cols_.prevent_resize_.Fill(NoResize());
+  allow_border_cols_.Fill(false);
+  resize_rows_.prevent_resize_.Fill(NoResize());
+  allow_border_rows_.Fill(false);
+
+  LayoutObject* child = GetLayoutObject()->SlowFirstChild();
+  if (!child)
+    return;
+
+  wtf_size_t rows_count = TotalRows();
+  wtf_size_t cols_count = TotalCols();
+  for (wtf_size_t r = 0; r < rows_count; ++r) {
+    for (wtf_size_t c = 0; c < cols_count; ++c) {
+      const auto* node = child->GetNode();
+      if (const auto* frame_set = DynamicTo<HTMLFrameSetElement>(node))
+        FillFromEdgeInfo(frame_set->EdgeInfo(), r, c);
+      else
+        FillFromEdgeInfo(To<HTMLFrameElement>(node)->EdgeInfo(), r, c);
+      child = child->NextSibling();
+      if (!child)
+        return;
+    }
+  }
+}
+
 bool HTMLFrameSetElement::LayoutObjectIsNeeded(
     const ComputedStyle& style) const {
   // For compatibility, frames layoutObject even when display: none is set.
@@ -266,8 +331,7 @@
 
   HTMLElement::AttachLayoutTree(context);
   is_resizing_ = false;
-  resize_rows_.Resize(TotalRows());
-  resize_cols_.Resize(TotalCols());
+  ResizeChildrenData();
 }
 
 void HTMLFrameSetElement::DefaultEventHandler(Event& evt) {
@@ -346,7 +410,7 @@
                                         int position,
                                         ResizeAxis& resize_axis) {
   int split = HitTestSplit(axis, position);
-  if (!axis.CanResizeSplitAt(split)) {
+  if (!resize_axis.CanResizeSplitAt(split)) {
     resize_axis.split_being_resized_ = ResizeAxis::kNoSplit;
     return;
   }
@@ -391,15 +455,13 @@
 }
 
 bool HTMLFrameSetElement::CanResizeRow(const gfx::Point& p) const {
-  const LayoutFrameSet::GridAxis& axis =
-      To<LayoutFrameSet>(GetLayoutObject())->rows_;
-  return axis.CanResizeSplitAt(HitTestSplit(axis, p.y()));
+  return resize_rows_.CanResizeSplitAt(
+      HitTestSplit(To<LayoutFrameSet>(GetLayoutObject())->Rows(), p.y()));
 }
 
 bool HTMLFrameSetElement::CanResizeColumn(const gfx::Point& p) const {
-  const LayoutFrameSet::GridAxis& axis =
-      To<LayoutFrameSet>(GetLayoutObject())->cols_;
-  return axis.CanResizeSplitAt(HitTestSplit(axis, p.y()));
+  return resize_cols_.CanResizeSplitAt(
+      HitTestSplit(To<LayoutFrameSet>(GetLayoutObject())->Columns(), p.x()));
 }
 
 int HTMLFrameSetElement::HitTestSplit(const LayoutFrameSet::GridAxis& axis,
@@ -425,10 +487,33 @@
   return ResizeAxis::kNoSplit;
 }
 
+void HTMLFrameSetElement::ResizeChildrenData() {
+  resize_rows_.Resize(TotalRows());
+  resize_cols_.Resize(TotalCols());
+
+  // To track edges for borders, we need to be (size + 1). This is because a
+  // parent frameset may ask us for information about our left/top/right/bottom
+  // edges in order to make its own decisions about what to do. We are capable
+  // of tainting that parent frameset's borders, so we have to cache this info.
+  allow_border_rows_.resize(TotalRows() + 1);
+  allow_border_cols_.resize(TotalCols() + 1);
+}
+
 void HTMLFrameSetElement::ResizeAxis::Resize(wtf_size_t number_of_frames) {
   deltas_.resize(number_of_frames);
   deltas_.Fill(0);
   split_being_resized_ = kNoSplit;
+
+  // To track edges for resizability, we need to be (size + 1). This is because
+  // a parent frameset may ask us for information about our left/top/right/
+  // bottom edges in order to make its own decisions about what to do. We are
+  // capable of tainting that parent frameset's borders, so we have to cache
+  // this info.
+  prevent_resize_.resize(number_of_frames + 1);
+}
+
+bool HTMLFrameSetElement::ResizeAxis::CanResizeSplitAt(int split_index) const {
+  return split_index != kNoSplit && !prevent_resize_[split_index];
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_frame_set_element.h b/third_party/blink/renderer/core/html/html_frame_set_element.h
index b34f378..ccdee37 100644
--- a/third_party/blink/renderer/core/html/html_frame_set_element.h
+++ b/third_party/blink/renderer/core/html/html_frame_set_element.h
@@ -32,6 +32,7 @@
 
 namespace blink {
 
+class FrameEdgeInfo;
 class MouseEvent;
 
 class HTMLFrameSetElement final : public HTMLElement {
@@ -53,6 +54,8 @@
     return std::max<wtf_size_t>(1, col_lengths_.size());
   }
   int Border() const { return HasFrameBorder() ? border_ : 0; }
+  FrameEdgeInfo EdgeInfo() const;
+  void CollectEdgeInfo();
 
   bool HasBorderColor() const { return border_color_set_; }
 
@@ -60,6 +63,8 @@
   const Vector<HTMLDimension>& ColLengths() const { return col_lengths_; }
   const Vector<int>& RowDeltas() const { return resize_rows_.deltas_; }
   const Vector<int>& ColDeltas() const { return resize_cols_.deltas_; }
+  const Vector<bool>& AllowBorderRows() const { return allow_border_rows_; }
+  const Vector<bool>& AllowBorderColumns() const { return allow_border_cols_; }
 
   bool HasNonInBodyInsertionMode() const override { return true; }
 
@@ -91,6 +96,8 @@
   InsertionNotificationRequest InsertedInto(ContainerNode&) override;
   void WillRecalcStyle(const StyleRecalcChange) override;
 
+  void ResizeChildrenData();
+
   class ResizeAxis {
     DISALLOW_NEW();
 
@@ -102,10 +109,13 @@
     void Resize(wtf_size_t number_of_frames);
     // Returns true if a split is being resized now.
     bool IsResizingSplit() const { return split_being_resized_ != kNoSplit; }
+    // Returns true if a split is being resized now.
+    bool CanResizeSplitAt(int split_index) const;
 
     static constexpr int kNoSplit = -1;
 
     Vector<int> deltas_;
+    Vector<bool> prevent_resize_;
     int split_being_resized_ = kNoSplit;
     int split_resize_offset_;
   };
@@ -121,10 +131,16 @@
   int SplitPosition(const LayoutFrameSet::GridAxis& axis, int split) const;
   int HitTestSplit(const LayoutFrameSet::GridAxis& axis, int position) const;
 
+  void FillFromEdgeInfo(const FrameEdgeInfo& edge_info,
+                        wtf_size_t r,
+                        wtf_size_t c);
+
   Vector<HTMLDimension> row_lengths_;
   Vector<HTMLDimension> col_lengths_;
   ResizeAxis resize_rows_;
   ResizeAxis resize_cols_;
+  Vector<bool> allow_border_rows_;
+  Vector<bool> allow_border_cols_;
 
   int border_;
   bool border_set_;
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni
index abd6416..425d05a 100644
--- a/third_party/blink/renderer/core/layout/build.gni
+++ b/third_party/blink/renderer/core/layout/build.gni
@@ -843,6 +843,7 @@
   "layout_box_test.cc",
   "layout_embedded_content_test.cc",
   "layout_flexible_box_test.cc",
+  "layout_frame_set_test.cc",
   "layout_image_test.cc",
   "layout_image_resource_test.cc",
   "layout_inline_test.cc",
diff --git a/third_party/blink/renderer/core/layout/layout_frame.cc b/third_party/blink/renderer/core/layout/layout_frame.cc
index f96064f..e8b15be8 100644
--- a/third_party/blink/renderer/core/layout/layout_frame.cc
+++ b/third_party/blink/renderer/core/layout/layout_frame.cc
@@ -36,12 +36,6 @@
   SetInline(false);
 }
 
-FrameEdgeInfo LayoutFrame::EdgeInfo() const {
-  NOT_DESTROYED();
-  auto* element = To<HTMLFrameElement>(GetNode());
-  return FrameEdgeInfo(element->NoResize(), element->HasFrameBorder());
-}
-
 void LayoutFrame::ImageChanged(WrappedImagePtr image, CanDeferInvalidation) {
   NOT_DESTROYED();
   if (const CursorList* cursors = StyleRef().Cursors()) {
diff --git a/third_party/blink/renderer/core/layout/layout_frame.h b/third_party/blink/renderer/core/layout/layout_frame.h
index e565944..6d3ab99 100644
--- a/third_party/blink/renderer/core/layout/layout_frame.h
+++ b/third_party/blink/renderer/core/layout/layout_frame.h
@@ -34,8 +34,6 @@
  public:
   explicit LayoutFrame(HTMLFrameElement*);
 
-  FrameEdgeInfo EdgeInfo() const;
-
   void ImageChanged(WrappedImagePtr, CanDeferInvalidation) override;
 
   const char* GetName() const override {
diff --git a/third_party/blink/renderer/core/layout/layout_frame_set.cc b/third_party/blink/renderer/core/layout/layout_frame_set.cc
index a3f97ec..925225ab 100644
--- a/third_party/blink/renderer/core/layout/layout_frame_set.cc
+++ b/third_party/blink/renderer/core/layout/layout_frame_set.cc
@@ -26,7 +26,9 @@
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/events/mouse_event.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/html/frame_edge_info.h"
 #include "third_party/blink/renderer/core/html/html_dimension.h"
+#include "third_party/blink/renderer/core/html/html_frame_element.h"
 #include "third_party/blink/renderer/core/html/html_frame_set_element.h"
 #include "third_party/blink/renderer/core/layout/layout_frame.h"
 #include "third_party/blink/renderer/core/layout/layout_view.h"
@@ -60,11 +62,6 @@
   LayoutBox::Trace(visitor);
 }
 
-// TODO(crbug.com/1347700) Move this to ResizeAxis.
-bool LayoutFrameSet::GridAxis::CanResizeSplitAt(int split_index) const {
-  return split_index != -1 /* kNoSplit */ && !prevent_resize_[split_index];
-}
-
 HTMLFrameSetElement* LayoutFrameSet::FrameSet() const {
   NOT_DESTROYED();
   return To<HTMLFrameSetElement>(GetNode());
@@ -77,14 +74,6 @@
 
 void LayoutFrameSet::GridAxis::Resize(int size) {
   sizes_.resize(size);
-
-  // To track edges for resizability and borders, we need to be (size + 1). This
-  // is because a parent frameset may ask us for information about our left/top/
-  // right/bottom edges in order to make its own decisions about what to do. We
-  // are capable of tainting that parent frameset's borders, so we have to cache
-  // this info.
-  prevent_resize_.resize(size + 1);
-  allow_border_.resize(size + 1);
 }
 
 void LayoutFrameSet::LayOutAxis(GridAxis& axis,
@@ -303,78 +292,9 @@
   // FIXME: We should only recompute the edge info with respect to the frame
   // that changed and its adjacent frame(s) instead of recomputing the edge info
   // for the entire frameset.
-  ComputeEdgeInfo();
-}
-
-void LayoutFrameSet::FillFromEdgeInfo(const FrameEdgeInfo& edge_info,
-                                      int r,
-                                      int c) {
-  NOT_DESTROYED();
-  if (edge_info.AllowBorder(kLeftFrameEdge))
-    cols_.allow_border_[c] = true;
-  if (edge_info.AllowBorder(kRightFrameEdge))
-    cols_.allow_border_[c + 1] = true;
-  if (edge_info.PreventResize(kLeftFrameEdge))
-    cols_.prevent_resize_[c] = true;
-  if (edge_info.PreventResize(kRightFrameEdge))
-    cols_.prevent_resize_[c + 1] = true;
-
-  if (edge_info.AllowBorder(kTopFrameEdge))
-    rows_.allow_border_[r] = true;
-  if (edge_info.AllowBorder(kBottomFrameEdge))
-    rows_.allow_border_[r + 1] = true;
-  if (edge_info.PreventResize(kTopFrameEdge))
-    rows_.prevent_resize_[r] = true;
-  if (edge_info.PreventResize(kBottomFrameEdge))
-    rows_.prevent_resize_[r + 1] = true;
-}
-
-void LayoutFrameSet::ComputeEdgeInfo() {
-  NOT_DESTROYED();
-  rows_.prevent_resize_.Fill(FrameSet()->NoResize());
-  rows_.allow_border_.Fill(false);
-  cols_.prevent_resize_.Fill(FrameSet()->NoResize());
-  cols_.allow_border_.Fill(false);
-
-  LayoutObject* child = FirstChild();
-  if (!child)
-    return;
-
-  wtf_size_t rows = rows_.sizes_.size();
-  wtf_size_t cols = cols_.sizes_.size();
-  for (wtf_size_t r = 0; r < rows; ++r) {
-    for (wtf_size_t c = 0; c < cols; ++c) {
-      FrameEdgeInfo edge_info;
-      if (child->IsFrameSet())
-        edge_info = To<LayoutFrameSet>(child)->EdgeInfo();
-      else
-        edge_info = To<LayoutFrame>(child)->EdgeInfo();
-      FillFromEdgeInfo(edge_info, r, c);
-      child = child->NextSibling();
-      if (!child)
-        return;
-    }
-  }
-}
-
-FrameEdgeInfo LayoutFrameSet::EdgeInfo() const {
-  NOT_DESTROYED();
-  FrameEdgeInfo result(FrameSet()->NoResize(), true);
-
-  int rows = FrameSet()->TotalRows();
-  int cols = FrameSet()->TotalCols();
-  if (rows && cols) {
-    result.SetPreventResize(kLeftFrameEdge, cols_.prevent_resize_[0]);
-    result.SetAllowBorder(kLeftFrameEdge, cols_.allow_border_[0]);
-    result.SetPreventResize(kRightFrameEdge, cols_.prevent_resize_[cols]);
-    result.SetAllowBorder(kRightFrameEdge, cols_.allow_border_[cols]);
-    result.SetPreventResize(kTopFrameEdge, rows_.prevent_resize_[0]);
-    result.SetAllowBorder(kTopFrameEdge, rows_.allow_border_[0]);
-    result.SetPreventResize(kBottomFrameEdge, rows_.prevent_resize_[rows]);
-    result.SetAllowBorder(kBottomFrameEdge, rows_.allow_border_[rows]);
-  }
-
-  return result;
+  FrameSet()->CollectEdgeInfo();
+  cols_.allow_border_ = FrameSet()->AllowBorderColumns();
+  rows_.allow_border_ = FrameSet()->AllowBorderRows();
 }
 
 void LayoutFrameSet::UpdateLayout() {
@@ -406,7 +326,9 @@
 
   LayoutBox::UpdateLayout();
 
-  ComputeEdgeInfo();
+  FrameSet()->CollectEdgeInfo();
+  cols_.allow_border_ = FrameSet()->AllowBorderColumns();
+  rows_.allow_border_ = FrameSet()->AllowBorderRows();
 
   UpdateAfterLayout();
 
diff --git a/third_party/blink/renderer/core/layout/layout_frame_set.h b/third_party/blink/renderer/core/layout/layout_frame_set.h
index b9e36b7..e6f18f3 100644
--- a/third_party/blink/renderer/core/layout/layout_frame_set.h
+++ b/third_party/blink/renderer/core/layout/layout_frame_set.h
@@ -31,38 +31,6 @@
 class HTMLDimension;
 class HTMLFrameSetElement;
 
-enum FrameEdge {
-  kLeftFrameEdge,
-  kRightFrameEdge,
-  kTopFrameEdge,
-  kBottomFrameEdge
-};
-
-struct FrameEdgeInfo {
-  STACK_ALLOCATED();
-
- public:
-  FrameEdgeInfo(bool prevent_resize = false, bool allow_border = true)
-      : prevent_resize_(4), allow_border_(4) {
-    prevent_resize_.Fill(prevent_resize);
-    allow_border_.Fill(allow_border);
-  }
-
-  bool PreventResize(FrameEdge edge) const { return prevent_resize_[edge]; }
-  bool AllowBorder(FrameEdge edge) const { return allow_border_[edge]; }
-
-  void SetPreventResize(FrameEdge edge, bool prevent_resize) {
-    prevent_resize_[edge] = prevent_resize;
-  }
-  void SetAllowBorder(FrameEdge edge, bool allow_border) {
-    allow_border_[edge] = allow_border;
-  }
-
- private:
-  Vector<bool> prevent_resize_;
-  Vector<bool> allow_border_;
-};
-
 class LayoutFrameSet final : public LayoutBox {
  public:
   LayoutFrameSet(HTMLFrameSetElement*);
@@ -93,8 +61,6 @@
     return &children_;
   }
 
-  FrameEdgeInfo EdgeInfo() const;
-
   void NotifyFrameEdgeInfoChanged();
   HTMLFrameSetElement* FrameSet() const;
 
@@ -107,11 +73,10 @@
     GridAxis& operator=(const GridAxis&) = delete;
 
     void Resize(int);
-    // Returns true if a split is being resized now.
-    bool CanResizeSplitAt(int split_index) const;
 
     Vector<int> sizes_;
-    Vector<bool> prevent_resize_;
+    // A copy of HTMLFrameSetElement::allow_border_*.  It's helpful
+    // because this information is used at the paint stage.
     Vector<bool> allow_border_;
   };
 
@@ -166,8 +131,6 @@
                   const Vector<HTMLDimension>&,
                   const Vector<int>& deltas,
                   int available_space);
-  void ComputeEdgeInfo();
-  void FillFromEdgeInfo(const FrameEdgeInfo&, int r, int c);
   void PositionFrames();
 
   LayoutObjectChildList children_;
diff --git a/third_party/blink/renderer/core/layout/layout_frame_set_test.cc b/third_party/blink/renderer/core/layout/layout_frame_set_test.cc
new file mode 100644
index 0000000..42093f44
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/layout_frame_set_test.cc
@@ -0,0 +1,31 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
+
+namespace blink {
+
+class LayoutFrameSetTest : public RenderingTest {};
+
+TEST_F(LayoutFrameSetTest, GetCursor) {
+  SetHtmlInnerHTML(R"HTML(
+    <frameset id='f' rows='50%,50%' cols='50%,50%' border='20'>
+    <frame src=""></frame>
+    <frame src=""></frame>
+    <frame src=""></frame>
+    <frame src=""></frame>
+    </frame>)HTML");
+
+  LayoutBox* box = GetLayoutBoxByElementId("f");
+  ui::Cursor cursor;
+  EXPECT_EQ(kSetCursorBasedOnStyle, box->GetCursor({100, 100}, cursor));
+
+  EXPECT_EQ(kSetCursor, box->GetCursor({100, 300}, cursor));
+  EXPECT_EQ(RowResizeCursor(), cursor);
+
+  EXPECT_EQ(kSetCursor, box->GetCursor({400, 100}, cursor));
+  EXPECT_EQ(ColumnResizeCursor(), cursor);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
index 6c6fe02a..9d89c46 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_caret_rect.cc
@@ -153,24 +153,6 @@
       line_box.Current().OffsetInContainerFragment();
   const PhysicalRect line_box_rect(line_box_offset, line_box.Current().Size());
 
-  // If there are hanging spaces, grow the line rect to encompass them so the
-  // caret can be placed there. Note that per UAX#9 L1 and L2, trailing spaces
-  // are always visually at the end of the line in the paragraph direction.
-  const LayoutUnit hanging_inline_size =
-      line_box.Current()->LineBoxHangingInlineSize();
-  PhysicalRect line_box_rect_with_hanging = line_box_rect;
-  if (UNLIKELY(hanging_inline_size)) {
-    if (is_horizontal) {
-      if (IsRtl(line_box.Current().BaseDirection()))
-        line_box_rect_with_hanging.offset.left -= hanging_inline_size;
-      line_box_rect_with_hanging.size.width += hanging_inline_size;
-    } else {
-      if (IsRtl(line_box.Current().BaseDirection()))
-        line_box_rect_with_hanging.offset.top -= hanging_inline_size;
-      line_box_rect_with_hanging.size.height += hanging_inline_size;
-    }
-  }
-
   const NGInlineBreakToken* break_token = line_box.Current().InlineBreakToken();
   const bool is_last_line = !break_token || break_token->IsForcedBreak();
   const ComputedStyle& block_style = fragment.Style();
@@ -180,39 +162,29 @@
       (style.GetUnicodeBidi() != UnicodeBidi::kPlaintext ||
        IsLtr(ResolvedDirection(cursor)));
 
-  // Adjust the location in the inline direction to ensure that it falls either
-  // on the line box proper, or on the intersection of the line's hanging text
-  // and the containing block. Then round the location to the nearest pixel.
-  // Additionally, since we don't want the caret to go past the start of the
-  // line or past the end of the container, we subtract the width of the caret
-  // in some cases.
+  // For horizontal text, adjust the location in the x direction to ensure that
+  // it completely falls in the union of line box and containing block, and
+  // then round it to the nearest pixel.
   if (is_horizontal) {
-    const LayoutUnit right_aligned_caret =
-        should_align_caret_right ? caret_width : LayoutUnit();
-    const LayoutUnit left_limit =
-        std::min(line_box_rect.X(),
-                 std::max(line_box_rect_with_hanging.X() - right_aligned_caret,
-                          LayoutUnit()));
-    const LayoutUnit right_limit = std::max(
-        line_box_rect.Right() - caret_width,
-        std::min(line_box_rect_with_hanging.Right() - right_aligned_caret,
-                 fragment.Size().width - caret_width));
-    caret_location.left =
-        ClampAndRound(caret_location.left, left_limit, right_limit);
-  } else {
-    const LayoutUnit bottom_aligned_caret =
-        should_align_caret_right ? caret_height : LayoutUnit();
-    const LayoutUnit top_limit =
-        std::min(line_box_rect.Y(),
-                 std::max(line_box_rect_with_hanging.Y() - bottom_aligned_caret,
-                          LayoutUnit()));
-    const LayoutUnit bottom_limit = std::max(
-        line_box_rect.Bottom() - caret_height,
-        std::min(line_box_rect_with_hanging.Bottom() - bottom_aligned_caret,
-                 fragment.Size().height - caret_height));
-    caret_location.top =
-        ClampAndRound(caret_location.top, top_limit, bottom_limit);
+    if (should_align_caret_right) {
+      const LayoutUnit left_edge = std::min(LayoutUnit(), line_box_rect.X());
+      const LayoutUnit right_limit = line_box_rect.Right() - caret_width;
+      caret_location.left =
+          ClampAndRound(caret_location.left, left_edge, right_limit);
+    } else {
+      const LayoutUnit right_limit =
+          std::max(fragment.Size().width, line_box_rect.Right()) - caret_width;
+      caret_location.left =
+          ClampAndRound(caret_location.left, line_box_rect.X(), right_limit);
+    }
+    return PhysicalRect(caret_location, caret_size);
   }
+
+  // Similar adjustment and rounding for vertical text.
+  const LayoutUnit min_y = std::min(LayoutUnit(), line_box_offset.top);
+  const LayoutUnit bottom_limit =
+      std::max(fragment.Size().height, line_box_rect.Bottom()) - caret_height;
+  caret_location.top = ClampAndRound(caret_location.top, min_y, bottom_limit);
   return PhysicalRect(caret_location, caret_size);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
index d5bfae4..67d6fb4 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_fragment_item.h
@@ -304,11 +304,6 @@
     return NGLineBoxType::kNormalLineBox;
   }
 
-  LayoutUnit LineBoxHangingInlineSize() const {
-    DCHECK_EQ(Type(), kLine);
-    return LineBoxFragment()->HangingInlineSize();
-  }
-
   static PhysicalRect LocalVisualRectFor(const LayoutObject& layout_object);
 
   // Re-compute the ink overflow for the |cursor| until its end.
@@ -367,7 +362,9 @@
     return IsHorizontalWritingMode(GetWritingMode());
   }
 
-  WritingMode GetWritingMode() const { return Style().GetWritingMode(); }
+  WritingMode GetWritingMode() const {
+    return Style().GetWritingMode();
+  }
 
   // Functions for |TextItem|, |SvgTextItem|, and |GeneratedTextItem|.
   NGTextType TextType() const {
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index f5c9d7e..4dde00b1 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -160,21 +160,31 @@
   if (IsLtr(line_info->BaseDirection()))
     return LayoutUnit();
 
-  // If !line_info->ShouldHangTrailingSpaces(), the hang width is not considered
-  // in ApplyTextAlign, and so line_offset points to where the left edge of the
-  // hanging spaces should be. Since the line box rect has to start at the left
-  // edge of the text instead (needed for caret positioning), we increase
-  // line_offset.
+  // If the hang_width cause overflow, we don't want to adjust the line_offset
+  // so that it becomes negative, which causes some difficulties for the
+  // NGLayoutOverflowCalculator to apply its own adjustements in the
+  // AdjustOverflowForHanging function. Instead, we'll shift the line items so
+  // that we ignore the hanging width when the NGInlineLayoutStateStack computes
+  // their positions in ComputeInlinePositions function.
   LayoutUnit hang_width = line_info->HangWidth();
-  if (!line_info->ShouldHangTrailingSpaces()) {
-    line_offset += hang_width;
+  if (line_offset < hang_width) {
+    // If we haven't considered the hang_width in ApplyTextAlign, we might end
+    // up with a negative line_offset, so shift the offset to ignore hanging
+    // spaces.
+    if (!line_info->ShouldHangTrailingSpaces())
+      line_offset += hang_width;
+    return -hang_width;
   }
 
-  // Now line_offset always points to where the left edge of the text should be.
-  // If there are any hanging spaces, the starting position of the line must be
-  // offset by the width of the hanging spaces so that the text starts at
-  // line_offset.
-  return -hang_width;
+  // At this point we have a RTL line with hanging spaces that shouldn't be
+  // ignored based on the text-align property. Hence the final line_offset value
+  // should consider the hang_width. Note that this line_offset will be used
+  // later to compute the caret position in ComputeLocalCaretRectAtTextOffset,
+  // that's why we need to adjust the offset. Once we adjust the line_offset, we
+  // can use 0 as initial position for the line items, as we do in the case of a
+  // LTR line.
+  line_offset -= hang_width;
+  return LayoutUnit();
 }
 
 void NGInlineLayoutAlgorithm::RebuildBoxStates(
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
index ae16108b..14ccc9f 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
@@ -7,7 +7,6 @@
 #include <sstream>
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/blink/renderer/core/dom/tag_collection.h"
-#include "third_party/blink/renderer/core/html/forms/html_text_area_element.h"
 #include "third_party/blink/renderer/core/layout/layout_block_flow.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_break_token.h"
@@ -705,86 +704,6 @@
                 *To<LayoutBlockFlow>(GetLayoutObjectByElementId("target"))));
 }
 
-TEST_F(NGInlineLayoutAlgorithmTest, LineBoxWithHangingWidthRTLRightAligned) {
-  LoadAhem();
-  InsertStyleElement(
-      "textarea {"
-      "  width: 100px;"
-      "  text-align: right;"
-      "  font: 10px/10px Ahem;"
-      "}");
-  SetBodyInnerHTML(R"HTML(
-    <!DOCTYPE html>
-    <textarea dir="rtl" id="hangingDoesntOverflow">abc  </textarea>
-    <textarea dir="rtl" id="hangingOverflows">abc        </textarea>
-  )HTML");
-
-  HTMLTextAreaElement* hanging_doesnt_overflow =
-      To<HTMLTextAreaElement>(GetElementById("hangingDoesntOverflow"));
-  NGInlineCursor hanging_doesnt_overflow_cursor(*To<LayoutBlockFlow>(
-      hanging_doesnt_overflow->InnerEditorElement()->GetLayoutObject()));
-  hanging_doesnt_overflow_cursor.MoveToFirstLine();
-  EXPECT_TRUE(hanging_doesnt_overflow_cursor.IsNotNull());
-  PhysicalRect hanging_doesnt_overflow_rect(
-      hanging_doesnt_overflow_cursor.Current().OffsetInContainerFragment(),
-      hanging_doesnt_overflow_cursor.Current().Size());
-  EXPECT_EQ(PhysicalRect(70, 0, 30, 10), hanging_doesnt_overflow_rect);
-
-  HTMLTextAreaElement* hanging_overflows =
-      To<HTMLTextAreaElement>(GetElementById("hangingOverflows"));
-  NGInlineCursor hanging_overflows_cursor(*To<LayoutBlockFlow>(
-      hanging_overflows->InnerEditorElement()->GetLayoutObject()));
-  hanging_overflows_cursor.MoveToFirstLine();
-  EXPECT_TRUE(hanging_overflows_cursor.IsNotNull());
-  PhysicalRect hanging_overflows_rect(
-      hanging_overflows_cursor.Current().OffsetInContainerFragment(),
-      hanging_overflows_cursor.Current().Size());
-  EXPECT_EQ(PhysicalRect(70, 0, 30, 10), hanging_overflows_rect);
-}
-
-TEST_F(NGInlineLayoutAlgorithmTest, LineBoxWithHangingWidthRTLCenterAligned) {
-  LoadAhem();
-  InsertStyleElement(
-      "textarea {"
-      "  width: 100px;"
-      "  text-align: center;"
-      "  font: 10px/10px Ahem;"
-      "}");
-  SetBodyInnerHTML(R"HTML(
-    <!DOCTYPE html>
-    <textarea dir="rtl" id="a">abc  </textarea>
-    <textarea dir="rtl" id="b">abc      </textarea>
-  )HTML");
-
-  HTMLTextAreaElement* a_textarea =
-      To<HTMLTextAreaElement>(GetElementById("a"));
-  NGInlineCursor a_cursor(*To<LayoutBlockFlow>(
-      a_textarea->InnerEditorElement()->GetLayoutObject()));
-  a_cursor.MoveToFirstLine();
-  EXPECT_TRUE(a_cursor.IsNotNull());
-  PhysicalRect a_rect(a_cursor.Current().OffsetInContainerFragment(),
-                      a_cursor.Current().Size());
-  // The line size is 30px and the hanging width is 20px. The rectangle
-  // containing the line and the hanging width is centered, so its right edge
-  // is at (100 + 30 + 20)/2 = 75px. Since the line's base direction is RTL, the
-  // text is at the right and its left edge is at 75px - 30 = 45px.
-  EXPECT_EQ(PhysicalRect(45, 0, 30, 10), a_rect);
-
-  HTMLTextAreaElement* b_textarea =
-      To<HTMLTextAreaElement>(GetElementById("b"));
-  NGInlineCursor b_cursor(*To<LayoutBlockFlow>(
-      b_textarea->InnerEditorElement()->GetLayoutObject()));
-  b_cursor.MoveToFirstLine();
-  EXPECT_TRUE(b_cursor.IsNotNull());
-  PhysicalRect b_rect(b_cursor.Current().OffsetInContainerFragment(),
-                      b_cursor.Current().Size());
-  // The line size is 30px and the hanging width is 60px. The rectangle
-  // containing the line and the hanging width is centered, so its right edge
-  // is at (100 + 30 + 60)/2 = 95px. Since the line's base direction is RTL, the
-  // text is at the right and its left edge is at 95px - 30 = 65px.
-  EXPECT_EQ(PhysicalRect(65, 0, 30, 10), b_rect);
-}
-
 #undef MAYBE_VerticalAlignBottomReplaced
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
index 90b0d49..315803a 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
@@ -20,7 +20,6 @@
 
 struct SameSizeAsNGPhysicalLineBoxFragment : NGPhysicalFragment {
   FontHeight metrics;
-  LayoutUnit hanging_inline_size;
 };
 
 ASSERT_SIZE(NGPhysicalLineBoxFragment, SameSizeAsNGPhysicalLineBoxFragment);
@@ -45,11 +44,11 @@
                          builder->GetWritingMode(),
                          kFragmentLineBox,
                          builder->line_box_type_),
-      metrics_(builder->metrics_),
-      hanging_inline_size_(builder->hang_inline_size_) {
+      metrics_(builder->metrics_) {
   // A line box must have a metrics unless it's an empty line box.
   DCHECK(!metrics_.IsEmpty() || IsEmptyLineBox());
   base_direction_ = static_cast<unsigned>(builder->base_direction_);
+  has_hanging_ = builder->hang_inline_size_ != 0;
   has_propagated_descendants_ = has_floating_descendants_for_paint_ ||
                                 HasOutOfFlowPositionedDescendants() ||
                                 builder->unpositioned_list_marker_;
@@ -58,10 +57,9 @@
 NGPhysicalLineBoxFragment::NGPhysicalLineBoxFragment(
     PassKey key,
     const NGPhysicalLineBoxFragment& other)
-    : NGPhysicalFragment(other),
-      metrics_(other.metrics_),
-      hanging_inline_size_(other.hanging_inline_size_) {
+    : NGPhysicalFragment(other), metrics_(other.metrics_) {
   base_direction_ = other.base_direction_;
+  has_hanging_ = other.has_hanging_;
   has_propagated_descendants_ = other.has_propagated_descendants_;
 }
 
@@ -122,7 +120,7 @@
 
   PhysicalRect overflow;
   AddScrollableOverflowForInlineChild(container, container_style, line,
-                                      HasHanging(), cursor, height_type,
+                                      has_hanging_, cursor, height_type,
                                       &overflow);
 
   // Make sure we include the inline-size of the line-box in the overflow.
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
index 051e430b..f5a725a 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.h
@@ -49,9 +49,7 @@
   bool HasPropagatedDescendants() const { return has_propagated_descendants_; }
 
   // True if there is any hanging white-space or similar.
-  bool HasHanging() const { return hanging_inline_size_ > 0; }
-
-  LayoutUnit HangingInlineSize() const { return hanging_inline_size_; }
+  bool HasHanging() const { return has_hanging_; }
 
   const FontHeight& Metrics() const { return metrics_; }
 
@@ -91,7 +89,6 @@
 
  private:
   FontHeight metrics_;
-  LayoutUnit hanging_inline_size_;
 };
 
 template <>
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
index 84cfb7f8..3d360895 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.cc
@@ -429,6 +429,7 @@
           other.depends_on_percentage_block_size_),
       children_valid_(other.children_valid_),
       has_propagated_descendants_(other.has_propagated_descendants_),
+      has_hanging_(other.has_hanging_),
       type_(other.type_),
       sub_type_(other.sub_type_),
       style_variant_(other.style_variant_),
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
index bdb9387..c87bd76 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -695,9 +695,10 @@
   unsigned depends_on_percentage_block_size_ : 1;
   mutable unsigned children_valid_ : 1;
 
-  // The following bitfield is only to be used by NGPhysicalLineBoxFragment
+  // The following bitfields are only to be used by NGPhysicalLineBoxFragment
   // (it's defined here to save memory, since that class has no bitfields).
   unsigned has_propagated_descendants_ : 1;
+  unsigned has_hanging_ : 1;
 
   const unsigned type_ : 1;           // NGFragmentType
   const unsigned sub_type_ : 4;       // NGBoxType, NGTextType, or NGLineBoxType
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc
index 7454fdc6..5b723b25 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.cc
+++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -7,6 +7,7 @@
 #include "base/feature_list.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink-forward.h"
 #include "third_party/blink/public/platform/task_type.h"
+#include "third_party/blink/renderer/bindings/core/v8/referrer_script_info.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_streamer.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -51,6 +52,16 @@
 
 }  // namespace
 
+namespace {
+// The base URL for external classic script is
+//
+// <spec href="https://html.spec.whatwg.org/C/#concept-script-base-url">
+// ... the URL from which the script was obtained, ...</spec>
+KURL BaseUrl(const ScriptResource& resource) {
+  return resource.GetResponse().ResponseUrl();
+}
+}  // namespace
+
 // <specdef href="https://html.spec.whatwg.org/C/#fetch-a-classic-script">
 ClassicPendingScript* ClassicPendingScript::Fetch(
     const KURL& url,
@@ -310,6 +321,43 @@
   AdvanceReadyState(kReady);
 }
 
+const ParkableString& ClassicPendingScript::GetSourceText() {
+  // This method is an implementation of a virtual function defined by
+  // ScriptCacheConsumerClient, and is only used for external scripts.
+  CHECK(is_external_);
+
+  return To<ScriptResource>(GetResource())->SourceText();
+}
+
+v8::ScriptOrigin ClassicPendingScript::GetScriptOrigin() {
+  // This method is an implementation of a virtual function defined by
+  // ScriptCacheConsumerClient, and is only used for external scripts.
+  CHECK(is_external_);
+
+  v8::Isolate* isolate = GetElement()->GetExecutionContext()->GetIsolate();
+  auto* resource = To<ScriptResource>(GetResource());
+  const KURL& source_url = ClassicScript::SourceUrlFromResource(*resource);
+  TextPosition script_start_position = TextPosition::MinimumPosition();
+  SanitizeScriptErrors sanitize_script_errors =
+      ClassicScript::ShouldSanitizeScriptErrors(resource->GetResponse());
+  String source_map_url =
+      ClassicScript::SourceMapUrlFromResponse(resource->GetResponse());
+  const KURL& base_url = BaseUrl(*resource);
+  const ReferrerScriptInfo referrer_info(base_url, options_);
+  v8::Local<v8::Data> host_defined_options =
+      referrer_info.ToV8HostDefinedOptions(isolate, source_url);
+  return v8::ScriptOrigin(
+      isolate, V8String(isolate, source_url),
+      script_start_position.line_.ZeroBasedInt(),
+      script_start_position.column_.ZeroBasedInt(),
+      sanitize_script_errors == SanitizeScriptErrors::kDoNotSanitize, -1,
+      V8String(isolate, source_map_url),
+      sanitize_script_errors == SanitizeScriptErrors::kSanitize,
+      false,  // is_wasm
+      false,  // is_module
+      host_defined_options);
+}
+
 void ClassicPendingScript::Trace(Visitor* visitor) const {
   visitor->Trace(cache_consumer_);
   ResourceClient::Trace(visitor);
@@ -410,11 +458,7 @@
                          TRACE_EVENT_FLAG_FLOW_IN, "not_streamed_reason",
                          not_streamed_reason);
 
-  // The base URL for external classic script is
-  //
-  // <spec href="https://html.spec.whatwg.org/C/#concept-script-base-url">
-  // ... the URL from which the script was obtained, ...</spec>
-  const KURL& base_url = resource->GetResponse().ResponseUrl();
+  const KURL& base_url = BaseUrl(*resource);
   return ClassicScript::CreateFromResource(resource, base_url, options_,
                                            streamer, not_streamed_reason,
                                            cache_consumer_);
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.h b/third_party/blink/renderer/core/script/classic_pending_script.h
index 06a64087..1908cec3 100644
--- a/third_party/blink/renderer/core/script/classic_pending_script.h
+++ b/third_party/blink/renderer/core/script/classic_pending_script.h
@@ -74,7 +74,10 @@
   KURL UrlForTracing() const override;
   void DisposeInternal() override;
 
+  // ScriptCacheConsumerClient:
   void NotifyCacheConsumeFinished() override;
+  const ParkableString& GetSourceText() override;
+  v8::ScriptOrigin GetScriptOrigin() override;
 
   void SetNotStreamingReasonForTest(ScriptStreamer::NotStreamingReason reason) {
     not_streamed_reason_ = reason;
diff --git a/third_party/blink/renderer/core/script/classic_script.cc b/third_party/blink/renderer/core/script/classic_script.cc
index bb72079..b539f58 100644
--- a/third_party/blink/renderer/core/script/classic_script.cc
+++ b/third_party/blink/renderer/core/script/classic_script.cc
@@ -47,7 +47,10 @@
   return raw_base_url;
 }
 
-String SourceMapUrlFromResponse(const ResourceResponse& response) {
+}  // namespace
+
+String ClassicScript::SourceMapUrlFromResponse(
+    const ResourceResponse& response) {
   String source_map_url = response.HttpHeaderField(http_names::kSourceMap);
   if (!source_map_url.IsEmpty())
     return source_map_url;
@@ -56,8 +59,6 @@
   return response.HttpHeaderField(http_names::kXSourceMap);
 }
 
-}  // namespace
-
 KURL ClassicScript::StripFragmentIdentifier(const KURL& url) {
   if (url.IsEmpty())
     return KURL();
@@ -70,6 +71,16 @@
   return copy;
 }
 
+KURL ClassicScript::SourceUrlFromResource(const ScriptResource& resource) {
+  return StripFragmentIdentifier(resource.Url());
+}
+
+SanitizeScriptErrors ClassicScript::ShouldSanitizeScriptErrors(
+    const ResourceResponse& response) {
+  return response.IsCorsSameOrigin() ? SanitizeScriptErrors::kDoNotSanitize
+                                     : SanitizeScriptErrors::kSanitize;
+}
+
 ClassicScript* ClassicScript::Create(
     const String& source_text,
     const KURL& source_url,
@@ -109,11 +120,9 @@
   // We lose the encoding information from ScriptResource.
   // Not sure if that matters.
   return MakeGarbageCollected<ClassicScript>(
-      source, StripFragmentIdentifier(resource->Url()), base_url, fetch_options,
+      source, SourceUrlFromResource(*resource), base_url, fetch_options,
       ScriptSourceLocationType::kExternalFile,
-      resource->GetResponse().IsCorsSameOrigin()
-          ? SanitizeScriptErrors::kDoNotSanitize
-          : SanitizeScriptErrors::kSanitize,
+      ShouldSanitizeScriptErrors(resource->GetResponse()),
       resource->CacheHandler(), TextPosition::MinimumPosition(), streamer,
       not_streamed_reason, cache_consumer,
       SourceMapUrlFromResponse(resource->GetResponse()));
diff --git a/third_party/blink/renderer/core/script/classic_script.h b/third_party/blink/renderer/core/script/classic_script.h
index cfe5214..8a07ec6 100644
--- a/third_party/blink/renderer/core/script/classic_script.h
+++ b/third_party/blink/renderer/core/script/classic_script.h
@@ -20,6 +20,12 @@
  public:
   // For `source_url`.
   static KURL StripFragmentIdentifier(const KURL&);
+  static KURL SourceUrlFromResource(const ScriptResource& resource);
+
+  static String SourceMapUrlFromResponse(const ResourceResponse& response);
+
+  static SanitizeScriptErrors ShouldSanitizeScriptErrors(
+      const ResourceResponse& response);
 
   // For scripts specified in the HTML spec or for tests.
   // Please leave spec comments and spec links that explain given argument
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
index b93888e..16d3ae4 100644
--- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
+++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.cc
@@ -771,10 +771,15 @@
 }  // namespace
 
 void InspectorIndexedDBAgent::requestDatabaseNames(
-    const String& security_origin,
+    protocol::Maybe<String> security_origin,
+    protocol::Maybe<String> storage_key,
     std::unique_ptr<RequestDatabaseNamesCallback> request_callback) {
-  LocalFrame* frame =
-      inspected_frames_->FrameWithSecurityOrigin(security_origin);
+  absl::variant<LocalFrame*, Response> frame_or_response = ResolveFrame(
+      std::move(security_origin), std::move(storage_key), inspected_frames_);
+  if (absl::holds_alternative<Response>(frame_or_response)) {
+    request_callback->sendFailure(absl::get<Response>(frame_or_response));
+  }
+  LocalFrame* frame = absl::get<LocalFrame*>(frame_or_response);
   if (!frame) {
     request_callback->sendFailure(Response::ServerError(kNoDocumentError));
     return;
diff --git a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h
index 0d07080..5d5d626 100644
--- a/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h
+++ b/third_party/blink/renderer/modules/indexeddb/inspector_indexed_db_agent.h
@@ -58,7 +58,8 @@
   protocol::Response enable() override;
   protocol::Response disable() override;
   void requestDatabaseNames(
-      const String& security_origin,
+      protocol::Maybe<String> security_origin,
+      protocol::Maybe<String> storage_key,
       std::unique_ptr<RequestDatabaseNamesCallback>) override;
   void requestDatabase(protocol::Maybe<String> security_origin,
                        protocol::Maybe<String> storage_key,
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index 675253a3..381a9db 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -2582,4 +2582,14 @@
          mojom::blink::AncestorFrameType::kFencedFrame;
 }
 
+mojom::blink::ServiceWorkerFetchHandlerType
+ServiceWorkerGlobalScope::FetchHandlerType() {
+  EventListenerVector* elv = GetEventListeners(event_type_names::kFetch);
+  if (!elv) {
+    return mojom::blink::ServiceWorkerFetchHandlerType::kNoHandler;
+  }
+  // TODO(crbug.com/1347319): implement nop handler detection.
+  return mojom::blink::ServiceWorkerFetchHandlerType::kNotSkippable;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
index 5a74e1a..ab28f48 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
@@ -43,6 +43,7 @@
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_ancestor_frame_type.mojom-blink.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_fetch_handler_type.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom-blink-forward.h"
 #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
@@ -324,6 +325,8 @@
     return ancestor_frame_type_;
   }
 
+  mojom::blink::ServiceWorkerFetchHandlerType FetchHandlerType();
+
  protected:
   // EventTarget
   bool AddEventListenerInternal(
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
index 6d824c5..d418015 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
@@ -281,8 +281,9 @@
   WorkerGlobalScope()->ResumeEvaluation();
 }
 
-bool ServiceWorkerGlobalScopeProxy::HasFetchHandler() {
-  return WorkerGlobalScope()->HasEventListeners(event_type_names::kFetch);
+mojom::blink::ServiceWorkerFetchHandlerType
+ServiceWorkerGlobalScopeProxy::FetchHandlerType() {
+  return WorkerGlobalScope()->FetchHandlerType();
 }
 
 WebServiceWorkerContextClient& ServiceWorkerGlobalScopeProxy::Client() const {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
index aac3426..21fbc8a 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
@@ -37,6 +37,7 @@
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/dispatch_fetch_event_params.mojom-blink.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom-blink.h"
+#include "third_party/blink/public/mojom/service_worker/service_worker_fetch_handler_type.mojom-blink.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/web/modules/service_worker/web_service_worker_context_proxy.h"
 #include "third_party/blink/renderer/core/workers/worker_reporting_proxy.h"
@@ -102,7 +103,7 @@
   bool IsWindowInteractionAllowed() override;
   void PauseEvaluation() override;
   void ResumeEvaluation() override;
-  bool HasFetchHandler() override;
+  mojom::blink::ServiceWorkerFetchHandlerType FetchHandlerType() override;
 
   // WorkerReportingProxy overrides:
   void CountFeature(WebFeature) override;
diff --git a/third_party/blink/renderer/platform/fonts/font_platform_data.cc b/third_party/blink/renderer/platform/fonts/font_platform_data.cc
index 8f4c979..17b2b6c 100644
--- a/third_party/blink/renderer/platform/fonts/font_platform_data.cc
+++ b/third_party/blink/renderer/platform/fonts/font_platform_data.cc
@@ -299,6 +299,11 @@
 }
 #endif
 
+scoped_refptr<OpenTypeVerticalData> FontPlatformData::CreateVerticalData()
+    const {
+  return OpenTypeVerticalData::CreateUnscaled(typeface_);
+}
+
 IdentifiableToken FontPlatformData::ComputeTypefaceDigest() const {
   DCHECK(typeface_);
   int table_count = typeface_->countTables();
diff --git a/third_party/blink/renderer/platform/fonts/font_platform_data.h b/third_party/blink/renderer/platform/fonts/font_platform_data.h
index 8d552076..e21be95 100644
--- a/third_party/blink/renderer/platform/fonts/font_platform_data.h
+++ b/third_party/blink/renderer/platform/fonts/font_platform_data.h
@@ -61,6 +61,7 @@
 
 class Font;
 class HarfBuzzFace;
+class OpenTypeVerticalData;
 
 class PLATFORM_EXPORT FontPlatformData {
   USING_FAST_MALLOC(FontPlatformData);
@@ -133,6 +134,8 @@
   SkFont CreateSkFont(bool should_use_subpixel_positioning = false,
                       const FontDescription* = nullptr) const;
 
+  scoped_refptr<OpenTypeVerticalData> CreateVerticalData() const;
+
   // Computes a digest from the typeface. The digest only depends on the
   // underlying font itself, and does not vary by the style (size, weight,
   // italics, etc). This is aimed at discovering the fingerprinting information
diff --git a/third_party/blink/renderer/platform/fonts/font_test.cc b/third_party/blink/renderer/platform/fonts/font_test.cc
index 8f0b7fa3..54dddfc0 100644
--- a/third_party/blink/renderer/platform/fonts/font_test.cc
+++ b/third_party/blink/renderer/platform/fonts/font_test.cc
@@ -16,6 +16,20 @@
 
 namespace blink {
 
+namespace {
+
+Font CreateVerticalUprightTestFont(const AtomicString& family_name,
+                                   const String& font_path,
+                                   float size) {
+  return CreateTestFont(
+      family_name, font_path, size, /* ligatures */ nullptr,
+      [](FontDescription* font_description) {
+        font_description->SetOrientation(FontOrientation::kVerticalUpright);
+      });
+}
+
+}  // namespace
+
 class FontTest : public FontTestBase {
  public:
   Vector<int> GetExpandedRange(const String& text, bool ltr, int from, int to) {
@@ -34,6 +48,13 @@
     font.ExpandRangeToIncludePartialGlyphs(text_run, &from, &to);
     return Vector<int>({from, to});
   }
+
+  Font CreateFontWithOrientation(const Font& base_font,
+                                 FontOrientation orientation) {
+    FontDescription font_description = base_font.GetFontDescription();
+    font_description.SetOrientation(orientation);
+    return Font(font_description);
+  }
 };
 
 TEST_F(FontTest, IdeographicFullWidthAhem) {
@@ -44,7 +65,7 @@
   EXPECT_FALSE(font_data->GetFontMetrics().IdeographicFullWidth().has_value());
 }
 
-TEST_F(FontTest, IdeographicFullWidthCJKFull) {
+TEST_F(FontTest, IdeographicFullWidthCjkFull) {
   Font font = CreateTestFont(
       "M PLUS 1p",
       blink::test::BlinkWebTestsFontsTestDataPath("mplus-1p-regular.woff"), 16);
@@ -54,7 +75,7 @@
   EXPECT_EQ(*font_data->GetFontMetrics().IdeographicFullWidth(), 16);
 }
 
-TEST_F(FontTest, IdeographicFullWidthCJKNarrow) {
+TEST_F(FontTest, IdeographicFullWidthCjkNarrow) {
   Font font = CreateTestFont("CSSHWOrientationTest",
                              blink::test::BlinkWebTestsFontsTestDataPath(
                                  "adobe-fonts/CSSHWOrientationTest.otf"),
@@ -65,6 +86,38 @@
   EXPECT_EQ(*font_data->GetFontMetrics().IdeographicFullWidth(), 8);
 }
 
+// A font that does not have the CJK "water" glyph.
+TEST_F(FontTest, IdeographicFullWidthUprightAhem) {
+  Font font =
+      CreateTestFont("Ahem", test::PlatformTestDataPath("Ahem.woff"), 16);
+  const SimpleFontData* font_data = font.PrimaryFont();
+  ASSERT_TRUE(font_data);
+  EXPECT_FALSE(font_data->GetFontMetrics().IdeographicFullWidth().has_value());
+}
+
+// A Japanese font, with the "water" glyph, but the `vmtx` table is missing.
+TEST_F(FontTest, IdeographicFullWidthUprightCjkNoVmtx) {
+  Font font = CreateVerticalUprightTestFont(
+      "M PLUS 1p",
+      blink::test::BlinkWebTestsFontsTestDataPath("mplus-1p-regular.woff"), 16);
+  const SimpleFontData* font_data = font.PrimaryFont();
+  ASSERT_TRUE(font_data);
+  EXPECT_FALSE(font_data->GetFontMetrics().IdeographicFullWidth().has_value());
+}
+
+// A Japanese font, with the "water" glyph, with the `vmtx` table.
+TEST_F(FontTest, IdeographicFullWidthUprightCjkVmtx) {
+  Font font =
+      CreateVerticalUprightTestFont("CSSHWOrientationTest",
+                                    blink::test::BlinkWebTestsFontsTestDataPath(
+                                        "adobe-fonts/CSSHWOrientationTest.otf"),
+                                    16);
+  const SimpleFontData* font_data = font.PrimaryFont();
+  ASSERT_TRUE(font_data);
+  ASSERT_TRUE(font_data->GetFontMetrics().IdeographicFullWidth().has_value());
+  EXPECT_EQ(*font_data->GetFontMetrics().IdeographicFullWidth(), 16);
+}
+
 TEST_F(FontTest, TextIntercepts) {
   Font font =
       CreateTestFont("Ahem", test::PlatformTestDataPath("Ahem.woff"), 16);
diff --git a/third_party/blink/renderer/platform/fonts/simple_font_data.cc b/third_party/blink/renderer/platform/fonts/simple_font_data.cc
index 0848a66..5e0cc2d 100644
--- a/third_party/blink/renderer/platform/fonts/simple_font_data.cc
+++ b/third_party/blink/renderer/platform/fonts/simple_font_data.cc
@@ -40,6 +40,7 @@
 #include "build/build_config.h"
 #include "third_party/blink/renderer/platform/font_family_names.h"
 #include "third_party/blink/renderer/platform/fonts/font_description.h"
+#include "third_party/blink/renderer/platform/fonts/opentype/open_type_vertical_data.h"
 #include "third_party/blink/renderer/platform/fonts/shaping/harfbuzz_face.h"
 #include "third_party/blink/renderer/platform/fonts/skia/skia_text_metrics.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/partitions.h"
@@ -175,11 +176,11 @@
   DCHECK(face);
   if (int units_per_em = face->getUnitsPerEm())
     font_metrics_.SetUnitsPerEm(units_per_em);
-
 }
 
 void SimpleFontData::PlatformGlyphInit() {
-  SkTypeface* typeface = PlatformData().Typeface();
+  const FontPlatformData& platform_data = PlatformData();
+  SkTypeface* typeface = platform_data.Typeface();
   if (!typeface->countGlyphs()) {
     space_glyph_ = 0;
     space_width_ = 0;
@@ -204,12 +205,51 @@
   // It should be computed without shaping; i.e., it doesn't include font
   // features, ligatures/kerning, nor `letter-spacing`.
   // https://github.com/w3c/csswg-drafts/issues/5498#issuecomment-686902802
-  if (const Glyph cjk_water_glyph = GlyphForCharacter(kCjkWaterCharacter))
+  const Glyph cjk_water_glyph = GlyphForCharacter(kCjkWaterCharacter);
+
+  // If `text-orientation: vertical-upright`, use the vertical metrics.
+  if (UNLIKELY(platform_data.Orientation() ==
+               FontOrientation::kVerticalUpright)) {
+    PlatformGlyphInitVerticalUpright(cjk_water_glyph);
+    return;
+  }
+
+  if (cjk_water_glyph)
     font_metrics_.SetIdeographicFullWidth(WidthForGlyph(cjk_water_glyph));
   else
     font_metrics_.SetIdeographicFullWidth(absl::nullopt);
 }
 
+void SimpleFontData::PlatformGlyphInitVerticalUpright(Glyph cjk_water_glyph) {
+  DCHECK_EQ(PlatformData().Orientation(), FontOrientation::kVerticalUpright);
+
+  if (!cjk_water_glyph) {
+    font_metrics_.SetIdeographicFullWidth(absl::nullopt);
+    return;
+  }
+
+  // The vertical metrics is available only in |HarfBuzzFontData|, but it can't
+  // be constructed while initializing |SimpleFontData|. See crbug.com/784389.
+  const FontPlatformData& platform_data = PlatformData();
+  scoped_refptr<OpenTypeVerticalData> vertical_data =
+      platform_data.CreateVerticalData();
+  const FontMetrics& metrics = GetFontMetrics();
+  const int units_per_em =
+      platform_data.GetHarfBuzzFace()->UnitsPerEmFromHeadTable();
+  const float size_per_unit =
+      platform_data.size() / (units_per_em ? units_per_em : 1);
+  // Use a value for |height_fallback| that can detect the "fallback" case.
+  constexpr int height_fallback = 0;
+  vertical_data->SetScaleAndFallbackMetrics(
+      size_per_unit, metrics.FloatAscent(), height_fallback);
+  const float cjk_water_height = vertical_data->AdvanceHeight(cjk_water_glyph);
+  if (cjk_water_height == height_fallback) {
+    font_metrics_.SetIdeographicFullWidth(absl::nullopt);
+    return;
+  }
+  font_metrics_.SetIdeographicFullWidth(cjk_water_height);
+}
+
 const SimpleFontData* SimpleFontData::FontDataForCharacter(UChar32) const {
   return this;
 }
diff --git a/third_party/blink/renderer/platform/fonts/simple_font_data.h b/third_party/blink/renderer/platform/fonts/simple_font_data.h
index 96bd128a2..c75b228 100644
--- a/third_party/blink/renderer/platform/fonts/simple_font_data.h
+++ b/third_party/blink/renderer/platform/fonts/simple_font_data.h
@@ -177,6 +177,7 @@
 
   void PlatformInit(bool subpixel_ascent_descent, const FontMetricsOverride&);
   void PlatformGlyphInit();
+  void PlatformGlyphInitVerticalUpright(Glyph cjk_water_glyph);
 
   scoped_refptr<SimpleFontData> CreateScaledFontData(const FontDescription&,
                                               float scale_factor) const;
diff --git a/third_party/blink/renderer/platform/testing/font_test_helpers.cc b/third_party/blink/renderer/platform/testing/font_test_helpers.cc
index 49d6857..d297fe29 100644
--- a/third_party/blink/renderer/platform/testing/font_test_helpers.cc
+++ b/third_party/blink/renderer/platform/testing/font_test_helpers.cc
@@ -135,7 +135,8 @@
 Font CreateTestFont(const AtomicString& family_name,
                     const String& font_path,
                     float size,
-                    const FontDescription::VariantLigatures* ligatures) {
+                    const FontDescription::VariantLigatures* ligatures,
+                    void (*init_font_description)(FontDescription*)) {
   FontFamily family;
   family.SetFamily(family_name, FontFamily::Type::kFamilyName);
 
@@ -145,6 +146,8 @@
   font_description.SetComputedSize(size);
   if (ligatures)
     font_description.SetVariantLigatures(*ligatures);
+  if (init_font_description)
+    (*init_font_description)(&font_description);
 
   return Font(font_description, TestFontSelector::Create(font_path));
 }
diff --git a/third_party/blink/renderer/platform/testing/font_test_helpers.h b/third_party/blink/renderer/platform/testing/font_test_helpers.h
index d6bafb7e..56bac019 100644
--- a/third_party/blink/renderer/platform/testing/font_test_helpers.h
+++ b/third_party/blink/renderer/platform/testing/font_test_helpers.h
@@ -20,7 +20,8 @@
 Font CreateTestFont(const AtomicString& family_name,
                     const String& font_path,
                     float size,
-                    const FontDescription::VariantLigatures* = nullptr);
+                    const FontDescription::VariantLigatures* = nullptr,
+                    void (*init_font_description)(FontDescription*) = nullptr);
 
 // Reads a font from raw font data, for use in fuzzing test only.
 Font CreateTestFont(const AtomicString& family_name,
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 08b71a99..ce23036 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -3367,6 +3367,7 @@
 crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Mac10.15 ] external/wpt/fullscreen/api/document-fullscreen-enabled-cross-origin.sub.html [ Timeout ]
 crbug.com/626703 [ Win10.20h2 ] virtual/attribution-reporting-debug-mode/wpt_internal/attribution-reporting/debug-key.sub.https.html?include=trigger [ Failure Timeout ]
 crbug.com/626703 [ Mac11 ] virtual/attribution-reporting-debug-mode/wpt_internal/attribution-reporting/source-registration.sub.https.html?method=img&eligible [ Timeout ]
 crbug.com/626703 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/invalid-image-paint-error.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index e2c2088..64facab6 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -834,6 +834,7 @@
     "prefix": "third-party-storage-partitioning",
     "platforms": ["Linux", "Mac", "Win"],
     "bases": [
+      "wpt_internal/file-system-api",
       "wpt_internal/storage/quota/partitioned-webkitTemporaryStorage-usage-details.tentative.sub.html",
       "wpt_internal/storage/quota/partitioned-webkitPersistentStorage-quota-usage-details.tentative.sub.html",
       "wpt_internal/storage/quota/partitioned-webkitStorageInfo-temporary-quota-usage-details.tentative.sub.html",
@@ -850,7 +851,8 @@
       "external/wpt/webstorage/localstorage-basic-partitioned.tentative.sub.html",
       "external/wpt/webmessaging/broadcastchannel/cross-partition.https.tentative.html",
       "external/wpt/IndexedDB",
-      "external/wpt/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html"
+      "external/wpt/webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.tentative.html",
+      "fast/filesystem"
     ],
     "args": [ "--enable-features=ThirdPartyStoragePartitioning" ]
   },
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index f46a1cb0..9eb3226 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: 179e67f86c91e4229d67a32b357e11a191ebd7fa
+Version: 930bcedaf2fb7efc1b52092e6bb864b8ad22ff02
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index 16ceee04..87a54cc 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -96230,7 +96230,7 @@
       ]
      ],
      "contain-paint-clip-015.html": [
-      "c9ff98a02997729d20b8ae428e046fb86c364187",
+      "e75581cda6e6db3580f2c1dc9cd00227c135c19a",
       [
        null,
        [
@@ -96239,11 +96239,27 @@
          "=="
         ]
        ],
-       {}
+       {
+        "fuzzy": [
+         [
+          null,
+          [
+           [
+            0,
+            99
+           ],
+           [
+            0,
+            374
+           ]
+          ]
+         ]
+        ]
+       }
       ]
      ],
      "contain-paint-clip-016.html": [
-      "84b2f8e644d01f764dd486820b74bfff80c9c6e1",
+      "6a4b6af4708e11279c6a614192cfa3430ec70833",
       [
        null,
        [
@@ -96252,7 +96268,23 @@
          "=="
         ]
        ],
-       {}
+       {
+        "fuzzy": [
+         [
+          null,
+          [
+           [
+            0,
+            99
+           ],
+           [
+            0,
+            374
+           ]
+          ]
+         ]
+        ]
+       }
       ]
      ],
      "contain-paint-clip-017.html": [
@@ -305875,6 +305907,46 @@
         }
        }
       },
+      "remote-context-helper": {
+       "resources": {
+        "executor-common.js": [
+         "8df42de28c0a3e6be4c3c7f1ad2a355f3123c998",
+         []
+        ],
+        "executor-window.js": [
+         "bc9ff6faf10e665d8c84a555217f53a711d9051a",
+         []
+        ],
+        "executor-worker.js": [
+         "49ce6bd52a5a829799078823c8f3b7a450a28233",
+         []
+        ],
+        "executor.html": [
+         "9aec26345177df1859a48426dd6169c0d2d2cefa",
+         []
+        ],
+        "remote-context-helper.js": [
+         "3880e3c298bc91f18d92da6c538deff6cb4d7f69",
+         []
+        ]
+       }
+      },
+      "remote-context-helper-tests": {
+       "resources": {
+        "test-helper.js": [
+         "95d516e2752803c8de2f137de1b11f8d29405c2b",
+         []
+        ],
+        "test-script.js": [
+         "d1c02cab298ba0571a83902ce6ac0d2ff7a540ca",
+         []
+        ],
+        "test-script2.js": [
+         "f9e72c442bbc48ad22b49e88016f95ef7003c957",
+         []
+        ]
+       }
+      },
       "resources": {
        "has-iframe.html": [
         "e6dfba1011a97127c954ed628fc5abbcf051fd84",
@@ -390349,6 +390421,13 @@
         {}
        ]
       ],
+      "contain-intrinsic-size-logical-003.html": [
+       "cbba1af81aae8838f33a1dcd643e81dbd29e9a9f",
+       [
+        null,
+        {}
+       ]
+      ],
       "parsing": {
        "contain-intrinsic-size-computed.html": [
         "c03b282699777728e36dba774ecd455d98745532",
@@ -441701,6 +441780,638 @@
         ]
        ]
       },
+      "remote-context-helper-tests": {
+       "addHtml.window.js": [
+        "216febbc8305d35f24f57c34df653adca506bf7a",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addHtml.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextWrapper addHtml"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addIframe.window.js": [
+        "71de0e5e1782fcf22d4df8422e215217eb26f570",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addIframe.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextWrapper addIframe"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addScripts.window.js": [
+        "ae3e61502e6607c3cac78e8b20b4ea2b3398b8fb",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addScripts.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextWrapper addScripts"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWindow-defaults.window.js": [
+        "9b5a42149bbac382a4562cfdc1a23c30e9142d99",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-defaults.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper with defaults"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWindow-extra-config.window.js": [
+        "fcc382c2190773fbe938abcdd9ba6b2e4eec74d0",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-extra-config.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper addWindow with extra config"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWindow-features.window.js": [
+        "40cf248ee7058a46623ccf580abaa4b348098acf",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-features.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper addWindow features"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWindow-invalid-origin.window.js": [
+        "08867a0976b7f39b77375ec645d77c816a629a63",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-invalid-origin.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper addWindow with extra config"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWindow-startOn.window.js": [
+        "c0d783fd62e64dd1427a50d8fb648b690e4a2058",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-startOn.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper addWindow target"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWindow-target.window.js": [
+        "3a32e9e95a99ac787b824858bb8694e1de4af84c",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-target.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper addWindow target"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "addWorker.window.js": [
+        "e5a582d30b74495121ac8d6ed14f07ce6f99c1d1",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/addWorker.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextWrapper addWorker"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "constructor.window.js": [
+        "4e1293cca0eaa18ce2d878a07742bffe6054f209",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/constructor.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper constructor"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "navigateToNew.window.js": [
+        "f9428a030ef8219ab0db8a27d6031335d382a733",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/navigateToNew.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextWrapper navigateToNew"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "navigation-bfcache.window.js": [
+        "bb7cb3b302e70cf3aea2cca176596ba6b22e2399",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/navigation-bfcache.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper navigation using BFCache"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "navigation-helpers.window.js": [
+        "50085d16248e193a10ea9924927d0d331c2af7bb",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/navigation-helpers.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper navigation helpers"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ],
+       "navigation-same-document.window.js": [
+        "3d6e57619abdfd715128ac4e9e6bdaae134fd40b",
+        [
+         "html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html",
+         {
+          "script_metadata": [
+           [
+            "title",
+            "RemoteContextHelper navigation using BFCache"
+           ],
+           [
+            "script",
+            "/common/dispatcher/dispatcher.js"
+           ],
+           [
+            "script",
+            "/common/get-host-info.sub.js"
+           ],
+           [
+            "script",
+            "/common/utils.js"
+           ],
+           [
+            "script",
+            "/resources/testharness.js"
+           ],
+           [
+            "script",
+            "/resources/testharnessreport.js"
+           ],
+           [
+            "script",
+            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+           ],
+           [
+            "script",
+            "./resources/test-helper.js"
+           ]
+          ]
+         }
+        ]
+       ]
+      },
       "scroll-to-fragid": {
        "001.html": [
         "32599bbc500ee465df78c5e22895714dbfe18973",
@@ -442035,6 +442746,82 @@
           null,
           {}
          ]
+        ],
+        "unload-main-frame-cross-origin.window.js": [
+         "dd80405ce7745842daef15e3359291e4fa609fe1",
+         [
+          "html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.html",
+          {
+           "script_metadata": [
+            [
+             "title",
+             "Unload runs in main frame when navigating cross-origin."
+            ],
+            [
+             "script",
+             "/common/dispatcher/dispatcher.js"
+            ],
+            [
+             "script",
+             "/common/get-host-info.sub.js"
+            ],
+            [
+             "script",
+             "/common/utils.js"
+            ],
+            [
+             "script",
+             "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+            ],
+            [
+             "script",
+             "/resources/testharness.js"
+            ],
+            [
+             "script",
+             "/resources/testharnessreport.js"
+            ]
+           ]
+          }
+         ]
+        ],
+        "unload-main-frame-same-origin.window.js": [
+         "1735fc2286b81de4f22b8f8b493f4a06d55450a6",
+         [
+          "html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.html",
+          {
+           "script_metadata": [
+            [
+             "title",
+             "Unload runs in main frame when navigating same-origin."
+            ],
+            [
+             "script",
+             "/common/dispatcher/dispatcher.js"
+            ],
+            [
+             "script",
+             "/common/get-host-info.sub.js"
+            ],
+            [
+             "script",
+             "/common/utils.js"
+            ],
+            [
+             "script",
+             "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+            ],
+            [
+             "script",
+             "/resources/testharness.js"
+            ],
+            [
+             "script",
+             "/resources/testharnessreport.js"
+            ]
+           ]
+          }
+         ]
         ]
        }
       }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-015.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-015.html
index c9ff98a..e75581cd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-015.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-015.html
@@ -12,6 +12,7 @@
   -->
 
   <meta content="This test checks that the paint of the descendant (a red square image) and its geometry is clipped to the padding edge of the element's principal box, taking corner clipping into account." name="assert">
+  <meta name="fuzzy" content="maxDifference=0-99;totalPixels=0-374">
 
   <!--
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-016.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-016.html
index 84b2f8e..6a4b6af 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-016.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-clip-016.html
@@ -12,6 +12,7 @@
   -->
 
   <meta content="This test checks that the paint of the descendant (a red square image) and its geometry is clipped to the padding edge of the element's principal box, taking corner clipping into account." name="assert">
+  <meta name="fuzzy" content="maxDifference=0-99;totalPixels=0-374">
 
   <!--
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html b/third_party/blink/web_tests/external/wpt/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html
new file mode 100644
index 0000000..cbba1af81a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-sizing/contain-intrinsic-size/contain-intrinsic-size-logical-003.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html>
+<meta charset="utf8">
+<title>CSS contain-intrinsic-size: Logical versions</title>
+<link rel="author" title="Oriol Brufau" href="mailto:obrufau@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-sizing-4/#intrinsic-size-override">
+<link rel="help" href="https://drafts.csswg.org/css-contain-2/#containment-size">
+<style>
+.test {
+  contain: size;
+  display: inline-block;
+  background: green;
+}
+.test::before {
+  content: '';
+  display: block;
+  width: 40px;
+  height: 20px;
+}
+.cis-none {
+  contain-intrinsic-inline-size: none;
+  contain-intrinsic-block-size: none;
+}
+.cis-block {
+  contain-intrinsic-inline-size: none;
+  contain-intrinsic-block-size: 50px;
+}
+.cis-inline {
+  contain-intrinsic-inline-size: 100px;
+  contain-intrinsic-block-size: none;
+}
+.cis-both {
+  contain-intrinsic-inline-size: 100px;
+  contain-intrinsic-block-size: 50px;
+}
+.vertical {
+  writing-mode: vertical-lr;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<body onload="checkLayout('.test')">
+  <div id="log"></div>
+
+  <div class="test cis-none"
+       data-expected-client-width="0" data-expected-client-height="0"></div>
+  <div class="test cis-block"
+       data-expected-client-width="0" data-expected-client-height="50"></div>
+  <div class="test cis-inline"
+       data-expected-client-width="100" data-expected-client-height="0"></div>
+  <div class="test cis-both"
+       data-expected-client-width="100" data-expected-client-height="50"></div>
+
+  <div class="test cis-none vertical"
+       data-expected-client-height="0" data-expected-client-width="0"></div>
+  <div class="test cis-block vertical"
+       data-expected-client-height="0" data-expected-client-width="50"></div>
+  <div class="test cis-inline vertical"
+       data-expected-client-height="100" data-expected-client-width="0"></div>
+  <div class="test cis-both vertical"
+       data-expected-client-height="100" data-expected-client-width="50"></div>
+
+  <hr>
+
+  <img class="test cis-none" src="/css/support/60x60-green.png"
+       data-expected-client-width="0" data-expected-client-height="0">
+  <img class="test cis-block" src="/css/support/60x60-green.png"
+       data-expected-client-width="0" data-expected-client-height="50">
+  <img class="test cis-inline" src="/css/support/60x60-green.png"
+       data-expected-client-width="100" data-expected-client-height="0">
+  <img class="test cis-both" src="/css/support/60x60-green.png"
+       data-expected-client-width="100" data-expected-client-height="50">
+
+  <img class="test cis-none vertical" src="/css/support/60x60-green.png"
+       data-expected-client-height="0" data-expected-client-width="0">
+  <img class="test cis-block vertical" src="/css/support/60x60-green.png"
+       data-expected-client-height="0" data-expected-client-width="50">
+  <img class="test cis-inline vertical" src="/css/support/60x60-green.png"
+       data-expected-client-height="100" data-expected-client-width="0">
+  <img class="test cis-both vertical" src="/css/support/60x60-green.png"
+       data-expected-client-height="100" data-expected-client-width="50">
+
+  <hr>
+
+  <svg class="test cis-none"
+       data-expected-client-width="0" data-expected-client-height="0"></svg>
+  <svg class="test cis-block"
+       data-expected-client-width="0" data-expected-client-height="50"></svg>
+  <svg class="test cis-inline"
+       data-expected-client-width="100" data-expected-client-height="0"></svg>
+  <svg class="test cis-both"
+       data-expected-client-width="100" data-expected-client-height="50"></svg>
+
+  <svg class="test cis-none vertical"
+       data-expected-client-height="0" data-expected-client-width="0"></svg>
+  <svg class="test cis-block vertical"
+       data-expected-client-height="0" data-expected-client-width="50"></svg>
+  <svg class="test cis-inline vertical"
+       data-expected-client-height="100" data-expected-client-width="0"></svg>
+  <svg class="test cis-both vertical"
+       data-expected-client-height="100" data-expected-client-width="50"></svg>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/selectors-attr-many-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/selectors-attr-many-ref.html
new file mode 100644
index 0000000..7d8a9f6d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/selectors-attr-many-ref.html
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<title>Selectors: Many attribute selectors, and one that is only set</title>
+<p>This text should be black.</p>
+<p style="color: green">This text should be green.</p>
+<p style="color: blue">This text should be blue.</p>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/selectors-attr-many.html b/third_party/blink/web_tests/external/wpt/css/selectors/selectors-attr-many.html
new file mode 100644
index 0000000..b38b8f5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/selectors-attr-many.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>Selectors: Many attribute selectors, and one that is only set</title>
+<link rel="author" title="Steinar H. Gunderson" href="mailto:sesse@chromium.org">
+<link rel="help" href="https://crbug.com/1345818"/>
+<link rel="match" href="selectors-attr-many-ref.html"/>
+<style>
+[color-me] { color: green; }
+[color-me='blue'] { color: blue; }
+[color-me='blue1'] { color: blue; }
+[color-me='blue2'] { color: blue; }
+[color-me='blue3'] { color: blue; }
+[color-me='blue4'] { color: blue; }
+[color-me='blue5'] { color: blue; }
+[color-me='blue6'] { color: blue; }
+[color-me='blue7'] { color: blue; }
+[color-me='blue8'] { color: blue; }
+[color-me='blue9'] { color: blue; }
+[color-me='orange'] { color: orange; }
+[color-me='orange1'] { color: orange; }
+[color-me='orange2'] { color: orange; }
+[color-me='orange3'] { color: orange; }
+[color-me='orange4'] { color: orange; }
+[color-me='orange5'] { color: orange; }
+[color-me='orange6'] { color: orange; }
+[color-me='orange7'] { color: orange; }
+[color-me='orange8'] { color: orange; }
+[color-me='orange9'] { color: orange; }
+[color-me='green'] { color: green; }
+[color-me='green1'] { color: green; }
+[color-me='green2'] { color: green; }
+[color-me='green3'] { color: green; }
+[color-me='green4'] { color: green; }
+[color-me='green5'] { color: green; }
+[color-me='green6'] { color: green; }
+[color-me='green7'] { color: green; }
+[color-me='green8'] { color: green; }
+[color-me='green9'] { color: green; }
+[color-me='purple'] { color: purple; }
+[color-me='purple1'] { color: purple; }
+[color-me='purple2'] { color: purple; }
+[color-me='purple3'] { color: purple; }
+[color-me='purple4'] { color: purple; }
+[color-me='purple5'] { color: purple; }
+[color-me='purple6'] { color: purple; }
+[color-me='purple7'] { color: purple; }
+[color-me='purple8'] { color: purple; }
+[color-me='purple9'] { color: purple; }
+[color-me='turquoise'] { color: turquoise; }
+[color-me='turquoise1'] { color: turquoise; }
+[color-me='turquoise2'] { color: turquoise; }
+[color-me='turquoise3'] { color: turquoise; }
+[color-me='turquoise4'] { color: turquoise; }
+[color-me='turquoise5'] { color: turquoise; }
+[color-me='turquoise6'] { color: turquoise; }
+[color-me='turquoise7'] { color: turquoise; }
+[color-me='turquoise8'] { color: turquoise; }
+</style>
+<p>This text should be black.</p>
+<p color-me="unknown">This text should be green.</p>
+<p color-me="blue">This text should be blue.</p>
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addHtml.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addHtml.window.js
new file mode 100644
index 0000000..216febbc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addHtml.window.js
@@ -0,0 +1,22 @@
+// META: title=RemoteContextWrapper addHtml
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  const main = await rcHelper.addWindow();
+  await assertSimplestScriptRuns(main);
+
+  await main.addHtml('<div id=div-id>div-content</div>');
+  await assertFunctionRuns(
+      main, () => document.getElementById('div-id').textContent, 'div-content');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addIframe.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addIframe.window.js
new file mode 100644
index 0000000..71de0e5e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addIframe.window.js
@@ -0,0 +1,42 @@
+// META: title=RemoteContextWrapper addIframe
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  // Precondition: Test was loaded from the HTTP_ORIGIN.
+  assert_equals(
+      location.origin, get_host_info()['HTTP_ORIGIN'],
+      'test window was loaded on HTTP_ORIGIN');
+
+  const rcHelper = new RemoteContextHelper();
+
+  const main = await rcHelper.addWindow();
+
+  const headerName = 'x-wpt-test-header';
+  const headerValue = 'test-escaping()';
+  const iframe = await main.addIframe(
+      /*extraConfig=*/ {
+        origin: 'HTTP_REMOTE_ORIGIN',
+        scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+        headers: [[headerName, headerValue]],
+      },
+      /*attributes=*/ {id: 'test-id'},
+  );
+
+  await assertSimplestScriptRuns(iframe);
+  await assertFunctionRuns(iframe, () => testFunction(), 'testFunction exists');
+  await assertOriginIsAsExpected(iframe, get_host_info()['HTTP_REMOTE_ORIGIN']);
+  await assertHeaderIsAsExpected(iframe, headerName, headerValue);
+
+  assert_equals(
+      await main.executeScript(() => document.getElementById('test-id').id),
+      'test-id', 'verify id');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addScripts.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addScripts.window.js
new file mode 100644
index 0000000..ae3e615
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addScripts.window.js
@@ -0,0 +1,21 @@
+// META: title=RemoteContextWrapper addScripts
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  const main = await rcHelper.addWindow();
+  await assertSimplestScriptRuns(main);
+
+  await main.addScripts(['./resources/test-script.js']);
+  await assertFunctionRuns(main, () => testFunction(), 'testFunction exists');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-defaults.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-defaults.window.js
new file mode 100644
index 0000000..9b5a4214
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-defaults.window.js
@@ -0,0 +1,17 @@
+// META: title=RemoteContextHelper with defaults
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+  const main = await rcHelper.addWindow();
+  await assertSimplestScriptRuns(main);
+  await assertOriginIsAsExpected(main, location.origin);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-extra-config.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-extra-config.window.js
new file mode 100644
index 0000000..fcc382c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-extra-config.window.js
@@ -0,0 +1,38 @@
+// META: title=RemoteContextHelper addWindow with extra config
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  const header1Name = 'x-wpt-test-header1';
+  const header1Value = 'test-escaping1()';
+  const rcHelper = new RemoteContextHelper({
+    origin: 'HTTP_REMOTE_ORIGIN',
+    scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+    headers: [[header1Name, header1Value]],
+  });
+
+  const header2Name = 'x-wpt-test-header2';
+  const header2Value = 'test-escaping2()';
+  const main = await rcHelper.addWindow(
+      {
+        origin: location.origin,
+        scripts: [new URL('./resources/test-script2.js', location).toString()],
+        headers: [[header2Name, header2Value]],
+      },
+  );
+
+  await assertSimplestScriptRuns(main);
+  await assertFunctionRuns(main, () => testFunction(), 'testFunction exists');
+  await assertFunctionRuns(main, () => testFunction2(), 'testFunction2 exists');
+  await assertOriginIsAsExpected(main, location.origin);
+  await assertHeaderIsAsExpected(main, header1Name, header1Value);
+  await assertHeaderIsAsExpected(main, header2Name, header2Value);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-features.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-features.window.js
new file mode 100644
index 0000000..40cf248
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-features.window.js
@@ -0,0 +1,25 @@
+// META: title=RemoteContextHelper addWindow features
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+  {
+    const main = await rcHelper.addWindow();
+    await assertSimplestScriptRuns(main);
+    await assertWindowHasOpenerEquals(main, true);
+  }
+  {
+    const main = await rcHelper.addWindow(
+        /*extraConfig=*/ null, /*options=*/ {features: 'noopener'});
+    await assertSimplestScriptRuns(main);
+    await assertWindowHasOpenerEquals(main, false);
+  }
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-invalid-origin.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-invalid-origin.window.js
new file mode 100644
index 0000000..08867a0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-invalid-origin.window.js
@@ -0,0 +1,23 @@
+// META: title=RemoteContextHelper addWindow with extra config
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  const header1Name = 'x-wpt-test-header1';
+  const header1Value = 'test-escaping1()';
+  const rcHelper = new RemoteContextHelper({
+    origin: 'INVALID',
+  });
+
+  promise_rejects_js(
+      t, RangeError, rcHelper.addWindow(),
+      'Exception should be thrown for invalid origin.');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-startOn.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-startOn.window.js
new file mode 100644
index 0000000..c0d783f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-startOn.window.js
@@ -0,0 +1,21 @@
+// META: title=RemoteContextHelper addWindow target
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+  const main = await rcHelper.addWindow({startOn: 'pageshow'});
+  await assertSimplestScriptRuns(main);
+  await assert_equals(
+      await main.executeScript(() => {
+        return executorStartEvent.type;
+      }),
+      'pageshow');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-target.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-target.window.js
new file mode 100644
index 0000000..3a32e9e9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWindow-target.window.js
@@ -0,0 +1,19 @@
+// META: title=RemoteContextHelper addWindow target
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+  const name = 'a name';
+  const main = await rcHelper.addWindow(
+      /*extraConfig=*/ null, /*options=*/ {target: name});
+  await assertSimplestScriptRuns(main);
+  await assertWindowNameEquals(main, name);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWorker.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWorker.window.js
new file mode 100644
index 0000000..e5a582d3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/addWorker.window.js
@@ -0,0 +1,31 @@
+// META: title=RemoteContextWrapper addWorker
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  const main = await rcHelper.addWindow();
+
+  const headerName = 'x-wpt-test-header';
+  const headerValue = 'test-escaping()';
+  const worker = await main.addWorker(
+      {
+        scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+        headers: [[headerName, headerValue]],
+      },
+  );
+
+  await assertSimplestScriptRuns(worker);
+  await assertFunctionRuns(worker, () => testFunction(), 'testFunction exists');
+  await assertOriginIsAsExpected(worker, location.origin);
+  await assertHeaderIsAsExpected(worker, headerName, headerValue);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/constructor.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/constructor.window.js
new file mode 100644
index 0000000..4e1293c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/constructor.window.js
@@ -0,0 +1,40 @@
+// META: title=RemoteContextHelper constructor
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+// This tests that arguments passed to the constructor are respected.
+promise_test(async t => {
+  // Precondition: Test was loaded from the HTTP_ORIGIN.
+  assert_equals(
+      location.origin, get_host_info()['HTTP_ORIGIN'],
+      'test window was loaded on HTTP_ORIGIN');
+
+  const headerName = 'x-wpt-test-header';
+  const headerValue = 'test-escaping()';
+  const rcHelper = new RemoteContextHelper({
+    origin: 'HTTP_REMOTE_ORIGIN',
+    scripts: [
+      '/common/get-host-info.sub.js',
+      './resources/test-script.js',
+    ],
+    headers: [[headerName, headerValue]],
+  });
+
+
+  const main = await rcHelper.addWindow();
+
+  await assertSimplestScriptRuns(main);
+  await assertFunctionRuns(main, () => testFunction(), 'testFunction exists');
+
+  // Verify that the origin is different.
+  await assertOriginIsAsExpected(main, get_host_info()['HTTP_REMOTE_ORIGIN']);
+
+  await assertHeaderIsAsExpected(main, headerName, headerValue);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigateToNew.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigateToNew.window.js
new file mode 100644
index 0000000..f9428a0
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigateToNew.window.js
@@ -0,0 +1,39 @@
+// META: title=RemoteContextWrapper navigateToNew
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  // Precondition: Test was loaded from the HTTP_ORIGIN.
+  assert_equals(
+      location.origin, get_host_info()['HTTP_ORIGIN'],
+      'test window was loaded on HTTP_ORIGIN');
+
+  const rcHelper = new RemoteContextHelper();
+
+  const main = await rcHelper.addWindow();
+
+  const headerName = 'x-wpt-test-header';
+  const headerValue = 'test-escaping()';
+  const newMain = await main.navigateToNew(
+      {
+        origin: 'HTTP_REMOTE_ORIGIN',
+        scripts: ['/common/get-host-info.sub.js', './resources/test-script.js'],
+        headers: [[headerName, headerValue]],
+      },
+  );
+
+  await assertSimplestScriptRuns(newMain);
+  await assertFunctionRuns(
+      newMain, () => testFunction(), 'testFunction exists');
+
+  const remoteOrigin = get_host_info()['HTTP_REMOTE_ORIGIN'];
+  await assertOriginIsAsExpected(newMain, remoteOrigin);
+  await assertHeaderIsAsExpected(newMain, headerName, headerValue);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-bfcache.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-bfcache.window.js
new file mode 100644
index 0000000..bb7cb3b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-bfcache.window.js
@@ -0,0 +1,37 @@
+// META: title=RemoteContextHelper navigation using BFCache
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  // Open a window with noopener so that BFCache will work.
+  const rc1 = await rcHelper.addWindow(
+      /*config=*/ null, /*options=*/ {features: 'noopener'});
+
+  // Add a pageshow listener to stash the event.
+  await rc1.executeScript(() => {
+    window.addEventListener('pageshow', (event) => {
+      window.pageshowEvent = event;
+    });
+  });
+
+  // Navigate away.
+  const rc2 = await rc1.navigateToNew();
+  await assertSimplestScriptRuns(rc2);
+
+  // Navigate back.
+  rc2.historyBack();
+
+  // Verify that the document was BFCached.
+  assert_true(await rc1.executeScript(() => {
+    return window.pageshowEvent.persisted;
+  }));
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-helpers.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-helpers.window.js
new file mode 100644
index 0000000..50085d1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-helpers.window.js
@@ -0,0 +1,29 @@
+// META: title=RemoteContextHelper navigation helpers
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+  const rc1 = await rcHelper.addWindow();
+  await assertSimplestScriptRuns(rc1);
+
+  const rc2 = await rc1.navigateToNew();
+  await assertSimplestScriptRuns(rc2);
+
+  rc2.historyBack();
+  await assertSimplestScriptRuns(rc1);
+
+  rc1.historyForward();
+  await assertSimplestScriptRuns(rc2);
+
+  const rc3 = await rc2.navigateToNew();
+  rc3.historyGo(-2);
+  await assertSimplestScriptRuns(rc1);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.js
new file mode 100644
index 0000000..3d6e5761
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.js
@@ -0,0 +1,43 @@
+// META: title=RemoteContextHelper navigation using BFCache
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=./resources/test-helper.js
+
+'use strict';
+
+async function assertLocationIs(remoteContextWrapper, expectedLocation) {
+  assert_equals(
+      await remoteContextWrapper.executeScript(() => {
+        return location.toString();
+      }),
+      expectedLocation, 'verify location');
+}
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  const rc = await rcHelper.addWindow();
+
+  const oldLocation = await rc.executeScript(() => {
+    return location.toString();
+  });
+  const newLocation = oldLocation + '#fragment';
+
+  // Navigate to same document.
+  rc.navigate((newLocation) => {
+    location = newLocation;
+  }, [newLocation]);
+
+  // Verify that the window navigated.
+  await assertLocationIs(rc, newLocation);
+
+  // Navigate back.
+  await rc.historyBack(oldLocation);
+
+  // Verify that the window navigated back and the executor is running.
+  await assertLocationIs(rc, oldLocation);
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-helper.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-helper.js
new file mode 100644
index 0000000..95d516e2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-helper.js
@@ -0,0 +1,48 @@
+async function assertSimplestScriptRuns(remoteContextWrapper) {
+  assert_equals(
+      await remoteContextWrapper.executeScript(() => {
+        return 1;
+      }),
+      1, 'simplest script runs');
+}
+
+async function assertFunctionRuns(
+    remoteContextWrapper, functionToRun, expectedReturn) {
+  assert_equals(
+      await remoteContextWrapper.executeScript(functionToRun), expectedReturn,
+      'function runs');
+}
+
+async function assertOriginIsAsExpected(remoteContextWrapper, expectedOrigin) {
+  assert_equals(
+      await remoteContextWrapper.executeScript(() => {
+        return location.origin;
+      }),
+      expectedOrigin, 'verify origin');
+}
+
+async function assertWindowNameEquals(remoteContextWrapper, expectedName) {
+  assert_equals(
+      await remoteContextWrapper.executeScript(() => {
+        return window.name;
+      }),
+      expectedName, 'verify name');
+}
+
+async function assertWindowHasOpenerEquals(remoteContextWrapper, hasParent) {
+  assert_equals(
+      await remoteContextWrapper.executeScript(() => {
+        return !!window.opener;
+      }),
+      hasParent, 'verify opener');
+}
+
+async function assertHeaderIsAsExpected(
+    remoteContextWrapper, headerName, headerValue) {
+  assert_equals(
+      headerValue,
+      await remoteContextWrapper.executeScript(async (headerName) => {
+        const res = await fetch(location);
+        return res.headers.get(headerName);
+      }, [headerName]), 'header is set');
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-script.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-script.js
new file mode 100644
index 0000000..d1c02cab
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-script.js
@@ -0,0 +1,3 @@
+function testFunction() {
+  return 'testFunction exists';
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-script2.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-script2.js
new file mode 100644
index 0000000..f9e72c4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/resources/test-script2.js
@@ -0,0 +1,3 @@
+function testFunction2() {
+  return 'testFunction2 exists';
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-common.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-common.js
new file mode 100644
index 0000000..8df42de
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-common.js
@@ -0,0 +1,17 @@
+// Functions available by default in the executor.
+
+'use strict';
+
+let executor;
+
+// Expects addScript to be present (window or worker version).
+function addScripts(urls) {
+  return Promise.all(urls.map(addScript));
+}
+
+function startExecutor() {
+  const params = new URLSearchParams(location.search);
+  addScripts(params.getAll('script'));
+  const uuid = params.get('uuid');
+  executor = new Executor(uuid);
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js
new file mode 100644
index 0000000..bc9ff6f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-window.js
@@ -0,0 +1,70 @@
+// Functions available by default in the executor.
+
+'use strict';
+
+let executorStartEvent = null;
+
+function requestExecutor() {
+  const params = new URLSearchParams(location.search);
+  const startOn = params.get('startOn');
+
+  if (startOn) {
+    addEventListener(startOn, (e) => {
+      executorStartEvent = e;
+      startExecutor();
+    });
+  } else {
+    startExecutor();
+  }
+}
+
+function addScript(url) {
+  const script = document.createElement('script');
+  script.src = url;
+  const promise = new Promise((resolve, reject) => {
+    script.onload = () => resolve(url);
+    script.onerror = (e) => reject(e);
+  });
+  document.body.appendChild(script);
+  return promise;
+}
+
+/**
+ * Suspends the executor and executes the function in `fnString` when it has
+ * suspended. Installs a pageshow handler to resume the executor if the
+ * document is BFCached. Installs a hashchange handler to detect when the
+ * navigation did not change documents.
+ *
+ * This returns nothing because fn is invoke after waiting for the document to
+ * be suspended. If we were to return a promise, the executor could not suspend
+ * until that promise resolved but the promise cannot resolve until the executor
+ * is suspended. This could be avoided by adding support
+ * directly in the dispatcher for tasks suspend immediately after execution.
+ *
+ * @param {string} fnString A stringified function to be executed.
+ * @param {any[]} args The arguments to pass to the function.
+ */
+function executeScriptToNavigate(fnString, args) {
+  // Only one of these listeners should run.
+  const controller = new AbortController();
+  window.addEventListener('pageshow', (event) => {
+    controller.abort();
+    executor.resume();
+  }, {signal: controller.signal, once: true});
+  window.addEventListener('hashchange', (event) => {
+    controller.abort();
+    const oldURLObject = new URL(event.oldURL);
+    const newURLObject = new URL(event.newURL);
+    oldURLObject.hash = '';
+    newURLObject.hash = '';
+    // If only the hash-fragment changed then the navigation was
+    // same-document and we should resume the executor.
+    if (oldURLObject.toString() == newURLObject.toString()) {
+      executor.resume();
+    }
+  }, {signal: controller.signal, once: true});
+
+  executor.suspend(() => {
+    eval(fnString).apply(null, args);
+  });
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-worker.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-worker.js
new file mode 100644
index 0000000..49ce6bd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor-worker.js
@@ -0,0 +1,9 @@
+'use strict';
+
+importScripts('/common/dispatcher/dispatcher.js', './executor-common.js');
+
+function addScript(url) {
+  importScripts(url);
+}
+
+startExecutor();
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor.html b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor.html
new file mode 100644
index 0000000..9aec263
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/executor.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="./executor-common.js"></script>
+<script src="./executor-window.js"></script>
+
+<body>
+  <script>
+    requestExecutor();
+  </script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
new file mode 100644
index 0000000..3880e3c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
@@ -0,0 +1,498 @@
+'use strict';
+
+// Requires:
+// - /common/dispatcher/dispatcher.js
+// - /common/utils.js
+// - /common/get-host-info.sub.js if automagic conversion of origin names to
+// URLs is used.
+
+/**
+ * This provides a more friendly interface to remote contexts in dispatches.js.
+ * The goal is to make it easy to write multi-window/-frame/-worker tests where
+ * the logic is entirely in 1 test file and there is no need to check in any
+ * other file (although it is often helpful to check in files of JS helper
+ * functions that are shared across remote context).
+ *
+ * So for example, to test that history traversal works, we create a new window,
+ * navigate it to a new document, go back and then go forward.
+ *
+ * @example
+ * promise_test(async t => {
+ *   const rcHelper = new RemoteContextHelper();
+ *   const rc1 = await rcHelper.addWindow();
+ *   const rc2 = await rc1.navigateToNew();
+ *   assert_equals(await rc2.executeScript(() => 'here'), 'here', 'rc2 is live');
+ *   rc2.historyBack();
+ *   assert_equals(await rc1.executeScript(() => 'here'), 'here', 'rc1 is live');
+ *   rc1.historyForward();
+ *   assert_equals(await rc2.executeScript(() => 'here'), 'here', 'rc2 is live');
+ * });
+ *
+ * Note on the correspondence between remote contexts and
+ * `RemoteContextWrapper`s. A remote context is entirely determined by its URL.
+ * So navigating away from one and then back again will result in a remote
+ * context that can be controlled by the same `RemoteContextWrapper` instance
+ * before and after navigation. Messages sent to a remote context while it is
+ * destroyed or in BFCache will be queued and processed if that that URL is
+ * navigated back to.
+ *
+ * Navigation:
+ * This framework does not keep track of the history of the frame tree and so it
+ * is up to the test script to keep track of what remote contexts are currently
+ * active and to keep references to the corresponding `RemoteContextWrapper`s.
+ *
+ * Any action that leads to navigation in the remote context must be executed
+ * using
+ * @see RemoteContextWrapper.navigate.
+ */
+
+{
+  const RESOURCES_PATH =
+      '/html/browsers/browsing-the-web/remote-context-helper/resources';
+  const WINDOW_EXECUTOR_PATH = `${RESOURCES_PATH}/executor.html`;
+  const WORKER_EXECUTOR_PATH = `${RESOURCES_PATH}/executor-worker.js`;
+
+  /**
+   * Turns a string into an origin. If `origin` is null this will return the
+   * current document's origin. If `origin` contains not '/', this will attempt
+   * to use it as an index in `get_host_info()`. Otherwise returns the input
+   * origin.
+   * @private
+   * @param {string|null} origin The input origin.
+   * @return {string|null} The output origin.
+   * @throws {RangeError} is `origin` cannot be found in
+   *     `get_host_info()`.
+   */
+  function finalizeOrigin(origin) {
+    if (!origin) {
+      return location.origin;
+    }
+    if (origin.indexOf('/') == -1) {
+      const origins = get_host_info();
+      if (origin in origins) {
+        return origins[origin];
+      } else {
+        throw new RangeError(
+            `${origin} is not a key in the get_host_info() object`);
+      }
+    }
+    return origin;
+  }
+
+  /**
+   * @private
+   * @param {string} url
+   * @returns {string} Absolute url using `location` as the base.
+   */
+  function makeAbsolute(url) {
+    return new URL(url, location).toString();
+  }
+
+  /**
+   * Represents a configuration for a remote context executor.
+   */
+  class RemoteContextConfig {
+    /**
+     * @param {string} origin A URL or a key in `get_host_info()`. @see finalizeOrigin for how origins are handled.
+     * @param {string[]} scripts  A list of script URLs. The current document
+     *     will be used as the base for relative URLs.
+     * @param {[string, string][]} headers  A list of pairs of name and value.
+     *     The executor will be served with these headers set.
+     * @param {string} startOn If supplied, the executor will start when this
+     *     event occurs, e.g. "pageshow",
+     *  (@see window.addEventListener). This only makes sense for window-based executors, not worker-based.
+     *
+     */
+    constructor(
+        {origin = null, scripts = [], headers = [], startOn = null} = {}) {
+      this.origin = origin;
+      this.scripts = scripts;
+      this.headers = headers;
+      this.startOn = startOn;
+    }
+
+    /**
+     * If `config` is not already a `RemoteContextConfig`, one is constructed
+     * using `config`.
+     * @private
+     * @param {object} config
+     * @returns
+     */
+    static ensure(config) {
+      if (!config) {
+        return DEFAULT_CONTEXT_CONFIG;
+      }
+      return new RemoteContextConfig(config);
+    }
+
+    /**
+     * Merges `this` with another `RemoteContextConfig` and to give a new
+     * `RemoteContextConfig`. `origin` is replaced by the other if present,
+     * `headers` and `scripts` are concatenated with `this`'s coming first.
+     * @param {RemoteContextConfig} extraConfig
+     * @returns {RemoteContextConfig}
+     */
+    merged(extraConfig) {
+      let origin = this.origin;
+      if (extraConfig.origin) {
+        origin = extraConfig.origin;
+      }
+      let startOn = this.startOn;
+      if (extraConfig.startOn !== null) {
+        startOn = extraConfig.startOn;
+      }
+      const headers = this.headers.concat(extraConfig.headers);
+      const scripts = this.scripts.concat(extraConfig.scripts);
+      return new RemoteContextConfig({
+        origin: origin,
+        headers: headers,
+        scripts: scripts,
+        startOn: startOn,
+      });
+    }
+  }
+
+  /**
+   * The default `RemoteContextConfig` to use if none is supplied. It has no
+   * origin, headers or scripts.
+   * @constant {RemoteContextConfig}
+   */
+  const DEFAULT_CONTEXT_CONFIG = new RemoteContextConfig();
+
+  /**
+   * This class represents a configuration for creating remote contexts. This is
+   * the entry-point
+   * for creating remote contexts, providing @see addWindow .
+   */
+  class RemoteContextHelper {
+    /**
+     * @param {RemoteContextConfig|object} config The configuration
+     *     for this remote context.
+     */
+    constructor(config = null) {
+      this.config = RemoteContextConfig.ensure(config);
+    }
+
+    /**
+     * Creates a new remote context and returns a `RemoteContextWrapper` giving
+     * access to it.
+     * @private
+     * @param {(url: string) => RemoteContext} executorCreator A function that
+     *     takes a URL and returns a context, e.g. an iframe or window.
+     * @param {RemoteContextConfig|object|null} extraConfig If
+     *     supplied, extra configuration for this remote context to be merged
+     * with `this`'s existing config. If it's not a `RemoteContextConfig`, it
+     * will be used to construct a new one.
+     * @returns {RemoteContextWrapper}
+     */
+    async createContext({
+      executorCreator: executorCreator,
+      extraConfig = null,
+      isWorker = false,
+    }) {
+      const config =
+          this.config.merged(RemoteContextConfig.ensure(extraConfig));
+
+      const origin = finalizeOrigin(config.origin);
+      const url = new URL(
+          isWorker ? WORKER_EXECUTOR_PATH : WINDOW_EXECUTOR_PATH, origin);
+
+      // UUID is needed for executor.
+      const uuid = token();
+      url.searchParams.append('uuid', uuid);
+
+      if (config.headers) {
+        addHeaders(url, config.headers);
+      }
+      for (const script of config.scripts) {
+        url.searchParams.append('script', makeAbsolute(script));
+      }
+
+      if (config.startOn) {
+        url.searchParams.append('startOn', config.startOn);
+      }
+
+      executorCreator(url);
+      return new RemoteContextWrapper(new RemoteContext(uuid), this);
+    }
+
+    /**
+     * Creates a window with a remote context. @see createContext for
+     * @param {RemoteContextConfig|object} extraConfig Will be
+     *     merged with `this`'s config.
+     * @param {string} options.target Passed to `window.open` as the 2nd
+     *     argument
+     * @param {string} options.features Passed to `window.open` as the 3rd
+     *     argument
+     * @returns {RemoteContextWrapper}
+     */
+    addWindow(extraConfig = null, options = {
+      target: null,
+      features: null,
+    }) {
+      return this.createContext({
+        executorCreator: windowExecutorCreator(options),
+        extraConfig: extraConfig,
+      });
+    }
+  }
+  // Export this class.
+  self.RemoteContextHelper = RemoteContextHelper;
+
+  /**
+   * Attaches header to the URL. See
+   * https://web-platform-tests.org/writing-tests/server-pipes.html#headers
+   * @param {string} url the URL to which headers should be attached.
+   * @param {[[string, string]]} headers a list of pairs of head-name,
+   *     header-value.
+   */
+  function addHeaders(url, headers) {
+    function escape(s) {
+      return s.replace('(', '\\(').replace(')', '\\)');
+    }
+    const formattedHeaders = headers.map((header) => {
+      return `header(${escape(header[0])}, ${escape(header[1])})`;
+    });
+    url.searchParams.append('pipe', formattedHeaders.join('|'));
+  }
+
+  function windowExecutorCreator({target, features}) {
+    if (!target) {
+      target = '_blank';
+    }
+    return url => {
+      window.open(url, target, features);
+    };
+  }
+
+  function elementExecutorCreator(
+      remoteContextWrapper, elementName, attributes) {
+    return url => {
+      remoteContextWrapper.executeScript((url, elementName, attributes) => {
+        const el = document.createElement(elementName);
+        for (const attribute in attributes) {
+          el.setAttribute(attribute, attributes[attribute]);
+        }
+        el.src = url;
+        document.body.appendChild(el);
+      }, [url, elementName, attributes]);
+    };
+  }
+
+  function workerExecutorCreator() {
+    return url => {
+      new Worker(url);
+    };
+  }
+
+  function navigateExecutorCreator(remoteContextWrapper) {
+    return url => {
+      remoteContextWrapper.navigate((url) => {
+        window.location = url;
+      }, [url]);
+    };
+  }
+
+  /**
+   * This class represents a remote context running an executor (a
+   * window/frame/worker that can receive commands). It is the interface for
+   * scripts to control remote contexts.
+   *
+   * Instances are returned when new remote contexts are created (e.g.
+   * `addFrame` or `navigateToNew`).
+   */
+  class RemoteContextWrapper {
+    /**
+     * This should only be constructed by `RemoteContextHelper`.
+     * @private
+     */
+    constructor(context, helper) {
+      this.context = context;
+      this.helper = helper;
+    }
+
+    /**
+     * Executes a script in the remote context.
+     * @param {function} fn The script to execute.
+     * @param {any[]} args An array of arguments to pass to the script.
+     * @returns {any} The return value of the script (after being serialized and
+     *     deserialized).
+     */
+    async executeScript(fn, args) {
+      return this.context.execute_script(fn, args);
+    }
+
+    /**
+     * Adds a string of HTML to the executor's document.
+     * @param {string} html
+     * @returns
+     */
+    async addHtml(html) {
+      return this.executeScript((htmlSource) => {
+        document.body.insertAdjacentHTML('beforebegin', htmlSource);
+      }, [html]);
+    }
+
+    /**
+     * Adds scripts to the executor's document.
+     * @param {string[]} urls A list of URLs. URLs are relative to the current
+     *     document.
+     * @returns
+     */
+    async addScripts(urls) {
+      if (!urls) {
+        return [];
+      }
+      return this.executeScript(urls => {
+        return addScripts(urls);
+      }, [urls.map(makeAbsolute)]);
+    }
+
+    /**
+     * Adds an iframe to the current document.
+     * @param {RemoteContextConfig} extraConfig
+     * @param {[string, string][]} options.attributes A list of pairs of strings
+     *     of attribute name and value these will be set on the iframe element
+     *     when added to the document.
+     * @returns {RemoteContextWrapper} The remote context.
+     */
+    addIframe(extraConfig = null, attributes = {}) {
+      return this.helper.createContext({
+        executorCreator: elementExecutorCreator(this, 'iframe', attributes),
+        extraConfig: extraConfig,
+      });
+    }
+
+    /**
+     * Adds a dedicated worker to the current document.
+     * @param {RemoteContextConfig} extraConfig
+     * @returns {RemoteContextWrapper} The remote context.
+     */
+    addWorker(extraConfig = null) {
+      return this.helper.createContext({
+        executorCreator: workerExecutorCreator(),
+        extraConfig: extraConfig,
+        isWorker: true,
+      });
+    }
+
+    /**
+     * Executes a script in the remote context that will perform a navigation.
+     * To do this safely, we must suspend the executor and wait for that to
+     * complete before executing. This ensures that all outstanding requests are
+     * completed and no more can start. It also ensures that the executor will
+     * restart if the page goes into BFCache or it was a same-document
+     * navigation. It does not return a value.
+     *
+     * NOTE: We cannot monitor whether and what navigations are happening. The
+     * logic has been made as robust as possible but is not fool-proof.
+     *
+     * Foolproof rule:
+     * - The script must perform exactly one navigation.
+     * - If that navigation is a same-document history navigation, you must
+     * `await` the result of `waitUntilLocationIs`.
+     *
+     * More complex rules:
+     * - The script must perform a navigation. If it performs no navigation,
+     *   the remote context will be left in the suspended state.
+     * - If the script performs a direct same-document navigation, it is not
+     * necessary to use this function but it will work as long as it is the only
+     *   navigation performed.
+     * - If the script performs a same-document history navigation, you must
+     * `await` the result of `waitUntilLocationIs`.
+     *
+     * @param {function} fn The script to execute.
+     * @param {any[]} args An array of arguments to pass to the script.
+     */
+    navigate(fn, args) {
+      this.executeScript((fnText, args) => {
+        executeScriptToNavigate(fnText, args);
+      }, [fn.toString(), args]);
+    }
+
+    /**
+     * Navigates the context to a new document running an executor.
+     * @param {RemoteContextConfig} extraConfig
+     * @returns {RemoteContextWrapper} The remote context.
+     */
+    async navigateToNew(extraConfig = null) {
+      return this.helper.createContext({
+        executorCreator: navigateExecutorCreator(this),
+        extraConfig: extraConfig,
+      });
+    }
+
+    //////////////////////////////////////
+    // Navigation Helpers.
+    //
+    // It is up to the test script to know which remote context will be
+    // navigated to and which `RemoteContextWrapper` should be used after
+    // navigation.
+    //
+    // NOTE: For a same-document history navigation, the caller use `await` a
+    // call to `waitUntilLocationIs` in order to know that the navigation has
+    // completed. For convenience the method below can return the promise to
+    // wait on, if passed the expected location.
+
+    async waitUntilLocationIs(expectedLocation) {
+      return this.executeScript(async (expectedLocation) => {
+        if (location == expectedLocation) {
+          return;
+        }
+
+        // Wait until the location updates to the expected one.
+        await new Promise(resolve => {
+          const listener = addEventListener('hashchange', (event) => {
+            if (event.newURL == expectedLocation) {
+              removeEventListener(listener);
+              resolve();
+            }
+          });
+        });
+      }, [expectedLocation]);
+    }
+
+    /**
+     * Performs a history traversal.
+     * @param {integer} n How many steps to traverse. @see history.go
+     * @param {string} expectedLocation If supplied will be passed to @see waitUntilLocationIs.
+     * @returns The return value of `waitUntilLocationIs` or nothing.
+     */
+    async historyGo(n, expectedLocation = null) {
+      this.navigate((n) => {
+        history.go(n);
+      }, [n]);
+      if (expectedLocation) {
+        return this.waitUntilLocationIs(expectedLocation);
+      }
+    }
+
+    /**
+     * Performs a history traversal back.
+     * @param {string} expectedLocation If supplied will be passed to @see waitUntilLocationIs.
+     * @returns The return value of `waitUntilLocationIs` or nothing.
+     */
+    async historyBack(expectedLocation = null) {
+      this.navigate(() => {
+        history.back();
+      });
+      if (expectedLocation) {
+        return this.waitUntilLocationIs(expectedLocation);
+      }
+    }
+
+    /**
+     * Performs a history traversal back.
+     * @param {string} expectedLocation If supplied will be passed to @see waitUntilLocationIs.
+     * @returns The return value of `waitUntilLocationIs` or nothing.
+     */
+    async historyForward(expectedLocation = null) {
+      this.navigate(() => {
+        history.forward();
+      });
+      if (expectedLocation) {
+        return this.waitUntilLocationIs(expectedLocation);
+      }
+    }
+  }
+}
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.js
new file mode 100644
index 0000000..dd80405c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-cross-origin.window.js
@@ -0,0 +1,36 @@
+// META: title=Unload runs in main frame when navigating cross-origin.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  const rc1 = await rcHelper.addWindow();
+
+  t.add_cleanup(() => localStorage.removeItem('unload'));
+
+  // Initialize storage and add "unload" event handler.
+  await rc1.executeScript(() => {
+    localStorage.setItem('unload', 'not yet');
+    addEventListener('unload', () => {
+      localStorage.setItem('unload', 'ran');
+    });
+  });
+
+  // Navigate away.
+  const rc2 = await rc1.navigateToNew(
+      {extraRemoteContextConfig: {origin: 'HTTP_REMOTE_ORIGIN'}});
+
+  // Navigate back.
+  await rc2.historyBack();
+
+  // Test that the unload handler wrote to storage.
+  // Running it in the remote context after going back should ensure that the
+  // navigation (and therefore the unload handler) has completed.
+  assert_equals(
+      await rc1.executeScript(() => localStorage.getItem('unload')), 'ran');
+});
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.js
new file mode 100644
index 0000000..1735fc22
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/unloading-documents/unload/unload-main-frame-same-origin.window.js
@@ -0,0 +1,35 @@
+// META: title=Unload runs in main frame when navigating same-origin.
+// META: script=/common/dispatcher/dispatcher.js
+// META: script=/common/get-host-info.sub.js
+// META: script=/common/utils.js
+// META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js
+// META: script=/resources/testharness.js
+// META: script=/resources/testharnessreport.js
+
+promise_test(async t => {
+  const rcHelper = new RemoteContextHelper();
+
+  const rc1 = await rcHelper.addWindow();
+
+  t.add_cleanup(() => localStorage.removeItem('unload'));
+
+  // Initialize storage and add "unload" event handler.
+  await rc1.executeScript(() => {
+    localStorage.setItem('unload', 'not yet');
+    addEventListener('unload', () => {
+      localStorage.setItem('unload', 'ran');
+    });
+  });
+
+  // Navigate away.
+  const rc2 = await rc1.navigateToNew();
+
+  // Navigate back.
+  await rc2.historyBack();
+
+  // Test that the unload handler wrote to storage.
+  // Running it in the remote context after going back should ensure that the
+  // navigation (and therefore the unload handler) has completed.
+  assert_equals(
+      await rc1.executeScript(() => localStorage.getItem('unload')), 'ran');
+});
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/200.https.asis b/third_party/blink/web_tests/external/wpt/resource-timing/resources/200.https.asis
new file mode 100644
index 0000000..5b7c25f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/200.https.asis
@@ -0,0 +1,5 @@
+HTTP/1.0 200 OK
+Content-Length: 0
+Timing-Allow-Origin: *
+
+
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/secure-iframe-in-insecure-context.html b/third_party/blink/web_tests/external/wpt/resource-timing/secure-iframe-in-insecure-context.html
new file mode 100644
index 0000000..87f47111
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/resource-timing/secure-iframe-in-insecure-context.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="resources/observe-entry.js"></script>
+
+<body>
+</body>
+<script>
+  const { HTTPS_ORIGIN } = get_host_info();
+
+  promise_test(async t => {
+    const iframe = document.createElement('iframe');
+    iframe.src = `${HTTPS_ORIGIN}/resource-timing/resources/200.https.asis?1`;
+    document.body.appendChild(iframe);
+    t.add_cleanup(() => iframe.remove());
+    const entry = await observe_entry(iframe.src);
+    assert_not_equals(entry.secureConnectionStart, 0);
+  }, 'secureConnectionStart is reported for iframes loaded over https in http context');
+
+  promise_test(async t => {
+    const object = document.createElement('object');
+    object.data = `${HTTPS_ORIGIN}/resource-timing/resources/200.https.asis?2`;
+    document.body.appendChild(object);
+    t.add_cleanup(() => object.remove());
+    const entry = await observe_entry(object.data);
+    assert_not_equals(entry.secureConnectionStart, 0);
+  }, 'secureConnectionStart is reported for object documents loaded over https in http context');
+</script>
+
+</html>
diff --git a/third_party/blink/web_tests/http/tests/devtools/resource-tree/resource-tree-invalid-mime-type-css-content.js b/third_party/blink/web_tests/http/tests/devtools/resource-tree/resource-tree-invalid-mime-type-css-content.js
index 500cd52..e44426b 100644
--- a/third_party/blink/web_tests/http/tests/devtools/resource-tree/resource-tree-invalid-mime-type-css-content.js
+++ b/third_party/blink/web_tests/http/tests/devtools/resource-tree/resource-tree-invalid-mime-type-css-content.js
@@ -18,9 +18,9 @@
   TestRunner.assertEquals(
       cssResource.resourceType(), Common.resourceTypes.Stylesheet, 'Resource type should be Stylesheet.');
   TestRunner.assertTrue(!cssResource.failed, 'Resource loading failed.');
-  await cssResource.requestContent();
+  const {isEncoded} = await cssResource.requestContent();
 
-  var content = (await cssResource.contentEncoded()) ? window.atob(cssResource.content) : cssResource.content;
+  var content = isEncoded ? window.atob(cssResource.content) : cssResource.content;
   TestRunner.addResult('Resource.content: ' + content);
   TestRunner.completeTest();
 })();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-request-database-names.js b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-request-database-names.js
new file mode 100644
index 0000000..9250ee6
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/storage/indexed-db-storage-key-request-database-names.js
@@ -0,0 +1,50 @@
+(async function(testRunner) {
+  const {dp, session} = await testRunner.startBlank(
+      `Tests that requesting database names works for IndexedDB with storageKey\n`);
+
+  await dp.IndexedDB.enable();
+  await dp.Page.enable();
+
+  testRunner.log(`Open some databases`);
+
+  // Create some databases.
+  const value = await session.evaluateAsync(`
+    new Promise(async resolve => {
+      let databaseNames = [];
+      for (let i = 0; i < 5; i++) {
+        const request = window.indexedDB.open("test-database" + i);
+        request.onerror = (event) => {
+          resolve('failed');
+        };
+        request.onsuccess = (event) => {
+          databaseNames.push("test-database" + i);
+          if (databaseNames.length === 5) {
+            resolve(databaseNames);
+          }
+        }
+      }
+    })
+  `);
+
+  testRunner.log(value, 'databases created with following names');
+  testRunner.log(`\nRequest database names for storage key`);
+
+  const frameId = (await dp.Page.getResourceTree()).result.frameTree.frame.id;
+  const storageKey =
+      (await dp.Storage.getStorageKeyForFrame({frameId})).result.storageKey;
+  const requestDatabaseNamesResult =
+      (await dp.IndexedDB.requestDatabaseNames({
+        storageKey,
+      })).result;
+
+  testRunner.log(requestDatabaseNamesResult, 'database names');
+
+  // Clean up
+  let cleanUpPromises = [];
+  for (let i = 0; i < 5; i++) {
+    cleanUpPromises.push(dp.IndexedDB.deleteDatabase({storageKey, databaseName: "test-database" + i}));
+  }
+  await Promise.all(cleanUpPromises);
+
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-request-database-names-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-request-database-names-expected.txt
new file mode 100644
index 0000000..0a73f64
--- /dev/null
+++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/storage/indexed-db-storage-key-request-database-names-expected.txt
@@ -0,0 +1,22 @@
+Tests that requesting database names works for IndexedDB with storageKey
+
+Open some databases
+databases created with following names[
+    [0] : test-database0
+    [1] : test-database1
+    [2] : test-database2
+    [3] : test-database3
+    [4] : test-database4
+]
+
+Request database names for storage key
+database names{
+    databaseNames : [
+        [0] : test-database0
+        [1] : test-database1
+        [2] : test-database2
+        [3] : test-database3
+        [4] : test-database4
+    ]
+}
+
diff --git a/third_party/blink/web_tests/virtual/third-party-storage-partitioning/fast/filesystem/README.txt b/third_party/blink/web_tests/virtual/third-party-storage-partitioning/fast/filesystem/README.txt
new file mode 100644
index 0000000..8c03835
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/third-party-storage-partitioning/fast/filesystem/README.txt
@@ -0,0 +1 @@
+This suite runs File System tests with ThirdPartyStoragePartitioning enabled.
diff --git a/third_party/blink/web_tests/virtual/third-party-storage-partitioning/wpt_internal/file-system-api/README.txt b/third_party/blink/web_tests/virtual/third-party-storage-partitioning/wpt_internal/file-system-api/README.txt
new file mode 100644
index 0000000..8c03835
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/third-party-storage-partitioning/wpt_internal/file-system-api/README.txt
@@ -0,0 +1 @@
+This suite runs File System tests with ThirdPartyStoragePartitioning enabled.
diff --git a/third_party/blink/web_tests/wpt_internal/file-system-api/fetch_fs_url.window.js b/third_party/blink/web_tests/wpt_internal/file-system-api/fetch_fs_url.window.js
new file mode 100644
index 0000000..9ba4bfa
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/file-system-api/fetch_fs_url.window.js
@@ -0,0 +1,24 @@
+// META: script=resources/fs_helpers.js
+
+promise_test(async t => {
+    const fs = await getFileSystem(self.TEMPORARY);
+    const path = '/test-path.txt';
+    const contents = 'Hello World!';
+    await writeFile(fs, path, contents);
+    const entry = await getFileSystemFileEntry(fs, path);
+    const url = entry.toURL();
+
+    // Use XHR rather than fetch to load the url, since Chrome's fetch
+    // implementation doesn't support loading filesystem: URLs.
+    const response = await new Promise((resolve, reject) => {
+        const req = new XMLHttpRequest();
+        req.onload = t.step_func(e => {
+            resolve(req.responseText);
+        });
+        req.onerror = reject;
+        req.onabort = reject;
+        req.open('GET', url);
+        req.send();
+    });
+    assert_equals(response, contents);
+}, 'Loading a filesystem: url works.');
diff --git a/third_party/blink/web_tests/wpt_internal/file-system-api/resources/fs_helpers.js b/third_party/blink/web_tests/wpt_internal/file-system-api/resources/fs_helpers.js
new file mode 100644
index 0000000..9b1be07
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/file-system-api/resources/fs_helpers.js
@@ -0,0 +1,62 @@
+// Quota requested for the file system tests.
+const kDesiredQuota = 1024 * 1024;
+
+// Wrapper around DeprecatedStorageQuota.requestQuota().
+async function requestStorageQuota(storage, newQuotaInBytes) {
+  return new Promise((resolve, reject) => {
+    storage.requestQuota(newQuotaInBytes, resolve, reject);
+  });
+}
+
+// Promise wrapper for self.webkitRequestFileSystem().
+async function getFileSystem(kind = self.TEMPORARY) {
+  return new Promise((resolve, reject) => {
+    self.webkitRequestFileSystem(kind, kDesiredQuota, resolve, reject);
+  });
+}
+
+// Promise wrapper for FileSystem.getFile().
+async function getFileSystemFileEntry(fileSystem, path, options = {}) {
+  return new Promise((resolve, reject) => {
+    fileSystem.root.getFile(path, options, resolve, reject);
+  });
+}
+
+// Promise wrapper for FileSystemFileEntry.createWriter().
+async function createFileSystemFileEntryWriter(fileEntry) {
+  return new Promise((resolve, reject) => {
+    fileEntry.createWriter(resolve, reject);
+  });
+}
+
+// Promise wrapper for one FileWriter.write() call.
+async function writeFileWriterData(fileWriter, data) {
+  const blob = new Blob([data], { type: 'application/octet-stream '});
+  return new Promise((resolve, reject) => {
+    fileWriter.onwriteend = () => { resolve(); };
+    fileWriter.onerror = event => { reject(event.target.error); };
+    fileWriter.write(blob);
+  });
+}
+
+// Promise wrapper for FileSystemFileEntry.file().
+async function getFileSystemFileEntryFile(fileEntry) {
+  return new Promise((resolve, reject) => {
+    fileEntry.file(resolve, reject);
+  });
+}
+
+// Promise-based helper for writing a file via the FileSystem API.
+async function writeFile(fileSystem, path, data) {
+  const fileEntry = await getFileSystemFileEntry(fileSystem, path,
+                                                 { create: true });
+  const fileWriter = await createFileSystemFileEntryWriter(fileEntry);
+  await writeFileWriterData(fileWriter, data);
+}
+
+// Promise-based helper for reading a file via the FileSystem API.
+async function readFile(fileSystem, path) {
+  const fileEntry = await getFileSystemFileEntry(fileSystem, path);
+  const file = await getFileSystemFileEntryFile(fileEntry);
+  return await file.text();
+}
diff --git a/third_party/blink/web_tests/wpt_internal/file-system-api/temporary_vs_persistent.window.js b/third_party/blink/web_tests/wpt_internal/file-system-api/temporary_vs_persistent.window.js
index bca14d18..1695ec8 100644
--- a/third_party/blink/web_tests/wpt_internal/file-system-api/temporary_vs_persistent.window.js
+++ b/third_party/blink/web_tests/wpt_internal/file-system-api/temporary_vs_persistent.window.js
@@ -1,65 +1,4 @@
-// Quota requested for the file system tests.
-const kDesiredQuota = 1024 * 1024;
-
-// Wrapper around DeprecatedStorageQuota.requestQuota().
-async function requestStorageQuota(storage, newQuotaInBytes) {
-  return new Promise((resolve, reject) => {
-    storage.requestQuota(newQuotaInBytes, resolve, reject);
-  });
-}
-
-// Promise wrapper for self.webkitRequestFileSystem().
-async function getFileSystem(kind = self.TEMPORARY) {
-  return new Promise((resolve, reject) => {
-    self.webkitRequestFileSystem(kind, kDesiredQuota, resolve, reject);
-  });
-}
-
-// Promise wrapper for FileSystem.getFile().
-async function getFileSystemFileEntry(fileSystem, path, options = {}) {
-  return new Promise((resolve, reject) => {
-    fileSystem.root.getFile(path, options, resolve, reject);
-  });
-}
-
-// Promise wrapper for FileSystemFileEntry.createWriter().
-async function createFileSystemFileEntryWriter(fileEntry) {
-  return new Promise((resolve, reject) => {
-    fileEntry.createWriter(resolve, reject);
-  });
-}
-
-// Promise wrapper for one FileWriter.write() call.
-async function writeFileWriterData(fileWriter, data) {
-  const blob = new Blob([data], { type: 'application/octet-stream '});
-  return new Promise((resolve, reject) => {
-    fileWriter.onwriteend = () => { resolve(); };
-    fileWriter.onerror = event => { reject(event.target.error); };
-    fileWriter.write(blob);
-  });
-}
-
-// Promise wrapper for FileSystemFileEntry.file().
-async function getFileSystemFileEntryFile(fileEntry) {
-  return new Promise((resolve, reject) => {
-    fileEntry.file(resolve, reject);
-  });
-}
-
-// Promise-based helper for writing a file via the FileSystem API.
-async function writeFile(fileSystem, path, data) {
-  const fileEntry = await getFileSystemFileEntry(fileSystem, path,
-                                                 { create: true });
-  const fileWriter = await createFileSystemFileEntryWriter(fileEntry);
-  await writeFileWriterData(fileWriter, data);
-}
-
-// Promise-based helper for reading a file via the FileSystem API.
-async function readFile(fileSystem, path) {
-  const fileEntry = await getFileSystemFileEntry(fileSystem, path);
-  const file = await getFileSystemFileEntryFile(fileEntry);
-  return await file.text();
-}
+// META: script=resources/fs_helpers.js
 
 for (let kind of ['TEMPORARY', 'PERSISTENT']) {
   promise_test(async testCase => {
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.dlldata.c
similarity index 86%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.dlldata.c
index e8e1b9d6..ac0b647 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.dlldata.c
@@ -19,12 +19,12 @@
 extern "C"   {

 #endif

 

-EXTERN_PROXY_FILE( updater_legacy_idl )

+EXTERN_PROXY_FILE( updater_legacy_idl_chrome_branded )

 

 

 PROXYFILE_LIST_START

 /* Start of list */

-  REFERENCE_PROXY_FILE( updater_legacy_idl ),

+  REFERENCE_PROXY_FILE( updater_legacy_idl_chrome_branded ),

 /* End of list */

 PROXYFILE_LIST_END

 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h
similarity index 99%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.h
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h
index 852afaf..b5d93cf 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.h
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.h
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=ARM64 8.01.0626 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -36,8 +36,8 @@
 #include "ole2.h"

 #endif /*COM_NO_WINDOWS_H*/

 

-#ifndef __updater_legacy_idl_h__

-#define __updater_legacy_idl_h__

+#ifndef __updater_legacy_idl_chrome_branded_h__

+#define __updater_legacy_idl_chrome_branded_h__

 

 #if defined(_MSC_VER) && (_MSC_VER >= 1020)

 #pragma once

@@ -276,7 +276,7 @@
 #endif 

 

 

-/* interface __MIDL_itf_updater_legacy_idl_0000_0000 */

+/* interface __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000 */

 /* [local] */ 

 

 typedef 

@@ -311,8 +311,8 @@
     } ;

 

 

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_c_ifspec;

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_s_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000_v0_0_c_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000_v0_0_s_ifspec;

 

 #ifndef __ICurrentState_INTERFACE_DEFINED__

 #define __ICurrentState_INTERFACE_DEFINED__

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.tlb b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.tlb
similarity index 100%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.tlb
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c
similarity index 97%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_i.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c
index 8dd89d8..60c84ac 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_i.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_i.c
@@ -8,7 +8,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=ARM64 8.01.0626 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c
similarity index 96%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_p.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c
index 704ed84..d636795 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_p.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_chrome_branded_p.c
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=ARM64 8.01.0626 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -44,7 +44,7 @@
 #endif /* __RPCPROXY_H_VERSION__ */

 

 

-#include "updater_legacy_idl.h"

+#include "updater_legacy_idl_chrome_branded.h"

 

 #define TYPE_FORMAT_STRING_SIZE   1089                              

 #define PROC_FORMAT_STRING_SIZE   3205                              

@@ -52,23 +52,23 @@
 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   2            

 

-typedef struct _updater_legacy_idl_MIDL_TYPE_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_TYPE_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_PROC_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_PROC_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_EXPR_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING

     {

     long          Pad;

     unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_EXPR_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING;

 

 

 static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

@@ -127,9 +127,9 @@
 #endif

 

 

-extern const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString;

-extern const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString;

-extern const updater_legacy_idl_MIDL_EXPR_FORMAT_STRING updater_legacy_idl__MIDL_ExprFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_TypeFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ProcFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ExprFormatString;

 

 

 extern const MIDL_STUB_DESC Object_StubDesc;

@@ -215,7 +215,7 @@
 #error  Invalid build platform for this stub.

 #endif

 

-static const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString =

+static const updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ProcFormatString =

     {

         0,

         {

@@ -3046,7 +3046,7 @@
         }

     };

 

-static const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString =

+static const updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_TypeFormatString =

     {

         0,

         {

@@ -3790,7 +3790,7 @@
 

 

 

-/* Standard interface: __MIDL_itf_updater_legacy_idl_0000_0000, ver. 0.0,

+/* Standard interface: __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000, ver. 0.0,

    GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

 

 

@@ -3834,7 +3834,7 @@
 static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3846,7 +3846,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3934,7 +3934,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3946,7 +3946,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4018,7 +4018,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4030,7 +4030,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4127,7 +4127,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4139,7 +4139,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4216,7 +4216,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4228,7 +4228,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4298,7 +4298,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4310,7 +4310,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4386,7 +4386,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatusValue_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4398,7 +4398,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4477,7 +4477,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4489,7 +4489,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4591,7 +4591,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus3_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4603,7 +4603,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4689,7 +4689,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4701,7 +4701,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4744,7 +4744,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4756,7 +4756,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4794,7 +4794,7 @@
     0,

     0,

     0,

-    updater_legacy_idl__MIDL_TypeFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_TypeFormatString.Format,

     1, /* -error bounds_check flag */

     0x50002, /* Ndr library version */

     0,

@@ -4808,7 +4808,7 @@
     0

     };

 

-const CInterfaceProxyVtbl * const _updater_legacy_idl_ProxyVtblList[] = 

+const CInterfaceProxyVtbl * const _updater_legacy_idl_chrome_branded_ProxyVtblList[] = 

 {

     ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

     ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

@@ -4824,7 +4824,7 @@
     0

 };

 

-const CInterfaceStubVtbl * const _updater_legacy_idl_StubVtblList[] = 

+const CInterfaceStubVtbl * const _updater_legacy_idl_chrome_branded_StubVtblList[] = 

 {

     ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

     ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

@@ -4840,7 +4840,7 @@
     0

 };

 

-PCInterfaceName const _updater_legacy_idl_InterfaceNamesList[] = 

+PCInterfaceName const _updater_legacy_idl_chrome_branded_InterfaceNamesList[] = 

 {

     "IPolicyStatus2",

     "IAppCommandWeb",

@@ -4856,7 +4856,7 @@
     0

 };

 

-const IID *  const _updater_legacy_idl_BaseIIDList[] = 

+const IID *  const _updater_legacy_idl_chrome_branded_BaseIIDList[] = 

 {

     &IID_IDispatch,

     &IID_IDispatch,

@@ -4873,27 +4873,27 @@
 };

 

 

-#define _updater_legacy_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl, pIID, n)

+#define _updater_legacy_idl_chrome_branded_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl_chrome_branded, pIID, n)

 

-int __stdcall _updater_legacy_idl_IID_Lookup( const IID * pIID, int * pIndex )

+int __stdcall _updater_legacy_idl_chrome_branded_IID_Lookup( const IID * pIID, int * pIndex )

 {

     IID_BS_LOOKUP_SETUP

 

-    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl, 11, 8 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 4 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 2 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 1 )

-    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl, 11, *pIndex )

+    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl_chrome_branded, 11, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl_chrome_branded, 11, *pIndex )

     

 }

 

-const ExtendedProxyFileInfo updater_legacy_idl_ProxyFileInfo = 

+const ExtendedProxyFileInfo updater_legacy_idl_chrome_branded_ProxyFileInfo = 

 {

-    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_ProxyVtblList,

-    (PCInterfaceStubVtblList *) & _updater_legacy_idl_StubVtblList,

-    (const PCInterfaceName * ) & _updater_legacy_idl_InterfaceNamesList,

-    (const IID ** ) & _updater_legacy_idl_BaseIIDList,

-    & _updater_legacy_idl_IID_Lookup, 

+    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_chrome_branded_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _updater_legacy_idl_chrome_branded_StubVtblList,

+    (const PCInterfaceName * ) & _updater_legacy_idl_chrome_branded_InterfaceNamesList,

+    (const IID ** ) & _updater_legacy_idl_chrome_branded_BaseIIDList,

+    & _updater_legacy_idl_chrome_branded_IID_Lookup, 

     11,

     2,

     0, /* table of [async_uuid] interfaces */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.dlldata.c
similarity index 86%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.dlldata.c
index e8e1b9d6..eb0a6d1 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.dlldata.c
@@ -19,12 +19,12 @@
 extern "C"   {

 #endif

 

-EXTERN_PROXY_FILE( updater_legacy_idl )

+EXTERN_PROXY_FILE( updater_legacy_idl_open_source )

 

 

 PROXYFILE_LIST_START

 /* Start of list */

-  REFERENCE_PROXY_FILE( updater_legacy_idl ),

+  REFERENCE_PROXY_FILE( updater_legacy_idl_open_source ),

 /* End of list */

 PROXYFILE_LIST_END

 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.h
similarity index 98%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.h
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.h
index 852afaf..13440d54 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.h
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.h
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=ARM64 8.01.0626 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -36,8 +36,8 @@
 #include "ole2.h"

 #endif /*COM_NO_WINDOWS_H*/

 

-#ifndef __updater_legacy_idl_h__

-#define __updater_legacy_idl_h__

+#ifndef __updater_legacy_idl_open_source_h__

+#define __updater_legacy_idl_open_source_h__

 

 #if defined(_MSC_VER) && (_MSC_VER >= 1020)

 #pragma once

@@ -276,7 +276,7 @@
 #endif 

 

 

-/* interface __MIDL_itf_updater_legacy_idl_0000_0000 */

+/* interface __MIDL_itf_updater_legacy_idl_open_source_0000_0000 */

 /* [local] */ 

 

 typedef 

@@ -311,8 +311,8 @@
     } ;

 

 

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_c_ifspec;

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_s_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_open_source_0000_0000_v0_0_c_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_open_source_0000_0000_v0_0_s_ifspec;

 

 #ifndef __ICurrentState_INTERFACE_DEFINED__

 #define __ICurrentState_INTERFACE_DEFINED__

@@ -325,7 +325,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("247954F9-9EDC-4E68-8CC3-150C2B89EADF")

+    MIDL_INTERFACE("BE5D3E90-A66C-4A0A-9B7B-1A6B9BF3971E")

     ICurrentState : public IDispatch

     {

     public:

@@ -639,7 +639,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("494B20CF-282E-4BDD-9F5D-B70CB09D351E")

+    MIDL_INTERFACE("027234BD-61BB-4F5C-9386-7FE804171C8C")

     IGoogleUpdate3Web : public IDispatch

     {

     public:

@@ -777,7 +777,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("DD42475D-6D46-496a-924E-BD5630B4CBBA")

+    MIDL_INTERFACE("D734C877-21F4-496E-B857-3E5B2E72E4CC")

     IAppBundleWeb : public IDispatch

     {

     public:

@@ -1085,7 +1085,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("18D0F672-18B4-48e6-AD36-6E6BF01DBBC4")

+    MIDL_INTERFACE("2C6218B9-088D-4D25-A4F8-570558124142")

     IAppWeb : public IDispatch

     {

     public:

@@ -1318,7 +1318,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("8476CE12-AE1F-4198-805C-BA0F9B783F57")

+    MIDL_INTERFACE("87DBF75E-F590-4802-93FD-F8D07800E2E9")

     IAppCommandWeb : public IDispatch

     {

     public:

@@ -1505,7 +1505,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("F63F6F8B-ACD5-413C-A44B-0409136D26CB")

+    MIDL_INTERFACE("7D908375-C9D0-44C5-BB98-206F3C24A74C")

     IPolicyStatus : public IDispatch

     {

     public:

@@ -1745,7 +1745,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("27634814-8E41-4C35-8577-980134A96544")

+    MIDL_INTERFACE("47C8886A-A4B5-4F6C-865A-41A207074DFA")

     IPolicyStatusValue : public IDispatch

     {

     public:

@@ -1927,7 +1927,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("34527502-D3DB-4205-A69B-789B27EE0414")

+    MIDL_INTERFACE("9D31EA63-2E06-4D41-98C7-CB1F307DB597")

     IPolicyStatus2 : public IDispatch

     {

     public:

@@ -2240,7 +2240,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("05A30352-EB25-45B6-8449-BCA7B0542CE5")

+    MIDL_INTERFACE("5C674FC1-80E3-48D2-987B-79D9D286065B")

     IPolicyStatus3 : public IPolicyStatus2

     {

     public:

@@ -2514,7 +2514,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("128C2DA6-2BC0-44c0-B3F6-4EC22E647964")

+    MIDL_INTERFACE("EED70106-3604-4385-866E-6D540E99CA1A")

     IProcessLauncher : public IUnknown

     {

     public:

@@ -2628,7 +2628,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("D106AB5F-A70E-400E-A21B-96208C1D8DBB")

+    MIDL_INTERFACE("BAEE6326-C925-4FA4-AFE9-5FA69902B021")

     IProcessLauncher2 : public IProcessLauncher

     {

     public:

@@ -2761,7 +2761,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("22181302-A8A6-4f84-A541-E5CBFC70CC43")

+class DECLSPEC_UUID("75828ED1-7BE8-45D0-8950-AA85CBF74510")

 GoogleUpdate3WebUserClass;

 #endif

 

@@ -2769,7 +2769,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("8A1D4361-2C08-4700-A351-3EAA9CBFF5E4")

+class DECLSPEC_UUID("283209B7-C761-41CA-BE8D-B5321CD78FD6")

 GoogleUpdate3WebSystemClass;

 #endif

 

@@ -2777,7 +2777,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("6DDCE70D-A4AE-4E97-908C-BE7B2DB750AD")

+class DECLSPEC_UUID("4DAC24AB-B340-4B7E-AD01-1504A7F59EEA")

 PolicyStatusUserClass;

 #endif

 

@@ -2785,7 +2785,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("521FDB42-7130-4806-822A-FC5163FAD983")

+class DECLSPEC_UUID("83FE19AC-72A6-4A72-B136-724444121586")

 PolicyStatusSystemClass;

 #endif

 

@@ -2793,7 +2793,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("ABC01078-F197-4b0b-ADBC-CFE684B39C82")

+class DECLSPEC_UUID("811A664F-703E-407C-A323-E6E31D1EFFA0")

 ProcessLauncherClass;

 #endif

 #endif /* __UpdaterLegacyLib_LIBRARY_DEFINED__ */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.tlb b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.tlb
new file mode 100644
index 0000000..d11b5478
--- /dev/null
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source_i.c
new file mode 100644
index 0000000..c425e60
--- /dev/null
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source_i.c
@@ -0,0 +1,127 @@
+

+

+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */

+

+/* link this file in with the server and any clients */

+

+

+ /* File created by MIDL compiler version 8.xx.xxxx */

+/* at a redacted point in time

+ */

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=ARM64 8.01.0626 

+    protocol : dce , ms_ext, c_ext, robust

+    error checks: allocation ref bounds_check enum stub_data 

+    VC __declspec() decoration level: 

+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)

+         DECLSPEC_UUID(), MIDL_INTERFACE()

+*/

+/* @@MIDL_FILE_HEADING(  ) */

+

+#pragma warning( disable: 4049 )  /* more than 64k source lines */

+

+

+#ifdef __cplusplus

+extern "C"{

+#endif 

+

+

+#include <rpc.h>

+#include <rpcndr.h>

+

+#ifdef _MIDL_USE_GUIDDEF_

+

+#ifndef INITGUID

+#define INITGUID

+#include <guiddef.h>

+#undef INITGUID

+#else

+#include <guiddef.h>

+#endif

+

+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \

+        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)

+

+#else // !_MIDL_USE_GUIDDEF_

+

+#ifndef __IID_DEFINED__

+#define __IID_DEFINED__

+

+typedef struct _IID

+{

+    unsigned long x;

+    unsigned short s1;

+    unsigned short s2;

+    unsigned char  c[8];

+} IID;

+

+#endif // __IID_DEFINED__

+

+#ifndef CLSID_DEFINED

+#define CLSID_DEFINED

+typedef IID CLSID;

+#endif // CLSID_DEFINED

+

+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \

+        EXTERN_C __declspec(selectany) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

+

+#endif // !_MIDL_USE_GUIDDEF_

+

+MIDL_DEFINE_GUID(IID, IID_ICurrentState,0xBE5D3E90,0xA66C,0x4A0A,0x9B,0x7B,0x1A,0x6B,0x9B,0xF3,0x97,0x1E);

+

+

+MIDL_DEFINE_GUID(IID, IID_IGoogleUpdate3Web,0x027234BD,0x61BB,0x4F5C,0x93,0x86,0x7F,0xE8,0x04,0x17,0x1C,0x8C);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xD734C877,0x21F4,0x496E,0xB8,0x57,0x3E,0x5B,0x2E,0x72,0xE4,0xCC);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x2C6218B9,0x088D,0x4D25,0xA4,0xF8,0x57,0x05,0x58,0x12,0x41,0x42);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppCommandWeb,0x87DBF75E,0xF590,0x4802,0x93,0xFD,0xF8,0xD0,0x78,0x00,0xE2,0xE9);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus,0x7D908375,0xC9D0,0x44C5,0xBB,0x98,0x20,0x6F,0x3C,0x24,0xA7,0x4C);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatusValue,0x47C8886A,0xA4B5,0x4F6C,0x86,0x5A,0x41,0xA2,0x07,0x07,0x4D,0xFA);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus2,0x9D31EA63,0x2E06,0x4D41,0x98,0xC7,0xCB,0x1F,0x30,0x7D,0xB5,0x97);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus3,0x5C674FC1,0x80E3,0x48D2,0x98,0x7B,0x79,0xD9,0xD2,0x86,0x06,0x5B);

+

+

+MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0xEED70106,0x3604,0x4385,0x86,0x6E,0x6D,0x54,0x0E,0x99,0xCA,0x1A);

+

+

+MIDL_DEFINE_GUID(IID, IID_IProcessLauncher2,0xBAEE6326,0xC925,0x4FA4,0xAF,0xE9,0x5F,0xA6,0x99,0x02,0xB0,0x21);

+

+

+MIDL_DEFINE_GUID(IID, LIBID_UpdaterLegacyLib,0x4C61BB05,0x94D1,0x4BAB,0xB6,0x9C,0xC3,0x41,0x95,0xAF,0x92,0xCA);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x75828ED1,0x7BE8,0x45D0,0x89,0x50,0xAA,0x85,0xCB,0xF7,0x45,0x10);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebSystemClass,0x283209B7,0xC761,0x41CA,0xBE,0x8D,0xB5,0x32,0x1C,0xD7,0x8F,0xD6);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusUserClass,0x4DAC24AB,0xB340,0x4B7E,0xAD,0x01,0x15,0x04,0xA7,0xF5,0x9E,0xEA);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusSystemClass,0x83FE19AC,0x72A6,0x4A72,0xB1,0x36,0x72,0x44,0x44,0x12,0x15,0x86);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0x811A664F,0x703E,0x407C,0xA3,0x23,0xE6,0xE3,0x1D,0x1E,0xFF,0xA0);

+

+#undef MIDL_DEFINE_GUID

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source_p.c
similarity index 96%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_p.c
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source_p.c
index 704ed84..c5aaa864 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_p.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl_open_source_p.c
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=ARM64 8.01.0626 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -44,7 +44,7 @@
 #endif /* __RPCPROXY_H_VERSION__ */

 

 

-#include "updater_legacy_idl.h"

+#include "updater_legacy_idl_open_source.h"

 

 #define TYPE_FORMAT_STRING_SIZE   1089                              

 #define PROC_FORMAT_STRING_SIZE   3205                              

@@ -52,23 +52,23 @@
 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   2            

 

-typedef struct _updater_legacy_idl_MIDL_TYPE_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_TYPE_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_PROC_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_PROC_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_EXPR_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING

     {

     long          Pad;

     unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_EXPR_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING;

 

 

 static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

@@ -127,9 +127,9 @@
 #endif

 

 

-extern const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString;

-extern const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString;

-extern const updater_legacy_idl_MIDL_EXPR_FORMAT_STRING updater_legacy_idl__MIDL_ExprFormatString;

+extern const updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_open_source__MIDL_TypeFormatString;

+extern const updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ProcFormatString;

+extern const updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ExprFormatString;

 

 

 extern const MIDL_STUB_DESC Object_StubDesc;

@@ -215,7 +215,7 @@
 #error  Invalid build platform for this stub.

 #endif

 

-static const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString =

+static const updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ProcFormatString =

     {

         0,

         {

@@ -3046,7 +3046,7 @@
         }

     };

 

-static const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString =

+static const updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_open_source__MIDL_TypeFormatString =

     {

         0,

         {

@@ -3734,17 +3734,17 @@
 /* 1058 */	

 			0x2f,		/* FC_IP */

 			0x5a,		/* FC_CONSTANT_IID */

-/* 1060 */	NdrFcLong( 0x27634814 ),	/* 660817940 */

-/* 1064 */	NdrFcShort( 0x8e41 ),	/* -29119 */

-/* 1066 */	NdrFcShort( 0x4c35 ),	/* 19509 */

-/* 1068 */	0x85,		/* 133 */

-			0x77,		/* 119 */

-/* 1070 */	0x98,		/* 152 */

-			0x1,		/* 1 */

-/* 1072 */	0x34,		/* 52 */

-			0xa9,		/* 169 */

-/* 1074 */	0x65,		/* 101 */

-			0x44,		/* 68 */

+/* 1060 */	NdrFcLong( 0x47c8886a ),	/* 1204324458 */

+/* 1064 */	NdrFcShort( 0xa4b5 ),	/* -23371 */

+/* 1066 */	NdrFcShort( 0x4f6c ),	/* 20332 */

+/* 1068 */	0x86,		/* 134 */

+			0x5a,		/* 90 */

+/* 1070 */	0x41,		/* 65 */

+			0xa2,		/* 162 */

+/* 1072 */	0x7,		/* 7 */

+			0x7,		/* 7 */

+/* 1074 */	0x4d,		/* 77 */

+			0xfa,		/* 250 */

 /* 1076 */	

 			0x11, 0x8,	/* FC_RP [simple_pointer] */

 /* 1078 */	0x6,		/* FC_SHORT */

@@ -3790,7 +3790,7 @@
 

 

 

-/* Standard interface: __MIDL_itf_updater_legacy_idl_0000_0000, ver. 0.0,

+/* Standard interface: __MIDL_itf_updater_legacy_idl_open_source_0000_0000, ver. 0.0,

    GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

 

 

@@ -3803,7 +3803,7 @@
 

 

 /* Object interface: ICurrentState, ver. 0.0,

-   GUID={0x247954F9,0x9EDC,0x4E68,{0x8C,0xC3,0x15,0x0C,0x2B,0x89,0xEA,0xDF}} */

+   GUID={0xBE5D3E90,0xA66C,0x4A0A,{0x9B,0x7B,0x1A,0x6B,0x9B,0xF3,0x97,0x1E}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short ICurrentState_FormatStringOffsetTable[] =

@@ -3834,7 +3834,7 @@
 static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3846,7 +3846,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3919,7 +3919,7 @@
 

 

 /* Object interface: IGoogleUpdate3Web, ver. 0.0,

-   GUID={0x494B20CF,0x282E,0x4BDD,{0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E}} */

+   GUID={0x027234BD,0x61BB,0x4F5C,{0x93,0x86,0x7F,0xE8,0x04,0x17,0x1C,0x8C}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IGoogleUpdate3Web_FormatStringOffsetTable[] =

@@ -3934,7 +3934,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3946,7 +3946,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3987,7 +3987,7 @@
 

 

 /* Object interface: IAppBundleWeb, ver. 0.0,

-   GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */

+   GUID={0xD734C877,0x21F4,0x496E,{0xB8,0x57,0x3E,0x5B,0x2E,0x72,0xE4,0xCC}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] =

@@ -4018,7 +4018,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4030,7 +4030,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4103,7 +4103,7 @@
 

 

 /* Object interface: IAppWeb, ver. 0.0,

-   GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */

+   GUID={0x2C6218B9,0x088D,0x4D25,{0xA4,0xF8,0x57,0x05,0x58,0x12,0x41,0x42}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppWeb_FormatStringOffsetTable[] =

@@ -4127,7 +4127,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4139,7 +4139,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4198,7 +4198,7 @@
 

 

 /* Object interface: IAppCommandWeb, ver. 0.0,

-   GUID={0x8476CE12,0xAE1F,0x4198,{0x80,0x5C,0xBA,0x0F,0x9B,0x78,0x3F,0x57}} */

+   GUID={0x87DBF75E,0xF590,0x4802,{0x93,0xFD,0xF8,0xD0,0x78,0x00,0xE2,0xE9}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppCommandWeb_FormatStringOffsetTable[] =

@@ -4216,7 +4216,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4228,7 +4228,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4275,7 +4275,7 @@
 

 

 /* Object interface: IPolicyStatus, ver. 0.0,

-   GUID={0xF63F6F8B,0xACD5,0x413C,{0xA4,0x4B,0x04,0x09,0x13,0x6D,0x26,0xCB}} */

+   GUID={0x7D908375,0xC9D0,0x44C5,{0xBB,0x98,0x20,0x6F,0x3C,0x24,0xA7,0x4C}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus_FormatStringOffsetTable[] =

@@ -4298,7 +4298,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4310,7 +4310,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4367,7 +4367,7 @@
 

 

 /* Object interface: IPolicyStatusValue, ver. 0.0,

-   GUID={0x27634814,0x8E41,0x4C35,{0x85,0x77,0x98,0x01,0x34,0xA9,0x65,0x44}} */

+   GUID={0x47C8886A,0xA4B5,0x4F6C,{0x86,0x5A,0x41,0xA2,0x07,0x07,0x4D,0xFA}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatusValue_FormatStringOffsetTable[] =

@@ -4386,7 +4386,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatusValue_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4398,7 +4398,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4447,7 +4447,7 @@
 

 

 /* Object interface: IPolicyStatus2, ver. 0.0,

-   GUID={0x34527502,0xD3DB,0x4205,{0xA6,0x9B,0x78,0x9B,0x27,0xEE,0x04,0x14}} */

+   GUID={0x9D31EA63,0x2E06,0x4D41,{0x98,0xC7,0xCB,0x1F,0x30,0x7D,0xB5,0x97}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus2_FormatStringOffsetTable[] =

@@ -4477,7 +4477,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4489,7 +4489,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4560,7 +4560,7 @@
 

 

 /* Object interface: IPolicyStatus3, ver. 0.0,

-   GUID={0x05A30352,0xEB25,0x45B6,{0x84,0x49,0xBC,0xA7,0xB0,0x54,0x2C,0xE5}} */

+   GUID={0x5C674FC1,0x80E3,0x48D2,{0x98,0x7B,0x79,0xD9,0xD2,0x86,0x06,0x5B}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus3_FormatStringOffsetTable[] =

@@ -4591,7 +4591,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus3_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4603,7 +4603,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4676,7 +4676,7 @@
 

 

 /* Object interface: IProcessLauncher, ver. 0.0,

-   GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */

+   GUID={0xEED70106,0x3604,0x4385,{0x86,0x6E,0x6D,0x54,0x0E,0x99,0xCA,0x1A}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =

@@ -4689,7 +4689,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4701,7 +4701,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4730,7 +4730,7 @@
 

 

 /* Object interface: IProcessLauncher2, ver. 0.0,

-   GUID={0xD106AB5F,0xA70E,0x400E,{0xA2,0x1B,0x96,0x20,0x8C,0x1D,0x8D,0xBB}} */

+   GUID={0xBAEE6326,0xC925,0x4FA4,{0xAF,0xE9,0x5F,0xA6,0x99,0x02,0xB0,0x21}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IProcessLauncher2_FormatStringOffsetTable[] =

@@ -4744,7 +4744,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4756,7 +4756,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4794,7 +4794,7 @@
     0,

     0,

     0,

-    updater_legacy_idl__MIDL_TypeFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_TypeFormatString.Format,

     1, /* -error bounds_check flag */

     0x50002, /* Ndr library version */

     0,

@@ -4808,92 +4808,92 @@
     0

     };

 

-const CInterfaceProxyVtbl * const _updater_legacy_idl_ProxyVtblList[] = 

+const CInterfaceProxyVtbl * const _updater_legacy_idl_open_source_ProxyVtblList[] = 

 {

-    ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatusValueProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatus3ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IProcessLauncher2ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatusProxyVtbl,

     ( CInterfaceProxyVtbl *) &_IProcessLauncherProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IProcessLauncher2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatusValueProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatusProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

     ( CInterfaceProxyVtbl *) &_ICurrentStateProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatus3ProxyVtbl,

     0

 };

 

-const CInterfaceStubVtbl * const _updater_legacy_idl_StubVtblList[] = 

+const CInterfaceStubVtbl * const _updater_legacy_idl_open_source_StubVtblList[] = 

 {

-    ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatusValueStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatus3StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IProcessLauncher2StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatusStubVtbl,

     ( CInterfaceStubVtbl *) &_IProcessLauncherStubVtbl,

-    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IProcessLauncher2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatusValueStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatusStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

     ( CInterfaceStubVtbl *) &_ICurrentStateStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatus3StubVtbl,

     0

 };

 

-PCInterfaceName const _updater_legacy_idl_InterfaceNamesList[] = 

+PCInterfaceName const _updater_legacy_idl_open_source_InterfaceNamesList[] = 

 {

-    "IPolicyStatus2",

-    "IAppCommandWeb",

-    "IPolicyStatusValue",

-    "IPolicyStatus3",

-    "IAppBundleWeb",

-    "IProcessLauncher2",

-    "IAppWeb",

-    "IPolicyStatus",

     "IProcessLauncher",

-    "IGoogleUpdate3Web",

+    "IProcessLauncher2",

+    "IAppCommandWeb",

+    "IPolicyStatus2",

+    "IPolicyStatusValue",

+    "IPolicyStatus",

+    "IAppBundleWeb",

     "ICurrentState",

+    "IAppWeb",

+    "IGoogleUpdate3Web",

+    "IPolicyStatus3",

     0

 };

 

-const IID *  const _updater_legacy_idl_BaseIIDList[] = 

+const IID *  const _updater_legacy_idl_open_source_BaseIIDList[] = 

 {

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

+    0,

     0,

     &IID_IDispatch,

     &IID_IDispatch,

-    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

     &IID_IDispatch,

     &IID_IDispatch,

     0

 };

 

 

-#define _updater_legacy_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl, pIID, n)

+#define _updater_legacy_idl_open_source_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl_open_source, pIID, n)

 

-int __stdcall _updater_legacy_idl_IID_Lookup( const IID * pIID, int * pIndex )

+int __stdcall _updater_legacy_idl_open_source_IID_Lookup( const IID * pIID, int * pIndex )

 {

     IID_BS_LOOKUP_SETUP

 

-    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl, 11, 8 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 4 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 2 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 1 )

-    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl, 11, *pIndex )

+    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl_open_source, 11, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl_open_source, 11, *pIndex )

     

 }

 

-const ExtendedProxyFileInfo updater_legacy_idl_ProxyFileInfo = 

+const ExtendedProxyFileInfo updater_legacy_idl_open_source_ProxyFileInfo = 

 {

-    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_ProxyVtblList,

-    (PCInterfaceStubVtblList *) & _updater_legacy_idl_StubVtblList,

-    (const PCInterfaceName * ) & _updater_legacy_idl_InterfaceNamesList,

-    (const IID ** ) & _updater_legacy_idl_BaseIIDList,

-    & _updater_legacy_idl_IID_Lookup, 

+    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_open_source_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _updater_legacy_idl_open_source_StubVtblList,

+    (const PCInterfaceName * ) & _updater_legacy_idl_open_source_InterfaceNamesList,

+    (const IID ** ) & _updater_legacy_idl_open_source_BaseIIDList,

+    & _updater_legacy_idl_open_source_IID_Lookup, 

     11,

     2,

     0, /* table of [async_uuid] interfaces */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.dlldata.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.dlldata.c
similarity index 86%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.dlldata.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.dlldata.c
index e8e1b9d6..ac0b647 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.dlldata.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.dlldata.c
@@ -19,12 +19,12 @@
 extern "C"   {

 #endif

 

-EXTERN_PROXY_FILE( updater_legacy_idl )

+EXTERN_PROXY_FILE( updater_legacy_idl_chrome_branded )

 

 

 PROXYFILE_LIST_START

 /* Start of list */

-  REFERENCE_PROXY_FILE( updater_legacy_idl ),

+  REFERENCE_PROXY_FILE( updater_legacy_idl_chrome_branded ),

 /* End of list */

 PROXYFILE_LIST_END

 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h
similarity index 99%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.h
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h
index 7438529..c333185 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.h
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.h
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -36,8 +36,8 @@
 #include "ole2.h"

 #endif /*COM_NO_WINDOWS_H*/

 

-#ifndef __updater_legacy_idl_h__

-#define __updater_legacy_idl_h__

+#ifndef __updater_legacy_idl_chrome_branded_h__

+#define __updater_legacy_idl_chrome_branded_h__

 

 #if defined(_MSC_VER) && (_MSC_VER >= 1020)

 #pragma once

@@ -276,7 +276,7 @@
 #endif 

 

 

-/* interface __MIDL_itf_updater_legacy_idl_0000_0000 */

+/* interface __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000 */

 /* [local] */ 

 

 typedef 

@@ -311,8 +311,8 @@
     } ;

 

 

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_c_ifspec;

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_s_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000_v0_0_c_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000_v0_0_s_ifspec;

 

 #ifndef __ICurrentState_INTERFACE_DEFINED__

 #define __ICurrentState_INTERFACE_DEFINED__

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.tlb b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.tlb
similarity index 100%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.tlb
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c
similarity index 97%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_i.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c
index c94a1b0d..2716859 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_i.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_i.c
@@ -8,7 +8,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c
similarity index 96%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_p.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c
index e0d8836..a9fa509 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_p.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_chrome_branded_p.c
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -44,7 +44,7 @@
 #endif /* __RPCPROXY_H_VERSION__ */

 

 

-#include "updater_legacy_idl.h"

+#include "updater_legacy_idl_chrome_branded.h"

 

 #define TYPE_FORMAT_STRING_SIZE   1089                              

 #define PROC_FORMAT_STRING_SIZE   2919                              

@@ -52,23 +52,23 @@
 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   2            

 

-typedef struct _updater_legacy_idl_MIDL_TYPE_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_TYPE_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_PROC_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_PROC_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_EXPR_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING

     {

     long          Pad;

     unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_EXPR_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING;

 

 

 static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

@@ -127,9 +127,9 @@
 #endif

 

 

-extern const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString;

-extern const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString;

-extern const updater_legacy_idl_MIDL_EXPR_FORMAT_STRING updater_legacy_idl__MIDL_ExprFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_TypeFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ProcFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ExprFormatString;

 

 

 extern const MIDL_STUB_DESC Object_StubDesc;

@@ -215,7 +215,7 @@
 #error  Invalid build platform for this stub.

 #endif

 

-static const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString =

+static const updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ProcFormatString =

     {

         0,

         {

@@ -2760,7 +2760,7 @@
         }

     };

 

-static const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString =

+static const updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_TypeFormatString =

     {

         0,

         {

@@ -3504,7 +3504,7 @@
 

 

 

-/* Standard interface: __MIDL_itf_updater_legacy_idl_0000_0000, ver. 0.0,

+/* Standard interface: __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000, ver. 0.0,

    GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

 

 

@@ -3548,7 +3548,7 @@
 static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3560,7 +3560,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3648,7 +3648,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3660,7 +3660,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3732,7 +3732,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3744,7 +3744,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3841,7 +3841,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3853,7 +3853,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3930,7 +3930,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3942,7 +3942,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4012,7 +4012,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4024,7 +4024,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4100,7 +4100,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatusValue_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4112,7 +4112,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4191,7 +4191,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4203,7 +4203,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4305,7 +4305,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus3_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4317,7 +4317,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4403,7 +4403,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4415,7 +4415,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4458,7 +4458,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4470,7 +4470,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4508,7 +4508,7 @@
     0,

     0,

     0,

-    updater_legacy_idl__MIDL_TypeFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_TypeFormatString.Format,

     1, /* -error bounds_check flag */

     0x50002, /* Ndr library version */

     0,

@@ -4522,7 +4522,7 @@
     0

     };

 

-const CInterfaceProxyVtbl * const _updater_legacy_idl_ProxyVtblList[] = 

+const CInterfaceProxyVtbl * const _updater_legacy_idl_chrome_branded_ProxyVtblList[] = 

 {

     ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

     ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

@@ -4538,7 +4538,7 @@
     0

 };

 

-const CInterfaceStubVtbl * const _updater_legacy_idl_StubVtblList[] = 

+const CInterfaceStubVtbl * const _updater_legacy_idl_chrome_branded_StubVtblList[] = 

 {

     ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

     ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

@@ -4554,7 +4554,7 @@
     0

 };

 

-PCInterfaceName const _updater_legacy_idl_InterfaceNamesList[] = 

+PCInterfaceName const _updater_legacy_idl_chrome_branded_InterfaceNamesList[] = 

 {

     "IPolicyStatus2",

     "IAppCommandWeb",

@@ -4570,7 +4570,7 @@
     0

 };

 

-const IID *  const _updater_legacy_idl_BaseIIDList[] = 

+const IID *  const _updater_legacy_idl_chrome_branded_BaseIIDList[] = 

 {

     &IID_IDispatch,

     &IID_IDispatch,

@@ -4587,27 +4587,27 @@
 };

 

 

-#define _updater_legacy_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl, pIID, n)

+#define _updater_legacy_idl_chrome_branded_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl_chrome_branded, pIID, n)

 

-int __stdcall _updater_legacy_idl_IID_Lookup( const IID * pIID, int * pIndex )

+int __stdcall _updater_legacy_idl_chrome_branded_IID_Lookup( const IID * pIID, int * pIndex )

 {

     IID_BS_LOOKUP_SETUP

 

-    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl, 11, 8 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 4 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 2 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 1 )

-    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl, 11, *pIndex )

+    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl_chrome_branded, 11, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl_chrome_branded, 11, *pIndex )

     

 }

 

-const ExtendedProxyFileInfo updater_legacy_idl_ProxyFileInfo = 

+const ExtendedProxyFileInfo updater_legacy_idl_chrome_branded_ProxyFileInfo = 

 {

-    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_ProxyVtblList,

-    (PCInterfaceStubVtblList *) & _updater_legacy_idl_StubVtblList,

-    (const PCInterfaceName * ) & _updater_legacy_idl_InterfaceNamesList,

-    (const IID ** ) & _updater_legacy_idl_BaseIIDList,

-    & _updater_legacy_idl_IID_Lookup, 

+    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_chrome_branded_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _updater_legacy_idl_chrome_branded_StubVtblList,

+    (const PCInterfaceName * ) & _updater_legacy_idl_chrome_branded_InterfaceNamesList,

+    (const IID ** ) & _updater_legacy_idl_chrome_branded_BaseIIDList,

+    & _updater_legacy_idl_chrome_branded_IID_Lookup, 

     11,

     2,

     0, /* table of [async_uuid] interfaces */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.dlldata.c
similarity index 86%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.dlldata.c
index e8e1b9d6..eb0a6d1 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.dlldata.c
@@ -19,12 +19,12 @@
 extern "C"   {

 #endif

 

-EXTERN_PROXY_FILE( updater_legacy_idl )

+EXTERN_PROXY_FILE( updater_legacy_idl_open_source )

 

 

 PROXYFILE_LIST_START

 /* Start of list */

-  REFERENCE_PROXY_FILE( updater_legacy_idl ),

+  REFERENCE_PROXY_FILE( updater_legacy_idl_open_source ),

 /* End of list */

 PROXYFILE_LIST_END

 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.h
similarity index 98%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.h
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.h
index 7438529..f75a6d3 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl.h
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.h
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -36,8 +36,8 @@
 #include "ole2.h"

 #endif /*COM_NO_WINDOWS_H*/

 

-#ifndef __updater_legacy_idl_h__

-#define __updater_legacy_idl_h__

+#ifndef __updater_legacy_idl_open_source_h__

+#define __updater_legacy_idl_open_source_h__

 

 #if defined(_MSC_VER) && (_MSC_VER >= 1020)

 #pragma once

@@ -276,7 +276,7 @@
 #endif 

 

 

-/* interface __MIDL_itf_updater_legacy_idl_0000_0000 */

+/* interface __MIDL_itf_updater_legacy_idl_open_source_0000_0000 */

 /* [local] */ 

 

 typedef 

@@ -311,8 +311,8 @@
     } ;

 

 

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_c_ifspec;

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_s_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_open_source_0000_0000_v0_0_c_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_open_source_0000_0000_v0_0_s_ifspec;

 

 #ifndef __ICurrentState_INTERFACE_DEFINED__

 #define __ICurrentState_INTERFACE_DEFINED__

@@ -325,7 +325,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("247954F9-9EDC-4E68-8CC3-150C2B89EADF")

+    MIDL_INTERFACE("BE5D3E90-A66C-4A0A-9B7B-1A6B9BF3971E")

     ICurrentState : public IDispatch

     {

     public:

@@ -639,7 +639,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("494B20CF-282E-4BDD-9F5D-B70CB09D351E")

+    MIDL_INTERFACE("027234BD-61BB-4F5C-9386-7FE804171C8C")

     IGoogleUpdate3Web : public IDispatch

     {

     public:

@@ -777,7 +777,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("DD42475D-6D46-496a-924E-BD5630B4CBBA")

+    MIDL_INTERFACE("D734C877-21F4-496E-B857-3E5B2E72E4CC")

     IAppBundleWeb : public IDispatch

     {

     public:

@@ -1085,7 +1085,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("18D0F672-18B4-48e6-AD36-6E6BF01DBBC4")

+    MIDL_INTERFACE("2C6218B9-088D-4D25-A4F8-570558124142")

     IAppWeb : public IDispatch

     {

     public:

@@ -1318,7 +1318,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("8476CE12-AE1F-4198-805C-BA0F9B783F57")

+    MIDL_INTERFACE("87DBF75E-F590-4802-93FD-F8D07800E2E9")

     IAppCommandWeb : public IDispatch

     {

     public:

@@ -1505,7 +1505,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("F63F6F8B-ACD5-413C-A44B-0409136D26CB")

+    MIDL_INTERFACE("7D908375-C9D0-44C5-BB98-206F3C24A74C")

     IPolicyStatus : public IDispatch

     {

     public:

@@ -1745,7 +1745,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("27634814-8E41-4C35-8577-980134A96544")

+    MIDL_INTERFACE("47C8886A-A4B5-4F6C-865A-41A207074DFA")

     IPolicyStatusValue : public IDispatch

     {

     public:

@@ -1927,7 +1927,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("34527502-D3DB-4205-A69B-789B27EE0414")

+    MIDL_INTERFACE("9D31EA63-2E06-4D41-98C7-CB1F307DB597")

     IPolicyStatus2 : public IDispatch

     {

     public:

@@ -2240,7 +2240,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("05A30352-EB25-45B6-8449-BCA7B0542CE5")

+    MIDL_INTERFACE("5C674FC1-80E3-48D2-987B-79D9D286065B")

     IPolicyStatus3 : public IPolicyStatus2

     {

     public:

@@ -2514,7 +2514,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("128C2DA6-2BC0-44c0-B3F6-4EC22E647964")

+    MIDL_INTERFACE("EED70106-3604-4385-866E-6D540E99CA1A")

     IProcessLauncher : public IUnknown

     {

     public:

@@ -2628,7 +2628,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("D106AB5F-A70E-400E-A21B-96208C1D8DBB")

+    MIDL_INTERFACE("BAEE6326-C925-4FA4-AFE9-5FA69902B021")

     IProcessLauncher2 : public IProcessLauncher

     {

     public:

@@ -2761,7 +2761,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("22181302-A8A6-4f84-A541-E5CBFC70CC43")

+class DECLSPEC_UUID("75828ED1-7BE8-45D0-8950-AA85CBF74510")

 GoogleUpdate3WebUserClass;

 #endif

 

@@ -2769,7 +2769,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("8A1D4361-2C08-4700-A351-3EAA9CBFF5E4")

+class DECLSPEC_UUID("283209B7-C761-41CA-BE8D-B5321CD78FD6")

 GoogleUpdate3WebSystemClass;

 #endif

 

@@ -2777,7 +2777,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("6DDCE70D-A4AE-4E97-908C-BE7B2DB750AD")

+class DECLSPEC_UUID("4DAC24AB-B340-4B7E-AD01-1504A7F59EEA")

 PolicyStatusUserClass;

 #endif

 

@@ -2785,7 +2785,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("521FDB42-7130-4806-822A-FC5163FAD983")

+class DECLSPEC_UUID("83FE19AC-72A6-4A72-B136-724444121586")

 PolicyStatusSystemClass;

 #endif

 

@@ -2793,7 +2793,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("ABC01078-F197-4b0b-ADBC-CFE684B39C82")

+class DECLSPEC_UUID("811A664F-703E-407C-A323-E6E31D1EFFA0")

 ProcessLauncherClass;

 #endif

 #endif /* __UpdaterLegacyLib_LIBRARY_DEFINED__ */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.tlb b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.tlb
new file mode 100644
index 0000000..d11b5478
--- /dev/null
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source_i.c
new file mode 100644
index 0000000..14960dd
--- /dev/null
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source_i.c
@@ -0,0 +1,127 @@
+

+

+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */

+

+/* link this file in with the server and any clients */

+

+

+ /* File created by MIDL compiler version 8.xx.xxxx */

+/* at a redacted point in time

+ */

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

+    Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.xx.xxxx 

+    protocol : dce , ms_ext, c_ext, robust

+    error checks: allocation ref bounds_check enum stub_data 

+    VC __declspec() decoration level: 

+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)

+         DECLSPEC_UUID(), MIDL_INTERFACE()

+*/

+/* @@MIDL_FILE_HEADING(  ) */

+

+#pragma warning( disable: 4049 )  /* more than 64k source lines */

+

+

+#ifdef __cplusplus

+extern "C"{

+#endif 

+

+

+#include <rpc.h>

+#include <rpcndr.h>

+

+#ifdef _MIDL_USE_GUIDDEF_

+

+#ifndef INITGUID

+#define INITGUID

+#include <guiddef.h>

+#undef INITGUID

+#else

+#include <guiddef.h>

+#endif

+

+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \

+        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)

+

+#else // !_MIDL_USE_GUIDDEF_

+

+#ifndef __IID_DEFINED__

+#define __IID_DEFINED__

+

+typedef struct _IID

+{

+    unsigned long x;

+    unsigned short s1;

+    unsigned short s2;

+    unsigned char  c[8];

+} IID;

+

+#endif // __IID_DEFINED__

+

+#ifndef CLSID_DEFINED

+#define CLSID_DEFINED

+typedef IID CLSID;

+#endif // CLSID_DEFINED

+

+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \

+        EXTERN_C __declspec(selectany) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

+

+#endif // !_MIDL_USE_GUIDDEF_

+

+MIDL_DEFINE_GUID(IID, IID_ICurrentState,0xBE5D3E90,0xA66C,0x4A0A,0x9B,0x7B,0x1A,0x6B,0x9B,0xF3,0x97,0x1E);

+

+

+MIDL_DEFINE_GUID(IID, IID_IGoogleUpdate3Web,0x027234BD,0x61BB,0x4F5C,0x93,0x86,0x7F,0xE8,0x04,0x17,0x1C,0x8C);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xD734C877,0x21F4,0x496E,0xB8,0x57,0x3E,0x5B,0x2E,0x72,0xE4,0xCC);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x2C6218B9,0x088D,0x4D25,0xA4,0xF8,0x57,0x05,0x58,0x12,0x41,0x42);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppCommandWeb,0x87DBF75E,0xF590,0x4802,0x93,0xFD,0xF8,0xD0,0x78,0x00,0xE2,0xE9);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus,0x7D908375,0xC9D0,0x44C5,0xBB,0x98,0x20,0x6F,0x3C,0x24,0xA7,0x4C);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatusValue,0x47C8886A,0xA4B5,0x4F6C,0x86,0x5A,0x41,0xA2,0x07,0x07,0x4D,0xFA);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus2,0x9D31EA63,0x2E06,0x4D41,0x98,0xC7,0xCB,0x1F,0x30,0x7D,0xB5,0x97);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus3,0x5C674FC1,0x80E3,0x48D2,0x98,0x7B,0x79,0xD9,0xD2,0x86,0x06,0x5B);

+

+

+MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0xEED70106,0x3604,0x4385,0x86,0x6E,0x6D,0x54,0x0E,0x99,0xCA,0x1A);

+

+

+MIDL_DEFINE_GUID(IID, IID_IProcessLauncher2,0xBAEE6326,0xC925,0x4FA4,0xAF,0xE9,0x5F,0xA6,0x99,0x02,0xB0,0x21);

+

+

+MIDL_DEFINE_GUID(IID, LIBID_UpdaterLegacyLib,0x4C61BB05,0x94D1,0x4BAB,0xB6,0x9C,0xC3,0x41,0x95,0xAF,0x92,0xCA);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x75828ED1,0x7BE8,0x45D0,0x89,0x50,0xAA,0x85,0xCB,0xF7,0x45,0x10);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebSystemClass,0x283209B7,0xC761,0x41CA,0xBE,0x8D,0xB5,0x32,0x1C,0xD7,0x8F,0xD6);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusUserClass,0x4DAC24AB,0xB340,0x4B7E,0xAD,0x01,0x15,0x04,0xA7,0xF5,0x9E,0xEA);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusSystemClass,0x83FE19AC,0x72A6,0x4A72,0xB1,0x36,0x72,0x44,0x44,0x12,0x15,0x86);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0x811A664F,0x703E,0x407C,0xA3,0x23,0xE6,0xE3,0x1D,0x1E,0xFF,0xA0);

+

+#undef MIDL_DEFINE_GUID

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source_p.c
similarity index 95%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_p.c
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source_p.c
index e0d8836..445b0b59b 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_p.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x64/updater_legacy_idl_open_source_p.c
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -44,7 +44,7 @@
 #endif /* __RPCPROXY_H_VERSION__ */

 

 

-#include "updater_legacy_idl.h"

+#include "updater_legacy_idl_open_source.h"

 

 #define TYPE_FORMAT_STRING_SIZE   1089                              

 #define PROC_FORMAT_STRING_SIZE   2919                              

@@ -52,23 +52,23 @@
 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   2            

 

-typedef struct _updater_legacy_idl_MIDL_TYPE_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_TYPE_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_PROC_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_PROC_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_EXPR_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING

     {

     long          Pad;

     unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_EXPR_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING;

 

 

 static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

@@ -127,9 +127,9 @@
 #endif

 

 

-extern const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString;

-extern const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString;

-extern const updater_legacy_idl_MIDL_EXPR_FORMAT_STRING updater_legacy_idl__MIDL_ExprFormatString;

+extern const updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_open_source__MIDL_TypeFormatString;

+extern const updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ProcFormatString;

+extern const updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ExprFormatString;

 

 

 extern const MIDL_STUB_DESC Object_StubDesc;

@@ -215,7 +215,7 @@
 #error  Invalid build platform for this stub.

 #endif

 

-static const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString =

+static const updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ProcFormatString =

     {

         0,

         {

@@ -2760,7 +2760,7 @@
         }

     };

 

-static const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString =

+static const updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_open_source__MIDL_TypeFormatString =

     {

         0,

         {

@@ -3448,17 +3448,17 @@
 /* 1058 */	

 			0x2f,		/* FC_IP */

 			0x5a,		/* FC_CONSTANT_IID */

-/* 1060 */	NdrFcLong( 0x27634814 ),	/* 660817940 */

-/* 1064 */	NdrFcShort( 0x8e41 ),	/* -29119 */

-/* 1066 */	NdrFcShort( 0x4c35 ),	/* 19509 */

-/* 1068 */	0x85,		/* 133 */

-			0x77,		/* 119 */

-/* 1070 */	0x98,		/* 152 */

-			0x1,		/* 1 */

-/* 1072 */	0x34,		/* 52 */

-			0xa9,		/* 169 */

-/* 1074 */	0x65,		/* 101 */

-			0x44,		/* 68 */

+/* 1060 */	NdrFcLong( 0x47c8886a ),	/* 1204324458 */

+/* 1064 */	NdrFcShort( 0xa4b5 ),	/* -23371 */

+/* 1066 */	NdrFcShort( 0x4f6c ),	/* 20332 */

+/* 1068 */	0x86,		/* 134 */

+			0x5a,		/* 90 */

+/* 1070 */	0x41,		/* 65 */

+			0xa2,		/* 162 */

+/* 1072 */	0x7,		/* 7 */

+			0x7,		/* 7 */

+/* 1074 */	0x4d,		/* 77 */

+			0xfa,		/* 250 */

 /* 1076 */	

 			0x11, 0x8,	/* FC_RP [simple_pointer] */

 /* 1078 */	0x6,		/* FC_SHORT */

@@ -3504,7 +3504,7 @@
 

 

 

-/* Standard interface: __MIDL_itf_updater_legacy_idl_0000_0000, ver. 0.0,

+/* Standard interface: __MIDL_itf_updater_legacy_idl_open_source_0000_0000, ver. 0.0,

    GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

 

 

@@ -3517,7 +3517,7 @@
 

 

 /* Object interface: ICurrentState, ver. 0.0,

-   GUID={0x247954F9,0x9EDC,0x4E68,{0x8C,0xC3,0x15,0x0C,0x2B,0x89,0xEA,0xDF}} */

+   GUID={0xBE5D3E90,0xA66C,0x4A0A,{0x9B,0x7B,0x1A,0x6B,0x9B,0xF3,0x97,0x1E}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short ICurrentState_FormatStringOffsetTable[] =

@@ -3548,7 +3548,7 @@
 static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3560,7 +3560,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3633,7 +3633,7 @@
 

 

 /* Object interface: IGoogleUpdate3Web, ver. 0.0,

-   GUID={0x494B20CF,0x282E,0x4BDD,{0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E}} */

+   GUID={0x027234BD,0x61BB,0x4F5C,{0x93,0x86,0x7F,0xE8,0x04,0x17,0x1C,0x8C}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IGoogleUpdate3Web_FormatStringOffsetTable[] =

@@ -3648,7 +3648,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3660,7 +3660,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3701,7 +3701,7 @@
 

 

 /* Object interface: IAppBundleWeb, ver. 0.0,

-   GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */

+   GUID={0xD734C877,0x21F4,0x496E,{0xB8,0x57,0x3E,0x5B,0x2E,0x72,0xE4,0xCC}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] =

@@ -3732,7 +3732,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3744,7 +3744,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3817,7 +3817,7 @@
 

 

 /* Object interface: IAppWeb, ver. 0.0,

-   GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */

+   GUID={0x2C6218B9,0x088D,0x4D25,{0xA4,0xF8,0x57,0x05,0x58,0x12,0x41,0x42}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppWeb_FormatStringOffsetTable[] =

@@ -3841,7 +3841,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3853,7 +3853,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3912,7 +3912,7 @@
 

 

 /* Object interface: IAppCommandWeb, ver. 0.0,

-   GUID={0x8476CE12,0xAE1F,0x4198,{0x80,0x5C,0xBA,0x0F,0x9B,0x78,0x3F,0x57}} */

+   GUID={0x87DBF75E,0xF590,0x4802,{0x93,0xFD,0xF8,0xD0,0x78,0x00,0xE2,0xE9}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppCommandWeb_FormatStringOffsetTable[] =

@@ -3930,7 +3930,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3942,7 +3942,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3989,7 +3989,7 @@
 

 

 /* Object interface: IPolicyStatus, ver. 0.0,

-   GUID={0xF63F6F8B,0xACD5,0x413C,{0xA4,0x4B,0x04,0x09,0x13,0x6D,0x26,0xCB}} */

+   GUID={0x7D908375,0xC9D0,0x44C5,{0xBB,0x98,0x20,0x6F,0x3C,0x24,0xA7,0x4C}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus_FormatStringOffsetTable[] =

@@ -4012,7 +4012,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4024,7 +4024,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4081,7 +4081,7 @@
 

 

 /* Object interface: IPolicyStatusValue, ver. 0.0,

-   GUID={0x27634814,0x8E41,0x4C35,{0x85,0x77,0x98,0x01,0x34,0xA9,0x65,0x44}} */

+   GUID={0x47C8886A,0xA4B5,0x4F6C,{0x86,0x5A,0x41,0xA2,0x07,0x07,0x4D,0xFA}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatusValue_FormatStringOffsetTable[] =

@@ -4100,7 +4100,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatusValue_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4112,7 +4112,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4161,7 +4161,7 @@
 

 

 /* Object interface: IPolicyStatus2, ver. 0.0,

-   GUID={0x34527502,0xD3DB,0x4205,{0xA6,0x9B,0x78,0x9B,0x27,0xEE,0x04,0x14}} */

+   GUID={0x9D31EA63,0x2E06,0x4D41,{0x98,0xC7,0xCB,0x1F,0x30,0x7D,0xB5,0x97}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus2_FormatStringOffsetTable[] =

@@ -4191,7 +4191,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4203,7 +4203,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4274,7 +4274,7 @@
 

 

 /* Object interface: IPolicyStatus3, ver. 0.0,

-   GUID={0x05A30352,0xEB25,0x45B6,{0x84,0x49,0xBC,0xA7,0xB0,0x54,0x2C,0xE5}} */

+   GUID={0x5C674FC1,0x80E3,0x48D2,{0x98,0x7B,0x79,0xD9,0xD2,0x86,0x06,0x5B}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus3_FormatStringOffsetTable[] =

@@ -4305,7 +4305,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus3_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4317,7 +4317,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4390,7 +4390,7 @@
 

 

 /* Object interface: IProcessLauncher, ver. 0.0,

-   GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */

+   GUID={0xEED70106,0x3604,0x4385,{0x86,0x6E,0x6D,0x54,0x0E,0x99,0xCA,0x1A}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =

@@ -4403,7 +4403,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4415,7 +4415,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4444,7 +4444,7 @@
 

 

 /* Object interface: IProcessLauncher2, ver. 0.0,

-   GUID={0xD106AB5F,0xA70E,0x400E,{0xA2,0x1B,0x96,0x20,0x8C,0x1D,0x8D,0xBB}} */

+   GUID={0xBAEE6326,0xC925,0x4FA4,{0xAF,0xE9,0x5F,0xA6,0x99,0x02,0xB0,0x21}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IProcessLauncher2_FormatStringOffsetTable[] =

@@ -4458,7 +4458,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4470,7 +4470,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4508,7 +4508,7 @@
     0,

     0,

     0,

-    updater_legacy_idl__MIDL_TypeFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_TypeFormatString.Format,

     1, /* -error bounds_check flag */

     0x50002, /* Ndr library version */

     0,

@@ -4522,92 +4522,92 @@
     0

     };

 

-const CInterfaceProxyVtbl * const _updater_legacy_idl_ProxyVtblList[] = 

+const CInterfaceProxyVtbl * const _updater_legacy_idl_open_source_ProxyVtblList[] = 

 {

-    ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatusValueProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatus3ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IProcessLauncher2ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatusProxyVtbl,

     ( CInterfaceProxyVtbl *) &_IProcessLauncherProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IProcessLauncher2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatusValueProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatusProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

     ( CInterfaceProxyVtbl *) &_ICurrentStateProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatus3ProxyVtbl,

     0

 };

 

-const CInterfaceStubVtbl * const _updater_legacy_idl_StubVtblList[] = 

+const CInterfaceStubVtbl * const _updater_legacy_idl_open_source_StubVtblList[] = 

 {

-    ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatusValueStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatus3StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IProcessLauncher2StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatusStubVtbl,

     ( CInterfaceStubVtbl *) &_IProcessLauncherStubVtbl,

-    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IProcessLauncher2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatusValueStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatusStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

     ( CInterfaceStubVtbl *) &_ICurrentStateStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatus3StubVtbl,

     0

 };

 

-PCInterfaceName const _updater_legacy_idl_InterfaceNamesList[] = 

+PCInterfaceName const _updater_legacy_idl_open_source_InterfaceNamesList[] = 

 {

-    "IPolicyStatus2",

-    "IAppCommandWeb",

-    "IPolicyStatusValue",

-    "IPolicyStatus3",

-    "IAppBundleWeb",

-    "IProcessLauncher2",

-    "IAppWeb",

-    "IPolicyStatus",

     "IProcessLauncher",

-    "IGoogleUpdate3Web",

+    "IProcessLauncher2",

+    "IAppCommandWeb",

+    "IPolicyStatus2",

+    "IPolicyStatusValue",

+    "IPolicyStatus",

+    "IAppBundleWeb",

     "ICurrentState",

+    "IAppWeb",

+    "IGoogleUpdate3Web",

+    "IPolicyStatus3",

     0

 };

 

-const IID *  const _updater_legacy_idl_BaseIIDList[] = 

+const IID *  const _updater_legacy_idl_open_source_BaseIIDList[] = 

 {

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

+    0,

     0,

     &IID_IDispatch,

     &IID_IDispatch,

-    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

     &IID_IDispatch,

     &IID_IDispatch,

     0

 };

 

 

-#define _updater_legacy_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl, pIID, n)

+#define _updater_legacy_idl_open_source_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl_open_source, pIID, n)

 

-int __stdcall _updater_legacy_idl_IID_Lookup( const IID * pIID, int * pIndex )

+int __stdcall _updater_legacy_idl_open_source_IID_Lookup( const IID * pIID, int * pIndex )

 {

     IID_BS_LOOKUP_SETUP

 

-    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl, 11, 8 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 4 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 2 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 1 )

-    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl, 11, *pIndex )

+    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl_open_source, 11, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl_open_source, 11, *pIndex )

     

 }

 

-const ExtendedProxyFileInfo updater_legacy_idl_ProxyFileInfo = 

+const ExtendedProxyFileInfo updater_legacy_idl_open_source_ProxyFileInfo = 

 {

-    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_ProxyVtblList,

-    (PCInterfaceStubVtblList *) & _updater_legacy_idl_StubVtblList,

-    (const PCInterfaceName * ) & _updater_legacy_idl_InterfaceNamesList,

-    (const IID ** ) & _updater_legacy_idl_BaseIIDList,

-    & _updater_legacy_idl_IID_Lookup, 

+    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_open_source_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _updater_legacy_idl_open_source_StubVtblList,

+    (const PCInterfaceName * ) & _updater_legacy_idl_open_source_InterfaceNamesList,

+    (const IID ** ) & _updater_legacy_idl_open_source_BaseIIDList,

+    & _updater_legacy_idl_open_source_IID_Lookup, 

     11,

     2,

     0, /* table of [async_uuid] interfaces */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.dlldata.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.dlldata.c
similarity index 86%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.dlldata.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.dlldata.c
index e8e1b9d6..ac0b647 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.dlldata.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.dlldata.c
@@ -19,12 +19,12 @@
 extern "C"   {

 #endif

 

-EXTERN_PROXY_FILE( updater_legacy_idl )

+EXTERN_PROXY_FILE( updater_legacy_idl_chrome_branded )

 

 

 PROXYFILE_LIST_START

 /* Start of list */

-  REFERENCE_PROXY_FILE( updater_legacy_idl ),

+  REFERENCE_PROXY_FILE( updater_legacy_idl_chrome_branded ),

 /* End of list */

 PROXYFILE_LIST_END

 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h
similarity index 99%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.h
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h
index a02c2024c..9f1f30d 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.h
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.h
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -36,8 +36,8 @@
 #include "ole2.h"

 #endif /*COM_NO_WINDOWS_H*/

 

-#ifndef __updater_legacy_idl_h__

-#define __updater_legacy_idl_h__

+#ifndef __updater_legacy_idl_chrome_branded_h__

+#define __updater_legacy_idl_chrome_branded_h__

 

 #if defined(_MSC_VER) && (_MSC_VER >= 1020)

 #pragma once

@@ -276,7 +276,7 @@
 #endif 

 

 

-/* interface __MIDL_itf_updater_legacy_idl_0000_0000 */

+/* interface __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000 */

 /* [local] */ 

 

 typedef 

@@ -311,8 +311,8 @@
     } ;

 

 

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_c_ifspec;

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_s_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000_v0_0_c_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000_v0_0_s_ifspec;

 

 #ifndef __ICurrentState_INTERFACE_DEFINED__

 #define __ICurrentState_INTERFACE_DEFINED__

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.tlb b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.tlb
similarity index 100%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.tlb
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c
similarity index 97%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_i.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c
index 3bd8e36e..25e9357a 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_i.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_i.c
@@ -8,7 +8,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c
similarity index 96%
rename from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_p.c
rename to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c
index d3ebd1b..a57ff75 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_p.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_chrome_branded_p.c
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_chrome_branded.template:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -47,7 +47,7 @@
 #endif /* __RPCPROXY_H_VERSION__ */

 

 

-#include "updater_legacy_idl.h"

+#include "updater_legacy_idl_chrome_branded.h"

 

 #define TYPE_FORMAT_STRING_SIZE   1131                              

 #define PROC_FORMAT_STRING_SIZE   2773                              

@@ -55,23 +55,23 @@
 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   2            

 

-typedef struct _updater_legacy_idl_MIDL_TYPE_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_TYPE_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_PROC_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_PROC_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_EXPR_FORMAT_STRING

+typedef struct _updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING

     {

     long          Pad;

     unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_EXPR_FORMAT_STRING;

+    } updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING;

 

 

 static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

@@ -130,9 +130,9 @@
 #endif

 

 

-extern const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString;

-extern const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString;

-extern const updater_legacy_idl_MIDL_EXPR_FORMAT_STRING updater_legacy_idl__MIDL_ExprFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_TypeFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ProcFormatString;

+extern const updater_legacy_idl_chrome_branded_MIDL_EXPR_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ExprFormatString;

 

 

 extern const MIDL_STUB_DESC Object_StubDesc;

@@ -226,7 +226,7 @@
 #endif

 

 

-static const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString =

+static const updater_legacy_idl_chrome_branded_MIDL_PROC_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_ProcFormatString =

     {

         0,

         {

@@ -2698,7 +2698,7 @@
         }

     };

 

-static const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString =

+static const updater_legacy_idl_chrome_branded_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_chrome_branded__MIDL_TypeFormatString =

     {

         0,

         {

@@ -3506,7 +3506,7 @@
 

 

 

-/* Standard interface: __MIDL_itf_updater_legacy_idl_0000_0000, ver. 0.0,

+/* Standard interface: __MIDL_itf_updater_legacy_idl_chrome_branded_0000_0000, ver. 0.0,

    GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

 

 

@@ -3550,7 +3550,7 @@
 static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3562,7 +3562,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3650,7 +3650,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3662,7 +3662,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3734,7 +3734,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3746,7 +3746,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3843,7 +3843,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3855,7 +3855,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3932,7 +3932,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3944,7 +3944,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4014,7 +4014,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4026,7 +4026,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4102,7 +4102,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatusValue_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4114,7 +4114,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4193,7 +4193,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4205,7 +4205,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4307,7 +4307,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus3_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4319,7 +4319,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4405,7 +4405,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4417,7 +4417,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4460,7 +4460,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4472,7 +4472,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4510,7 +4510,7 @@
     0,

     0,

     0,

-    updater_legacy_idl__MIDL_TypeFormatString.Format,

+    updater_legacy_idl_chrome_branded__MIDL_TypeFormatString.Format,

     1, /* -error bounds_check flag */

     0x50002, /* Ndr library version */

     0,

@@ -4524,7 +4524,7 @@
     0

     };

 

-const CInterfaceProxyVtbl * const _updater_legacy_idl_ProxyVtblList[] = 

+const CInterfaceProxyVtbl * const _updater_legacy_idl_chrome_branded_ProxyVtblList[] = 

 {

     ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

     ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

@@ -4540,7 +4540,7 @@
     0

 };

 

-const CInterfaceStubVtbl * const _updater_legacy_idl_StubVtblList[] = 

+const CInterfaceStubVtbl * const _updater_legacy_idl_chrome_branded_StubVtblList[] = 

 {

     ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

     ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

@@ -4556,7 +4556,7 @@
     0

 };

 

-PCInterfaceName const _updater_legacy_idl_InterfaceNamesList[] = 

+PCInterfaceName const _updater_legacy_idl_chrome_branded_InterfaceNamesList[] = 

 {

     "IPolicyStatus2",

     "IAppCommandWeb",

@@ -4572,7 +4572,7 @@
     0

 };

 

-const IID *  const _updater_legacy_idl_BaseIIDList[] = 

+const IID *  const _updater_legacy_idl_chrome_branded_BaseIIDList[] = 

 {

     &IID_IDispatch,

     &IID_IDispatch,

@@ -4589,27 +4589,27 @@
 };

 

 

-#define _updater_legacy_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl, pIID, n)

+#define _updater_legacy_idl_chrome_branded_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl_chrome_branded, pIID, n)

 

-int __stdcall _updater_legacy_idl_IID_Lookup( const IID * pIID, int * pIndex )

+int __stdcall _updater_legacy_idl_chrome_branded_IID_Lookup( const IID * pIID, int * pIndex )

 {

     IID_BS_LOOKUP_SETUP

 

-    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl, 11, 8 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 4 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 2 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 1 )

-    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl, 11, *pIndex )

+    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl_chrome_branded, 11, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_chrome_branded, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl_chrome_branded, 11, *pIndex )

     

 }

 

-const ExtendedProxyFileInfo updater_legacy_idl_ProxyFileInfo = 

+const ExtendedProxyFileInfo updater_legacy_idl_chrome_branded_ProxyFileInfo = 

 {

-    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_ProxyVtblList,

-    (PCInterfaceStubVtblList *) & _updater_legacy_idl_StubVtblList,

-    (const PCInterfaceName * ) & _updater_legacy_idl_InterfaceNamesList,

-    (const IID ** ) & _updater_legacy_idl_BaseIIDList,

-    & _updater_legacy_idl_IID_Lookup, 

+    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_chrome_branded_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _updater_legacy_idl_chrome_branded_StubVtblList,

+    (const PCInterfaceName * ) & _updater_legacy_idl_chrome_branded_InterfaceNamesList,

+    (const IID ** ) & _updater_legacy_idl_chrome_branded_BaseIIDList,

+    & _updater_legacy_idl_chrome_branded_IID_Lookup, 

     11,

     2,

     0, /* table of [async_uuid] interfaces */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.dlldata.c
similarity index 86%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.dlldata.c
index e8e1b9d6..eb0a6d1 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/arm64/updater_legacy_idl.dlldata.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.dlldata.c
@@ -19,12 +19,12 @@
 extern "C"   {

 #endif

 

-EXTERN_PROXY_FILE( updater_legacy_idl )

+EXTERN_PROXY_FILE( updater_legacy_idl_open_source )

 

 

 PROXYFILE_LIST_START

 /* Start of list */

-  REFERENCE_PROXY_FILE( updater_legacy_idl ),

+  REFERENCE_PROXY_FILE( updater_legacy_idl_open_source ),

 /* End of list */

 PROXYFILE_LIST_END

 

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.h b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.h
similarity index 98%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.h
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.h
index a02c2024c..a6a7b01 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl.h
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.h
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -36,8 +36,8 @@
 #include "ole2.h"

 #endif /*COM_NO_WINDOWS_H*/

 

-#ifndef __updater_legacy_idl_h__

-#define __updater_legacy_idl_h__

+#ifndef __updater_legacy_idl_open_source_h__

+#define __updater_legacy_idl_open_source_h__

 

 #if defined(_MSC_VER) && (_MSC_VER >= 1020)

 #pragma once

@@ -276,7 +276,7 @@
 #endif 

 

 

-/* interface __MIDL_itf_updater_legacy_idl_0000_0000 */

+/* interface __MIDL_itf_updater_legacy_idl_open_source_0000_0000 */

 /* [local] */ 

 

 typedef 

@@ -311,8 +311,8 @@
     } ;

 

 

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_c_ifspec;

-extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_0000_0000_v0_0_s_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_open_source_0000_0000_v0_0_c_ifspec;

+extern RPC_IF_HANDLE __MIDL_itf_updater_legacy_idl_open_source_0000_0000_v0_0_s_ifspec;

 

 #ifndef __ICurrentState_INTERFACE_DEFINED__

 #define __ICurrentState_INTERFACE_DEFINED__

@@ -325,7 +325,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("247954F9-9EDC-4E68-8CC3-150C2B89EADF")

+    MIDL_INTERFACE("BE5D3E90-A66C-4A0A-9B7B-1A6B9BF3971E")

     ICurrentState : public IDispatch

     {

     public:

@@ -639,7 +639,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("494B20CF-282E-4BDD-9F5D-B70CB09D351E")

+    MIDL_INTERFACE("027234BD-61BB-4F5C-9386-7FE804171C8C")

     IGoogleUpdate3Web : public IDispatch

     {

     public:

@@ -777,7 +777,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("DD42475D-6D46-496a-924E-BD5630B4CBBA")

+    MIDL_INTERFACE("D734C877-21F4-496E-B857-3E5B2E72E4CC")

     IAppBundleWeb : public IDispatch

     {

     public:

@@ -1085,7 +1085,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("18D0F672-18B4-48e6-AD36-6E6BF01DBBC4")

+    MIDL_INTERFACE("2C6218B9-088D-4D25-A4F8-570558124142")

     IAppWeb : public IDispatch

     {

     public:

@@ -1318,7 +1318,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("8476CE12-AE1F-4198-805C-BA0F9B783F57")

+    MIDL_INTERFACE("87DBF75E-F590-4802-93FD-F8D07800E2E9")

     IAppCommandWeb : public IDispatch

     {

     public:

@@ -1505,7 +1505,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("F63F6F8B-ACD5-413C-A44B-0409136D26CB")

+    MIDL_INTERFACE("7D908375-C9D0-44C5-BB98-206F3C24A74C")

     IPolicyStatus : public IDispatch

     {

     public:

@@ -1745,7 +1745,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("27634814-8E41-4C35-8577-980134A96544")

+    MIDL_INTERFACE("47C8886A-A4B5-4F6C-865A-41A207074DFA")

     IPolicyStatusValue : public IDispatch

     {

     public:

@@ -1927,7 +1927,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("34527502-D3DB-4205-A69B-789B27EE0414")

+    MIDL_INTERFACE("9D31EA63-2E06-4D41-98C7-CB1F307DB597")

     IPolicyStatus2 : public IDispatch

     {

     public:

@@ -2240,7 +2240,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("05A30352-EB25-45B6-8449-BCA7B0542CE5")

+    MIDL_INTERFACE("5C674FC1-80E3-48D2-987B-79D9D286065B")

     IPolicyStatus3 : public IPolicyStatus2

     {

     public:

@@ -2514,7 +2514,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("128C2DA6-2BC0-44c0-B3F6-4EC22E647964")

+    MIDL_INTERFACE("EED70106-3604-4385-866E-6D540E99CA1A")

     IProcessLauncher : public IUnknown

     {

     public:

@@ -2628,7 +2628,7 @@
 

 #if defined(__cplusplus) && !defined(CINTERFACE)

     

-    MIDL_INTERFACE("D106AB5F-A70E-400E-A21B-96208C1D8DBB")

+    MIDL_INTERFACE("BAEE6326-C925-4FA4-AFE9-5FA69902B021")

     IProcessLauncher2 : public IProcessLauncher

     {

     public:

@@ -2761,7 +2761,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("22181302-A8A6-4f84-A541-E5CBFC70CC43")

+class DECLSPEC_UUID("75828ED1-7BE8-45D0-8950-AA85CBF74510")

 GoogleUpdate3WebUserClass;

 #endif

 

@@ -2769,7 +2769,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("8A1D4361-2C08-4700-A351-3EAA9CBFF5E4")

+class DECLSPEC_UUID("283209B7-C761-41CA-BE8D-B5321CD78FD6")

 GoogleUpdate3WebSystemClass;

 #endif

 

@@ -2777,7 +2777,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("6DDCE70D-A4AE-4E97-908C-BE7B2DB750AD")

+class DECLSPEC_UUID("4DAC24AB-B340-4B7E-AD01-1504A7F59EEA")

 PolicyStatusUserClass;

 #endif

 

@@ -2785,7 +2785,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("521FDB42-7130-4806-822A-FC5163FAD983")

+class DECLSPEC_UUID("83FE19AC-72A6-4A72-B136-724444121586")

 PolicyStatusSystemClass;

 #endif

 

@@ -2793,7 +2793,7 @@
 

 #ifdef __cplusplus

 

-class DECLSPEC_UUID("ABC01078-F197-4b0b-ADBC-CFE684B39C82")

+class DECLSPEC_UUID("811A664F-703E-407C-A323-E6E31D1EFFA0")

 ProcessLauncherClass;

 #endif

 #endif /* __UpdaterLegacyLib_LIBRARY_DEFINED__ */

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.tlb b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.tlb
new file mode 100644
index 0000000..c8698be
--- /dev/null
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source.tlb
Binary files differ
diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source_i.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source_i.c
new file mode 100644
index 0000000..78c3b67a
--- /dev/null
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source_i.c
@@ -0,0 +1,127 @@
+

+

+/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */

+

+/* link this file in with the server and any clients */

+

+

+ /* File created by MIDL compiler version 8.xx.xxxx */

+/* at a redacted point in time

+ */

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

+    Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.xx.xxxx 

+    protocol : dce , ms_ext, c_ext, robust

+    error checks: allocation ref bounds_check enum stub_data 

+    VC __declspec() decoration level: 

+         __declspec(uuid()), __declspec(selectany), __declspec(novtable)

+         DECLSPEC_UUID(), MIDL_INTERFACE()

+*/

+/* @@MIDL_FILE_HEADING(  ) */

+

+#pragma warning( disable: 4049 )  /* more than 64k source lines */

+

+

+#ifdef __cplusplus

+extern "C"{

+#endif 

+

+

+#include <rpc.h>

+#include <rpcndr.h>

+

+#ifdef _MIDL_USE_GUIDDEF_

+

+#ifndef INITGUID

+#define INITGUID

+#include <guiddef.h>

+#undef INITGUID

+#else

+#include <guiddef.h>

+#endif

+

+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \

+        DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)

+

+#else // !_MIDL_USE_GUIDDEF_

+

+#ifndef __IID_DEFINED__

+#define __IID_DEFINED__

+

+typedef struct _IID

+{

+    unsigned long x;

+    unsigned short s1;

+    unsigned short s2;

+    unsigned char  c[8];

+} IID;

+

+#endif // __IID_DEFINED__

+

+#ifndef CLSID_DEFINED

+#define CLSID_DEFINED

+typedef IID CLSID;

+#endif // CLSID_DEFINED

+

+#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \

+        EXTERN_C __declspec(selectany) const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

+

+#endif // !_MIDL_USE_GUIDDEF_

+

+MIDL_DEFINE_GUID(IID, IID_ICurrentState,0xBE5D3E90,0xA66C,0x4A0A,0x9B,0x7B,0x1A,0x6B,0x9B,0xF3,0x97,0x1E);

+

+

+MIDL_DEFINE_GUID(IID, IID_IGoogleUpdate3Web,0x027234BD,0x61BB,0x4F5C,0x93,0x86,0x7F,0xE8,0x04,0x17,0x1C,0x8C);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppBundleWeb,0xD734C877,0x21F4,0x496E,0xB8,0x57,0x3E,0x5B,0x2E,0x72,0xE4,0xCC);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppWeb,0x2C6218B9,0x088D,0x4D25,0xA4,0xF8,0x57,0x05,0x58,0x12,0x41,0x42);

+

+

+MIDL_DEFINE_GUID(IID, IID_IAppCommandWeb,0x87DBF75E,0xF590,0x4802,0x93,0xFD,0xF8,0xD0,0x78,0x00,0xE2,0xE9);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus,0x7D908375,0xC9D0,0x44C5,0xBB,0x98,0x20,0x6F,0x3C,0x24,0xA7,0x4C);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatusValue,0x47C8886A,0xA4B5,0x4F6C,0x86,0x5A,0x41,0xA2,0x07,0x07,0x4D,0xFA);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus2,0x9D31EA63,0x2E06,0x4D41,0x98,0xC7,0xCB,0x1F,0x30,0x7D,0xB5,0x97);

+

+

+MIDL_DEFINE_GUID(IID, IID_IPolicyStatus3,0x5C674FC1,0x80E3,0x48D2,0x98,0x7B,0x79,0xD9,0xD2,0x86,0x06,0x5B);

+

+

+MIDL_DEFINE_GUID(IID, IID_IProcessLauncher,0xEED70106,0x3604,0x4385,0x86,0x6E,0x6D,0x54,0x0E,0x99,0xCA,0x1A);

+

+

+MIDL_DEFINE_GUID(IID, IID_IProcessLauncher2,0xBAEE6326,0xC925,0x4FA4,0xAF,0xE9,0x5F,0xA6,0x99,0x02,0xB0,0x21);

+

+

+MIDL_DEFINE_GUID(IID, LIBID_UpdaterLegacyLib,0x4C61BB05,0x94D1,0x4BAB,0xB6,0x9C,0xC3,0x41,0x95,0xAF,0x92,0xCA);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebUserClass,0x75828ED1,0x7BE8,0x45D0,0x89,0x50,0xAA,0x85,0xCB,0xF7,0x45,0x10);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_GoogleUpdate3WebSystemClass,0x283209B7,0xC761,0x41CA,0xBE,0x8D,0xB5,0x32,0x1C,0xD7,0x8F,0xD6);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusUserClass,0x4DAC24AB,0xB340,0x4B7E,0xAD,0x01,0x15,0x04,0xA7,0xF5,0x9E,0xEA);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_PolicyStatusSystemClass,0x83FE19AC,0x72A6,0x4A72,0xB1,0x36,0x72,0x44,0x44,0x12,0x15,0x86);

+

+

+MIDL_DEFINE_GUID(CLSID, CLSID_ProcessLauncherClass,0x811A664F,0x703E,0x407C,0xA3,0x23,0xE6,0xE3,0x1D,0x1E,0xFF,0xA0);

+

+#undef MIDL_DEFINE_GUID

+

+#ifdef __cplusplus

+}

+#endif

+

+

+

diff --git a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_p.c b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source_p.c
similarity index 95%
copy from third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_p.c
copy to third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source_p.c
index d3ebd1b..b4910c9 100644
--- a/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_p.c
+++ b/third_party/win_build_output/midl/chrome/updater/app/server/win/x86/updater_legacy_idl_open_source_p.c
@@ -6,7 +6,7 @@
  /* File created by MIDL compiler version 8.xx.xxxx */

 /* at a redacted point in time

  */

-/* Compiler settings for ../../chrome/updater/app/server/win/updater_legacy_idl.template:

+/* Compiler settings for gen/chrome/updater/updater_legacy_idl_open_source.template:

     Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.xx.xxxx 

     protocol : dce , ms_ext, c_ext, robust

     error checks: allocation ref bounds_check enum stub_data 

@@ -47,7 +47,7 @@
 #endif /* __RPCPROXY_H_VERSION__ */

 

 

-#include "updater_legacy_idl.h"

+#include "updater_legacy_idl_open_source.h"

 

 #define TYPE_FORMAT_STRING_SIZE   1131                              

 #define PROC_FORMAT_STRING_SIZE   2773                              

@@ -55,23 +55,23 @@
 #define TRANSMIT_AS_TABLE_SIZE    0            

 #define WIRE_MARSHAL_TABLE_SIZE   2            

 

-typedef struct _updater_legacy_idl_MIDL_TYPE_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ TYPE_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_TYPE_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_PROC_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING

     {

     short          Pad;

     unsigned char  Format[ PROC_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_PROC_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING;

 

-typedef struct _updater_legacy_idl_MIDL_EXPR_FORMAT_STRING

+typedef struct _updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING

     {

     long          Pad;

     unsigned char  Format[ EXPR_FORMAT_STRING_SIZE ];

-    } updater_legacy_idl_MIDL_EXPR_FORMAT_STRING;

+    } updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING;

 

 

 static const RPC_SYNTAX_IDENTIFIER  _RpcTransferSyntax = 

@@ -130,9 +130,9 @@
 #endif

 

 

-extern const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString;

-extern const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString;

-extern const updater_legacy_idl_MIDL_EXPR_FORMAT_STRING updater_legacy_idl__MIDL_ExprFormatString;

+extern const updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_open_source__MIDL_TypeFormatString;

+extern const updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ProcFormatString;

+extern const updater_legacy_idl_open_source_MIDL_EXPR_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ExprFormatString;

 

 

 extern const MIDL_STUB_DESC Object_StubDesc;

@@ -226,7 +226,7 @@
 #endif

 

 

-static const updater_legacy_idl_MIDL_PROC_FORMAT_STRING updater_legacy_idl__MIDL_ProcFormatString =

+static const updater_legacy_idl_open_source_MIDL_PROC_FORMAT_STRING updater_legacy_idl_open_source__MIDL_ProcFormatString =

     {

         0,

         {

@@ -2698,7 +2698,7 @@
         }

     };

 

-static const updater_legacy_idl_MIDL_TYPE_FORMAT_STRING updater_legacy_idl__MIDL_TypeFormatString =

+static const updater_legacy_idl_open_source_MIDL_TYPE_FORMAT_STRING updater_legacy_idl_open_source__MIDL_TypeFormatString =

     {

         0,

         {

@@ -3454,17 +3454,17 @@
 /* 1104 */	

 			0x2f,		/* FC_IP */

 			0x5a,		/* FC_CONSTANT_IID */

-/* 1106 */	NdrFcLong( 0x27634814 ),	/* 660817940 */

-/* 1110 */	NdrFcShort( 0x8e41 ),	/* -29119 */

-/* 1112 */	NdrFcShort( 0x4c35 ),	/* 19509 */

-/* 1114 */	0x85,		/* 133 */

-			0x77,		/* 119 */

-/* 1116 */	0x98,		/* 152 */

-			0x1,		/* 1 */

-/* 1118 */	0x34,		/* 52 */

-			0xa9,		/* 169 */

-/* 1120 */	0x65,		/* 101 */

-			0x44,		/* 68 */

+/* 1106 */	NdrFcLong( 0x47c8886a ),	/* 1204324458 */

+/* 1110 */	NdrFcShort( 0xa4b5 ),	/* -23371 */

+/* 1112 */	NdrFcShort( 0x4f6c ),	/* 20332 */

+/* 1114 */	0x86,		/* 134 */

+			0x5a,		/* 90 */

+/* 1116 */	0x41,		/* 65 */

+			0xa2,		/* 162 */

+/* 1118 */	0x7,		/* 7 */

+			0x7,		/* 7 */

+/* 1120 */	0x4d,		/* 77 */

+			0xfa,		/* 250 */

 /* 1122 */	

 			0x11, 0x8,	/* FC_RP [simple_pointer] */

 /* 1124 */	0x6,		/* FC_SHORT */

@@ -3506,7 +3506,7 @@
 

 

 

-/* Standard interface: __MIDL_itf_updater_legacy_idl_0000_0000, ver. 0.0,

+/* Standard interface: __MIDL_itf_updater_legacy_idl_open_source_0000_0000, ver. 0.0,

    GUID={0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}} */

 

 

@@ -3519,7 +3519,7 @@
 

 

 /* Object interface: ICurrentState, ver. 0.0,

-   GUID={0x247954F9,0x9EDC,0x4E68,{0x8C,0xC3,0x15,0x0C,0x2B,0x89,0xEA,0xDF}} */

+   GUID={0xBE5D3E90,0xA66C,0x4A0A,{0x9B,0x7B,0x1A,0x6B,0x9B,0xF3,0x97,0x1E}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short ICurrentState_FormatStringOffsetTable[] =

@@ -3550,7 +3550,7 @@
 static const MIDL_STUBLESS_PROXY_INFO ICurrentState_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3562,7 +3562,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &ICurrentState_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3635,7 +3635,7 @@
 

 

 /* Object interface: IGoogleUpdate3Web, ver. 0.0,

-   GUID={0x494B20CF,0x282E,0x4BDD,{0x9F,0x5D,0xB7,0x0C,0xB0,0x9D,0x35,0x1E}} */

+   GUID={0x027234BD,0x61BB,0x4F5C,{0x93,0x86,0x7F,0xE8,0x04,0x17,0x1C,0x8C}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IGoogleUpdate3Web_FormatStringOffsetTable[] =

@@ -3650,7 +3650,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IGoogleUpdate3Web_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3662,7 +3662,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IGoogleUpdate3Web_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3703,7 +3703,7 @@
 

 

 /* Object interface: IAppBundleWeb, ver. 0.0,

-   GUID={0xDD42475D,0x6D46,0x496a,{0x92,0x4E,0xBD,0x56,0x30,0xB4,0xCB,0xBA}} */

+   GUID={0xD734C877,0x21F4,0x496E,{0xB8,0x57,0x3E,0x5B,0x2E,0x72,0xE4,0xCC}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppBundleWeb_FormatStringOffsetTable[] =

@@ -3734,7 +3734,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppBundleWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3746,7 +3746,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppBundleWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3819,7 +3819,7 @@
 

 

 /* Object interface: IAppWeb, ver. 0.0,

-   GUID={0x18D0F672,0x18B4,0x48e6,{0xAD,0x36,0x6E,0x6B,0xF0,0x1D,0xBB,0xC4}} */

+   GUID={0x2C6218B9,0x088D,0x4D25,{0xA4,0xF8,0x57,0x05,0x58,0x12,0x41,0x42}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppWeb_FormatStringOffsetTable[] =

@@ -3843,7 +3843,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3855,7 +3855,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3914,7 +3914,7 @@
 

 

 /* Object interface: IAppCommandWeb, ver. 0.0,

-   GUID={0x8476CE12,0xAE1F,0x4198,{0x80,0x5C,0xBA,0x0F,0x9B,0x78,0x3F,0x57}} */

+   GUID={0x87DBF75E,0xF590,0x4802,{0x93,0xFD,0xF8,0xD0,0x78,0x00,0xE2,0xE9}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IAppCommandWeb_FormatStringOffsetTable[] =

@@ -3932,7 +3932,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IAppCommandWeb_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3944,7 +3944,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IAppCommandWeb_FormatStringOffsetTable[-3],

     0,

     0,

@@ -3991,7 +3991,7 @@
 

 

 /* Object interface: IPolicyStatus, ver. 0.0,

-   GUID={0xF63F6F8B,0xACD5,0x413C,{0xA4,0x4B,0x04,0x09,0x13,0x6D,0x26,0xCB}} */

+   GUID={0x7D908375,0xC9D0,0x44C5,{0xBB,0x98,0x20,0x6F,0x3C,0x24,0xA7,0x4C}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus_FormatStringOffsetTable[] =

@@ -4014,7 +4014,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4026,7 +4026,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4083,7 +4083,7 @@
 

 

 /* Object interface: IPolicyStatusValue, ver. 0.0,

-   GUID={0x27634814,0x8E41,0x4C35,{0x85,0x77,0x98,0x01,0x34,0xA9,0x65,0x44}} */

+   GUID={0x47C8886A,0xA4B5,0x4F6C,{0x86,0x5A,0x41,0xA2,0x07,0x07,0x4D,0xFA}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatusValue_FormatStringOffsetTable[] =

@@ -4102,7 +4102,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatusValue_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4114,7 +4114,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatusValue_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4163,7 +4163,7 @@
 

 

 /* Object interface: IPolicyStatus2, ver. 0.0,

-   GUID={0x34527502,0xD3DB,0x4205,{0xA6,0x9B,0x78,0x9B,0x27,0xEE,0x04,0x14}} */

+   GUID={0x9D31EA63,0x2E06,0x4D41,{0x98,0xC7,0xCB,0x1F,0x30,0x7D,0xB5,0x97}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus2_FormatStringOffsetTable[] =

@@ -4193,7 +4193,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4205,7 +4205,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4276,7 +4276,7 @@
 

 

 /* Object interface: IPolicyStatus3, ver. 0.0,

-   GUID={0x05A30352,0xEB25,0x45B6,{0x84,0x49,0xBC,0xA7,0xB0,0x54,0x2C,0xE5}} */

+   GUID={0x5C674FC1,0x80E3,0x48D2,{0x98,0x7B,0x79,0xD9,0xD2,0x86,0x06,0x5B}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IPolicyStatus3_FormatStringOffsetTable[] =

@@ -4307,7 +4307,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IPolicyStatus3_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4319,7 +4319,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IPolicyStatus3_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4392,7 +4392,7 @@
 

 

 /* Object interface: IProcessLauncher, ver. 0.0,

-   GUID={0x128C2DA6,0x2BC0,0x44c0,{0xB3,0xF6,0x4E,0xC2,0x2E,0x64,0x79,0x64}} */

+   GUID={0xEED70106,0x3604,0x4385,{0x86,0x6E,0x6D,0x54,0x0E,0x99,0xCA,0x1A}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IProcessLauncher_FormatStringOffsetTable[] =

@@ -4405,7 +4405,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4417,7 +4417,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4446,7 +4446,7 @@
 

 

 /* Object interface: IProcessLauncher2, ver. 0.0,

-   GUID={0xD106AB5F,0xA70E,0x400E,{0xA2,0x1B,0x96,0x20,0x8C,0x1D,0x8D,0xBB}} */

+   GUID={0xBAEE6326,0xC925,0x4FA4,{0xAF,0xE9,0x5F,0xA6,0x99,0x02,0xB0,0x21}} */

 

 #pragma code_seg(".orpc")

 static const unsigned short IProcessLauncher2_FormatStringOffsetTable[] =

@@ -4460,7 +4460,7 @@
 static const MIDL_STUBLESS_PROXY_INFO IProcessLauncher2_ProxyInfo =

     {

     &Object_StubDesc,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4472,7 +4472,7 @@
     {

     &Object_StubDesc,

     0,

-    updater_legacy_idl__MIDL_ProcFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_ProcFormatString.Format,

     &IProcessLauncher2_FormatStringOffsetTable[-3],

     0,

     0,

@@ -4510,7 +4510,7 @@
     0,

     0,

     0,

-    updater_legacy_idl__MIDL_TypeFormatString.Format,

+    updater_legacy_idl_open_source__MIDL_TypeFormatString.Format,

     1, /* -error bounds_check flag */

     0x50002, /* Ndr library version */

     0,

@@ -4524,92 +4524,92 @@
     0

     };

 

-const CInterfaceProxyVtbl * const _updater_legacy_idl_ProxyVtblList[] = 

+const CInterfaceProxyVtbl * const _updater_legacy_idl_open_source_ProxyVtblList[] = 

 {

-    ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatusValueProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatus3ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IProcessLauncher2ProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IPolicyStatusProxyVtbl,

     ( CInterfaceProxyVtbl *) &_IProcessLauncherProxyVtbl,

-    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IProcessLauncher2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppCommandWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatus2ProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatusValueProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatusProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppBundleWebProxyVtbl,

     ( CInterfaceProxyVtbl *) &_ICurrentStateProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IAppWebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IGoogleUpdate3WebProxyVtbl,

+    ( CInterfaceProxyVtbl *) &_IPolicyStatus3ProxyVtbl,

     0

 };

 

-const CInterfaceStubVtbl * const _updater_legacy_idl_StubVtblList[] = 

+const CInterfaceStubVtbl * const _updater_legacy_idl_open_source_StubVtblList[] = 

 {

-    ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatusValueStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatus3StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IProcessLauncher2StubVtbl,

-    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

-    ( CInterfaceStubVtbl *) &_IPolicyStatusStubVtbl,

     ( CInterfaceStubVtbl *) &_IProcessLauncherStubVtbl,

-    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IProcessLauncher2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppCommandWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatus2StubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatusValueStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatusStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppBundleWebStubVtbl,

     ( CInterfaceStubVtbl *) &_ICurrentStateStubVtbl,

+    ( CInterfaceStubVtbl *) &_IAppWebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IGoogleUpdate3WebStubVtbl,

+    ( CInterfaceStubVtbl *) &_IPolicyStatus3StubVtbl,

     0

 };

 

-PCInterfaceName const _updater_legacy_idl_InterfaceNamesList[] = 

+PCInterfaceName const _updater_legacy_idl_open_source_InterfaceNamesList[] = 

 {

-    "IPolicyStatus2",

-    "IAppCommandWeb",

-    "IPolicyStatusValue",

-    "IPolicyStatus3",

-    "IAppBundleWeb",

-    "IProcessLauncher2",

-    "IAppWeb",

-    "IPolicyStatus",

     "IProcessLauncher",

-    "IGoogleUpdate3Web",

+    "IProcessLauncher2",

+    "IAppCommandWeb",

+    "IPolicyStatus2",

+    "IPolicyStatusValue",

+    "IPolicyStatus",

+    "IAppBundleWeb",

     "ICurrentState",

+    "IAppWeb",

+    "IGoogleUpdate3Web",

+    "IPolicyStatus3",

     0

 };

 

-const IID *  const _updater_legacy_idl_BaseIIDList[] = 

+const IID *  const _updater_legacy_idl_open_source_BaseIIDList[] = 

 {

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

-    &IID_IDispatch,

+    0,

     0,

     &IID_IDispatch,

     &IID_IDispatch,

-    0,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

+    &IID_IDispatch,

     &IID_IDispatch,

     &IID_IDispatch,

     0

 };

 

 

-#define _updater_legacy_idl_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl, pIID, n)

+#define _updater_legacy_idl_open_source_CHECK_IID(n)	IID_GENERIC_CHECK_IID( _updater_legacy_idl_open_source, pIID, n)

 

-int __stdcall _updater_legacy_idl_IID_Lookup( const IID * pIID, int * pIndex )

+int __stdcall _updater_legacy_idl_open_source_IID_Lookup( const IID * pIID, int * pIndex )

 {

     IID_BS_LOOKUP_SETUP

 

-    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl, 11, 8 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 4 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 2 )

-    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl, 1 )

-    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl, 11, *pIndex )

+    IID_BS_LOOKUP_INITIAL_TEST( _updater_legacy_idl_open_source, 11, 8 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 4 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 2 )

+    IID_BS_LOOKUP_NEXT_TEST( _updater_legacy_idl_open_source, 1 )

+    IID_BS_LOOKUP_RETURN_RESULT( _updater_legacy_idl_open_source, 11, *pIndex )

     

 }

 

-const ExtendedProxyFileInfo updater_legacy_idl_ProxyFileInfo = 

+const ExtendedProxyFileInfo updater_legacy_idl_open_source_ProxyFileInfo = 

 {

-    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_ProxyVtblList,

-    (PCInterfaceStubVtblList *) & _updater_legacy_idl_StubVtblList,

-    (const PCInterfaceName * ) & _updater_legacy_idl_InterfaceNamesList,

-    (const IID ** ) & _updater_legacy_idl_BaseIIDList,

-    & _updater_legacy_idl_IID_Lookup, 

+    (PCInterfaceProxyVtblList *) & _updater_legacy_idl_open_source_ProxyVtblList,

+    (PCInterfaceStubVtblList *) & _updater_legacy_idl_open_source_StubVtblList,

+    (const PCInterfaceName * ) & _updater_legacy_idl_open_source_InterfaceNamesList,

+    (const IID ** ) & _updater_legacy_idl_open_source_BaseIIDList,

+    & _updater_legacy_idl_open_source_IID_Lookup, 

     11,

     2,

     0, /* table of [async_uuid] interfaces */

diff --git a/tools/metrics/histograms/README.md b/tools/metrics/histograms/README.md
index b650fed..8234a002 100644
--- a/tools/metrics/histograms/README.md
+++ b/tools/metrics/histograms/README.md
@@ -84,7 +84,7 @@
 should be the same every time the macro is called. If you need to use dynamic
 names, use the functions in histogram_functions.h instead of the macros.
 
-### Don't Use Same String in Multiple Places
+### Don't Use Same Inline String in Multiple Places
 
 If you must use the histogram name in multiple places, use a compile-time
 constant of appropriate scope that can be referenced everywhere. Using inline
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 89ed0e1..716f6fd3 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -51236,6 +51236,7 @@
   <int value="7" label="Shared Highlight"/>
   <int value="8" label="Tab Grid Item"/>
   <int value="9" label="Tab Grid Selection Mode"/>
+  <int value="10" label="Share Chrome"/>
 </enum>
 
 <enum name="IOSAppState">
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index 699aa85..0233352d 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -707,7 +707,7 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.LoadRulesetResult"
-    enum="LoadRulesetResult" expires_after="2022-06-26">
+    enum="LoadRulesetResult" expires_after="2023-06-26">
   <owner>kelvinjiang@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
   <summary>
@@ -728,7 +728,7 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.ReadDynamicRulesJSONStatus"
-    enum="ReadDynamicRulesJSONStatus" expires_after="2022-06-01">
+    enum="ReadDynamicRulesJSONStatus" expires_after="2023-06-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
   <summary>
@@ -812,7 +812,7 @@
 </histogram>
 
 <histogram name="Extensions.DeclarativeNetRequest.RulesetReindexSuccessful"
-    enum="BooleanSuccess" expires_after="2022-07-31">
+    enum="BooleanSuccess" expires_after="2023-07-31">
   <owner>lazyboy@chromium.org</owner>
   <owner>src/extensions/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/media/OWNERS b/tools/metrics/histograms/metadata/media/OWNERS
index ba00d93..e7ab3ee 100644
--- a/tools/metrics/histograms/metadata/media/OWNERS
+++ b/tools/metrics/histograms/metadata/media/OWNERS
@@ -3,6 +3,5 @@
 # Prefer sending CLs to the owners listed below.
 # Use chromium-metrics-reviews@google.com as a backup.
 evliu@google.com
-hujame@gooogle.com
 kron@chromium.org
 toyoshim@chromium.org
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index d82f80d..d3df8200 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -2234,6 +2234,29 @@
 <histogram
     name="Omnibox.{SearchPrefetch}.PrefetchEligibilityReason.{NavigationOrSuggestionPrefetch}"
     enum="SearchPrefetchEligibilityReason" expires_after="2023-05-02">
+  <obsolete>
+    This is deprecated as of 07/2022. Please use
+    Omnibox.SearchPrefetch.PrefetchEligibilityReason2.{NavigationOrSuggestionPrefetch}.
+  </obsolete>
+  <owner>ryansturm@chromium.org</owner>
+  <owner>chrome-omnibox-team@google.com</owner>
+  <summary>
+    {SearchPrefetch}
+
+    The reason that a search prefetch request issued when a user navigates to a
+    suggestion was not eligible to be prefetched (or 'Prefetched' if it was
+    prefetched).
+
+    {NavigationOrSuggestionPrefetch}
+  </summary>
+  <token key="SearchPrefetch" variants="SearchPrefetch"/>
+  <token key="NavigationOrSuggestionPrefetch"
+      variants="NavigationOrSuggestionPrefetch"/>
+</histogram>
+
+<histogram
+    name="Omnibox.{SearchPrefetch}.PrefetchEligibilityReason2.{NavigationOrSuggestionPrefetch}"
+    enum="SearchPrefetchEligibilityReason" expires_after="2023-05-02">
   <owner>ryansturm@chromium.org</owner>
   <owner>chrome-omnibox-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index 2dcd4ea..e06210f5 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -634,7 +634,7 @@
 </histogram>
 
 <histogram base="true" name="Signin.IsShared" enum="BooleanIsShared"
-    expires_after="2022-09-06">
+    expires_after="2023-09-06">
 <!-- Name completed by histogram_suffixes name="AccountInvestigationReportingType" -->
 
   <owner>droger@chromium.org</owner>
diff --git a/ui/base/ime/ash/input_method_ash.cc b/ui/base/ime/ash/input_method_ash.cc
index cd29f4ce..aa56ce7d 100644
--- a/ui/base/ime/ash/input_method_ash.cc
+++ b/ui/base/ime/ash/input_method_ash.cc
@@ -927,9 +927,12 @@
   }
 
   DCHECK(text.selection.start() <= text.selection.end());
+  DCHECK(text.selection.end() <= char_length);
   if (text.selection.start() < text.selection.end()) {
-    const uint32_t start = text.selection.start();
-    const uint32_t end = text.selection.end();
+    const size_t start =
+        std::min(text.selection.start(), static_cast<size_t>(char_length));
+    const size_t end =
+        std::min(text.selection.end(), static_cast<size_t>(char_length));
     ImeTextSpan ime_text_span(
         ui::ImeTextSpan::Type::kComposition, char16_offsets[start],
         char16_offsets[end], ui::ImeTextSpan::Thickness::kThick,
diff --git a/ui/file_manager/file_manager/common/js/async_util.js b/ui/file_manager/file_manager/common/js/async_util.js
index f6198f2..719b1dd 100644
--- a/ui/file_manager/file_manager/common/js/async_util.js
+++ b/ui/file_manager/file_manager/common/js/async_util.js
@@ -46,69 +46,51 @@
  */
 AsyncUtil.ConcurrentQueue = class {
   /**
-   * @param {number} limit The number of jobs to run at the same time.
+   * @param {number} limit The number of tasks to run at the same time.
    */
   constructor(limit) {
     console.assert(limit > 0, '|limit| must be larger than 0');
-
     this.limit_ = limit;
-    this.addedTasks_ = [];
-    this.pendingTasks_ = [];
-    this.isCancelled_ = false;
+    this.added_ = [];
+    this.running_ = [];
+    this.executeId_ = 0;
+    this.cancelled_ = false;
   }
 
   /**
    * @return {boolean} True when a task is running, otherwise false.
    */
   isRunning() {
-    return this.pendingTasks_.length !== 0;
+    return this.running_.length !== 0;
   }
 
   /**
    * @return {number} Number of waiting tasks.
    */
   getWaitingTasksCount() {
-    return this.addedTasks_.length;
+    return this.added_.length;
   }
 
   /**
    * @return {number} Number of running tasks.
    */
   getRunningTasksCount() {
-    return this.pendingTasks_.length;
+    return this.running_.length;
   }
 
   /**
-   * Enqueues a closure to be executed.
-   * @param {function(function())} closure Closure with a completion
-   *     callback to be executed.
+   * Enqueues a task for running as soon as possible. If there is already the
+   * maximum number of tasks running, the run of this task is delayed until less
+   * than the limit given at the construction time of tasks are running.
+   * @param {function(function())} task The task to be enqueued for execution.
    */
-  run(closure) {
-    if (this.isCancelled_) {
+  run(task) {
+    if (this.cancelled_) {
       console.warn('Queue is cancelled. Cannot add a new task.');
-      return;
+    } else {
+      this.added_.push(task);
+      this.maybeExecute_();
     }
-
-    this.addedTasks_.push(closure);
-    this.continue_();
-  }
-
-  /**
-   * Starts a task gated by this concurrent queue.
-   * Typical usage:
-   *
-   *   const unlock = await queue.lock();
-   *   try {
-   *     // Operations of the task.
-   *     ...
-   *   } finally {
-   *     unlock();
-   *   }
-   *
-   * @return {!Promise<function()>} Completion callback to run when finished.
-   */
-  async lock() {
-    return new Promise(resolve => this.run(unlock => resolve(unlock)));
   }
 
   /**
@@ -116,8 +98,12 @@
    * does NOT stop tasks currently running.
    */
   cancel() {
-    this.isCancelled_ = true;
-    this.addedTasks_ = [];
+    this.cancelled_ = true;
+    this.added_ = [];
+    if (this.executeId_) {
+      clearTimeout(this.executeId_);
+      this.executeId_ = 0;
+    }
   }
 
   /**
@@ -125,35 +111,71 @@
    *      already cancelled. Otherwise false.
    */
   isCancelled() {
-    return this.isCancelled_;
+    return this.cancelled_;
   }
 
   /**
-   * Runs the next tasks if available.
-   * @private
+   * Attempts to run another tasks. If there is less than the maximum number
+   * of task running, it immediately executes the task at the front of
+   * the queue.
    */
-  continue_() {
-    while (this.addedTasks_.length > 0 &&
-           this.pendingTasks_.length < this.limit_) {
-      // Run the next closure.
-      const closure = this.addedTasks_.shift();
-      this.pendingTasks_.push(closure);
-      closure(this.onTaskFinished_.bind(this, closure));
+  maybeExecute_() {
+    // Clear the setTimeout ID so that next call to scheduleNext_, if it takes
+    // place, schedules another execution of this method.
+    this.executeId_ = 0;
+    if (this.added_.length > 0) {
+      if (this.running_.length < this.limit_) {
+        this.execute_(this.added_.shift());
+      }
     }
   }
 
   /**
-   * Called when a task is finished. Removes the tasks from pending task list.
-   * @param {function()} closure Finished task, which has been bound in
-   *     |continue_|.
-   * @private
+   * Executes the given task. The task is placed in the list of running tasks
+   * and immediately executed.
+   * @param {function(function())} task The task to be immediately executed.
    */
-  onTaskFinished_(closure) {
-    const index = this.pendingTasks_.indexOf(closure);
-    console.assert(index >= 0, 'Invalid task is finished');
-    this.pendingTasks_.splice(index, 1);
+  execute_(task) {
+    this.running_.push(task);
+    try {
+      task(this.onTaskFinished_.bind(this, task));
+      // If the task executes successfully, it calls the callback, where we
+      // schedule a next run.
+    } catch (e) {
+      console.warn('Failed to execute a task', e);
+      // If the task fails we call the callback explicitly.
+      this.onTaskFinished_(task);
+    }
+  }
 
-    this.continue_();
+  /**
+   * Handles a task being finished.
+   */
+  onTaskFinished_(task) {
+    this.removeTask_(task);
+    this.scheduleNext_();
+  }
+
+  /**
+   * Attempts to remove the task that was running.
+   */
+  removeTask_(task) {
+    const index = this.running_.indexOf(task);
+    if (index >= 0) {
+      this.running_.splice(index, 1);
+    } else {
+      console.warn('Failed to find a finished task among running');
+    }
+  }
+
+  /**
+   * Schedules the next attempt at execution of the task at the front of
+   * the queue.
+   */
+  scheduleNext_() {
+    if (this.executeId_ === 0) {
+      this.executeId_ = setTimeout(() => this.maybeExecute_(), 0);
+    }
   }
 
   /**
@@ -177,6 +199,24 @@
   constructor() {
     super(1);
   }
+
+  /**
+   * Starts a task gated by this concurrent queue.
+   * Typical usage:
+   *
+   *   const unlock = await queue.lock();
+   *   try {
+   *     // Operations of the task.
+   *     ...
+   *   } finally {
+   *     unlock();
+   *   }
+   *
+   * @return {!Promise<function()>} Completion callback to run when finished.
+   */
+  async lock() {
+    return new Promise(resolve => this.run(unlock => resolve(unlock)));
+  }
 };
 
 /**
diff --git a/ui/file_manager/file_manager/common/js/async_util_unittest.js b/ui/file_manager/file_manager/common/js/async_util_unittest.js
new file mode 100644
index 0000000..14b083f
--- /dev/null
+++ b/ui/file_manager/file_manager/common/js/async_util_unittest.js
@@ -0,0 +1,100 @@
+// Copyright 2022 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.
+
+import {assertArrayEquals, assertEquals} from 'chrome://webui-test/chai_assert.js';
+
+import {AsyncUtil} from './async_util.js';
+import {waitUntil} from './test_error_reporting.js';
+
+/**
+ * Checks that the order of the tasks is preserved.
+ */
+export async function testAsyncQueueOrder(done) {
+  const queue = new AsyncUtil.Queue();
+  const taskTrace = [];
+
+  const secondTask = (callback) => {
+    taskTrace.push('2');
+    callback();
+  };
+
+  const firstTask = (callback) => {
+    queue.run(secondTask);
+    setTimeout(() => {
+      taskTrace.push('1');
+      callback();
+    }, 100);
+  };
+
+  queue.run(firstTask);
+  await waitUntil(() => taskTrace.length == 2);
+  assertArrayEquals(['1', '2'], taskTrace);
+  done();
+}
+
+/**
+ * Checks that tasks with errors do not interrupt the queue's operations.
+ */
+export async function testAsyncQueueFailingTask(done) {
+  const queue = new AsyncUtil.Queue();
+  const taskTrace = [];
+
+  const followingTask = (callback) => {
+    taskTrace.push('following');
+    callback();
+  };
+
+  const badTask = (callback) => {
+    taskTrace.push('bad');
+    queue.run(followingTask);
+    throw new Error('Something went wrong');
+  };
+
+  queue.run(badTask);
+  await waitUntil(() => taskTrace.length === 2);
+  assertArrayEquals(['bad', 'following'], taskTrace);
+  done();
+}
+
+/**
+ * Checks the order of start and end of two mutually calling tasks. We expect
+ * that task that is run first finishes before the task ran after it.
+ */
+export async function testAsyncQueueStartEndOrder(done) {
+  const queue = new AsyncUtil.Queue();
+  let runCount = 0;
+  const task = [];
+  const taskTrace = [];
+  const maxRunCount = 4;
+
+  // Makes a task that enqueues the task specified by the |index|.
+  // Each task also records its trace right at the start and at the end.
+  const makeTask = (index) => {
+    return (callback) => {
+      const myID = runCount++;
+      taskTrace.push(myID);
+      if (runCount < maxRunCount) {
+        queue.run(task[index]);
+      }
+      callback();
+      taskTrace.push(myID);
+    };
+  };
+
+  // Task 0 enqueues task 1.
+  task.push(makeTask(1));
+  // Task 1 enqueues task 0.
+  task.push(makeTask(0));
+  // Kick off the process by running task 0.
+  queue.run(task[0]);
+
+  await waitUntil(() => runCount >= maxRunCount);
+  const expected = [];
+  for (let i = 0; i < maxRunCount; ++i) {
+    expected.push(i);  // ID at start
+    expected.push(i);  // ID at end
+  }
+  assertArrayEquals(expected, taskTrace);
+  done();
+}
diff --git a/ui/file_manager/file_manager/state/reducers.ts b/ui/file_manager/file_manager/state/reducers.ts
deleted file mode 100644
index fa2ca0d..0000000
--- a/ui/file_manager/file_manager/state/reducers.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2022 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.
-
-import {FilesAppEntry} from '../externs/files_app_entry_interfaces.js';
-import {CurrentDirectory, State} from '../externs/ts/state.js';
-import {PathComponent} from '../foreground/js/path_component.js';
-
-import {Action, Actions, ChangeDirectoryAction} from './actions.js';
-
-/**
- * Root reducer for Files app.
- * It dispatches to other reducers to update different parts of the State.
- */
-export function rootReducer(currentState: State, action: Action): State {
-  // Before any actual Reducer, we cache the entries, so the reducers can just
-  // use any entry from `allEntries`.
-  const state = cacheEntries(currentState, action);
-
-  switch (action.type) {
-    case Actions.CHANGE_DIRECTORY:
-      return Object.assign(state, {
-        currentDirectory:
-            changeDirectory(state, action as ChangeDirectoryAction),
-      });
-
-    default:
-      console.error(`invalid action: ${action.type}`);
-      return state;
-  }
-}
-
-function getEntry(state: State, action: ChangeDirectoryAction): Entry|
-    FilesAppEntry|null {
-  const {newDirectory, key} = action;
-  if (newDirectory) {
-    return newDirectory;
-  }
-
-  const entry = state.allEntries[key!] ? state.allEntries[key!]!.entry : null;
-  if (!entry) {
-    return null;
-  }
-  return entry;
-}
-
-/** Caches the Action's entry in the `allEntries` attribute. */
-export function cacheEntries(currentState: State, action: Action): State {
-  if (action.type === Actions.CHANGE_DIRECTORY) {
-    const {key} = (action as ChangeDirectoryAction);
-    const allEntries = currentState.allEntries || {};
-
-    const entry = getEntry(currentState, (action as ChangeDirectoryAction));
-    if (!entry) {
-      // Nothing to cache, just continue.
-      return currentState;
-    }
-
-    const entryData = allEntries[key] || {};
-    allEntries[key] = Object.assign(entryData, {
-      entry: entry,
-    });
-
-    currentState.allEntries = allEntries;
-  }
-
-  return currentState;
-}
-
-/** Reducer that updates the `currentDirectory` attributes. */
-export function changeDirectory(
-    currentState: State, action: ChangeDirectoryAction): CurrentDirectory|null {
-  const fileData = currentState.allEntries[action.key];
-  if (!fileData) {
-    // The new directory might not be in the allEntries yet.
-    return {
-      key: action.key,
-      status: action.status,
-      pathComponents: [],
-    };
-  }
-
-  // TODO(lucmult): Find a correct way to grab the VolumeManager.
-  const volumeManager = window.fileManager.volumeManager;
-  if (!volumeManager) {
-    console.debug(`VolumeManager not available yet.`);
-    return currentState.currentDirectory || null;
-  }
-
-  const components =
-      PathComponent.computeComponentsFromEntry(fileData.entry, volumeManager);
-
-  return Object.assign(currentState.currentDirectory || {}, {
-    status: action.status,
-    key: (action as ChangeDirectoryAction).key,
-    pathComponents: components.map(c => {
-      return {
-        name: c.name,
-        label: c.name,
-        key: c.url_,
-      };
-    }),
-  });
-}
diff --git a/ui/file_manager/file_manager/state/reducers/all_entries.ts b/ui/file_manager/file_manager/state/reducers/all_entries.ts
new file mode 100644
index 0000000..dc521dae
--- /dev/null
+++ b/ui/file_manager/file_manager/state/reducers/all_entries.ts
@@ -0,0 +1,44 @@
+// Copyright 2022 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.
+
+import {FilesAppEntry} from '../../externs/files_app_entry_interfaces.js';
+import {State} from '../../externs/ts/state.js';
+import {Action, Actions, ChangeDirectoryAction} from '../actions.js';
+
+function getEntry(state: State, action: ChangeDirectoryAction): Entry|
+    FilesAppEntry|null {
+  const {newDirectory, key} = action;
+  if (newDirectory) {
+    return newDirectory;
+  }
+
+  const entry = state.allEntries[key!] ? state.allEntries[key!]!.entry : null;
+  if (!entry) {
+    return null;
+  }
+  return entry;
+}
+
+/** Caches the Action's entry in the `allEntries` attribute. */
+export function cacheEntries(currentState: State, action: Action): State {
+  if (action.type === Actions.CHANGE_DIRECTORY) {
+    const {key} = (action as ChangeDirectoryAction);
+    const allEntries = currentState.allEntries || {};
+
+    const entry = getEntry(currentState, (action as ChangeDirectoryAction));
+    if (!entry) {
+      // Nothing to cache, just continue.
+      return currentState;
+    }
+
+    const entryData = allEntries[key] || {};
+    allEntries[key] = Object.assign(entryData, {
+      entry: entry,
+    });
+
+    currentState.allEntries = allEntries;
+  }
+
+  return currentState;
+}
diff --git a/ui/file_manager/file_manager/state/reducers/current_directory.ts b/ui/file_manager/file_manager/state/reducers/current_directory.ts
new file mode 100644
index 0000000..73b3289e
--- /dev/null
+++ b/ui/file_manager/file_manager/state/reducers/current_directory.ts
@@ -0,0 +1,43 @@
+// Copyright 2022 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.
+
+import {CurrentDirectory, State} from '../../externs/ts/state.js';
+import {PathComponent} from '../../foreground/js/path_component.js';
+import {ChangeDirectoryAction} from '../actions.js';
+
+/** Reducer that updates the `currentDirectory` attributes. */
+export function changeDirectory(
+    currentState: State, action: ChangeDirectoryAction): CurrentDirectory|null {
+  const fileData = currentState.allEntries[action.key];
+  if (!fileData) {
+    // The new directory might not be in the allEntries yet.
+    return {
+      key: action.key,
+      status: action.status,
+      pathComponents: [],
+    };
+  }
+
+  // TODO(lucmult): Find a correct way to grab the VolumeManager.
+  const volumeManager = window.fileManager.volumeManager;
+  if (!volumeManager) {
+    console.debug(`VolumeManager not available yet.`);
+    return currentState.currentDirectory || null;
+  }
+
+  const components =
+      PathComponent.computeComponentsFromEntry(fileData.entry, volumeManager);
+
+  return Object.assign(currentState.currentDirectory || {}, {
+    status: action.status,
+    key: (action as ChangeDirectoryAction).key,
+    pathComponents: components.map(c => {
+      return {
+        name: c.name,
+        label: c.name,
+        key: c.url_,
+      };
+    }),
+  });
+}
diff --git a/ui/file_manager/file_manager/state/reducers/root.ts b/ui/file_manager/file_manager/state/reducers/root.ts
new file mode 100644
index 0000000..29fad96
--- /dev/null
+++ b/ui/file_manager/file_manager/state/reducers/root.ts
@@ -0,0 +1,31 @@
+// Copyright 2022 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.
+
+import {State} from '../../externs/ts/state.js';
+import {Action, Actions, ChangeDirectoryAction} from '../actions.js';
+
+import {cacheEntries} from './all_entries.js';
+import {changeDirectory} from './current_directory.js';
+
+/**
+ * Root reducer for Files app.
+ * It dispatches to other reducers to update different parts of the State.
+ */
+export function rootReducer(currentState: State, action: Action): State {
+  // Before any actual Reducer, we cache the entries, so the reducers can just
+  // use any entry from `allEntries`.
+  const state = cacheEntries(currentState, action);
+
+  switch (action.type) {
+    case Actions.CHANGE_DIRECTORY:
+      return Object.assign(state, {
+        currentDirectory:
+            changeDirectory(state, action as ChangeDirectoryAction),
+      });
+
+    default:
+      console.error(`invalid action: ${action.type}`);
+      return state;
+  }
+}
diff --git a/ui/file_manager/file_manager/state/store.ts b/ui/file_manager/file_manager/state/store.ts
index 5b2c9c39..145545e 100644
--- a/ui/file_manager/file_manager/state/store.ts
+++ b/ui/file_manager/file_manager/state/store.ts
@@ -6,7 +6,7 @@
 import {BaseStore} from '../lib/base_store.js';
 
 import {Action} from './actions.js';
-import {rootReducer} from './reducers.js';
+import {rootReducer} from './reducers/root.js';
 
 /**
  * Files app's Store type.
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index df2c63e0..0f34cf5 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -268,7 +268,9 @@
 ts_files = [
   "file_manager/lib/base_store.ts",
   "file_manager/state/store.ts",
-  "file_manager/state/reducers.ts",
+  "file_manager/state/reducers/root.ts",
+  "file_manager/state/reducers/all_entries.ts",
+  "file_manager/state/reducers/current_directory.ts",
   "file_manager/state/actions.ts",
   "file_manager/state/file_key.ts",
   "file_manager/widgets/xf_breadcrumb.ts",
@@ -343,6 +345,7 @@
 
 # Test files:
 unittest_files = [
+  "file_manager/common/js/async_util_unittest.js",
   "file_manager/common/js/util_unittest.js",
   "file_manager/common/js/filtered_volume_manager_unittest.js",
   "file_manager/common/js/file_type_unittest.js",
diff --git a/ui/file_manager/integration_tests/file_manager/recents.js b/ui/file_manager/integration_tests/file_manager/recents.js
index 48c6653..67d47f4c 100644
--- a/ui/file_manager/integration_tests/file_manager/recents.js
+++ b/ui/file_manager/integration_tests/file_manager/recents.js
@@ -214,9 +214,7 @@
  * @param {string} expectedPath Expected breadcrumb path.
  */
 async function verifyBreadcrumbsPath(appId, expectedPath) {
-  const path =
-      await remoteCall.callRemoteTestUtil('getBreadcrumbPath', appId, []);
-  chrome.test.assertEq(expectedPath, path);
+  await remoteCall.waitUntilCurrentDirectoryIsChanged(appId, expectedPath);
 }
 
 /**
diff --git a/ui/file_manager/integration_tests/file_manager/zip_files.js b/ui/file_manager/integration_tests/file_manager/zip_files.js
index 3dd2cb1f9..e89aa197 100644
--- a/ui/file_manager/integration_tests/file_manager/zip_files.js
+++ b/ui/file_manager/integration_tests/file_manager/zip_files.js
@@ -844,6 +844,9 @@
   // Make sure read-only indicator on toolbar is visible.
   await remoteCall.waitForElement(appId, '#read-only-indicator:not([hidden])');
 
+  // Make sure the file we are about to select is present.
+  await remoteCall.waitForFiles(appId, [entry.getExpectedRow()]);
+
   // Select the ZIP file.
   chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
       'selectFile', appId, [entry.nameText]));
diff --git a/ui/message_center/views/message_popup_view.cc b/ui/message_center/views/message_popup_view.cc
index e5861c5..171ac0a4 100644
--- a/ui/message_center/views/message_popup_view.cc
+++ b/ui/message_center/views/message_popup_view.cc
@@ -33,7 +33,7 @@
 MessagePopupView::MessagePopupView(MessageView* message_view,
                                    MessagePopupCollection* popup_collection,
                                    bool a11y_feedback_on_init)
-    : message_view_(message_view->GetWeakPtr()),
+    : message_view_(message_view),
       popup_collection_(popup_collection),
       a11y_feedback_on_init_(a11y_feedback_on_init) {
   set_suppress_default_focus_handling();
@@ -163,12 +163,6 @@
 }
 
 void MessagePopupView::Close() {
-  // crbug/1337661: Ensure we abort any running layer animations before closing
-  // the widget. This is to prevent any callbacks from initiating additional
-  // animations.
-  if (message_view_)
-    message_view_->AbortAllLayerAnimations();
-
   if (!GetWidget()) {
     DeleteDelegate();
     return;
@@ -226,7 +220,7 @@
 void MessagePopupView::OnFocus() {
   // This view is just a container, so advance focus to the underlying
   // MessageView.
-  GetFocusManager()->SetFocusedView(message_view_.get());
+  GetFocusManager()->SetFocusedView(message_view_);
 }
 
 void MessagePopupView::AddedToWidget() {
diff --git a/ui/message_center/views/message_popup_view.h b/ui/message_center/views/message_popup_view.h
index fe98433..2f5f9d3 100644
--- a/ui/message_center/views/message_popup_view.h
+++ b/ui/message_center/views/message_popup_view.h
@@ -6,7 +6,6 @@
 #define UI_MESSAGE_CENTER_VIEWS_MESSAGE_POPUP_VIEW_H_
 
 #include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
 #include "base/scoped_observation.h"
 #include "ui/message_center/message_center_export.h"
 #include "ui/views/widget/widget.h"
@@ -74,7 +73,7 @@
   bool is_hovered() const { return is_hovered_; }
   bool is_focused() const { return is_focused_; }
 
-  MessageView* message_view() { return message_view_.get(); }
+  MessageView* message_view() { return message_view_; }
 
  protected:
   // For unit testing.
@@ -85,9 +84,7 @@
   bool IsWidgetValid() const;
 
   // Owned by views hierarchy.
-  // crbug/1347815: This needs to be a WeakPtr to ensure we do not use this
-  // uninitialized incase the view is deleted before this popup_view.
-  base::WeakPtr<MessageView> message_view_;
+  raw_ptr<MessageView> message_view_;
 
   // Unowned.
   const raw_ptr<MessagePopupCollection> popup_collection_;
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h
index a1b85d6..5f802e8 100644
--- a/ui/message_center/views/message_view.h
+++ b/ui/message_center/views/message_view.h
@@ -91,10 +91,6 @@
 
   ~MessageView() override;
 
-  // Abort all layer animations. Unimplemented by default, used in
-  // `AshNotificationView` to abort animations when it's widget is being closed.
-  virtual void AbortAllLayerAnimations() {}
-
   // Updates this view with an additional grouped notification. If the view
   // wasn't previously grouped it also takes care of converting the view to
   // the grouped notification state.
@@ -196,10 +192,6 @@
   // Updates the width of the buttons which are hidden and avail by swipe.
   void SetSlideButtonWidth(int coutrol_button_width);
 
-  base::WeakPtr<MessageView> GetWeakPtr() {
-    return message_view_weak_factory_.GetWeakPtr();
-  }
-
   void set_notification_id(const std::string& notification_id) {
     notification_id_ = notification_id;
   }
@@ -306,8 +298,6 @@
   // shape of the notification.
   int top_radius_ = 0;
   int bottom_radius_ = 0;
-
-  base::WeakPtrFactory<MessageView> message_view_weak_factory_{this};
 };
 
 }  // namespace message_center
diff --git a/weblayer/public/java/BUILD.gn b/weblayer/public/java/BUILD.gn
index cabfb0b4..8287c29 100644
--- a/weblayer/public/java/BUILD.gn
+++ b/weblayer/public/java/BUILD.gn
@@ -205,11 +205,13 @@
   deps = [
     ":browserfragment_interfaces_java",
     "//base:base_java",
+    "//third_party/android_deps:com_google_guava_guava_android_java",
     "//third_party/android_deps:com_google_guava_listenablefuture_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_appcompat_appcompat_java",
     "//third_party/androidx:androidx_concurrent_concurrent_futures_java",
     "//third_party/androidx:androidx_fragment_fragment_java",
+    "//third_party/androidx:androidx_lifecycle_lifecycle_viewmodel_java",
   ]
 
   proguard_configs = [ "proguard.flags" ]
diff --git a/weblayer/public/java/org/chromium/browserfragment/Browser.java b/weblayer/public/java/org/chromium/browserfragment/Browser.java
index 0f7d2de..ff62e4a 100644
--- a/weblayer/public/java/org/chromium/browserfragment/Browser.java
+++ b/weblayer/public/java/org/chromium/browserfragment/Browser.java
@@ -15,6 +15,7 @@
 import androidx.annotation.Nullable;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 
+import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import org.chromium.browserfragment.interfaces.IBrowserSandboxCallback;
@@ -31,6 +32,8 @@
     private static final String BROWSER_SANDBOX_ACTION =
             "org.chromium.weblayer.intent.action.BROWSERSANDBOX";
 
+    private static Browser sInstance;
+
     private IBrowserSandboxService mBrowserSandboxService;
 
     private static class ConnectionSetup implements ServiceConnection {
@@ -42,7 +45,8 @@
                 new IBrowserSandboxCallback.Stub() {
                     @Override
                     public void onBrowserProcessInitialized() {
-                        mCompleter.set(new Browser(mBrowserSandboxService));
+                        sInstance = new Browser(mBrowserSandboxService);
+                        mCompleter.set(sInstance);
                         mCompleter = null;
                     }
                 };
@@ -79,6 +83,9 @@
      */
     @NonNull
     public static ListenableFuture<Browser> create(@NonNull Context context) {
+        if (sInstance != null) {
+            return Futures.immediateFuture(sInstance);
+        }
         return CallbackToFutureAdapter.getFuture(completer -> {
             ConnectionSetup connectionSetup = new ConnectionSetup(context, completer);
 
@@ -98,7 +105,9 @@
     @Nullable
     public BrowserFragment createFragment() {
         try {
-            return new BrowserFragment(this, mBrowserSandboxService.createFragmentDelegate());
+            BrowserFragment fragment = new BrowserFragment();
+            fragment.initialize(this, mBrowserSandboxService.createFragmentDelegate());
+            return fragment;
         } catch (RemoteException e) {
             return null;
         }
diff --git a/weblayer/public/java/org/chromium/browserfragment/BrowserFragment.java b/weblayer/public/java/org/chromium/browserfragment/BrowserFragment.java
index 7bf69679..82543c9c 100644
--- a/weblayer/public/java/org/chromium/browserfragment/BrowserFragment.java
+++ b/weblayer/public/java/org/chromium/browserfragment/BrowserFragment.java
@@ -14,9 +14,12 @@
 import android.view.ViewGroup;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.fragment.app.Fragment;
+import androidx.lifecycle.ViewModel;
+import androidx.lifecycle.ViewModelProvider;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -57,13 +60,11 @@
                 }
             };
 
-    BrowserFragment(Browser browser, IBrowserFragmentDelegate delegate) throws RemoteException {
-        // TODO(rayankans): Create empty constructor and load from ViewModel.
-        mBrowser = browser;
-        mDelegate = delegate;
-        mDelegate.setClient(mClient);
-        mDelegate.setTabObserverDelegate(mTabObserverDelegate);
-
+    /**
+     * This constructor is for the system FragmentManager only. Please use
+     * {@link Browser#createFragment}.
+     */
+    public BrowserFragment() {
         mFutureTabManager = CallbackToFutureAdapter.getFuture(completer -> {
             mTabManagerCompleter = completer;
             // Debug string.
@@ -71,11 +72,35 @@
         });
     }
 
+    void initialize(Browser browser, IBrowserFragmentDelegate delegate) throws RemoteException {
+        mBrowser = browser;
+        mDelegate = delegate;
+        mDelegate.setClient(mClient);
+    }
+
     @Override
     public void onAttach(Context context) {
         super.onAttach(context);
-        mSurfaceView = new SurfaceView(context);
-        mSurfaceView.setZOrderOnTop(true);
+
+        BrowserViewModel model = getViewModel();
+        if (model.hasSavedState()) {
+            // Load from view model.
+            assert mBrowser == null;
+
+            mBrowser = model.mBrowser;
+            mDelegate = model.mDelegate;
+            mSurfaceView = model.mSurfaceView;
+        } else {
+            // Save to View model.
+            assert mBrowser != null;
+
+            mSurfaceView = new SurfaceView(context);
+            mSurfaceView.setZOrderOnTop(true);
+
+            model.mBrowser = mBrowser;
+            model.mDelegate = mDelegate;
+            model.mSurfaceView = mSurfaceView;
+        }
 
         AppCompatDelegate.create(getActivity(), null);
 
@@ -103,10 +128,18 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
+
+        BrowserViewModel model = getViewModel();
+        if (model.getIsViewAttached()) {
+            return;
+        }
+
         try {
             mDelegate.attachViewHierarchy(mSurfaceView.getHostToken());
         } catch (RemoteException e) {
         }
+
+        model.markViewAttached();
     }
 
     @Override
@@ -210,4 +243,50 @@
     public boolean unregisterTabObserver(@NonNull TabObserver tabObserver) {
         return mTabObserverDelegate.unregisterObserver(tabObserver);
     }
+
+    private BrowserViewModel getViewModel() {
+        return new ViewModelProvider(this).get(BrowserViewModel.class);
+    }
+
+    /**
+     * This class is an implementation detail and not intended for public use. It may change at any
+     * time in incompatible ways, including being removed.
+     * <p>
+     * This class stores BrowserFragment specific state to a ViewModel so that it can reused if a
+     * new Fragment is created that should share the same state.
+     */
+    public static final class BrowserViewModel extends ViewModel {
+        @Nullable
+        private Browser mBrowser;
+        @Nullable
+        private IBrowserFragmentDelegate mDelegate;
+        @Nullable
+        private SurfaceView mSurfaceView;
+
+        private boolean mIsViewAttached;
+
+        boolean hasSavedState() {
+            return mBrowser != null;
+        }
+
+        void markViewAttached() {
+            mIsViewAttached = true;
+        }
+
+        boolean getIsViewAttached() {
+            return mIsViewAttached;
+        }
+
+        @Override
+        protected void onCleared() {
+            super.onCleared();
+            if (mDelegate == null) {
+                return;
+            }
+            try {
+                mDelegate.onCleared();
+            } catch (RemoteException e) {
+            }
+        }
+    }
 }
diff --git a/weblayer/public/java/org/chromium/browserfragment/interfaces/IBrowserFragmentDelegate.aidl b/weblayer/public/java/org/chromium/browserfragment/interfaces/IBrowserFragmentDelegate.aidl
index b952e83e1..017f37e 100644
--- a/weblayer/public/java/org/chromium/browserfragment/interfaces/IBrowserFragmentDelegate.aidl
+++ b/weblayer/public/java/org/chromium/browserfragment/interfaces/IBrowserFragmentDelegate.aidl
@@ -25,6 +25,9 @@
     void onResume() = 10;
     void onPause() = 11;
 
+    // ViewModel events.
+    void onCleared() = 16;
+
     // Tab operations.
     ITabProxy getActiveTab() = 14;
     void setTabObserverDelegate(ITabObserverDelegate tabObserverDelegate) = 15;
diff --git a/weblayer/public/java/org/chromium/weblayer/BrowserFragmentDelegate.java b/weblayer/public/java/org/chromium/weblayer/BrowserFragmentDelegate.java
index 03b6e8f..d930505 100644
--- a/weblayer/public/java/org/chromium/weblayer/BrowserFragmentDelegate.java
+++ b/weblayer/public/java/org/chromium/weblayer/BrowserFragmentDelegate.java
@@ -106,11 +106,7 @@
 
     @Override
     public void onDestroy() {
-        mHandler.post(() -> {
-            mSurfaceControlViewHost.release();
-            mFragment.onDestroy();
-            mSurfaceControlViewHost = null;
-        });
+        mHandler.post(() -> mFragment.onDestroy());
     }
 
     @Override
@@ -145,6 +141,11 @@
     }
 
     @Override
+    public void onCleared() {
+        mHandler.post(() -> mSurfaceControlViewHost.release());
+    }
+
+    @Override
     public void setTabObserverDelegate(ITabObserverDelegate tabObserverDelegate) {
         mTabDelegate.setObserver(tabObserverDelegate);
     }