diff --git a/DEPS b/DEPS
index f80f8a4..3815dc8 100644
--- a/DEPS
+++ b/DEPS
@@ -126,11 +126,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '706a7cd1e8269039c7a9a3f66f0334673bb1e8dd',
+  'skia_revision': '136cd7018a9999f9104758c5dd807fc545f796a4',
   # 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': 'b3e709a8d204ef93262ebeba15f504fbe080facc',
+  'v8_revision': '81215ad17e7a74c4909abdbeff989350efa7a3e9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -138,7 +138,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '2b0553ce59c368b6f3e0c4a10a058f8f1addf35c',
+  'angle_revision': 'abf6dbbb107b3487480422b6ce37e9662cb8f302',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -146,7 +146,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '471510ee209e8763f1ec3e7424def974bd59c3b0',
+  'pdfium_revision': '27a3c7755b4d5a7ee7266691e8c4fe2abf8f325d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -186,7 +186,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': '8bfeef929cbe262c6987b70706a22750d2b201cb',
+  'catapult_revision': '183d99e38bfe9d296913b357c80599577056700f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -729,7 +729,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '6b5dce0608657cbf19a6a5ed409a95defcbec4da',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3ef549770d8fdf3e3ca472182f421fc50575ec4f',
       'condition': 'checkout_linux',
   },
 
@@ -754,7 +754,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '610a4c6ce76cc6e9c2dec19fe8f5e721f1adcbf1',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'aec259ea62328ce39916607876956239fbce29b8',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -789,7 +789,7 @@
   },
 
   'src/third_party/ffmpeg':
-    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '4b75b8bab99385646911c24403a016ce9c3d5740',
+    Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '41268576ad9a8b760287101f4f58d0ef468798af',
 
   'src/third_party/flac':
     Var('chromium_git') + '/chromium/deps/flac.git' + '@' + 'af862024c8c8fa0ae07ced05e89013d881b00596',
@@ -1156,7 +1156,7 @@
   },
 
   'src/third_party/re2/src':
-    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + 'a8176127eebcfef98db8ef9a22d1fa708b196e7c',
+    Var('chromium_git') + '/external/github.com/google/re2.git' + '@' + '59f03f30627f7d5996883d8bcfe190dbf1f24145',
 
   'src/third_party/r8': {
       'packages': [
@@ -1252,7 +1252,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'db52df17f0d012983dc281e4864c71485a86bd0e',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '59ab1cf081967353c1ae31f9d8111ec9b17284b2',
+    Var('webrtc_git') + '/src.git' + '@' + '1a1c52baf9525b59a54a6f509e5a8253c8c0bfe3',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1293,7 +1293,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@295aca65583b50d01a6232df43e3359dd95f3bd3',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@4d85a1763c27462713fd6cc30f8c10f41e298b0b',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 2fa6c2c..2373275 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -48,6 +48,7 @@
 import org.chromium.android_webview.permission.AwGeolocationCallback;
 import org.chromium.android_webview.permission.AwPermissionRequest;
 import org.chromium.android_webview.renderer_priority.RendererPriority;
+import org.chromium.base.BuildInfo;
 import org.chromium.base.Callback;
 import org.chromium.base.LocaleUtils;
 import org.chromium.base.Log;
@@ -107,6 +108,7 @@
 import java.util.Map;
 import java.util.WeakHashMap;
 import java.util.concurrent.Callable;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
@@ -152,6 +154,13 @@
     private static final Pattern sFileAndroidAssetPattern =
             Pattern.compile("^file:/*android_(asset|res).*");
 
+    // Matches a data URL that (may) have a valid fragment selector, pulling the fragment selector
+    // out into a group. Such a URL must contain a single '#' character and everything after that
+    // must be a valid DOM id.
+    // DOM id grammar: https://www.w3.org/TR/1999/REC-html401-19991224/types.html#type-name
+    private static final Pattern sDataURLWithSelectorPattern =
+            Pattern.compile("^[^#]*(#[A-Za-z][A-Za-z0-9\\-_:.]*)$");
+
     private static class ForceAuxiliaryBitmapRendering {
         private static final boolean sResult = lazyCheck();
         private static boolean lazyCheck() {
@@ -1752,11 +1761,41 @@
         if (isDestroyedOrNoOperation(WARN)) return;
         if (data != null && data.contains("#")) {
             RecordHistogram.recordBooleanHistogram(DATA_URI_HISTOGRAM_NAME, true);
+            if (!BuildInfo.targetsAtLeastQ() && !isBase64Encoded(encoding)) {
+                // As of Chromium M72, data URI parsing strictly enforces encoding of '#'. To
+                // support WebView applications which were not expecting this change, we do it for
+                // them.
+                data = fixupOctothorpesInLoadDataContent(data);
+            }
         }
         loadUrl(LoadUrlParams.createLoadDataParams(
                 fixupData(data), fixupMimeType(mimeType), isBase64Encoded(encoding)));
     }
 
+    /**
+     * Helper method to fixup content passed to {@link #loadData} which may not have had '#'
+     * characters encoded correctly. Historically Chromium did not strictly enforce the encoding of
+     * '#' characters in Data URLs; they would be treated both as renderable content and as
+     * potential URL fragments for DOM id matching. This behavior changed in Chromium M72 where
+     * stricter parsing was enforced; the first '#' character now marks the end of the renderable
+     * section and the start of the DOM fragment.
+     *
+     * @param data The content passed to {@link #loadData}, which may contain unencoded '#'s.
+     * @return A version of the input with '#' characters correctly encoded, preserving any DOM id
+     *         selector which may have been present in the original.
+     */
+    @VisibleForTesting
+    public static String fixupOctothorpesInLoadDataContent(String data) {
+        // If the data may have had a valid DOM selector, we duplicate the selector and append it as
+        // a proper URL fragment. For example, "<a id='target'>Target</a>#target" will be converted
+        // to "<a id='target'>Target</a>%23target#target". This preserves both the rendering (which
+        // should render 'Target#target' on the page) and the DOM selector behavior (which should
+        // scroll to the anchor).
+        Matcher matcher = sDataURLWithSelectorPattern.matcher(data);
+        String suffix = matcher.matches() ? matcher.group(1) : "";
+        return data.replace("#", "%23") + suffix;
+    }
+
     private @UrlScheme int schemeForUrl(String url) {
         if (url == null || url.equals(ContentUrlConstants.ABOUT_BLANK_DISPLAY_URL)) {
             return (UrlScheme.EMPTY);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
index 5775a8f0..da14008 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsTest.java
@@ -33,6 +33,7 @@
 import org.chromium.android_webview.renderer_priority.RendererPriority;
 import org.chromium.android_webview.test.TestAwContentsClient.OnDownloadStartHelper;
 import org.chromium.android_webview.test.util.CommonResources;
+import org.chromium.base.BuildInfo;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.test.util.CallbackHelper;
@@ -754,6 +755,88 @@
         Assert.assertEquals(0, consoleHelper.getMessages().size());
     }
 
+    @Test
+    @Feature({"AndroidWebView"})
+    @SmallTest
+    public void testFixupOctothorpesInLoadDataContent() {
+        // If there are no octothorpes the function should have no effect.
+        final String noOctothorpeString = "<div id='foo1'>This content has no octothorpe</div>";
+        Assert.assertEquals(noOctothorpeString,
+                AwContents.fixupOctothorpesInLoadDataContent(noOctothorpeString));
+
+        // One '#' followed by a valid DOM id requires us to duplicate it into a real fragment.
+        Assert.assertEquals("abc%23A#A", AwContents.fixupOctothorpesInLoadDataContent("abc#A"));
+        Assert.assertEquals("abc%23a#a", AwContents.fixupOctothorpesInLoadDataContent("abc#a"));
+        Assert.assertEquals("abc%23Aa#Aa", AwContents.fixupOctothorpesInLoadDataContent("abc#Aa"));
+        Assert.assertEquals("abc%23aA#aA", AwContents.fixupOctothorpesInLoadDataContent("abc#aA"));
+        Assert.assertEquals(
+                "abc%23a1-_:.#a1-_:.", AwContents.fixupOctothorpesInLoadDataContent("abc#a1-_:."));
+
+        // One '#' followed by an invalid DOM id just means we encode the '#'.
+        Assert.assertEquals("abc%231", AwContents.fixupOctothorpesInLoadDataContent("abc#1"));
+        Assert.assertEquals("abc%231a", AwContents.fixupOctothorpesInLoadDataContent("abc#1a"));
+        Assert.assertEquals(
+                "abc%23not valid", AwContents.fixupOctothorpesInLoadDataContent("abc#not valid"));
+        Assert.assertEquals("abc%23a@", AwContents.fixupOctothorpesInLoadDataContent("abc#a@"));
+
+        // Multiple '#', whether or not they have a valid DOM id afterwards, just means we encode
+        // the '#'.
+        Assert.assertEquals("abc%23%23a", AwContents.fixupOctothorpesInLoadDataContent("abc##a"));
+        Assert.assertEquals("abc%23a%23b", AwContents.fixupOctothorpesInLoadDataContent("abc#a#b"));
+    }
+
+    @Test
+    @Feature({"AndroidWebView"})
+    @SmallTest
+    public void testLoadDataOctothorpeHandling() throws Throwable {
+        AwTestContainerView testView =
+                mActivityTestRule.createAwTestContainerViewOnMainSync(mContentsClient);
+        final AwContents awContents = testView.getAwContents();
+
+        // Before Android Q, the loadData API is expected to handle the encoding for users.
+        boolean encodeOctothorpes = !BuildInfo.targetsAtLeastQ();
+
+        // A URL with no '#' character.
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html>test</html>", "text/html", false);
+        Assert.assertEquals("data:text/html,<html>test</html>", awContents.getLastCommittedUrl());
+
+        // A URL with one '#' character.
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html>test#foo</html>", "text/html", false);
+        String expectedUrl = encodeOctothorpes ? "data:text/html,<html>test%23foo</html>"
+                                               : "data:text/html,<html>test#foo</html>";
+        Assert.assertEquals(expectedUrl, awContents.getLastCommittedUrl());
+
+        // A URL with many '#' characters.
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html>test#foo#bar#</html>", "text/html", false);
+        expectedUrl = encodeOctothorpes ? "data:text/html,<html>test%23foo%23bar%23</html>"
+                                        : "data:text/html,<html>test#foo#bar#</html>";
+        Assert.assertEquals(expectedUrl, awContents.getLastCommittedUrl());
+
+        // An already encoded '#' character.
+        mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                "<html>test%23foo</html>", "text/html", false);
+        Assert.assertEquals(
+                "data:text/html,<html>test%23foo</html>", awContents.getLastCommittedUrl());
+
+        // A URL with a valid fragment. Before Q, this must be manipulated so that it renders the
+        // same and still scrolls to the fragment location.
+        if (encodeOctothorpes) {
+            String contents = "<div style='height: 5000px'></div><a id='target'>Target</a>#target";
+            mActivityTestRule.loadDataSync(awContents, mContentsClient.getOnPageFinishedHelper(),
+                    contents, "text/html", false);
+            Assert.assertEquals(
+                    "data:text/html,<div style='height: 5000px'></div><a id='target'>Target</a>"
+                            + "%23target#target",
+                    awContents.getLastCommittedUrl());
+            // TODO(smcgruer): I can physically see that this has scrolled on the test page, and
+            // have traced scrolling through PaintLayerScrollableArea, but I don't know how to check
+            // it.
+        }
+    }
+
     private int getHistogramSampleCount(String name) throws Throwable {
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 5de367c..ac01198 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1489,7 +1489,7 @@
     "//services/device/public/mojom",
     "//services/ws:lib",
     "//services/ws/ime/test_ime_driver:lib",
-    "//services/ws/ime/test_ime_driver:manifest",
+    "//services/ws/ime/test_ime_driver/public/cpp:manifest",
     "//services/ws/ime/test_ime_driver/public/mojom",
     "//services/ws/remote_view_host",
     "//skia",
diff --git a/ash/display/display_configuration_controller.cc b/ash/display/display_configuration_controller.cc
index ec6f43e..207114a 100644
--- a/ash/display/display_configuration_controller.cc
+++ b/ash/display/display_configuration_controller.cc
@@ -16,13 +16,10 @@
 #include "base/bind.h"
 #include "base/time/time.h"
 #include "chromeos/system/devicemode.h"
-#include "ui/base/class_property.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/display/display_layout.h"
 #include "ui/display/manager/display_manager.h"
 
-DEFINE_UI_CLASS_PROPERTY_TYPE(ash::ScreenRotationAnimator*);
-
 namespace ash {
 
 namespace {
@@ -37,12 +34,6 @@
 const int64_t kCycleDisplayThrottleTimeoutMs = 4000;
 const int64_t kSetPrimaryDisplayThrottleTimeoutMs = 500;
 
-// A property key to store the ScreenRotationAnimator of the window; Used for
-// screen rotation.
-DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(ash::ScreenRotationAnimator,
-                                   kScreenRotationAnimatorKey,
-                                   nullptr);
-
 bool g_disable_animator_for_test = false;
 
 display::DisplayPositionInUnifiedMatrix GetUnifiedModeShelfCellPosition() {
@@ -216,13 +207,6 @@
     display_animator_.reset(new DisplayAnimator());
 }
 
-void DisplayConfigurationController::SetScreenRotationAnimatorForTest(
-    int64_t display_id,
-    std::unique_ptr<ScreenRotationAnimator> animator) {
-  aura::Window* root_window = Shell::GetRootWindowForDisplayId(display_id);
-  root_window->SetProperty(kScreenRotationAnimatorKey, animator.release());
-}
-
 // Private
 
 void DisplayConfigurationController::SetThrottleTimeout(int64_t throttle_ms) {
@@ -267,13 +251,7 @@
 DisplayConfigurationController::GetScreenRotationAnimatorForDisplay(
     int64_t display_id) {
   aura::Window* root_window = Shell::GetRootWindowForDisplayId(display_id);
-  ScreenRotationAnimator* animator =
-      root_window->GetProperty(kScreenRotationAnimatorKey);
-  if (!animator) {
-    animator = new ScreenRotationAnimator(root_window);
-    root_window->SetProperty(kScreenRotationAnimatorKey, animator);
-  }
-  return animator;
+  return ScreenRotationAnimator::GetForRootWindow(root_window);
 }
 
 }  // namespace ash
diff --git a/ash/display/display_configuration_controller.h b/ash/display/display_configuration_controller.h
index cfd39495..2c81305 100644
--- a/ash/display/display_configuration_controller.h
+++ b/ash/display/display_configuration_controller.h
@@ -96,10 +96,6 @@
   // Allow tests to enable or disable animations.
   void SetAnimatorForTest(bool enable);
 
-  void SetScreenRotationAnimatorForTest(
-      int64_t display_id,
-      std::unique_ptr<ScreenRotationAnimator> animator);
-
  private:
   class DisplayChangeLimiter;
 
diff --git a/ash/display/display_configuration_controller_test_api.cc b/ash/display/display_configuration_controller_test_api.cc
index a15c127..fa0266b 100644
--- a/ash/display/display_configuration_controller_test_api.cc
+++ b/ash/display/display_configuration_controller_test_api.cc
@@ -6,6 +6,7 @@
 
 #include "ash/display/display_configuration_controller.h"
 #include "ash/rotator/screen_rotation_animator.h"
+#include "ash/shell.h"
 
 namespace ash {
 
@@ -26,8 +27,9 @@
 void DisplayConfigurationControllerTestApi::SetScreenRotationAnimatorForDisplay(
     int64_t display_id,
     std::unique_ptr<ScreenRotationAnimator> animator) {
-  controller_->SetScreenRotationAnimatorForTest(display_id,
-                                                std::move(animator));
+  aura::Window* root_window = Shell::GetRootWindowForDisplayId(display_id);
+  ScreenRotationAnimator::SetScreenRotationAnimatorForTest(root_window,
+                                                           std::move(animator));
 }
 
 }  // namespace ash
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index e5cfc885..7e1e4288 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -176,7 +176,7 @@
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/mojom",
     "//services/viz/public/interfaces",
-    "//services/ws:manifest",
+    "//services/ws/public/cpp:manifest",
     "//services/ws/public/mojom",
   ]
 }
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc
index f3120b3..b738445 100644
--- a/ash/public/cpp/manifest.cc
+++ b/ash/public/cpp/manifest.cc
@@ -51,7 +51,7 @@
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
 #include "services/viz/public/interfaces/constants.mojom.h"
-#include "services/ws/manifest.h"
+#include "services/ws/public/cpp/manifest.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 
 namespace ash {
@@ -122,7 +122,7 @@
           .RequireCapability(device::mojom::kServiceName, "device:fingerprint")
           .RequireCapability(chromeos::multidevice_setup::mojom::kServiceName,
                              "multidevice_setup")
-          .PackageService(ui::GetManifest())
+          .PackageService(ws::GetManifest())
           .Build()
           .Amend(GetAmendmentForTesting())};
   return *manifest;
diff --git a/ash/rotator/screen_rotation_animator.cc b/ash/rotator/screen_rotation_animator.cc
index 4aa542ee..a3e6e73 100644
--- a/ash/rotator/screen_rotation_animator.cc
+++ b/ash/rotator/screen_rotation_animator.cc
@@ -20,6 +20,7 @@
 #include "components/viz/common/frame_sinks/copy_output_result.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "ui/aura/window.h"
+#include "ui/base/class_property.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animation_element.h"
@@ -40,6 +41,8 @@
 #include "ui/gfx/transform_util.h"
 #include "ui/wm/core/window_util.h"
 
+DEFINE_UI_CLASS_PROPERTY_TYPE(ash::ScreenRotationAnimator*);
+
 namespace ash {
 
 namespace {
@@ -54,6 +57,12 @@
 const int kCounterClockWiseRotationFactor = 1;
 const int kClockWiseRotationFactor = -1;
 
+// A property key to store the ScreenRotationAnimator of the window; Used for
+// screen rotation.
+DEFINE_OWNED_UI_CLASS_PROPERTY_KEY(ScreenRotationAnimator,
+                                   kScreenRotationAnimatorKey,
+                                   nullptr);
+
 display::Display::Rotation GetCurrentScreenRotation(int64_t display_id) {
   return Shell::Get()
       ->display_manager()
@@ -161,6 +170,24 @@
 
 }  // namespace
 
+// static
+ScreenRotationAnimator* ScreenRotationAnimator::GetForRootWindow(
+    aura::Window* root_window) {
+  auto* animator = root_window->GetProperty(kScreenRotationAnimatorKey);
+  if (!animator) {
+    animator = new ScreenRotationAnimator(root_window);
+    root_window->SetProperty(kScreenRotationAnimatorKey, animator);
+  }
+  return animator;
+}
+
+// static
+void ScreenRotationAnimator::SetScreenRotationAnimatorForTest(
+    aura::Window* root_window,
+    std::unique_ptr<ScreenRotationAnimator> animator) {
+  root_window->SetProperty(kScreenRotationAnimatorKey, animator.release());
+}
+
 ScreenRotationAnimator::ScreenRotationAnimator(aura::Window* root_window)
     : root_window_(root_window),
       screen_rotation_state_(IDLE),
@@ -299,6 +326,10 @@
   animation_scale_mode_ =
       std::make_unique<ui::ScopedAnimationDurationScaleMode>(
           ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
+
+  for (auto& observer : screen_rotation_animator_observers_)
+    observer.OnScreenCopiedBeforeRotation();
+
   SetRotation(rotation_request->display_id, rotation_request->old_rotation,
               rotation_request->new_rotation, rotation_request->source);
 
@@ -312,8 +343,10 @@
     std::unique_ptr<ScreenRotationRequest> rotation_request,
     std::unique_ptr<viz::CopyOutputResult> result) {
   animation_scale_mode_.reset();
-  if (IgnoreCopyResult(rotation_request->id, rotation_request_id_))
+  if (IgnoreCopyResult(rotation_request->id, rotation_request_id_)) {
+    NotifyAnimationFinished(/*canceled=*/true);
     return;
+  }
   // In the following cases, abort animation:
   // 1) if the display was removed,
   // 2) if the |root_window| was changed for |display_id|,
@@ -495,12 +528,12 @@
   }
 }
 
-void ScreenRotationAnimator::AddScreenRotationAnimatorObserver(
+void ScreenRotationAnimator::AddObserver(
     ScreenRotationAnimatorObserver* observer) {
   screen_rotation_animator_observers_.AddObserver(observer);
 }
 
-void ScreenRotationAnimator::RemoveScreenRotationAnimatorObserver(
+void ScreenRotationAnimator::RemoveObserver(
     ScreenRotationAnimatorObserver* observer) {
   screen_rotation_animator_observers_.RemoveObserver(observer);
 }
@@ -518,9 +551,7 @@
     return;
   }
 
-  // This is only used in test to notify animator observer.
-  for (auto& observer : screen_rotation_animator_observers_)
-    observer.OnScreenRotationAnimationFinished(this);
+  NotifyAnimationFinished(/*canceled=*/false);
 }
 
 bool ScreenRotationAnimator::IsRotating() const {
@@ -541,4 +572,9 @@
   mask_layer_tree_owner_.reset();
 }
 
+void ScreenRotationAnimator::NotifyAnimationFinished(bool canceled) {
+  for (auto& observer : screen_rotation_animator_observers_)
+    observer.OnScreenRotationAnimationFinished(this, canceled);
+}
+
 }  // namespace ash
diff --git a/ash/rotator/screen_rotation_animator.h b/ash/rotator/screen_rotation_animator.h
index d11aa37..ccbc7cc 100644
--- a/ash/rotator/screen_rotation_animator.h
+++ b/ash/rotator/screen_rotation_animator.h
@@ -33,12 +33,13 @@
 }  // namespace ui
 
 namespace ash {
-
 class ScreenRotationAnimatorObserver;
 
 // Utility to perform a screen rotation with an animation.
 class ASH_EXPORT ScreenRotationAnimator {
  public:
+  static ScreenRotationAnimator* GetForRootWindow(aura::Window* root_window);
+
   explicit ScreenRotationAnimator(aura::Window* root_window);
   virtual ~ScreenRotationAnimator();
 
@@ -53,10 +54,8 @@
               display::Display::RotationSource source,
               DisplayConfigurationController::RotationAnimation mode);
 
-  void AddScreenRotationAnimatorObserver(
-      ScreenRotationAnimatorObserver* observer);
-  void RemoveScreenRotationAnimatorObserver(
-      ScreenRotationAnimatorObserver* observer);
+  void AddObserver(ScreenRotationAnimatorObserver* observer);
+  void RemoveObserver(ScreenRotationAnimatorObserver* observer);
 
   // When screen rotation animation is ended or aborted, calls |Rotate()| with
   // the pending rotation request if the request queue is not empty. Otherwise
@@ -70,6 +69,10 @@
   // orientation if |IsRotating()| is false.
   display::Display::Rotation GetTargetRotation() const;
 
+  static void SetScreenRotationAnimatorForTest(
+      aura::Window* root_window,
+      std::unique_ptr<ScreenRotationAnimator> animator);
+
  protected:
   using CopyCallback =
       base::OnceCallback<void(std::unique_ptr<viz::CopyOutputResult> result)>;
@@ -158,6 +161,8 @@
   // |rotation_degrees| arc.
   void AnimateRotation(std::unique_ptr<ScreenRotationRequest> rotation_request);
 
+  void NotifyAnimationFinished(bool canceled);
+
   void set_disable_animation_timers_for_test(bool disable_timers) {
     disable_animation_timers_for_test_ = disable_timers;
   }
diff --git a/ash/rotator/screen_rotation_animator_observer.h b/ash/rotator/screen_rotation_animator_observer.h
index 5689a96..9f6963d3 100644
--- a/ash/rotator/screen_rotation_animator_observer.h
+++ b/ash/rotator/screen_rotation_animator_observer.h
@@ -15,9 +15,13 @@
  public:
   ScreenRotationAnimatorObserver() {}
 
+  // This will be called when the screen is copied before rotation.
+  virtual void OnScreenCopiedBeforeRotation() = 0;
+
   // This will be called when the animation is ended or aborted.
   virtual void OnScreenRotationAnimationFinished(
-      ScreenRotationAnimator* animator) = 0;
+      ScreenRotationAnimator* animator,
+      bool canceled) = 0;
 
  protected:
   virtual ~ScreenRotationAnimatorObserver() {}
diff --git a/ash/rotator/screen_rotation_animator_unittest.cc b/ash/rotator/screen_rotation_animator_unittest.cc
index f73657a8..b6667aa 100644
--- a/ash/rotator/screen_rotation_animator_unittest.cc
+++ b/ash/rotator/screen_rotation_animator_unittest.cc
@@ -60,15 +60,18 @@
  public:
   AnimationObserver() = default;
 
-  bool notified() const { return notified_; }
+  bool copy_notified() const { return copy_notified_; }
+  bool finish_notified() const { return finish_notified_; }
 
-  void OnScreenRotationAnimationFinished(
-      ScreenRotationAnimator* animator) override {
-    notified_ = true;
+  void OnScreenCopiedBeforeRotation() override { copy_notified_ = true; }
+  void OnScreenRotationAnimationFinished(ScreenRotationAnimator* animator,
+                                         bool canceled) override {
+    finish_notified_ = true;
   }
 
  private:
-  bool notified_ = false;
+  bool copy_notified_ = false;
+  bool finish_notified_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(AnimationObserver);
 };
@@ -227,7 +230,7 @@
 }
 
 void ScreenRotationAnimatorSmoothAnimationTest::QuitWaitForCopyCallback() {
-  run_loop_->QuitWhenIdle();
+  run_loop_->Quit();
 }
 
 void ScreenRotationAnimatorSmoothAnimationTest::SetUp() {
@@ -261,40 +264,46 @@
 TEST_F(ScreenRotationAnimatorSlowAnimationTest, ShouldNotifyObserver) {
   SetDisplayRotation(display_id(), display::Display::ROTATE_0);
   AnimationObserver observer;
-  animator()->AddScreenRotationAnimatorObserver(&observer);
-  EXPECT_FALSE(observer.notified());
+  animator()->AddObserver(&observer);
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
 
   animator()->Rotate(display::Display::ROTATE_90,
                      display::Display::RotationSource::USER,
                      DisplayConfigurationController::ANIMATION_SYNC);
-  EXPECT_FALSE(observer.notified());
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
 
   test_api()->CompleteAnimations();
-  EXPECT_TRUE(observer.notified());
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_TRUE(observer.finish_notified());
   EXPECT_FALSE(test_api()->HasActiveAnimations());
-  animator()->RemoveScreenRotationAnimatorObserver(&observer);
+  animator()->RemoveObserver(&observer);
 }
 
 TEST_F(ScreenRotationAnimatorSlowAnimationTest, ShouldNotifyObserverOnce) {
   SetDisplayRotation(display_id(), display::Display::ROTATE_0);
   AnimationObserver observer;
-  animator()->AddScreenRotationAnimatorObserver(&observer);
-  EXPECT_FALSE(observer.notified());
+  animator()->AddObserver(&observer);
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
 
   animator()->Rotate(display::Display::ROTATE_90,
                      display::Display::RotationSource::USER,
                      DisplayConfigurationController::ANIMATION_SYNC);
-  EXPECT_FALSE(observer.notified());
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
 
   animator()->Rotate(display::Display::ROTATE_180,
                      display::Display::RotationSource::USER,
                      DisplayConfigurationController::ANIMATION_SYNC);
-  EXPECT_FALSE(observer.notified());
+  EXPECT_FALSE(observer.finish_notified());
 
   test_api()->CompleteAnimations();
-  EXPECT_TRUE(observer.notified());
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_TRUE(observer.finish_notified());
   EXPECT_FALSE(test_api()->HasActiveAnimations());
-  animator()->RemoveScreenRotationAnimatorObserver(&observer);
+  animator()->RemoveObserver(&observer);
 }
 
 TEST_F(ScreenRotationAnimatorSlowAnimationTest, RotatesToDifferentRotation) {
@@ -389,6 +398,42 @@
   EXPECT_FALSE(GetTray()->visible());
 }
 
+TEST_F(ScreenRotationAnimatorSmoothAnimationTest, Observer) {
+  const int64_t display_id = display_manager()->GetDisplayAt(0).id();
+
+  SetScreenRotationAnimator(
+      Shell::GetRootWindowForDisplayId(display_id),
+      base::BindRepeating(
+          &ScreenRotationAnimatorSmoothAnimationTest::QuitWaitForCopyCallback,
+          base::Unretained(this)),
+      base::BindRepeating(
+          &ScreenRotationAnimatorSmoothAnimationTest::QuitWaitForCopyCallback,
+          base::Unretained(this)));
+  AnimationObserver observer;
+  animator()->AddObserver(&observer);
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
+
+  SetDisplayRotation(display_id, display::Display::ROTATE_0);
+  animator()->Rotate(display::Display::ROTATE_90,
+                     display::Display::RotationSource::USER,
+                     DisplayConfigurationController::ANIMATION_ASYNC);
+  EXPECT_TRUE(animator()->IsRotating());
+  WaitForCopyCallback();
+  EXPECT_TRUE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
+
+  WaitForCopyCallback();
+
+  EXPECT_TRUE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
+  test_api()->CompleteAnimations();
+  EXPECT_FALSE(test_api()->HasActiveAnimations());
+  EXPECT_EQ(display::Display::ROTATE_90, GetDisplayRotation(display_id));
+  EXPECT_TRUE(observer.copy_notified());
+  EXPECT_TRUE(observer.finish_notified());
+}
+
 // Test enable smooth screen rotation code path.
 TEST_F(ScreenRotationAnimatorSmoothAnimationTest,
        RotatesToDifferentRotationWithCopyCallback) {
@@ -399,6 +444,11 @@
       base::Bind(
           &ScreenRotationAnimatorSmoothAnimationTest::QuitWaitForCopyCallback,
           base::Unretained(this)));
+  AnimationObserver observer;
+  animator()->AddObserver(&observer);
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
+
   SetDisplayRotation(display_id, display::Display::ROTATE_0);
   animator()->Rotate(display::Display::ROTATE_90,
                      display::Display::RotationSource::USER,
@@ -407,9 +457,14 @@
 
   EXPECT_EQ(display::Display::ROTATE_90, animator()->GetTargetRotation());
   EXPECT_NE(display::Display::ROTATE_90, GetDisplayRotation(display_id));
+  EXPECT_FALSE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
 
   WaitForCopyCallback();
   EXPECT_TRUE(test_api()->HasActiveAnimations());
+  EXPECT_TRUE(observer.copy_notified());
+  EXPECT_FALSE(observer.finish_notified());
+
   EXPECT_EQ(display::Display::ROTATE_90, animator()->GetTargetRotation());
   // Once copy is made, the rotation is set to the target, with the
   // image that was rotated to the original orientation.
@@ -418,6 +473,8 @@
   test_api()->CompleteAnimations();
   EXPECT_FALSE(test_api()->HasActiveAnimations());
   EXPECT_EQ(display::Display::ROTATE_90, GetDisplayRotation(display_id));
+  EXPECT_TRUE(observer.copy_notified());
+  EXPECT_TRUE(observer.finish_notified());
 }
 
 // If the rotating external secondary display is removed before the first copy
diff --git a/ash/shell/content/client/shell_content_browser_client.cc b/ash/shell/content/client/shell_content_browser_client.cc
index 86a035c..15586369 100644
--- a/ash/shell/content/client/shell_content_browser_client.cc
+++ b/ash/shell/content/client/shell_content_browser_client.cc
@@ -33,7 +33,7 @@
 #include "services/device/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/manifest.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/ws/ime/test_ime_driver/manifest.h"
+#include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
 #include "services/ws/ime/test_ime_driver/public/mojom/constants.mojom.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 #include "services/ws/window_service.h"
diff --git a/ash/wm/overview/overview_controller.cc b/ash/wm/overview/overview_controller.cc
index e2301811..c47e0f9 100644
--- a/ash/wm/overview/overview_controller.cc
+++ b/ash/wm/overview/overview_controller.cc
@@ -541,6 +541,12 @@
   return windows;
 }
 
+void OverviewController::DelayedUpdateMaskAndShadow() {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(&OverviewController::UpdateMaskAndShadow,
+                                weak_ptr_factory_.GetWeakPtr()));
+}
+
 // TODO(flackr): Make OverviewController observe the activation of
 // windows, so we can remove OverviewDelegate.
 // TODO(sammiequon): Rename to something like EndOverview() and refactor to use
@@ -634,6 +640,11 @@
     OnStartingAnimationComplete(/*canceled=*/false);
 }
 
+void OverviewController::UpdateMaskAndShadow() {
+  if (overview_session_)
+    overview_session_->UpdateMaskAndShadow();
+}
+
 // static
 void OverviewController::SetDoNotChangeWallpaperBlurForTests() {
   g_disable_wallpaper_blur_for_tests = true;
diff --git a/ash/wm/overview/overview_controller.h b/ash/wm/overview/overview_controller.h
index 659cffb..5e88d1d 100644
--- a/ash/wm/overview/overview_controller.h
+++ b/ash/wm/overview/overview_controller.h
@@ -68,6 +68,9 @@
   // overview mode is active for testing.
   std::vector<aura::Window*> GetWindowsListInOverviewGridsForTesting();
 
+  // Post a task to update the shadow and mask of overview windows.
+  void DelayedUpdateMaskAndShadow();
+
   // OverviewDelegate:
   void OnSelectionEnded() override;
   void AddDelayedAnimationObserver(
@@ -115,6 +118,8 @@
   void OnEndingAnimationComplete(bool canceled);
   void ResetPauser();
 
+  void UpdateMaskAndShadow();
+
   // Collection of DelayedAnimationObserver objects that own widgets that may be
   // still animating after overview mode ends. If shell needs to shut down while
   // those animations are in progress, the animations are shut down and the
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc
index f810f45..925df668 100644
--- a/ash/wm/overview/overview_grid.cc
+++ b/ash/wm/overview/overview_grid.cc
@@ -14,6 +14,7 @@
 #include "ash/public/cpp/window_properties.h"
 #include "ash/public/cpp/window_state_type.h"
 #include "ash/root_window_controller.h"
+#include "ash/rotator/screen_rotation_animator.h"
 #include "ash/screen_util.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_constants.h"
@@ -380,6 +381,8 @@
 }
 
 void OverviewGrid::Shutdown() {
+  ScreenRotationAnimator::GetForRootWindow(root_window_)->RemoveObserver(this);
+
   for (const auto& window : window_list_)
     window->Shutdown();
 
@@ -411,6 +414,11 @@
   for (const auto& window : window_list_)
     window->PrepareForOverview();
   prepared_for_overview_ = true;
+  if (Shell::Get()
+          ->tablet_mode_controller()
+          ->IsTabletModeWindowManagerEnabled()) {
+    ScreenRotationAnimator::GetForRootWindow(root_window_)->AddObserver(this);
+  }
 }
 
 void OverviewGrid::PositionWindows(
@@ -882,6 +890,21 @@
   }
 }
 
+void OverviewGrid::OnScreenCopiedBeforeRotation() {
+  for (auto& window : window_list()) {
+    window->set_disable_mask(true);
+    window->UpdateMaskAndShadow();
+  }
+}
+
+void OverviewGrid::OnScreenRotationAnimationFinished(
+    ScreenRotationAnimator* animator,
+    bool canceled) {
+  for (auto& window : window_list())
+    window->set_disable_mask(false);
+  Shell::Get()->overview_controller()->DelayedUpdateMaskAndShadow();
+}
+
 void OverviewGrid::OnStartingAnimationComplete() {
   if (!shield_widget_) {
     InitShieldWidget(/*animate=*/true);
diff --git a/ash/wm/overview/overview_grid.h b/ash/wm/overview/overview_grid.h
index f0c6309..03d5dca 100644
--- a/ash/wm/overview/overview_grid.h
+++ b/ash/wm/overview/overview_grid.h
@@ -11,6 +11,7 @@
 #include <set>
 #include <vector>
 
+#include "ash/rotator/screen_rotation_animator_observer.h"
 #include "ash/wm/overview/overview_session.h"
 #include "ash/wm/window_state_observer.h"
 #include "base/macros.h"
@@ -50,7 +51,8 @@
 // The selector is switched to the next window grid (if available) or wrapped if
 // it reaches the end of its movement sequence.
 class ASH_EXPORT OverviewGrid : public aura::WindowObserver,
-                                public wm::WindowStateObserver {
+                                public wm::WindowStateObserver,
+                                public ScreenRotationAnimatorObserver {
  public:
   OverviewGrid(aura::Window* root_window,
                const std::vector<aura::Window*>& window_list,
@@ -148,6 +150,11 @@
   void OnPostWindowStateTypeChange(wm::WindowState* window_state,
                                    mojom::WindowStateType old_type) override;
 
+  // ScreenRotationAnimatorObserver:
+  void OnScreenCopiedBeforeRotation() override;
+  void OnScreenRotationAnimationFinished(ScreenRotationAnimator* animator,
+                                         bool canceled) override;
+
   // Called when overview starting animation completes.
   void OnStartingAnimationComplete();
 
diff --git a/ash/wm/overview/overview_item.cc b/ash/wm/overview/overview_item.cc
index 8f93363..461fef2 100644
--- a/ash/wm/overview/overview_item.cc
+++ b/ash/wm/overview/overview_item.cc
@@ -625,7 +625,8 @@
   // 6) this overview item is in animation.
   bool should_show = true;
   OverviewController* overview_controller = Shell::Get()->overview_controller();
-  if (!overview_controller || !overview_controller->IsSelecting() ||
+  if (disable_mask_ || !overview_controller ||
+      !overview_controller->IsSelecting() ||
       overview_grid_->window_list().size() > 10 ||
       overview_controller->IsInStartAnimation() || is_being_dragged_ ||
       overview_grid_->IsDropTargetWindow(GetWindow()) ||
diff --git a/ash/wm/overview/overview_item.h b/ash/wm/overview/overview_item.h
index f43759d..123048a 100644
--- a/ash/wm/overview/overview_item.h
+++ b/ash/wm/overview/overview_item.h
@@ -242,6 +242,8 @@
   bool animating_to_close() const { return animating_to_close_; }
   void set_animating_to_close(bool val) { animating_to_close_ = val; }
 
+  void set_disable_mask(bool disable) { disable_mask_ = disable; }
+
   float GetCloseButtonVisibilityForTesting() const;
   float GetTitlebarOpacityForTesting() const;
   gfx::Rect GetShadowBoundsForTesting();
@@ -339,6 +341,9 @@
   // True if this overview item is currently being dragged around.
   bool is_being_dragged_ = false;
 
+  // True to always disable mask regardless of the state.
+  bool disable_mask_ = false;
+
   // The shadow around the overview window. Shadows the original window, not
   // |item_widget_|. Done here instead of on the original window because of the
   // rounded edges mask applied on entering overview window.
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index a162ca8d..7a88fbd1 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -574,11 +574,11 @@
 
 void OverviewSession::OnStartingAnimationComplete(bool canceled) {
   if (!canceled) {
-    UpdateMaskAndShadow();
     if (overview_focus_widget_)
       overview_focus_widget_->Show();
     for (auto& grid : grid_list_)
       grid->OnStartingAnimationComplete();
+    Shell::Get()->overview_controller()->DelayedUpdateMaskAndShadow();
   }
 }
 
diff --git a/ash/wm/overview/overview_session_unittest.cc b/ash/wm/overview/overview_session_unittest.cc
index 2038b52..f632e81 100644
--- a/ash/wm/overview/overview_session_unittest.cc
+++ b/ash/wm/overview/overview_session_unittest.cc
@@ -2238,6 +2238,11 @@
   EXPECT_FALSE(HasMaskForItem(item2));
   window1->layer()->GetAnimator()->StopAnimating();
   window2->layer()->GetAnimator()->StopAnimating();
+
+  // Mask is set asynchronously.
+  EXPECT_FALSE(HasMaskForItem(item1));
+  EXPECT_FALSE(HasMaskForItem(item2));
+  base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(HasMaskForItem(item1));
   EXPECT_TRUE(HasMaskForItem(item2));
 
@@ -2262,6 +2267,9 @@
       ->layer()
       ->GetAnimator()
       ->StopAnimating();
+  EXPECT_FALSE(HasMaskForItem(item1));
+  EXPECT_FALSE(HasMaskForItem(item2));
+  base::RunLoop().RunUntilIdle();
   EXPECT_TRUE(HasMaskForItem(item1));
   EXPECT_TRUE(HasMaskForItem(item2));
 
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
index 4f58d43..95d7bc3 100644
--- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc
+++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -137,13 +137,13 @@
 
   scoped_refptr<TestMockTimeTaskRunner> test_task_runner() const {
     return test_task_runner_;
-  };
+  }
 
   SequenceManagerForTest* sequence_manager() const override {
     return sequence_manager_.get();
   }
 
-  void DestroySequenceManager() override { sequence_manager_.reset(); };
+  void DestroySequenceManager() override { sequence_manager_.reset(); }
 
  private:
   scoped_refptr<TestMockTimeTaskRunner> test_task_runner_;
@@ -203,7 +203,7 @@
   void DestroySequenceManager() override {
     pump_ = nullptr;
     sequence_manager_.reset();
-  };
+  }
 
  private:
   MockTimeMessagePump* pump_ = nullptr;
diff --git a/cc/animation/element_animations_unittest.cc b/cc/animation/element_animations_unittest.cc
index 1d8175a..ee842dc 100644
--- a/cc/animation/element_animations_unittest.cc
+++ b/cc/animation/element_animations_unittest.cc
@@ -310,7 +310,7 @@
     // Detaching animation from the timeline ensures that the timeline doesn't
     // hold a reference to the animation and the animation is destroyed.
     timeline_->DetachAnimation(animation_);
-  };
+  }
 
   void setTimelineAndAnimation(
       scoped_refptr<AnimationTimeline> timeline,
diff --git a/cc/paint/paint_op_buffer_unittest.cc b/cc/paint/paint_op_buffer_unittest.cc
index a682307..3b0f2ff 100644
--- a/cc/paint/paint_op_buffer_unittest.cc
+++ b/cc/paint/paint_op_buffer_unittest.cc
@@ -2825,7 +2825,7 @@
   EXPECT_EQ(flags.getShader()->ty(), xy[1]);
 
   return true;
-};
+}
 
 TEST(PaintOpBufferTest, ReplacesImagesFromProvider) {
   std::vector<SkSize> src_rect_offset = {
diff --git a/cc/test/fake_paint_image_generator.cc b/cc/test/fake_paint_image_generator.cc
index d2a35ae8..c0bdfbb 100644
--- a/cc/test/fake_paint_image_generator.cc
+++ b/cc/test/fake_paint_image_generator.cc
@@ -4,6 +4,8 @@
 
 #include <cc/test/fake_paint_image_generator.h>
 
+#include <utility>
+
 namespace cc {
 
 FakePaintImageGenerator::FakePaintImageGenerator(
@@ -18,6 +20,20 @@
       image_pixmap_(info, image_backing_memory_.data(), info.minRowBytes()),
       supported_sizes_(std::move(supported_sizes)) {}
 
+FakePaintImageGenerator::FakePaintImageGenerator(
+    const SkImageInfo& info,
+    const SkYUVASizeInfo& yuva_size_info,
+    std::vector<FrameMetadata> frames,
+    bool allocate_discardable_memory,
+    std::vector<SkISize> supported_sizes)
+    : PaintImageGenerator(info, std::move(frames)),
+      image_backing_memory_(
+          allocate_discardable_memory ? yuva_size_info.computeTotalBytes() : 0,
+          0),
+      supported_sizes_(std::move(supported_sizes)),
+      is_yuv_(true),
+      yuva_size_info_(yuva_size_info) {}
+
 FakePaintImageGenerator::~FakePaintImageGenerator() = default;
 
 sk_sp<SkData> FakePaintImageGenerator::GetEncodedData() const {
@@ -30,8 +46,14 @@
                                         size_t frame_index,
                                         PaintImage::GeneratorClientId client_id,
                                         uint32_t lazy_pixel_ref) {
+  CHECK(!is_yuv_ || expect_fallback_to_rgb_);
   if (image_backing_memory_.empty())
     return false;
+  if (expect_fallback_to_rgb_) {
+    image_backing_memory_.resize(info.computeMinByteSize(), 0);
+    image_pixmap_ =
+        SkPixmap(info, image_backing_memory_.data(), info.minRowBytes());
+  }
   if (frames_decoded_count_.find(frame_index) == frames_decoded_count_.end())
     frames_decoded_count_[frame_index] = 1;
   else
@@ -42,19 +64,38 @@
   return true;
 }
 
-bool FakePaintImageGenerator::QueryYUVA8(SkYUVASizeInfo* info,
+bool FakePaintImageGenerator::QueryYUVA8(SkYUVASizeInfo* yuv_info,
                                          SkYUVAIndex indices[],
                                          SkYUVColorSpace* color_space) const {
-  return false;
+  if (!is_yuv_)
+    return false;
+  *yuv_info = yuva_size_info_;
+  return true;
 }
 
-bool FakePaintImageGenerator::GetYUVA8Planes(const SkYUVASizeInfo& info,
+bool FakePaintImageGenerator::GetYUVA8Planes(const SkYUVASizeInfo& yuv_info,
                                              const SkYUVAIndex indices[],
                                              void* planes[4],
                                              size_t frame_index,
                                              uint32_t lazy_pixel_ref) {
-  NOTREACHED();
-  return false;
+  CHECK(is_yuv_);
+  CHECK(!expect_fallback_to_rgb_);
+  if (image_backing_memory_.empty())
+    return false;
+  int numPlanes = SkYUVASizeInfo::kMaxCount;
+  void* src_planes[numPlanes];
+  yuv_info.computePlanes(image_backing_memory_.data(), src_planes);
+  for (int i = 0; i < numPlanes; ++i) {
+    size_t bytes_for_plane_i =
+        yuv_info.fWidthBytes[i] *
+        base::checked_cast<size_t>(yuv_info.fSizes[i].height());
+    memcpy(planes[i], src_planes[i], bytes_for_plane_i);
+  }
+  if (frames_decoded_count_.find(frame_index) == frames_decoded_count_.end())
+    frames_decoded_count_[frame_index] = 1;
+  else
+    frames_decoded_count_[frame_index]++;
+  return true;
 }
 
 SkISize FakePaintImageGenerator::GetSupportedDecodeSize(
diff --git a/cc/test/fake_paint_image_generator.h b/cc/test/fake_paint_image_generator.h
index 45f66fdb..e34ab446 100644
--- a/cc/test/fake_paint_image_generator.h
+++ b/cc/test/fake_paint_image_generator.h
@@ -5,20 +5,32 @@
 #ifndef CC_TEST_FAKE_PAINT_IMAGE_GENERATOR_H_
 #define CC_TEST_FAKE_PAINT_IMAGE_GENERATOR_H_
 
+#include <vector>
+
 #include "base/containers/flat_map.h"
+#include "base/macros.h"  // For DISALLOW_COPY_AND_ASSIGN
 #include "cc/paint/paint_image_generator.h"
 
 namespace cc {
 
 class FakePaintImageGenerator : public PaintImageGenerator {
  public:
+  // RGB decoding mode constructor.
   explicit FakePaintImageGenerator(
       const SkImageInfo& info,
       std::vector<FrameMetadata> frames = {FrameMetadata()},
       bool allocate_discardable_memory = true,
       std::vector<SkISize> supported_sizes = {});
+  // YUV decoding mode constructor.
+  explicit FakePaintImageGenerator(
+      const SkImageInfo& info,
+      const SkYUVASizeInfo& yuva_size_info,
+      std::vector<FrameMetadata> frames = {FrameMetadata()},
+      bool allocate_discardable_memory = true,
+      std::vector<SkISize> supported_sizes = {});
   ~FakePaintImageGenerator() override;
 
+  // PaintImageGenerator implementation.
   sk_sp<SkData> GetEncodedData() const override;
   bool GetPixels(const SkImageInfo& info,
                  void* pixels,
@@ -39,8 +51,12 @@
   const base::flat_map<size_t, int>& frames_decoded() const {
     return frames_decoded_count_;
   }
-  const std::vector<SkImageInfo>& decode_infos() const { return decode_infos_; }
+  const std::vector<SkImageInfo>& decode_infos() const {
+    CHECK(!is_yuv_);
+    return decode_infos_;
+  }
   void reset_frames_decoded() { frames_decoded_count_.clear(); }
+  void SetExpectFallbackToRGB() { expect_fallback_to_rgb_ = true; }
 
  private:
   std::vector<uint8_t> image_backing_memory_;
@@ -48,6 +64,14 @@
   base::flat_map<size_t, int> frames_decoded_count_;
   std::vector<SkISize> supported_sizes_;
   std::vector<SkImageInfo> decode_infos_;
+  bool is_yuv_ = false;
+  SkYUVASizeInfo yuva_size_info_;
+  // TODO(skbug.com/8564): After Skia supports rendering from software YUV
+  // planes and after Chrome implements it, we should no longer expect RGB
+  // fallback.
+  bool expect_fallback_to_rgb_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(FakePaintImageGenerator);
 };
 
 }  // namespace cc
diff --git a/chrome/VERSION b/chrome/VERSION
index 94c600e9..20d904a0 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=74
 MINOR=0
-BUILD=3700
+BUILD=3703
 PATCH=0
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index 9218420b..9fb5403 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -208,6 +208,10 @@
         <item name="android:windowLightNavigationBar" tools:targetApi="28">false</item>
     </style>
 
+    <!-- TODO(huayinz): Temporary theme. Remove this. -->
+    <style name="DialogWhenLarge" parent="Base.Theme.Chromium.DialogWhenLarge"
+        tools:ignore="UnusedResources" />
+
     <!-- ThemeOverlay -->
     <style name="OverflowMenuThemeOverlay" parent="Theme.AppCompat.DayNight">
         <item name="android:popupBackground">@null</item>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index e938ff6..2537a63 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -224,7 +224,6 @@
     public static final String EXPLICIT_LANGUAGE_ASK = "ExplicitLanguageAsk";
     public static final String EXPLORE_SITES = "ExploreSites";
     public static final String FCM_INVALIDATIONS = "FCMInvalidations";
-    public static final String GESTURE_NAVIGATION = "GestureNavigation";
     public static final String GRANT_NOTIFICATIONS_TO_DSE = "GrantNotificationsToDSE";
     public static final String GENERIC_SENSOR_EXTRA_CLASSES = "GenericSensorExtraClasses";
     public static final String HANDLE_MEDIA_INTENTS = "HandleMediaIntents";
@@ -271,6 +270,7 @@
     public static final String OMNIBOX_SPARE_RENDERER = "OmniboxSpareRenderer";
     public static final String OMNIBOX_VOICE_SEARCH_ALWAYS_VISIBLE =
             "OmniboxVoiceSearchAlwaysVisible";
+    public static final String OVERSCROLL_HISTORY_NAVIGATION = "OverscrollHistoryNavigation";
     public static final String PAY_WITH_GOOGLE_V1 = "PayWithGoogleV1";
     public static final String PASSWORDS_KEYBOARD_ACCESSORY = "PasswordsKeyboardAccessory";
     public static final String PERMISSION_DELEGATION = "PermissionDelegation";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java
index f0c9341..87bf8ddd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java
@@ -103,7 +103,8 @@
     private SwipeRefreshHandler(Tab tab) {
         super(tab);
         mTab = tab;
-        mNavigationEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.GESTURE_NAVIGATION);
+        mNavigationEnabled =
+                ChromeFeatureList.isEnabled(ChromeFeatureList.OVERSCROLL_HISTORY_NAVIGATION);
     }
 
     private void initSwipeRefreshLayout() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java
index 75cffabd..aad6529 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/HistoryNavigationLayout.java
@@ -55,7 +55,7 @@
 
     public HistoryNavigationLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
-        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.GESTURE_NAVIGATION)) return;
+        if (!ChromeFeatureList.isEnabled(ChromeFeatureList.OVERSCROLL_HISTORY_NAVIGATION)) return;
         if (context instanceof ChromeActivity) {
             mTabProvider = ((ChromeActivity) context).getActivityTabProvider();
             mDetector = new GestureDetector(getContext(), new SideNavGestureListener());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java
index fa305eb..35bfd33a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/status/StatusViewCoordinator.java
@@ -66,6 +66,10 @@
      */
     public void setToolbarDataProvider(ToolbarDataProvider toolbarDataProvider) {
         mToolbarDataProvider = toolbarDataProvider;
+        // Update status immediately after receiving the data provider to avoid initial presence
+        // glitch on tablet devices. This glitch would be typically seen upon launch of app, right
+        // before the landing page is presented to the user.
+        updateStatusIcon();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java
index 4d19a75..266a450 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/SameActivityWebappSplashDelegate.java
@@ -38,9 +38,15 @@
     /** Whether native was loaded. Native must be loaded in order to record metrics. */
     private boolean mNativeLoaded;
 
+    private Tab mTab;
+
+    private WebappInfo mWebappInfo;
+
     private SameActivityWebappUmaCache mUmaCache;
 
-    private WebApkOfflineDialog mOfflineDialog;
+    private WebApkSplashNetworkErrorObserver mWebApkNetworkErrorObserver;
+
+    private WebApkOfflineDialog mWebApkOfflineDialog;
 
     private static class SingleShotOnDrawListener implements ViewTreeObserver.OnDrawListener {
         private final View mView;
@@ -70,6 +76,7 @@
     @Override
     public void showSplash(ViewGroup parentView, WebappInfo webappInfo) {
         mParentView = parentView;
+        mWebappInfo = webappInfo;
         mIsSplashVisible = true;
 
         Context context = ContextUtils.getApplicationContext();
@@ -102,8 +109,14 @@
     }
 
     @Override
-    public void onNativeLoaded() {
+    public void showSplashWithNative(Tab tab) {
         mNativeLoaded = true;
+        mTab = tab;
+        if (mWebappInfo.isForWebApk()) {
+            mWebApkNetworkErrorObserver =
+                    new WebApkSplashNetworkErrorObserver(this, mWebappInfo.name());
+            mTab.addObserver(mWebApkNetworkErrorObserver);
+        }
         if (mUmaCache != null) mUmaCache.commitMetrics();
     }
 
@@ -116,7 +129,13 @@
             @Override
             public void run() {
                 mParentView.removeView(mSplashScreen);
+                if (mWebApkNetworkErrorObserver != null) {
+                    mTab.removeObserver(mWebApkNetworkErrorObserver);
+                    mWebApkNetworkErrorObserver = null;
+                }
+
                 finishSplashscreenTraceEvents();
+                mTab = null;
                 mSplashScreen = null;
                 finishedHidingCallback.run();
             }
@@ -134,21 +153,21 @@
     }
 
     @Override
-    public boolean isNetworkErrorDialogVisible() {
-        return mOfflineDialog != null && mOfflineDialog.isShowing();
+    public boolean isWebApkNetworkErrorDialogVisible() {
+        return mWebApkOfflineDialog != null && mWebApkOfflineDialog.isShowing();
     }
 
     @Override
-    public void showNetworkErrorDialog(Tab tab, String errorMsg) {
-        mOfflineDialog = new WebApkOfflineDialog();
-        mOfflineDialog.show(tab.getActivity(), errorMsg);
+    public void showWebApkNetworkErrorDialog(String errorMsg) {
+        mWebApkOfflineDialog = new WebApkOfflineDialog();
+        mWebApkOfflineDialog.show(mTab.getActivity(), errorMsg);
     }
 
     @Override
-    public void hideNetworkErrorDialog() {
-        if (mOfflineDialog == null) return;
-        mOfflineDialog.cancel();
-        mOfflineDialog = null;
+    public void hideWebApkNetworkErrorDialog() {
+        if (mWebApkOfflineDialog == null) return;
+        mWebApkOfflineDialog.cancel();
+        mWebApkOfflineDialog = null;
     }
 
     /** Sets the splash screen layout and sets the splash screen's title and icon. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
new file mode 100644
index 0000000..86e28e1
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
@@ -0,0 +1,110 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.webapps;
+
+import android.content.Context;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.metrics.WebApkUma;
+import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.net.NetError;
+import org.chromium.net.NetworkChangeNotifier;
+
+/**
+ * Displays error dialog on top of splash screen if there is a network error while loading the
+ * start URL.
+ */
+public class WebApkSplashNetworkErrorObserver extends EmptyTabObserver {
+    // No error.
+    public static final int ERROR_OK = 0;
+
+    private WebappSplashDelegate mDelegate;
+
+    private String mWebApkName;
+
+    private boolean mDidShowNetworkErrorDialog;
+
+    /** Indicates whether reloading is allowed. */
+    private boolean mAllowReloads;
+
+    public WebApkSplashNetworkErrorObserver(WebappSplashDelegate delegate, String webApkName) {
+        mDelegate = delegate;
+        mWebApkName = webApkName;
+    }
+
+    @Override
+    public void onDidFinishNavigation(final Tab tab, final String url, boolean isInMainFrame,
+            boolean isErrorPage, boolean hasCommitted, boolean isSameDocument,
+            boolean isFragmentNavigation, Integer pageTransition, int errorCode,
+            int httpStatusCode) {
+        if (!isInMainFrame) return;
+
+        switch (errorCode) {
+            case ERROR_OK:
+                mDelegate.hideWebApkNetworkErrorDialog();
+                break;
+            case NetError.ERR_NETWORK_CHANGED:
+                onNetworkChanged(tab);
+                break;
+            default:
+                onNetworkError(tab, errorCode);
+                break;
+        }
+        WebApkUma.recordNetworkErrorWhenLaunch(-errorCode);
+    }
+
+    private void onNetworkChanged(Tab tab) {
+        if (!mAllowReloads) return;
+
+        // It is possible that we get {@link NetError.ERR_NETWORK_CHANGED} during the first
+        // reload after the device is online. The navigation will fail until the next auto
+        // reload fired by {@link NetErrorHelperCore}. We call reload explicitly to reduce the
+        // waiting time.
+        tab.reloadIgnoringCache();
+        mAllowReloads = false;
+    }
+
+    private void onNetworkError(final Tab tab, int errorCode) {
+        if (tab.getActivity() == null) return;
+
+        // Do not show the network error dialog more than once (e.g. if the user backed out of
+        // the dialog).
+        if (mDidShowNetworkErrorDialog) return;
+
+        mDidShowNetworkErrorDialog = true;
+
+        final NetworkChangeNotifier.ConnectionTypeObserver observer =
+                new NetworkChangeNotifier.ConnectionTypeObserver() {
+                    @Override
+                    public void onConnectionTypeChanged(int connectionType) {
+                        if (!NetworkChangeNotifier.isOnline()) return;
+
+                        NetworkChangeNotifier.removeConnectionTypeObserver(this);
+                        tab.reloadIgnoringCache();
+                        // One more reload is allowed after the network connection is back.
+                        mAllowReloads = true;
+                    }
+                };
+
+        NetworkChangeNotifier.addConnectionTypeObserver(observer);
+        mDelegate.showWebApkNetworkErrorDialog(generateNetworkErrorWebApkDialogMessage(errorCode));
+    }
+
+    /** Generates network error dialog message for the given error code. */
+    private String generateNetworkErrorWebApkDialogMessage(int errorCode) {
+        Context context = ContextUtils.getApplicationContext();
+        switch (errorCode) {
+            case NetError.ERR_INTERNET_DISCONNECTED:
+                return context.getString(R.string.webapk_offline_dialog, mWebApkName);
+            case NetError.ERR_TUNNEL_CONNECTION_FAILED:
+                return context.getString(
+                        R.string.webapk_network_error_message_tunnel_connection_failed);
+            default:
+                return context.getString(R.string.webapk_cannot_connect_to_site);
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
index c9be6c4..885b114 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappActivity.java
@@ -293,7 +293,14 @@
         setTitle(mWebappInfo.shortName());
 
         super.preInflationStartup();
-        initializeWebappData();
+
+        if (mWebappInfo.displayMode() == WebDisplayMode.FULLSCREEN) {
+            enterImmersiveMode();
+        }
+        try (TraceEvent te = TraceEvent.scoped("WebappActivity.showSplash")) {
+            ViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);
+            mSplashController.showSplash(contentView, mWebappInfo);
+        }
     }
 
     @Override
@@ -309,7 +316,7 @@
         getToolbarManager().setCloseButtonDrawable(null); // Hides close button.
 
         getFullscreenManager().setTab(getActivityTab());
-        mSplashController.onFinishedNativeInit(getActivityTab(), getCompositorViewHolder());
+        mSplashController.showSplashWithNative(getActivityTab(), getCompositorViewHolder());
         super.finishNativeInitialization();
         mIsInitialized = true;
     }
@@ -552,16 +559,6 @@
         return Holder.sWebappInfoMap.remove(id);
     }
 
-    private void initializeWebappData() {
-        try (TraceEvent te = TraceEvent.scoped("WebappActivity.initializeWebappData")) {
-            if (mWebappInfo.displayMode() == WebDisplayMode.FULLSCREEN) {
-                enterImmersiveMode();
-            }
-            ViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);
-            mSplashController.showSplashScreen(contentView, mWebappInfo);
-        }
-    }
-
     protected void updateStorage(WebappDataStorage storage) {
         // The information in the WebappDataStorage may have been purged by the
         // user clearing their history or not launching the web app recently.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashDelegate.java
index 4d07cf2..6607af1c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashDelegate.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashDelegate.java
@@ -13,11 +13,8 @@
     /** Shows the splash screen. */
     void showSplash(ViewGroup parentView, WebappInfo webappInfo);
 
-    /**
-     * Called once native has been loaded. This may be called either before or after
-     * {@link #showSplash()}.
-     */
-    void onNativeLoaded();
+    /** Called once native has been loaded and after {@link #showSplash()}. */
+    void showSplashWithNative(Tab tab);
 
     /** Hides the splash screen. Runs the callback once the splash screen is hidden. */
     void hideSplash(Runnable finishedHidingCallback);
@@ -31,12 +28,12 @@
      */
     ViewGroup getSplashViewIfChildOf(ViewGroup parent);
 
-    /** Returns whether the network error dialog is visible. */
-    boolean isNetworkErrorDialogVisible();
+    /** Returns whether the WebAPK network error dialog is visible. */
+    boolean isWebApkNetworkErrorDialogVisible();
 
-    /** Shows the network error dialog. */
-    void showNetworkErrorDialog(Tab tab, String errorMsg);
+    /** Shows the WebAPK network error dialog. */
+    void showWebApkNetworkErrorDialog(String errorMsg);
 
-    /** Hides the network error dialog. */
-    void hideNetworkErrorDialog();
+    /** Hides the WebAPK network error dialog. */
+    void hideWebApkNetworkErrorDialog();
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
index 481da38..9d60d4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappSplashScreenController.java
@@ -4,23 +4,17 @@
 
 package org.chromium.chrome.browser.webapps;
 
-import android.content.Context;
 import android.os.SystemClock;
 import android.support.annotation.IntDef;
 import android.view.ViewGroup;
 
-import org.chromium.base.ContextUtils;
 import org.chromium.base.ObserverList;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.R;
 import org.chromium.chrome.browser.WarmupManager;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
-import org.chromium.chrome.browser.metrics.WebApkUma;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.net.NetError;
-import org.chromium.net.NetworkChangeNotifier;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -43,9 +37,6 @@
     public static final String HISTOGRAM_SPLASHSCREEN_DURATION = "Webapp.Splashscreen.Duration";
     public static final String HISTOGRAM_SPLASHSCREEN_HIDES = "Webapp.Splashscreen.Hides";
 
-    // No error.
-    public static final int ERROR_OK = 0;
-
     private WebappSplashDelegate mDelegate;
 
     /** Used to schedule splash screen hiding. */
@@ -54,32 +45,21 @@
     /** View to which the splash screen is added. */
     private ViewGroup mParentView;
 
-    /** Indicates whether reloading is allowed. */
-    private boolean mAllowReloads;
-
-    private String mAppName;
-
-    private boolean mIsForWebApk;
-
-    private boolean mDidShowNetworkErrorDialog;
-
     /** Time that the splash screen was shown. */
     private long mSplashShownTimestamp;
 
     private ObserverList<SplashscreenObserver> mObservers;
 
     public WebappSplashScreenController() {
-        mDelegate = new SameActivityWebappSplashDelegate();
         mObservers = new ObserverList<>();
     }
 
     /** Shows the splash screen. */
-    public void showSplashScreen(ViewGroup parentView, final WebappInfo webappInfo) {
+    public void showSplash(ViewGroup parentView, final WebappInfo webappInfo) {
         mParentView = parentView;
-        mIsForWebApk = webappInfo.isForWebApk();
-        mAppName = webappInfo.name();
-
         mSplashShownTimestamp = SystemClock.elapsedRealtime();
+
+        mDelegate = new SameActivityWebappSplashDelegate();
         mDelegate.showSplash(parentView, webappInfo);
 
         notifySplashscreenVisible(mSplashShownTimestamp);
@@ -97,15 +77,16 @@
         }
     }
 
-    /** Should be called once native has loaded. */
-    public void onFinishedNativeInit(Tab tab, CompositorViewHolder compositorViewHolder) {
+    /** Should be called once native has loaded and after {@link #showSplash()}. */
+    public void showSplashWithNative(Tab tab, CompositorViewHolder compositorViewHolder) {
         mCompositorViewHolder = compositorViewHolder;
         tab.addObserver(this);
-        mDelegate.onNativeLoaded();
+        mDelegate.showSplashWithNative(tab);
     }
 
     @VisibleForTesting
     ViewGroup getSplashScreenForTests() {
+        if (mDelegate == null) return null;
         return mDelegate.getSplashViewIfChildOf(mParentView);
     }
 
@@ -135,80 +116,8 @@
         hideSplash(tab, SplashHidesReason.CRASH);
     }
 
-    @Override
-    public void onDidFinishNavigation(final Tab tab, final String url, boolean isInMainFrame,
-            boolean isErrorPage, boolean hasCommitted, boolean isSameDocument,
-            boolean isFragmentNavigation, Integer pageTransition, int errorCode,
-            int httpStatusCode) {
-        if (!mIsForWebApk || !isInMainFrame) return;
-
-        switch (errorCode) {
-            case ERROR_OK:
-                mDelegate.hideNetworkErrorDialog();
-                break;
-            case NetError.ERR_NETWORK_CHANGED:
-                onNetworkChanged(tab);
-                break;
-            default:
-                onNetworkError(tab, errorCode);
-                break;
-        }
-        WebApkUma.recordNetworkErrorWhenLaunch(-errorCode);
-    }
-
     protected boolean canHideSplashScreen() {
-        return !mDelegate.isNetworkErrorDialogVisible();
-    }
-
-    private void onNetworkChanged(Tab tab) {
-        if (!mAllowReloads) return;
-
-        // It is possible that we get {@link NetError.ERR_NETWORK_CHANGED} during the first
-        // reload after the device is online. The navigation will fail until the next auto
-        // reload fired by {@link NetErrorHelperCore}. We call reload explicitly to reduce the
-        // waiting time.
-        tab.reloadIgnoringCache();
-        mAllowReloads = false;
-    }
-
-    private void onNetworkError(final Tab tab, int errorCode) {
-        if (tab.getActivity() == null) return;
-
-        // Do not show the network error dialog more than once (e.g. if the user backed out of
-        // the dialog).
-        if (mDidShowNetworkErrorDialog) return;
-
-        mDidShowNetworkErrorDialog = true;
-
-        final NetworkChangeNotifier.ConnectionTypeObserver observer =
-                new NetworkChangeNotifier.ConnectionTypeObserver() {
-                    @Override
-                    public void onConnectionTypeChanged(int connectionType) {
-                        if (!NetworkChangeNotifier.isOnline()) return;
-
-                        NetworkChangeNotifier.removeConnectionTypeObserver(this);
-                        tab.reloadIgnoringCache();
-                        // One more reload is allowed after the network connection is back.
-                        mAllowReloads = true;
-                    }
-                };
-
-        NetworkChangeNotifier.addConnectionTypeObserver(observer);
-        mDelegate.showNetworkErrorDialog(tab, generateNetworkErrorWebApkDialogMessage(errorCode));
-    }
-
-    /** Generates network error dialog message for the given error code. */
-    private String generateNetworkErrorWebApkDialogMessage(int errorCode) {
-        Context context = ContextUtils.getApplicationContext();
-        switch (errorCode) {
-            case NetError.ERR_INTERNET_DISCONNECTED:
-                return context.getString(R.string.webapk_offline_dialog, mAppName);
-            case NetError.ERR_TUNNEL_CONNECTION_FAILED:
-                return context.getString(
-                        R.string.webapk_network_error_message_tunnel_connection_failed);
-            default:
-                return context.getString(R.string.webapk_cannot_connect_to_site);
-        }
+        return !mDelegate.isWebApkNetworkErrorDialogVisible();
     }
 
     /** Hides the splash screen. */
@@ -220,6 +129,7 @@
             public void run() {
                 tab.removeObserver(WebappSplashScreenController.this);
                 mCompositorViewHolder = null;
+                mDelegate = null;
 
                 long splashHiddenTimestamp = SystemClock.elapsedRealtime();
                 notifySplashscreenHidden(splashHiddenTimestamp);
@@ -235,7 +145,7 @@
         // Without this callback we were seeing a short flash of white between the splash screen and
         // the web content (crbug.com/734500).
         mCompositorViewHolder.getCompositorView().surfaceRedrawNeededAsync(() -> {
-            if (!mDelegate.isSplashVisible()) return;
+            if (mDelegate != null && !mDelegate.isSplashVisible()) return;
             mDelegate.hideSplash(onHiddenCallback);
         });
     }
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 96ae8d0..f772612f 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1725,6 +1725,7 @@
   "java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkShareTargetUtil.java",
+  "java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateDataFetcher.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java",
   "java/src/org/chromium/chrome/browser/webapps/WebApkUpdateTask.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
index faab185..4970b08 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
@@ -21,6 +21,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -329,6 +330,7 @@
     @Test
     @LargeTest
     @Feature({"Browser", "RenderTest"})
+    @DisabledTest(message = "https://crbug.com/930296")
     public void testOverflowMenuAppears()
             throws InterruptedException, TimeoutException, IOException {
         NativeUiUtils.clickElementAndWaitForUiQuiescence(
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index c091c37..ddaa5464 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-74.0.3699.0_rc-r1.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-74.0.3701.0_rc-r1.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index 2ff64e1..e059398 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -10,7 +10,6 @@
 import("//device/vr/buildflags/buildflags.gni")
 import("//ppapi/buildflags/buildflags.gni")
 import("//printing/buildflags/buildflags.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//tools/grit/grit_rule.gni")
 import("//tools/ipc_fuzzer/ipc_fuzzer.gni")
 
@@ -617,7 +616,7 @@
       "//chromeos/services/secure_channel/public/cpp:manifest",
       "//mash/public/mojom",
       "//services/ws/public/mojom/input_devices",
-      "//ui/accessibility:manifest",
+      "//ui/accessibility:ax_host_manifest",
     ]
   }
 
diff --git a/chrome/app/app_management_strings.grdp b/chrome/app/app_management_strings.grdp
index 70d2c1ec..41b3eeda 100644
--- a/chrome/app/app_management_strings.grdp
+++ b/chrome/app/app_management_strings.grdp
@@ -1,6 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 
 <grit-part>
+  <message name="IDS_APP_MANAGEMENT_ANDROID_SETTINGS" desc="Label for the open Android settings button on the ARC app permissions page.">
+    Open Android settings
+  </message>
   <message name="IDS_APP_MANAGEMENT_APP_LIST_PREVIEW" desc="A label that summarizes a list of apps by naming up to 3 apps, finishing with 'X more apps' for the rest.">
     {COUNT, plural,
      =0 {None}
diff --git a/chrome/app/chrome_packaged_service_manifests.cc b/chrome/app/chrome_packaged_service_manifests.cc
index dbbd02c5..b7b119a 100644
--- a/chrome/app/chrome_packaged_service_manifests.cc
+++ b/chrome/app/chrome_packaged_service_manifests.cc
@@ -32,7 +32,7 @@
 #include "chromeos/services/secure_channel/public/cpp/manifest.h"
 #include "mash/public/mojom/launchable.mojom.h"  // nogncheck
 #include "services/ws/public/mojom/input_devices/input_device_controller.mojom.h"
-#include "ui/accessibility/manifest.h"  // nogncheck
+#include "ui/accessibility/ax_host_manifest.h"  // nogncheck
 #endif
 
 #if defined(OS_MACOSX)
@@ -177,7 +177,7 @@
       GetCupsIppParserManifest(),
       chromeos::ime::GetManifest(),
       chromeos::secure_channel::GetManifest(),
-      ax_host_service::GetManifest(),
+      ui::GetAXHostManifest(),
 #endif
   }};
   return *manifests;
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index 7796250..fb92e82 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -1215,9 +1215,6 @@
   <message name="IDS_LOGIN_NEEDS_DIRCRYPTO_MIGRATION_BANNER" desc="Banner text for users that need to migrate their data to use dircrypto.">
     A critical update is ready to install. Sign in to get started.
   </message>
-  <message name="IDS_LOGIN_NEW_LOCK_SCREEN_NOTE_BUTTON_TITLE" desc="Title for the button on the Chrome OS lock screen that launches an app for taking notes (the action of creating a new note is delegated to the app). The string is primarily intended to be spoken out by accessibility tools - the button is represented by an icon in the lock screen UI.">
-    Create new note
-  </message>
 
   <!-- Network error strings -->
   <message name="IDS_CHROMEOS_NETWORK_ERROR_UNKNOWN" desc="Network error details in notifications: UNKNOWN">
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index a06641d..47e6140 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8793,6 +8793,25 @@
       <ph name="USB_DEVICE_NAME">$1<ex>Nexus 5</ex></ph> detected
     </message>
 
+    <if expr="chromeos">
+      <!-- CrOSUsb Notification -->
+      <message name="IDS_CROSUSB_DEVICE_DETECTED_NOTIFICATION" desc="Content for notification shown to the user when a USB device gets plugged in.">
+        Connect this device to Linux
+      </message>
+      <message name="IDS_CROSUSB_DEVICE_DETECTED_NOTIFICATION_TITLE" desc="Title for notification shown to the user when a USB device gets plugged in.">
+        <ph name="USB_DEVICE_NAME">$1<ex>Nexus 5</ex></ph> detected
+      </message>
+      <message name="IDS_CROSUSB_NOTIFICATION_BUTTON_CONNECT_TO_LINUX" desc="Label for notification button shown to the user when a USB device gets plugged in to allowed Linux to use the device">
+        Connect
+      </message>
+      <message name="IDS_CROSUSB_UNKNOWN_DEVICE_FROM_MANUFACTURER" desc="String describing an unknown device in notification shown when a USB device gets plugged in.">
+        USB device from <ph name="MANUFACTURER_NAME">$1<ex>Google</ex></ph>
+      </message>
+      <message name="IDS_CROSUSB_UNKNOWN_DEVICE" desc="String describing an unknown device in notification shown when a USB device gets plugged in.">
+        USB device
+      </message>
+    </if>
+
     <!-- Audio device strings. -->
     <message name="IDS_DEFAULT_AUDIO_DEVICE_NAME" desc="System default audio device (microphone or loudspeaker). This is typically presented to users in a drop-down list of device choices.">
         Default
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 72fd468..b796f38 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3106,6 +3106,8 @@
       "search/search_suggest/search_suggest_service_factory.cc",
       "search/search_suggest/search_suggest_service_factory.h",
       "search/search_suggest/search_suggest_service_observer.h",
+      "send_tab_to_self/send_tab_to_self_util.cc",
+      "send_tab_to_self/send_tab_to_self_util.h",
       "serial/chrome_serial_delegate.cc",
       "serial/chrome_serial_delegate.h",
       "serial/serial_chooser_context.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 3fd72ca1..c1795082 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -209,9 +209,9 @@
 const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid;
 const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS;
 
-#if defined(USE_AURA)
+#if defined(USE_AURA) || defined(OS_ANDROID)
 const unsigned kOsAura = kOsWin | kOsLinux | kOsCrOS;
-#endif  // USE_AURA
+#endif  // USE_AURA || OS_ANDROID
 
 const FeatureEntry::Choice kTouchEventFeatureDetectionChoices[] = {
     {flags_ui::kGenericExperimentChoiceDisabled, "", ""},
@@ -1385,6 +1385,10 @@
     {"enable-webassembly-baseline", flag_descriptions::kEnableWasmBaselineName,
      flag_descriptions::kEnableWasmBaselineDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebAssemblyBaseline)},
+    {"enable-webassembly-code-cache",
+     flag_descriptions::kEnableWasmCodeCacheName,
+     flag_descriptions::kEnableWasmCodeCacheDescription, kOsAll,
+     FEATURE_VALUE_TYPE(blink::features::kWasmCodeCache)},
     {"enable-webassembly-threads", flag_descriptions::kEnableWasmThreadsName,
      flag_descriptions::kEnableWasmThreadsDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebAssemblyThreads)},
@@ -1654,11 +1658,13 @@
          "1",
          autofill::switches::kWalletServiceUseSandbox,
          "0")},
-#if defined(USE_AURA)
+#if defined(USE_AURA) || defined(OS_ANDROID)
     {"overscroll-history-navigation",
      flag_descriptions::kOverscrollHistoryNavigationName,
-     flag_descriptions::kOverscrollHistoryNavigationDescription, kOsAura,
+     flag_descriptions::kOverscrollHistoryNavigationDescription,
+     kOsAura | kOsAndroid,
      FEATURE_VALUE_TYPE(features::kOverscrollHistoryNavigation)},
+#if !defined(OS_ANDROID)
     {"overscroll-start-threshold",
      flag_descriptions::kOverscrollStartThresholdName,
      flag_descriptions::kOverscrollStartThresholdDescription, kOsAura,
@@ -1666,7 +1672,8 @@
     {"pull-to-refresh", flag_descriptions::kPullToRefreshName,
      flag_descriptions::kPullToRefreshDescription, kOsAura,
      MULTI_VALUE_TYPE(kPullToRefreshChoices)},
-#endif  // USE_AURA
+#endif  // !OS_ANDROID
+#endif  // USE_AURA || OS_ANDROID
     {"enable-touch-drag-drop", flag_descriptions::kTouchDragDropName,
      flag_descriptions::kTouchDragDropDescription, kOsWin | kOsCrOS,
      ENABLE_DISABLE_VALUE_TYPE(switches::kEnableTouchDragDrop,
@@ -2081,6 +2088,10 @@
      flag_descriptions::kDesktopPWAsStayInWindowName,
      flag_descriptions::kDesktopPWAsStayInWindowDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kDesktopPWAsStayInWindow)},
+    {"enable-desktop-pwas-omnibox-install",
+     flag_descriptions::kDesktopPWAsOmniboxInstallName,
+     flag_descriptions::kDesktopPWAsOmniboxInstallDescription, kOsDesktop,
+     FEATURE_VALUE_TYPE(features::kDesktopPWAsOmniboxInstall)},
     {"use-sync-sandbox", flag_descriptions::kSyncSandboxName,
      flag_descriptions::kSyncSandboxDescription, kOsAll,
      SINGLE_VALUE_TYPE_AND_VALUE(
@@ -4075,9 +4086,6 @@
     {"enable-ephemeral-tab", flag_descriptions::kEphemeralTabName,
      flag_descriptions::kEphemeralTabDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(chrome::android::kEphemeralTab)},
-    {"enable-gesture-navigation", flag_descriptions::kGestureNavigationName,
-     flag_descriptions::kGestureNavigationDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(chrome::android::kGestureNavigation)},
     {"safe-browsing-telemetry-for-apk-downloads",
      flag_descriptions::kSafeBrowsingTelemetryForApkDownloadsName,
      flag_descriptions::kSafeBrowsingTelemetryForApkDownloadsDescription,
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index ed6aaea..121ee89 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -73,6 +73,7 @@
     &features::kGenericSensorExtraClasses,
     &features::kIncognitoStrings,
     &features::kMaterialDesignIncognitoNTP,
+    &features::kOverscrollHistoryNavigation,
     &features::kPermissionDelegation,
     &features::kPredictivePrefetchingAllowedOnAllConnectionTypes,
     &features::kServiceWorkerPaymentApps,
@@ -123,7 +124,6 @@
     &kDownloadHomeShowStorageInfo,
     &kEphemeralTab,
     &kExploreSites,
-    &kGestureNavigation,
     &kHandleMediaIntents,
     &kHideUserDataFromIncognitoNotifications,
     &kHomePageButtonForceEnabled,
@@ -331,9 +331,6 @@
 const base::Feature kForegroundNotificationManager{
     "ForegroundNotificationManager", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kGestureNavigation{"GestureNavigation",
-                                       base::FEATURE_DISABLED_BY_DEFAULT};
-
 const base::Feature kHandleMediaIntents{"HandleMediaIntents",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index e527f3d..e19b0130 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -53,7 +53,6 @@
 extern const base::Feature kEphemeralTab;
 extern const base::Feature kExploreSites;
 extern const base::Feature kForegroundNotificationManager;
-extern const base::Feature kGestureNavigation;
 extern const base::Feature kHandleMediaIntents;
 extern const base::Feature kHideUserDataFromIncognitoNotifications;
 extern const base::Feature kHomePageButtonForceEnabled;
diff --git a/chrome/browser/android/foreign_session_helper.cc b/chrome/browser/android/foreign_session_helper.cc
index 1574f204..140e2d0 100644
--- a/chrome/browser/android/foreign_session_helper.cc
+++ b/chrome/browser/android/foreign_session_helper.cc
@@ -19,9 +19,9 @@
 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
-#include "components/browser_sync/profile_sync_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
+#include "components/sync/driver/sync_service.h"
 #include "components/sync_sessions/open_tabs_ui_delegate.h"
 #include "components/sync_sessions/session_sync_service.h"
 #include "content/public/browser/notification_details.h"
@@ -181,13 +181,12 @@
 void ForeignSessionHelper::TriggerSessionSync(
     JNIEnv* env,
     const JavaParamRef<jobject>& obj) {
-  browser_sync::ProfileSyncService* service =
-      ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
+  syncer::SyncService* service =
+      ProfileSyncServiceFactory::GetSyncServiceForProfile(profile_);
   if (!service)
     return;
 
-  const syncer::ModelTypeSet types(syncer::SESSIONS);
-  service->TriggerRefresh(types);
+  service->TriggerRefresh({syncer::SESSIONS});
 }
 
 void ForeignSessionHelper::SetOnForeignSessionCallback(
@@ -309,8 +308,8 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
     jboolean enabled) {
-  browser_sync::ProfileSyncService* service =
-      ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
+  syncer::SyncService* service =
+      ProfileSyncServiceFactory::GetSyncServiceForProfile(profile_);
   if (!service)
     return;
 
diff --git a/chrome/browser/apps/app_service/arc_apps.cc b/chrome/browser/apps/app_service/arc_apps.cc
index 62d2642..7eb9f0eda 100644
--- a/chrome/browser/apps/app_service/arc_apps.cc
+++ b/chrome/browser/apps/app_service/arc_apps.cc
@@ -255,7 +255,21 @@
 }
 
 void ArcApps::Uninstall(const std::string& app_id) {
-  NOTIMPLEMENTED();
+  const std::unique_ptr<ArcAppListPrefs::AppInfo> app_info =
+      prefs_->GetApp(app_id);
+  if (!app_info) {
+    LOG(ERROR) << "Uninstall failed, could not find app with id " << app_id;
+    return;
+  }
+
+  auto* instance = ARC_GET_INSTANCE_FOR_METHOD(prefs_->app_connection_holder(),
+                                               UninstallPackage);
+  if (!instance) {
+    LOG(ERROR) << "Uninstall failed, could not find instance";
+    return;
+  }
+
+  instance->UninstallPackage(app_info->package_name);
 }
 
 void ArcApps::OpenNativeSettings(const std::string& app_id) {
diff --git a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.h b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.h
index 224ea6d5..1cd1fd8 100644
--- a/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.h
+++ b/chrome/browser/apps/platform_apps/api/media_galleries/media_galleries_api.h
@@ -195,7 +195,7 @@
     : public ChromeAsyncExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("mediaGalleries.addGalleryWatch",
-                             MEDIAGALLERIES_ADDGALLERYWATCH);
+                             MEDIAGALLERIES_ADDGALLERYWATCH)
 
  protected:
   ~MediaGalleriesAddGalleryWatchFunction() override;
@@ -212,7 +212,7 @@
     : public ChromeAsyncExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("mediaGalleries.removeGalleryWatch",
-                             MEDIAGALLERIES_REMOVEGALLERYWATCH);
+                             MEDIAGALLERIES_REMOVEGALLERYWATCH)
 
  protected:
   ~MediaGalleriesRemoveGalleryWatchFunction() override;
diff --git a/chrome/browser/apps/platform_apps/api/webstore_widget_private/webstore_widget_private_api.h b/chrome/browser/apps/platform_apps/api/webstore_widget_private/webstore_widget_private_api.h
index 6187b2f2..9d1aa430 100644
--- a/chrome/browser/apps/platform_apps/api/webstore_widget_private/webstore_widget_private_api.h
+++ b/chrome/browser/apps/platform_apps/api/webstore_widget_private/webstore_widget_private_api.h
@@ -20,7 +20,7 @@
   WebstoreWidgetPrivateInstallWebstoreItemFunction();
 
   DECLARE_EXTENSION_FUNCTION("webstoreWidgetPrivate.installWebstoreItem",
-                             WEBSTOREWIDGETPRIVATE_INSTALLWEBSTOREITEM);
+                             WEBSTOREWIDGETPRIVATE_INSTALLWEBSTOREITEM)
 
  protected:
   ~WebstoreWidgetPrivateInstallWebstoreItemFunction() override;
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client_unittest.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client_unittest.cc
index 477659b..e2a6f4f 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client_unittest.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client_unittest.cc
@@ -37,7 +37,7 @@
                         : metrics::OmniboxInputType::URL;
 }
 
-};  // namespace
+}  // namespace
 
 class ChromeAutocompleteProviderClientTest : public testing::Test {
  public:
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index d3a5592e..89e85c5 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -300,7 +300,7 @@
     CustomizableSetUp(
         /* search_url */ "http://defaultturl/{searchTerms}",
         /* suggestions_url */ "http://defaultturl2/{searchTerms}");
-  };
+  }
 };
 
 // InvalidSearchProviderTest --------------------------------------------------
@@ -312,7 +312,7 @@
     CustomizableSetUp(
         /* search_url */ prefix + "{searchTerms}",
         /* suggestions_url */ prefix + "{searchTerms}");
-  };
+  }
 
  protected:
   static const std::string prefix;
diff --git a/chrome/browser/background/background_contents.h b/chrome/browser/background/background_contents.h
index 8c711cd..b5ec608 100644
--- a/chrome/browser/background/background_contents.h
+++ b/chrome/browser/background/background_contents.h
@@ -25,7 +25,7 @@
 
 namespace content {
 class SessionStorageNamespace;
-};
+}
 
 namespace extensions {
 class ExtensionHostDelegate;
diff --git a/chrome/browser/banners/app_banner_metrics.h b/chrome/browser/banners/app_banner_metrics.h
index 63d84ff1..9c76ee68 100644
--- a/chrome/browser/banners/app_banner_metrics.h
+++ b/chrome/browser/banners/app_banner_metrics.h
@@ -94,6 +94,6 @@
 void TrackInstallableStatusCode(InstallableStatusCode code);
 void TrackInstallDisplayMode(blink::WebDisplayMode display);
 
-};  // namespace banners
+}  // namespace banners
 
 #endif  // CHROME_BROWSER_BANNERS_APP_BANNER_METRICS_H_
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index fb8b659..1f52504 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -235,6 +235,8 @@
         <include name="IDR_APP_MANAGEMENT_APP_ITEM_HTML" file="resources\app_management\app_item.html" type="BINDATA" />
         <include name="IDR_APP_MANAGEMENT_APP_ITEM_JS" file="resources\app_management\app_item.js" type="BINDATA" />
         <include name="IDR_APP_MANAGEMENT_APP_JS" file="resources\app_management\app.js" type="BINDATA" />
+        <include name="IDR_APP_MANAGEMENT_ARC_PERMISSION_VIEW_HTML" file="resources\app_management\arc_permission_view.html" type="BINDATA"/>
+        <include name="IDR_APP_MANAGEMENT_ARC_PERMISSION_VIEW_JS" file="resources\app_management\arc_permission_view.js" type="BINDATA"/>
         <include name="IDR_APP_MANAGEMENT_BROWSER_PROXY_HTML" file="resources\app_management\browser_proxy.html" type="BINDATA" />
         <include name="IDR_APP_MANAGEMENT_BROWSER_PROXY_JS" file="resources\app_management\browser_proxy.js" type="BINDATA" />
         <include name="IDR_APP_MANAGEMENT_CHROME_APP_PERMISSION_VIEW_HTML" file="resources\app_management\chrome_app_permission_view.html" type="BINDATA"/>
@@ -363,7 +365,6 @@
             <include name="IDR_MD_HISTORY_HISTORY_LIST_JS" file="resources\history\history_list.js" type="BINDATA" />
             <include name="IDR_MD_HISTORY_HISTORY_TOOLBAR_HTML" file="resources\history\history_toolbar.html" type="BINDATA" />
             <include name="IDR_MD_HISTORY_HISTORY_TOOLBAR_JS" file="resources\history\history_toolbar.js" type="BINDATA" />
-            <include name="IDR_MD_HISTORY_ICONS_HTML" file="resources\history\icons.html" type="BINDATA" />
             <include name="IDR_MD_HISTORY_LAZY_LOAD_HTML" file="resources\history\lazy_load.html" type="BINDATA" />
             <include name="IDR_MD_HISTORY_QUERY_MANAGER_HTML" file="resources\history\query_manager.html" type="BINDATA" />
             <include name="IDR_MD_HISTORY_QUERY_MANAGER_JS" file="resources\history\query_manager.js" type="BINDATA" />
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 50199ca8..b7ad1b98 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1931,6 +1931,8 @@
     "ui/request_pin_view.h",
     "ui/screen_capture_notification_ui_chromeos.cc",
     "ui/screen_capture_notification_ui_chromeos.h",
+    "usb/cros_usb_detector.cc",
+    "usb/cros_usb_detector.h",
     "virtual_machines/virtual_machines_util.cc",
     "virtual_machines/virtual_machines_util.h",
 
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index a051237a..bf2a314 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -101,6 +101,7 @@
 #include "chrome/browser/chromeos/system/input_device_settings.h"
 #include "chrome/browser/chromeos/system/user_removal_manager.h"
 #include "chrome/browser/chromeos/ui/low_disk_notification.h"
+#include "chrome/browser/chromeos/usb/cros_usb_detector.h"
 #include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
@@ -122,6 +123,7 @@
 #include "chromeos/audio/audio_devices_pref_handler_impl.h"
 #include "chromeos/audio/cras_audio_handler.h"
 #include "chromeos/components/drivefs/fake_drivefs_launcher_client.h"
+#include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/cryptohome/async_method_caller.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
@@ -281,7 +283,7 @@
   explicit DBusServices(const content::MainFunctionParams& parameters) {
     bluez::BluezDBusManager::Initialize();
 
-    if (!features::IsMultiProcessMash()) {
+    if (!::features::IsMultiProcessMash()) {
       // In Mash, power policy is sent to powerd by ash.
       PowerPolicyController::Initialize(
           DBusThreadManager::Get()->GetPowerManagerClient());
@@ -393,7 +395,7 @@
     drive_file_stream_service_.reset();
     ProcessDataCollector::Shutdown();
     PowerDataCollector::Shutdown();
-    if (!features::IsMultiProcessMash())
+    if (!::features::IsMultiProcessMash())
       PowerPolicyController::Shutdown();
     device::BluetoothAdapterFactory::Shutdown();
     bluez::BluezDBusManager::Shutdown();
@@ -515,8 +517,7 @@
 ChromeBrowserMainPartsChromeos::ChromeBrowserMainPartsChromeos(
     const content::MainFunctionParams& parameters,
     ChromeFeatureListCreator* chrome_feature_list_creator)
-    : ChromeBrowserMainPartsLinux(parameters,
-                                  chrome_feature_list_creator),
+    : ChromeBrowserMainPartsLinux(parameters, chrome_feature_list_creator),
       is_dbus_initialized_(chrome_feature_list_creator != nullptr) {}
 
 ChromeBrowserMainPartsChromeos::~ChromeBrowserMainPartsChromeos() {
@@ -731,7 +732,7 @@
 
   AccessibilityManager::Initialize();
 
-  if (!features::IsMultiProcessMash()) {
+  if (!::features::IsMultiProcessMash()) {
     // Initialize magnification manager before ash tray is created. And this
     // must be placed after UserManager::SessionStarted();
     // TODO(crbug.com/821551): Mash support.
@@ -995,7 +996,7 @@
   spoken_feedback_event_rewriter_delegate_ =
       std::make_unique<SpokenFeedbackEventRewriterDelegate>();
 
-  if (!features::IsMultiProcessMash()) {
+  if (!::features::IsMultiProcessMash()) {
     // TODO(mash): Support EventRewriterController; see crbug.com/647781
     ash::EventRewriterController* event_rewriter_controller =
         ash::Shell::Get()->event_rewriter_controller();
@@ -1012,12 +1013,12 @@
   shutdown_policy_forwarder_ = std::make_unique<ShutdownPolicyForwarder>();
 
   if (base::FeatureList::IsEnabled(
-          features::kAdaptiveScreenBrightnessLogging)) {
+          ::features::kAdaptiveScreenBrightnessLogging)) {
     adaptive_screen_brightness_manager_ =
         power::ml::AdaptiveScreenBrightnessManager::CreateInstance();
   }
 
-  if (base::FeatureList::IsEnabled(features::kUserActivityEventLogging)) {
+  if (base::FeatureList::IsEnabled(::features::kUserActivityEventLogging)) {
     user_activity_controller_ =
         std::make_unique<power::ml::UserActivityController>();
   }
@@ -1025,6 +1026,13 @@
   auto_screen_brightness_controller_ =
       std::make_unique<power::auto_screen_brightness::Controller>();
 
+  // Enable Chrome OS USB detection only if a USB feature is turned on.
+  // Other USB features should also be checked here when they are added.
+  if (base::FeatureList::IsEnabled(chromeos::features::kCrostiniUsbSupport)) {
+    cros_usb_detector_ = std::make_unique<CrosUsbDetector>();
+    cros_usb_detector_->ConnectToDeviceManager();
+  }
+
   ChromeBrowserMainPartsLinux::PostBrowserStart();
 }
 
@@ -1085,7 +1093,7 @@
   // Detach D-Bus clients before DBusThreadManager is shut down.
   idle_action_warning_observer_.reset();
 
-  if (!features::IsMultiProcessMash())
+  if (!::features::IsMultiProcessMash())
     MagnificationManager::Shutdown();
 
   media::SoundsManager::Shutdown();
@@ -1144,7 +1152,7 @@
   arc_service_launcher_.reset();
 
   // TODO(crbug.com/594887): Mash support.
-  if (!features::IsMultiProcessMash())
+  if (!::features::IsMultiProcessMash())
     AccessibilityManager::Shutdown();
 
   input_method::Shutdown();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index cfb8f69..1a3ae8827 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -34,6 +34,7 @@
 namespace chromeos {
 
 class ArcKioskAppManager;
+class CrosUsbDetector;
 class DemoModeResourcesRemover;
 class DiagnosticsdBridge;
 class DiscoverManager;
@@ -157,6 +158,8 @@
   std::unique_ptr<DiscoverManager> discover_manager_;
   std::unique_ptr<DiagnosticsdBridge> diagnosticsd_bridge_;
 
+  std::unique_ptr<CrosUsbDetector> cros_usb_detector_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos);
 };
 
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index 5074217..1d52617 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -24,7 +24,6 @@
 #include "chrome/browser/chromeos/crostini/crostini_remover.h"
 #include "chrome/browser/chromeos/crostini/crostini_reporting_util.h"
 #include "chrome/browser/chromeos/crostini/crostini_share_path.h"
-#include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/chromeos/file_manager/path_util.h"
 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
@@ -90,8 +89,8 @@
 // Find any callbacks for the specified |vm_name|, invoke them with |result|
 // and erase them from the map.
 void InvokeAndErasePendingCallbacks(
-    std::map<std::pair<std::string, std::string>,
-             CrostiniManager::CrostiniResultCallback>* vm_keyed_map,
+    std::map<ContainerId, CrostiniManager::CrostiniResultCallback>*
+        vm_keyed_map,
     const std::string& vm_name,
     CrostiniResult result) {
   for (auto it = vm_keyed_map->begin(); it != vm_keyed_map->end();) {
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h
index 28001e9..282e232 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.h
+++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -15,6 +15,7 @@
 #include "base/memory/singleton.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/extensions/app_launch_params.h"
@@ -791,37 +792,34 @@
 
   // Pending container started callbacks are keyed by <vm_name, container_name>
   // string pairs.
-  std::multimap<std::pair<std::string, std::string>, StartContainerCallback>
-      start_container_callbacks_;
+  std::multimap<ContainerId, StartContainerCallback> start_container_callbacks_;
 
   // Pending ShutdownContainer callbacks are keyed by <vm_name, container_name>
   // string pairs.
-  std::multimap<std::pair<std::string, std::string>, ShutdownContainerCallback>
+  std::multimap<ContainerId, ShutdownContainerCallback>
       shutdown_container_callbacks_;
 
   // Pending CreateLxdContainer callbacks are keyed by <vm_name, container_name>
   // string pairs. These are used if CreateLxdContainer indicates we need to
   // wait for an LxdContainerCreate signal.
-  std::multimap<std::pair<std::string, std::string>, CrostiniResultCallback>
+  std::multimap<ContainerId, CrostiniResultCallback>
       create_lxd_container_callbacks_;
 
   // Pending StartLxdContainer callbacks are keyed by <vm_name, container_name>
   // string pairs. These are used if StartLxdContainer indicates we need to
   // wait for an LxdContainerStarting signal.
-  std::multimap<std::pair<std::string, std::string>, CrostiniResultCallback>
+  std::multimap<ContainerId, CrostiniResultCallback>
       start_lxd_container_callbacks_;
 
   // Pending ExportLxdContainer callbacks are keyed by <vm_name, container_name>
   // string pairs. They are invoked once ExportLxdContainerProgressSignal signal
   // indicates that export is finished.
-  std::map<std::pair<std::string, std::string>, CrostiniResultCallback>
-      export_lxd_container_callbacks_;
+  std::map<ContainerId, CrostiniResultCallback> export_lxd_container_callbacks_;
 
   // Pending ImportLxdContainer callbacks are keyed by <vm_name, container_name>
   // string pairs. They are invoked once ImportLxdContainerProgressSignal signal
   // indicates that import is finished.
-  std::map<std::pair<std::string, std::string>, CrostiniResultCallback>
-      import_lxd_container_callbacks_;
+  std::map<ContainerId, CrostiniResultCallback> import_lxd_container_callbacks_;
 
   // Callbacks to run after Tremplin is started, keyed by vm_name. These are
   // used if StartTerminaVm completes but we need to wait from Tremplin to
@@ -846,7 +844,7 @@
   // Restarts by <vm_name, container_name>. Only one restarter flow is actually
   // running for a given container, other restarters will just have their
   // callback called when the running restarter completes.
-  std::multimap<std::pair<std::string, std::string>, CrostiniManager::RestartId>
+  std::multimap<ContainerId, CrostiniManager::RestartId>
       restarters_by_container_;
 
   std::map<CrostiniManager::RestartId, scoped_refptr<CrostiniRestarter>>
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.cc b/chrome/browser/chromeos/crostini/crostini_package_service.cc
index 2ee85530..7da84e16 100644
--- a/chrome/browser/chromeos/crostini/crostini_package_service.cc
+++ b/chrome/browser/chromeos/crostini/crostini_package_service.cc
@@ -8,7 +8,6 @@
 #include "base/files/file_path.h"
 #include "base/no_destructor.h"
 #include "base/stl_util.h"
-#include "base/strings/strcat.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager_factory.h"
@@ -153,7 +152,7 @@
     const std::string& container_name,
     const std::string& package_path,
     CrostiniManager::InstallLinuxPackageCallback callback) {
-  const ContainerIdentifier container_id(vm_name, container_name);
+  const ContainerId container_id(vm_name, container_name);
   containers_with_pending_installs_.insert(container_id);
 
   CrostiniManager::GetForProfile(profile_)->InstallLinuxPackage(
@@ -185,7 +184,7 @@
     const std::string& container_name,
     UninstallPackageProgressStatus status,
     int progress_percent) {
-  UpdatePackageOperationStatus(ContainerIdentifier(vm_name, container_name),
+  UpdatePackageOperationStatus(ContainerId(vm_name, container_name),
                                UninstallStatusToOperationStatus(status),
                                progress_percent);
 }
@@ -200,7 +199,7 @@
   const std::string container_name = registration->ContainerName();
   const std::string app_name = registration->Name();
 
-  const ContainerIdentifier container_id(vm_name, container_name);
+  const ContainerId container_id(vm_name, container_name);
   if (ContainerHasRunningOperation(container_id)) {
     CreateQueuedUninstall(container_id, app_id, app_name);
     return;
@@ -214,20 +213,14 @@
   UninstallApplication(*registration, app_id);
 }
 
-std::string CrostiniPackageService::ContainerIdentifierToString(
-    const ContainerIdentifier& container_id) const {
-  return base::StrCat(
-      {"(", container_id.first, ", ", container_id.second, ")"});
-}
-
 bool CrostiniPackageService::ContainerHasRunningOperation(
-    const ContainerIdentifier& container_id) const {
+    const ContainerId& container_id) const {
   return base::ContainsKey(running_notifications_, container_id) ||
          base::ContainsKey(containers_with_pending_installs_, container_id);
 }
 
 void CrostiniPackageService::CreateRunningNotification(
-    const ContainerIdentifier& container_id,
+    const ContainerId& container_id,
     CrostiniPackageNotification::NotificationType notification_type,
     const std::string& app_name) {
   {  // Scope limit for |it|, which will become invalid shortly.
@@ -251,7 +244,7 @@
 }
 
 void CrostiniPackageService::CreateQueuedUninstall(
-    const ContainerIdentifier& container_id,
+    const ContainerId& container_id,
     const std::string& app_id,
     const std::string& app_name) {
   queued_uninstalls_[container_id].emplace(
@@ -264,15 +257,14 @@
 }
 
 void CrostiniPackageService::UpdatePackageOperationStatus(
-    const ContainerIdentifier& container_id,
+    const ContainerId& container_id,
     PackageOperationStatus status,
     int progress_percent) {
   // Update the notification window, if any.
   auto it = running_notifications_.find(container_id);
   DCHECK(it != running_notifications_.end())
-      << ContainerIdentifierToString(container_id)
-      << " has no notification to update";
-  DCHECK(it->second) << ContainerIdentifierToString(container_id)
+      << ContainerIdToString(container_id) << " has no notification to update";
+  DCHECK(it->second) << ContainerIdToString(container_id)
                      << " has null notification pointer";
   it->second->UpdateProgress(status, progress_percent);
 
@@ -307,7 +299,7 @@
     CrostiniManager::InstallLinuxPackageCallback callback,
     CrostiniResult result) {
   std::move(callback).Run(result);
-  const ContainerIdentifier container_id(vm_name, container_name);
+  const ContainerId container_id(vm_name, container_name);
   containers_with_pending_installs_.erase(container_id);
   if (result != CrostiniResult::SUCCESS) {
     // We never show a notification for this failed install, so this is our only
@@ -330,7 +322,7 @@
     const std::string& app_id) {
   const std::string vm_name = registration.VmName();
   const std::string container_name = registration.ContainerName();
-  const ContainerIdentifier container_id(vm_name, container_name);
+  const ContainerId container_id(vm_name, container_name);
 
   // Policies can change under us, and crostini may now be forbidden.
   if (!IsCrostiniUIAllowedForProfile(profile_)) {
@@ -350,7 +342,7 @@
 }
 
 void CrostiniPackageService::OnCrostiniRunningForUninstall(
-    const ContainerIdentifier& container_id,
+    const ContainerId& container_id,
     const std::string& desktop_file_id,
     CrostiniResult result) {
   if (result != CrostiniResult::SUCCESS) {
@@ -369,7 +361,7 @@
 }
 
 void CrostiniPackageService::OnUninstallPackageOwningFile(
-    const ContainerIdentifier& container_id,
+    const ContainerId& container_id,
     CrostiniResult result) {
   if (result != CrostiniResult::SUCCESS) {
     // Let user know the uninstall failed.
@@ -382,7 +374,7 @@
 }
 
 void CrostiniPackageService::StartQueuedUninstall(
-    const ContainerIdentifier& container_id) {
+    const ContainerId& container_id) {
   std::string app_id;
   auto uninstall_queue_iter = queued_uninstalls_.find(container_id);
   if (uninstall_queue_iter == queued_uninstalls_.end()) {
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service.h b/chrome/browser/chromeos/crostini/crostini_package_service.h
index 9ee6b49..8b5271330 100644
--- a/chrome/browser/chromeos/crostini/crostini_package_service.h
+++ b/chrome/browser/chromeos/crostini/crostini_package_service.h
@@ -19,6 +19,7 @@
 #include "chrome/browser/chromeos/crostini/crostini_package_notification.h"
 #include "chrome/browser/chromeos/crostini/crostini_package_operation_status.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace crostini {
@@ -77,19 +78,12 @@
   void QueueUninstallApplication(const std::string& app_id);
 
  private:
-  // A unique identifier for our containers. This is <vm_name, container_name>.
-  using ContainerIdentifier = std::pair<std::string, std::string>;
-
   // The user can request new uninstalls while a different operation is in
   // progress. Rather than sending a request which will fail, just queue the
   // request until the previous one is done.
   struct QueuedUninstall;
 
-  std::string ContainerIdentifierToString(
-      const ContainerIdentifier& container_id) const;
-
-  bool ContainerHasRunningOperation(
-      const ContainerIdentifier& container_id) const;
+  bool ContainerHasRunningOperation(const ContainerId& container_id) const;
 
   // Creates a new notification and adds it to running_notifications_.
   // |app_name| is the name of the application being modified, if any -- for
@@ -98,12 +92,12 @@
   // If there is a running notification, it will be set to error state. Caller
   // should check before calling this if a different behavior is desired.
   void CreateRunningNotification(
-      const ContainerIdentifier& container_id,
+      const ContainerId& container_id,
       CrostiniPackageNotification::NotificationType notification_type,
       const std::string& app_name);
 
   // Creates a new uninstall notification and adds it to queued_uninstalls_.
-  void CreateQueuedUninstall(const ContainerIdentifier& container_id,
+  void CreateQueuedUninstall(const ContainerId& container_id,
                              const std::string& app_id,
                              const std::string& app_name);
 
@@ -111,7 +105,7 @@
   // window's current state and updates containers_with_running_operations_.
   // Note that if status is |SUCCEEDED| or |FAILED|, this may kick off another
   // operation from the queued_uninstalls_ list.
-  void UpdatePackageOperationStatus(const ContainerIdentifier& container_id,
+  void UpdatePackageOperationStatus(const ContainerId& container_id,
                                     PackageOperationStatus status,
                                     int progress_percent);
 
@@ -138,32 +132,32 @@
 
   // Callback when the Crostini container is up and ready to accept messages.
   // Used by the uninstall flow only.
-  void OnCrostiniRunningForUninstall(const ContainerIdentifier& container_id,
+  void OnCrostiniRunningForUninstall(const ContainerId& container_id,
                                      const std::string& desktop_file_id,
                                      CrostiniResult result);
 
   // Callback for CrostiniManager::UninstallPackageOwningFile().
-  void OnUninstallPackageOwningFile(const ContainerIdentifier& container_id,
+  void OnUninstallPackageOwningFile(const ContainerId& container_id,
                                     CrostiniResult result);
 
   // Kick off the next operation in the queue for the given container.
-  void StartQueuedUninstall(const ContainerIdentifier& container_id);
+  void StartQueuedUninstall(const ContainerId& container_id);
 
   std::string GetUniqueNotificationId();
 
   Profile* profile_;
 
   // The notifications in the RUNNING state for each container.
-  std::map<ContainerIdentifier, std::unique_ptr<CrostiniPackageNotification>>
+  std::map<ContainerId, std::unique_ptr<CrostiniPackageNotification>>
       running_notifications_;
 
   // Containers that have an install waiting for its initial response. We don't
   // display notifications for these, but they still need to cause uninstalls
   // to queue.
-  std::set<ContainerIdentifier> containers_with_pending_installs_;
+  std::set<ContainerId> containers_with_pending_installs_;
 
   // Uninstalls we want to run when the current one is done.
-  std::map<ContainerIdentifier, std::queue<QueuedUninstall>> queued_uninstalls_;
+  std::map<ContainerId, std::queue<QueuedUninstall>> queued_uninstalls_;
 
   // Notifications in a finished state (either SUCCEEDED or FAILED). We need
   // to keep notifications around until they are dismissed even if we don't
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc
index ba442527..8db37b44 100644
--- a/chrome/browser/chromeos/crostini/crostini_util.cc
+++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -11,6 +11,7 @@
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "base/task/post_task.h"
 #include "base/timer/timer.h"
@@ -226,6 +227,11 @@
 
 namespace crostini {
 
+std::string ContainerIdToString(const ContainerId& container_id) {
+  return base::StrCat(
+      {"(", container_id.first, ", ", container_id.second, ")"});
+}
+
 bool IsCrostiniAllowedForProfile(Profile* profile) {
   const user_manager::User* user =
       chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
diff --git a/chrome/browser/chromeos/crostini/crostini_util.h b/chrome/browser/chromeos/crostini/crostini_util.h
index 0a00a10..9c72276c 100644
--- a/chrome/browser/chromeos/crostini/crostini_util.h
+++ b/chrome/browser/chromeos/crostini/crostini_util.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_CHROMEOS_CROSTINI_CROSTINI_UTIL_H_
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/callback.h"
@@ -25,6 +26,12 @@
 
 namespace crostini {
 
+// A unique identifier for our containers. This is <vm_name, container_name>.
+using ContainerId = std::pair<std::string, std::string>;
+
+// Return" (<vm_name>, <container_name>)".
+std::string ContainerIdToString(const ContainerId& container_id);
+
 // Returns true if crostini is allowed to run for |profile|.
 // Otherwise, returns false, e.g. if crostini is not available on the device,
 // or it is in the flow to set up managed account creation.
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
index fbd1fdaf..7a7a05ab 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.h
@@ -200,9 +200,8 @@
 class FileManagerPrivateGetDriveConnectionStateFunction
     : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION(
-      "fileManagerPrivate.getDriveConnectionState",
-      FILEMANAGERPRIVATE_GETDRIVECONNECTIONSTATE);
+  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.getDriveConnectionState",
+                             FILEMANAGERPRIVATE_GETDRIVECONNECTIONSTATE)
 
  protected:
   ~FileManagerPrivateGetDriveConnectionStateFunction() override = default;
@@ -233,7 +232,7 @@
     : public LoggedAsyncExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivateInternal.requestDriveShare",
-                             FILEMANAGERPRIVATEINTERNAL_REQUESTDRIVESHARE);
+                             FILEMANAGERPRIVATEINTERNAL_REQUESTDRIVESHARE)
 
  protected:
   ~FileManagerPrivateInternalRequestDriveShareFunction() override = default;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
index d94c6ed..0870410 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.h
@@ -55,7 +55,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.enableExternalFileScheme",
-                             FILEMANAGERPRIVATE_ENABLEEXTERNALFILESCHEME);
+                             FILEMANAGERPRIVATE_ENABLEEXTERNALFILESCHEME)
 
  protected:
   ~FileManagerPrivateEnableExternalFileSchemeFunction() override = default;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
index 59e36d91..d356dca 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h
@@ -114,8 +114,7 @@
 // for all apps. crbug.com/227175.
 class FileManagerPrivateZoomFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.zoom",
-                             FILEMANAGERPRIVATE_ZOOM);
+  DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.zoom", FILEMANAGERPRIVATE_ZOOM)
 
  protected:
   ~FileManagerPrivateZoomFunction() override = default;
@@ -128,7 +127,7 @@
     : public LoggedAsyncExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.requestWebStoreAccessToken",
-                             FILEMANAGERPRIVATE_REQUESTWEBSTOREACCESSTOKEN);
+                             FILEMANAGERPRIVATE_REQUESTWEBSTOREACCESSTOKEN)
 
   FileManagerPrivateRequestWebStoreAccessTokenFunction();
 
@@ -148,7 +147,7 @@
 class FileManagerPrivateGetProfilesFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.getProfiles",
-                             FILEMANAGERPRIVATE_GETPROFILES);
+                             FILEMANAGERPRIVATE_GETPROFILES)
 
  protected:
   ~FileManagerPrivateGetProfilesFunction() override = default;
@@ -162,7 +161,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.openInspector",
-                             FILEMANAGERPRIVATE_OPENINSPECTOR);
+                             FILEMANAGERPRIVATE_OPENINSPECTOR)
 
  protected:
   ~FileManagerPrivateOpenInspectorFunction() override = default;
@@ -175,7 +174,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.openSettingsSubpage",
-                             FILEMANAGERPRIVATE_OPENSETTINGSSUBPAGE);
+                             FILEMANAGERPRIVATE_OPENSETTINGSSUBPAGE)
 
  protected:
   ~FileManagerPrivateOpenSettingsSubpageFunction() override = default;
@@ -470,7 +469,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.detectCharacterEncoding",
-                             FILEMANAGERPRIVATE_DETECTCHARACTERENCODING);
+                             FILEMANAGERPRIVATE_DETECTCHARACTERENCODING)
 
  protected:
   ~FileManagerPrivateDetectCharacterEncodingFunction() override = default;
diff --git a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.h b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.h
index ffc7bd7..6df6964 100644
--- a/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.h
+++ b/chrome/browser/chromeos/extensions/quick_unlock_private/quick_unlock_private_api.h
@@ -46,7 +46,7 @@
       QuickUnlockPrivateGetAuthTokenFunction::TestObserver* observer);
 
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.getAuthToken",
-                             QUICKUNLOCKPRIVATE_GETAUTHTOKEN);
+                             QUICKUNLOCKPRIVATE_GETAUTHTOKEN)
 
  protected:
   ~QuickUnlockPrivateGetAuthTokenFunction() override;
@@ -71,7 +71,7 @@
  public:
   QuickUnlockPrivateSetLockScreenEnabledFunction();
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.setLockScreenEnabled",
-                             QUICKUNLOCKPRIVATE_SETLOCKSCREENENABLED);
+                             QUICKUNLOCKPRIVATE_SETLOCKSCREENENABLED)
 
  protected:
   ~QuickUnlockPrivateSetLockScreenEnabledFunction() override;
@@ -90,7 +90,7 @@
  public:
   QuickUnlockPrivateGetAvailableModesFunction();
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.getAvailableModes",
-                             QUICKUNLOCKPRIVATE_GETAVAILABLEMODES);
+                             QUICKUNLOCKPRIVATE_GETAVAILABLEMODES)
 
  protected:
   ~QuickUnlockPrivateGetAvailableModesFunction() override;
@@ -109,7 +109,7 @@
  public:
   QuickUnlockPrivateGetActiveModesFunction();
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.getActiveModes",
-                             QUICKUNLOCKPRIVATE_GETACTIVEMODES);
+                             QUICKUNLOCKPRIVATE_GETACTIVEMODES)
 
  protected:
   ~QuickUnlockPrivateGetActiveModesFunction() override;
@@ -131,7 +131,7 @@
  public:
   QuickUnlockPrivateCheckCredentialFunction();
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.checkCredential",
-                             QUICKUNLOCKPRIVATE_CHECKCREDENTIAL);
+                             QUICKUNLOCKPRIVATE_CHECKCREDENTIAL)
 
  protected:
   ~QuickUnlockPrivateCheckCredentialFunction() override;
@@ -148,7 +148,7 @@
  public:
   QuickUnlockPrivateGetCredentialRequirementsFunction();
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.getCredentialRequirements",
-                             QUICKUNLOCKPRIVATE_GETCREDENTIALREQUIREMENTS);
+                             QUICKUNLOCKPRIVATE_GETCREDENTIALREQUIREMENTS)
 
  protected:
   ~QuickUnlockPrivateGetCredentialRequirementsFunction() override;
@@ -176,7 +176,7 @@
       const ModesChangedEventHandler& handler);
 
   DECLARE_EXTENSION_FUNCTION("quickUnlockPrivate.setModes",
-                             QUICKUNLOCKPRIVATE_SETMODES);
+                             QUICKUNLOCKPRIVATE_SETMODES)
 
  protected:
   ~QuickUnlockPrivateSetModesFunction() override;
diff --git a/chrome/browser/chromeos/extensions/users_private/users_private_api.h b/chrome/browser/chromeos/extensions/users_private/users_private_api.h
index 9dbe4770..c38bf86 100644
--- a/chrome/browser/chromeos/extensions/users_private/users_private_api.h
+++ b/chrome/browser/chromeos/extensions/users_private/users_private_api.h
@@ -20,7 +20,7 @@
  public:
   UsersPrivateGetWhitelistedUsersFunction();
   DECLARE_EXTENSION_FUNCTION("usersPrivate.getWhitelistedUsers",
-                             USERSPRIVATE_GETWHITELISTEDUSERS);
+                             USERSPRIVATE_GETWHITELISTEDUSERS)
 
  protected:
   ~UsersPrivateGetWhitelistedUsersFunction() override;
@@ -40,7 +40,7 @@
  public:
   UsersPrivateAddWhitelistedUserFunction();
   DECLARE_EXTENSION_FUNCTION("usersPrivate.addWhitelistedUser",
-                             USERSPRIVATE_ADDWHITELISTEDUSER);
+                             USERSPRIVATE_ADDWHITELISTEDUSER)
 
  protected:
   ~UsersPrivateAddWhitelistedUserFunction() override;
@@ -60,7 +60,7 @@
  public:
   UsersPrivateRemoveWhitelistedUserFunction();
   DECLARE_EXTENSION_FUNCTION("usersPrivate.removeWhitelistedUser",
-                             USERSPRIVATE_REMOVEWHITELISTEDUSER);
+                             USERSPRIVATE_REMOVEWHITELISTEDUSER)
 
  protected:
   ~UsersPrivateRemoveWhitelistedUserFunction() override;
@@ -80,7 +80,7 @@
  public:
   UsersPrivateIsWhitelistManagedFunction();
   DECLARE_EXTENSION_FUNCTION("usersPrivate.isWhitelistManaged",
-                             USERSPRIVATE_ISWHITELISTMANAGED);
+                             USERSPRIVATE_ISWHITELISTMANAGED)
 
  protected:
   ~UsersPrivateIsWhitelistManagedFunction() override;
@@ -97,7 +97,7 @@
  public:
   UsersPrivateGetCurrentUserFunction();
   DECLARE_EXTENSION_FUNCTION("usersPrivate.getCurrentUser",
-                             USERSPRIVATE_GETCURRENTUSER);
+                             USERSPRIVATE_GETCURRENTUSER)
 
  protected:
   ~UsersPrivateGetCurrentUserFunction() override;
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index 51a4c94b..f56ec2690 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -245,6 +245,7 @@
         TestCase("fileDisplayMtp"),
         TestCase("fileDisplayUsb"),
         TestCase("fileDisplayUsbPartition"),
+        TestCase("fileDisplayPartitionFileTable"),
         TestCase("fileSearch"),
         TestCase("fileSearch").EnableMyFilesVolume(),
         TestCase("fileDisplayWithoutDownloadsVolume").DontMountVolumes(),
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc
index 151b4344..922037b 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc
@@ -444,6 +444,9 @@
   volume->is_read_only_ = read_only;
   volume->volume_id_ = GenerateVolumeId(*volume);
   volume->drive_label_ = drive_label;
+  if (volume_type == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) {
+    volume->file_system_type_ = "ext4";
+  }
   return volume;
 }
 
diff --git a/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.cc b/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.cc
index a4bd201e..51c7b9b 100644
--- a/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.cc
+++ b/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.cc
@@ -5,9 +5,13 @@
 #include "chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h"
 
 #include <utility>
+#include <vector>
 
 #include "base/bind.h"
 #include "base/strings/string_util.h"
+#include "base/task/post_task.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "content/public/browser/browser_task_traits.h"
 #include "net/dns/mdns_client.h"
 #include "net/dns/public/dns_protocol.h"
 #include "net/dns/record_rdata.h"
@@ -42,24 +46,134 @@
   return raw_hostname.substr(0, ending_pos);
 }
 
-MDnsHostLocator::MDnsHostLocator() = default;
-MDnsHostLocator::~MDnsHostLocator() = default;
+class MDnsHostLocator::Impl {
+ public:
+  explicit Impl(scoped_refptr<base::SingleThreadTaskRunner> task_runner)
+      : task_runner_(task_runner) {
+    // This object is created on the UI thread, so detach the sequence checker
+    // and let it re-attach the first time we are run on the IO thread.
+    DETACH_FROM_SEQUENCE(sequence_checker_);
+  }
 
-bool MDnsHostLocator::StartListening() {
-  DCHECK(!running_);
+  ~Impl() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
 
-  running_ = true;
-  socket_factory_ = net::MDnsSocketFactory::CreateDefault();
-  mdns_client_ = net::MDnsClient::CreateDefault();
-  return mdns_client_->StartListening(socket_factory_.get());
+  void FindHosts(FindHostsCallback callback);
+
+ private:
+  // Start running the mDNS query on the IO thread.
+  void FindHostsOnIOThread();
+
+  // Makes the MDnsClient start listening on port 5353 on each network
+  // interface.
+  bool StartListening();
+
+  // Creates a PTR transaction and finds all SMB services in the network.
+  bool CreatePtrTransaction();
+
+  // Creates an SRV transaction, which returns the hostname of |service|.
+  void CreateSrvTransaction(const std::string& service);
+
+  // Creates an A transaction, which returns the address of |raw_hostname|.
+  void CreateATransaction(const std::string& raw_hostname);
+
+  // Handler for the PTR transaction request. Returns true if the transaction
+  // successfully starts.
+  void OnPtrTransactionResponse(net::MDnsTransaction::Result result,
+                                const net::RecordParsed* record);
+
+  // Handler for the SRV transaction request.
+  void OnSrvTransactionResponse(net::MDnsTransaction::Result result,
+                                const net::RecordParsed* record);
+
+  // Handler for the A transaction request.
+  void OnATransactionResponse(const std::string& raw_hostname,
+                              net::MDnsTransaction::Result result,
+                              const net::RecordParsed* record);
+
+  // Resolves services that were found through a PTR transaction request. If
+  // there are no more services to be processed, this will call the
+  // FindHostsCallback with the hosts found.
+  void ResolveServicesFound();
+
+  // Fires the callback if there are no more transactions left.
+  void FireCallbackIfFinished();
+
+  // Fires the callback immediately. If |success| is true, return with the hosts
+  // that were found.
+  void FireCallback(bool success);
+
+ private:
+  // IO thread task runner.
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+
+  uint32_t remaining_transactions_ = 0;
+  std::vector<std::string> services_;
+  HostMap results_;
+  FindHostsCallback callback_;
+
+  // Network stack mDNS client.
+  std::unique_ptr<net::MDnsSocketFactory> socket_factory_;
+  std::unique_ptr<net::MDnsClient> mdns_client_;
+  std::vector<std::unique_ptr<net::MDnsTransaction>> transactions_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  DISALLOW_COPY_AND_ASSIGN(Impl);
+};
+
+MDnsHostLocator::MDnsHostLocator()
+    : io_task_runner_(base::CreateSingleThreadTaskRunnerWithTraits(
+          {content::BrowserThread::IO})),
+      impl_(nullptr, base::OnTaskRunnerDeleter(io_task_runner_)),
+      weak_factory_(this) {}
+
+MDnsHostLocator::~MDnsHostLocator() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
 void MDnsHostLocator::FindHosts(FindHostsCallback callback) {
-  if (running_) {
-    Reset();
-  }
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // Reset any existing query.
+  weak_factory_.InvalidateWeakPtrs();
+  impl_.reset(new Impl(io_task_runner_));
 
   callback_ = std::move(callback);
+  impl_->FindHosts(base::BindOnce(
+      &MDnsHostLocator::PostFindHostsDone, base::ThreadTaskRunnerHandle::Get(),
+      base::BindOnce(&MDnsHostLocator::OnFindHostsDone,
+                     weak_factory_.GetWeakPtr())));
+}
+
+// static
+void MDnsHostLocator::PostFindHostsDone(
+    scoped_refptr<base::TaskRunner> task_runner,
+    FindHostsCallback callback,
+    bool success,
+    const HostMap& hosts) {
+  task_runner->PostTask(FROM_HERE,
+                        base::BindOnce(std::move(callback), success, hosts));
+}
+
+void MDnsHostLocator::OnFindHostsDone(bool success, const HostMap& hosts) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  weak_factory_.InvalidateWeakPtrs();
+  impl_.reset();
+
+  std::move(callback_).Run(success, hosts);
+}
+
+void MDnsHostLocator::Impl::FindHosts(FindHostsCallback callback) {
+  DCHECK(callback_.is_null());
+  callback_ = std::move(callback);
+  task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&MDnsHostLocator::Impl::FindHostsOnIOThread,
+                                base::Unretained(this)));
+}
+
+void MDnsHostLocator::Impl::FindHostsOnIOThread() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!(StartListening() && CreatePtrTransaction())) {
     LOG(ERROR) << "Failed to start MDnsHostLocator";
@@ -69,11 +183,23 @@
   }
 }
 
-bool MDnsHostLocator::CreatePtrTransaction() {
+bool MDnsHostLocator::Impl::StartListening() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  socket_factory_ = net::MDnsSocketFactory::CreateDefault();
+  mdns_client_ = net::MDnsClient::CreateDefault();
+  return mdns_client_->StartListening(socket_factory_.get());
+}
+
+bool MDnsHostLocator::Impl::CreatePtrTransaction() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   std::unique_ptr<MDnsTransaction> transaction =
-      mdns_client_->CreateTransaction(net::dns_protocol::kTypePTR,
-                                      kSmbMDnsServiceName, kPtrTransactionFlags,
-                                      GetPtrTransactionHandler());
+      mdns_client_->CreateTransaction(
+          net::dns_protocol::kTypePTR, kSmbMDnsServiceName,
+          kPtrTransactionFlags,
+          base::BindRepeating(&MDnsHostLocator::Impl::OnPtrTransactionResponse,
+                              base::Unretained(this)));
 
   if (!transaction->Start()) {
     LOG(ERROR) << "Failed to start PTR transaction";
@@ -84,11 +210,14 @@
   return true;
 }
 
-void MDnsHostLocator::CreateSrvTransaction(const std::string& service) {
+void MDnsHostLocator::Impl::CreateSrvTransaction(const std::string& service) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   std::unique_ptr<MDnsTransaction> transaction =
-      mdns_client_->CreateTransaction(net::dns_protocol::kTypeSRV, service,
-                                      kSrvTransactionFlags,
-                                      GetSrvTransactionHandler());
+      mdns_client_->CreateTransaction(
+          net::dns_protocol::kTypeSRV, service, kSrvTransactionFlags,
+          base::BindRepeating(&MDnsHostLocator::Impl::OnSrvTransactionResponse,
+                              base::Unretained(this)));
 
   if (!transaction->Start()) {
     // If the transaction fails to start, fire the callback if there are no more
@@ -102,11 +231,15 @@
   transactions_.push_back(std::move(transaction));
 }
 
-void MDnsHostLocator::CreateATransaction(const std::string& raw_hostname) {
+void MDnsHostLocator::Impl::CreateATransaction(
+    const std::string& raw_hostname) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   std::unique_ptr<MDnsTransaction> transaction =
-      mdns_client_->CreateTransaction(net::dns_protocol::kTypeA, raw_hostname,
-                                      kATransactionFlags,
-                                      GetATransactionHandler(raw_hostname));
+      mdns_client_->CreateTransaction(
+          net::dns_protocol::kTypeA, raw_hostname, kATransactionFlags,
+          base::BindRepeating(&MDnsHostLocator::Impl::OnATransactionResponse,
+                              base::Unretained(this), raw_hostname));
 
   if (!transaction->Start()) {
     // If the transaction fails to start, fire the callback if there are no more
@@ -120,9 +253,11 @@
   transactions_.push_back(std::move(transaction));
 }
 
-void MDnsHostLocator::OnPtrTransactionResponse(
+void MDnsHostLocator::Impl::OnPtrTransactionResponse(
     MDnsTransaction::Result result,
     const net::RecordParsed* record) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   if (result == MDnsTransaction::Result::RESULT_RECORD) {
     DCHECK(record);
 
@@ -140,9 +275,11 @@
   }
 }
 
-void MDnsHostLocator::OnSrvTransactionResponse(
+void MDnsHostLocator::Impl::OnSrvTransactionResponse(
     MDnsTransaction::Result result,
     const net::RecordParsed* record) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   if (result != MDnsTransaction::Result::RESULT_RECORD) {
     // SRV transaction wasn't able to get a hostname. Fire the callback if there
     // are no more transactions.
@@ -157,9 +294,12 @@
   CreateATransaction(srv->target());
 }
 
-void MDnsHostLocator::OnATransactionResponse(const std::string& raw_hostname,
-                                             MDnsTransaction::Result result,
-                                             const net::RecordParsed* record) {
+void MDnsHostLocator::Impl::OnATransactionResponse(
+    const std::string& raw_hostname,
+    MDnsTransaction::Result result,
+    const net::RecordParsed* record) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   if (result == MDnsTransaction::Result::RESULT_RECORD) {
     DCHECK(record);
 
@@ -174,7 +314,9 @@
   FireCallbackIfFinished();
 }
 
-void MDnsHostLocator::ResolveServicesFound() {
+void MDnsHostLocator::Impl::ResolveServicesFound() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   if (services_.empty()) {
     // Call the callback immediately.
     FireCallback(true /* success */);
@@ -185,43 +327,22 @@
   }
 }
 
-void MDnsHostLocator::FireCallbackIfFinished() {
-  DCHECK_GT(remaining_transactions_, 0u);
+void MDnsHostLocator::Impl::FireCallbackIfFinished() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
+  DCHECK_GT(remaining_transactions_, 0u);
   if (--remaining_transactions_ == 0) {
     FireCallback(true /* success */);
   }
 }
 
-void MDnsHostLocator::FireCallback(bool success) {
+void MDnsHostLocator::Impl::FireCallback(bool success) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
   // DCHECK to ensure that remaining_transactions_ is at 0 if success is true.
   DCHECK(!success || (remaining_transactions_ == 0));
 
-  std::move(callback_).Run(success, results_);
-  Reset();
-}
-
-void MDnsHostLocator::Reset() {
-  services_.clear();
-  transactions_.clear();
-  results_.clear();
-  running_ = false;
-}
-
-MDnsTransaction::ResultCallback MDnsHostLocator::GetPtrTransactionHandler() {
-  return base::BindRepeating(&MDnsHostLocator::OnPtrTransactionResponse,
-                             AsWeakPtr());
-}
-
-MDnsTransaction::ResultCallback MDnsHostLocator::GetSrvTransactionHandler() {
-  return base::BindRepeating(&MDnsHostLocator::OnSrvTransactionResponse,
-                             AsWeakPtr());
-}
-
-MDnsTransaction::ResultCallback MDnsHostLocator::GetATransactionHandler(
-    const std::string& raw_hostname) {
-  return base::BindRepeating(&MDnsHostLocator::OnATransactionResponse,
-                             AsWeakPtr(), raw_hostname);
+  std::move(callback_).Run(success, std::move(results_));
 }
 
 }  // namespace smb_client
diff --git a/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h b/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h
index a8822709..41af1a3d 100644
--- a/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h
+++ b/chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h
@@ -5,14 +5,15 @@
 #ifndef CHROME_BROWSER_CHROMEOS_SMB_CLIENT_DISCOVERY_MDNS_HOST_LOCATOR_H_
 #define CHROME_BROWSER_CHROMEOS_SMB_CLIENT_DISCOVERY_MDNS_HOST_LOCATOR_H_
 
-#include <map>
 #include <memory>
 #include <string>
 
 #include "base/macros.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/sequence_checker.h"
+#include "base/single_thread_task_runner.h"
 #include "chrome/browser/chromeos/smb_client/discovery/host_locator.h"
-#include "net/dns/mdns_client.h"
 
 namespace chromeos {
 namespace smb_client {
@@ -22,8 +23,7 @@
 Hostname RemoveLocal(const std::string& raw_hostname);
 
 // HostLocator implementation that uses mDns to locate hosts.
-class MDnsHostLocator : public HostLocator,
-                        public base::SupportsWeakPtr<MDnsHostLocator> {
+class MDnsHostLocator : public HostLocator {
  public:
   MDnsHostLocator();
   ~MDnsHostLocator() override;
@@ -32,67 +32,29 @@
   void FindHosts(FindHostsCallback callback) override;
 
  private:
-  // Makes the MDnsClient start listening on port 5353 on each network
-  // interface.
-  bool StartListening();
+  // Implementation class, that needs to live on the IO thread.
+  class Impl;
 
-  // Creates a PTR transaction and finds all SMB services in the network.
-  bool CreatePtrTransaction();
+  // Helper to post OnFindHostsDone() to the FindHosts() caller thread.
+  static void PostFindHostsDone(scoped_refptr<base::TaskRunner> task_runner,
+                                FindHostsCallback callback,
+                                bool success,
+                                const HostMap& hosts);
 
-  // Creates an SRV transaction, which returns the hostname of |service|.
-  void CreateSrvTransaction(const std::string& service);
+  // Result callback for Impl::FindHosts().
+  void OnFindHostsDone(bool success, const HostMap& hosts);
 
-  // Creates an A transaction, which returns the address of |raw_hostname|.
-  void CreateATransaction(const std::string& raw_hostname);
+  // IO thread task runner.
+  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
 
-  // Handler for the PTR transaction request. Returns true if the transaction
-  // successfully starts.
-  void OnPtrTransactionResponse(net::MDnsTransaction::Result result,
-                                const net::RecordParsed* record);
+  // Implementation that performs the actual mDNS query.
+  std::unique_ptr<Impl, base::OnTaskRunnerDeleter> impl_;
 
-  // Handler for the SRV transaction request.
-  void OnSrvTransactionResponse(net::MDnsTransaction::Result result,
-                                const net::RecordParsed* record);
-
-  // Handler for the A transaction request.
-  void OnATransactionResponse(const std::string& raw_hostname,
-                              net::MDnsTransaction::Result result,
-                              const net::RecordParsed* record);
-
-  // Resolves services that were found through a PTR transaction request. If
-  // there are no more services to be processed, this will call the
-  // FindHostsCallback with the hosts found.
-  void ResolveServicesFound();
-
-  // Fires the callback if there are no more transactions left.
-  void FireCallbackIfFinished();
-
-  // Fires the callback immediately. If |success| is true, return with the hosts
-  // that were found.
-  void FireCallback(bool success);
-
-  // Resets the state of the MDnsClient and resets all members to default.
-  void Reset();
-
-  // Returns the handler for the PTR transaction response.
-  net::MDnsTransaction::ResultCallback GetPtrTransactionHandler();
-
-  // Returns the handler for the SRV transaction response.
-  net::MDnsTransaction::ResultCallback GetSrvTransactionHandler();
-
-  // Returns the handler for the A transaction response.
-  net::MDnsTransaction::ResultCallback GetATransactionHandler(
-      const std::string& raw_hostname);
-
-  bool running_ = false;
-  uint32_t remaining_transactions_ = 0;
   FindHostsCallback callback_;
-  std::vector<std::string> services_;
-  HostMap results_;
+  SEQUENCE_CHECKER(sequence_checker_);
 
-  std::unique_ptr<net::MDnsSocketFactory> socket_factory_;
-  std::unique_ptr<net::MDnsClient> mdns_client_;
-  std::vector<std::unique_ptr<net::MDnsTransaction>> transactions_;
+  // Must be last member.
+  base::WeakPtrFactory<MDnsHostLocator> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(MDnsHostLocator);
 };
diff --git a/chrome/browser/chromeos/smb_client/smb_service.cc b/chrome/browser/chromeos/smb_client/smb_service.cc
index 82bdedab..027810ac 100644
--- a/chrome/browser/chromeos/smb_client/smb_service.cc
+++ b/chrome/browser/chromeos/smb_client/smb_service.cc
@@ -261,10 +261,10 @@
 
   // If using kerberos, the hostname should not be resolved since kerberos
   // service tickets are keyed on hosname.
-  const base::FilePath mount_path =
-      use_chromad_kerberos
-          ? base::FilePath(parsed_url.ToString())
-          : base::FilePath(share_finder_->GetResolvedUrl(parsed_url));
+  const std::string url = use_chromad_kerberos
+                              ? parsed_url.ToString()
+                              : share_finder_->GetResolvedUrl(parsed_url);
+  const base::FilePath mount_path(url);
 
   GetSmbProviderClient()->Mount(
       mount_path, IsNTLMAuthenticationEnabled(), workgroup, username,
diff --git a/chrome/browser/chromeos/smb_client/smb_share_finder.cc b/chrome/browser/chromeos/smb_client/smb_share_finder.cc
index 13fb2b6..8599b82 100644
--- a/chrome/browser/chromeos/smb_client/smb_share_finder.cc
+++ b/chrome/browser/chromeos/smb_client/smb_share_finder.cc
@@ -52,13 +52,21 @@
   DCHECK(url.IsValid());
 
   const std::string ip_address = scanner_.ResolveHost(url.GetHost());
-  if (ip_address.empty()) {
+  // Return the original URL if the resolved host cannot be found or if there is
+  // no change in the resolved IP address.
+  if (ip_address.empty() || ip_address == url.GetHost()) {
     return url.ToString();
   }
 
   return url.ReplaceHost(ip_address);
 }
 
+bool SmbShareFinder::TryResolveUrl(const SmbUrl& url,
+                                   std::string* updated_url) const {
+  *updated_url = GetResolvedUrl(url);
+  return *updated_url != url.ToString();
+}
+
 void SmbShareFinder::OnHostsDiscovered(HostDiscoveryResponse discovery_callback,
                                        bool success,
                                        const HostMap& hosts) {
diff --git a/chrome/browser/chromeos/smb_client/smb_share_finder.h b/chrome/browser/chromeos/smb_client/smb_share_finder.h
index b791ffb..fed1b122 100644
--- a/chrome/browser/chromeos/smb_client/smb_share_finder.h
+++ b/chrome/browser/chromeos/smb_client/smb_share_finder.h
@@ -58,6 +58,11 @@
   // otherwise returns ToString of |url|.
   std::string GetResolvedUrl(const SmbUrl& url) const;
 
+  // Attempts to resolve |url|. If able to resolve |url|, returns true and sets
+  // |resolved_url| the the resolved url. If unable, returns false and sets
+  // |resolved_url| to ToString of |url|.
+  bool TryResolveUrl(const SmbUrl& url, std::string* updated_url) const;
+
  private:
   // Handles the response from discovering hosts in the network.
   void OnHostsDiscovered(HostDiscoveryResponse discovery_callback,
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector.cc b/chrome/browser/chromeos/usb/cros_usb_detector.cc
new file mode 100644
index 0000000..19c2025
--- /dev/null
+++ b/chrome/browser/chromeos/usb/cros_usb_detector.cc
@@ -0,0 +1,235 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/usb/cros_usb_detector.h"
+
+#include <string>
+#include <utility>
+
+#include "base/metrics/histogram_macros.h"
+#include "chrome/browser/notifications/system_notification_helper.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/common/service_manager_connection.h"
+#include "device/usb/public/cpp/usb_utils.h"
+#include "services/device/public/mojom/constants.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace chromeos {
+
+namespace {
+
+const char kNotifierUsb[] = "crosusb.connected";
+
+void RecordNotificationClosure(CrosUsbNotificationClosed disposition) {
+  UMA_HISTOGRAM_ENUMERATION("CrosUsb.NotificationClosed", disposition);
+}
+
+// Delegate for CrOSUsb notification
+class UsbNotificationDelegate : public message_center::NotificationDelegate {
+ public:
+  explicit UsbNotificationDelegate(const std::string& notification_id,
+                                   const std::string& device_id)
+      : notification_id_(notification_id),
+        device_id_(device_id),
+        disposition_(CrosUsbNotificationClosed::kUnknown) {}
+
+  void Click(const base::Optional<int>& button_index,
+             const base::Optional<base::string16>& reply) override {
+    disposition_ = CrosUsbNotificationClosed::kConnectToLinux;
+    // TODO(jopra): add device_id_ to shared USBs list (instead of opening
+    // settings page)
+    chrome::ShowSettingsSubPageForProfile(
+        ProfileManager::GetActiveUserProfile(),
+        chrome::kCrostiniSharedUsbDevicesSubPage);
+    Close(false);
+  }
+
+  void Close(bool by_user) override {
+    if (by_user)
+      disposition_ = chromeos::CrosUsbNotificationClosed::kByUser;
+    RecordNotificationClosure(disposition_);
+  }
+
+ private:
+  ~UsbNotificationDelegate() override = default;
+
+  std::string notification_id_;
+  std::string device_id_;
+  CrosUsbNotificationClosed disposition_;
+
+  DISALLOW_COPY_AND_ASSIGN(UsbNotificationDelegate);
+};
+
+// List of class codes to handle / not handle.
+// See https://www.usb.org/defined-class-codes for more information.
+enum UsbClassCode : uint8_t {
+  USB_CLASS_PER_INTERFACE = 0x00,
+  USB_CLASS_AUDIO = 0x01,
+  USB_CLASS_COMM = 0x02,
+  USB_CLASS_HID = 0x03,
+  USB_CLASS_PHYSICAL = 0x05,
+  USB_CLASS_STILL_IMAGE = 0x06,
+  USB_CLASS_PRINTER = 0x07,
+  USB_CLASS_MASS_STORAGE = 0x08,
+  USB_CLASS_HUB = 0x09,
+  USB_CLASS_CDC_DATA = 0x0a,
+  USB_CLASS_CSCID = 0x0b,
+  USB_CLASS_CONTENT_SEC = 0x0d,
+  USB_CLASS_VIDEO = 0x0e,
+  USB_CLASS_PERSONAL_HEALTHCARE = 0x0f,
+  USB_CLASS_BILLBOARD = 0x11,
+  USB_CLASS_DIAGNOSTIC_DEVICE = 0xdc,
+  USB_CLASS_WIRELESS_CONTROLLER = 0xe0,
+  USB_CLASS_MISC = 0xef,
+  USB_CLASS_APP_SPEC = 0xfe,
+  USB_CLASS_VENDOR_SPEC = 0xff,
+};
+
+device::mojom::UsbDeviceFilterPtr UsbFilterByClassCode(
+    UsbClassCode device_class) {
+  auto filter = device::mojom::UsbDeviceFilter::New();
+  filter->has_class_code = true;
+  filter->class_code = device_class;
+  return filter;
+}
+
+void ShowNotificationForDevice(device::mojom::UsbDeviceInfoPtr device_info) {
+  base::string16 product_name =
+      l10n_util::GetStringUTF16(IDS_CROSUSB_UNKNOWN_DEVICE);
+  if (device_info->product_name.has_value() &&
+      !device_info->product_name->empty()) {
+    product_name = device_info->product_name.value();
+  } else if (device_info->manufacturer_name.has_value() &&
+             !device_info->manufacturer_name->empty()) {
+    product_name =
+        l10n_util::GetStringFUTF16(IDS_CROSUSB_UNKNOWN_DEVICE_FROM_MANUFACTURER,
+                                   device_info->manufacturer_name.value());
+  }
+
+  message_center::RichNotificationData rich_notification_data;
+  rich_notification_data.buttons.emplace_back(
+      message_center::ButtonInfo(l10n_util::GetStringUTF16(
+          IDS_CROSUSB_NOTIFICATION_BUTTON_CONNECT_TO_LINUX)));
+
+  std::string notification_id =
+      CrosUsbDetector::MakeNotificationId(device_info->guid);
+  message_center::Notification notification(
+      message_center::NOTIFICATION_TYPE_MULTIPLE, notification_id,
+      l10n_util::GetStringFUTF16(IDS_CROSUSB_DEVICE_DETECTED_NOTIFICATION_TITLE,
+                                 product_name),
+      l10n_util::GetStringUTF16(IDS_CROSUSB_DEVICE_DETECTED_NOTIFICATION),
+      gfx::Image(), base::string16(), GURL(),
+      message_center::NotifierId(message_center::NotifierType::SYSTEM_COMPONENT,
+                                 kNotifierUsb),
+      rich_notification_data,
+      base::MakeRefCounted<UsbNotificationDelegate>(notification_id,
+                                                    device_info->guid));
+  notification.SetSystemPriority();
+  SystemNotificationHelper::GetInstance()->Display(notification);
+}
+
+}  // namespace
+
+std::string CrosUsbDetector::MakeNotificationId(const std::string& guid) {
+  return "cros:" + guid;
+}
+
+CrosUsbDetector::CrosUsbDetector() : client_binding_(this) {
+  guest_os_classes_blocked_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_PHYSICAL));
+  guest_os_classes_blocked_.emplace_back(UsbFilterByClassCode(USB_CLASS_HID));
+  guest_os_classes_blocked_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_PRINTER));
+
+  guest_os_classes_without_notif_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_AUDIO));
+  guest_os_classes_without_notif_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_STILL_IMAGE));
+  guest_os_classes_without_notif_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_MASS_STORAGE));
+  guest_os_classes_without_notif_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_VIDEO));
+  guest_os_classes_without_notif_.emplace_back(
+      UsbFilterByClassCode(USB_CLASS_PERSONAL_HEALTHCARE));
+}
+
+CrosUsbDetector::~CrosUsbDetector() {}
+
+void CrosUsbDetector::SetDeviceManagerForTesting(
+    device::mojom::UsbDeviceManagerPtr device_manager) {
+  device_manager_ = std::move(device_manager);
+}
+
+void CrosUsbDetector::ConnectToDeviceManager() {
+  // Tests may set a fake manager.
+  if (!device_manager_) {
+    // Request UsbDeviceManagerPtr from DeviceService.
+    content::ServiceManagerConnection::GetForProcess()
+        ->GetConnector()
+        ->BindInterface(device::mojom::kServiceName,
+                        mojo::MakeRequest(&device_manager_));
+  }
+  DCHECK(device_manager_);
+  device_manager_.set_connection_error_handler(
+      base::BindOnce(&CrosUsbDetector::OnDeviceManagerConnectionError,
+                     base::Unretained(this)));
+
+  // Listen for added/removed device events.
+  DCHECK(!client_binding_);
+  device::mojom::UsbDeviceManagerClientAssociatedPtrInfo client;
+  client_binding_.Bind(mojo::MakeRequest(&client));
+  device_manager_->SetClient(std::move(client));
+}
+
+void CrosUsbDetector::OnDeviceChecked(
+    device::mojom::UsbDeviceInfoPtr device_info,
+    bool allowed) {
+  if (!allowed) {
+    LOG(WARNING) << "Device not allowed by Permission Broker. product:"
+                 << device_info->product_id
+                 << " vendor:" << device_info->vendor_id;
+    return;
+  }
+
+  // TODO(jopra): Enable device connection management for allowed, non-blocked
+  // devices.
+
+  // Some devices should not trigger the notification.
+  if (device::UsbDeviceFilterMatchesAny(guest_os_classes_without_notif_,
+                                        *device_info)) {
+    return;
+  }
+  ShowNotificationForDevice(std::move(device_info));
+}
+
+void CrosUsbDetector::OnDeviceAdded(
+    device::mojom::UsbDeviceInfoPtr device_info) {
+  if (device::UsbDeviceFilterMatchesAny(guest_os_classes_blocked_,
+                                        *device_info)) {
+    return;  // Guest OS does not handle this kind of device.
+  }
+  device_manager_->CheckAccess(
+      device_info->guid,
+      base::BindOnce(&CrosUsbDetector::OnDeviceChecked, base::Unretained(this),
+                     std::move(device_info)));
+}
+
+void CrosUsbDetector::OnDeviceRemoved(
+    device::mojom::UsbDeviceInfoPtr device_info) {
+  SystemNotificationHelper::GetInstance()->Close(
+      CrosUsbDetector::MakeNotificationId(device_info->guid));
+}
+
+void CrosUsbDetector::OnDeviceManagerConnectionError() {
+  device_manager_.reset();
+  client_binding_.Close();
+
+  ConnectToDeviceManager();
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector.h b/chrome/browser/chromeos/usb/cros_usb_detector.h
new file mode 100644
index 0000000..6b34b14
--- /dev/null
+++ b/chrome/browser/chromeos/usb/cros_usb_detector.h
@@ -0,0 +1,75 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_USB_CROS_USB_DETECTOR_H_
+#define CHROME_BROWSER_CHROMEOS_USB_CROS_USB_DETECTOR_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "device/usb/public/mojom/device_enumeration_options.mojom.h"
+#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "device/usb/public/mojom/device_manager_client.mojom.h"
+#include "mojo/public/cpp/bindings/associated_binding.h"
+
+namespace chromeos {
+
+// Reasons the notification may be closed. These are used in histograms so do
+// not remove/reorder entries. Only add at the end just before kMaxValue. Also
+// remember to update the enum listing in
+// tools/metrics/histograms/histograms.xml.
+enum class CrosUsbNotificationClosed {
+  // The notification was dismissed but not by the user (either automatically
+  // or because the device was unplugged).
+  kUnknown,
+  // The user closed the notification via the close box.
+  kByUser,
+  // The user clicked on the Connect to Linux button of the notification.
+  kConnectToLinux,
+  // Maximum value for the enum.
+  kMaxValue = kConnectToLinux
+};
+
+// Detects USB Devices for Chrome OS and manages UI for controlling their use
+// with CrOS, Web or GuestOSs.
+class CrosUsbDetector : public device::mojom::UsbDeviceManagerClient {
+ public:
+  // Used to namespace USB notifications to avoid clashes with WebUsbDetector.
+  static std::string MakeNotificationId(const std::string& guid);
+
+  CrosUsbDetector();
+  ~CrosUsbDetector() override;
+
+  void SetDeviceManagerForTesting(
+      device::mojom::UsbDeviceManagerPtr device_manager);
+
+  // Connect to the device manager to be notified of connection/removal.
+  // Used during browser startup, after connection errors and to setup a fake
+  // device manager during testing.
+  void ConnectToDeviceManager();
+
+ private:
+  // Called after USB device access has been checked.
+  void OnDeviceChecked(device::mojom::UsbDeviceInfoPtr device, bool allowed);
+
+  // device::mojom::UsbDeviceManagerClient implementation.
+  void OnDeviceAdded(device::mojom::UsbDeviceInfoPtr device) override;
+  void OnDeviceRemoved(device::mojom::UsbDeviceInfoPtr device) override;
+
+  void OnDeviceManagerConnectionError();
+
+  device::mojom::UsbDeviceManagerPtr device_manager_;
+  mojo::AssociatedBinding<device::mojom::UsbDeviceManagerClient>
+      client_binding_;
+
+  std::vector<device::mojom::UsbDeviceFilterPtr> guest_os_classes_blocked_;
+  std::vector<device::mojom::UsbDeviceFilterPtr>
+      guest_os_classes_without_notif_;
+
+  DISALLOW_COPY_AND_ASSIGN(CrosUsbDetector);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_USB_CROS_USB_DETECTOR_H_
diff --git a/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc b/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc
new file mode 100644
index 0000000..1a8595dc
--- /dev/null
+++ b/chrome/browser/chromeos/usb/cros_usb_detector_unittest.cc
@@ -0,0 +1,555 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/macros.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/chromeos/usb/cros_usb_detector.h"
+#include "chrome/browser/notifications/notification_display_service.h"
+#include "chrome/browser/notifications/notification_display_service_tester.h"
+#include "chrome/browser/notifications/system_notification_helper.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "device/usb/public/cpp/fake_usb_device_info.h"
+#include "device/usb/public/cpp/fake_usb_device_manager.h"
+#include "device/usb/public/mojom/device.mojom.h"
+#include "device/usb/public/mojom/device_manager.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/message_center/public/cpp/notification.h"
+#include "url/gurl.h"
+
+namespace {
+
+const char* kProfileName = "test@example.com";
+
+// USB device product name.
+const char* kProductName_1 = "Google Product A";
+const char* kProductName_2 = "Google Product B";
+const char* kProductName_3 = "Google Product C";
+const char* kManufacturerName = "Google";
+const char* kExpectedConnectionMessage = "Connect this device to Linux";
+
+const int kUsbConfigWithInterfaces = 1;
+
+scoped_refptr<device::FakeUsbDeviceInfo> CreateTestDeviceOfClass(
+    uint8_t device_class) {
+  // The usb_utils do not filter by device class, only by configurations, and
+  // the FakeUsbDeviceInfo does not set up configurations for a fake device's
+  // class code. This helper sets up a configuration to match a devices class
+  // code so that USB devices can be filtered out.
+
+  auto interface = device::mojom::UsbInterfaceInfo::New();
+  interface->interface_number = 0;
+  interface->alternates.push_back(device::mojom::UsbAlternateInterfaceInfo::New(
+      /*alternate_setting*/ 0, device_class,
+      /*subclass_code*/ 0xff,
+      /*protocol_code*/ 0xff,
+      /*interface_name*/ base::nullopt,
+      std::vector<device::mojom::UsbEndpointInfoPtr>()));
+
+  auto config = device::mojom::UsbConfigurationInfo::New();
+  config->configuration_value = kUsbConfigWithInterfaces;
+
+  config->interfaces.push_back(std::move(interface));
+
+  std::vector<device::mojom::UsbConfigurationInfoPtr> configs;
+  configs.push_back(std::move(config));
+
+  scoped_refptr<device::FakeUsbDeviceInfo> device =
+      new device::FakeUsbDeviceInfo(/*vendor_id*/ 0, /*product_id*/ 1,
+                                    device_class, std::move(configs));
+  device->SetActiveConfig(kUsbConfigWithInterfaces);
+  return device;
+}
+
+}  // namespace
+
+class CrosUsbDetectorTest : public BrowserWithTestWindowTest {
+ public:
+  CrosUsbDetectorTest() {}
+  ~CrosUsbDetectorTest() override = default;
+
+  TestingProfile* CreateProfile() override {
+    return profile_manager()->CreateTestingProfile(kProfileName);
+  }
+
+  void SetUp() override {
+    BrowserWithTestWindowTest::SetUp();
+    profile_manager()->SetLoggedIn(true);
+    chromeos::ProfileHelper::Get()->SetActiveUserIdForTesting(kProfileName);
+    TestingBrowserProcess::GetGlobal()->SetSystemNotificationHelper(
+        std::make_unique<SystemNotificationHelper>());
+    display_service_ = std::make_unique<NotificationDisplayServiceTester>(
+        nullptr /* profile */);
+
+    cros_usb_detector_.reset(new chromeos::CrosUsbDetector());
+    // Set a fake USB device manager before ConnectToDeviceManager().
+    device::mojom::UsbDeviceManagerPtr device_manager_ptr;
+    device_manager_.AddBinding(mojo::MakeRequest(&device_manager_ptr));
+    cros_usb_detector_->SetDeviceManagerForTesting(
+        std::move(device_manager_ptr));
+  }
+
+  void TearDown() override {
+    BrowserWithTestWindowTest::TearDown();
+    cros_usb_detector_.reset();
+  }
+
+  void ConnectToDeviceManager() {
+    cros_usb_detector_->ConnectToDeviceManager();
+  }
+
+ protected:
+  device::FakeUsbDeviceManager device_manager_;
+  std::unique_ptr<chromeos::CrosUsbDetector> cros_usb_detector_;
+  std::unique_ptr<NotificationDisplayServiceTester> display_service_;
+
+ private:
+  std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
+  DISALLOW_COPY_AND_ASSIGN(CrosUsbDetectorTest);
+};
+
+TEST_F(CrosUsbDetectorTest, UsbDeviceAddedAndRemoved) {
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  auto device = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  device_manager_.AddDevice(device);
+  base::RunLoop().RunUntilIdle();
+
+  std::string notification_id =
+      chromeos::CrosUsbDetector::MakeNotificationId(device->guid());
+
+  base::Optional<message_center::Notification> notification =
+      display_service_->GetNotification(notification_id);
+  ASSERT_TRUE(notification);
+  base::string16 expected_title =
+      base::ASCIIToUTF16("Google Product A detected");
+  EXPECT_EQ(expected_title, notification->title());
+  base::string16 expected_message =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message, notification->message());
+  EXPECT_TRUE(notification->delegate());
+
+  device_manager_.RemoveDevice(device);
+  base::RunLoop().RunUntilIdle();
+  // Device is removed, so notification should be removed too.
+  EXPECT_FALSE(display_service_->GetNotification(notification_id));
+}
+
+TEST_F(CrosUsbDetectorTest, UsbDeviceClassBlockedAdded) {
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  scoped_refptr<device::FakeUsbDeviceInfo> device =
+      CreateTestDeviceOfClass(/* USB_CLASS_HID */ 0x03);
+
+  device_manager_.AddDevice(device);
+  base::RunLoop().RunUntilIdle();
+
+  std::string notification_id =
+      chromeos::CrosUsbDetector::MakeNotificationId(device->guid());
+  ASSERT_FALSE(display_service_->GetNotification(notification_id));
+
+  // TODO(jopra): Check that the device is not available for sharing.
+}
+
+TEST_F(CrosUsbDetectorTest, UsbDeviceClassWithoutNotificationAdded) {
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  scoped_refptr<device::FakeUsbDeviceInfo> device =
+      CreateTestDeviceOfClass(/* USB_CLASS_AUDIO */ 0x01);
+
+  device_manager_.AddDevice(device);
+  base::RunLoop().RunUntilIdle();
+
+  std::string notification_id =
+      chromeos::CrosUsbDetector::MakeNotificationId(device->guid());
+  ASSERT_FALSE(display_service_->GetNotification(notification_id));
+
+  // TODO(jopra): Check that the device is available for sharing.
+}
+
+TEST_F(CrosUsbDetectorTest, UsbDeviceWithoutProductNameAddedAndRemoved) {
+  std::string product_name = "";
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  auto device = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, product_name, "002");
+  device_manager_.AddDevice(device);
+  base::RunLoop().RunUntilIdle();
+
+  std::string notification_id =
+      chromeos::CrosUsbDetector::MakeNotificationId(device->guid());
+
+  base::Optional<message_center::Notification> notification =
+      display_service_->GetNotification(notification_id);
+  ASSERT_TRUE(notification);
+  base::string16 expected_title =
+      base::ASCIIToUTF16("USB device from Google detected");
+  EXPECT_EQ(expected_title, notification->title());
+  base::string16 expected_message =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message, notification->message());
+  EXPECT_TRUE(notification->delegate());
+
+  device_manager_.RemoveDevice(device);
+  base::RunLoop().RunUntilIdle();
+  // Device is removed, so notification should be removed too.
+  EXPECT_FALSE(display_service_->GetNotification(notification_id));
+}
+
+TEST_F(CrosUsbDetectorTest,
+       UsbDeviceWithoutProductNameOrManufacturerNameAddedAndRemoved) {
+  std::string product_name = "";
+  std::string manufacturer_name = "";
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  auto device = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, manufacturer_name, product_name, "002");
+  device_manager_.AddDevice(device);
+  base::RunLoop().RunUntilIdle();
+
+  std::string notification_id =
+      chromeos::CrosUsbDetector::MakeNotificationId(device->guid());
+
+  base::Optional<message_center::Notification> notification =
+      display_service_->GetNotification(notification_id);
+  ASSERT_TRUE(notification);
+  base::string16 expected_title = base::ASCIIToUTF16("USB device detected");
+  EXPECT_EQ(expected_title, notification->title());
+  base::string16 expected_message =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message, notification->message());
+  EXPECT_TRUE(notification->delegate());
+
+  device_manager_.RemoveDevice(device);
+  base::RunLoop().RunUntilIdle();
+  // Device is removed, so notification should be removed too.
+  EXPECT_FALSE(display_service_->GetNotification(notification_id));
+}
+
+TEST_F(CrosUsbDetectorTest, UsbDeviceWasThereBeforeAndThenRemoved) {
+  // USB device was added before cros_usb_detector was created.
+  auto device = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  device_manager_.AddDevice(device);
+  base::RunLoop().RunUntilIdle();
+
+  std::string notification_id =
+      chromeos::CrosUsbDetector::MakeNotificationId(device->guid());
+
+  EXPECT_FALSE(display_service_->GetNotification(notification_id));
+
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  device_manager_.RemoveDevice(device);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id));
+}
+
+TEST_F(
+    CrosUsbDetectorTest,
+    ThreeUsbDevicesWereThereBeforeAndThenRemovedBeforeUsbDetectorWasCreated) {
+  auto device_1 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  std::string notification_id_1 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_1->guid());
+
+  auto device_2 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      3, 4, kManufacturerName, kProductName_2, "005");
+  std::string notification_id_2 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_2->guid());
+
+  auto device_3 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      6, 7, kManufacturerName, kProductName_3, "008");
+  std::string notification_id_3 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_3->guid());
+
+  // Three usb devices were added and removed before cros_usb_detector was
+  // created.
+  device_manager_.AddDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+
+  device_manager_.AddDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.AddDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+
+  device_manager_.RemoveDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+
+  device_manager_.RemoveDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.RemoveDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+}
+
+TEST_F(CrosUsbDetectorTest,
+       ThreeUsbDevicesWereThereBeforeAndThenRemovedAfterUsbDetectorWasCreated) {
+  auto device_1 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  std::string notification_id_1 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_1->guid());
+
+  auto device_2 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      3, 4, kManufacturerName, kProductName_2, "005");
+  std::string notification_id_2 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_2->guid());
+
+  auto device_3 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      6, 7, kManufacturerName, kProductName_3, "008");
+  std::string notification_id_3 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_3->guid());
+
+  // Three usb devices were added before cros_usb_detector was created.
+  device_manager_.AddDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+
+  device_manager_.AddDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.AddDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+
+  device_manager_.RemoveDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+
+  device_manager_.RemoveDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.RemoveDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+}
+
+TEST_F(CrosUsbDetectorTest,
+       TwoUsbDevicesWereThereBeforeAndThenRemovedAndNewUsbDeviceAdded) {
+  auto device_1 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  std::string notification_id_1 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_1->guid());
+
+  auto device_2 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      3, 4, kManufacturerName, kProductName_2, "005");
+  std::string notification_id_2 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_2->guid());
+
+  // Two usb devices were added before cros_usb_detector was created.
+  device_manager_.AddDevice(device_1);
+  device_manager_.AddDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.RemoveDevice(device_1);
+  device_manager_.RemoveDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.AddDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification =
+      display_service_->GetNotification(notification_id_2);
+  ASSERT_TRUE(notification);
+  base::string16 expected_title =
+      base::ASCIIToUTF16("Google Product B detected");
+  EXPECT_EQ(expected_title, notification->title());
+  base::string16 expected_message =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message, notification->message());
+  EXPECT_TRUE(notification->delegate());
+
+  device_manager_.RemoveDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+}
+
+TEST_F(CrosUsbDetectorTest, ThreeUsbDevicesAddedAndRemoved) {
+  auto device_1 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  std::string notification_id_1 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_1->guid());
+
+  auto device_2 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      3, 4, kManufacturerName, kProductName_2, "005");
+  std::string notification_id_2 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_2->guid());
+
+  auto device_3 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      6, 7, kManufacturerName, kProductName_3, "008");
+  std::string notification_id_3 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_3->guid());
+
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  device_manager_.AddDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification_1 =
+      display_service_->GetNotification(notification_id_1);
+  ASSERT_TRUE(notification_1);
+  base::string16 expected_title_1 =
+      base::ASCIIToUTF16("Google Product A detected");
+  EXPECT_EQ(expected_title_1, notification_1->title());
+  base::string16 expected_message_1 =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message_1, notification_1->message());
+  EXPECT_TRUE(notification_1->delegate());
+
+  device_manager_.RemoveDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+
+  device_manager_.AddDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification_2 =
+      display_service_->GetNotification(notification_id_2);
+  ASSERT_TRUE(notification_2);
+  base::string16 expected_title_2 =
+      base::ASCIIToUTF16("Google Product B detected");
+  EXPECT_EQ(expected_title_2, notification_2->title());
+  base::string16 expected_message_2 =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message_2, notification_2->message());
+  EXPECT_TRUE(notification_2->delegate());
+
+  device_manager_.RemoveDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.AddDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification_3 =
+      display_service_->GetNotification(notification_id_3);
+  ASSERT_TRUE(notification_3);
+  base::string16 expected_title_3 =
+      base::ASCIIToUTF16("Google Product C detected");
+  EXPECT_EQ(expected_title_3, notification_3->title());
+  base::string16 expected_message_3 =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message_3, notification_3->message());
+  EXPECT_TRUE(notification_3->delegate());
+
+  device_manager_.RemoveDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+}
+
+TEST_F(CrosUsbDetectorTest, ThreeUsbDeviceAddedAndRemovedDifferentOrder) {
+  auto device_1 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      0, 1, kManufacturerName, kProductName_1, "002");
+  std::string notification_id_1 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_1->guid());
+
+  auto device_2 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      3, 4, kManufacturerName, kProductName_2, "005");
+  std::string notification_id_2 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_2->guid());
+
+  auto device_3 = base::MakeRefCounted<device::FakeUsbDeviceInfo>(
+      6, 7, kManufacturerName, kProductName_3, "008");
+  std::string notification_id_3 =
+      chromeos::CrosUsbDetector::MakeNotificationId(device_3->guid());
+
+  ConnectToDeviceManager();
+  base::RunLoop().RunUntilIdle();
+
+  device_manager_.AddDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification_1 =
+      display_service_->GetNotification(notification_id_1);
+  ASSERT_TRUE(notification_1);
+  base::string16 expected_title_1 =
+      base::ASCIIToUTF16("Google Product A detected");
+  EXPECT_EQ(expected_title_1, notification_1->title());
+  base::string16 expected_message_1 =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message_1, notification_1->message());
+  EXPECT_TRUE(notification_1->delegate());
+
+  device_manager_.AddDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification_2 =
+      display_service_->GetNotification(notification_id_2);
+  ASSERT_TRUE(notification_2);
+  base::string16 expected_title_2 =
+      base::ASCIIToUTF16("Google Product B detected");
+  EXPECT_EQ(expected_title_2, notification_2->title());
+  base::string16 expected_message_2 =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message_2, notification_2->message());
+  EXPECT_TRUE(notification_2->delegate());
+
+  device_manager_.RemoveDevice(device_2);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_2));
+
+  device_manager_.AddDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  base::Optional<message_center::Notification> notification_3 =
+      display_service_->GetNotification(notification_id_3);
+  ASSERT_TRUE(notification_3);
+  base::string16 expected_title_3 =
+      base::ASCIIToUTF16("Google Product C detected");
+  EXPECT_EQ(expected_title_3, notification_3->title());
+  base::string16 expected_message_3 =
+      base::ASCIIToUTF16(kExpectedConnectionMessage);
+  EXPECT_EQ(expected_message_3, notification_3->message());
+  EXPECT_TRUE(notification_3->delegate());
+
+  device_manager_.RemoveDevice(device_1);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_1));
+
+  device_manager_.RemoveDevice(device_3);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(display_service_->GetNotification(notification_id_3));
+}
diff --git a/chrome/browser/content_settings/content_settings_browsertest.cc b/chrome/browser/content_settings/content_settings_browsertest.cc
index a0c6654..d966732 100644
--- a/chrome/browser/content_settings/content_settings_browsertest.cc
+++ b/chrome/browser/content_settings/content_settings_browsertest.cc
@@ -425,7 +425,7 @@
   ui_test_utils::NavigateToURL(browser(),
                                https_server.GetURL("/setsecurecookie.html"));
   EXPECT_FALSE(GetSiteSettingsCookieContainer(browser())->cookies()->empty());
-};
+}
 
 IN_PROC_BROWSER_TEST_F(ContentSettingsTest, ContentSettingsBlockDataURLs) {
   GURL url("data:text/html,<title>Data URL</title><script>alert(1)</script>");
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 5df8fe2..8fe0a4d6 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -271,7 +271,7 @@
   void SetUpCommandLine(base::CommandLine* command_line) override {
     DevToolsSanityTest::SetUpCommandLine(command_line);
     content::IsolateAllSitesForTesting(command_line);
-  };
+  }
 
   void SetUpOnMainThread() override {
     DevToolsSanityTest::SetUpOnMainThread();
diff --git a/chrome/browser/devtools/devtools_ui_bindings.cc b/chrome/browser/devtools/devtools_ui_bindings.cc
index 4de19d7..8bc69c90 100644
--- a/chrome/browser/devtools/devtools_ui_bindings.cc
+++ b/chrome/browser/devtools/devtools_ui_bindings.cc
@@ -164,7 +164,7 @@
   void SetOpenNewWindowForPopups(bool value) override {}
   InfoBarService* GetInfoBarService() override;
   void RenderProcessGone(bool crashed) override {}
-  void ShowCertificateViewer(const std::string& cert_chain) override{};
+  void ShowCertificateViewer(const std::string& cert_chain) override {}
 
   content::WebContents* web_contents_;
   DISALLOW_COPY_AND_ASSIGN(DefaultBindingsDelegate);
diff --git a/chrome/browser/extensions/api/autofill_private/autofill_private_api.h b/chrome/browser/extensions/api/autofill_private/autofill_private_api.h
index 89a81e7..2cd1533 100644
--- a/chrome/browser/extensions/api/autofill_private/autofill_private_api.h
+++ b/chrome/browser/extensions/api/autofill_private/autofill_private_api.h
@@ -17,7 +17,7 @@
  public:
   AutofillPrivateSaveAddressFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.saveAddress",
-                             AUTOFILLPRIVATE_SAVEADDRESS);
+                             AUTOFILLPRIVATE_SAVEADDRESS)
 
  protected:
   ~AutofillPrivateSaveAddressFunction() override;
@@ -35,7 +35,7 @@
  public:
   AutofillPrivateGetCountryListFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.getCountryList",
-                             AUTOFILLPRIVATE_GETCOUNTRYLIST);
+                             AUTOFILLPRIVATE_GETCOUNTRYLIST)
 
  protected:
   ~AutofillPrivateGetCountryListFunction() override;
@@ -54,7 +54,7 @@
  public:
   AutofillPrivateGetAddressComponentsFunction() {}
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.getAddressComponents",
-                             AUTOFILLPRIVATE_GETADDRESSCOMPONENTS);
+                             AUTOFILLPRIVATE_GETADDRESSCOMPONENTS)
 
  protected:
   ~AutofillPrivateGetAddressComponentsFunction() override;
@@ -70,7 +70,7 @@
  public:
   AutofillPrivateGetAddressListFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.getAddressList",
-                             AUTOFILLPRIVATE_GETADDRESSLIST);
+                             AUTOFILLPRIVATE_GETADDRESSLIST)
 
  protected:
   ~AutofillPrivateGetAddressListFunction() override;
@@ -88,7 +88,7 @@
  public:
   AutofillPrivateSaveCreditCardFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.saveCreditCard",
-                             AUTOFILLPRIVATE_SAVECREDITCARD);
+                             AUTOFILLPRIVATE_SAVECREDITCARD)
 
  protected:
   ~AutofillPrivateSaveCreditCardFunction() override;
@@ -106,7 +106,7 @@
  public:
   AutofillPrivateRemoveEntryFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.removeEntry",
-                             AUTOFILLPRIVATE_REMOVEENTRY);
+                             AUTOFILLPRIVATE_REMOVEENTRY)
 
  protected:
   ~AutofillPrivateRemoveEntryFunction() override;
@@ -125,7 +125,7 @@
  public:
   AutofillPrivateValidatePhoneNumbersFunction() {}
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.validatePhoneNumbers",
-                             AUTOFILLPRIVATE_VALIDATEPHONENUMBERS);
+                             AUTOFILLPRIVATE_VALIDATEPHONENUMBERS)
 
  protected:
   ~AutofillPrivateValidatePhoneNumbersFunction() override;
@@ -141,7 +141,7 @@
  public:
   AutofillPrivateMaskCreditCardFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.maskCreditCard",
-                             AUTOFILLPRIVATE_MASKCREDITCARD);
+                             AUTOFILLPRIVATE_MASKCREDITCARD)
 
  protected:
   ~AutofillPrivateMaskCreditCardFunction() override;
@@ -160,7 +160,7 @@
  public:
   AutofillPrivateGetCreditCardListFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.getCreditCardList",
-                             AUTOFILLPRIVATE_GETCREDITCARDLIST);
+                             AUTOFILLPRIVATE_GETCREDITCARDLIST)
 
  protected:
   ~AutofillPrivateGetCreditCardListFunction() override;
@@ -179,7 +179,7 @@
  public:
   AutofillPrivateGetLocalCreditCardListFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.getLocalCreditCardList",
-                             AUTOFILLPRIVATE_GETLOCALCREDITCARDLIST);
+                             AUTOFILLPRIVATE_GETLOCALCREDITCARDLIST)
 
  protected:
   ~AutofillPrivateGetLocalCreditCardListFunction() override;
@@ -198,7 +198,7 @@
  public:
   AutofillPrivateGetServerCreditCardListFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.getServerCreditCardList",
-                             AUTOFILLPRIVATE_GETSERVERCREDITCARDLIST);
+                             AUTOFILLPRIVATE_GETSERVERCREDITCARDLIST)
 
  protected:
   ~AutofillPrivateGetServerCreditCardListFunction() override;
@@ -217,7 +217,7 @@
  public:
   AutofillPrivateMigrateCreditCardsFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.migrateCreditCards",
-                             AUTOFILLPRIVATE_MIGRATECREDITCARDS);
+                             AUTOFILLPRIVATE_MIGRATECREDITCARDS)
 
  protected:
   ~AutofillPrivateMigrateCreditCardsFunction() override;
@@ -236,7 +236,7 @@
  public:
   AutofillPrivateLogServerCardLinkClickedFunction();
   DECLARE_EXTENSION_FUNCTION("autofillPrivate.logServerCardLinkClicked",
-                             AUTOFILLPRIVATE_SERVERCARDLINKCLICKED);
+                             AUTOFILLPRIVATE_SERVERCARDLINKCLICKED)
 
  protected:
   ~AutofillPrivateLogServerCardLinkClickedFunction() override;
diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api.h b/chrome/browser/extensions/api/bookmarks/bookmarks_api.h
index 6799af7..52cde39d 100644
--- a/chrome/browser/extensions/api/bookmarks/bookmarks_api.h
+++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api.h
@@ -256,7 +256,7 @@
 
 class BookmarksRemoveFunction : public BookmarksRemoveFunctionBase {
  public:
-  DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE);
+  DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE)
 
  protected:
   ~BookmarksRemoveFunction() override {}
diff --git a/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h b/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h
index 964124d8..d6a88e0 100644
--- a/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h
+++ b/chrome/browser/extensions/api/braille_display_private/braille_display_private_api.h
@@ -92,7 +92,7 @@
 
 class BrailleDisplayPrivateWriteDotsFunction : public AsyncApiFunction {
   DECLARE_EXTENSION_FUNCTION("brailleDisplayPrivate.writeDots",
-                             BRAILLEDISPLAYPRIVATE_WRITEDOTS);
+                             BRAILLEDISPLAYPRIVATE_WRITEDOTS)
  public:
   BrailleDisplayPrivateWriteDotsFunction();
 
diff --git a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h
index 1f4686b..62af83e1 100644
--- a/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h
+++ b/chrome/browser/extensions/api/certificate_provider/certificate_provider_api.h
@@ -36,7 +36,7 @@
       chromeos::certificate_provider::CertificateInfo* out_info);
 
   DECLARE_EXTENSION_FUNCTION("certificateProviderInternal.reportCertificates",
-                             CERTIFICATEPROVIDERINTERNAL_REPORTCERTIFICATES);
+                             CERTIFICATEPROVIDERINTERNAL_REPORTCERTIFICATES)
 };
 
 class CertificateProviderInternalReportSignatureFunction
@@ -46,7 +46,7 @@
   ResponseAction Run() override;
 
   DECLARE_EXTENSION_FUNCTION("certificateProviderInternal.reportSignature",
-                             CERTIFICATEPROVIDERINTERNAL_REPORTSIGNATURE);
+                             CERTIFICATEPROVIDERINTERNAL_REPORTSIGNATURE)
 };
 
 class CertificateProviderRequestPinFunction : public UIThreadExtensionFunction {
@@ -59,7 +59,7 @@
   void OnInputReceived(const base::string16& value);
 
   DECLARE_EXTENSION_FUNCTION("certificateProvider.requestPin",
-                             CERTIFICATEPROVIDER_REQUESTPIN);
+                             CERTIFICATEPROVIDER_REQUESTPIN)
 };
 
 class CertificateProviderStopPinRequestFunction
@@ -70,7 +70,7 @@
   void DialogClosed(const base::string16& value);
 
   DECLARE_EXTENSION_FUNCTION("certificateProvider.stopPinRequest",
-                             CERTIFICATEPROVIDER_STOPPINREQUEST);
+                             CERTIFICATEPROVIDER_STOPPINREQUEST)
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.h b/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.h
index 4305893..eb7494ec 100644
--- a/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.h
+++ b/chrome/browser/extensions/api/cloud_print_private/cloud_print_private_api.h
@@ -97,7 +97,7 @@
 class CloudPrintPrivateGetClientIdFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("cloudPrintPrivate.getClientId",
-                             CLOUDPRINTPRIVATE_GETCLIENTID);
+                             CLOUDPRINTPRIVATE_GETCLIENTID)
 
   CloudPrintPrivateGetClientIdFunction();
 
diff --git a/chrome/browser/extensions/api/debugger/debugger_apitest.cc b/chrome/browser/extensions/api/debugger/debugger_apitest.cc
index f2adce9c..9f6af1f 100644
--- a/chrome/browser/extensions/api/debugger/debugger_apitest.cc
+++ b/chrome/browser/extensions/api/debugger/debugger_apitest.cc
@@ -343,7 +343,7 @@
   void SetUpCommandLine(base::CommandLine* command_line) override {
     DebuggerExtensionApiTest::SetUpCommandLine(command_line);
     content::IsolateAllSitesForTesting(command_line);
-  };
+  }
 };
 
 IN_PROC_BROWSER_TEST_F(SitePerProcessDebuggerExtensionApiTest, Debugger) {
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.h b/chrome/browser/extensions/api/developer_private/developer_private_api.h
index eb31145..773ddf6 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.h
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.h
@@ -335,7 +335,7 @@
  public:
   DeveloperPrivateGetExtensionsInfoFunction();
   DECLARE_EXTENSION_FUNCTION("developerPrivate.getExtensionsInfo",
-                             DEVELOPERPRIVATE_GETEXTENSIONSINFO);
+                             DEVELOPERPRIVATE_GETEXTENSIONSINFO)
 
  private:
   ~DeveloperPrivateGetExtensionsInfoFunction() override;
@@ -354,7 +354,7 @@
  public:
   DeveloperPrivateGetExtensionInfoFunction();
   DECLARE_EXTENSION_FUNCTION("developerPrivate.getExtensionInfo",
-                             DEVELOPERPRIVATE_GETEXTENSIONINFO);
+                             DEVELOPERPRIVATE_GETEXTENSIONINFO)
 
  private:
   ~DeveloperPrivateGetExtensionInfoFunction() override;
@@ -373,7 +373,7 @@
  public:
   DeveloperPrivateGetExtensionSizeFunction();
   DECLARE_EXTENSION_FUNCTION("developerPrivate.getExtensionSize",
-                             DEVELOPERPRIVATE_GETEXTENSIONSIZE);
+                             DEVELOPERPRIVATE_GETEXTENSIONSIZE)
 
  private:
   ~DeveloperPrivateGetExtensionSizeFunction() override;
@@ -388,7 +388,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.getProfileConfiguration",
-                             DEVELOPERPRIVATE_GETPROFILECONFIGURATION);
+                             DEVELOPERPRIVATE_GETPROFILECONFIGURATION)
 
  private:
   ~DeveloperPrivateGetProfileConfigurationFunction() override;
@@ -399,7 +399,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.updateProfileConfiguration",
-                             DEVELOPERPRIVATE_UPDATEPROFILECONFIGURATION);
+                             DEVELOPERPRIVATE_UPDATEPROFILECONFIGURATION)
 
  private:
   ~DeveloperPrivateUpdateProfileConfigurationFunction() override;
@@ -410,7 +410,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.updateExtensionConfiguration",
-                             DEVELOPERPRIVATE_UPDATEEXTENSIONCONFIGURATION);
+                             DEVELOPERPRIVATE_UPDATEEXTENSIONCONFIGURATION)
 
  protected:
   ~DeveloperPrivateUpdateExtensionConfigurationFunction() override;
@@ -421,8 +421,7 @@
                                        public ExtensionRegistryObserver,
                                        public LoadErrorReporter::Observer {
  public:
-  DECLARE_EXTENSION_FUNCTION("developerPrivate.reload",
-                             DEVELOPERPRIVATE_RELOAD);
+  DECLARE_EXTENSION_FUNCTION("developerPrivate.reload", DEVELOPERPRIVATE_RELOAD)
 
   DeveloperPrivateReloadFunction();
 
@@ -467,7 +466,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.showPermissionsDialog",
-                             DEVELOPERPRIVATE_PERMISSIONS);
+                             DEVELOPERPRIVATE_PERMISSIONS)
   DeveloperPrivateShowPermissionsDialogFunction();
 
  protected:
@@ -495,7 +494,7 @@
     : public DeveloperPrivateChooseEntryFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.loadUnpacked",
-                             DEVELOPERPRIVATE_LOADUNPACKED);
+                             DEVELOPERPRIVATE_LOADUNPACKED)
   DeveloperPrivateLoadUnpackedFunction();
 
  protected:
@@ -532,7 +531,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.installDroppedFile",
-                             DEVELOPERPRIVATE_INSTALLDROPPEDFILE);
+                             DEVELOPERPRIVATE_INSTALLDROPPEDFILE)
   DeveloperPrivateInstallDroppedFileFunction();
 
  private:
@@ -548,7 +547,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.notifyDragInstallInProgress",
-                             DEVELOPERPRIVATE_NOTIFYDRAGINSTALLINPROGRESS);
+                             DEVELOPERPRIVATE_NOTIFYDRAGINSTALLINPROGRESS)
 
   DeveloperPrivateNotifyDragInstallInProgressFunction();
 
@@ -566,7 +565,7 @@
     : public DeveloperPrivateChooseEntryFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.choosePath",
-                             DEVELOPERPRIVATE_CHOOSEPATH);
+                             DEVELOPERPRIVATE_CHOOSEPATH)
 
  protected:
   ~DeveloperPrivateChoosePathFunction() override;
@@ -583,7 +582,7 @@
 
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.packDirectory",
-                             DEVELOPERPRIVATE_PACKDIRECTORY);
+                             DEVELOPERPRIVATE_PACKDIRECTORY)
 
   DeveloperPrivatePackDirectoryFunction();
 
@@ -607,7 +606,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.isProfileManaged",
-                             DEVELOPERPRIVATE_ISPROFILEMANAGED);
+                             DEVELOPERPRIVATE_ISPROFILEMANAGED)
 
  protected:
   ~DeveloperPrivateIsProfileManagedFunction() override;
@@ -620,7 +619,7 @@
     : public ChromeAsyncExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.loadDirectory",
-                             DEVELOPERPRIVATE_LOADUNPACKEDCROS);
+                             DEVELOPERPRIVATE_LOADUNPACKEDCROS)
 
   DeveloperPrivateLoadDirectoryFunction();
 
@@ -676,7 +675,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.requestFileSource",
-                             DEVELOPERPRIVATE_REQUESTFILESOURCE);
+                             DEVELOPERPRIVATE_REQUESTFILESOURCE)
   DeveloperPrivateRequestFileSourceFunction();
 
  protected:
@@ -693,7 +692,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.openDevTools",
-                             DEVELOPERPRIVATE_OPENDEVTOOLS);
+                             DEVELOPERPRIVATE_OPENDEVTOOLS)
   DeveloperPrivateOpenDevToolsFunction();
 
  protected:
@@ -705,7 +704,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.deleteExtensionErrors",
-                             DEVELOPERPRIVATE_DELETEEXTENSIONERRORS);
+                             DEVELOPERPRIVATE_DELETEEXTENSIONERRORS)
 
  protected:
   ~DeveloperPrivateDeleteExtensionErrorsFunction() override;
@@ -716,7 +715,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.repairExtension",
-                             DEVELOPERPRIVATE_REPAIREXTENSION);
+                             DEVELOPERPRIVATE_REPAIREXTENSION)
 
  protected:
   ~DeveloperPrivateRepairExtensionFunction() override;
@@ -730,7 +729,7 @@
 class DeveloperPrivateShowOptionsFunction : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.showOptions",
-                             DEVELOPERPRIVATE_SHOWOPTIONS);
+                             DEVELOPERPRIVATE_SHOWOPTIONS)
 
  protected:
   ~DeveloperPrivateShowOptionsFunction() override;
@@ -740,7 +739,7 @@
 class DeveloperPrivateShowPathFunction : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.showPath",
-                             DEVELOPERPRIVATE_SHOWPATH);
+                             DEVELOPERPRIVATE_SHOWPATH)
 
  protected:
   ~DeveloperPrivateShowPathFunction() override;
@@ -751,7 +750,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.setShortcutHandlingSuspended",
-                             DEVELOPERPRIVATE_SETSHORTCUTHANDLINGSUSPENDED);
+                             DEVELOPERPRIVATE_SETSHORTCUTHANDLINGSUSPENDED)
 
  protected:
   ~DeveloperPrivateSetShortcutHandlingSuspendedFunction() override;
@@ -762,7 +761,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.updateExtensionCommand",
-                             DEVELOPERPRIVATE_UPDATEEXTENSIONCOMMAND);
+                             DEVELOPERPRIVATE_UPDATEEXTENSIONCOMMAND)
 
  protected:
   ~DeveloperPrivateUpdateExtensionCommandFunction() override;
@@ -773,7 +772,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.addHostPermission",
-                             DEVELOPERPRIVATE_ADDHOSTPERMISSION);
+                             DEVELOPERPRIVATE_ADDHOSTPERMISSION)
   DeveloperPrivateAddHostPermissionFunction();
 
  private:
@@ -790,7 +789,7 @@
     : public DeveloperPrivateAPIFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("developerPrivate.removeHostPermission",
-                             DEVELOPERPRIVATE_REMOVEHOSTPERMISSION);
+                             DEVELOPERPRIVATE_REMOVEHOSTPERMISSION)
   DeveloperPrivateRemoveHostPermissionFunction();
 
  private:
diff --git a/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h b/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h
index 4d6acf50..639906d 100644
--- a/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h
+++ b/chrome/browser/extensions/api/downloads_internal/downloads_internal_api.h
@@ -14,7 +14,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("downloadsInternal.determineFilename",
-                             DOWNLOADSINTERNAL_DETERMINEFILENAME);
+                             DOWNLOADSINTERNAL_DETERMINEFILENAME)
   DownloadsInternalDetermineFilenameFunction();
   ResponseAction Run() override;
 
diff --git a/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h b/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h
index 3f993c2..0f87921 100644
--- a/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h
+++ b/chrome/browser/extensions/api/enterprise_device_attributes/enterprise_device_attributes_api.h
@@ -21,7 +21,7 @@
 
  private:
   DECLARE_EXTENSION_FUNCTION("enterprise.deviceAttributes.getDirectoryDeviceId",
-                             ENTERPRISE_DEVICEATTRIBUTES_GETDIRECTORYDEVICEID);
+                             ENTERPRISE_DEVICEATTRIBUTES_GETDIRECTORYDEVICEID)
 };
 
 class EnterpriseDeviceAttributesGetDeviceSerialNumberFunction
@@ -37,7 +37,7 @@
  private:
   DECLARE_EXTENSION_FUNCTION(
       "enterprise.deviceAttributes.getDeviceSerialNumber",
-      ENTERPRISE_DEVICEATTRIBUTES_GETDEVICESERIALNUMBER);
+      ENTERPRISE_DEVICEATTRIBUTES_GETDEVICESERIALNUMBER)
 };
 
 class EnterpriseDeviceAttributesGetDeviceAssetIdFunction
@@ -52,7 +52,7 @@
 
  private:
   DECLARE_EXTENSION_FUNCTION("enterprise.deviceAttributes.getDeviceAssetId",
-                             ENTERPRISE_DEVICEATTRIBUTES_GETDEVICEASSETID);
+                             ENTERPRISE_DEVICEATTRIBUTES_GETDEVICEASSETID)
 };
 
 class EnterpriseDeviceAttributesGetDeviceAnnotatedLocationFunction
@@ -68,7 +68,7 @@
  private:
   DECLARE_EXTENSION_FUNCTION(
       "enterprise.deviceAttributes.getDeviceAnnotatedLocation",
-      ENTERPRISE_DEVICEATTRIBUTES_GETDEVICEANNOTATEDLOCATION);
+      ENTERPRISE_DEVICEATTRIBUTES_GETDEVICEANNOTATEDLOCATION)
 };
 
 }  //  namespace extensions
diff --git a/chrome/browser/extensions/api/enterprise_hardware_platform/enterprise_hardware_platform_api.h b/chrome/browser/extensions/api/enterprise_hardware_platform/enterprise_hardware_platform_api.h
index 157770e..1600ac5 100644
--- a/chrome/browser/extensions/api/enterprise_hardware_platform/enterprise_hardware_platform_api.h
+++ b/chrome/browser/extensions/api/enterprise_hardware_platform/enterprise_hardware_platform_api.h
@@ -24,7 +24,7 @@
  private:
   DECLARE_EXTENSION_FUNCTION(
       "enterprise.hardwarePlatform.getHardwarePlatformInfo",
-      ENTERPRISE_HARDWAREPLATFORM_GETHARDWAREPLATFORMINFO);
+      ENTERPRISE_HARDWAREPLATFORM_GETHARDWAREPLATFORMINFO)
 
   void OnHardwarePlatformInfo(base::SysInfo::HardwareInfo info);
 
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h
index d844023f..6900eb2 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api.h
@@ -32,7 +32,7 @@
                       const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeysInternal.generateKey",
-                             ENTERPRISE_PLATFORMKEYSINTERNAL_GENERATEKEY);
+                             ENTERPRISE_PLATFORMKEYSINTERNAL_GENERATEKEY)
 };
 
 class EnterprisePlatformKeysGetCertificatesFunction
@@ -47,7 +47,7 @@
                          const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeys.getCertificates",
-                             ENTERPRISE_PLATFORMKEYS_GETCERTIFICATES);
+                             ENTERPRISE_PLATFORMKEYS_GETCERTIFICATES)
 };
 
 class EnterprisePlatformKeysImportCertificateFunction
@@ -61,7 +61,7 @@
   void OnImportedCertificate(const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeys.importCertificate",
-                             ENTERPRISE_PLATFORMKEYS_IMPORTCERTIFICATE);
+                             ENTERPRISE_PLATFORMKEYS_IMPORTCERTIFICATE)
 };
 
 class EnterprisePlatformKeysRemoveCertificateFunction
@@ -75,7 +75,7 @@
   void OnRemovedCertificate(const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeys.removeCertificate",
-                             ENTERPRISE_PLATFORMKEYS_REMOVECERTIFICATE);
+                             ENTERPRISE_PLATFORMKEYS_REMOVECERTIFICATE)
 };
 
 class EnterprisePlatformKeysInternalGetTokensFunction
@@ -90,7 +90,7 @@
                    const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeysInternal.getTokens",
-                             ENTERPRISE_PLATFORMKEYSINTERNAL_GETTOKENS);
+                             ENTERPRISE_PLATFORMKEYSINTERNAL_GETTOKENS)
 };
 
 class EnterprisePlatformKeysChallengeMachineKeyFunction
@@ -113,7 +113,7 @@
   EPKPChallengeMachineKey* impl_;
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeys.challengeMachineKey",
-                             ENTERPRISE_PLATFORMKEYS_CHALLENGEMACHINEKEY);
+                             ENTERPRISE_PLATFORMKEYS_CHALLENGEMACHINEKEY)
 };
 
 class EnterprisePlatformKeysChallengeUserKeyFunction
@@ -136,7 +136,7 @@
   EPKPChallengeUserKey* impl_;
 
   DECLARE_EXTENSION_FUNCTION("enterprise.platformKeys.challengeUserKey",
-                             ENTERPRISE_PLATFORMKEYS_CHALLENGEUSERKEY);
+                             ENTERPRISE_PLATFORMKEYS_CHALLENGEUSERKEY)
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h b/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h
index 2dd4c3c..8161a91f 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h
+++ b/chrome/browser/extensions/api/enterprise_platform_keys_private/enterprise_platform_keys_private_api.h
@@ -272,7 +272,7 @@
 
   DECLARE_EXTENSION_FUNCTION(
       "enterprise.platformKeysPrivate.challengeMachineKey",
-      ENTERPRISE_PLATFORMKEYSPRIVATE_CHALLENGEMACHINEKEY);
+      ENTERPRISE_PLATFORMKEYSPRIVATE_CHALLENGEMACHINEKEY)
 };
 
 class EnterprisePlatformKeysPrivateChallengeUserKeyFunction
@@ -294,9 +294,8 @@
   std::unique_ptr<EPKPChallengeUserKey> default_impl_;
   EPKPChallengeUserKey* impl_;
 
-  DECLARE_EXTENSION_FUNCTION(
-      "enterprise.platformKeysPrivate.challengeUserKey",
-      ENTERPRISE_PLATFORMKEYSPRIVATE_CHALLENGEUSERKEY);
+  DECLARE_EXTENSION_FUNCTION("enterprise.platformKeysPrivate.challengeUserKey",
+                             ENTERPRISE_PLATFORMKEYSPRIVATE_CHALLENGEUSERKEY)
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
index 72e10ff..c6ebd8fa 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_api.h
@@ -31,7 +31,7 @@
  public:
   DECLARE_EXTENSION_FUNCTION(
       "enterprise.reportingPrivate.uploadChromeDesktopReport",
-      ENTERPRISEREPORTINGPRIVATE_UPLOADCHROMEDESKTOPREPORT);
+      ENTERPRISEREPORTINGPRIVATE_UPLOADCHROMEDESKTOPREPORT)
   EnterpriseReportingPrivateUploadChromeDesktopReportFunction();
 
   // ExtensionFunction
@@ -69,7 +69,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("enterprise.reportingPrivate.getDeviceId",
-                             ENTERPRISEREPORTINGPRIVATE_GETDEVICEID);
+                             ENTERPRISEREPORTINGPRIVATE_GETDEVICEID)
   EnterpriseReportingPrivateGetDeviceIdFunction();
 
   // ExtensionFunction
diff --git a/chrome/browser/extensions/api/extension_action/extension_page_actions_api_constants.h b/chrome/browser/extensions/api/extension_action/extension_page_actions_api_constants.h
index c8cfcc60..760718e 100644
--- a/chrome/browser/extensions/api/extension_action/extension_page_actions_api_constants.h
+++ b/chrome/browser/extensions/api/extension_action/extension_page_actions_api_constants.h
@@ -16,6 +16,6 @@
 extern const char kTitleKey[];
 extern const char kButtonKey[];
 
-};  // namespace extension_page_actions_api_constants
+}  // namespace extension_page_actions_api_constants
 
 #endif  // CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_PAGE_ACTIONS_API_CONSTANTS_H_
diff --git a/chrome/browser/extensions/api/file_system/file_system_apitest.cc b/chrome/browser/extensions/api/file_system/file_system_apitest.cc
index 8b64111..0c5ea4b2 100644
--- a/chrome/browser/extensions/api/file_system/file_system_apitest.cc
+++ b/chrome/browser/extensions/api/file_system/file_system_apitest.cc
@@ -85,7 +85,7 @@
   void TearDown() override {
     FileSystemChooseEntryFunction::StopSkippingPickerForTest();
     PlatformAppBrowserTest::TearDown();
-  };
+  }
 
  protected:
   base::FilePath TempFilePath(const std::string& destination_name,
diff --git a/chrome/browser/extensions/api/gcm/gcm_api.h b/chrome/browser/extensions/api/gcm/gcm_api.h
index 9a37f84..40bbd1b 100644
--- a/chrome/browser/extensions/api/gcm/gcm_api.h
+++ b/chrome/browser/extensions/api/gcm/gcm_api.h
@@ -35,7 +35,7 @@
 
 class GcmRegisterFunction : public GcmApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("gcm.register", GCM_REGISTER);
+  DECLARE_EXTENSION_FUNCTION("gcm.register", GCM_REGISTER)
 
   GcmRegisterFunction();
 
@@ -52,7 +52,7 @@
 
 class GcmUnregisterFunction : public GcmApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("gcm.unregister", GCM_UNREGISTER);
+  DECLARE_EXTENSION_FUNCTION("gcm.unregister", GCM_UNREGISTER)
 
   GcmUnregisterFunction();
 
@@ -68,7 +68,7 @@
 
 class GcmSendFunction : public GcmApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("gcm.send", GCM_SEND);
+  DECLARE_EXTENSION_FUNCTION("gcm.send", GCM_SEND)
 
   GcmSendFunction();
 
diff --git a/chrome/browser/extensions/api/identity/identity_get_accounts_function.h b/chrome/browser/extensions/api/identity/identity_get_accounts_function.h
index db096c9..a123670 100644
--- a/chrome/browser/extensions/api/identity/identity_get_accounts_function.h
+++ b/chrome/browser/extensions/api/identity/identity_get_accounts_function.h
@@ -12,8 +12,7 @@
 
 class IdentityGetAccountsFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("identity.getAccounts",
-                             IDENTITY_GETACCOUNTS);
+  DECLARE_EXTENSION_FUNCTION("identity.getAccounts", IDENTITY_GETACCOUNTS)
 
   IdentityGetAccountsFunction();
 
diff --git a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
index 1d87693..7e7d519 100644
--- a/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
+++ b/chrome/browser/extensions/api/identity/identity_get_auth_token_function.h
@@ -52,7 +52,7 @@
                                      public OAuth2MintTokenFlow::Delegate {
  public:
   DECLARE_EXTENSION_FUNCTION("identity.getAuthToken",
-                             EXPERIMENTAL_IDENTITY_GETAUTHTOKEN);
+                             EXPERIMENTAL_IDENTITY_GETAUTHTOKEN)
 
   IdentityGetAuthTokenFunction();
 
diff --git a/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h b/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h
index 66d1aee..f68ecc9 100644
--- a/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h
+++ b/chrome/browser/extensions/api/identity/identity_get_profile_user_info_function.h
@@ -13,7 +13,7 @@
 class IdentityGetProfileUserInfoFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("identity.getProfileUserInfo",
-                             IDENTITY_GETPROFILEUSERINFO);
+                             IDENTITY_GETPROFILEUSERINFO)
 
   IdentityGetProfileUserInfoFunction();
 
diff --git a/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.h b/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.h
index a975f2eb..e40e5b126 100644
--- a/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.h
+++ b/chrome/browser/extensions/api/identity/identity_launch_web_auth_flow_function.h
@@ -17,7 +17,7 @@
                                           public WebAuthFlow::Delegate {
  public:
   DECLARE_EXTENSION_FUNCTION("identity.launchWebAuthFlow",
-                             EXPERIMENTAL_IDENTITY_LAUNCHWEBAUTHFLOW);
+                             EXPERIMENTAL_IDENTITY_LAUNCHWEBAUTHFLOW)
 
   IdentityLaunchWebAuthFlowFunction();
 
diff --git a/chrome/browser/extensions/api/idltest/idltest_apitest.cc b/chrome/browser/extensions/api/idltest/idltest_apitest.cc
index 2329c87..9607c0c 100644
--- a/chrome/browser/extensions/api/idltest/idltest_apitest.cc
+++ b/chrome/browser/extensions/api/idltest/idltest_apitest.cc
@@ -21,4 +21,4 @@
   EXPECT_TRUE(RunExtensionSubtest("idltest/binary_data", "binary.html"));
   EXPECT_TRUE(RunExtensionSubtest("idltest/nocompile", "nocompile.html"));
   EXPECT_TRUE(RunExtensionSubtest("idltest/nodefine", "nodefine.html"));
-};
+}
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
index 2279b93..883bc29 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_private_api.h
@@ -74,14 +74,14 @@
 class ImageWriterPrivateListRemovableStorageDevicesFunction
     : public ChromeAsyncExtensionFunction {
   public:
-    DECLARE_EXTENSION_FUNCTION("imageWriterPrivate.listRemovableStorageDevices",
-                               IMAGEWRITER_LISTREMOVABLESTORAGEDEVICES);
-  ImageWriterPrivateListRemovableStorageDevicesFunction();
+   DECLARE_EXTENSION_FUNCTION("imageWriterPrivate.listRemovableStorageDevices",
+                              IMAGEWRITER_LISTREMOVABLESTORAGEDEVICES)
+   ImageWriterPrivateListRemovableStorageDevicesFunction();
 
- private:
-  ~ImageWriterPrivateListRemovableStorageDevicesFunction() override;
-  bool RunAsync() override;
-  void OnDeviceListReady(scoped_refptr<StorageDeviceList> device_list);
+  private:
+   ~ImageWriterPrivateListRemovableStorageDevicesFunction() override;
+   bool RunAsync() override;
+   void OnDeviceListReady(scoped_refptr<StorageDeviceList> device_list);
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/instance_id/instance_id_api.h b/chrome/browser/extensions/api/instance_id/instance_id_api.h
index eb514ab..ffd49612 100644
--- a/chrome/browser/extensions/api/instance_id/instance_id_api.h
+++ b/chrome/browser/extensions/api/instance_id/instance_id_api.h
@@ -34,7 +34,7 @@
 
 class InstanceIDGetIDFunction : public InstanceIDApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("instanceID.getID", INSTANCEID_GETID);
+  DECLARE_EXTENSION_FUNCTION("instanceID.getID", INSTANCEID_GETID)
 
   InstanceIDGetIDFunction();
 
@@ -53,7 +53,7 @@
 class InstanceIDGetCreationTimeFunction : public InstanceIDApiFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("instanceID.getCreationTime",
-                             INSTANCEID_GETCREATIONTIME);
+                             INSTANCEID_GETCREATIONTIME)
 
   InstanceIDGetCreationTimeFunction();
 
@@ -71,7 +71,7 @@
 
 class InstanceIDGetTokenFunction : public InstanceIDApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("instanceID.getToken", INSTANCEID_GETTOKEN);
+  DECLARE_EXTENSION_FUNCTION("instanceID.getToken", INSTANCEID_GETTOKEN)
 
   InstanceIDGetTokenFunction();
 
@@ -90,7 +90,7 @@
 
 class InstanceIDDeleteTokenFunction : public InstanceIDApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("instanceID.deleteToken", INSTANCEID_DELETETOKEN);
+  DECLARE_EXTENSION_FUNCTION("instanceID.deleteToken", INSTANCEID_DELETETOKEN)
 
   InstanceIDDeleteTokenFunction();
 
@@ -108,8 +108,7 @@
 
 class InstanceIDDeleteIDFunction : public InstanceIDApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("instanceID.deleteID",
-                             INSTANCEID_DELETEID);
+  DECLARE_EXTENSION_FUNCTION("instanceID.deleteID", INSTANCEID_DELETEID)
 
   InstanceIDDeleteIDFunction();
 
diff --git a/chrome/browser/extensions/api/mdns/mdns_api.h b/chrome/browser/extensions/api/mdns/mdns_api.h
index 7f88297..a32095e 100644
--- a/chrome/browser/extensions/api/mdns/mdns_api.h
+++ b/chrome/browser/extensions/api/mdns/mdns_api.h
@@ -129,7 +129,7 @@
   // UIThreadExtensionFunction override.
   ResponseAction Run() override;
 
-  DECLARE_EXTENSION_FUNCTION("mdns.forceDiscovery", MDNS_FORCEDISCOVERY);
+  DECLARE_EXTENSION_FUNCTION("mdns.forceDiscovery", MDNS_FORCEDISCOVERY)
   DISALLOW_COPY_AND_ASSIGN(MdnsForceDiscoveryFunction);
 };
 
diff --git a/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.h b/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.h
index fd773daa..4f12d14 100644
--- a/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.h
+++ b/chrome/browser/extensions/api/networking_cast_private/networking_cast_private_api.h
@@ -22,7 +22,7 @@
  public:
   NetworkingCastPrivateVerifyDestinationFunction() {}
   DECLARE_EXTENSION_FUNCTION("networking.castPrivate.verifyDestination",
-                             NETWORKINGCASTPRIVATE_VERIFYDESTINATION);
+                             NETWORKINGCASTPRIVATE_VERIFYDESTINATION)
 
  protected:
   ~NetworkingCastPrivateVerifyDestinationFunction() override;
@@ -42,7 +42,7 @@
  public:
   NetworkingCastPrivateVerifyAndEncryptDataFunction() {}
   DECLARE_EXTENSION_FUNCTION("networking.castPrivate.verifyAndEncryptData",
-                             NETWORKINGCASTPRIVATE_VERIFYANDENCRYPTDATA);
+                             NETWORKINGCASTPRIVATE_VERIFYANDENCRYPTDATA)
 
  protected:
   ~NetworkingCastPrivateVerifyAndEncryptDataFunction() override;
@@ -62,7 +62,7 @@
  public:
   NetworkingCastPrivateSetWifiTDLSEnabledStateFunction() {}
   DECLARE_EXTENSION_FUNCTION("networking.castPrivate.setWifiTDLSEnabledState",
-                             NETWORKINGCASTPRIVATE_SETWIFITDLSENABLEDSTATE);
+                             NETWORKINGCASTPRIVATE_SETWIFITDLSENABLEDSTATE)
 
  protected:
   ~NetworkingCastPrivateSetWifiTDLSEnabledStateFunction() override;
@@ -86,7 +86,7 @@
  public:
   NetworkingCastPrivateGetWifiTDLSStatusFunction() {}
   DECLARE_EXTENSION_FUNCTION("networking.castPrivate.getWifiTDLSStatus",
-                             NETWORKINGCASTPRIVATE_GETWIFITDLSSTATUS);
+                             NETWORKINGCASTPRIVATE_GETWIFITDLSSTATUS)
 
  protected:
   ~NetworkingCastPrivateGetWifiTDLSStatusFunction() override;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
index e85e11b..5b94478 100644
--- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
+++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -22,7 +22,7 @@
   PasswordsPrivateRecordPasswordsPageAccessInSettingsFunction() {}
   DECLARE_EXTENSION_FUNCTION(
       "passwordsPrivate.recordPasswordsPageAccessInSettings",
-      PASSWORDSPRIVATE_RECORDPASSWORDSPAGEACCESSINSETTINGS);
+      PASSWORDSPRIVATE_RECORDPASSWORDSPAGEACCESSINSETTINGS)
 
  protected:
   ~PasswordsPrivateRecordPasswordsPageAccessInSettingsFunction() override;
@@ -40,7 +40,7 @@
  public:
   PasswordsPrivateChangeSavedPasswordFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.changeSavedPassword",
-                             PASSWORDSPRIVATE_CHANGESAVEDPASSWORD);
+                             PASSWORDSPRIVATE_CHANGESAVEDPASSWORD)
 
  protected:
   ~PasswordsPrivateChangeSavedPasswordFunction() override;
@@ -57,7 +57,7 @@
  public:
   PasswordsPrivateRemoveSavedPasswordFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.removeSavedPassword",
-                             PASSWORDSPRIVATE_REMOVESAVEDPASSWORD);
+                             PASSWORDSPRIVATE_REMOVESAVEDPASSWORD)
 
  protected:
   ~PasswordsPrivateRemoveSavedPasswordFunction() override;
@@ -74,7 +74,7 @@
  public:
   PasswordsPrivateRemovePasswordExceptionFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.removePasswordException",
-                             PASSWORDSPRIVATE_REMOVEPASSWORDEXCEPTION);
+                             PASSWORDSPRIVATE_REMOVEPASSWORDEXCEPTION)
 
  protected:
   ~PasswordsPrivateRemovePasswordExceptionFunction() override;
@@ -92,7 +92,7 @@
   PasswordsPrivateUndoRemoveSavedPasswordOrExceptionFunction() {}
   DECLARE_EXTENSION_FUNCTION(
       "passwordsPrivate.undoRemoveSavedPasswordOrException",
-      PASSWORDSPRIVATE_UNDOREMOVESAVEDPASSWORDOREXCEPTION);
+      PASSWORDSPRIVATE_UNDOREMOVESAVEDPASSWORDOREXCEPTION)
 
  protected:
   ~PasswordsPrivateUndoRemoveSavedPasswordOrExceptionFunction() override;
@@ -110,7 +110,7 @@
  public:
   PasswordsPrivateRequestPlaintextPasswordFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.requestPlaintextPassword",
-                             PASSWORDSPRIVATE_REQUESTPLAINTEXTPASSWORD);
+                             PASSWORDSPRIVATE_REQUESTPLAINTEXTPASSWORD)
 
  protected:
   ~PasswordsPrivateRequestPlaintextPasswordFunction() override;
@@ -129,7 +129,7 @@
  public:
   PasswordsPrivateGetSavedPasswordListFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.getSavedPasswordList",
-                             PASSWORDSPRIVATE_GETSAVEDPASSWORDLIST);
+                             PASSWORDSPRIVATE_GETSAVEDPASSWORDLIST)
 
  protected:
   ~PasswordsPrivateGetSavedPasswordListFunction() override;
@@ -149,7 +149,7 @@
  public:
   PasswordsPrivateGetPasswordExceptionListFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.getPasswordExceptionList",
-                             PASSWORDSPRIVATE_GETPASSWORDEXCEPTIONLIST);
+                             PASSWORDSPRIVATE_GETPASSWORDEXCEPTIONLIST)
 
  protected:
   ~PasswordsPrivateGetPasswordExceptionListFunction() override;
@@ -169,7 +169,7 @@
  public:
   PasswordsPrivateImportPasswordsFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.importPasswords",
-                             PASSWORDSPRIVATE_IMPORTPASSWORDS);
+                             PASSWORDSPRIVATE_IMPORTPASSWORDS)
 
  protected:
   ~PasswordsPrivateImportPasswordsFunction() override;
@@ -186,7 +186,7 @@
  public:
   PasswordsPrivateExportPasswordsFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.exportPasswords",
-                             PASSWORDSPRIVATE_EXPORTPASSWORDS);
+                             PASSWORDSPRIVATE_EXPORTPASSWORDS)
 
  protected:
   ~PasswordsPrivateExportPasswordsFunction() override;
@@ -205,7 +205,7 @@
  public:
   PasswordsPrivateCancelExportPasswordsFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.cancelExportPasswords",
-                             PASSWORDSPRIVATE_CANCELEXPORTPASSWORDS);
+                             PASSWORDSPRIVATE_CANCELEXPORTPASSWORDS)
 
  protected:
   ~PasswordsPrivateCancelExportPasswordsFunction() override;
@@ -222,7 +222,7 @@
  public:
   PasswordsPrivateRequestExportProgressStatusFunction() {}
   DECLARE_EXTENSION_FUNCTION("passwordsPrivate.requestExportProgressStatus",
-                             PASSWORDSPRIVATE_REQUESTEXPORTPROGRESSSTATUS);
+                             PASSWORDSPRIVATE_REQUESTEXPORTPROGRESSSTATUS)
 
  protected:
   ~PasswordsPrivateRequestExportProgressStatusFunction() override;
diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_api.h b/chrome/browser/extensions/api/platform_keys/platform_keys_api.h
index 9cb73cf..b632e4e 100644
--- a/chrome/browser/extensions/api/platform_keys/platform_keys_api.h
+++ b/chrome/browser/extensions/api/platform_keys/platform_keys_api.h
@@ -44,7 +44,7 @@
                               const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("platformKeysInternal.selectClientCertificates",
-                             PLATFORMKEYSINTERNAL_SELECTCLIENTCERTIFICATES);
+                             PLATFORMKEYSINTERNAL_SELECTCLIENTCERTIFICATES)
 };
 
 class PlatformKeysInternalGetPublicKeyFunction
@@ -54,7 +54,7 @@
   ResponseAction Run() override;
 
   DECLARE_EXTENSION_FUNCTION("platformKeysInternal.getPublicKey",
-                             PLATFORMKEYSINTERNAL_GETPUBLICKEY);
+                             PLATFORMKEYSINTERNAL_GETPUBLICKEY)
 };
 
 class PlatformKeysInternalSignFunction : public UIThreadExtensionFunction {
@@ -67,7 +67,7 @@
   void OnSigned(const std::string& signature, const std::string& error_message);
 
   DECLARE_EXTENSION_FUNCTION("platformKeysInternal.sign",
-                             PLATFORMKEYSINTERNAL_SIGN);
+                             PLATFORMKEYSINTERNAL_SIGN)
 };
 
 class PlatformKeysVerifyTLSServerCertificateFunction
@@ -81,7 +81,7 @@
                             int cert_status);
 
   DECLARE_EXTENSION_FUNCTION("platformKeys.verifyTLSServerCertificate",
-                             PLATFORMKEYS_VERIFYTLSSERVERCERTIFICATE);
+                             PLATFORMKEYS_VERIFYTLSSERVERCERTIFICATE)
 };
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/processes/processes_api.h b/chrome/browser/extensions/api/processes/processes_api.h
index 1950e1e..f1ef0d68 100644
--- a/chrome/browser/extensions/api/processes/processes_api.h
+++ b/chrome/browser/extensions/api/processes/processes_api.h
@@ -116,7 +116,7 @@
   ExtensionFunction::ResponseAction Run() override;
 
   DECLARE_EXTENSION_FUNCTION("processes.getProcessIdForTab",
-                             PROCESSES_GETPROCESSIDFORTAB);
+                             PROCESSES_GETPROCESSIDFORTAB)
 
  private:
   ~ProcessesGetProcessIdForTabFunction() override {}
@@ -133,7 +133,7 @@
   // UIThreadExtensionFunction:
   ExtensionFunction::ResponseAction Run() override;
 
-  DECLARE_EXTENSION_FUNCTION("processes.terminate", PROCESSES_TERMINATE);
+  DECLARE_EXTENSION_FUNCTION("processes.terminate", PROCESSES_TERMINATE)
 
  private:
   ~ProcessesTerminateFunction() override {}
@@ -174,7 +174,7 @@
       const task_manager::TaskIdList& task_ids) override;
 
   DECLARE_EXTENSION_FUNCTION("processes.getProcessInfo",
-                             PROCESSES_GETPROCESSINFO);
+                             PROCESSES_GETPROCESSINFO)
 
  private:
   ~ProcessesGetProcessInfoFunction() override;
diff --git a/chrome/browser/extensions/api/resources_private/resources_private_api.h b/chrome/browser/extensions/api/resources_private/resources_private_api.h
index 5609686..ce37f9dc 100644
--- a/chrome/browser/extensions/api/resources_private/resources_private_api.h
+++ b/chrome/browser/extensions/api/resources_private/resources_private_api.h
@@ -13,7 +13,7 @@
 class ResourcesPrivateGetStringsFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("resourcesPrivate.getStrings",
-                             RESOURCESPRIVATE_GETSTRINGS);
+                             RESOURCESPRIVATE_GETSTRINGS)
   ResourcesPrivateGetStringsFunction();
 
  protected:
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_api.h b/chrome/browser/extensions/api/settings_private/settings_private_api.h
index eb9ff92..f9a377d 100644
--- a/chrome/browser/extensions/api/settings_private/settings_private_api.h
+++ b/chrome/browser/extensions/api/settings_private/settings_private_api.h
@@ -16,8 +16,7 @@
 class SettingsPrivateSetPrefFunction : public UIThreadExtensionFunction {
  public:
   SettingsPrivateSetPrefFunction() {}
-  DECLARE_EXTENSION_FUNCTION("settingsPrivate.setPref",
-                             SETTINGSPRIVATE_SETPREF);
+  DECLARE_EXTENSION_FUNCTION("settingsPrivate.setPref", SETTINGSPRIVATE_SETPREF)
 
  protected:
   ~SettingsPrivateSetPrefFunction() override;
@@ -33,7 +32,7 @@
  public:
   SettingsPrivateGetAllPrefsFunction() {}
   DECLARE_EXTENSION_FUNCTION("settingsPrivate.getAllPrefs",
-                             SETTINGSPRIVATE_GETALLPREFS);
+                             SETTINGSPRIVATE_GETALLPREFS)
 
  protected:
   ~SettingsPrivateGetAllPrefsFunction() override;
@@ -48,8 +47,7 @@
 class SettingsPrivateGetPrefFunction : public UIThreadExtensionFunction {
  public:
   SettingsPrivateGetPrefFunction() {}
-  DECLARE_EXTENSION_FUNCTION("settingsPrivate.getPref",
-                             SETTINGSPRIVATE_GETPREF);
+  DECLARE_EXTENSION_FUNCTION("settingsPrivate.getPref", SETTINGSPRIVATE_GETPREF)
 
  protected:
   ~SettingsPrivateGetPrefFunction() override;
@@ -66,7 +64,7 @@
  public:
   SettingsPrivateGetDefaultZoomFunction() {}
   DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoom",
-                             SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION);
+                             SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION)
 
  protected:
   ~SettingsPrivateGetDefaultZoomFunction() override;
@@ -83,7 +81,7 @@
  public:
   SettingsPrivateSetDefaultZoomFunction() {}
   DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoom",
-                             SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION);
+                             SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION)
 
  protected:
   ~SettingsPrivateSetDefaultZoomFunction() override;
diff --git a/chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h b/chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h
index 61007ce5..9ca71ed 100644
--- a/chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h
+++ b/chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h
@@ -20,7 +20,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("chromeWebViewInternal.contextMenusCreate",
-                             WEBVIEWINTERNAL_CONTEXTMENUSCREATE);
+                             WEBVIEWINTERNAL_CONTEXTMENUSCREATE)
   ChromeWebViewInternalContextMenusCreateFunction() {}
 
  protected:
@@ -37,7 +37,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("chromeWebViewInternal.contextMenusUpdate",
-                             WEBVIEWINTERNAL_CONTEXTMENUSUPDATE);
+                             WEBVIEWINTERNAL_CONTEXTMENUSUPDATE)
   ChromeWebViewInternalContextMenusUpdateFunction() {}
 
  protected:
@@ -54,7 +54,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("chromeWebViewInternal.contextMenusRemove",
-                             WEBVIEWINTERNAL_CONTEXTMENUSREMOVE);
+                             WEBVIEWINTERNAL_CONTEXTMENUSREMOVE)
   ChromeWebViewInternalContextMenusRemoveFunction() {}
 
  protected:
@@ -71,7 +71,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("chromeWebViewInternal.contextMenusRemoveAll",
-                             WEBVIEWINTERNAL_CONTEXTMENUSREMOVEALL);
+                             WEBVIEWINTERNAL_CONTEXTMENUSREMOVEALL)
   ChromeWebViewInternalContextMenusRemoveAllFunction() {}
 
  protected:
@@ -88,7 +88,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("chromeWebViewInternal.showContextMenu",
-                             WEBVIEWINTERNAL_SHOWCONTEXTMENU);
+                             WEBVIEWINTERNAL_SHOWCONTEXTMENU)
 
   ChromeWebViewInternalShowContextMenuFunction();
 
diff --git a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
index a9ce89f9..ab939583 100644
--- a/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
+++ b/chrome/browser/extensions/api/webrtc_audio_private/webrtc_audio_private_api.h
@@ -93,7 +93,7 @@
   using SinkInfoVector = std::vector<api::webrtc_audio_private::SinkInfo>;
 
   DECLARE_EXTENSION_FUNCTION("webrtcAudioPrivate.getSinks",
-                             WEBRTC_AUDIO_PRIVATE_GET_SINKS);
+                             WEBRTC_AUDIO_PRIVATE_GET_SINKS)
 
   bool RunAsync() override;
 
@@ -113,7 +113,7 @@
 
  private:
   DECLARE_EXTENSION_FUNCTION("webrtcAudioPrivate.getAssociatedSink",
-                             WEBRTC_AUDIO_PRIVATE_GET_ASSOCIATED_SINK);
+                             WEBRTC_AUDIO_PRIVATE_GET_ASSOCIATED_SINK)
 
   // UI thread: Entry point, posts GetInputDeviceDescriptions() to IO thread.
   bool RunAsync() override;
@@ -142,7 +142,7 @@
 
  private:
   DECLARE_EXTENSION_FUNCTION("webrtcAudioPrivate.setAudioExperiments",
-                             WEBRTC_AUDIO_PRIVATE_SET_AUDIO_EXPERIMENTS);
+                             WEBRTC_AUDIO_PRIVATE_SET_AUDIO_EXPERIMENTS)
 
   bool RunAsync() override;
 
diff --git a/chrome/browser/extensions/extension_apitest.cc b/chrome/browser/extensions/extension_apitest.cc
index 178e303b..2111eaa 100644
--- a/chrome/browser/extensions/extension_apitest.cc
+++ b/chrome/browser/extensions/extension_apitest.cc
@@ -144,7 +144,7 @@
   return std::move(http_response);
 }
 
-};  // namespace
+}  // namespace
 
 ExtensionApiTest::ExtensionApiTest() {
   embedded_test_server()->RegisterRequestHandler(
diff --git a/chrome/browser/extensions/extension_bindings_apitest.cc b/chrome/browser/extensions/extension_bindings_apitest.cc
index 9582e83..58c7308 100644
--- a/chrome/browser/extensions/extension_bindings_apitest.cc
+++ b/chrome/browser/extensions/extension_bindings_apitest.cc
@@ -201,7 +201,7 @@
 
 IN_PROC_BROWSER_TEST_P(ExtensionBindingsApiTest, ApiEnums) {
   ASSERT_TRUE(RunExtensionTest("bindings/api_enums")) << message_;
-};
+}
 
 // Regression test for http://crbug.com/504011 - proper access checks on
 // getModuleSystem().
diff --git a/chrome/browser/extensions/extension_messages_apitest.cc b/chrome/browser/extensions/extension_messages_apitest.cc
index 043747c4..4b20e6b 100644
--- a/chrome/browser/extensions/extension_messages_apitest.cc
+++ b/chrome/browser/extensions/extension_messages_apitest.cc
@@ -1375,4 +1375,4 @@
 
 }  // namespace
 
-};  // namespace extensions
+}  // namespace extensions
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 30fd86c1..9cda7e1 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -5878,59 +5878,73 @@
 
   LoadErrorReporter::Init(false);  // no noisy errors
   ExtensionsReadyRecorder recorder;
-  std::unique_ptr<TestingProfile> profile(new TestingProfile());
+
   std::unique_ptr<base::CommandLine> command_line;
-  base::FilePath install_dir =
-      profile->GetPath().AppendASCII(kInstallDirectoryName);
 
-  // By default, we are enabled.
-  command_line.reset(new base::CommandLine(base::CommandLine::NO_PROGRAM));
-  ExtensionService* service =
-      static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
-          ->CreateExtensionService(command_line.get(), install_dir, false);
-  EXPECT_TRUE(service->extensions_enabled());
-  service->Init();
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(recorder.ready());
+  // The profile lifetimes must not overlap: services may use global variables.
+  {
+    auto profile = std::make_unique<TestingProfile>();
+    base::FilePath install_dir =
+        profile->GetPath().AppendASCII(kInstallDirectoryName);
 
-  // If either the command line or pref is set, we are disabled.
-  recorder.set_ready(false);
-  profile.reset(new TestingProfile());
-  command_line->AppendSwitch(::switches::kDisableExtensions);
-  service =
-      static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
-          ->CreateExtensionService(command_line.get(), install_dir, false);
-  EXPECT_FALSE(service->extensions_enabled());
-  service->Init();
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(recorder.ready());
+    // By default, we are enabled.
+    command_line.reset(new base::CommandLine(base::CommandLine::NO_PROGRAM));
+    ExtensionService* service =
+        static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
+            ->CreateExtensionService(command_line.get(), install_dir, false);
+    EXPECT_TRUE(service->extensions_enabled());
+    service->Init();
+    content::RunAllTasksUntilIdle();
+    EXPECT_TRUE(recorder.ready());
+  }
 
-  recorder.set_ready(false);
-  profile.reset(new TestingProfile());
-  profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
-  service =
-      static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
-          ->CreateExtensionService(command_line.get(), install_dir, false);
-  EXPECT_FALSE(service->extensions_enabled());
-  service->Init();
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(recorder.ready());
+  {
+    // If either the command line or pref is set, we are disabled.
+    recorder.set_ready(false);
+    auto profile = std::make_unique<TestingProfile>();
+    base::FilePath install_dir =
+        profile->GetPath().AppendASCII(kInstallDirectoryName);
+    command_line->AppendSwitch(::switches::kDisableExtensions);
+    ExtensionService* service =
+        static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
+            ->CreateExtensionService(command_line.get(), install_dir, false);
+    EXPECT_FALSE(service->extensions_enabled());
+    service->Init();
+    content::RunAllTasksUntilIdle();
+    EXPECT_TRUE(recorder.ready());
+  }
 
-  recorder.set_ready(false);
-  profile.reset(new TestingProfile());
-  profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
-  command_line.reset(new base::CommandLine(base::CommandLine::NO_PROGRAM));
-  service =
-      static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
-          ->CreateExtensionService(command_line.get(), install_dir, false);
-  EXPECT_FALSE(service->extensions_enabled());
-  service->Init();
-  content::RunAllTasksUntilIdle();
-  EXPECT_TRUE(recorder.ready());
+  {
+    recorder.set_ready(false);
+    auto profile = std::make_unique<TestingProfile>();
+    base::FilePath install_dir =
+        profile->GetPath().AppendASCII(kInstallDirectoryName);
+    profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
+    ExtensionService* service =
+        static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
+            ->CreateExtensionService(command_line.get(), install_dir, false);
+    EXPECT_FALSE(service->extensions_enabled());
+    service->Init();
+    content::RunAllTasksUntilIdle();
+    EXPECT_TRUE(recorder.ready());
+  }
 
-  // Explicitly delete all the resources used in this test.
-  profile.reset();
-  service = NULL;
+  {
+    recorder.set_ready(false);
+    auto profile = std::make_unique<TestingProfile>();
+    base::FilePath install_dir =
+        profile->GetPath().AppendASCII(kInstallDirectoryName);
+    profile->GetPrefs()->SetBoolean(prefs::kDisableExtensions, true);
+    command_line.reset(new base::CommandLine(base::CommandLine::NO_PROGRAM));
+    ExtensionService* service =
+        static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile.get()))
+            ->CreateExtensionService(command_line.get(), install_dir, false);
+    EXPECT_FALSE(service->extensions_enabled());
+    service->Init();
+    content::RunAllTasksUntilIdle();
+    EXPECT_TRUE(recorder.ready());
+  }
+
   // Execute any pending deletion tasks.
   content::RunAllTasksUntilIdle();
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index dec1c95..7f1048e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1086,6 +1086,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enable-desktop-pwas-omnibox-install",
+    "owners": [ "desktop-pwas-team@google.com" ],
+    "expiry_milestone": 77
+  },
+  {
     "name": "enable-devtools-experiments",
     "owners": [ "//third_party/blink/renderer/devtools/OWNERS" ],
     // This is a catch-all for ongoing devtools experiments.
@@ -1972,6 +1977,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enable-webassembly-code-cache",
+    "owners": [ "bbudge", "hablich", "wasm-team@google.com" ],
+    "expiry_milestone": 76
+  },
+  {
     "name": "enable-webassembly-threads",
     "owners": [ "binji", "hablich", "wasm-team@google.com" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index f9dd47655..592e54d 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -590,6 +590,12 @@
     "Links to sites in a different scope will open inside the PWA window as "
     "opposed to in the browser.";
 
+const char kDesktopPWAsOmniboxInstallName[] =
+    "Desktop PWAs installable from the omnibox";
+const char kDesktopPWAsOmniboxInstallDescription[] =
+    "When on a site that passes PWA installation requirements show a button in "
+    "the omnibox for installing it.";
+
 const char kEnableSystemWebAppsName[] = "System Web Apps";
 const char kEnableSystemWebAppsDescription[] =
     "Experimental system for using the Desktop PWA framework for running System"
@@ -992,6 +998,10 @@
 const char kEnableWasmBaselineDescription[] =
     "Enables WebAssembly baseline compilation and tier up.";
 
+const char kEnableWasmCodeCacheName[] = "WebAssembly compiled module cache";
+const char kEnableWasmCodeCacheDescription[] =
+    "Enables caching of compiled WebAssembly modules.";
+
 const char kEnableWasmThreadsName[] = "WebAssembly threads support.";
 const char kEnableWasmThreadsDescription[] =
     "Enables support for the WebAssembly Threads proposal. Implies "
@@ -2479,10 +2489,6 @@
     "Enable foreground notification manager to handle foreground service and "
     "notification.";
 
-const char kGestureNavigationName[] = "History navigation with gesture";
-const char kGestureNavigationDescription[] =
-    "Enable history navigation with horizontal gesture.";
-
 const char kGrantNotificationsToDSEName[] =
     "Grant notifications to the Default Search Engine";
 const char kGrantNotificationsToDSENameDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index a2163f5..d7e500e1 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -385,6 +385,9 @@
 extern const char kDesktopPWAsStayInWindowName[];
 extern const char kDesktopPWAsStayInWindowDescription[];
 
+extern const char kDesktopPWAsOmniboxInstallName[];
+extern const char kDesktopPWAsOmniboxInstallDescription[];
+
 extern const char kEnableSystemWebAppsName[];
 extern const char kEnableSystemWebAppsDescription[];
 
@@ -597,6 +600,9 @@
 extern const char kEnableWasmBaselineName[];
 extern const char kEnableWasmBaselineDescription[];
 
+extern const char kEnableWasmCodeCacheName[];
+extern const char kEnableWasmCodeCacheDescription[];
+
 extern const char kEnableWasmThreadsName[];
 extern const char kEnableWasmThreadsDescription[];
 
@@ -1468,9 +1474,6 @@
 extern const char kForegroundNotificationManagerName[];
 extern const char kForegroundNotificationManagerDescription[];
 
-extern const char kGestureNavigationName[];
-extern const char kGestureNavigationDescription[];
-
 extern const char kGrantNotificationsToDSEName[];
 extern const char kGrantNotificationsToDSENameDescription[];
 
diff --git a/chrome/browser/installable/installable_manager_browsertest.cc b/chrome/browser/installable/installable_manager_browsertest.cc
index 6c41f7f..f4ea781 100644
--- a/chrome/browser/installable/installable_manager_browsertest.cc
+++ b/chrome/browser/installable/installable_manager_browsertest.cc
@@ -80,7 +80,7 @@
   ~LazyWorkerInstallableManager() override {}
 
  protected:
-  void OnWaitingForServiceWorker() override { quit_closure_.Run(); };
+  void OnWaitingForServiceWorker() override { quit_closure_.Run(); }
 
  private:
   base::Closure quit_closure_;
diff --git a/chrome/browser/local_discovery/service_discovery_client_mdns.cc b/chrome/browser/local_discovery/service_discovery_client_mdns.cc
index 529f382..b713c397 100644
--- a/chrome/browser/local_discovery/service_discovery_client_mdns.cc
+++ b/chrome/browser/local_discovery/service_discovery_client_mdns.cc
@@ -182,7 +182,7 @@
 
   void OnMdnsDestroy() override {
     DeleteOnMdnsThread(implementation_.release());
-  };
+  }
 
  protected:
   void set_implementation(std::unique_ptr<T> implementation) {
@@ -279,7 +279,7 @@
       PostToMdnsThread(base::Bind(&ServiceResolver::StartResolving,
                                   base::Unretained(implementation())));
     }
-  };
+  }
 
   std::string GetName() const override { return service_name_; }
 
@@ -319,7 +319,7 @@
       PostToMdnsThread(base::Bind(&LocalDomainResolver::Start,
                                   base::Unretained(implementation())));
     }
-  };
+  }
 
  private:
   static void OnCallback(const WeakPtr& proxy,
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
index 882e4973..2545d93 100644
--- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -100,7 +100,7 @@
 #define EXPECT_WV_PROPRIETARY EXPECT_UNSUPPORTED
 #endif  // BUILDFLAG(BUNDLE_WIDEVINE_CDM)
 
-};  // namespace
+}  // namespace
 
 class EncryptedMediaSupportedTypesTest : public InProcessBrowserTest {
  protected:
diff --git a/chrome/browser/media/media_engagement_autoplay_browsertest.cc b/chrome/browser/media/media_engagement_autoplay_browsertest.cc
index 3ab630e..fb17dc92 100644
--- a/chrome/browser/media/media_engagement_autoplay_browsertest.cc
+++ b/chrome/browser/media/media_engagement_autoplay_browsertest.cc
@@ -93,7 +93,7 @@
 
     // Clear any preloaded MEI data.
     ApplyEmptyPreloadedList();
-  };
+  }
 
   void LoadTestPage(const std::string& page) {
     NavigateParams params(browser()->profile(), http_server_.GetURL("/" + page),
diff --git a/chrome/browser/media/router/discovery/mdns/dns_sd_registry_unittest.cc b/chrome/browser/media/router/discovery/mdns/dns_sd_registry_unittest.cc
index a249b6c..bf0cba6 100644
--- a/chrome/browser/media/router/discovery/mdns/dns_sd_registry_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/dns_sd_registry_unittest.cc
@@ -54,7 +54,7 @@
     MockDnsSdDeviceLister* lister = new MockDnsSdDeviceLister();
     listers_[service_type] = lister;
     return lister;
-  };
+  }
 
  private:
   std::map<std::string, MockDnsSdDeviceLister*> listers_;
diff --git a/chrome/browser/media/router/test/media_router_mojo_test.h b/chrome/browser/media/router/test/media_router_mojo_test.h
index 981977c..1f0d20c2 100644
--- a/chrome/browser/media/router/test/media_router_mojo_test.h
+++ b/chrome/browser/media/router/test/media_router_mojo_test.h
@@ -233,7 +233,7 @@
       mojom::HangoutsMediaRouteControllerRequest controller_request) override {
     hangouts_binding_.Bind(std::move(controller_request));
     ConnectHangoutsMediaRouteController();
-  };
+  }
   MOCK_METHOD0(ConnectHangoutsMediaRouteController, void());
   MOCK_METHOD1(SetLocalPresent, void(bool local_present));
 
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.h b/chrome/browser/media/webrtc/webrtc_event_log_manager.h
index 1f30e1af..21b33151 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager.h
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.h
@@ -30,7 +30,7 @@
 namespace content {
 class BrowserContext;
 class NetworkConnectionTracker;
-};
+}  // namespace content
 
 namespace webrtc_event_logging {
 
diff --git a/chrome/browser/net/network_context_configuration_browsertest.cc b/chrome/browser/net/network_context_configuration_browsertest.cc
index ecfbd5f..a372021 100644
--- a/chrome/browser/net/network_context_configuration_browsertest.cc
+++ b/chrome/browser/net/network_context_configuration_browsertest.cc
@@ -1937,7 +1937,7 @@
                                                                          \
   INSTANTIATE_TEST_SUITE_P(                                              \
       IncognitoProfileMainNetworkContext, TestFixture,                   \
-      ::testing::Values(TEST_CASES(NetworkContextType::kIncognitoProfile)));
+      ::testing::Values(TEST_CASES(NetworkContextType::kIncognitoProfile)))
 
 INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE(NetworkContextConfigurationBrowserTest);
 INSTANTIATE_TEST_CASES_FOR_TEST_FIXTURE(
diff --git a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
index 4b3cc1d..7bcf78d 100644
--- a/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
+++ b/chrome/browser/page_load_metrics/observers/ad_metrics/ads_page_load_metrics_observer_browsertest.cc
@@ -470,7 +470,7 @@
     }
     return num_ad_resources >= expected_minimum_num_ad_resources_ &&
            PageLoadMetricsTestWaiter::ExpectationsSatisfied();
-  };
+  }
 
  private:
   int expected_minimum_num_ad_resources_ = 0;
diff --git a/chrome/browser/predictors/preconnect_manager_unittest.cc b/chrome/browser/predictors/preconnect_manager_unittest.cc
index 1471612..ba8c90e 100644
--- a/chrome/browser/predictors/preconnect_manager_unittest.cc
+++ b/chrome/browser/predictors/preconnect_manager_unittest.cc
@@ -66,7 +66,7 @@
   ~MockNetworkContext() override {
     EXPECT_TRUE(resolve_host_clients_.empty())
         << "Not all resolve host requests were satisfied";
-  };
+  }
 
   void ResolveHost(
       const net::HostPortPair& host_port,
diff --git a/chrome/browser/prefs/tracked/pref_hash_browsertest.cc b/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
index f65b170..f436769 100644
--- a/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
+++ b/chrome/browser/prefs/tracked/pref_hash_browsertest.cc
@@ -168,7 +168,7 @@
           chrome_prefs::internals::                                            \
               kSettingsEnforcementGroupEnforceAlwaysWithDSE,                   \
           chrome_prefs::internals::                                            \
-              kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE));
+              kSettingsEnforcementGroupEnforceAlwaysWithExtensionsAndDSE))
 
 // A base fixture designed such that implementations do two things:
 //  1) Override all three pure-virtual methods below to setup, attack, and
diff --git a/chrome/browser/profiles/gaia_info_update_service_unittest.cc b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
index 7362d64..4258fe98 100644
--- a/chrome/browser/profiles/gaia_info_update_service_unittest.cc
+++ b/chrome/browser/profiles/gaia_info_update_service_unittest.cc
@@ -82,7 +82,7 @@
 
     identity_test_env_adaptor_ =
         std::make_unique<IdentityTestEnvironmentProfileAdaptor>(profile());
-  };
+  }
 
   void TearDown() override {
     if (downloader_)
diff --git a/chrome/browser/profiles/profile_downloader_unittest.cc b/chrome/browser/profiles/profile_downloader_unittest.cc
index 08f8f95..d339d30 100644
--- a/chrome/browser/profiles/profile_downloader_unittest.cc
+++ b/chrome/browser/profiles/profile_downloader_unittest.cc
@@ -68,10 +68,10 @@
     identity_test_env_->identity_manager()->RemoveDiagnosticsObserver(this);
   }
 
-  bool NeedsProfilePicture() const override { return true; };
-  int GetDesiredImageSideLength() const override { return 128; };
-  std::string GetCachedPictureURL() const override { return ""; };
-  Profile* GetBrowserProfile() override { return profile_.get(); };
+  bool NeedsProfilePicture() const override { return true; }
+  int GetDesiredImageSideLength() const override { return 128; }
+  std::string GetCachedPictureURL() const override { return ""; }
+  Profile* GetBrowserProfile() override { return profile_.get(); }
   bool IsPreSignin() const override { return false; }
   void OnProfileDownloadSuccess(ProfileDownloader* downloader) override {
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 0375a66..8d9616e 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -53,6 +53,7 @@
 #include "chrome/browser/renderer_context_menu/spelling_menu_observer.h"
 #include "chrome/browser/search/search.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
 #include "chrome/browser/spellchecker/spellcheck_service.h"
 #include "chrome/browser/translate/chrome_translate_client.h"
 #include "chrome/browser/translate/translate_service.h"
@@ -99,7 +100,6 @@
 #include "components/spellcheck/common/spellcheck_common.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
 #include "components/strings/grit/components_strings.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/translate/core/browser/translate_download_manager.h"
 #include "components/translate/core/browser/translate_manager.h"
 #include "components/translate/core/browser/translate_prefs.h"
@@ -1358,7 +1358,8 @@
                                   IDS_CONTENT_CONTEXT_SAVEPAGEAS);
   menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT);
   AppendMediaRouterItem();
-  if (base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
+
+  if (send_tab_to_self::ShouldOfferFeature(GetBrowser())) {
     menu_model_.AddItemWithStringId(IDC_SEND_TO_MY_DEVICES,
                                     IDS_CONTENT_CONTEXT_SEND_TO_MY_DEVICES);
   }
diff --git a/chrome/browser/resources/app_management/BUILD.gn b/chrome/browser/resources/app_management/BUILD.gn
index 8193a52..d08ea2c 100644
--- a/chrome/browser/resources/app_management/BUILD.gn
+++ b/chrome/browser/resources/app_management/BUILD.gn
@@ -12,6 +12,7 @@
       ":api_listener",
       ":app",
       ":app_item",
+      ":arc_permission_view",
       ":browser_proxy",
       ":chrome_app_permission_view",
       ":constants",
@@ -52,6 +53,7 @@
   js_library("app") {
     deps = [
       ":actions",
+      ":arc_permission_view",
       ":browser_proxy",
       ":constants",
       ":dom_switch",
@@ -75,6 +77,17 @@
     ]
   }
 
+  js_library("arc_permission_view") {
+    deps = [
+      ":constants",
+      ":fake_page_handler",
+      ":metadata_view",
+      ":permission_item",
+      ":permission_view_header",
+      ":store_client",
+    ]
+  }
+
   js_library("browser_proxy") {
     deps = [
       ":fake_page_handler",
@@ -131,8 +144,10 @@
   js_library("notifications_view") {
     deps = [
       ":app_item",
+      ":constants",
       ":fake_page_handler",
       ":store_client",
+      ":util",
     ]
   }
 
diff --git a/chrome/browser/resources/app_management/app.html b/chrome/browser/resources/app_management/app.html
index b9d948e..c8c1ac4 100644
--- a/chrome/browser/resources/app_management/app.html
+++ b/chrome/browser/resources/app_management/app.html
@@ -1,6 +1,7 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="actions.html">
+<link rel="import" href="arc_permission_view.html">
 <link rel="import" href="browser_proxy.html">
 <link rel="import" href="chrome_app_permission_view.html">
 <link rel="import" href="dom_switch.html">
@@ -44,6 +45,8 @@
         <app-management-chrome-app-permission-view
             route-id="chrome-app-permission-view">
         </app-management-chrome-app-permission-view>
+        <app-management-arc-permission-view route-id="arc-permission-view">
+        </app-management-arc-permission-view>
         <app-management-search-view route-id="search-view">
         </app-management-search-view>
       </template>
diff --git a/chrome/browser/resources/app_management/app.js b/chrome/browser/resources/app_management/app.js
index f2e30a0..9791928 100644
--- a/chrome/browser/resources/app_management/app.js
+++ b/chrome/browser/resources/app_management/app.js
@@ -61,14 +61,16 @@
         return 'search-view';
 
       case (PageType.DETAIL):
-        const state = app_management.Store.getInstance().data;
+        const state = this.getState();
         const selectedAppType =
-            state.apps[state.currentPage.selectedAppId].type;
+            state.apps[assert(state.currentPage.selectedAppId)].type;
         switch (selectedAppType) {
           case (AppType.kWeb):
             return 'pwa-permission-view';
           case (AppType.kExtension):
             return 'chrome-app-permission-view';
+          case (AppType.kArc):
+            return 'arc-permission-view';
           default:
             assertNotReached();
         }
diff --git a/chrome/browser/resources/app_management/arc_permission_view.html b/chrome/browser/resources/app_management/arc_permission_view.html
new file mode 100644
index 0000000..496f068
--- /dev/null
+++ b/chrome/browser/resources/app_management/arc_permission_view.html
@@ -0,0 +1,84 @@
+<link rel="import" href="chrome://resources/html/polymer.html">
+
+<link rel="import" href="browser_proxy.html">
+<link rel="import" href="metadata_view.html">
+<link rel="import" href="permission_item.html">
+<link rel="import" href="permission_view_header.html">
+<link rel="import" href="shared_style.html">
+<link rel="import" href="store_client.html">
+<link rel="import" href="chrome://resources/cr_elements/cr_toggle/cr_toggle.html">
+<link rel="import" href="chrome://resources/cr_elements/icons.html">
+<link rel="import" href="chrome://resources/cr_elements/paper_button_style_css.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-collapse/iron-collapse.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button-light.html">
+
+<dom-module id="app-management-arc-permission-view">
+  <template>
+    <style include="app-management-shared-css paper-button-style">
+    </style>
+
+    <app-management-permission-view-header>
+      <div slot="extra-right-buttons" class="extra-permission-header-button">
+        <paper-button class="native-settings-button secondary-text"
+            on-click="onClickNativeSettingsButton_">
+          $i18n{openAndroidSettings}
+          <paper-icon-button-light class="native-settings-icon icon-external">
+            <button></button>
+          </paper-icon-button-light>
+        </paper-button>
+      </div>
+    </app-management-permission-view-header>
+
+<!--TODO(crbug.com/906508): Factor the expandable card into a separate
+    element. -->
+    <div class="permission-list card-container">
+<!--  TODO(rekanorman): Uncomment once notifications permissions are
+      implemented for ARCs. -->
+<!--  <app-management-permission-item
+        class="permission-card-row separated-row header-text"
+        permission-label="$i18n{notifications}"
+        permission-type="NOTIFICATIONS">
+      </app-management-permission-item> -->
+      <div class="permission-card-row">
+        <div class="subpermission-list">
+          <div class="subpermission-row separated-row"
+              on-click="toggleListExpanded_">
+            <div class="header-text">$i18n{permissions}</div>
+            <div class="permission-row-controls">
+              <paper-icon-button-light>
+                <button>
+                  <iron-icon icon="[[getCollapsedIcon_(listExpanded_)]]">
+                  </iron-icon>
+                </button>
+              </paper-icon-button-light>
+            </div>
+          </div>
+
+          <iron-collapse opened="[[listExpanded_]]">
+            <app-management-permission-item
+                class="subpermission-row"
+                icon="cr:location-on"
+                permission-label="$i18n{location}"
+                permission-type="LOCATION">
+            </app-management-permission-item>
+            <app-management-permission-item
+                class="subpermission-row"
+                icon="cr:videocam"
+                permission-label="$i18n{camera}"
+                permission-type="CAMERA">
+            </app-management-permission-item>
+            <app-management-permission-item
+                class="subpermission-row"
+                icon="cr:mic"
+                permission-label="$i18n{microphone}"
+                permission-type="MICROPHONE">
+            </app-management-permission-item>
+          </iron-collapse>
+        </div>
+      </div>
+    </div>
+    <app-management-metadata-view></app-management-metadata-view>
+  </template>
+  <script src="arc_permission_view.js"></script>
+</dom-module>
diff --git a/chrome/browser/resources/app_management/arc_permission_view.js b/chrome/browser/resources/app_management/arc_permission_view.js
new file mode 100644
index 0000000..b361425
--- /dev/null
+++ b/chrome/browser/resources/app_management/arc_permission_view.js
@@ -0,0 +1,62 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+Polymer({
+  is: 'app-management-arc-permission-view',
+
+  behaviors: [
+    app_management.StoreClient,
+  ],
+
+  properties: {
+    /**
+     * @private {App}
+     */
+    app_: Object,
+
+    /**
+     * @private {boolean}
+     */
+    listExpanded_: {
+      type: Boolean,
+      value: false,
+    },
+  },
+
+  attached: function() {
+    this.watch('app_', state => app_management.util.getSelectedApp(state));
+    this.updateFromStore();
+
+    this.listExpanded_ = false;
+  },
+
+  onClickNativeSettingsButton_: function() {
+    app_management.BrowserProxy.getInstance().handler.openNativeSettings(
+        this.app_.id);
+  },
+
+  /**
+   * @private
+   */
+  toggleListExpanded_: function() {
+    this.listExpanded_ = !this.listExpanded_;
+  },
+
+  /**
+   * @param {App} app
+   * @return {string}
+   * @private
+   */
+  iconUrlFromId_: function(app) {
+    return app_management.util.getAppIcon(app);
+  },
+
+  /**
+   * @param {boolean} listExpanded
+   * @return {string}
+   * @private
+   */
+  getCollapsedIcon_: function(listExpanded) {
+    return listExpanded ? 'cr:expand-less' : 'cr:expand-more';
+  },
+});
diff --git a/chrome/browser/resources/app_management/browser_proxy.js b/chrome/browser/resources/app_management/browser_proxy.js
index b9d030cc..1d0d4db 100644
--- a/chrome/browser/resources/app_management/browser_proxy.js
+++ b/chrome/browser/resources/app_management/browser_proxy.js
@@ -23,9 +23,10 @@
               'ahfgeienlihckogmohjhadlkjgocpleb', {title: 'Web Store'}),
           app_management.FakePageHandler.createApp(
               'aohghmighlieiainnegkcijnfilokake',
-              {title: 'Docs', type: apps.mojom.AppType.kExtension}),
+              {title: 'Docs', type: AppType.kArc}),
           app_management.FakePageHandler.createApp(
-              'blpcfgokakmgnkcojhhkbfbldkacnbeo', {title: 'Youtube'}),
+              'blpcfgokakmgnkcojhhkbfbldkacnbeo',
+              {title: 'Youtube', type: AppType.kCrostini}),
           app_management.FakePageHandler.createApp(
               'pjkljhegncpnkpknbcohdijeoejaedia', {title: 'Gmail'}),
           app_management.FakePageHandler.createApp(
diff --git a/chrome/browser/resources/app_management/chrome_app_permission_view.html b/chrome/browser/resources/app_management/chrome_app_permission_view.html
index b79cf5b..92c891c 100644
--- a/chrome/browser/resources/app_management/chrome_app_permission_view.html
+++ b/chrome/browser/resources/app_management/chrome_app_permission_view.html
@@ -57,7 +57,7 @@
         </ul>
       </div>
     </div>
-    <app-management-metadata-view app="[[app_]]"></app-management-metadata-view>
+    <app-management-metadata-view></app-management-metadata-view>
   </template>
   <script src="chrome_app_permission_view.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/app_management/constants.js b/chrome/browser/resources/app_management/constants.js
index a461221d..c742c12 100644
--- a/chrome/browser/resources/app_management/constants.js
+++ b/chrome/browser/resources/app_management/constants.js
@@ -39,6 +39,8 @@
 
 const PwaPermissionType = appManagement.mojom.PwaPermissionType;
 
+const ArcPermissionType = appManagement.mojom.ArcPermissionType;
+
 const AppType = apps.mojom.AppType;
 
 const PermissionValueType = apps.mojom.PermissionValueType;
diff --git a/chrome/browser/resources/app_management/fake_page_handler.js b/chrome/browser/resources/app_management/fake_page_handler.js
index b7b90aa4..3a672d50 100644
--- a/chrome/browser/resources/app_management/fake_page_handler.js
+++ b/chrome/browser/resources/app_management/fake_page_handler.js
@@ -8,29 +8,9 @@
    */
   class FakePageHandler {
     /**
-     * @param {number} permissionId
-     * @param {Object=} optConfig
-     * @return {!Permission}
+     * @return {!Object<number, Permission>}
      */
-    static createPermission(permissionId, optConfig) {
-      // Changing to kAllow to test notifications sublabel collapsibility, as it
-      // assumes all apps have notification permission.
-      const permission = app_management.util.createPermission(
-          permissionId, PermissionValueType.kTriState, TriState.kAllow);
-
-      if (optConfig) {
-        Object.assign(permission, optConfig);
-      }
-
-      return permission;
-    }
-
-    /**
-     * @param {string} id
-     * @param {Object=} optConfig
-     * @return {!App}
-     */
-    static createApp(id, optConfig) {
+    static createWebPermissions() {
       const permissionIds = [
         PwaPermissionType.CONTENT_SETTINGS_TYPE_GEOLOCATION,
         PwaPermissionType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
@@ -40,10 +20,55 @@
 
       const permissions = {};
 
-      for (const type of permissionIds) {
-        permissions[type] = FakePageHandler.createPermission(type);
+      for (const permissionId of permissionIds) {
+        permissions[permissionId] = app_management.util.createPermission(
+            permissionId, PermissionValueType.kTriState, TriState.kAllow);
       }
 
+      return permissions;
+    }
+
+    /**
+     * @return {!Object<number, Permission>}
+     */
+    static createArcPermissions() {
+      const permissionIds = [
+        ArcPermissionType.CAMERA,
+        ArcPermissionType.LOCATION,
+        ArcPermissionType.MICROPHONE,
+      ];
+
+      const permissions = {};
+
+      for (const permissionId of permissionIds) {
+        permissions[permissionId] = app_management.util.createPermission(
+            permissionId, PermissionValueType.kBool, Bool.kTrue);
+      }
+
+      return permissions;
+    }
+
+    /**
+     * @param {AppType} appType
+     * @return {!Object<number, Permission>}
+     */
+    static createPermissions(appType) {
+      switch (appType) {
+        case (AppType.kWeb):
+          return FakePageHandler.createWebPermissions();
+        case (AppType.kArc):
+          return FakePageHandler.createArcPermissions();
+        default:
+          return {};
+      }
+    }
+
+    /**
+     * @param {string} id
+     * @param {Object=} optConfig
+     * @return {!App}
+     */
+    static createApp(id, optConfig) {
       const app = {
         id: id,
         type: apps.mojom.AppType.kWeb,
@@ -52,13 +77,18 @@
         version: '5.1',
         size: '9.0MB',
         isPinned: apps.mojom.OptionalBool.kFalse,
-        permissions: permissions,
+        permissions: {},
       };
 
       if (optConfig) {
         Object.assign(app, optConfig);
       }
 
+      // Only create default permissions if none were provided in the config.
+      if (!optConfig || optConfig.permissions === undefined) {
+        app.permissions = FakePageHandler.createPermissions(app.type);
+      }
+
       return app;
     }
 
@@ -84,6 +114,7 @@
     async getExtensionAppPermissionMessages(appId) {
       return [];
     }
+
     /**
      * @param {!Array<App>} appList
      */
diff --git a/chrome/browser/resources/app_management/metadata_view.html b/chrome/browser/resources/app_management/metadata_view.html
index 9ca5003..543f983 100644
--- a/chrome/browser/resources/app_management/metadata_view.html
+++ b/chrome/browser/resources/app_management/metadata_view.html
@@ -2,6 +2,7 @@
 
 <link rel="import" href="browser_proxy.html">
 <link rel="import" href="shared_style.html">
+<link rel="import" href="store_client.html">
 
 <dom-module id="app-management-metadata-view">
   <template>
diff --git a/chrome/browser/resources/app_management/notifications_view.html b/chrome/browser/resources/app_management/notifications_view.html
index ae66705a..db3a8f2 100644
--- a/chrome/browser/resources/app_management/notifications_view.html
+++ b/chrome/browser/resources/app_management/notifications_view.html
@@ -49,7 +49,7 @@
         <app-management-app-item app="[[item]]">
           <app-management-permission-toggle slot="right-content"
               app="[[item]]"
-              permission-type="CONTENT_SETTINGS_TYPE_NOTIFICATIONS">
+              permission-type="[[notificationsPermissionType_(item)]]">
           </app-management-permission-toggle>
         </app-management-app-item>
       </template>
@@ -59,7 +59,7 @@
           <app-management-app-item app="[[item]]">
             <app-management-permission-toggle slot="right-content"
                 app="[[item]]"
-                permission-type="CONTENT_SETTINGS_TYPE_NOTIFICATIONS">
+                permission-type="[[notificationsPermissionType_(item)]]">
             </app-management-permission-toggle>
           </app-management-app-item>
         </template>
diff --git a/chrome/browser/resources/app_management/notifications_view.js b/chrome/browser/resources/app_management/notifications_view.js
index f1ebef8..1665fbf 100644
--- a/chrome/browser/resources/app_management/notifications_view.js
+++ b/chrome/browser/resources/app_management/notifications_view.js
@@ -11,16 +11,27 @@
 
   properties: {
     /**
+     * @private {AppMap}
+     */
+    apps_: {
+      type: Object,
+      observer: 'onAppsChanged_',
+    },
+
+    /**
      * List of apps with notification permission
      * displayed before expanding the app list.
-     * @private {Array<App>}
+     * @private {!Array<App>}
      */
-    displayedApps_: Array,
+    displayedApps_: {
+      type: Array,
+      value: () => [],
+    },
 
     /**
      * List of apps without notification permission
      * displayed after expanding app list.
-     * @private {Array<App>}
+     * @private {!Array<App>}
      */
     collapsedApps_: {
       type: Array,
@@ -34,22 +45,12 @@
       type: Boolean,
       value: false,
     },
-
-    /**
-     * A boolean to identify whether current page is notifications view so that
-     * apps' list only get updated when page refreshed.
-     * @private {boolean}
-     */
-    notificationsViewSelected_: {
-      type: Boolean,
-      observer: 'onViewChanged_',
-    },
   },
 
   attached: function() {
-    this.watch('notificationsViewSelected_', (state) => {
-      return app_management.util.isNotificationsViewSelected(state);
-    });
+    this.onViewLoaded_();
+
+    this.watch('apps_', state => state.apps);
     this.updateFromStore();
   },
 
@@ -59,7 +60,7 @@
    * expanding.
    * @private
    */
-  onViewChanged_: function() {
+  onViewLoaded_: function() {
     [this.displayedApps_, this.collapsedApps_] =
         app_management.util.splitByNotificationPermission();
     if (this.displayedApps_.length === 0) {
@@ -70,6 +71,57 @@
   },
 
   /**
+   * Updates the lists of displayed and collapsed apps when any changes occur
+   * to the apps in the Store, maintaining the original order of apps in the
+   * lists. New lists are created so that Polymer bindings will re-evaluate.
+   * @private
+   */
+  onAppsChanged_() {
+    const unhandledAppIds = new Set(Object.keys(this.apps_));
+    this.displayedApps_ =
+        this.updateAppList_(this.displayedApps_, unhandledAppIds);
+    this.collapsedApps_ =
+        this.updateAppList_(this.collapsedApps_, unhandledAppIds);
+
+    // If any new apps have been added, append them to the appropriate list.
+    for (const appId of unhandledAppIds) {
+      const app = this.apps_[appId];
+      switch (app_management.util.notificationsValue(app)) {
+        case OptionalBool.kUnknown:
+          break;
+        case OptionalBool.kFalse:
+          this.collapsedApps_.push(app);
+          break;
+        case OptionalBool.kTrue:
+          this.displayedApps_.push(app);
+          break;
+        default:
+          assertNotReached();
+      }
+    }
+  },
+
+  /**
+   * Creates a new list of apps with the same order as the original appList,
+   * but using the updated apps from this.apps_. As each app is added to the
+   * new list, it is also removed from the unhandledAppIds set.
+   * @param {!Array<App>} appList
+   * @param {!Set<string>} unhandledAppIds
+   * @return {!Array<App>}
+   * @private
+   */
+  updateAppList_(appList, unhandledAppIds) {
+    const newApps = [];
+    for (const app of appList) {
+      if (unhandledAppIds.has(app.id)) {
+        newApps.push(this.apps_[app.id]);
+        unhandledAppIds.delete(app.id);
+      }
+    }
+    return newApps;
+  },
+
+  /**
    * @param {boolean} listExpanded
    * @param {Array<App>} collapsedApps
    * @return {string}
@@ -108,7 +160,6 @@
   },
 
   /**
-   * TODO(rekanorman) Make this function work for other apps.
    * Returns a boolean representation of the permission value, which used to
    * determine the position of the permission toggle.
    * @param {App} app
@@ -117,6 +168,15 @@
    */
   getNotificationValueBool_: function(app) {
     return app_management.util.getPermissionValueBool(
-        app, 'CONTENT_SETTINGS_TYPE_NOTIFICATIONS');
+        app, this.notificationsPermissionType(app));
+  },
+
+  /**
+   * @param {App} app
+   * @return {string}
+   * @private
+   */
+  notificationsPermissionType_: function(app) {
+    return assert(app_management.util.notificationsPermissionType(app));
   },
 });
diff --git a/chrome/browser/resources/app_management/permission_item.js b/chrome/browser/resources/app_management/permission_item.js
index ae87966..c0664f01 100644
--- a/chrome/browser/resources/app_management/permission_item.js
+++ b/chrome/browser/resources/app_management/permission_item.js
@@ -16,8 +16,9 @@
     permissionLabel: String,
 
     /**
-     * A string version of the permission type, corresponding to a value of
-     * the PwaPermissionType enum.
+     * A string version of the permission type. Must be a value of the
+     * permission type enum corresponding to the AppType of app_.
+     * E.g. A value of PwaPermissionType if app_.type === AppType.kWeb.
      * @type {string}
      */
     permissionType: String,
@@ -27,7 +28,9 @@
      */
     app_: Object,
 
-    /** @type {string} */
+    /**
+     * @type {string}
+     */
     icon: String,
   },
 
diff --git a/chrome/browser/resources/app_management/permission_toggle.js b/chrome/browser/resources/app_management/permission_toggle.js
index 826b3a8..3d60d26f 100644
--- a/chrome/browser/resources/app_management/permission_toggle.js
+++ b/chrome/browser/resources/app_management/permission_toggle.js
@@ -11,21 +11,26 @@
     app: Object,
 
     /**
-     * TODO(rekanorman) Change the annotation when app type can be correctly
-     * sent.
-     * A string version of the permission type, corresponding to a value of
-     * the PwaPermissionType enum.
+     * A string version of the permission type. Must be a value of the
+     * permission type enum corresponding to the AppType of app_.
+     * E.g. A value of PwaPermissionType if app_.type === AppType.kWeb.
      * @type {string}
      */
     permissionType: String,
   },
 
   /**
-   * @param {String} appId
+   * @param {App} app
    * @param {string} permissionType
    * @return {boolean}
    */
   getPermissionValueBool_: function(app, permissionType) {
+    if (app === undefined || permissionType === undefined) {
+      return false;
+    }
+
+    assert(app);
+
     return app_management.util.getPermissionValueBool(app, permissionType);
   },
 
@@ -33,10 +38,13 @@
    * @private
    */
   togglePermission_: function() {
+    assert(this.app);
+
     /** @type {!Permission} */
     let newPermission;
 
-    switch (app_management.util.getPermissionValueType(this.app)) {
+    switch (app_management.util.getPermission(this.app, this.permissionType)
+                .valueType) {
       case PermissionValueType.kBool:
         newPermission =
             this.getNewPermissionBoolean_(this.app, this.permissionType);
@@ -54,16 +62,16 @@
   },
 
   /**
-   * @private
    * @param {App} app
    * @param {string} permissionType
    * @return {!Permission}
+   * @private
    */
   getNewPermissionBoolean_: function(app, permissionType) {
     /** @type {number} */
     let newPermissionValue;
 
-    switch (app_management.util.getPermissionValue(app, permissionType)) {
+    switch (app_management.util.getPermission(app, permissionType).value) {
       case Bool.kFalse:
         newPermissionValue = Bool.kTrue;
         break;
@@ -75,20 +83,20 @@
     }
 
     return app_management.util.createPermission(
-        PwaPermissionType[permissionType], PermissionValueType.kBool,
-        newPermissionValue);
+        app_management.util.permissionTypeHandle(app, permissionType),
+        PermissionValueType.kBool, newPermissionValue);
   },
 
   /**
    * @param {App} app
    * @param {string} permissionType
-   * @private
    * @return {!Permission}
+   * @private
    */
   getNewPermissionTriState_: function(app, permissionType) {
     let newPermissionValue;
 
-    switch (app_management.util.getPermissionValue(app, permissionType)) {
+    switch (app_management.util.getPermission(app, permissionType).value) {
       case TriState.kBlock:
         newPermissionValue = TriState.kAllow;
         break;
@@ -107,7 +115,7 @@
     }
 
     return app_management.util.createPermission(
-        PwaPermissionType[permissionType], PermissionValueType.kTriState,
-        newPermissionValue);
+        app_management.util.permissionTypeHandle(app, permissionType),
+        PermissionValueType.kTriState, newPermissionValue);
   },
 });
diff --git a/chrome/browser/resources/app_management/pwa_permission_view.html b/chrome/browser/resources/app_management/pwa_permission_view.html
index 95139ce..286a30e 100644
--- a/chrome/browser/resources/app_management/pwa_permission_view.html
+++ b/chrome/browser/resources/app_management/pwa_permission_view.html
@@ -16,71 +16,29 @@
 <dom-module id="app-management-pwa-permission-view">
   <template>
     <style include="app-management-shared-css paper-button-style">
-    #permission-list {
-      display: flex;
-      flex-direction: column;
-    }
-
-    .control-divider {
-      background: var(--control-separator-color);
-      height: 24px;
-      margin: 0 24px;
-      width: 1px;
-    }
-
-    #site-settings-button {
-      --paper-button-ink-color: none;
-      border: none;
-      display: flex;
-      font-size: 12px;
-    }
-
-    #site-settings-icon {
-      display: flex;
-      margin-inline-start: 0;
-    }
-
-    .subpermission-row {
-      height: 48px;
-    }
-
-    #subpermission-list {
-      align-items: stretch;
-      display: flex;
-      flex-direction: column;
-      padding: 8px 0;
-    }
-
-    #permission-list > * {
-      flex: 0 0 var(--permission-list-item-height);
-    }
-
-    #extra-button {
-      margin-inline-end: 16px;
-    }
     </style>
+
     <app-management-permission-view-header>
-      <div slot="extra-right-buttons" id="extra-button">
-        <paper-button id="site-settings-button"
-            class="secondary-text"
+      <div slot="extra-right-buttons" class="extra-permission-header-button">
+        <paper-button class="native-settings-button secondary-text"
             on-click="onClickSiteSettingsButton_">
           $i18n{openSiteSettings}
-          <paper-icon-button-light id="site-settings-icon"
-              class="icon-external">
+          <paper-icon-button-light class="native-settings-icon icon-external">
             <button></button>
           </paper-icon-button-light>
         </paper-button>
       </div>
     </app-management-permission-view-header>
 
-    <div id="permission-list" class="card-container">
+    <div class="permission-list card-container">
       <app-management-permission-item
+        id="notifications"
         class="permission-card-row separated-row header-text"
         permission-label="$i18n{notifications}"
         permission-type="CONTENT_SETTINGS_TYPE_NOTIFICATIONS">
       </app-management-permission-item>
       <div class="permission-card-row">
-        <div id="subpermission-list">
+        <div class="subpermission-list">
           <div class="subpermission-row separated-row"
               on-click="toggleListExpanded_">
             <div class="header-text">$i18n{permissions}</div>
@@ -91,25 +49,26 @@
                   </iron-icon>
                 </button>
               </paper-icon-button-light>
-              <div class="control-divider"></div>
-              <cr-toggle class="left-separated-control"></cr-toggle>
             </div>
           </div>
 
           <iron-collapse opened="[[listExpanded_]]">
             <app-management-permission-item
+                id="location"
                 class="subpermission-row"
                 icon="cr:location-on"
                 permission-label="$i18n{location}"
                 permission-type="CONTENT_SETTINGS_TYPE_GEOLOCATION">
             </app-management-permission-item>
             <app-management-permission-item
+                id="camera"
                 class="subpermission-row"
                 icon="cr:videocam"
                 permission-label="$i18n{camera}"
                 permission-type="CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA">
             </app-management-permission-item>
             <app-management-permission-item
+                id="microphone"
                 class="subpermission-row"
                 icon="cr:mic"
                 permission-label="$i18n{microphone}"
@@ -119,7 +78,7 @@
         </div>
       </div>
     </div>
-    <app-management-metadata-view app="[[app_]]"></app-management-metadata-view>
+    <app-management-metadata-view></app-management-metadata-view>
   </template>
   <script src="pwa_permission_view.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/app_management/pwa_permission_view.js b/chrome/browser/resources/app_management/pwa_permission_view.js
index ab676853..77790af 100644
--- a/chrome/browser/resources/app_management/pwa_permission_view.js
+++ b/chrome/browser/resources/app_management/pwa_permission_view.js
@@ -26,6 +26,8 @@
   attached: function() {
     this.watch('app_', state => app_management.util.getSelectedApp(state));
     this.updateFromStore();
+
+    this.listExpanded_ = false;
   },
 
   onClickSiteSettingsButton_: function() {
diff --git a/chrome/browser/resources/app_management/shared_style.html b/chrome/browser/resources/app_management/shared_style.html
index 1ac777ba..7cfc0a8 100644
--- a/chrome/browser/resources/app_management/shared_style.html
+++ b/chrome/browser/resources/app_management/shared_style.html
@@ -41,6 +41,42 @@
         display: inline-flex;
       }
 
+      .permission-list {
+        display: flex;
+        flex-direction: column;
+      }
+
+      .permission-list > * {
+        flex: 0 0 var(--permission-list-item-height);
+      }
+
+      .extra-permission-header-button {
+        margin-inline-end: 16px;
+      }
+
+      .native-settings-button {
+        --paper-button-ink-color: none;
+        border: none;
+        display: flex;
+        font-size: 12px;
+      }
+
+      .native-settings-icon {
+        display: flex;
+        margin-inline-start: 0;
+      }
+
+      .subpermission-row {
+        height: 48px;
+      }
+
+      .subpermission-list {
+        align-items: stretch;
+        display: flex;
+        flex-direction: column;
+        padding: 8px 0;
+      }
+
       .secondary-text {
         color: var(--secondary-text-color);
         font-weight: var(--secondary-font-weight);
diff --git a/chrome/browser/resources/app_management/util.js b/chrome/browser/resources/app_management/util.js
index fc8e56ff..98aee48 100644
--- a/chrome/browser/resources/app_management/util.js
+++ b/chrome/browser/resources/app_management/util.js
@@ -61,101 +61,119 @@
   }
 
   /**
-   * Returns true if the current page is notification view.
-   * @param {AppManagementPageState} state
-   * @return {boolean}
-   */
-  function isNotificationsViewSelected(state) {
-    return state.currentPage.pageType === PageType.NOTIFICATIONS;
-  }
-
-  /**
-   * @return {!Array<Array<App>>}
+   * @return {!Array<!Array<App>>}
    */
   function splitByNotificationPermission() {
     const apps = Object.values(app_management.Store.getInstance().data.apps);
     const notificationsAllowed = [];
     const notificationsBlocked = [];
+
     for (const app of apps) {
-      // Chrome app's notification permission cannot be changed and therefore
-      // are not included in notification view
-      if (app.type === AppType.kExtension) {
-        continue;
-      }
-      // TODO(rekanorman) Branch on different app type in the future.
-      if (getPermissionValueBool(app, 'CONTENT_SETTINGS_TYPE_NOTIFICATIONS')) {
-        notificationsAllowed.push(app);
-      } else {
-        notificationsBlocked.push(app);
+      switch (notificationsValue(app)) {
+        case OptionalBool.kUnknown:
+          break;
+        case OptionalBool.kFalse:
+          notificationsBlocked.push(app);
+          break;
+        case OptionalBool.kTrue:
+          notificationsAllowed.push(app);
+          break;
+        default:
+          assertNotReached();
       }
     }
+
     return [notificationsAllowed, notificationsBlocked];
   }
 
+
+  /**
+   * @param {App} app
+   * @return {OptionalBool}
+   */
+  function notificationsValue(app) {
+    const permissionType = notificationsPermissionType(app);
+
+    if (!permissionType) {
+      return OptionalBool.kUnknown;
+    }
+
+    if (getPermissionValueBool(app, permissionType)) {
+      return OptionalBool.kTrue;
+    } else {
+      return OptionalBool.kFalse;
+    }
+  }
+
+  /**
+   * Returns a string corresponding to the notifications value of the
+   * appropriate permission type enum, based on the type of the app.
+   * Returns null if the app type doesn't have a notifications permission.
+   * @param {App} app
+   * @return {?string}
+   */
+  function notificationsPermissionType(app) {
+    switch (app.type) {
+      case AppType.kWeb:
+        return 'CONTENT_SETTINGS_TYPE_NOTIFICATIONS';
+      // TODO(rekanorman): Add another case once notifications permissions
+      // are implemented for ARC.
+      default:
+        return null;
+    }
+  }
+
   /**
    * @param {App} app
    * @param {string} permissionType
    * @return {boolean}
    */
   function getPermissionValueBool(app, permissionType) {
-    if (getPermissionValueType(app) === PermissionValueType.kBool &&
-        getPermissionValue(app, permissionType) === Bool.kTrue) {
-      return true;
-    }
-    if (getPermissionValueType(app) === PermissionValueType.kTriState &&
-        getPermissionValue(app, permissionType) === TriState.kAllow) {
-      return true;
-    }
-    return false;
-  }
+    const permission = getPermission(app, permissionType);
+    assert(permission);
 
-  /**
-   * @param {App} app
-   * @return {number}
-   * @private
-   */
-  function getPermissionValueType(app) {
-    // TODO(rekanorman): Change to a suitable conditional statement once the
-    // PermissionValueType corresponding to each AppType is known.
-    return PermissionValueType.kTriState;
+    switch (permission.valueType) {
+      case PermissionValueType.kBool:
+        return permission.value === Bool.kTrue;
+      case PermissionValueType.kTriState:
+        return permission.value === TriState.kAllow;
+      default:
+        assertNotReached();
+    }
   }
 
-
   /**
    * @param {App} app
    * @param {string} permissionType
-   * @return {?number}
-   * @private
+   * @return {Permission}
    */
-  function getPermissionValue(app, permissionType) {
-    if (!app) {
-      return null;
-    }
-
-    // TODO(rekanorman): Remove once permissions are implemented for all
-    // app types.
-    if (Object.keys(app.permissions).length === 0) {
-      return null;
-    }
-
-    // TODO(rekanorman): Make generic once permissions are implemented for
-    // other app types.
-    return /** @type Object<number, Permission> */ (
-               app.permissions)[PwaPermissionType[permissionType]]
-        .value;
+  function getPermission(app, permissionType) {
+    return app.permissions[permissionTypeHandle(app, permissionType)];
   }
 
   /**
-   * If there is no selected app, returns undefined so that Polymer bindings
-   * won't be updated.
+   * @param {App} app
+   * @param {string} permissionType
+   * @return {number}
+   */
+  function permissionTypeHandle(app, permissionType) {
+    switch (app.type) {
+      case AppType.kWeb:
+        return PwaPermissionType[permissionType];
+      case AppType.kArc:
+        return ArcPermissionType[permissionType];
+      default:
+        assertNotReached();
+    }
+  }
+
+  /**
    * @param {AppManagementPageState} state
-   * @return {App|undefined}
+   * @return {?App}
    */
   function getSelectedApp(state) {
     const selectedAppId = state.currentPage.selectedAppId;
-    if (selectedAppId) {
-      return state.apps[selectedAppId];
-    }
+    return selectedAppId ? state.apps[selectedAppId] : null;
   }
 
   return {
@@ -163,11 +181,12 @@
     createInitialState: createInitialState,
     createPermission: createPermission,
     getAppIcon: getAppIcon,
-    getPermissionValue: getPermissionValue,
+    getPermission: getPermission,
     getPermissionValueBool: getPermissionValueBool,
-    getPermissionValueType: getPermissionValueType,
     getSelectedApp: getSelectedApp,
-    isNotificationsViewSelected: isNotificationsViewSelected,
+    notificationsPermissionType: notificationsPermissionType,
+    notificationsValue: notificationsValue,
+    permissionTypeHandle: permissionTypeHandle,
     splitByNotificationPermission: splitByNotificationPermission,
   };
 });
diff --git a/chrome/browser/resources/chromeos/login/login.js b/chrome/browser/resources/chromeos/login/login.js
deleted file mode 100644
index 6f6908d7..0000000
--- a/chrome/browser/resources/chromeos/login/login.js
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2012 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.
-
-/**
- * @fileoverview Login UI based on a stripped down OOBE controller.
- */
-
-var isMd = false;
-
-// <include src="login_shared.js">
-// <include src="login_non_lock_shared.js">
-// <include src="notification_card.js">
-
-/**
- * Ensures that the pin keyboard is loaded.
- * @param {object} onLoaded Callback executed when the pin keyboard is loaded.
- */
-function ensurePinKeyboardLoaded(onLoaded) {
-  'use strict';
-
-  // Wait a frame before running |onLoaded| to avoid any visual glitches.
-  setTimeout(onLoaded);
-}
-
-cr.define('cr.ui.Oobe', function() {
-  return {
-    /**
-     * Initializes the OOBE flow.  This will cause all C++ handlers to
-     * be invoked to do final setup.
-     */
-    initialize: function() {
-      cr.ui.login.DisplayManager.initialize();
-      login.WrongHWIDScreen.register();
-      login.AccountPickerScreen.register();
-      login.GaiaSigninScreen.register();
-      login.UserImageScreen.register(/* lazyInit= */ true);
-      login.ResetScreen.register();
-      login.AutolaunchScreen.register();
-      login.KioskEnableScreen.register();
-      login.ErrorMessageScreen.register();
-      login.TPMErrorMessageScreen.register();
-      login.PasswordChangedScreen.register();
-      login.TermsOfServiceScreen.register();
-      login.SyncConsentScreen.register();
-      login.FingerprintSetupScreen.register();
-      login.ArcTermsOfServiceScreen.register();
-      login.RecommendAppsScreen.register();
-      login.AppDownloadingScreen.register();
-      login.AppLaunchSplashScreen.register();
-      login.ArcKioskSplashScreen.register();
-      login.ConfirmPasswordScreen.register();
-      login.FatalErrorScreen.register();
-      login.DeviceDisabledScreen.register();
-      login.UnrecoverableCryptohomeErrorScreen.register();
-      login.ActiveDirectoryPasswordChangeScreen.register(/* lazyInit= */ true);
-      login.EncryptionMigrationScreen.register();
-      login.SupervisionTransitionScreen.register();
-      login.UpdateRequiredScreen.register();
-      login.DemoSetupScreen.register();
-      login.DiscoverScreen.register();
-      login.MarketingOptInScreen.register();
-      login.AssistantOptInFlowScreen.register();
-      login.MultiDeviceSetupScreen.register();
-
-      cr.ui.Bubble.decorate($('bubble'));
-      login.HeaderBar.decorate($('login-header-bar'));
-
-      chrome.send('screenStateInitialize');
-    },
-
-    // Dummy Oobe functions not present with stripped login UI.
-    initializeA11yMenu: function(e) {},
-    handleAccessibilityLinkClick: function(e) {},
-    handleSpokenFeedbackClick: function(e) {},
-    handleHighContrastClick: function(e) {},
-    handleScreenMagnifierClick: function(e) {},
-    setUsageStats: function(checked) {},
-    setTpmPassword: function(password) {},
-    refreshA11yInfo: function(data) {},
-    reloadEulaContent: function(data) {},
-
-    /**
-     * Reloads content of the page.
-     * @param {!Object} data New dictionary with i18n values.
-     */
-    reloadContent: function(data) {
-      loadTimeData.overrideValues(data);
-      i18nTemplate.process(document, loadTimeData);
-      Oobe.getInstance().updateLocalizedContent_();
-    },
-
-    /**
-     * Updates "device in tablet mode" state when tablet mode is changed.
-     * @param {Boolean} isInTabletMode True when in tablet mode.
-     */
-    setTabletModeState: function(isInTabletMode) {
-      Oobe.getInstance().setTabletModeState_(isInTabletMode);
-    },
-
-    /**
-     * Updates OOBE configuration when it is loaded.
-     * @param {!OobeTypes.OobeConfiguration} configuration OOBE configuration.
-     */
-    updateOobeConfiguration: function(configuration) {
-      Oobe.getInstance().updateOobeConfiguration_(configuration);
-    },
-  };
-});
diff --git a/chrome/browser/resources/chromeos/login/md_header_bar.css b/chrome/browser/resources/chromeos/login/md_header_bar.css
index a6ab169..73bfaf3 100644
--- a/chrome/browser/resources/chromeos/login/md_header_bar.css
+++ b/chrome/browser/resources/chromeos/login/md_header_bar.css
@@ -15,11 +15,6 @@
   padding-top: 7px;
 }
 
-#login-header-bar.full-header-background {
-  background-color: #000;
-  border-top: 1px solid #000;
-}
-
 #login-header-bar.translucent-background {
   background-color: rgba(0, 0, 0, 0.9);
 }
diff --git a/chrome/browser/resources/chromeos/login/md_header_bar.html b/chrome/browser/resources/chromeos/login/md_header_bar.html
index 6bb8d4d..4b17f48 100644
--- a/chrome/browser/resources/chromeos/login/md_header_bar.html
+++ b/chrome/browser/resources/chromeos/login/md_header_bar.html
@@ -77,21 +77,6 @@
   </svg>
 </iron-iconset-svg>
 
-<iron-iconset-svg name="header-bar-48" size="48">
-  <svg>
-    <defs>
-      <g id="unlock-1x" fill-rule="evenodd">
-        <path d="M24 34c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm12-18h-2v-4c0-5.52-4.48-10-10-10S14 6.48 14 12h3.8c0-3.42 2.78-6.2 6.2-6.2 3.42 0 6.2 2.78 6.2 6.2v4H12c-2.21 0-4 1.79-4 4v20c0 2.21 1.79 4 4 4h24c2.21 0 4-1.79 4-4V20c0-2.21-1.79-4-4-4zm0 24H12V20h24v20z">
-        </path>
-      </g>
-      <g id="unlock-2x" fill-rule="evenodd">
-        <path d="M24 34c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm12-18h-2v-4c0-5.52-4.48-10-10-10S14 6.48 14 12h3.8c0-3.42 2.78-6.2 6.2-6.2 3.42 0 6.2 2.78 6.2 6.2v4H12c-2.21 0-4 1.79-4 4v20c0 2.21 1.79 4 4 4h24c2.21 0 4-1.79 4-4V20c0-2.21-1.79-4-4-4zm0 24H12V20h24v20z">
-        </path>
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
-
 <link rel="stylesheet" href="oobe_flex_layout.css">
 <div id="login-header-bar" hidden
     class="login-header-bar-hidden layout horizontal">
@@ -174,14 +159,4 @@
       </div>
     </button>
   </div>
-  <div id="unlock-user-header-bar-item" class="header-bar-item" hidden>
-    <button id="unlock-user-button" class="custom-appearance layout vertical">
-      <div class="flex layout horizontal center">
-        <hd-iron-icon
-            icon1x="header-bar-48:unlock-1x" icon2x="header-bar-48:unlock-2x">
-        </hd-iron-icon>
-        <div i18n-content="unlockUser"></div>
-      </div>
-    </button>
-  </div>
 </div>
diff --git a/chrome/browser/resources/chromeos/login/md_header_bar.js b/chrome/browser/resources/chromeos/login/md_header_bar.js
index 2d5739e2..a357252 100644
--- a/chrome/browser/resources/chromeos/login/md_header_bar.js
+++ b/chrome/browser/resources/chromeos/login/md_header_bar.js
@@ -8,16 +8,6 @@
 
 cr.define('login', function() {
   /**
-   * Enum for user actions taken from lock screen header while a lock screen
-   * app is in background.
-   * @enum {string}
-   */
-  var LOCK_SCREEN_APPS_UNLOCK_ACTION = {
-    SIGN_OUT: 'LOCK_SCREEN_APPS_UNLOCK_ACTION.SIGN_OUT',
-    SHUTDOWN: 'LOCK_SCREEN_APPS_UNLOCK_ACTION.SHUTDOWN'
-  };
-
-  /**
    * Creates a header bar element.
    *
    * @constructor
@@ -42,13 +32,6 @@
     // Current UI state of the sign-in screen.
     signinUIState_: SIGNIN_UI_STATE.HIDDEN,
 
-    // Current lock screen apps activity state. This value affects visibility of
-    // tray buttons visible in the header bar - when lock screeen apps state is
-    // FOREGROUND, only the unlock button should be shown (when clicked, the
-    // button issues a request to move lock screen apps to background, in the
-    // state where account picker is visible).
-    lockScreenAppsState_: LOCK_SCREEN_APPS_STATE.NONE,
-
     // Whether to show kiosk apps menu.
     hasApps_: false,
 
@@ -73,8 +56,6 @@
           .addEventListener('click', this.handleSignoutClick_.bind(this));
       $('cancel-multiple-sign-in-button')
           .addEventListener('click', this.handleCancelMultipleSignInClick_);
-      $('unlock-user-button')
-          .addEventListener('click', this.handleUnlockUserClick_);
       if (Oobe.getInstance().displayType == DISPLAY_TYPE.LOGIN ||
           Oobe.getInstance().displayType == DISPLAY_TYPE.OOBE) {
         if (Oobe.getInstance().newKioskUI)
@@ -209,17 +190,6 @@
     },
 
     /**
-     * Unlock user button handler. Sends a request to Chrome to show user pods
-     * in foreground.
-     *
-     * @private
-     */
-    handleUnlockUserClick_: function(e) {
-      chrome.send('closeLockScreenApp');
-      e.preventDefault();
-    },
-
-    /**
      * If true then "Browse as Guest" button is shown.
      *
      * @type {boolean}
@@ -264,16 +234,6 @@
     },
 
     /**
-     * Current activity state of lock screen app windows.
-     *
-     * @type {LOCK_SCREEN_APPS_STATE}
-     */
-    set lockScreenAppsState(state) {
-      this.lockScreenAppsState_ = state;
-      this.updateUI_();
-    },
-
-    /**
      * Update whether there are kiosk apps.
      *
      * @type {boolean}
@@ -313,14 +273,9 @@
           isMultiProfilesUI || (gaiaIsActive && $('gaia-signin').closable) ||
           (enrollmentIsActive && !$('oauth-enrollment').isAtTheBeginning()) ||
           (gaiaIsActive && !$('gaia-signin').isAtTheBeginning());
-      $('restart-header-bar-item').hidden = !this.showReboot_ ||
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.FOREGROUND;
-      $('shutdown-header-bar-item').hidden = !this.showShutdown_ ||
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.FOREGROUND;
-      $('sign-out-user-item').hidden = !isLockScreen ||
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.FOREGROUND;
-      $('unlock-user-header-bar-item').hidden = !isLockScreen ||
-          this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.FOREGROUND;
+      $('restart-header-bar-item').hidden = !this.showReboot_;
+      $('shutdown-header-bar-item').hidden = !this.showShutdown_;
+      $('sign-out-user-item').hidden = !isLockScreen;
 
       $('add-user-header-bar-item').hidden = $('add-user-button').hidden;
       $('apps-header-bar-item').hidden =
@@ -331,14 +286,6 @@
         if (!$('apps-header-bar-item').hidden)
           $('show-apps-button').didShow();
       }
-
-      // Lock screen apps are generally shown maximized - update the header
-      // bar background opacity so the wallpaper is not visible behind it (
-      // since it won't be visible in the rest of UI).
-      this.classList.toggle(
-          'full-header-background',
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.FOREGROUND ||
-              this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.BACKGROUND);
     },
 
     /**
diff --git a/chrome/browser/resources/chromeos/login/md_login.js b/chrome/browser/resources/chromeos/login/md_login.js
index d373973..4132607 100644
--- a/chrome/browser/resources/chromeos/login/md_login.js
+++ b/chrome/browser/resources/chromeos/login/md_login.js
@@ -6,8 +6,6 @@
  * @fileoverview Login UI based on a stripped down OOBE controller.
  */
 
-var isMd = true;
-
 // <include src="test_util.js">
 // <include src="../../../../../ui/login/screen.js">
 // <include src="screen_context.js">
@@ -16,7 +14,6 @@
 // <include src="../../../../../ui/login/bubble.js">
 // <include src="../../../../../ui/login/display_manager.js">
 // <include src="md_header_bar.js">
-// <include src="md_top_header_bar.js">
 // <include src="demo_mode_test_helper.js">
 
 // <include
@@ -139,7 +136,6 @@
 
       cr.ui.Bubble.decorate($('bubble'));
       login.HeaderBar.decorate($('login-header-bar'));
-      login.TopHeaderBar.decorate($('top-header-bar'));
 
       chrome.send('screenStateInitialize');
 
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.css b/chrome/browser/resources/chromeos/login/md_top_header_bar.css
index e64aa73..caf6d54 100644
--- a/chrome/browser/resources/chromeos/login/md_top_header_bar.css
+++ b/chrome/browser/resources/chromeos/login/md_top_header_bar.css
@@ -13,92 +13,3 @@
   min-height: 0;
   width: 100%;
 }
-
-#top-header-bar.version-labels-unset  #version-labels {
-  display: none;
-}
-
-.new-note-action-container {
-  display: flex;
-  flex: 0;
-  height: 56px;
-  justify-content: flex-end;
-  min-height: 0;
-  min-width: 56px;
-  overflow: hidden;
-  width: 56px;
-  z-index: 1;
-}
-
-.new-note-action {
-  -webkit-tap-highlight-color: transparent;
-  background-color: rgba(158, 158, 158, 0.34);
-  border-radius: 0 0 0 48px;
-  cursor: pointer;
-  display: flex;
-  height: 48px;
-  justify-content: flex-end;
-  min-height: 0;
-  transition-duration: 300ms;
-  transition-property: border-radius, height, width;
-  width: 48px;
-  z-index: 1;
-}
-
-html[dir=rtl] .new-note-action {
-  border-radius: 0 0 48px 0;
-}
-
-.new-note-action:hover,
-.new-note-action:focus {
-  background-color: rgba(158, 158, 158, 0.46);
-  border-radius: 0 0 0 56px;
-  height: 56px;
-  outline: none;
-  width: 56px;
-}
-
-html[dir=rtl] .new-note-action:hover,
-html[dir=rtl] .new-note-action:focus {
-  border-radius: 0 0 56px 0;
-}
-
-.new-note-action-icon {
-  height: 16px;
-  padding-inline-end: 11px;
-  padding-top: 12px;
-  width: 16px;
-}
-
-.new-note-background {
-  background-color: black;
-  border-radius: 0 0 0 100%;
-  bottom: auto;
-  display: none;
-  left: auto;
-  position: absolute;
-  right: 0;
-  top: 0;
-  transform-origin: top right;
-  z-index: 1;
-}
-
-.new-note-background.new-note-action-above-login-header {
-  z-index: 5;
-}
-
-html[dir=rtl] .new-note-background {
-  border-radius: 0 0 100% 0;
-  left: 0;
-  right: auto;
-  transform-origin: top left;
-}
-
-#top-header-bar.new-note-activated .new-note-background {
-  display: block;
-}
-
-.new-note-background-animated {
-  transition-duration: 300ms;
-  transition-property: opacity, transform;
-}
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.html b/chrome/browser/resources/chromeos/login/md_top_header_bar.html
index 8132014..940bc14 100644
--- a/chrome/browser/resources/chromeos/login/md_top_header_bar.html
+++ b/chrome/browser/resources/chromeos/login/md_top_header_bar.html
@@ -1,14 +1,3 @@
-<iron-iconset-svg name="new-note-action" size="16">
-  <svg>
-    <defs>
-      <g id="action-icon" fill="none" fill-rule="evenodd">
-        <path d="M0 0h16v16H0"></path>
-        <path fill="#FFF" fill-rule="nonzero" d="M8.993 1.007h-4.67c-.734 0-1.327.6-1.327 1.333L2.99 13.69c0 .734.592 1.31 1.326 1.31h7.362c.733 0 1.333-.576 1.333-1.31V4.984L8.994 1.007zM9 6V2.535L12.542 6H9z"></path>
-      </g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
-
 <div id="top-header-bar">
   <div class="top-header-bar-strip">
     <div id="version-labels" hidden>
@@ -16,15 +5,5 @@
       <div id="asset-id"></div>
       <div id="bluetooth-name" hidden></div>
     </div>
-    <div hidden id="new-note-action-container"
-        class="new-note-action-container">
-      <div role="button" id="new-note-action" class="new-note-action"
-          tabindex="0" i18n-values="aria-label:newLockScreenNoteButton">
-        <iron-icon icon="new-note-action:action-icon"
-            id="new-note-action-icon" class="new-note-action-icon">
-        </iron-icon>
-      </div>
-    </div>
   </div>
-  <div id="new-note-background" class="new-note-background"></div>
 </div>
diff --git a/chrome/browser/resources/chromeos/login/md_top_header_bar.js b/chrome/browser/resources/chromeos/login/md_top_header_bar.js
deleted file mode 100644
index 13fed58..0000000
--- a/chrome/browser/resources/chromeos/login/md_top_header_bar.js
+++ /dev/null
@@ -1,562 +0,0 @@
-// Copyright 2017 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.
-
-/**
- * @fileoverview Login UI header bar implementation. The header bar is shown on
- * top of login UI (not to be confused with login.HeaderBar which is shown at
- * the bottom and contains login shelf elements).
- * It contains device version labels, and new-note action button if it's
- * enabled (which should only be the case on lock screen).
- */
-
-cr.define('login', function() {
-  /**
-   * The new note request type.
-   * @enum {string}
-   */
-  var NEW_NOTE_REQUEST = {
-    TAP: 'NEW_NOTE_REQUEST.TAP',
-    SWIPE: 'NEW_NOTE_REQUEST.SWIPE',
-    KEYBOARD: 'NEW_NOTE_REQUEST.KEYBOARD'
-  };
-
-  /**
-   * The size of new note action element.
-   * @const {number}
-   */
-  var NEW_NOTE_ACTION_ELEMENT_SIZE = 44;
-
-  /**
-   * Calculates diagonal length of a rectangle with the provided sides.
-   * @param {!number} x The rectangle width.
-   * @param {!number} y The rectangle height.
-   * @return {!number} The rectangle diagonal.
-   */
-  function diag(x, y) {
-    return Math.sqrt(x * x + y * y);
-  }
-
-  /**
-   * Returns Manhattan distance between two touch events.
-   * @param {!TouchInfo} a
-   * @param {!TouchInfo} b
-   * @return !number The distance between two touch event (client) coordinates.
-   */
-  function manhattanDistance(a, b) {
-    return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
-  }
-
-  /**
-   * The minimal Manhattan distance between two touch events for the touch to
-   * be considered as moved.
-   * @const {!number}
-   */
-  var TOUCH_MOVE_THRESHOLD = 1;
-
-  /**
-   * The time in milliseconds after which the current touch should be considered
-   * stopped.
-   * @const {!number}
-   */
-  var TOUCH_STOP_TIMEOUT_MS = 300;
-
-  /**
-   * Minimal velocity in px per ms for a swipe movement to be considered
-   * actionable.
-   * @const {!number}
-   */
-  var MIN_SWIPE_VELOCITY = 0.4;
-
-  /**
-   * Contains data from a touch event relevant for swipe detection.
-   * @param {!Touch} touch The wrapped touch event.
-   */
-  function TouchInfo(touch, timeStamp) {
-    /**
-     * The touch event horizontal client coordinate.
-     * @type {!number}
-     */
-    this.x = touch.clientX;
-
-    /**
-     * The touch event vertical client coordinate.
-     * @type {!number}
-     */
-    this.y = touch.clientY;
-
-    /**
-     * The time the touch event was recorded (and the TouchInfo was created).
-     * @type {!number}
-     */
-    this.time = Date.now();
-  }
-
-  /**
-   * Used to detect potential swipe gestures originating from the provided HTML
-   * element. It tracks touch events on the element and remembers the last
-   * touch move longer than TOUCH_MOVE_THRESHOLD. On touch gesture end, it
-   * invokes the callback with the velocity vector of the last movement that was
-   * long enough - the vector can then be used to determine if the last movement
-   * should be considered a swipe or not.
-   *
-   * @param  {!HTMLElement} element The element whose touch events should be
-   *     tracked.
-   * @param  {!function(!{x: !number, y: !number})} swipeCallback Called when
-   *     a swipe has been detected - the argument will be an object representing
-   *     2-D swipe movement velocity vector.
-   */
-  function SwipeDetector(element, swipeCallback) {
-    element.addEventListener('touchstart', this.onTouchMove_.bind(this));
-    element.addEventListener('touchend', this.onTouchEnd_.bind(this));
-    element.addEventListener('touchcancel', this.clearSwipe_.bind(this));
-    element.addEventListener('touchmove', this.onTouchMove_.bind(this));
-
-    /** @private {!function(!{x: !number, y: !number})} */
-    this.swipeCallback_ = swipeCallback;
-  }
-
-  SwipeDetector.prototype = {
-    /**
-     * The last detected movement of the tracked touch point between two points
-     * (start and end) that are more than <code>TOUCH_MOVE_THRESHOLD</code>
-     * apart. When the touch event sequence ends (on touchend event), this
-     * movement will define the vector that represents the final swipe gesture.
-     * @private {?{start: !TouchInfo, end: !TouchInfo}}
-     */
-    current_: null,
-
-    /**
-     * The last detected touch point. It is a candidate for start of the next
-     * touch movement (which is defined by this.current_). When the next touch
-     * event is received, if the received event is far enough from this touch,
-     * the vector defined by these two events will become the new this.current_
-     * value.
-     * @private {?TouchInfo}
-     */
-    nextStart_: null,
-
-    /**
-     * The tracked touch event ID. <code>undefined</code> if a touch is not
-     * being tracked.
-     * @private {number|undefined}
-     */
-    touchId_: undefined,
-
-    /**
-     * Reference to the timeout posted to invalidate current swipe touch data.
-     * If a timeout was not posted, it will be set to <code>undefined</code>.
-     * @private {number|undefined}
-     */
-    swipeTimeout_: undefined,
-
-    /**
-     * Whether swipe detector is enabled.
-     * @private {boolean}
-     */
-    enabled_: false,
-
-    /**
-     * @param {boolean} enabled Whether the swipe detector should be enabled.
-     */
-    setEnabled: function(enabled) {
-      if (this.enabled_ == enabled)
-        return;
-      if (!enabled)
-        this.clearSwipe_();
-      this.enabled_ = enabled;
-    },
-
-    /**
-     * Whether the swipe detector started tracking a touch event, and at least
-     * one (valid) touch event was detected.
-     * @return {boolean}
-     */
-    started_: function() {
-      return !!this.nextStart_;
-    },
-
-    /**
-     * Processes a detected touch start/move event, updating current swipe
-     * detector state - the last detected touch movement (i.e. the last two
-     * touch events that are distant enough to be considered a movement) and the
-     * last detected touch event.
-     * @param {!TouchInfo} touch The relevant touch event information.
-     */
-    addTouch_: function(touch) {
-      // If the new touch is distant enough from the last recorded touch event,
-      // update the current movement (potential swipe).
-      if (this.nextStart_ &&
-          manhattanDistance(this.nextStart_, touch) >= TOUCH_MOVE_THRESHOLD) {
-        this.current_ = {start: this.nextStart_, end: touch};
-      }
-      // Use the touch as the potential start of the next movement.
-      this.nextStart_ = touch;
-    },
-
-    /**
-     * Handles swipe timeout - if there is a current detected swipe, it gets
-     * cleared if it did not start within the TOUCH_STOP_TIMEOUT_MS amount of
-     * time from now. Similarly, if recorded potential start of the next is not
-     * within the required time, it gets cleared as well.
-     * @private
-     */
-    handleSwipeTimeout_: function() {
-      this.swipeTimeout_ = undefined;
-
-      if (!this.started_())
-        return;
-
-      /**
-       * @param {!number} The time stamp of touch event.
-       * @param {!number} The current time stamp.
-       * @return Whether touchTime is within the valid time interval from now.
-       */
-      function isTouchTimeValid(touchTime, now) {
-        var timeDelta = now - touchTime;
-        return timeDelta >= 0 && timeDelta < TOUCH_STOP_TIMEOUT_MS;
-      }
-
-      // Detect whether detected events are within valid time interval, and
-      // record the latest detected event timestamp.
-      var now = Date.now();
-      var timeSinceEvent = -1;
-      if (this.current_ && isTouchTimeValid(this.current_.start.time, now)) {
-        timeSinceEvent = now - this.current_.start.time;
-      } else if (isTouchTimeValid(this.nextStart_.time, now)) {
-        this.current_ = null;
-        timeSinceEvent = now - this.nextStart_.time;
-      }
-
-      if (timeSinceEvent < 0 || timeSinceEvent > TOUCH_STOP_TIMEOUT_MS) {
-        this.clearSwipe_();
-        return;
-      }
-
-      // Schedule the next interval to be |TOUCH_STOP_TIMEOUT_MS| from the
-      // latest detected touch event.
-      this.swipeTimeout_ = setTimeout(
-          this.handleSwipeTimeout_.bind(this),
-          TOUCH_STOP_TIMEOUT_MS - timeSinceEvent);
-    },
-
-    /**
-     * Cancels the currently tracked movement, and resets cached touch data.
-     * @private
-     */
-    clearSwipe_: function() {
-      if (this.swipeTimeout_ !== undefined)
-        clearTimeout(this.swipeTimeout_);
-      this.swipeTimeout_ = undefined;
-      this.touchId_ = undefined;
-      this.current_ = null;
-      this.nextStart_ = null;
-    },
-
-    /**
-     * Handler for touch move and start events.
-     * @param {TouchEvent} e
-     * @private
-     */
-    onTouchMove_: function(e) {
-      if (!this.enabled_)
-        return;
-
-      // Cancel touch movement tracking if there is more than one touch point,
-      // or if the current touch point is not associated with the tracked
-      // element.
-      if (e.touches.length != 1 || e.targetTouches.length != 1) {
-        this.clearSwipe_();
-        return;
-      }
-
-      var touch = e.touches.item(0);
-      // Start/restart movement tracking if the touch event sequence is not
-      // being tracked, or the touch pointer that should be tracked changed.
-      if (!this.started_() || touch.identifier != this.touchId_) {
-        this.clearSwipe_();
-
-        // Invalidate the current detected swipe after a timeout - for example
-        // to handle situation where the touch stops moving immediately after
-        // a swipe, and the touch is ended without further movement after some
-        // time.
-        this.swipeTimeout_ = setTimeout(
-            this.handleSwipeTimeout_.bind(this), TOUCH_STOP_TIMEOUT_MS);
-
-        this.touchId_ = touch.identifier;
-      }
-
-      this.addTouch_(new TouchInfo(touch));
-    },
-
-    /**
-     * Handler for touch end event.
-     * @param {TouchEvent} e
-     * @private
-     */
-    onTouchEnd_: function(e) {
-      if (!this.enabled_)
-        return;
-
-      // Cancel the swipe if there are still other touch contact points when the
-      // touch ends, or if the finished touch is not associated with the
-      // currently tracked touch sequence.
-      if (e.touches.length != 0 || e.changedTouches.length > 1 ||
-          e.changedTouches.item(0).identifier != this.touchId_) {
-        this.clearSwipe_();
-        return;
-      }
-
-      // Process the final touch event.
-      this.addTouch_(new TouchInfo(e.changedTouches.item(0)));
-
-      // Remember the last potential swipe movement, and clear the tracked
-      // touch data.
-      var current = this.current_;
-      this.clearSwipe_();
-
-      if (!current)
-        return;
-
-      var velocity = {
-        x: current.end.x - current.start.x,
-        y: current.end.y - current.start.y
-      };
-      if (!velocity.x && !velocity.y)
-        return;
-
-      var time = current.end.time - current.start.time;
-      if (!time)
-        return;
-
-      this.swipeCallback_({x: velocity.x / time, y: velocity.y / time});
-    }
-  };
-
-  /**
-   * Creates a header bar element shown at the top of the login screen.
-   *
-   * @constructor
-   * @extends {HTMLDivElement}
-   */
-  var TopHeaderBar = cr.ui.define('div');
-
-  TopHeaderBar.prototype = {
-    __proto__: HTMLDivElement.prototype,
-
-    /**
-     * The current state of lock screen apps.
-     * @private {!LockScreenAppsState}
-     */
-    lockScreenAppsState_: LOCK_SCREEN_APPS_STATE.NONE,
-
-    /** @private {SwipeDetector} */
-    swipeDetector_: null,
-
-    /**
-     * Expected size of fully expanded new note action background.
-     * @private {number}
-     */
-    fullBackgroundSize_: 0,
-
-    set lockScreenAppsState(state) {
-      if (this.lockScreenAppsState_ == state)
-        return;
-
-      var previousState = this.lockScreenAppsState_;
-      this.lockScreenAppsState_ = state;
-      this.updateUi_(previousState);
-    },
-
-    /** override */
-    decorate: function() {
-      $('new-note-action')
-          .addEventListener('click', this.handleNewNoteActionClick_.bind(this));
-      $('new-note-action')
-          .addEventListener(
-              'keydown', this.handleNewNoteActionKeyDown_.bind(this));
-      this.swipeDetector_ =
-          new SwipeDetector($('new-note-action'), this.handleSwipe_.bind(this));
-    },
-
-    /**
-     * @param {!LockScreenAppsState} previousState
-     * @private
-     */
-    updateUi_: function(previousState) {
-      this.swipeDetector_.setEnabled(
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.AVAILABLE);
-
-      $('new-note-action-container').hidden =
-          this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.AVAILABLE &&
-          this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.FOREGROUND;
-
-      // This might get set when the action is activated - reset it when the
-      // lock screen action is updated.
-      $('new-note-background')
-          .classList.toggle('new-note-action-above-login-header', false);
-
-      var animate =
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.FOREGROUND ||
-          (previousState == LOCK_SCREEN_APPS_STATE.FOREGROUND &&
-           this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.AVAILABLE);
-
-      if (!animate ||
-          this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.FOREGROUND) {
-        $('login-header-bar').lockScreenAppsState = this.lockScreenAppsState_;
-      }
-
-      this.setBackgroundActive_(
-          this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.FOREGROUND,
-          animate, this.updateNewNoteActionVisibility_.bind(this));
-    },
-
-    /**
-     * Updates new note action element visibility state.
-     * @private
-     */
-    updateNewNoteActionVisibility_: function() {
-      $('new-note-action').hidden =
-          this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.AVAILABLE;
-      $('login-header-bar').lockScreenAppsState = this.lockScreenAppsState_;
-    },
-
-    /**
-     * Handler for clicks on note action element.
-     * @private
-     */
-    handleNewNoteActionClick_: function() {
-      this.activateNoteAction_(NEW_NOTE_REQUEST.TAP);
-    },
-
-    /**
-     * Handler for key down event.
-     * @param {!KeyboardEvent} evt The key down event.
-     * @private
-     */
-    handleNewNoteActionKeyDown_: function(evt) {
-      if (evt.code != 'Enter')
-        return;
-      this.activateNoteAction_(NEW_NOTE_REQUEST.KEYBOARD);
-    },
-
-    /**
-     * Handles a detected touch movement event that might be considered a swipe.
-     * @param {!{x: !number, y: number}} velocity The touch movement velocity
-     *     vector.
-     * @private
-     */
-    handleSwipe_: function(velocity) {
-      // Ignore swipes in direction other than down left (in ltr world).
-      var rtlAdjustmentForX = isRTL() ? -1 : 1;
-      if ((rtlAdjustmentForX * velocity.x) > 0 || velocity.y < 0)
-        return;
-
-      // If not fast enough, ignore the swipe.
-      if (diag(velocity.x, velocity.y) < MIN_SWIPE_VELOCITY)
-        return;
-
-      this.activateNoteAction_(NEW_NOTE_REQUEST.SWIPE);
-    },
-
-    /**
-     * @param {!NEW_NOTE_REQUEST} requestType The type of request that triggered
-     *      new note action.
-     * @private
-     */
-    activateNoteAction_: function(requestType) {
-      $('new-note-background')
-          .classList.toggle('new-note-action-above-login-header', true);
-
-      this.setBackgroundActive_(
-          true /*active*/, true /*animate*/,
-          (function() {
-            if (this.lockScreenAppsState_ == LOCK_SCREEN_APPS_STATE.AVAILABLE) {
-              $('login-header-bar').lockScreenAppsState =
-                  LOCK_SCREEN_APPS_STATE.FOREGROUND;
-            }
-            chrome.send('requestNewLockScreenNote', [requestType]);
-          }).bind(this));
-    },
-
-    /**
-     * Updates the new note action element style for active note taking.
-     * @param {boolean} active Whether the note action is in active state.
-     * @param {boolean} animate Whether the UI state changes should be animated.
-     *    For example, whether the note background should be expanded or scaled
-     *    down with an animation.
-     * @param {function()=} callback Called when the UI state change is
-     *     complete.
-     * @private
-     */
-    setBackgroundActive_: function(active, animate, callback) {
-      // Cache full background size - it will be used to calculate scale
-      // transform for animating new note action background.
-      var targetSize = diag(
-          $('scroll-container').clientWidth,
-          $('scroll-container').clientHeight);
-      if (this.fullBackgroundSize_ != targetSize) {
-        $('new-note-background').style.setProperty('height', targetSize + 'px');
-        $('new-note-background').style.setProperty('width', targetSize + 'px');
-        this.fullBackgroundSize_ = targetSize;
-      }
-
-      $('top-header-bar').classList.toggle('version-labels-unset', active);
-
-      if (active && animate)
-        $('new-note-action').hidden = true;
-
-      if (active || !animate)
-        $('top-header-bar').classList.toggle('new-note-activated', active);
-
-      if (animate) {
-        $('new-note-background')
-            .style.setProperty(
-                'transition-timing-function', active ? 'ease-in' : 'ease-out');
-        $('new-note-background')
-            .classList.toggle('new-note-background-animated', true);
-
-        this.runOnNoteActionTransitionEnd_(function() {
-          $('new-note-background')
-              .classList.toggle('new-note-background-animated', false);
-          $('top-header-bar').classList.toggle('new-note-activated', active);
-
-          chrome.send('newNoteLaunchAnimationDone');
-
-          if (callback)
-            callback();
-        });
-      }
-
-      var newNoteBackground = $('new-note-background');
-      var scale =
-          active ? 1 : NEW_NOTE_ACTION_ELEMENT_SIZE / this.fullBackgroundSize_;
-      newNoteBackground.style.setProperty('transform', 'scale(' + scale + ')');
-      newNoteBackground.style.setProperty('opacity', active ? '1' : '0.2');
-
-      // If background is updated with animation, callback will be run when
-      // the animation finishes.
-      if (!animate && callback)
-        callback();
-    },
-
-    /**
-     * Waits for new note action element transition to end (the element expands
-     * from top right corner to whole screen when the action is activated) and
-     * then runs the provided closure.
-     *
-     * @param {!function()} callback Closure to run on transition end.
-     */
-    runOnNoteActionTransitionEnd_: function(callback) {
-      $('new-note-background')
-          .addEventListener('transitionend', function listen() {
-            $('new-note-background')
-                .removeEventListener('transitionend', listen);
-            callback();
-          });
-      ensureTransitionEndEvent($('new-note-background'));
-    }
-  };
-
-  return {TopHeaderBar: TopHeaderBar};
-});
diff --git a/chrome/browser/resources/chromeos/login/oobe.js b/chrome/browser/resources/chromeos/login/oobe.js
index c8b9b96f..3446c7cc 100644
--- a/chrome/browser/resources/chromeos/login/oobe.js
+++ b/chrome/browser/resources/chromeos/login/oobe.js
@@ -15,7 +15,6 @@
 // <include src="../../../../../ui/login/bubble.js">
 // <include src="../../../../../ui/login/display_manager.js">
 // <include src="md_header_bar.js">
-// <include src="md_top_header_bar.js">
 // <include src="demo_mode_test_helper.js">
 
 // <include
@@ -144,8 +143,6 @@
 
       cr.ui.Bubble.decorate($('bubble'));
       login.HeaderBar.decorate($('login-header-bar'));
-      if ($('top-header-bar'))
-        login.TopHeaderBar.decorate($('top-header-bar'));
 
       Oobe.initializeA11yMenu();
 
diff --git a/chrome/browser/resources/history/history_toolbar.html b/chrome/browser/resources/history/history_toolbar.html
index c28d0ce..cd86b39 100644
--- a/chrome/browser/resources/history/history_toolbar.html
+++ b/chrome/browser/resources/history/history_toolbar.html
@@ -1,9 +1,7 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_toolbar/cr_toolbar.html">
 <link rel="import" href="browser_service.html">
-<link rel="import" href="icons.html">
 <link rel="import" href="shared_style.html">
 <link rel="import" href="strings.html">
 
diff --git a/chrome/browser/resources/history/icons.html b/chrome/browser/resources/history/icons.html
deleted file mode 100644
index 2714b83..0000000
--- a/chrome/browser/resources/history/icons.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<link rel="import" href="chrome://resources/html/polymer.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/iron-iconset-svg/iron-iconset-svg.html">
-
-<iron-iconset-svg size="24" name="history">
-  <svg>
-    <defs>
-      <!--
-      These icons are copied from Polymer's iron-icons and kept in sorted order.
-      See http://goo.gl/Y1OdAq for instructions on adding additional icons.
-      -->
-      <g id="chevron-left"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"></path></g>
-      <g id="today"><path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z"></path></g>
-    </defs>
-  </svg>
-</iron-iconset-svg>
diff --git a/chrome/browser/resources/settings/device_page/night_light_slider.js b/chrome/browser/resources/settings/device_page/night_light_slider.js
index 0e1fdb5..2f7321a 100644
--- a/chrome/browser/resources/settings/device_page/night_light_slider.js
+++ b/chrome/browser/resources/settings/device_page/night_light_slider.js
@@ -100,7 +100,7 @@
       return false;
     });
 
-    this.async(function() {
+    setTimeout(() => {
       // This is needed to make sure that the positions of the knobs and their
       // label bubbles are correctly updated when the display settings page is
       // opened for the first time after login. The page need to be fully
@@ -341,7 +341,8 @@
    * @private
    */
   updateKnobs_: function() {
-    if (!this.isReady_ || !this.prefsAvailable()) {
+    if (!this.isReady_ || !this.prefsAvailable() ||
+        this.$.sliderBar.offsetWidth == 0) {
       return;
     }
     const startOffsetMinutes = /** @type {number} */ (
diff --git a/chrome/browser/search/instant_service_unittest.cc b/chrome/browser/search/instant_service_unittest.cc
index a867712..5f2074f8 100644
--- a/chrome/browser/search/instant_service_unittest.cc
+++ b/chrome/browser/search/instant_service_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/search/background/ntp_background_service.h"
+#include "chrome/browser/search/instant_service_observer.h"
 #include "chrome/browser/search/instant_unittest_base.h"
 #include "chrome/browser/search/ntp_features.h"
 #include "chrome/common/chrome_paths.h"
@@ -21,11 +22,20 @@
 #include "components/ntp_tiles/ntp_tile.h"
 #include "components/ntp_tiles/section_type.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/native_theme/test_native_theme.h"
 #include "url/gurl.h"
 
 namespace {
+
+class MockInstantServiceObserver : public InstantServiceObserver {
+ public:
+  MOCK_METHOD1(ThemeInfoChanged, void(const ThemeBackgroundInfo&));
+  MOCK_METHOD2(MostVisitedItemsChanged,
+               void(const std::vector<InstantMostVisitedItem>&, bool));
+};
+
 base::DictionaryValue GetBackgroundInfoAsDict(const GURL& background_url) {
   base::DictionaryValue background_info;
   background_info.SetKey("background_url", base::Value(background_url.spec()));
@@ -35,6 +45,7 @@
 
   return background_info;
 }
+
 }  // namespace
 
 using InstantServiceTest = InstantUnitTestBase;
@@ -432,23 +443,27 @@
 };
 
 TEST_F(InstantServiceThemeTest, DarkModeHandler) {
+  testing::StrictMock<MockInstantServiceObserver> mock_observer;
+  instant_service_->AddObserver(&mock_observer);
   theme()->SetDarkMode(false);
   instant_service_->SetDarkModeThemeForTesting(theme());
-  thread_bundle()->RunUntilIdle();
 
   // Enable dark mode.
+  ThemeBackgroundInfo theme_info;
+  EXPECT_CALL(mock_observer, ThemeInfoChanged(testing::_))
+      .WillOnce(testing::SaveArg<0>(&theme_info));
   theme()->SetDarkMode(true);
   theme()->NotifyObservers();
   thread_bundle()->RunUntilIdle();
 
-  ThemeBackgroundInfo* theme_info = instant_service_->GetThemeInfoForTesting();
-  EXPECT_TRUE(theme_info->using_dark_mode);
+  EXPECT_TRUE(theme_info.using_dark_mode);
 
   // Disable dark mode.
+  EXPECT_CALL(mock_observer, ThemeInfoChanged(testing::_))
+      .WillOnce(testing::SaveArg<0>(&theme_info));
   theme()->SetDarkMode(false);
   theme()->NotifyObservers();
   thread_bundle()->RunUntilIdle();
 
-  theme_info = instant_service_->GetThemeInfoForTesting();
-  EXPECT_FALSE(theme_info->using_dark_mode);
+  EXPECT_FALSE(theme_info.using_dark_mode);
 }
diff --git a/chrome/browser/send_tab_to_self/OWNERS b/chrome/browser/send_tab_to_self/OWNERS
new file mode 100644
index 0000000..59b3396
--- /dev/null
+++ b/chrome/browser/send_tab_to_self/OWNERS
@@ -0,0 +1,3 @@
+ file://components/send_tab_to_self/OWNERS
+
+# COMPONENT: UI>Browser>Sharing
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
new file mode 100644
index 0000000..e8cad28
--- /dev/null
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util.cc
@@ -0,0 +1,66 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sync/device_info_sync_service_factory.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "components/browser_sync/profile_sync_service.h"
+#include "components/sync/device_info/device_info.h"
+#include "components/sync/device_info/device_info_sync_service.h"
+#include "components/sync/device_info/device_info_tracker.h"
+#include "components/sync/driver/sync_driver_switches.h"
+#include "content/public/common/url_constants.h"
+#include "url/gurl.h"
+
+namespace send_tab_to_self {
+
+bool IsFlagEnabled() {
+  return base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf);
+}
+
+bool IsUserSyncTypeEnabled(Profile* profile) {
+  browser_sync::ProfileSyncService* profile_sync_service =
+      ProfileSyncServiceFactory::GetForProfile(profile);
+  return profile_sync_service &&
+         (profile_sync_service->GetUserSettings()->IsSyncEverythingEnabled() ||
+          profile_sync_service->GetUserSettings()->GetChosenDataTypes().Has(
+              syncer::SEND_TAB_TO_SELF));
+}
+
+bool IsSyncingOnMultipleDevices(Profile* profile) {
+  syncer::DeviceInfoSyncService* device_sync_service =
+      DeviceInfoSyncServiceFactory::GetForProfile(profile);
+  return device_sync_service &&
+         device_sync_service->GetDeviceInfoTracker()->CountActiveDevices() > 1;
+}
+
+bool IsContentRequirementsMet(GURL& url, Profile* profile) {
+  bool is_http_or_https = url.SchemeIsHTTPOrHTTPS();
+  bool is_native_page = url.SchemeIs(content::kChromeUIScheme);
+  bool is_incognito_mode =
+      profile->GetProfileType() == Profile::INCOGNITO_PROFILE;
+  return is_http_or_https && !is_native_page && !is_incognito_mode;
+}
+
+bool ShouldOfferFeature(Browser* browser) {
+  if (!browser) {
+    return false;
+  }
+  Profile* profile = browser->profile();
+  content::WebContents* web_contents =
+      browser->tab_strip_model()->GetActiveWebContents();
+  if (!profile || !web_contents) {
+    return false;
+  }
+
+  GURL url = web_contents->GetURL();
+  return IsFlagEnabled() && IsUserSyncTypeEnabled(profile) &&
+         IsSyncingOnMultipleDevices(profile) &&
+         IsContentRequirementsMet(url, profile);
+}
+
+}  // namespace send_tab_to_self
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util.h b/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
new file mode 100644
index 0000000..a075e8e8
--- /dev/null
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util.h
@@ -0,0 +1,36 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_UTIL_H_
+#define CHROME_BROWSER_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_UTIL_H_
+
+class Browser;
+class GURL;
+class Profile;
+
+namespace send_tab_to_self {
+
+// The send tab to self util contains a list of helper functions.
+
+// Returns true if the 'send tab to self' flag is enabled.
+bool IsFlagEnabled();
+
+// Returns true if the SendTabToSelf sync datatype is enabled.
+bool IsUserSyncTypeEnabled(Profile* profile);
+
+// Returns true if the user syncing on two or more devices.
+bool IsSyncingOnMultipleDevices(Profile* profile);
+
+// Returns true if the tab and web content requirements are met:
+//  User is viewing an HTTP or HTTPS page.
+//  User is not on a native page.
+//  User is not in Incongnito mode.
+bool IsContentRequirementsMet(GURL& gurl, Profile* profile);
+
+// Returns true if all conditions are true and shows the option onto the menu
+bool ShouldOfferFeature(Browser* browser);
+
+}  // namespace send_tab_to_self
+
+#endif  // CHROME_BROWSER_SEND_TAB_TO_SELF_SEND_TAB_TO_SELF_UTIL_H_
diff --git a/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc b/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
new file mode 100644
index 0000000..6473a31
--- /dev/null
+++ b/chrome/browser/send_tab_to_self/send_tab_to_self_util_unittest.cc
@@ -0,0 +1,254 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/sync/device_info_sync_service_factory.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/browser/sync/profile_sync_test_util.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "components/browser_sync/profile_sync_service.h"
+#include "components/sync/device_info/device_info.h"
+#include "components/sync/device_info/device_info_sync_bridge.h"
+#include "components/sync/device_info/device_info_sync_service.h"
+#include "components/sync/driver/sync_driver_switches.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+namespace send_tab_to_self {
+
+namespace {
+
+// Mock DeviceInfoTracker class for setting active devices
+class TestDeviceInfoTracker : public syncer::DeviceInfoTracker {
+ public:
+  TestDeviceInfoTracker() = default;
+  ~TestDeviceInfoTracker() override = default;
+
+  void SetActiveDevices(int devices) { active_devices_ = devices; }
+
+  // DeviceInfoTracker implementation
+  bool IsSyncing() const override { return false; }
+  std::unique_ptr<syncer::DeviceInfo> GetDeviceInfo(
+      const std::string& client_id) const override {
+    return std::unique_ptr<syncer::DeviceInfo>();
+  }
+  std::vector<std::unique_ptr<syncer::DeviceInfo>> GetAllDeviceInfo()
+      const override {
+    return std::vector<std::unique_ptr<syncer::DeviceInfo>>();
+  }
+  void AddObserver(Observer* observer) override {}
+  void RemoveObserver(Observer* observer) override {}
+  int CountActiveDevices() const override { return active_devices_; }
+
+ protected:
+  int active_devices_;
+};
+
+// Mock DeviceInfoSyncService to host mocked DeviceInfoTracker
+class TestDeviceInfoSyncService : public syncer::DeviceInfoSyncService {
+ public:
+  TestDeviceInfoSyncService() = default;
+  ~TestDeviceInfoSyncService() override = default;
+
+  TestDeviceInfoTracker* GetMockDeviceInfoTracker() { return &tracker_; }
+  void SetTrackerActiveDevices(int devices) {
+    tracker_.SetActiveDevices(devices);
+  }
+
+  // DeviceInfoSyncService implementation
+  syncer::LocalDeviceInfoProvider* GetLocalDeviceInfoProvider() override {
+    return nullptr;
+  }
+  syncer::DeviceInfoTracker* GetDeviceInfoTracker() override {
+    return &tracker_;
+  }
+  base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
+      override {
+    return nullptr;
+  }
+  void InitLocalCacheGuid(const std::string& cache_guid,
+                          const std::string& session_name) override {}
+  void ClearLocalCacheGuid() override {}
+
+ protected:
+  TestDeviceInfoTracker tracker_;
+};
+
+std::unique_ptr<KeyedService> BuildMockDeviceInfoSyncService(
+    content::BrowserContext* context) {
+  return std::make_unique<TestDeviceInfoSyncService>();
+}
+
+class SendTabToSelfUtilTest : public BrowserWithTestWindowTest {
+ public:
+  SendTabToSelfUtilTest() = default;
+  ~SendTabToSelfUtilTest() override = default;
+
+  void SetUp() override {
+    BrowserWithTestWindowTest::SetUp();
+
+    mock_profile_sync_service_ =
+        static_cast<browser_sync::ProfileSyncServiceMock*>(
+            ProfileSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
+                profile(), base::BindRepeating(&BuildMockProfileSyncService)));
+    mock_device_sync_service_ = static_cast<TestDeviceInfoSyncService*>(
+        DeviceInfoSyncServiceFactory::GetInstance()->SetTestingFactoryAndUse(
+            profile(), base::BindRepeating(&BuildMockDeviceInfoSyncService)));
+
+    incognito_profile_ = profile()->GetOffTheRecordProfile();
+    url_ = GURL("https://www.google.com");
+  }
+
+  // Set up all test conditions to let ShouldOfferFeature() return true
+  void SetUpAllTrueEnv() {
+    scoped_feature_list_.InitAndEnableFeature(switches::kSyncSendTabToSelf);
+    syncer::ModelTypeSet enabled_modeltype(syncer::SEND_TAB_TO_SELF);
+    EXPECT_CALL(*mock_profile_sync_service_->GetUserSettingsMock(),
+                GetChosenDataTypes())
+        .WillRepeatedly(testing::Return(enabled_modeltype));
+
+    mock_device_sync_service_->SetTrackerActiveDevices(2);
+
+    AddTab(browser(), url_);
+    NavigateAndCommitActiveTab(url_);
+  }
+
+  // Set up a environment in which the feature flag is disabled
+  void SetUpFeatureDisabledEnv() {
+    scoped_feature_list_.InitAndDisableFeature(switches::kSyncSendTabToSelf);
+    syncer::ModelTypeSet enabled_modeltype(syncer::SEND_TAB_TO_SELF);
+    EXPECT_CALL(*mock_profile_sync_service_->GetUserSettingsMock(),
+                GetChosenDataTypes())
+        .WillRepeatedly(testing::Return(enabled_modeltype));
+
+    mock_device_sync_service_->SetTrackerActiveDevices(2);
+
+    AddTab(browser(), url_);
+    NavigateAndCommitActiveTab(url_);
+  }
+
+ protected:
+  browser_sync::ProfileSyncServiceMock* mock_profile_sync_service_;
+  TestDeviceInfoSyncService* mock_device_sync_service_;
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+  Profile* incognito_profile_;
+  GURL url_;
+};
+
+TEST_F(SendTabToSelfUtilTest, IsFlagEnabled_True) {
+  scoped_feature_list_.InitAndEnableFeature(switches::kSyncSendTabToSelf);
+
+  EXPECT_TRUE(IsFlagEnabled());
+}
+
+TEST_F(SendTabToSelfUtilTest, IsFlagEnabled_False) {
+  scoped_feature_list_.InitAndDisableFeature(switches::kSyncSendTabToSelf);
+  EXPECT_FALSE(IsFlagEnabled());
+}
+
+TEST_F(SendTabToSelfUtilTest, IsUserSyncTypeEnabled_True) {
+  syncer::ModelTypeSet enabled_modeltype(syncer::SEND_TAB_TO_SELF);
+  EXPECT_CALL(*mock_profile_sync_service_->GetUserSettingsMock(),
+              GetChosenDataTypes())
+      .WillRepeatedly(testing::Return(enabled_modeltype));
+
+  EXPECT_TRUE(IsUserSyncTypeEnabled(profile()));
+
+  EXPECT_CALL(*mock_profile_sync_service_->GetUserSettingsMock(),
+              GetChosenDataTypes())
+      .WillRepeatedly(testing::Return(syncer::ModelTypeSet::All()));
+
+  EXPECT_TRUE(IsUserSyncTypeEnabled(profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, IsUserSyncTypeEnabled_False) {
+  syncer::ModelTypeSet disabled_modeltype;
+  EXPECT_CALL(*mock_profile_sync_service_->GetUserSettingsMock(),
+              GetChosenDataTypes())
+      .WillRepeatedly(testing::Return(disabled_modeltype));
+
+  EXPECT_FALSE(IsUserSyncTypeEnabled(profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, IsSyncingOnMultipleDevices_True) {
+  mock_device_sync_service_->SetTrackerActiveDevices(2);
+
+  EXPECT_TRUE(IsSyncingOnMultipleDevices(profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, IsSyncingOnMultipleDevices_False) {
+  mock_device_sync_service_->SetTrackerActiveDevices(0);
+
+  EXPECT_FALSE(IsSyncingOnMultipleDevices(profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, ContentRequirementsMet) {
+  EXPECT_TRUE(IsContentRequirementsMet(url_, profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, NotHTTPOrHTTPS) {
+  url_ = GURL("192.168.0.0");
+  EXPECT_FALSE(IsContentRequirementsMet(url_, profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, NativePage) {
+  url_ = GURL("chrome://flags");
+  EXPECT_FALSE(IsContentRequirementsMet(url_, profile()));
+}
+
+TEST_F(SendTabToSelfUtilTest, IncognitoMode) {
+  EXPECT_FALSE(IsContentRequirementsMet(url_, incognito_profile_));
+}
+
+TEST_F(SendTabToSelfUtilTest, ShouldOfferFeature_True) {
+  SetUpAllTrueEnv();
+
+  EXPECT_TRUE(ShouldOfferFeature(browser()));
+}
+
+TEST_F(SendTabToSelfUtilTest, ShouldOfferFeature_IsFlagEnabled_False) {
+  SetUpFeatureDisabledEnv();
+  EXPECT_FALSE(ShouldOfferFeature(browser()));
+}
+
+TEST_F(SendTabToSelfUtilTest, ShouldOfferFeature_IsUserSyncTypeEnabled_False) {
+  SetUpAllTrueEnv();
+  syncer::ModelTypeSet disabled_modeltype;
+  EXPECT_CALL(*mock_profile_sync_service_->GetUserSettingsMock(),
+              GetChosenDataTypes())
+      .WillRepeatedly(testing::Return(disabled_modeltype));
+
+  EXPECT_FALSE(ShouldOfferFeature(browser()));
+}
+
+TEST_F(SendTabToSelfUtilTest,
+       ShouldOfferFeature_IsSyncingOnMultipleDevices_False) {
+  SetUpAllTrueEnv();
+  mock_device_sync_service_->SetTrackerActiveDevices(0);
+
+  EXPECT_FALSE(ShouldOfferFeature(browser()));
+}
+
+TEST_F(SendTabToSelfUtilTest,
+       ShouldOfferFeature_IsContentRequirementsMet_False) {
+  SetUpAllTrueEnv();
+  url_ = GURL("192.168.0.0");
+  NavigateAndCommitActiveTab(url_);
+
+  EXPECT_FALSE(ShouldOfferFeature(browser()));
+}
+
+}  // namespace
+
+}  // namespace send_tab_to_self
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
index 2744ce2..26e0f4f9 100644
--- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
+++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
@@ -46,7 +46,7 @@
 const char kOnStop[] = "ttsEngine.onStop";
 const char kOnPause[] = "ttsEngine.onPause";
 const char kOnResume[] = "ttsEngine.onResume";
-};  // namespace tts_engine_events
+}  // namespace tts_engine_events
 
 namespace {
 
diff --git a/chrome/browser/speech/extension_api/tts_extension_api.cc b/chrome/browser/speech/extension_api/tts_extension_api.cc
index 04f6b62..2b00392f 100644
--- a/chrome/browser/speech/extension_api/tts_extension_api.cc
+++ b/chrome/browser/speech/extension_api/tts_extension_api.cc
@@ -28,7 +28,7 @@
 
 namespace events {
 const char kOnEvent[] = "tts.onEvent";
-};  // namespace events
+}  // namespace events
 
 const char* TtsEventTypeToString(content::TtsEventType event_type) {
   switch (event_type) {
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index b52af95..6cc275d 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -3396,7 +3396,7 @@
   SSLUITestWaitForDOMNotification()
       : SSLUITestIgnoreCertErrors(), run_loop_(nullptr) {}
 
-  ~SSLUITestWaitForDOMNotification() override { registrar_.RemoveAll(); };
+  ~SSLUITestWaitForDOMNotification() override { registrar_.RemoveAll(); }
 
   void SetUpOnMainThread() override {
     SSLUITestIgnoreCertErrors::SetUpOnMainThread();
diff --git a/chrome/browser/sync_file_system/sync_file_system_test_util.cc b/chrome/browser/sync_file_system/sync_file_system_test_util.cc
index 37856f6..898810f 100644
--- a/chrome/browser/sync_file_system/sync_file_system_test_util.cc
+++ b/chrome/browser/sync_file_system/sync_file_system_test_util.cc
@@ -53,8 +53,8 @@
 template base::Callback<void(SyncStatusCode)>
 AssignAndQuitCallback(base::RunLoop*, SyncStatusCode*);
 
-#define INSTANTIATE_RECEIVER(type)                                  \
-  template base::Callback<void(type)> CreateResultReceiver(type*);
+#define INSTANTIATE_RECEIVER(type) \
+  template base::Callback<void(type)> CreateResultReceiver(type*)
 INSTANTIATE_RECEIVER(SyncStatusCode);
 INSTANTIATE_RECEIVER(google_apis::DriveApiErrorCode);
 INSTANTIATE_RECEIVER(std::unique_ptr<RemoteFileSyncService::OriginStatusMap>);
diff --git a/chrome/browser/themes/theme_properties_unittest.cc b/chrome/browser/themes/theme_properties_unittest.cc
index 46941ca..48f51a45 100644
--- a/chrome/browser/themes/theme_properties_unittest.cc
+++ b/chrome/browser/themes/theme_properties_unittest.cc
@@ -54,4 +54,4 @@
   EXPECT_EQ("center center", ThemeProperties::AlignmentToString(alignment));
 }
 
-}; // namespace
+}  // namespace
diff --git a/chrome/browser/themes/theme_service_unittest.cc b/chrome/browser/themes/theme_service_unittest.cc
index 3548f07..e661f85d 100644
--- a/chrome/browser/themes/theme_service_unittest.cc
+++ b/chrome/browser/themes/theme_service_unittest.cc
@@ -437,4 +437,4 @@
 #endif // defined(OS_LINUX) && !defined(OS_CHROMEOS)
 #endif // BUILDFLAG(ENABLE_SUPERVISED_USERS)
 
-}; // namespace theme_service_internal
+}  // namespace theme_service_internal
diff --git a/chrome/browser/translate/translate_fake_page.cc b/chrome/browser/translate/translate_fake_page.cc
index 4c3bad7..de2c7a6 100644
--- a/chrome/browser/translate/translate_fake_page.cc
+++ b/chrome/browser/translate/translate_fake_page.cc
@@ -42,7 +42,7 @@
     : called_translate_(false),
       called_revert_translation_(false),
       binding_(this) {}
-FakePageImpl::~FakePageImpl(){};
+FakePageImpl::~FakePageImpl() {}
 
 translate::mojom::PagePtr FakePageImpl::BindToNewPagePtr() {
   binding_.Close();
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 6aaf3df9..958db1d 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3466,6 +3466,8 @@
       "views/extensions/media_galleries_dialog_views.h",
       "views/extensions/media_gallery_checkbox_view.cc",
       "views/extensions/media_gallery_checkbox_view.h",
+      "web_applications/web_app_dialog_utils.cc",
+      "web_applications/web_app_dialog_utils.h",
       "web_applications/web_app_metrics.cc",
       "web_applications/web_app_metrics.h",
       "web_applications/web_app_metrics_factory.cc",
diff --git a/chrome/browser/ui/autofill/save_card_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/save_card_bubble_controller_impl_unittest.cc
index 2367384..737e16d 100644
--- a/chrome/browser/ui/autofill/save_card_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/save_card_bubble_controller_impl_unittest.cc
@@ -47,7 +47,7 @@
 
   // Overriding because parent function requires a browser window to redirect
   // properly, which is not available in unit tests.
-  void ShowPaymentsSettingsPage() override{};
+  void ShowPaymentsSettingsPage() override {}
 
   explicit TestSaveCardBubbleControllerImpl(content::WebContents* web_contents)
       : SaveCardBubbleControllerImpl(web_contents) {}
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 191a6e3..137a9991 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -103,8 +103,8 @@
 #include "chrome/browser/ui/extensions/app_launch_params.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
 #include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
+#include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
-#include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/common/extensions/extension_metrics.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "extensions/browser/extension_registry.h"
@@ -1291,13 +1291,11 @@
 void CreateBookmarkAppFromCurrentWebContents(Browser* browser,
                                              bool force_shortcut_app) {
   base::RecordAction(UserMetricsAction("CreateHostedApp"));
-  web_app::WebAppProvider::InstallWebApp(
-      browser->tab_strip_model()->GetActiveWebContents(), force_shortcut_app);
+  web_app::CreateWebAppFromCurrentWebContents(browser, force_shortcut_app);
 }
 
 bool CanCreateBookmarkApp(const Browser* browser) {
-  return web_app::WebAppProvider::CanInstallWebApp(
-      browser->tab_strip_model()->GetActiveWebContents());
+  return web_app::CanCreateWebApp(browser);
 }
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
diff --git a/chrome/browser/ui/prefs/prefs_tab_helper_browsertest.cc b/chrome/browser/ui/prefs/prefs_tab_helper_browsertest.cc
index ef8f83867..2a63ac18 100644
--- a/chrome/browser/ui/prefs/prefs_tab_helper_browsertest.cc
+++ b/chrome/browser/ui/prefs/prefs_tab_helper_browsertest.cc
@@ -76,6 +76,4 @@
             prefs->GetString(prefs::kWebKitStandardFontFamilyKorean));
   EXPECT_EQ("Tinos", prefs->GetString(prefs::kWebKitStandardFontFamily));
   EXPECT_EQ("DejaVu Sans", prefs->GetString(prefs::kWebKitSansSerifFontFamily));
-};
-
-
+}
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc
index 5a06c0a2..a995acf 100644
--- a/chrome/browser/ui/search/local_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -50,6 +50,7 @@
 #include "content/public/test/test_navigation_throttle_inserter.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/web_feature.mojom.h"
+#include "ui/native_theme/test_native_theme.h"
 #include "url/gurl.h"
 
 namespace {
@@ -62,11 +63,21 @@
 // ntp_tiles::CustomLinksManager.
 const int kDefaultCustomLinkMaxCount = 10;
 
-// Returns the RenderFrameHost corresponding to the most visited iframe in the
+// Name for the Most Visited iframe in the NTP.
+const char kMostVisitedIframe[] = "mv-single";
+// Name for the edit/add custom link iframe in the NTP.
+const char kEditCustomLinkIframe[] = "custom-links-edit";
+
+// Delimiter in the Most Visited icon URL that indicates a dark icon. Keep value
+// in sync with NtpIconSource.
+const char kMVIconDarkParameter[] = "/dark/";
+
+// Returns the RenderFrameHost corresponding to the |iframe_name| in the
 // given |tab|. |tab| must correspond to an NTP.
-content::RenderFrameHost* GetMostVisitedIframe(content::WebContents* tab) {
+content::RenderFrameHost* GetIframe(content::WebContents* tab,
+                                    const char* iframe_name) {
   for (content::RenderFrameHost* frame : tab->GetAllFrames()) {
-    if (frame->GetFrameName() == "mv-single") {
+    if (frame->GetFrameName() == iframe_name) {
       return frame;
     }
   }
@@ -128,7 +139,6 @@
       : LocalNTPTest(/*enabled_features=*/{features::kUseGoogleLocalNtp},
                      /*disabled_features=*/{}) {}
 
- private:
   void SetUpOnMainThread() override {
     // Some tests depend on the prepopulated most visited tiles coming from
     // TopSites, so make sure they are available before running the tests.
@@ -143,6 +153,7 @@
     mv_observer.WaitForNumberOfItems(kDefaultMostVisitedItemCount);
   }
 
+ private:
   base::test::ScopedFeatureList feature_list_;
 };
 
@@ -524,8 +535,8 @@
       local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
   local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
 
-  // Get the iframe and check that the tiles loaded correctly.
-  content::RenderFrameHost* iframe = GetMostVisitedIframe(active_tab);
+  // Get the Most Visited iframe and check that the tiles loaded correctly.
+  content::RenderFrameHost* iframe = GetIframe(active_tab, kMostVisitedIframe);
 
   // Get the total number of (non-empty) tiles from the iframe.
   int total_favicons = 0;
@@ -572,8 +583,8 @@
   local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
   observer.WaitForNumberOfItems(kDefaultMostVisitedItemCount);
 
-  // Get the iframe and add to maximum number of tiles.
-  content::RenderFrameHost* iframe = GetMostVisitedIframe(active_tab);
+  // Get the Most Visited iframe and add to maximum number of tiles.
+  content::RenderFrameHost* iframe = GetIframe(active_tab, kMostVisitedIframe);
   for (int i = kDefaultMostVisitedItemCount; i < kDefaultCustomLinkMaxCount;
        ++i) {
     std::string rid = std::to_string(i + 100);
@@ -610,7 +621,7 @@
   observer.WaitForNumberOfItems(kDefaultMostVisitedItemCount);
 
   // Fill tiles up to the maximum count.
-  content::RenderFrameHost* iframe = GetMostVisitedIframe(active_tab);
+  content::RenderFrameHost* iframe = GetIframe(active_tab, kMostVisitedIframe);
   for (int i = kDefaultMostVisitedItemCount; i < kDefaultCustomLinkMaxCount;
        ++i) {
     std::string rid = std::to_string(i + 100);
@@ -693,6 +704,146 @@
   EXPECT_EQ("rtl", dir);
 }
 
+// Tests that dark mode styling is properly applied to the local NTP.
+class LocalNTPDarkModeTest : public LocalNTPTest {
+ public:
+  LocalNTPDarkModeTest() {}
+
+ protected:
+  ui::TestNativeTheme* theme() { return &theme_; }
+
+  // Returns true if dark mode is applied on the |frame|.
+  bool GetIsDarkModeApplied(const content::ToRenderFrameHost& frame) {
+    bool dark_mode_applied = false;
+    if (instant_test_utils::GetBoolFromJS(
+            frame,
+            "document.documentElement.getAttribute('darkmode') === 'true'",
+            &dark_mode_applied)) {
+      return dark_mode_applied;
+    }
+    return false;
+  }
+
+  // Returns true if dark mode is applied to the Most Visited icon at |index|
+  // (i.e. the icon URL contains the |kMVIconDarkParameter|).
+  bool GetIsDarkTile(const content::ToRenderFrameHost& frame, int index) {
+    bool dark_tile = false;
+    if (instant_test_utils::GetBoolFromJS(
+            frame,
+            base::StringPrintf(
+                "document.querySelectorAll('#mv-tiles .md-icon img')[%d]"
+                ".src.includes('%s')",
+                index, kMVIconDarkParameter),
+            &dark_tile)) {
+      return dark_tile;
+    }
+    return false;
+  }
+
+ private:
+  ui::TestNativeTheme theme_;
+};
+
+IN_PROC_BROWSER_TEST_F(LocalNTPDarkModeTest, ToggleDarkMode) {
+  // Initially disable dark mode.
+  InstantService* instant_service =
+      InstantServiceFactory::GetForProfile(browser()->profile());
+  theme()->SetDarkMode(false);
+  instant_service->SetDarkModeThemeForTesting(theme());
+
+  content::WebContents* active_tab =
+      local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
+  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
+
+  content::RenderFrameHost* mv_iframe =
+      GetIframe(active_tab, kMostVisitedIframe);
+  content::RenderFrameHost* cl_iframe =
+      GetIframe(active_tab, kEditCustomLinkIframe);
+
+  // Dark mode should not be applied to the main page, iframes, and Most Visited
+  // icons.
+  ASSERT_FALSE(GetIsDarkModeApplied(active_tab));
+  ASSERT_FALSE(GetIsDarkModeApplied(mv_iframe));
+  ASSERT_FALSE(GetIsDarkModeApplied(cl_iframe));
+  for (int i = 0; i < kDefaultMostVisitedItemCount; ++i) {
+    ASSERT_FALSE(GetIsDarkTile(mv_iframe, i));
+  }
+
+  // Enable dark mode and wait until the MV tiles have updated.
+  content::DOMMessageQueue msg_queue(active_tab);
+  theme()->SetDarkMode(true);
+  theme()->NotifyObservers();
+  local_ntp_test_utils::WaitUntilTilesLoaded(active_tab, &msg_queue,
+                                             /*delay=*/0);
+
+  // Check that dark mode has been properly applied.
+  EXPECT_TRUE(GetIsDarkModeApplied(active_tab));
+  EXPECT_TRUE(GetIsDarkModeApplied(mv_iframe));
+  EXPECT_TRUE(GetIsDarkModeApplied(cl_iframe));
+  for (int i = 0; i < kDefaultMostVisitedItemCount; ++i) {
+    EXPECT_TRUE(GetIsDarkTile(mv_iframe, i));
+  }
+
+  // Disable dark mode and wait until the MV tiles have updated.
+  msg_queue.ClearQueue();
+  theme()->SetDarkMode(false);
+  theme()->NotifyObservers();
+  local_ntp_test_utils::WaitUntilTilesLoaded(active_tab, &msg_queue,
+                                             /*delay=*/0);
+
+  // Check that dark mode has been removed.
+  EXPECT_FALSE(GetIsDarkModeApplied(active_tab));
+  EXPECT_FALSE(GetIsDarkModeApplied(mv_iframe));
+  EXPECT_FALSE(GetIsDarkModeApplied(cl_iframe));
+  for (int i = 0; i < kDefaultMostVisitedItemCount; ++i) {
+    EXPECT_FALSE(GetIsDarkTile(mv_iframe, i));
+  }
+}
+
+// Tests that dark mode styling is properly applied to the local NTP on start-
+// up. The test parameter controls whether dark mode is initially enabled or
+// disabled.
+class LocalNTPDarkModeStartupTest : public LocalNTPDarkModeTest,
+                                    public testing::WithParamInterface<bool> {
+ public:
+  LocalNTPDarkModeStartupTest() {}
+
+  bool DarkModeEnabled() { return GetParam(); }
+
+ private:
+  void SetUpOnMainThread() override {
+    LocalNTPTest::SetUpOnMainThread();
+
+    InstantService* instant_service =
+        InstantServiceFactory::GetForProfile(browser()->profile());
+    theme()->SetDarkMode(GetParam());
+    instant_service->SetDarkModeThemeForTesting(theme());
+  }
+};
+
+IN_PROC_BROWSER_TEST_P(LocalNTPDarkModeStartupTest, DarkModeApplied) {
+  const bool kDarkModeEnabled = DarkModeEnabled();
+  content::WebContents* active_tab =
+      local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
+  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
+
+  content::RenderFrameHost* mv_iframe =
+      GetIframe(active_tab, kMostVisitedIframe);
+  content::RenderFrameHost* cl_iframe =
+      GetIframe(active_tab, kEditCustomLinkIframe);
+
+  // Check that dark mode, if enabled, has been properly applied to the main
+  // page, iframes, and Most Visited icons.
+  EXPECT_EQ(kDarkModeEnabled, GetIsDarkModeApplied(active_tab));
+  EXPECT_EQ(kDarkModeEnabled, GetIsDarkModeApplied(mv_iframe));
+  EXPECT_EQ(kDarkModeEnabled, GetIsDarkModeApplied(cl_iframe));
+  for (int i = 0; i < kDefaultMostVisitedItemCount; ++i) {
+    EXPECT_EQ(kDarkModeEnabled, GetIsDarkTile(mv_iframe, i));
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(, LocalNTPDarkModeStartupTest, testing::Bool());
+
 // A minimal implementation of an interstitial page.
 class TestInterstitialPageDelegate : public content::InterstitialPageDelegate {
  public:
diff --git a/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc b/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc
index 3a065ff..41811f8 100644
--- a/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_suggestions_browsertest.cc
@@ -37,7 +37,7 @@
     return search_suggest_data_;
   }
 
-  void SuggestionsDisplayed() override { impression_count_++; };
+  void SuggestionsDisplayed() override { impression_count_++; }
 
   int impression_count() { return impression_count_; }
 
diff --git a/chrome/browser/ui/search/local_ntp_test_utils.cc b/chrome/browser/ui/search/local_ntp_test_utils.cc
index 8c6de31..d2a2c9c 100644
--- a/chrome/browser/ui/search/local_ntp_test_utils.cc
+++ b/chrome/browser/ui/search/local_ntp_test_utils.cc
@@ -30,7 +30,52 @@
 
 namespace local_ntp_test_utils {
 
-namespace {
+content::WebContents* OpenNewTab(Browser* browser, const GURL& url) {
+  ui_test_utils::NavigateToURLWithDisposition(
+      browser, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
+      ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
+          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+  return browser->tab_strip_model()->GetActiveWebContents();
+}
+
+void NavigateToNTPAndWaitUntilLoaded(Browser* browser, int delay) {
+  content::WebContents* active_tab =
+      browser->tab_strip_model()->GetActiveWebContents();
+
+  ASSERT_FALSE(search::IsInstantNTP(active_tab));
+
+  // Attach a message queue *before* navigating to the NTP, to make sure we
+  // don't miss the 'loaded' message due to some race condition.
+  content::DOMMessageQueue msg_queue(active_tab);
+
+  // Navigate to the NTP.
+  ui_test_utils::NavigateToURL(browser, GURL(chrome::kChromeUINewTabURL));
+  ASSERT_TRUE(search::IsInstantNTP(active_tab));
+  ASSERT_EQ(GURL(chrome::kChromeSearchLocalNtpUrl),
+            active_tab->GetController().GetVisibleEntry()->GetURL());
+
+  WaitUntilTilesLoaded(active_tab, &msg_queue, delay);
+}
+
+void ExecuteScriptOnNTPAndWaitUntilLoaded(content::RenderFrameHost* host,
+                                          const std::string& script) {
+  content::WebContents* contents =
+      content::WebContents::FromRenderFrameHost(host);
+
+  ASSERT_TRUE(search::IsInstantNTP(contents));
+
+  // Attach a message queue *before* executing the script, to make sure we don't
+  // miss the 'loaded' message due to some race condition.
+  content::DOMMessageQueue msg_queue(contents);
+
+  // Execute the script, and get rid of the message that the ExecuteScript call
+  // produces.
+  EXPECT_TRUE(content::ExecuteScript(host, script));
+  std::string message;
+  ASSERT_TRUE(msg_queue.PopMessage(&message));
+
+  WaitUntilTilesLoaded(contents, &msg_queue, /*delay=*/0);
+}
 
 void WaitUntilTilesLoaded(content::WebContents* active_tab,
                           content::DOMMessageQueue* msg_queue,
@@ -79,55 +124,6 @@
   ASSERT_FALSE(msg_queue->PopMessage(&message));
 }
 
-}  // namespace
-
-content::WebContents* OpenNewTab(Browser* browser, const GURL& url) {
-  ui_test_utils::NavigateToURLWithDisposition(
-      browser, url, WindowOpenDisposition::NEW_FOREGROUND_TAB,
-      ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
-          ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
-  return browser->tab_strip_model()->GetActiveWebContents();
-}
-
-void NavigateToNTPAndWaitUntilLoaded(Browser* browser, int delay) {
-  content::WebContents* active_tab =
-      browser->tab_strip_model()->GetActiveWebContents();
-
-  ASSERT_FALSE(search::IsInstantNTP(active_tab));
-
-  // Attach a message queue *before* navigating to the NTP, to make sure we
-  // don't miss the 'loaded' message due to some race condition.
-  content::DOMMessageQueue msg_queue(active_tab);
-
-  // Navigate to the NTP.
-  ui_test_utils::NavigateToURL(browser, GURL(chrome::kChromeUINewTabURL));
-  ASSERT_TRUE(search::IsInstantNTP(active_tab));
-  ASSERT_EQ(GURL(chrome::kChromeSearchLocalNtpUrl),
-            active_tab->GetController().GetVisibleEntry()->GetURL());
-
-  WaitUntilTilesLoaded(active_tab, &msg_queue, delay);
-}
-
-void ExecuteScriptOnNTPAndWaitUntilLoaded(content::RenderFrameHost* host,
-                                          const std::string& script) {
-  content::WebContents* contents =
-      content::WebContents::FromRenderFrameHost(host);
-
-  ASSERT_TRUE(search::IsInstantNTP(contents));
-
-  // Attach a message queue *before* executing the script, to make sure we don't
-  // miss the 'loaded' message due to some race condition.
-  content::DOMMessageQueue msg_queue(contents);
-
-  // Execute the script, and get rid of the message that the ExecuteScript call
-  // produces.
-  EXPECT_TRUE(content::ExecuteScript(host, script));
-  std::string message;
-  ASSERT_TRUE(msg_queue.PopMessage(&message));
-
-  WaitUntilTilesLoaded(contents, &msg_queue, /*delay=*/0);
-}
-
 bool SwitchBrowserLanguageToFrench() {
   base::ScopedAllowBlockingForTesting allow_blocking;
   // Make sure the default language is not French.
diff --git a/chrome/browser/ui/search/local_ntp_test_utils.h b/chrome/browser/ui/search/local_ntp_test_utils.h
index d9f0391..695d796 100644
--- a/chrome/browser/ui/search/local_ntp_test_utils.h
+++ b/chrome/browser/ui/search/local_ntp_test_utils.h
@@ -12,6 +12,7 @@
 class Profile;
 
 namespace content {
+class DOMMessageQueue;
 class RenderFrameHost;
 class WebContents;
 }  // namespace content
@@ -34,6 +35,13 @@
 void ExecuteScriptOnNTPAndWaitUntilLoaded(content::RenderFrameHost* host,
                                           const std::string& script);
 
+// Waits until the NTP tiles are loaded after a |delay|. |msg_queue| must be
+// initialized with |active_tab| before calling this function, otherwise we may
+// miss the 'loaded' message.
+void WaitUntilTilesLoaded(content::WebContents* active_tab,
+                          content::DOMMessageQueue* msg_queue,
+                          int delay);
+
 // Switches the browser language to French, and returns true iff successful.
 bool SwitchBrowserLanguageToFrench();
 
diff --git a/chrome/browser/ui/tabs/tab_menu_model.cc b/chrome/browser/ui/tabs/tab_menu_model.cc
index 150a1fe..5ffce3ae 100644
--- a/chrome/browser/ui/tabs/tab_menu_model.cc
+++ b/chrome/browser/ui/tabs/tab_menu_model.cc
@@ -6,13 +6,14 @@
 
 #include "base/command_line.h"
 #include "chrome/browser/browser_features.h"
+#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
+#include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/tabs/existing_tab_group_sub_menu_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_delegate.h"
 #include "chrome/browser/ui/tabs/tab_utils.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/grit/generated_resources.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "ui/base/l10n/l10n_util.h"
 
 TabMenuModel::TabMenuModel(ui::SimpleMenuModel::Delegate* delegate,
@@ -81,7 +82,10 @@
                 : l10n_util::GetPluralStringFUTF16(
                       IDS_TAB_CXMENU_AUDIO_UNMUTE_TAB, num_affected_tabs));
   }
-  if (base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
+
+  Browser* browser =
+      chrome::FindBrowserWithWebContents(tab_strip->GetWebContentsAt(index));
+  if (send_tab_to_self::ShouldOfferFeature(browser)) {
     AddItemWithStringId(TabStripModel::CommandSendToMyDevices,
                         IDS_TAB_CXMENU_SEND_TO_MY_DEVICES);
   }
diff --git a/chrome/browser/ui/toolbar/app_menu_model.cc b/chrome/browser/ui/toolbar/app_menu_model.cc
index f49e150d..a7baceda 100644
--- a/chrome/browser/ui/toolbar/app_menu_model.cc
+++ b/chrome/browser/ui/toolbar/app_menu_model.cc
@@ -28,6 +28,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/search/search.h"
+#include "chrome/browser/send_tab_to_self/send_tab_to_self_util.h"
 #include "chrome/browser/ui/bookmarks/bookmark_utils.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
@@ -55,7 +56,6 @@
 #include "components/prefs/pref_service.h"
 #include "components/signin/core/browser/signin_metrics.h"
 #include "components/strings/grit/components_strings.h"
-#include "components/sync/driver/sync_driver_switches.h"
 #include "components/vector_icons/vector_icons.h"
 #include "components/zoom/zoom_controller.h"
 #include "components/zoom/zoom_event_manager.h"
@@ -765,7 +765,7 @@
 
   AddItemWithStringId(IDC_FIND, IDS_FIND);
 
-  if (base::FeatureList::IsEnabled(switches::kSyncSendTabToSelf)) {
+  if (send_tab_to_self::ShouldOfferFeature(browser_)) {
     AddItemWithStringId(IDC_SEND_TO_MY_DEVICES, IDS_SEND_TO_MY_DEVICES);
   }
 
diff --git a/chrome/browser/ui/toolbar/back_forward_menu_model.cc b/chrome/browser/ui/toolbar/back_forward_menu_model.cc
index 3935133..c7b2c654 100644
--- a/chrome/browser/ui/toolbar/back_forward_menu_model.cc
+++ b/chrome/browser/ui/toolbar/back_forward_menu_model.cc
@@ -216,15 +216,6 @@
   return index == history_items;
 }
 
-void BackForwardMenuModel::SetMenuModelDelegate(
-      ui::MenuModelDelegate* menu_model_delegate) {
-  menu_model_delegate_ = menu_model_delegate;
-}
-
-ui::MenuModelDelegate* BackForwardMenuModel::GetMenuModelDelegate() const {
-  return menu_model_delegate_;
-}
-
 void BackForwardMenuModel::FetchFavicon(NavigationEntry* entry) {
   // If the favicon has already been requested for this menu, don't do
   // anything.
diff --git a/chrome/browser/ui/toolbar/back_forward_menu_model.h b/chrome/browser/ui/toolbar/back_forward_menu_model.h
index 5139414..85c31f97 100644
--- a/chrome/browser/ui/toolbar/back_forward_menu_model.h
+++ b/chrome/browser/ui/toolbar/back_forward_menu_model.h
@@ -73,14 +73,6 @@
   // Is the item at |index| a separator?
   bool IsSeparator(int index) const;
 
-  // Set the delegate for triggering OnIconChanged.
-  void SetMenuModelDelegate(
-      ui::MenuModelDelegate* menu_model_delegate) override;
-  ui::MenuModelDelegate* GetMenuModelDelegate() const override;
-
- protected:
-  ui::MenuModelDelegate* menu_model_delegate() { return menu_model_delegate_; }
-
  private:
   friend class BackFwdMenuModelTest;
   FRIEND_TEST_ALL_PREFIXES(BackFwdMenuModelTest, BasicCase);
@@ -200,9 +192,6 @@
   // Used for loading favicons.
   base::CancelableTaskTracker cancelable_task_tracker_;
 
-  // Used for receiving notifications when an icon is changed.
-  ui::MenuModelDelegate* menu_model_delegate_ = nullptr;
-
   DISALLOW_COPY_AND_ASSIGN(BackForwardMenuModel);
 };
 
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
index 8ccdd5ca..3b86a61 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model.cc
@@ -605,9 +605,9 @@
   int index_in_menu = GetIndexOfCommandId(command_id);
   DCHECK_GT(index_in_menu, -1);
   SetIcon(index_in_menu, image_result.image);
-  ui::MenuModelDelegate* menu_model_delegate = GetMenuModelDelegate();
-  if (menu_model_delegate)
-    menu_model_delegate->OnIconChanged(index_in_menu);
+  ui::MenuModelDelegate* delegate = menu_model_delegate();
+  if (delegate)
+    delegate->OnIconChanged(index_in_menu);
 }
 
 int RecentTabsSubMenuModel::CommandIdToTabVectorIndex(
@@ -662,9 +662,9 @@
 
   BuildLocalEntries();
 
-  ui::MenuModelDelegate* menu_model_delegate = GetMenuModelDelegate();
-  if (menu_model_delegate)
-    menu_model_delegate->OnMenuStructureChanged();
+  ui::MenuModelDelegate* delegate = menu_model_delegate();
+  if (delegate)
+    delegate->OnMenuStructureChanged();
 }
 
 void RecentTabsSubMenuModel::TabRestoreServiceDestroyed(
@@ -677,7 +677,7 @@
 
   BuildTabsFromOtherDevices();
 
-  ui::MenuModelDelegate* menu_model_delegate = GetMenuModelDelegate();
-  if (menu_model_delegate)
-    menu_model_delegate->OnMenuStructureChanged();
+  ui::MenuModelDelegate* delegate = menu_model_delegate();
+  if (delegate)
+    delegate->OnMenuStructureChanged();
 }
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
index 98dac6d..500ca005 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
@@ -91,7 +91,7 @@
   }
 
   ~TestRecentTabsMenuModelDelegate() override {
-    model_->SetMenuModelDelegate(NULL);
+    model_->SetMenuModelDelegate(nullptr);
   }
 
   // ui::MenuModelDelegate implementation:
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
index d4bf3b2..952b633 100644
--- a/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/save_card_bubble_views_browsertest.cc
@@ -44,7 +44,6 @@
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/network_session_configurator/common/network_switches.h"
-#include "components/signin/core/browser/fake_account_fetcher_service.h"
 #include "components/signin/core/browser/signin_buildflags.h"
 #include "components/sync/test/fake_server/fake_server.h"
 #include "components/sync/test/fake_server/fake_server_network_resources.h"
diff --git a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
index 4d65fb27..2a64127 100644
--- a/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
+++ b/chrome/browser/ui/views/drag_and_drop_interactive_uitest.cc
@@ -518,7 +518,7 @@
 class DragAndDropBrowserTest : public InProcessBrowserTest,
                                public testing::WithParamInterface<bool> {
  public:
-  DragAndDropBrowserTest(){};
+  DragAndDropBrowserTest() {}
 
   struct DragImageBetweenFrames_TestState;
   void DragImageBetweenFrames_Step2(DragImageBetweenFrames_TestState*);
diff --git a/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc b/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc
index 03bc3b3..17d2a1a 100644
--- a/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc
+++ b/chrome/browser/ui/views/extensions/extension_dialog_interactive_uitest.cc
@@ -74,4 +74,4 @@
                   browser()->window()->GetNativeWindow(),
                   ui::VKEY_TAB, false, true, false, false));
   ASSERT_TRUE(button3_focus_listener.WaitUntilSatisfied());
-};
+}
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index e45d1ef..8da1c3f 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -2279,9 +2279,9 @@
   // (Windows) or Ctrl+Back/Forward (Chrome OS).  If one of these is
   // invisible or has no focusable children, it will be automatically
   // skipped.
+  panes->push_back(toolbar_button_provider_->GetAsAccessiblePaneView());
   if (tabstrip_)
     panes->push_back(tabstrip_);
-  panes->push_back(toolbar_button_provider_->GetAsAccessiblePaneView());
   if (bookmark_bar_view_.get())
     panes->push_back(bookmark_bar_view_.get());
   if (infobar_container_)
diff --git a/chrome/browser/ui/views/menu_model_adapter_test.cc b/chrome/browser/ui/views/menu_model_adapter_test.cc
index 9021259..1414a3b 100644
--- a/chrome/browser/ui/views/menu_model_adapter_test.cc
+++ b/chrome/browser/ui/views/menu_model_adapter_test.cc
@@ -75,12 +75,6 @@
 
   void ActivatedAt(int index) override {}
 
-  void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) override {}
-
-  ui::MenuModelDelegate* GetMenuModelDelegate() const override {
-    return nullptr;
-  }
-
  private:
   DISALLOW_COPY_AND_ASSIGN(CommonMenuModel);
 };
diff --git a/chrome/browser/ui/views/toolbar/toolbar_action_view_unittest.cc b/chrome/browser/ui/views/toolbar/toolbar_action_view_unittest.cc
index ff27520..bb679b7 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_action_view_unittest.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_action_view_unittest.cc
@@ -81,7 +81,7 @@
                               const gfx::Point& point,
                               ui::MenuSourceType source_type) override {
     opened_menu_ = true;
-  };
+  }
 
   bool opened_menu() const { return opened_menu_; }
 
diff --git a/chrome/browser/ui/views/toolbar/toolbar_button_unittest.cc b/chrome/browser/ui/views/toolbar/toolbar_button_unittest.cc
index 11607fb..69b42aae 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_button_unittest.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_button_unittest.cc
@@ -52,10 +52,6 @@
   bool IsEnabledAt(int index) const override { return false; }
   ui::MenuModel* GetSubmenuModelAt(int index) const override { return nullptr; }
   void ActivatedAt(int index) override {}
-  void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) override {}
-  ui::MenuModelDelegate* GetMenuModelDelegate() const override {
-    return nullptr;
-  }
 
  private:
   TabStripModel* const tab_strip_model_;
diff --git a/chrome/browser/ui/views/translate/translate_language_browsertest.cc b/chrome/browser/ui/views/translate/translate_language_browsertest.cc
index a6bcc1ca6..9b688ba 100644
--- a/chrome/browser/ui/views/translate/translate_language_browsertest.cc
+++ b/chrome/browser/ui/views/translate/translate_language_browsertest.cc
@@ -74,7 +74,7 @@
 
 using LanguageInfo = language::UrlLanguageHistogram::LanguageInfo;
 
-};  // namespace
+}  // namespace
 
 class TranslateLanguageBrowserTest : public InProcessBrowserTest {
  public:
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
new file mode 100644
index 0000000..a68338004
--- /dev/null
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
@@ -0,0 +1,83 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/feature_list.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/web_applications/components/install_manager.h"
+#include "chrome/browser/web_applications/components/web_app_install_utils.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/web_application_info.h"
+
+namespace web_app {
+
+namespace {
+
+// Use tricky function adapters here to connect old API with new unique_ptr
+// based API. TODO(loyso): Erase these type adapters. crbug.com/915043.
+using AcceptanceCallback = InstallManager::WebAppInstallationAcceptanceCallback;
+
+void BookmarkAppAcceptanceCallback(
+    AcceptanceCallback web_app_acceptance_callback,
+    bool user_accepted,
+    const WebApplicationInfo& web_app_info) {
+  std::move(web_app_acceptance_callback)
+      .Run(user_accepted, std::make_unique<WebApplicationInfo>(web_app_info));
+}
+
+void WebAppInstallDialogCallback(
+    content::WebContents* initiator_web_contents,
+    std::unique_ptr<WebApplicationInfo> web_app_info,
+    ForInstallableSite for_installable_site,
+    AcceptanceCallback web_app_acceptance_callback) {
+  if (base::FeatureList::IsEnabled(::features::kDesktopPWAWindowing) &&
+      for_installable_site == ForInstallableSite::kYes) {
+    web_app_info->open_as_window = true;
+    chrome::ShowPWAInstallDialog(
+        initiator_web_contents, *web_app_info,
+        base::BindOnce(BookmarkAppAcceptanceCallback,
+                       std::move(web_app_acceptance_callback)));
+  } else {
+    chrome::ShowBookmarkAppDialog(
+        initiator_web_contents, *web_app_info,
+        base::BindOnce(BookmarkAppAcceptanceCallback,
+                       std::move(web_app_acceptance_callback)));
+  }
+}
+
+}  // namespace
+
+bool CanCreateWebApp(const Browser* browser) {
+  content::WebContents* web_contents =
+      browser->tab_strip_model()->GetActiveWebContents();
+  auto* provider = WebAppProvider::GetForWebContents(web_contents);
+  if (!provider)
+    return false;
+
+  return provider->install_manager().CanInstallWebApp(web_contents);
+}
+
+void CreateWebAppFromCurrentWebContents(Browser* browser,
+                                        bool force_shortcut_app) {
+  DCHECK(CanCreateWebApp(browser));
+
+  content::WebContents* web_contents =
+      browser->tab_strip_model()->GetActiveWebContents();
+  auto* provider = WebAppProvider::GetForWebContents(web_contents);
+  DCHECK(provider);
+
+  provider->install_manager().InstallWebApp(
+      web_contents, force_shortcut_app,
+      base::BindOnce(WebAppInstallDialogCallback), base::DoNothing());
+}
+
+}  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.h b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
new file mode 100644
index 0000000..e47c16f
--- /dev/null
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
@@ -0,0 +1,21 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOG_UTILS_H_
+#define CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOG_UTILS_H_
+
+class Browser;
+
+namespace web_app {
+
+// Returns true if a WebApp installation is allowed for the current page.
+bool CanCreateWebApp(const Browser* browser);
+
+// Initiates install of a WebApp for the current page.
+void CreateWebAppFromCurrentWebContents(Browser* browser,
+                                        bool force_shortcut_app);
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOG_UTILS_H_
diff --git a/chrome/browser/ui/webui/app_management/app_management.mojom b/chrome/browser/ui/webui/app_management/app_management.mojom
index c536372..4053cde 100644
--- a/chrome/browser/ui/webui/app_management/app_management.mojom
+++ b/chrome/browser/ui/webui/app_management/app_management.mojom
@@ -53,10 +53,21 @@
   OnAppRemoved(string app_id);
 };
 
-// This enum takes the important permission values from the
-// contents_settings_type.h ContentSettingsType enum. The App Publisher is
+// Permission Type Enums for each App Publisher. The App Publishers are
 // required to provide these values so the WebUI can map permission ID to
 // permission value.
+
+// This enum shows the ARC permission values currently supported over the
+// App Service. It should always match the AppPermission enum in
+// app_permissions.mojom
+enum ArcPermissionType {
+  CAMERA,
+  LOCATION,
+  MICROPHONE,
+};
+
+// This enum takes the important permission values from the
+// contents_settings_type.h ContentSettingsType enum.
 enum PwaPermissionType {
   CONTENT_SETTINGS_TYPE_GEOLOCATION = 5,
   CONTENT_SETTINGS_TYPE_NOTIFICATIONS = 6,
diff --git a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
index f2ab1c1..c75cfe4 100644
--- a/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
+++ b/chrome/browser/ui/webui/app_management/app_management_page_handler.cc
@@ -95,7 +95,11 @@
 
   std::vector<app_management::mojom::AppPtr> apps;
   proxy->Cache().ForEachApp([this, &apps](const apps::AppUpdate& update) {
-    apps.push_back(CreateUIAppPtr(update));
+    // TODO(crbug.com/906508): Decide on a better way to stop
+    // built-in apps showing up on the app management page.
+    if (update.AppType() != apps::mojom::AppType::kBuiltIn) {
+      apps.push_back(CreateUIAppPtr(update));
+    }
   });
 
   std::move(callback).Run(std::move(apps));
@@ -189,6 +193,12 @@
 }
 
 void AppManagementPageHandler::OnAppUpdate(const apps::AppUpdate& update) {
+  // TODO(crbug.com/906508): Decide on a better way to stop
+  // built-in apps showing up on the app management page.
+  if (update.AppType() == apps::mojom::AppType::kBuiltIn) {
+    return;
+  }
+
   if (update.ReadinessChanged() &&
       update.Readiness() == apps::mojom::Readiness::kUninstalledByUser) {
     page_->OnAppRemoved(update.AppId());
diff --git a/chrome/browser/ui/webui/app_management/app_management_ui.cc b/chrome/browser/ui/webui/app_management/app_management_ui.cc
index 6961c64..d6758b6c 100644
--- a/chrome/browser/ui/webui/app_management/app_management_ui.cc
+++ b/chrome/browser/ui/webui/app_management/app_management_ui.cc
@@ -41,6 +41,8 @@
   source->AddLocalizedString("notificationSublabel",
                              IDS_APP_MANAGEMENT_NOTIFICATIONS_SUBLABEL);
   source->AddLocalizedString("notifications", IDS_APP_MANAGEMENT_NOTIFICATIONS);
+  source->AddLocalizedString("openAndroidSettings",
+                             IDS_APP_MANAGEMENT_ANDROID_SETTINGS);
   source->AddLocalizedString("openSiteSettings",
                              IDS_APP_MANAGEMENT_SITE_SETTING);
   source->AddLocalizedString("permissions", IDS_APP_MANAGEMENT_PERMISSIONS);
@@ -76,6 +78,10 @@
   source->AddResourcePath("app.js", IDR_APP_MANAGEMENT_APP_JS);
   source->AddResourcePath("app_item.html", IDR_APP_MANAGEMENT_APP_ITEM_HTML);
   source->AddResourcePath("app_item.js", IDR_APP_MANAGEMENT_APP_ITEM_JS);
+  source->AddResourcePath("arc_permission_view.html",
+                          IDR_APP_MANAGEMENT_ARC_PERMISSION_VIEW_HTML);
+  source->AddResourcePath("arc_permission_view.js",
+                          IDR_APP_MANAGEMENT_ARC_PERMISSION_VIEW_JS);
   source->AddResourcePath("browser_proxy.html",
                           IDR_APP_MANAGEMENT_BROWSER_PROXY_HTML);
   source->AddResourcePath("browser_proxy.js",
diff --git a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.h b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.h
index 1840f21e..c0bfa634 100644
--- a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.h
+++ b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.h
@@ -10,7 +10,7 @@
 
 namespace base {
 class ListValue;
-};
+}
 
 class BookmarksMessageHandler : public content::WebUIMessageHandler {
  public:
diff --git a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
index b4555044..13263f17 100644
--- a/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/signin_screen_handler.cc
@@ -335,7 +335,6 @@
   builder->Add("moreOptions", IDS_MORE_OPTIONS_BUTTON);
   builder->Add("cancel", IDS_ASH_SHELF_CANCEL_BUTTON);
   builder->Add("signOutUser", IDS_ASH_SHELF_SIGN_OUT_BUTTON);
-  builder->Add("unlockUser", IDS_ASH_SHELF_UNLOCK_BUTTON);
   builder->Add("offlineLogin", IDS_OFFLINE_LOGIN_HTML);
   builder->Add("ownerUserPattern", IDS_LOGIN_POD_OWNER_USER);
   builder->Add("removeUser", IDS_LOGIN_POD_REMOVE_USER);
@@ -451,9 +450,6 @@
                IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_CONTINUE);
   builder->Add("unrecoverableCryptohomeErrorRecreatingProfile",
                IDS_LOGIN_UNRECOVERABLE_CRYPTOHOME_ERROR_WAIT_MESSAGE);
-
-  builder->Add("newLockScreenNoteButton",
-               IDS_LOGIN_NEW_LOCK_SCREEN_NOTE_BUTTON_TITLE);
 }
 
 void SigninScreenHandler::RegisterMessages() {
diff --git a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
index 973084a..2eade8b 100644
--- a/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
+++ b/chrome/browser/ui/webui/extensions/extension_settings_browsertest.cc
@@ -250,7 +250,7 @@
   // Enable command line flags for test.
   void SetUpCommandLine(base::CommandLine* command_line) override {
     command_line->AppendSwitch(switches::kEnableExtensionActivityLogging);
-  };
+  }
 };
 
 IN_PROC_BROWSER_TEST_F(ExtensionsActivityLogTest, TestActivityLogVisible) {
diff --git a/chrome/browser/ui/webui/history_ui.cc b/chrome/browser/ui/webui/history_ui.cc
index e1ba4983..7ce4453 100644
--- a/chrome/browser/ui/webui/history_ui.cc
+++ b/chrome/browser/ui/webui/history_ui.cc
@@ -152,7 +152,6 @@
     {"history_list.js", IDR_MD_HISTORY_HISTORY_LIST_JS},
     {"history_toolbar.html", IDR_MD_HISTORY_HISTORY_TOOLBAR_HTML},
     {"history_toolbar.js", IDR_MD_HISTORY_HISTORY_TOOLBAR_JS},
-    {"icons.html", IDR_MD_HISTORY_ICONS_HTML},
     {"lazy_load.html", IDR_MD_HISTORY_LAZY_LOAD_HTML},
     {"query_manager.html", IDR_MD_HISTORY_QUERY_MANAGER_HTML},
     {"query_manager.js", IDR_MD_HISTORY_QUERY_MANAGER_JS},
diff --git a/chrome/browser/vr/animation.cc b/chrome/browser/vr/animation.cc
index 0505fde..3c41f8b 100644
--- a/chrome/browser/vr/animation.cc
+++ b/chrome/browser/vr/animation.cc
@@ -126,7 +126,7 @@
       animation_target->NotifyClient##notify_name##Animated(                  \
           target_value, target_property, nullptr);                            \
     }                                                                         \
-  };
+  }
 
 DEFINE_ANIMATION_TRAITS(float, Float, Float);
 DEFINE_ANIMATION_TRAITS(cc::TransformOperations,
@@ -135,6 +135,8 @@
 DEFINE_ANIMATION_TRAITS(gfx::SizeF, Size, Size);
 DEFINE_ANIMATION_TRAITS(SkColor, Color, Color);
 
+#undef DEFINE_ANIMATION_TRAITS
+
 }  // namespace
 
 int Animation::GetNextKeyframeModelId() {
diff --git a/chrome/browser/vr/platform_controller_for_testing.h b/chrome/browser/vr/platform_controller_for_testing.h
index d7e13f9..a3aa0f17 100644
--- a/chrome/browser/vr/platform_controller_for_testing.h
+++ b/chrome/browser/vr/platform_controller_for_testing.h
@@ -18,7 +18,7 @@
       ControllerModel* prev_model,
       ControllerModel* cur_model,
       base::TimeTicks last_touchpad_timestamp);
-  ~PlatformControllerForTesting() override{};
+  ~PlatformControllerForTesting() override {}
 
   bool IsButtonDown(PlatformController::ButtonType type) const override;
   bool ButtonUpHappened(PlatformController::ButtonType type) const override;
diff --git a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc
index 8ed6821..7a70303 100644
--- a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc
+++ b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.cc
@@ -27,7 +27,11 @@
 void BookmarkAppInstallManager::InstallWebApp(
     content::WebContents* web_contents,
     bool force_shortcut_app,
+    WebAppInstallDialogCallback dialog_callback,
     OnceInstallCallback callback) {
+  // Ignore dialog_callback for legacy installations.
+  // BookmarkAppHelper directly uses chrome::ShowPWAInstallDialog from UI
+  // (which is a layering violation). TODO(loyso): Unify it. crbug.com/915043.
   extensions::TabHelper::FromWebContents(web_contents)
       ->CreateHostedAppFromWebContents(
           force_shortcut_app,
diff --git a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h
index 36366e7..54afbbd 100644
--- a/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h
+++ b/chrome/browser/web_applications/bookmark_apps/bookmark_app_install_manager.h
@@ -19,6 +19,7 @@
   bool CanInstallWebApp(content::WebContents* web_contents) override;
   void InstallWebApp(content::WebContents* web_contents,
                      bool force_shortcut_app,
+                     WebAppInstallDialogCallback dialog_callback,
                      OnceInstallCallback callback) override;
 
  private:
diff --git a/chrome/browser/web_applications/bookmark_apps/system_web_app_manager_browsertest.cc b/chrome/browser/web_applications/bookmark_apps/system_web_app_manager_browsertest.cc
index 4517b1b1..f86e30d 100644
--- a/chrome/browser/web_applications/bookmark_apps/system_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/bookmark_apps/system_web_app_manager_browsertest.cc
@@ -154,8 +154,8 @@
   system_apps.emplace_back(GURL("chrome://test-system-app/pwa.html"));
   test_system_web_app_manager_->SetSystemApps(std::move(system_apps));
 
-  // Start all subsystems:
-  provider->Start();
+  // Start registry and all dependent subsystems:
+  provider->StartRegistry();
 
   return provider;
 }
diff --git a/chrome/browser/web_applications/components/install_manager.h b/chrome/browser/web_applications/components/install_manager.h
index 36a0672..d845601c 100644
--- a/chrome/browser/web_applications/components/install_manager.h
+++ b/chrome/browser/web_applications/components/install_manager.h
@@ -5,8 +5,13 @@
 #ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_INSTALL_MANAGER_H_
 #define CHROME_BROWSER_WEB_APPLICATIONS_COMPONENTS_INSTALL_MANAGER_H_
 
+#include <memory>
+
 #include "base/callback_forward.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_install_utils.h"
+
+struct WebApplicationInfo;
 
 namespace content {
 class WebContents;
@@ -21,6 +26,20 @@
   using OnceInstallCallback =
       base::OnceCallback<void(const AppId& app_id, InstallResultCode code)>;
 
+  // Callback used to indicate whether a user has accepted the installation of a
+  // web app.
+  using WebAppInstallationAcceptanceCallback =
+      base::OnceCallback<void(bool user_accepted,
+                              std::unique_ptr<WebApplicationInfo>)>;
+
+  // Callback to show the WebApp installation confirmation bubble in UI.
+  // |web_app_info| is the WebApplicationInfo to be installed.
+  using WebAppInstallDialogCallback = base::OnceCallback<void(
+      content::WebContents* initiator_web_contents,
+      std::unique_ptr<WebApplicationInfo> web_app_info,
+      ForInstallableSite for_installable_site,
+      WebAppInstallationAcceptanceCallback acceptance_callback)>;
+
   // Returns true if a web app can be installed for a given |web_contents|.
   virtual bool CanInstallWebApp(content::WebContents* web_contents) = 0;
 
@@ -29,6 +48,7 @@
   // even if installation is available.
   virtual void InstallWebApp(content::WebContents* web_contents,
                              bool force_shortcut_app,
+                             WebAppInstallDialogCallback dialog_callback,
                              OnceInstallCallback callback) = 0;
 
   virtual ~InstallManager() = default;
diff --git a/chrome/browser/web_applications/components/web_app_constants.h b/chrome/browser/web_applications/components/web_app_constants.h
index efd0cfd7..f26dcf6c 100644
--- a/chrome/browser/web_applications/components/web_app_constants.h
+++ b/chrome/browser/web_applications/components/web_app_constants.h
@@ -35,7 +35,8 @@
   kPreviouslyUninstalled = 4,
   kWebContentsDestroyed = 5,
   kWriteDataFailed = 6,
-  kMaxValue = kWriteDataFailed,
+  kUserInstallDeclined = 7,
+  kMaxValue = kUserInstallDeclined,
 };
 
 // Where an app was installed from. This affects what flags will be used when
diff --git a/chrome/browser/web_applications/web_app_install_manager.cc b/chrome/browser/web_applications/web_app_install_manager.cc
index 3438c76..797058d 100644
--- a/chrome/browser/web_applications/web_app_install_manager.cc
+++ b/chrome/browser/web_applications/web_app_install_manager.cc
@@ -36,9 +36,11 @@
          IsValidWebAppUrl(web_contents->GetLastCommittedURL());
 }
 
-void WebAppInstallManager::InstallWebApp(content::WebContents* contents,
-                                         bool force_shortcut_app,
-                                         OnceInstallCallback install_callback) {
+void WebAppInstallManager::InstallWebApp(
+    content::WebContents* contents,
+    bool force_shortcut_app,
+    WebAppInstallDialogCallback dialog_callback,
+    OnceInstallCallback install_callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(AreWebAppsUserInstallable(profile_));
 
@@ -47,6 +49,7 @@
   CHECK(!install_callback_);
 
   Observe(contents);
+  dialog_callback_ = std::move(dialog_callback);
   install_callback_ = std::move(install_callback);
 
   data_retriever_->GetWebApplicationInfo(
@@ -141,11 +144,13 @@
   data_retriever_->GetIcons(
       web_contents(), icon_urls, skip_page_fav_icons,
       base::BindOnce(&WebAppInstallManager::OnIconsRetrieved,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(web_app_info)));
+                     weak_ptr_factory_.GetWeakPtr(), std::move(web_app_info),
+                     for_installable_site));
 }
 
 void WebAppInstallManager::OnIconsRetrieved(
     std::unique_ptr<WebApplicationInfo> web_app_info,
+    ForInstallableSite for_installable_site,
     IconsMap icons_map) {
   // If interrupted, install_callback_ is already invoked or may invoke later.
   if (InstallInterrupted())
@@ -158,6 +163,22 @@
   ResizeDownloadedIconsGenerateMissing(std::move(downloaded_icons),
                                        web_app_info.get());
 
+  std::move(dialog_callback_)
+      .Run(web_contents(), std::move(web_app_info), for_installable_site,
+           base::BindOnce(&WebAppInstallManager::OnDialogCompleted,
+                          weak_ptr_factory_.GetWeakPtr()));
+}
+
+void WebAppInstallManager::OnDialogCompleted(
+    bool user_accepted,
+    std::unique_ptr<WebApplicationInfo> web_app_info) {
+  // If interrupted, install_callback_ is already invoked or may invoke later.
+  if (InstallInterrupted())
+    return;
+
+  if (!user_accepted)
+    return ReturnError(InstallResultCode::kUserInstallDeclined);
+
   install_finalizer_->FinalizeInstall(
       std::move(web_app_info),
       base::BindOnce(&WebAppInstallManager::OnInstallFinalized,
diff --git a/chrome/browser/web_applications/web_app_install_manager.h b/chrome/browser/web_applications/web_app_install_manager.h
index d50b796..f27a868 100644
--- a/chrome/browser/web_applications/web_app_install_manager.h
+++ b/chrome/browser/web_applications/web_app_install_manager.h
@@ -40,6 +40,7 @@
   bool CanInstallWebApp(content::WebContents* web_contents) override;
   void InstallWebApp(content::WebContents* contents,
                      bool force_shortcut_app,
+                     WebAppInstallDialogCallback dialog_callback,
                      OnceInstallCallback callback) override;
 
   // WebContentsObserver:
@@ -66,10 +67,14 @@
       const blink::Manifest& manifest,
       bool is_installable);
   void OnIconsRetrieved(std::unique_ptr<WebApplicationInfo> web_app_info,
+                        ForInstallableSite for_installable_site,
                         IconsMap icons_map);
+  void OnDialogCompleted(bool user_accepted,
+                         std::unique_ptr<WebApplicationInfo> web_app_info);
   void OnInstallFinalized(const AppId& app_id, InstallResultCode code);
 
-  // Saved callback:
+  // Saved callbacks:
+  WebAppInstallDialogCallback dialog_callback_;
   OnceInstallCallback install_callback_;
 
   std::unique_ptr<WebAppDataRetriever> data_retriever_;
diff --git a/chrome/browser/web_applications/web_app_install_manager_unittest.cc b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
index f9d87bc0..7611057 100644
--- a/chrome/browser/web_applications/web_app_install_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
@@ -73,6 +73,22 @@
   return true;
 }
 
+void TestAcceptDialogCallback(
+    content::WebContents* initiator_web_contents,
+    std::unique_ptr<WebApplicationInfo> web_app_info,
+    ForInstallableSite for_installable_site,
+    InstallManager::WebAppInstallationAcceptanceCallback acceptance_callback) {
+  std::move(acceptance_callback).Run(true /*accept*/, std::move(web_app_info));
+}
+
+void TestDeclineDialogCallback(
+    content::WebContents* initiator_web_contents,
+    std::unique_ptr<WebApplicationInfo> web_app_info,
+    ForInstallableSite for_installable_site,
+    InstallManager::WebAppInstallationAcceptanceCallback acceptance_callback) {
+  std::move(acceptance_callback).Run(false /*accept*/, std::move(web_app_info));
+}
+
 }  // namespace
 
 class WebAppInstallManagerTest : public WebAppTest {
@@ -150,6 +166,7 @@
     const bool force_shortcut_app = false;
     install_manager_->InstallWebApp(
         web_contents(), force_shortcut_app,
+        base::BindOnce(TestAcceptDialogCallback),
         base::BindLambdaForTesting(
             [&](const AppId& installed_app_id, InstallResultCode code) {
               EXPECT_EQ(InstallResultCode::kSuccess, code);
@@ -192,6 +209,7 @@
 
   install_manager_->InstallWebApp(
       web_contents(), force_shortcut_app,
+      base::BindOnce(TestAcceptDialogCallback),
       base::BindLambdaForTesting(
           [&](const AppId& installed_app_id, InstallResultCode code) {
             EXPECT_EQ(InstallResultCode::kSuccess, code);
@@ -236,6 +254,7 @@
 
   install_manager_->InstallWebApp(
       web_contents(), force_shortcut_app,
+      base::BindOnce(TestAcceptDialogCallback),
       base::BindLambdaForTesting(
           [&](const AppId& already_installed_app_id, InstallResultCode code) {
             EXPECT_EQ(InstallResultCode::kAlreadyInstalled, code);
@@ -261,6 +280,7 @@
 
   install_manager_->InstallWebApp(
       web_contents(), force_shortcut_app,
+      base::BindOnce(TestAcceptDialogCallback),
       base::BindLambdaForTesting(
           [&](const AppId& installed_app_id, InstallResultCode code) {
             EXPECT_EQ(InstallResultCode::kGetWebApplicationInfoFailed, code);
@@ -284,6 +304,7 @@
 
   install_manager_->InstallWebApp(
       web_contents(), force_shortcut_app,
+      base::BindOnce(TestAcceptDialogCallback),
       base::BindLambdaForTesting(
           [&](const AppId& installed_app_id, InstallResultCode code) {
             EXPECT_EQ(InstallResultCode::kWebContentsDestroyed, code);
@@ -332,6 +353,7 @@
 
   install_manager_->InstallWebApp(
       web_contents(), force_shortcut_app,
+      base::BindOnce(TestAcceptDialogCallback),
       base::BindLambdaForTesting(
           [&](const AppId& installed_app_id, InstallResultCode code) {
             EXPECT_EQ(InstallResultCode::kSuccess, code);
@@ -506,6 +528,7 @@
 
   install_manager_->InstallWebApp(
       web_contents(), force_shortcut_app,
+      base::BindOnce(TestAcceptDialogCallback),
       base::BindLambdaForTesting(
           [&](const AppId& installed_app_id, InstallResultCode code) {
             EXPECT_EQ(InstallResultCode::kWriteDataFailed, code);
@@ -525,6 +548,35 @@
   EXPECT_FALSE(file_utils_->DirectoryExists(app_dir));
 }
 
+TEST_F(WebAppInstallManagerTest, UserInstallDeclined) {
+  const GURL url = GURL("https://example.com/path");
+  const AppId app_id = GenerateAppIdFromURL(url);
+
+  CreateRendererAppInfo(url, "Name", "Description");
+  CreateDefaultInstallableManager();
+
+  base::RunLoop run_loop;
+  bool callback_called = false;
+  const bool force_shortcut_app = false;
+
+  install_manager_->InstallWebApp(
+      web_contents(), force_shortcut_app,
+      base::BindOnce(TestDeclineDialogCallback),
+      base::BindLambdaForTesting(
+          [&](const AppId& installed_app_id, InstallResultCode code) {
+            EXPECT_EQ(InstallResultCode::kUserInstallDeclined, code);
+            EXPECT_EQ(installed_app_id, AppId());
+            callback_called = true;
+            run_loop.Quit();
+          }));
+  run_loop.Run();
+
+  EXPECT_TRUE(callback_called);
+
+  WebApp* web_app = registrar_->GetAppById(app_id);
+  EXPECT_EQ(nullptr, web_app);
+}
+
 // TODO(loyso): Convert more tests from bookmark_app_helper_unittest.cc
 
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc
index b8c20171e..024b96e 100644
--- a/chrome/browser/web_applications/web_app_provider.cc
+++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -73,7 +73,7 @@
     CreateBookmarkAppsSubsystems(profile_);
 }
 
-void WebAppProvider::Start() {
+void WebAppProvider::StartRegistry() {
   notification_registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED,
                               content::Source<Profile>(profile_));
 
@@ -81,14 +81,6 @@
     registrar_->Init(base::BindOnce(&WebAppProvider::OnRegistryReady,
                                     weak_ptr_factory_.GetWeakPtr()));
   } else {
-    web_app_policy_manager_->Start();
-    system_web_app_manager_->Start();
-
-    // Start ExternalWebApps subsystem:
-    ScanForExternalWebApps(
-        profile_, base::BindOnce(&WebAppProvider::OnScanForExternalWebApps,
-                                 weak_ptr_factory_.GetWeakPtr()));
-
     extensions::ExtensionSystem::Get(profile_)->ready().Post(
         FROM_HERE, base::BindRepeating(&WebAppProvider::OnRegistryReady,
                                        weak_ptr_factory_.GetWeakPtr()));
@@ -125,6 +117,16 @@
   DCHECK(!registry_is_ready_);
   registry_is_ready_ = true;
 
+  if (!base::FeatureList::IsEnabled(features::kDesktopPWAsWithoutExtensions)) {
+    web_app_policy_manager_->Start();
+    system_web_app_manager_->Start();
+
+    // Start ExternalWebApps subsystem:
+    ScanForExternalWebApps(
+        profile_, base::BindOnce(&WebAppProvider::OnScanForExternalWebApps,
+                                 weak_ptr_factory_.GetWeakPtr()));
+  }
+
   if (registry_ready_callback_)
     std::move(registry_ready_callback_).Run();
 }
@@ -160,24 +162,6 @@
   return tab_helper;
 }
 
-// static
-bool WebAppProvider::CanInstallWebApp(content::WebContents* web_contents) {
-  auto* provider = WebAppProvider::GetForWebContents(web_contents);
-  if (!provider || !provider->install_manager_)
-    return false;
-  return provider->install_manager_->CanInstallWebApp(web_contents);
-}
-
-// static
-void WebAppProvider::InstallWebApp(content::WebContents* web_contents,
-                                   bool force_shortcut_app) {
-  auto* provider = WebAppProvider::GetForWebContents(web_contents);
-  if (!provider || !provider->install_manager_)
-    return;
-  provider->install_manager_->InstallWebApp(web_contents, force_shortcut_app,
-                                            base::DoNothing());
-}
-
 void WebAppProvider::Observe(int type,
                              const content::NotificationSource& source,
                              const content::NotificationDetails& detals) {
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h
index 0898332..7d17c3c4 100644
--- a/chrome/browser/web_applications/web_app_provider.h
+++ b/chrome/browser/web_applications/web_app_provider.h
@@ -59,8 +59,11 @@
 
   // Create subsystems but do not start them (yet).
   void Init();
-  // Start all subsystems.
-  void Start();
+  // Start registry. All subsystems depend on it.
+  void StartRegistry();
+
+  // UIs can use InstallManager for user-initiated Web Apps install.
+  InstallManager& install_manager() { return *install_manager_; }
 
   // Clients can use PendingAppManager to install, uninstall, and update
   // Web Apps.
@@ -70,13 +73,6 @@
   static WebAppTabHelperBase* CreateTabHelper(
       content::WebContents* web_contents);
 
-  // Returns true if a bookmark can be installed for a given |web_contents|.
-  static bool CanInstallWebApp(content::WebContents* web_contents);
-
-  // Starts a bookmark installation process for a given |web_contents|.
-  static void InstallWebApp(content::WebContents* web_contents,
-                            bool force_shortcut_app);
-
   // content::NotificationObserver
   void Observe(int type,
                const content::NotificationSource& source,
diff --git a/chrome/browser/web_applications/web_app_provider_factory.cc b/chrome/browser/web_applications/web_app_provider_factory.cc
index b185550..297a911 100644
--- a/chrome/browser/web_applications/web_app_provider_factory.cc
+++ b/chrome/browser/web_applications/web_app_provider_factory.cc
@@ -40,7 +40,7 @@
   Profile* profile = Profile::FromBrowserContext(context);
   WebAppProvider* provider = new WebAppProvider(profile);
   provider->Init();
-  provider->Start();
+  provider->StartRegistry();
   return provider;
 }
 
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 6898b323c..1c3e78c0 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -220,6 +220,10 @@
 const base::Feature kDesktopPWAsWithoutExtensions{
     "DesktopPWAsWithoutExtensions", base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables or disables the ability to install PWAs from the omnibox.
+const base::Feature kDesktopPWAsOmniboxInstall{
+    "DesktopPWAsOmniboxInstall", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Disables downloads of unsafe file types over HTTP.
 const base::Feature kDisallowUnsafeHttpDownloads{
     "DisallowUnsafeHttpDownloads", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 90b649f03..2a79197 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -136,6 +136,9 @@
 extern const base::Feature kDesktopPWAsWithoutExtensions;
 
 COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kDesktopPWAsOmniboxInstall;
+
+COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kDisallowUnsafeHttpDownloads;
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const char kDisallowUnsafeHttpDownloadsParamName[];
diff --git a/chrome/common/secure_origin_whitelist_unittest.cc b/chrome/common/secure_origin_whitelist_unittest.cc
index be91d816..e71c9e1 100644
--- a/chrome/common/secure_origin_whitelist_unittest.cc
+++ b/chrome/common/secure_origin_whitelist_unittest.cc
@@ -18,7 +18,7 @@
   void TearDown() override {
     // Ensure that we reset the whitelisted origins without any flags applied.
     content::ResetSchemesAndOriginsWhitelist();
-  };
+  }
 };
 
 TEST_F(SecureOriginWhiteListTest, UnsafelyTreatInsecureOriginAsSecure) {
diff --git a/chrome/installer/mac/sign_versioned_dir.sh.in b/chrome/installer/mac/sign_versioned_dir.sh.in
index b5388e90..95b93ba 100644
--- a/chrome/installer/mac/sign_versioned_dir.sh.in
+++ b/chrome/installer/mac/sign_versioned_dir.sh.in
@@ -103,7 +103,7 @@
 
 codesign_with_options "${crashpad_handler}" \
                       "${enforcement_flags_helpers}" \
-                      "crashpad_handler"
+                      "chrome_crashpad_handler"
 
 # The app mode loader bundle is modified dynamically at runtime. Just sign the
 # executable, which shouldn't change. In order to do this, the executable needs
diff --git a/chrome/renderer/resources/extensions/chromeos_ime_service_bindings.js b/chrome/renderer/resources/extensions/chromeos_ime_service_bindings.js
index 0835552..a3eb050 100644
--- a/chrome/renderer/resources/extensions/chromeos_ime_service_bindings.js
+++ b/chrome/renderer/resources/extensions/chromeos_ime_service_bindings.js
@@ -255,7 +255,8 @@
           .connectToImeEngine(
               imeSpec, mojo.makeRequest(this.activeEngine_),
               this.clientChannel_.getChannelPtr(), extra)
-          .then((bound) => {
+          .then((result) => {
+            const bound = result && result['success'];
             if (bound && onConnectionError) {
               this.activeEngine_.ptr.setConnectionErrorHandler(
                   onConnectionError);
diff --git a/chrome/renderer/translate/translate_script_browsertest.cc b/chrome/renderer/translate/translate_script_browsertest.cc
index 0136ba2..80d3ac87 100644
--- a/chrome/renderer/translate/translate_script_browsertest.cc
+++ b/chrome/renderer/translate/translate_script_browsertest.cc
@@ -69,7 +69,7 @@
   return base::StringPrintf("%s%d", kSetCallbackErrorCode, code);
 }
 
-};  // namespace
+}  // namespace
 
 // This class is for testing resource/translate.js works and reports errors
 // correctly.
diff --git a/chrome/service/cloud_print/connector_settings.h b/chrome/service/cloud_print/connector_settings.h
index f8a14d2..b18c6371 100644
--- a/chrome/service/cloud_print/connector_settings.h
+++ b/chrome/service/cloud_print/connector_settings.h
@@ -30,9 +30,7 @@
 
   void CopyFrom(const ConnectorSettings& source);
 
-  const GURL& server_url() const {
-    return server_url_;
-  };
+  const GURL& server_url() const { return server_url_; }
 
   const std::string& proxy_id() const {
     return proxy_id_;
@@ -52,7 +50,7 @@
 
   const base::DictionaryValue* print_system_settings() const {
     return print_system_settings_.get();
-  };
+  }
 
   bool ShouldConnect(const std::string& printer_name) const;
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 2820a3c9..5b4ca571 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1155,6 +1155,7 @@
       "//ui/base:test_support",
       "//ui/base/clipboard:clipboard_test_support",
       "//ui/compositor:test_support",
+      "//ui/native_theme:test_support",
       "//ui/resources",
       "//ui/web_dialogs:test_support",
       "//v8",
@@ -3328,6 +3329,7 @@
       "../browser/search/search_suggest/search_suggest_loader_impl_unittest.cc",
       "../browser/search/search_suggest/search_suggest_service_unittest.cc",
       "../browser/search/search_unittest.cc",
+      "../browser/send_tab_to_self/send_tab_to_self_util_unittest.cc",
       "../browser/serial/serial_chooser_context_unittest.cc",
       "../browser/sessions/tab_restore_service_unittest.cc",
       "../browser/signin/signin_promo_unittest.cc",
@@ -3627,6 +3629,7 @@
       "../browser/chromeos/crostini/crostini_registry_service_unittest.cc",
       "../browser/chromeos/crostini/crostini_reporting_util_unittest.cc",
       "../browser/chromeos/plugin_vm/plugin_vm_util_unittest.cc",
+      "../browser/chromeos/usb/cros_usb_detector_unittest.cc",
       "../browser/component_updater/cros_component_installer_chromeos_unittest.cc",
       "../browser/component_updater/metadata_table_chromeos_unittest.cc",
       "../browser/google/google_brand_code_map_chromeos_unittest.cc",
diff --git a/chrome/test/data/webui/app_management/app_management_browsertest.js b/chrome/test/data/webui/app_management/app_management_browsertest.js
index b2f09b1..bed944d 100644
--- a/chrome/test/data/webui/app_management/app_management_browsertest.js
+++ b/chrome/test/data/webui/app_management/app_management_browsertest.js
@@ -97,3 +97,17 @@
 TEST_F('AppManagementReducersTest', 'All', function() {
   mocha.run();
 });
+
+function AppManagementPwaPermissionViewTest() {}
+
+AppManagementPwaPermissionViewTest.prototype = {
+  __proto__: AppManagementBrowserTest.prototype,
+
+  extraLibraries: AppManagementBrowserTest.prototype.extraLibraries.concat([
+    'pwa_permission_view_test.js',
+  ]),
+};
+
+TEST_F('AppManagementPwaPermissionViewTest', 'All', function() {
+  mocha.run();
+});
diff --git a/chrome/test/data/webui/app_management/pwa_permission_view_test.js b/chrome/test/data/webui/app_management/pwa_permission_view_test.js
new file mode 100644
index 0000000..c69f3979
--- /dev/null
+++ b/chrome/test/data/webui/app_management/pwa_permission_view_test.js
@@ -0,0 +1,68 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+'use strict';
+
+suite('<app-management-pwa-permission-view>', function() {
+  let pwaPermissionView;
+  let fakeHandler;
+
+  const TEST_APP_ID = '1';
+
+  function getToggleFromPermissionItem(permissionItemId) {
+    return pwaPermissionView.root.getElementById(permissionItemId)
+        .root.querySelector('app-management-permission-toggle')
+        .root.querySelector('cr-toggle');
+  }
+
+  function getPermissionBoolByType(permissionType) {
+    return app_management.util.getPermissionValueBool(
+        pwaPermissionView.app_, permissionType);
+  }
+
+  async function clickToggle(permissionItemId) {
+    getToggleFromPermissionItem(permissionItemId).click();
+    await fakeHandler.flushForTesting();
+  }
+
+  setup(async function() {
+    pwaPermissionView =
+        document.createElement('app-management-pwa-permission-view');
+    PolymerTest.clearBody();
+
+    fakeHandler = setupFakeHandler();
+    replaceStore();
+
+    // Add an app, and make it the currently selected app.
+    await fakeHandler.addApp(TEST_APP_ID);
+    app_management.Store.getInstance().dispatch(
+        app_management.actions.changePage(PageType.DETAIL, TEST_APP_ID));
+    document.body.appendChild(pwaPermissionView);
+  });
+
+  test('App is rendered correctly', function() {
+    assertEquals(
+        app_management.Store.getInstance().data.currentPage.selectedAppId,
+        pwaPermissionView.app_.id);
+  });
+
+  test(
+      'Clicking the permission toggle changes the permission of the app',
+      async function() {
+        let checkToggle = async function(permissionType, permissionId) {
+          assertTrue(getPermissionBoolByType(permissionType));
+          assertTrue(getToggleFromPermissionItem(permissionId).checked);
+          await clickToggle(permissionId);
+          assertFalse(getPermissionBoolByType(permissionType));
+          assertFalse(getToggleFromPermissionItem(permissionId).checked);
+        };
+
+        await checkToggle(
+            'CONTENT_SETTINGS_TYPE_NOTIFICATIONS', 'notifications');
+        await checkToggle('CONTENT_SETTINGS_TYPE_GEOLOCATION', 'location');
+        await checkToggle('CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA', 'camera');
+        await checkToggle(
+            'CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC', 'microphone');
+      });
+});
diff --git a/chrome/test/data/webui/cr_focus_row_behavior_test.js b/chrome/test/data/webui/cr_focus_row_behavior_test.js
index a45c727..7fb11993 100644
--- a/chrome/test/data/webui/cr_focus_row_behavior_test.js
+++ b/chrome/test/data/webui/cr_focus_row_behavior_test.js
@@ -44,6 +44,11 @@
     Polymer({
       is: 'focus-row-element',
       behaviors: [cr.ui.FocusRowBehavior],
+      focusCallCount: 0,
+
+      focus: function() {
+        this.focusCallCount++;
+      },
     });
   });
 
@@ -120,4 +125,26 @@
       assertEquals('fake button three', button.textContent.trim());
     });
   });
+
+  test('when shift+tab pressed on first control, focus on container', () => {
+    const first = testElement.$.control;
+    const second = testElement.$.controlTwo;
+    MockInteractions.pressAndReleaseKeyOn(first, '', 'shift', 'Tab');
+    assertEquals(1, testElement.focusCallCount);
+    MockInteractions.pressAndReleaseKeyOn(second, '', 'shift', 'Tab');
+    assertEquals(1, testElement.focusCallCount);
+
+    // Simulate updating a row with same first control.
+    testElement.fire('dom-change');
+    MockInteractions.pressAndReleaseKeyOn(first, '', 'shift', 'Tab');
+    assertEquals(2, testElement.focusCallCount);
+    MockInteractions.pressAndReleaseKeyOn(second, '', 'shift', 'Tab');
+    assertEquals(2, testElement.focusCallCount);
+
+    // Simulate updating row with different first control.
+    first.remove();
+    testElement.fire('dom-change');
+    MockInteractions.pressAndReleaseKeyOn(second, '', 'shift', 'Tab');
+    assertEquals(3, testElement.focusCallCount);
+  });
 });
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 6a57e8c..b460f97 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -10,7 +10,6 @@
 import("//device/vr/buildflags/buildflags.gni")
 import("//extensions/buildflags/buildflags.gni")
 import("//printing/buildflags/buildflags.gni")
-import("//services/service_manager/public/service_manifest.gni")
 
 static_library("utility") {
   sources = [
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 1e029c481..3858c07 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -6,7 +6,6 @@
 import("//build/config/ui.gni")
 import("//chromecast/chromecast.gni")
 import("//media/media_options.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 import("//tools/grit/grit_rule.gni")
 
diff --git a/chromecast/browser/extensions/api/bookmarks/bookmarks_api.h b/chromecast/browser/extensions/api/bookmarks/bookmarks_api.h
index a18c21fe..90f5d78 100644
--- a/chromecast/browser/extensions/api/bookmarks/bookmarks_api.h
+++ b/chromecast/browser/extensions/api/bookmarks/bookmarks_api.h
@@ -92,7 +92,7 @@
 
 class BookmarksRemoveFunction : public BookmarksStubFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE);
+  DECLARE_EXTENSION_FUNCTION("bookmarks.remove", BOOKMARKS_REMOVE)
 
  protected:
   ~BookmarksRemoveFunction() override {}
diff --git a/chromecast/browser/extensions/api/braille_display_private/braille_display_private_api.h b/chromecast/browser/extensions/api/braille_display_private/braille_display_private_api.h
index 158a5e2b..354cc50 100644
--- a/chromecast/browser/extensions/api/braille_display_private/braille_display_private_api.h
+++ b/chromecast/browser/extensions/api/braille_display_private/braille_display_private_api.h
@@ -24,7 +24,7 @@
 
 class BrailleDisplayPrivateWriteDotsFunction : public AsyncApiFunction {
   DECLARE_EXTENSION_FUNCTION("brailleDisplayPrivate.writeDots",
-                             BRAILLEDISPLAYPRIVATE_WRITEDOTS);
+                             BRAILLEDISPLAYPRIVATE_WRITEDOTS)
 
  public:
   BrailleDisplayPrivateWriteDotsFunction();
diff --git a/chromecast/browser/extensions/api/identity/identity_api.h b/chromecast/browser/extensions/api/identity/identity_api.h
index 48a590f..ae8bb98 100644
--- a/chromecast/browser/extensions/api/identity/identity_api.h
+++ b/chromecast/browser/extensions/api/identity/identity_api.h
@@ -18,7 +18,7 @@
 // documentation.
 class IdentityGetAuthTokenFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("identity.getAuthToken", UNKNOWN);
+  DECLARE_EXTENSION_FUNCTION("identity.getAuthToken", UNKNOWN)
 
   IdentityGetAuthTokenFunction();
 
diff --git a/chromecast/browser/extensions/api/settings_private/settings_private_api.h b/chromecast/browser/extensions/api/settings_private/settings_private_api.h
index 3540161..8980da7 100644
--- a/chromecast/browser/extensions/api/settings_private/settings_private_api.h
+++ b/chromecast/browser/extensions/api/settings_private/settings_private_api.h
@@ -17,8 +17,7 @@
 class SettingsPrivateSetPrefFunction : public UIThreadExtensionFunction {
  public:
   SettingsPrivateSetPrefFunction() {}
-  DECLARE_EXTENSION_FUNCTION("settingsPrivate.setPref",
-                             SETTINGSPRIVATE_SETPREF);
+  DECLARE_EXTENSION_FUNCTION("settingsPrivate.setPref", SETTINGSPRIVATE_SETPREF)
 
  protected:
   ~SettingsPrivateSetPrefFunction() override;
@@ -34,7 +33,7 @@
  public:
   SettingsPrivateGetAllPrefsFunction() {}
   DECLARE_EXTENSION_FUNCTION("settingsPrivate.getAllPrefs",
-                             SETTINGSPRIVATE_GETALLPREFS);
+                             SETTINGSPRIVATE_GETALLPREFS)
 
  protected:
   ~SettingsPrivateGetAllPrefsFunction() override;
@@ -49,8 +48,7 @@
 class SettingsPrivateGetPrefFunction : public UIThreadExtensionFunction {
  public:
   SettingsPrivateGetPrefFunction() {}
-  DECLARE_EXTENSION_FUNCTION("settingsPrivate.getPref",
-                             SETTINGSPRIVATE_GETPREF);
+  DECLARE_EXTENSION_FUNCTION("settingsPrivate.getPref", SETTINGSPRIVATE_GETPREF)
 
  protected:
   ~SettingsPrivateGetPrefFunction() override;
@@ -66,7 +64,7 @@
  public:
   SettingsPrivateGetDefaultZoomFunction() {}
   DECLARE_EXTENSION_FUNCTION("settingsPrivate.getDefaultZoom",
-                             SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION);
+                             SETTINGSPRIVATE_GETDEFAULTZOOMFUNCTION)
 
  protected:
   ~SettingsPrivateGetDefaultZoomFunction() override;
@@ -82,7 +80,7 @@
  public:
   SettingsPrivateSetDefaultZoomFunction() {}
   DECLARE_EXTENSION_FUNCTION("settingsPrivate.setDefaultZoom",
-                             SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION);
+                             SETTINGSPRIVATE_SETDEFAULTZOOMFUNCTION)
 
  protected:
   ~SettingsPrivateSetDefaultZoomFunction() override;
diff --git a/chromeos/services/device_sync/BUILD.gn b/chromeos/services/device_sync/BUILD.gn
index 8bd6eab..29778f0 100644
--- a/chromeos/services/device_sync/BUILD.gn
+++ b/chromeos/services/device_sync/BUILD.gn
@@ -40,6 +40,9 @@
     "cryptauth_key.h",
     "cryptauth_key_bundle.cc",
     "cryptauth_key_bundle.h",
+    "cryptauth_key_proof_computer.h",
+    "cryptauth_key_proof_computer_impl.cc",
+    "cryptauth_key_proof_computer_impl.h",
     "cryptauth_key_registry.cc",
     "cryptauth_key_registry.h",
     "cryptauth_key_registry_impl.cc",
@@ -160,6 +163,7 @@
     "cryptauth_enrollment_manager_impl_unittest.cc",
     "cryptauth_gcm_manager_impl_unittest.cc",
     "cryptauth_key_bundle_unittest.cc",
+    "cryptauth_key_proof_computer_impl_unittest.cc",
     "cryptauth_key_registry_impl_unittest.cc",
     "cryptauth_key_unittest.cc",
     "device_sync_service_unittest.cc",
diff --git a/chromeos/services/device_sync/cryptauth_key_proof_computer.h b/chromeos/services/device_sync/cryptauth_key_proof_computer.h
new file mode 100644
index 0000000..48008ff2
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_key_proof_computer.h
@@ -0,0 +1,69 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_KEY_PROOF_COMPUTER_H_
+#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_KEY_PROOF_COMPUTER_H_
+
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "chromeos/services/device_sync/cryptauth_key.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+// The lone method ComputeKeyProofs() takes a list of key-payload pairs and
+// returns a list of key proof strings, ordered consistent with the
+// input list. The key proofs are used by CryptAuth to verify that the client
+// has the appropriate key material.
+//
+// The CryptAuth v2 Enrollment protocol requires the following key proof
+// formats:
+//   - Symmetric keys: The HMAC-SHA256 of the payload, using a key derived from
+//     the symmetric key. Specifically,
+//         HMAC(HKDF(|key|, salt="CryptAuth Key Proof", info=|key_handle|),
+//              |payload|)
+//
+//   - Asymmetric keys: A signed, unencrypted, and serialized SecureMessage
+//     proto, with the following parameters:
+//         - signature_scheme = ECDSA_P256_SHA256,
+//         - encryption_scheme = NONE,
+//         - verification_key_id = |key_handle|,
+//         - body = |payload|,
+//     signed with the private key material.
+//
+// The protocol also demands that the |random_session_id|, sent by the CryptAuth
+// server via the SyncKeysResponse, be used as the payload for key proofs. In
+// the future, key crossproofs might be employed, where the payload will
+// consist of other key proofs.
+//
+// Requirements:
+//   - An instance of this class should only be used once.
+//   - The input list, |key_payload_pairs|, cannot be empty.
+//   - Currently, the only supported key types are RAW128 and RAW256 for
+//     symmetric keys and P256 for asymmetric keys.
+class CryptAuthKeyProofComputer {
+ public:
+  CryptAuthKeyProofComputer() = default;
+  virtual ~CryptAuthKeyProofComputer() = default;
+
+  using ComputeKeyProofsCallback =
+      base::OnceCallback<void(const std::vector<std::string>& /* key_proofs*/)>;
+  virtual void ComputeKeyProofs(
+      const std::vector<std::pair<CryptAuthKey, std::string>>&
+          key_payload_pairs,
+      ComputeKeyProofsCallback compute_key_proofs_callback) = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(CryptAuthKeyProofComputer);
+};
+
+}  // namespace device_sync
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_KEY_PROOF_COMPUTER_H_
diff --git a/chromeos/services/device_sync/cryptauth_key_proof_computer_impl.cc b/chromeos/services/device_sync/cryptauth_key_proof_computer_impl.cc
new file mode 100644
index 0000000..296e867
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_key_proof_computer_impl.cc
@@ -0,0 +1,158 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/services/device_sync/cryptauth_key_proof_computer_impl.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/memory/ptr_util.h"
+#include "base/no_destructor.h"
+#include "chromeos/components/multidevice/secure_message_delegate.h"
+#include "chromeos/components/multidevice/secure_message_delegate_impl.h"
+#include "chromeos/services/device_sync/cryptauth_key.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+#include "crypto/hkdf.h"
+#include "crypto/hmac.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+namespace {
+
+// The salt used for HKDF in symmetric key proofs. This value is part of the
+// CryptAuth v2 Enrollment specifications.
+const char kSymmetricKeyProofSalt[] = "CryptAuth Key Proof";
+
+size_t NumBytesForSymmetricKeyType(cryptauthv2::KeyType key_type) {
+  switch (key_type) {
+    case (cryptauthv2::KeyType::RAW128):
+      return 16u;
+    case (cryptauthv2::KeyType::RAW256):
+      return 32u;
+    default:
+      NOTREACHED();
+      return 0u;
+  }
+}
+
+bool IsValidAsymmetricKey(const CryptAuthKey& key) {
+  return key.IsAsymmetricKey() && !key.private_key().empty() &&
+         key.type() == cryptauthv2::KeyType::P256;
+}
+
+}  // namespace
+
+// static
+CryptAuthKeyProofComputerImpl::Factory*
+    CryptAuthKeyProofComputerImpl::Factory::test_factory_ = nullptr;
+
+// static
+CryptAuthKeyProofComputerImpl::Factory*
+CryptAuthKeyProofComputerImpl::Factory::Get() {
+  if (test_factory_)
+    return test_factory_;
+
+  static base::NoDestructor<CryptAuthKeyProofComputerImpl::Factory> factory;
+  return factory.get();
+}
+
+// static
+void CryptAuthKeyProofComputerImpl::Factory::SetFactoryForTesting(
+    Factory* test_factory) {
+  test_factory_ = test_factory;
+}
+
+CryptAuthKeyProofComputerImpl::Factory::~Factory() = default;
+
+std::unique_ptr<CryptAuthKeyProofComputer>
+CryptAuthKeyProofComputerImpl::Factory::BuildInstance() {
+  return base::WrapUnique(new CryptAuthKeyProofComputerImpl());
+}
+
+CryptAuthKeyProofComputerImpl::CryptAuthKeyProofComputerImpl()
+    : secure_message_delegate_(
+          multidevice::SecureMessageDelegateImpl::Factory::NewInstance()) {}
+
+CryptAuthKeyProofComputerImpl::~CryptAuthKeyProofComputerImpl() = default;
+
+void CryptAuthKeyProofComputerImpl::ComputeKeyProofs(
+    const std::vector<std::pair<CryptAuthKey, std::string>>& key_payload_pairs,
+    ComputeKeyProofsCallback compute_key_proofs_callback) {
+  DCHECK(!key_payload_pairs.empty());
+
+  // Fail if ComputeKeyProofs() has already been called.
+  DCHECK(num_key_proofs_to_compute_ == 0 && key_payload_pairs_.empty() &&
+         output_key_proofs_.empty() && !compute_key_proofs_callback_);
+
+  num_key_proofs_to_compute_ = key_payload_pairs.size();
+  key_payload_pairs_ = key_payload_pairs;
+  output_key_proofs_.resize(num_key_proofs_to_compute_);
+  compute_key_proofs_callback_ = std::move(compute_key_proofs_callback);
+
+  for (size_t i = 0; i < key_payload_pairs_.size(); ++i) {
+    if (key_payload_pairs_[i].first.IsSymmetricKey()) {
+      ComputeSymmetricKeyProof(i, key_payload_pairs_[i].first,
+                               key_payload_pairs_[i].second);
+    } else {
+      DCHECK(IsValidAsymmetricKey(key_payload_pairs_[i].first));
+      ComputeAsymmetricKeyProof(i, key_payload_pairs_[i].first,
+                                key_payload_pairs_[i].second);
+    }
+  }
+}
+
+void CryptAuthKeyProofComputerImpl::ComputeSymmetricKeyProof(
+    const size_t index,
+    const CryptAuthKey& symmetric_key,
+    const std::string& payload) {
+  std::string derived_symmetric_key_material =
+      crypto::HkdfSha256(symmetric_key.symmetric_key(), kSymmetricKeyProofSalt,
+                         symmetric_key.handle(),
+                         NumBytesForSymmetricKeyType(symmetric_key.type()));
+
+  crypto::HMAC hmac(crypto::HMAC::HashAlgorithm::SHA256);
+  std::vector<unsigned char> signed_payload(hmac.DigestLength());
+  bool success =
+      hmac.Init(derived_symmetric_key_material) &&
+      hmac.Sign(payload, signed_payload.data(), signed_payload.size());
+  DCHECK(success);
+
+  OnKeyProofComputed(index,
+                     std::string(signed_payload.begin(), signed_payload.end()));
+}
+
+void CryptAuthKeyProofComputerImpl::ComputeAsymmetricKeyProof(
+    const size_t index,
+    const CryptAuthKey& asymmetric_key,
+    const std::string& payload) {
+  multidevice::SecureMessageDelegate::CreateOptions options;
+  options.encryption_scheme = securemessage::EncScheme::NONE;
+  options.signature_scheme = securemessage::SigScheme::ECDSA_P256_SHA256;
+  options.verification_key_id = asymmetric_key.handle();
+
+  secure_message_delegate_->CreateSecureMessage(
+      payload, asymmetric_key.private_key(), options,
+      base::Bind(&CryptAuthKeyProofComputerImpl::OnKeyProofComputed,
+                 base::Unretained(this), index));
+}
+
+void CryptAuthKeyProofComputerImpl::OnKeyProofComputed(
+    const size_t index,
+    const std::string& key_proof) {
+  DCHECK(index < output_key_proofs_.size());
+  output_key_proofs_[index] = key_proof;
+
+  --num_key_proofs_to_compute_;
+  if (!num_key_proofs_to_compute_)
+    std::move(compute_key_proofs_callback_).Run(output_key_proofs_);
+}
+
+}  // namespace device_sync
+
+}  // namespace chromeos
diff --git a/chromeos/services/device_sync/cryptauth_key_proof_computer_impl.h b/chromeos/services/device_sync/cryptauth_key_proof_computer_impl.h
new file mode 100644
index 0000000..fa84495
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_key_proof_computer_impl.h
@@ -0,0 +1,75 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_KEY_PROOF_COMPUTER_IMPL_H_
+#define CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_KEY_PROOF_COMPUTER_IMPL_H_
+
+#include "chromeos/services/device_sync/cryptauth_key_proof_computer.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "chromeos/services/device_sync/cryptauth_key.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+
+namespace chromeos {
+
+namespace multidevice {
+class SecureMessageDelegate;
+}  // namespace multidevice
+
+namespace device_sync {
+
+class CryptAuthKeyProofComputerImpl : public CryptAuthKeyProofComputer {
+ public:
+  class Factory {
+   public:
+    static Factory* Get();
+    static void SetFactoryForTesting(Factory* test_factory);
+    virtual ~Factory();
+    virtual std::unique_ptr<CryptAuthKeyProofComputer> BuildInstance();
+
+   private:
+    static Factory* test_factory_;
+  };
+
+  ~CryptAuthKeyProofComputerImpl() override;
+
+  // CryptAuthKeyProofComputer:
+  void ComputeKeyProofs(
+      const std::vector<std::pair<CryptAuthKey, std::string>>&
+          key_payload_pairs,
+      ComputeKeyProofsCallback compute_key_proofs_callback) override;
+
+ private:
+  CryptAuthKeyProofComputerImpl();
+
+  void ComputeSymmetricKeyProof(const size_t index,
+                                const CryptAuthKey& symmetric_key,
+                                const std::string& payload);
+  void ComputeAsymmetricKeyProof(const size_t index,
+                                 const CryptAuthKey& asymmetric_key,
+                                 const std::string& payload);
+  void OnKeyProofComputed(const size_t index,
+                          const std::string& single_key_proof);
+
+  size_t num_key_proofs_to_compute_ = 0;
+  std::vector<std::pair<CryptAuthKey, std::string>> key_payload_pairs_;
+  std::vector<std::string> output_key_proofs_;
+  ComputeKeyProofsCallback compute_key_proofs_callback_;
+
+  std::unique_ptr<multidevice::SecureMessageDelegate> secure_message_delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(CryptAuthKeyProofComputerImpl);
+};
+
+}  // namespace device_sync
+
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_DEVICE_SYNC_CRYPTAUTH_KEY_PROOF_COMPUTER_IMPL_H_
diff --git a/chromeos/services/device_sync/cryptauth_key_proof_computer_impl_unittest.cc b/chromeos/services/device_sync/cryptauth_key_proof_computer_impl_unittest.cc
new file mode 100644
index 0000000..749a9e1
--- /dev/null
+++ b/chromeos/services/device_sync/cryptauth_key_proof_computer_impl_unittest.cc
@@ -0,0 +1,176 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/services/device_sync/cryptauth_key_proof_computer_impl.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/bind.h"
+#include "base/macros.h"
+#include "chromeos/components/multidevice/fake_secure_message_delegate.h"
+#include "chromeos/components/multidevice/secure_message_delegate_impl.h"
+#include "chromeos/services/device_sync/cryptauth_key.h"
+#include "chromeos/services/device_sync/cryptauth_key_proof_computer.h"
+#include "chromeos/services/device_sync/proto/cryptauth_common.pb.h"
+#include "crypto/hkdf.h"
+#include "crypto/hmac.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+
+namespace device_sync {
+
+namespace {
+
+// The salt used for HKDF in symmetric key proofs. This value is part of the
+// CryptAuth v2 Enrollment specifications.
+const char kSymmetricKeyProofSalt[] = "CryptAuth Key Proof";
+
+const char kFakePublicKeyMaterial[] = "public_key";
+const char kFakePrivateKeyMaterial[] = "private_key";
+const char kFakePayloadAsymmetricKey[] = "payload_asymmetric_key";
+
+const char kFakeSymmetricKey256Material[] = "symmetric_key_256";
+const char kFakePayloadSymmetricKey256[] = "payload_symmetric_key_256";
+
+const char kFakeSymmetricKey128Material[] = "symmetric_key_128";
+const char kFakePayloadSymmetricKey128[] = "payload_symmetric_key_128";
+
+void VerifyKeyProofComputationCallback(
+    const std::vector<std::string>& expected_key_proofs,
+    const std::vector<std::string>& key_proofs) {
+  EXPECT_EQ(expected_key_proofs, key_proofs);
+}
+
+class FakeSecureMessageDelegateFactory
+    : public multidevice::SecureMessageDelegateImpl::Factory {
+ public:
+  FakeSecureMessageDelegateFactory() = default;
+
+  ~FakeSecureMessageDelegateFactory() override = default;
+
+  multidevice::FakeSecureMessageDelegate* instance() { return instance_; }
+
+ private:
+  // multidevice::SecureMessageDelegateImpl::Factory:
+  std::unique_ptr<multidevice::SecureMessageDelegate> BuildInstance() override {
+    auto instance = std::make_unique<multidevice::FakeSecureMessageDelegate>();
+    instance_ = instance.get();
+
+    return instance;
+  }
+
+  multidevice::FakeSecureMessageDelegate* instance_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeSecureMessageDelegateFactory);
+};
+
+}  // namespace
+
+class CryptAuthKeyProofComputerImplTest : public testing::Test {
+ protected:
+  CryptAuthKeyProofComputerImplTest() = default;
+  ~CryptAuthKeyProofComputerImplTest() override = default;
+
+  void SetUp() override {
+    fake_secure_message_delegate_factory_ =
+        std::make_unique<FakeSecureMessageDelegateFactory>();
+    multidevice::SecureMessageDelegateImpl::Factory::SetInstanceForTesting(
+        fake_secure_message_delegate_factory_.get());
+
+    key_proof_computer_ =
+        CryptAuthKeyProofComputerImpl::Factory::Get()->BuildInstance();
+  }
+
+  void TearDown() override {
+    multidevice::SecureMessageDelegateImpl::Factory::SetInstanceForTesting(
+        nullptr);
+  }
+
+  std::string ComputeSymmetricKeyProof(const CryptAuthKey& symmetric_key,
+                                       const std::string& payload) {
+    size_t num_bytes =
+        symmetric_key.type() == cryptauthv2::KeyType::RAW256 ? 32u : 16u;
+    std::string derived_symmetric_key_material = crypto::HkdfSha256(
+        symmetric_key.symmetric_key(), kSymmetricKeyProofSalt,
+        symmetric_key.handle(), num_bytes);
+
+    crypto::HMAC hmac(crypto::HMAC::HashAlgorithm::SHA256);
+    std::vector<unsigned char> signed_payload(hmac.DigestLength());
+    bool success =
+        hmac.Init(derived_symmetric_key_material) &&
+        hmac.Sign(payload, signed_payload.data(), signed_payload.size());
+    if (!success)
+      return "";
+
+    return std::string(signed_payload.begin(), signed_payload.end());
+  }
+
+  std::string ComputeAsymmetricKeyProof(const CryptAuthKey& asymmetric_key,
+                                        const std::string& payload) {
+    multidevice::SecureMessageDelegate::CreateOptions options;
+    options.encryption_scheme = securemessage::EncScheme::NONE;
+    options.signature_scheme = securemessage::SigScheme::ECDSA_P256_SHA256;
+    options.verification_key_id = asymmetric_key.handle();
+
+    std::string key_proof;
+    fake_secure_message_delegate()->CreateSecureMessage(
+        payload, asymmetric_key.private_key(), options,
+        base::Bind(
+            [](std::string* key_proof, const std::string& secure_message) {
+              *key_proof = secure_message;
+            },
+            &key_proof));
+
+    return key_proof;
+  }
+
+  CryptAuthKeyProofComputer* key_proof_computer() {
+    return key_proof_computer_.get();
+  }
+
+  multidevice::FakeSecureMessageDelegate* fake_secure_message_delegate() {
+    return fake_secure_message_delegate_factory_->instance();
+  }
+
+ private:
+  std::unique_ptr<FakeSecureMessageDelegateFactory>
+      fake_secure_message_delegate_factory_;
+
+  std::unique_ptr<CryptAuthKeyProofComputer> key_proof_computer_;
+
+  DISALLOW_COPY_AND_ASSIGN(CryptAuthKeyProofComputerImplTest);
+};
+
+TEST_F(CryptAuthKeyProofComputerImplTest, SuccessfulKeyProofComputation) {
+  std::vector<std::pair<CryptAuthKey, std::string>> key_payload_pairs = {
+      {CryptAuthKey(kFakePublicKeyMaterial, kFakePrivateKeyMaterial,
+                    CryptAuthKey::Status::kActive, cryptauthv2::KeyType::P256),
+       kFakePayloadAsymmetricKey},
+      {CryptAuthKey(kFakeSymmetricKey256Material, CryptAuthKey::Status::kActive,
+                    cryptauthv2::KeyType::RAW256),
+       kFakePayloadSymmetricKey256},
+      {CryptAuthKey(kFakeSymmetricKey128Material, CryptAuthKey::Status::kActive,
+                    cryptauthv2::KeyType::RAW128),
+       kFakePayloadSymmetricKey128}};
+
+  std::vector<std::string> expected_key_proofs = {
+      ComputeAsymmetricKeyProof(key_payload_pairs[0].first,
+                                key_payload_pairs[0].second),
+      ComputeSymmetricKeyProof(key_payload_pairs[1].first,
+                               key_payload_pairs[1].second),
+      ComputeSymmetricKeyProof(key_payload_pairs[2].first,
+                               key_payload_pairs[2].second)};
+
+  key_proof_computer()->ComputeKeyProofs(
+      key_payload_pairs,
+      base::BindOnce(&VerifyKeyProofComputationCallback, expected_key_proofs));
+}
+
+}  // namespace device_sync
+
+}  // namespace chromeos
diff --git a/components/autofill/content/browser/content_autofill_driver_unittest.cc b/components/autofill/content/browser/content_autofill_driver_unittest.cc
index 1c49111..c0dc02d 100644
--- a/components/autofill/content/browser/content_autofill_driver_unittest.cc
+++ b/components/autofill/content/browser/content_autofill_driver_unittest.cc
@@ -208,7 +208,7 @@
 
   void SetFocusRequiresScroll(bool require) override {}
 
-  void SetQueryPasswordSuggestion(bool query) override{};
+  void SetQueryPasswordSuggestion(bool query) override {}
 
   void GetElementFormAndFieldData(
       const std::vector<std::string>& selectors,
diff --git a/components/autofill/content/renderer/page_passwords_analyser.cc b/components/autofill/content/renderer/page_passwords_analyser.cc
index 7a8d2087..ef70bae 100644
--- a/components/autofill/content/renderer/page_passwords_analyser.cc
+++ b/components/autofill/content/renderer/page_passwords_analyser.cc
@@ -95,7 +95,7 @@
     }                                                                         \
   };                                                                          \
   base::LazyInstance<re2::RE2, LabelPatternLazyInstanceTraits_##NAME> NAME =  \
-      LAZY_INSTANCE_INITIALIZER;
+      LAZY_INSTANCE_INITIALIZER
 
 DECLARE_LAZY_MATCHER(ignored_characters_matcher, R"(\W)");
 DECLARE_LAZY_MATCHER(username_matcher, R"(user(name)?|login)");
diff --git a/components/autofill/core/browser/autofill_driver_factory.h b/components/autofill/core/browser/autofill_driver_factory.h
index cfb7d05b..0c1a0a106 100644
--- a/components/autofill/core/browser/autofill_driver_factory.h
+++ b/components/autofill/core/browser/autofill_driver_factory.h
@@ -34,7 +34,7 @@
   // Handles hiding of the corresponding tab.
   void TabHidden();
 
-  AutofillClient* client() { return client_; };
+  AutofillClient* client() { return client_; }
 
  protected:
   // The API manipulating the drivers map is protected to guarantee subclasses
diff --git a/components/autofill/core/browser/autofill_metadata.h b/components/autofill/core/browser/autofill_metadata.h
index 6a70a06..3fbc2e1 100644
--- a/components/autofill/core/browser/autofill_metadata.h
+++ b/components/autofill/core/browser/autofill_metadata.h
@@ -15,8 +15,8 @@
 // abstract the data from the metadata.
 struct AutofillMetadata {
  public:
-  AutofillMetadata(){};
-  ~AutofillMetadata(){};
+  AutofillMetadata() {}
+  ~AutofillMetadata() {}
 
   bool operator==(const AutofillMetadata&) const;
   bool operator!=(const AutofillMetadata&) const;
diff --git a/components/autofill/core/browser/autofill_scanner.h b/components/autofill/core/browser/autofill_scanner.h
index 0babe38a..a4826a5 100644
--- a/components/autofill/core/browser/autofill_scanner.h
+++ b/components/autofill/core/browser/autofill_scanner.h
@@ -46,7 +46,7 @@
   size_t SaveCursor();
 
   // This is only for logging purposes.
-  size_t CursorIndex() { return static_cast<size_t>(cursor_ - begin_); };
+  size_t CursorIndex() { return static_cast<size_t>(cursor_ - begin_); }
 
  private:
   void Init(const std::vector<AutofillField*>& fields);
diff --git a/components/autofill/core/browser/form_structure.h b/components/autofill/core/browser/form_structure.h
index 218c73ed..414345d 100644
--- a/components/autofill/core/browser/form_structure.h
+++ b/components/autofill/core/browser/form_structure.h
@@ -319,7 +319,7 @@
   // - Name for Autofill of first field
   base::string16 GetIdentifierForRefill() const;
 
-  int developer_engagement_metrics() { return developer_engagement_metrics_; };
+  int developer_engagement_metrics() { return developer_engagement_metrics_; }
 
   void set_randomized_encoder(std::unique_ptr<RandomizedEncoder> encoder);
 
@@ -348,7 +348,7 @@
       if (sectioned_indexes.empty())
         return (size_t)-1;  // Shouldn't happen.
       return sectioned_indexes.back().back();
-    };
+    }
 
     void AddFieldIndex(const size_t index, bool is_new_section) {
       if (is_new_section || Empty()) {
diff --git a/components/autofill/core/browser/legal_message_line_unittest.cc b/components/autofill/core/browser/legal_message_line_unittest.cc
index e3147f1e..20d7a5d 100644
--- a/components/autofill/core/browser/legal_message_line_unittest.cc
+++ b/components/autofill/core/browser/legal_message_line_unittest.cc
@@ -114,7 +114,7 @@
                           GetParam().escape_apostrophes);
 
   EXPECT_EQ(GetParam().expected_lines, actual_lines);
-};
+}
 
 INSTANTIATE_TEST_CASE_P(
     TestCases,
diff --git a/components/autofill/core/browser/test_autofill_provider.h b/components/autofill/core/browser/test_autofill_provider.h
index 8c69b47e..ef533d8 100644
--- a/components/autofill/core/browser/test_autofill_provider.h
+++ b/components/autofill/core/browser/test_autofill_provider.h
@@ -11,7 +11,7 @@
 
 class TestAutofillProvider : public AutofillProvider {
  public:
-  ~TestAutofillProvider() override{};
+  ~TestAutofillProvider() override {}
 
   // AutofillProvider:
   void OnQueryFormFieldAutofill(AutofillHandlerProxy* handler,
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
index 97c95207..956aee63 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -369,7 +369,7 @@
 
   base::MockCallback<base::RepeatingCallback<void(bool)>>* active_callback() {
     return &active_callback_;
-  };
+  }
 
  private:
   autofill::TestAutofillClock test_clock_;
diff --git a/components/autofill/core/common/form_field_data.h b/components/autofill/core/common/form_field_data.h
index 8b67278..cfe44ba 100644
--- a/components/autofill/core/common/form_field_data.h
+++ b/components/autofill/core/common/form_field_data.h
@@ -108,7 +108,7 @@
   // Returns true if the field is visible to the user.
   bool IsVisible() const {
     return is_focusable && role != ROLE_ATTRIBUTE_PRESENTATION;
-  };
+  }
 
   // Note: operator==() performs a full-field-comparison(byte by byte), this is
   // different from SameFieldAs(), which ignores comparison for those "values"
diff --git a/components/autofill/core/common/save_password_progress_logger_unittest.cc b/components/autofill/core/common/save_password_progress_logger_unittest.cc
index a20d119..325873f2 100644
--- a/components/autofill/core/common/save_password_progress_logger_unittest.cc
+++ b/components/autofill/core/common/save_password_progress_logger_unittest.cc
@@ -40,7 +40,7 @@
   std::string accumulated_log_;
 };
 
-};  // namespace
+}  // namespace
 
 TEST(SavePasswordProgressLoggerTest, LogPasswordForm) {
   TestLogger logger;
diff --git a/components/bookmarks/browser/titled_url_node_sorter.h b/components/bookmarks/browser/titled_url_node_sorter.h
index 7913ef0..f5a2d7f1 100644
--- a/components/bookmarks/browser/titled_url_node_sorter.h
+++ b/components/bookmarks/browser/titled_url_node_sorter.h
@@ -18,7 +18,7 @@
   using TitledUrlNodes = std::vector<const TitledUrlNode*>;
   using TitledUrlNodeSet = base::flat_set<const TitledUrlNode*>;
 
-  virtual ~TitledUrlNodeSorter() {};
+  virtual ~TitledUrlNodeSorter() {}
 
   // Sorts |matches| in an implementation-specific way, placing the results in
   // |sorted_nodes|.
diff --git a/components/browsing_data/core/counters/bookmark_counter.cc b/components/browsing_data/core/counters/bookmark_counter.cc
index 655027f3..ab1da23e 100644
--- a/components/browsing_data/core/counters/bookmark_counter.cc
+++ b/components/browsing_data/core/counters/bookmark_counter.cc
@@ -42,7 +42,7 @@
                            bool ids_reassigned) override {
     std::move(callback_).Run(model);
     delete this;
-  };
+  }
 
   void BookmarkModelBeingDeleted(
       bookmarks::BookmarkModel* bookmark_model) override {
diff --git a/components/browsing_data/core/counters/passwords_counter.h b/components/browsing_data/core/counters/passwords_counter.h
index 901a07c2..7cfab40c 100644
--- a/components/browsing_data/core/counters/passwords_counter.h
+++ b/components/browsing_data/core/counters/passwords_counter.h
@@ -29,7 +29,7 @@
  protected:
   virtual std::unique_ptr<SyncResult> MakeResult();
 
-  bool is_sync_active() { return sync_tracker_.IsSyncActive(); };
+  bool is_sync_active() { return sync_tracker_.IsSyncActive(); }
   int num_passwords() { return num_passwords_; }
 
  private:
diff --git a/components/cast_certificate/cast_crl.h b/components/cast_certificate/cast_crl.h
index df0f8afa..46daaecf 100644
--- a/components/cast_certificate/cast_crl.h
+++ b/components/cast_certificate/cast_crl.h
@@ -23,7 +23,7 @@
 // This class represents the CRL information parsed from the binary proto.
 class CastCRL {
  public:
-  virtual ~CastCRL(){};
+  virtual ~CastCRL() {}
 
   // Verifies the revocation status of a cast device certificate given a chain
   // of X.509 certificates.
diff --git a/components/cast_channel/mojo_data_pump.h b/components/cast_channel/mojo_data_pump.h
index 97df8f1..a28f437 100644
--- a/components/cast_channel/mojo_data_pump.h
+++ b/components/cast_channel/mojo_data_pump.h
@@ -14,7 +14,7 @@
 
 namespace net {
 class IOBuffer;
-};  // namespace net
+}  // namespace net
 
 namespace cast_channel {
 
diff --git a/components/cloud_devices/common/description_items.h b/components/cloud_devices/common/description_items.h
index fb0bddc..fbeb3a8 100644
--- a/components/cloud_devices/common/description_items.h
+++ b/components/cloud_devices/common/description_items.h
@@ -158,8 +158,8 @@
 template <class Traits>
 class EmptyCapability {
  public:
-  EmptyCapability() {};
-  ~EmptyCapability() {};
+  EmptyCapability() {}
+  ~EmptyCapability() {}
 
   bool LoadFrom(const CloudDeviceDescription& description);
   void SaveTo(CloudDeviceDescription* description) const;
diff --git a/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc b/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc
index d45ed16..6083626 100644
--- a/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc
+++ b/components/content_settings/core/browser/content_settings_origin_identifier_value_map.cc
@@ -82,9 +82,9 @@
          std::tie(other.primary_pattern, other.secondary_pattern);
 }
 
-OriginIdentifierValueMap::ValueEntry::ValueEntry(){};
+OriginIdentifierValueMap::ValueEntry::ValueEntry() {}
 
-OriginIdentifierValueMap::ValueEntry::~ValueEntry(){};
+OriginIdentifierValueMap::ValueEntry::~ValueEntry() {}
 
 std::unique_ptr<RuleIterator> OriginIdentifierValueMap::GetRuleIterator(
     ContentSettingsType content_type,
diff --git a/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java b/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java
index 9b621c48..115f0826 100644
--- a/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java
+++ b/components/crash/android/java/src/org/chromium/components/crash/browser/PackagePaths.java
@@ -56,6 +56,17 @@
             File parent = new File(pi.applicationInfo.nativeLibraryDir).getParentFile();
             if (parent != null) {
                 libPaths.add(new File(parent, arch).getPath());
+
+                // arch is the currently loaded library's ABI name. This is the name of the library
+                // directory in an APK, but may differ from the library directory extracted to the
+                // filesystem. ARM family abi names have a suffix specifying the architecture
+                // version, but may be extracted to directories named "arm64" or "arm".
+                // crbug.com/930342
+                if (arch.startsWith("arm64")) {
+                    libPaths.add(new File(parent, "arm64").getPath());
+                } else if (arch.startsWith("arm")) {
+                    libPaths.add(new File(parent, "arm").getPath());
+                }
             }
             for (String zip : zipPaths) {
                 if (zip.endsWith(".apk")) {
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h b/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h
index c415344..1228f86 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_pingback_client.h
@@ -13,7 +13,7 @@
 // server.
 class DataReductionProxyPingbackClient {
  public:
-  virtual ~DataReductionProxyPingbackClient(){};
+  virtual ~DataReductionProxyPingbackClient() {}
 
   // Sends a pingback to the data saver proxy server about various timing
   // information.
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
index 7724904..6b0f30b3 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_settings.cc
@@ -288,7 +288,7 @@
 DataReductionProxySettings::GetProxyRequestHeaders() const {
   DCHECK(thread_checker_.CalledOnValidThread());
   return proxy_request_headers_;
-};
+}
 
 void DataReductionProxySettings::SetProxyRequestHeaders(
     const net::HttpRequestHeaders& headers) {
diff --git a/components/dom_distiller/core/distilled_content_store.h b/components/dom_distiller/core/distilled_content_store.h
index 29cb874..b3fe71a 100644
--- a/components/dom_distiller/core/distilled_content_store.h
+++ b/components/dom_distiller/core/distilled_content_store.h
@@ -35,8 +35,8 @@
   virtual void LoadContent(const ArticleEntry& entry,
                            LoadCallback callback) = 0;
 
-  DistilledContentStore() {};
-  virtual ~DistilledContentStore() {};
+  DistilledContentStore() {}
+  virtual ~DistilledContentStore() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(DistilledContentStore);
diff --git a/components/dom_distiller/core/dom_distiller_switches.cc b/components/dom_distiller/core/dom_distiller_switches.cc
index 42c47e4..0603cb4 100644
--- a/components/dom_distiller/core/dom_distiller_switches.cc
+++ b/components/dom_distiller/core/dom_distiller_switches.cc
@@ -17,11 +17,11 @@
 const char kOGArticle[] = "opengraph";
 const char kAlwaysTrue[] = "alwaystrue";
 const char kNone[] = "none";
-};
+}  // namespace reader_mode_heuristics
 
 namespace reader_mode_feedback {
 const char kOn[] = "on";
 const char kOff[] = "off";
-};
+}  // namespace reader_mode_feedback
 
 }  // namespace switches
diff --git a/components/dom_distiller/core/dom_distiller_switches.h b/components/dom_distiller/core/dom_distiller_switches.h
index 1ed7288d..48e6a030 100644
--- a/components/dom_distiller/core/dom_distiller_switches.h
+++ b/components/dom_distiller/core/dom_distiller_switches.h
@@ -28,12 +28,12 @@
 extern const char kOGArticle[];
 extern const char kAlwaysTrue[];
 extern const char kNone[];
-};
+}  // namespace reader_mode_heuristics
 
 namespace reader_mode_feedback {
 extern const char kOn[];
 extern const char kOff[];
-};
+}  // namespace reader_mode_feedback
 
 }  // namespace switches
 
diff --git a/components/download/internal/common/download_worker.cc b/components/download/internal/common/download_worker.cc
index c2669d3..05f8261 100644
--- a/components/download/internal/common/download_worker.cc
+++ b/components/download/internal/common/download_worker.cc
@@ -30,7 +30,7 @@
 
 class CompletedInputStream : public InputStream {
  public:
-  CompletedInputStream(DownloadInterruptReason status) : status_(status){};
+  CompletedInputStream(DownloadInterruptReason status) : status_(status) {}
   ~CompletedInputStream() override = default;
 
   // InputStream
diff --git a/components/download/public/background_service/navigation_monitor.h b/components/download/public/background_service/navigation_monitor.h
index 329c10a2..9e9328fd 100644
--- a/components/download/public/background_service/navigation_monitor.h
+++ b/components/download/public/background_service/navigation_monitor.h
@@ -53,7 +53,7 @@
                          base::TimeDelta navigation_timeout_delay) = 0;
 
  protected:
-  ~NavigationMonitor() override{};
+  ~NavigationMonitor() override {}
 };
 
 }  // namespace download
diff --git a/components/favicon/core/favicon_server_fetcher_params.h b/components/favicon/core/favicon_server_fetcher_params.h
index 8484239..2b24a1f 100644
--- a/components/favicon/core/favicon_server_fetcher_params.h
+++ b/components/favicon/core/favicon_server_fetcher_params.h
@@ -24,13 +24,13 @@
 
   ~FaviconServerFetcherParams();
 
-  const GURL& page_url() const { return page_url_; };
-  favicon_base::IconType icon_type() const { return icon_type_; };
-  int min_source_size_in_pixel() const { return min_source_size_in_pixel_; };
-  int desired_size_in_pixel() const { return desired_size_in_pixel_; };
+  const GURL& page_url() const { return page_url_; }
+  favicon_base::IconType icon_type() const { return icon_type_; }
+  int min_source_size_in_pixel() const { return min_source_size_in_pixel_; }
+  int desired_size_in_pixel() const { return desired_size_in_pixel_; }
   const std::string& google_server_client_param() const {
     return google_server_client_param_;
-  };
+  }
 
  private:
   FaviconServerFetcherParams(const GURL& page_url,
diff --git a/components/favicon/core/large_icon_service.h b/components/favicon/core/large_icon_service.h
index 5d7d649d..46fe898 100644
--- a/components/favicon/core/large_icon_service.h
+++ b/components/favicon/core/large_icon_service.h
@@ -98,7 +98,7 @@
   virtual void TouchIconFromGoogleServer(const GURL& icon_url) = 0;
 
  protected:
-  LargeIconService(){};
+  LargeIconService() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(LargeIconService);
diff --git a/components/invalidation/impl/per_user_topic_registration_request.cc b/components/invalidation/impl/per_user_topic_registration_request.cc
index 8127a76..41554fe 100644
--- a/components/invalidation/impl/per_user_topic_registration_request.cc
+++ b/components/invalidation/impl/per_user_topic_registration_request.cc
@@ -77,7 +77,7 @@
   }
 }
 
-};  // namespace
+}  // namespace
 
 namespace syncer {
 
diff --git a/components/metrics/persisted_logs_metrics.h b/components/metrics/persisted_logs_metrics.h
index e3c58dd..496230c 100644
--- a/components/metrics/persisted_logs_metrics.h
+++ b/components/metrics/persisted_logs_metrics.h
@@ -34,7 +34,7 @@
   PersistedLogsMetrics() {}
   virtual ~PersistedLogsMetrics() {}
 
-  virtual void RecordLogReadStatus(LogReadStatus status){};
+  virtual void RecordLogReadStatus(LogReadStatus status) {}
 
   virtual void RecordCompressionRatio(
     size_t compressed_size, size_t original_size) {}
diff --git a/components/metrics/reporting_service.h b/components/metrics/reporting_service.h
index be7c3f6..b388b0d 100644
--- a/components/metrics/reporting_service.h
+++ b/components/metrics/reporting_service.h
@@ -72,7 +72,7 @@
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
  protected:
-  MetricsServiceClient* client() const { return client_; };
+  MetricsServiceClient* client() const { return client_; }
 
  private:
   // Retrieves the log store backing this service.
diff --git a/components/ntp_snippets/reading_list/reading_list_suggestions_provider.cc b/components/ntp_snippets/reading_list/reading_list_suggestions_provider.cc
index e493782..ed383e5c 100644
--- a/components/ntp_snippets/reading_list/reading_list_suggestions_provider.cc
+++ b/components/ntp_snippets/reading_list/reading_list_suggestions_provider.cc
@@ -47,7 +47,7 @@
   scoped_observer_.Add(reading_list_model_);
 }
 
-ReadingListSuggestionsProvider::~ReadingListSuggestionsProvider(){};
+ReadingListSuggestionsProvider::~ReadingListSuggestionsProvider() {}
 
 CategoryStatus ReadingListSuggestionsProvider::GetCategoryStatus(
     Category category) {
diff --git a/components/omnibox/browser/shortcuts_backend.h b/components/omnibox/browser/shortcuts_backend.h
index da70d48d..39eaf475a 100644
--- a/components/omnibox/browser/shortcuts_backend.h
+++ b/components/omnibox/browser/shortcuts_backend.h
@@ -40,7 +40,7 @@
 namespace history {
 class HistoryService;
 class ShortcutsDatabase;
-};  // namespace history
+}  // namespace history
 
 // This class manages the shortcut provider backend - access to database on the
 // db thread, etc.
diff --git a/components/pdf/renderer/pdf_accessibility_tree.h b/components/pdf/renderer/pdf_accessibility_tree.h
index 5cafb50..1d6ef4e 100644
--- a/components/pdf/renderer/pdf_accessibility_tree.h
+++ b/components/pdf/renderer/pdf_accessibility_tree.h
@@ -23,7 +23,7 @@
 
 namespace gfx {
 class Transform;
-};
+}
 
 namespace pdf {
 
diff --git a/components/policy/core/common/cloud/cloud_policy_client.h b/components/policy/core/common/cloud/cloud_policy_client.h
index 6700fcb..cedbe388 100644
--- a/components/policy/core/common/cloud/cloud_policy_client.h
+++ b/components/policy/core/common/cloud/cloud_policy_client.h
@@ -344,7 +344,7 @@
   const std::string& client_id() const { return client_id_; }
   const base::DictionaryValue* configuration_seed() const {
     return configuration_seed_.get();
-  };
+  }
 
   // The device mode as received in the registration request.
   DeviceMode device_mode() const { return device_mode_; }
diff --git a/components/policy/core/common/cloud/user_info_fetcher.cc b/components/policy/core/common/cloud/user_info_fetcher.cc
index c593f76..b7c65e78 100644
--- a/components/policy/core/common/cloud/user_info_fetcher.cc
+++ b/components/policy/core/common/cloud/user_info_fetcher.cc
@@ -121,4 +121,4 @@
   }
 }
 
-};  // namespace policy
+}  // namespace policy
diff --git a/components/previews/core/bloom_filter.h b/components/previews/core/bloom_filter.h
index cbf74b6..f820d87 100644
--- a/components/previews/core/bloom_filter.h
+++ b/components/previews/core/bloom_filter.h
@@ -42,7 +42,7 @@
   void Add(const std::string& str);
 
   // Returns the bit array data of this Bloom filter as vector of bytes.
-  const ByteVector& bytes() const { return bytes_; };
+  const ByteVector& bytes() const { return bytes_; }
 
  private:
   // Number of bits to set for each added string.
diff --git a/components/rappor/bloom_filter.h b/components/rappor/bloom_filter.h
index f250028..0245b73 100644
--- a/components/rappor/bloom_filter.h
+++ b/components/rappor/bloom_filter.h
@@ -30,7 +30,7 @@
   void SetString(const std::string& str);
 
   // Returns the current value of the Bloom filter's bit array.
-  const ByteVector& bytes() const { return bytes_; };
+  const ByteVector& bytes() const { return bytes_; }
 
  private:
   // Stores the byte array of the Bloom filter.
diff --git a/components/rappor/log_uploader_interface.h b/components/rappor/log_uploader_interface.h
index d3bbab5..2b601371 100644
--- a/components/rappor/log_uploader_interface.h
+++ b/components/rappor/log_uploader_interface.h
@@ -9,8 +9,8 @@
 
 class LogUploaderInterface {
  public:
-  LogUploaderInterface() {};
-  virtual ~LogUploaderInterface() {};
+  LogUploaderInterface() {}
+  virtual ~LogUploaderInterface() {}
 
   // Begin uploading logs.
   virtual void Start() = 0;
diff --git a/components/reading_list/core/reading_list_entry.cc b/components/reading_list/core/reading_list_entry.cc
index 281c2f4..e346848 100644
--- a/components/reading_list/core/reading_list_entry.cc
+++ b/components/reading_list/core/reading_list_entry.cc
@@ -51,7 +51,7 @@
 ReadingListEntry::ReadingListEntry(const GURL& url,
                                    const std::string& title,
                                    const base::Time& now)
-    : ReadingListEntry(url, title, now, nullptr){};
+    : ReadingListEntry(url, title, now, nullptr) {}
 
 ReadingListEntry::ReadingListEntry(const GURL& url,
                                    const std::string& title,
diff --git a/components/safe_browsing/triggers/trigger_throttler.h b/components/safe_browsing/triggers/trigger_throttler.h
index 321fc8b5..10cbcf6 100644
--- a/components/safe_browsing/triggers/trigger_throttler.h
+++ b/components/safe_browsing/triggers/trigger_throttler.h
@@ -47,7 +47,7 @@
 struct TriggerTypeHash {
   std::size_t operator()(TriggerType trigger_type) const {
     return static_cast<std::size_t>(trigger_type);
-  };
+  }
 };
 
 // A map for storing a list of event timestamps for different trigger types.
diff --git a/components/security_interstitials/content/unsafe_resource.cc b/components/security_interstitials/content/unsafe_resource.cc
index f9693b5..f9ed7717 100644
--- a/components/security_interstitials/content/unsafe_resource.cc
+++ b/components/security_interstitials/content/unsafe_resource.cc
@@ -22,7 +22,7 @@
   return content::WebContents::FromRenderFrameHost(render_frame_host);
 }
 
-};  // namespace
+}  // namespace
 
 UnsafeResource::UnsafeResource()
     : is_subresource(false),
diff --git a/components/security_interstitials/core/base_safe_browsing_error_ui.h b/components/security_interstitials/core/base_safe_browsing_error_ui.h
index c8fe2e6..18e057ed 100644
--- a/components/security_interstitials/core/base_safe_browsing_error_ui.h
+++ b/components/security_interstitials/core/base_safe_browsing_error_ui.h
@@ -140,7 +140,7 @@
 
   const std::string app_locale() const { return app_locale_; }
 
-  ControllerClient* controller() { return controller_; };
+  ControllerClient* controller() { return controller_; }
 
   GURL request_url() const { return request_url_; }
   GURL main_frame_url() const { return main_frame_url_; }
diff --git a/components/send_tab_to_self/OWNERS b/components/send_tab_to_self/OWNERS
index a49acc9..3f65592 100644
--- a/components/send_tab_to_self/OWNERS
+++ b/components/send_tab_to_self/OWNERS
@@ -2,5 +2,6 @@
 jeffreycohen@chromium.org
 sebsg@chromium.org
 tgupta@chromium.org
+tinazwang@chromium.org
 
 # COMPONENT: UI>Browser>Sharing
diff --git a/components/signin/core/browser/about_signin_internals.cc b/components/signin/core/browser/about_signin_internals.cc
index 64d55b2..1d055df 100644
--- a/components/signin/core/browser/about_signin_internals.cc
+++ b/components/signin/core/browser/about_signin_internals.cc
@@ -536,7 +536,7 @@
 }
 
 AboutSigninInternals::RefreshTokenEvent::RefreshTokenEvent()
-    : timestamp(base::Time::Now()){};
+    : timestamp(base::Time::Now()) {}
 
 std::string AboutSigninInternals::RefreshTokenEvent::GetTypeAsString() const {
   switch (type) {
diff --git a/components/signin/core/browser/signin_header_helper.cc b/components/signin/core/browser/signin_header_helper.cc
index 741ffbbf..5734e7f 100644
--- a/components/signin/core/browser/signin_header_helper.cc
+++ b/components/signin/core/browser/signin_header_helper.cc
@@ -107,7 +107,7 @@
 }
 
 SigninHeaderHelper::SigninHeaderHelper(const std::string& histogram_suffix)
-    : histogram_suffix_(histogram_suffix){};
+    : histogram_suffix_(histogram_suffix) {}
 SigninHeaderHelper::~SigninHeaderHelper() = default;
 
 bool SigninHeaderHelper::AppendOrRemoveRequestHeader(
diff --git a/components/signin/core/browser/webdata/token_web_data.cc b/components/signin/core/browser/webdata/token_web_data.cc
index 4637762f..cc38aca 100644
--- a/components/signin/core/browser/webdata/token_web_data.cc
+++ b/components/signin/core/browser/webdata/token_web_data.cc
@@ -67,7 +67,7 @@
 TokenResult::TokenResult()
     : db_result(TokenServiceTable::TOKEN_DB_RESULT_SQL_INVALID_STATEMENT) {}
 TokenResult::TokenResult(const TokenResult& other) = default;
-TokenResult::~TokenResult(){};
+TokenResult::~TokenResult() {}
 
 TokenWebData::TokenWebData(
     scoped_refptr<WebDatabaseService> wdbs,
diff --git a/components/subresource_filter/content/common/ad_delay_throttle.cc b/components/subresource_filter/content/common/ad_delay_throttle.cc
index ac29ef5..594d9790 100644
--- a/components/subresource_filter/content/common/ad_delay_throttle.cc
+++ b/components/subresource_filter/content/common/ad_delay_throttle.cc
@@ -79,7 +79,7 @@
   }
 };
 
-};  // namespace
+}  // namespace
 
 AdDelayThrottle::DeferCondition::DeferCondition(
     base::TimeDelta delay,
diff --git a/components/sync/driver/backend_migrator.cc b/components/sync/driver/backend_migrator.cc
index e286b3f58..696eda69 100644
--- a/components/sync/driver/backend_migrator.cc
+++ b/components/sync/driver/backend_migrator.cc
@@ -206,4 +206,4 @@
 
 #undef SLOG
 
-};  // namespace syncer
+}  // namespace syncer
diff --git a/components/sync_sessions/lost_navigations_recorder.h b/components/sync_sessions/lost_navigations_recorder.h
index a9c314ad..e3d5f91 100644
--- a/components/sync_sessions/lost_navigations_recorder.h
+++ b/components/sync_sessions/lost_navigations_recorder.h
@@ -53,6 +53,6 @@
   std::map<SessionID, id_type> max_recorded_for_tab_;
   DISALLOW_COPY_AND_ASSIGN(LostNavigationsRecorder);
 };
-};  // namespace sync_sessions
+}  // namespace sync_sessions
 
 #endif  // COMPONENTS_SYNC_SESSIONS_LOST_NAVIGATIONS_RECORDER_H_
diff --git a/components/ui_devtools/devtools_base_agent.h b/components/ui_devtools/devtools_base_agent.h
index 7d24f96..7f44cdcc 100644
--- a/components/ui_devtools/devtools_base_agent.h
+++ b/components/ui_devtools/devtools_base_agent.h
@@ -38,9 +38,9 @@
 
   // Common methods between all generated Backends, subclasses may
   // choose to override them (but not necessary).
-  protocol::Response enable() override { return protocol::Response::OK(); };
+  protocol::Response enable() override { return protocol::Response::OK(); }
 
-  protocol::Response disable() override { return protocol::Response::OK(); };
+  protocol::Response disable() override { return protocol::Response::OK(); }
 
  protected:
   UiDevToolsBaseAgent() {}
diff --git a/components/ui_devtools/overlay_agent.h b/components/ui_devtools/overlay_agent.h
index 32578efc..5d0de0e 100644
--- a/components/ui_devtools/overlay_agent.h
+++ b/components/ui_devtools/overlay_agent.h
@@ -27,7 +27,7 @@
   protocol::Response hideHighlight() override;
 
  protected:
-  DOMAgent* dom_agent() const { return dom_agent_; };
+  DOMAgent* dom_agent() const { return dom_agent_; }
 
  private:
   DOMAgent* const dom_agent_;
diff --git a/components/ui_devtools/ui_element_delegate.h b/components/ui_devtools/ui_element_delegate.h
index c8dde2ea..7b3205b7 100644
--- a/components/ui_devtools/ui_element_delegate.h
+++ b/components/ui_devtools/ui_element_delegate.h
@@ -15,8 +15,8 @@
 
 class UIElementDelegate {
  public:
-  UIElementDelegate(){};
-  virtual ~UIElementDelegate(){};
+  UIElementDelegate() {}
+  virtual ~UIElementDelegate() {}
 
   virtual void OnUIElementAdded(UIElement* parent, UIElement* child) = 0;
 
diff --git a/components/ui_devtools/views/overlay_agent_aura.h b/components/ui_devtools/views/overlay_agent_aura.h
index fc0b6ae..b371cba4 100644
--- a/components/ui_devtools/views/overlay_agent_aura.h
+++ b/components/ui_devtools/views/overlay_agent_aura.h
@@ -63,7 +63,7 @@
 
   HighlightRectsConfiguration highlight_rect_config() const {
     return highlight_rect_config_;
-  };
+  }
 
   // Return the id of the UI element located at |event|'s root location.
   // The function first searches for the targeted window, then the targeted
diff --git a/components/ui_devtools/views/view_element.h b/components/ui_devtools/views/view_element.h
index ee84c75..2f5a7c3d 100644
--- a/components/ui_devtools/views/view_element.h
+++ b/components/ui_devtools/views/view_element.h
@@ -22,7 +22,7 @@
               UIElementDelegate* ui_element_delegate,
               UIElement* parent);
   ~ViewElement() override;
-  views::View* view() const { return view_; };
+  views::View* view() const { return view_; }
 
   // views::ViewObserver
   void OnChildViewRemoved(views::View* parent, views::View* view) override;
diff --git a/components/ui_devtools/views/widget_element.h b/components/ui_devtools/views/widget_element.h
index 24a90cca..b041e4d0 100644
--- a/components/ui_devtools/views/widget_element.h
+++ b/components/ui_devtools/views/widget_element.h
@@ -25,7 +25,7 @@
                 UIElementDelegate* ui_element_delegate,
                 UIElement* parent);
   ~WidgetElement() override;
-  views::Widget* widget() const { return widget_; };
+  views::Widget* widget() const { return widget_; }
 
   // views::WidgetRemovalsObserver:
   void OnWillRemoveView(views::Widget* widget, views::View* view) override;
diff --git a/components/ui_devtools/views/window_element.h b/components/ui_devtools/views/window_element.h
index 89c3280..d32b858 100644
--- a/components/ui_devtools/views/window_element.h
+++ b/components/ui_devtools/views/window_element.h
@@ -20,7 +20,7 @@
                 UIElementDelegate* ui_element_delegate,
                 UIElement* parent);
   ~WindowElement() override;
-  aura::Window* window() const { return window_; };
+  aura::Window* window() const { return window_; }
 
   // WindowObserver:
   void OnWindowHierarchyChanging(
diff --git a/components/ui_devtools/viz/dom_agent_viz.h b/components/ui_devtools/viz/dom_agent_viz.h
index 8f2b372..540b2705 100644
--- a/components/ui_devtools/viz/dom_agent_viz.h
+++ b/components/ui_devtools/viz/dom_agent_viz.h
@@ -36,13 +36,13 @@
   // viz::SurfaceObserver:
   void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
   void OnSurfaceActivated(const viz::SurfaceId& surface_id,
-                          base::Optional<base::TimeDelta> duration) override{};
-  void OnSurfaceDestroyed(const viz::SurfaceId& surface_id) override{};
+                          base::Optional<base::TimeDelta> duration) override {}
+  void OnSurfaceDestroyed(const viz::SurfaceId& surface_id) override {}
   bool OnSurfaceDamaged(const viz::SurfaceId& surface_id,
                         const viz::BeginFrameAck& ack) override;
   void OnSurfaceDiscarded(const viz::SurfaceId& surface_id) override;
   void OnSurfaceDamageExpected(const viz::SurfaceId& surface_id,
-                               const viz::BeginFrameArgs& args) override{};
+                               const viz::BeginFrameArgs& args) override {}
   void OnAddedSurfaceReference(const viz::SurfaceId& parent_id,
                                const viz::SurfaceId& child_id) override;
   void OnRemovedSurfaceReference(const viz::SurfaceId& parent_id,
diff --git a/components/ukm/test_ukm_recorder.cc b/components/ukm/test_ukm_recorder.cc
index bfe3f1a..b5267ef0 100644
--- a/components/ukm/test_ukm_recorder.cc
+++ b/components/ukm/test_ukm_recorder.cc
@@ -42,8 +42,7 @@
   DisableSamplingForTesting();
 }
 
-TestUkmRecorder::~TestUkmRecorder() {
-};
+TestUkmRecorder::~TestUkmRecorder() {}
 
 bool TestUkmRecorder::ShouldRestrictToWhitelistedSourceIds() const {
   // In tests, we want to record all source ids (not just those that are
@@ -163,6 +162,6 @@
 
 TestAutoSetUkmRecorder::~TestAutoSetUkmRecorder() {
   DelegatingUkmRecorder::Get()->RemoveDelegate(this);
-};
+}
 
 }  // namespace ukm
diff --git a/components/viz/test/fake_compositor_frame_sink_client.cc b/components/viz/test/fake_compositor_frame_sink_client.cc
index 818237d..f73b2e3 100644
--- a/components/viz/test/fake_compositor_frame_sink_client.cc
+++ b/components/viz/test/fake_compositor_frame_sink_client.cc
@@ -31,4 +31,4 @@
                              resources.end());
 }
 
-};  // namespace viz
+}  // namespace viz
diff --git a/content/browser/accessibility/one_shot_accessibility_tree_search.h b/content/browser/accessibility/one_shot_accessibility_tree_search.h
index 055cc5b..ef1953f 100644
--- a/content/browser/accessibility/one_shot_accessibility_tree_search.h
+++ b/content/browser/accessibility/one_shot_accessibility_tree_search.h
@@ -64,6 +64,7 @@
 DECLARE_ACCESSIBILITY_PREDICATE(AccessibilityVisitedLinkPredicate);
 DECLARE_ACCESSIBILITY_PREDICATE(AccessibilityTextStyleBoldPredicate);
 
+#undef DECLARE_ACCESSIBILITY_PREDICATE
 
 // This class provides an interface for searching the accessibility tree from
 // a given starting node, with a few built-in options and allowing an arbitrary
diff --git a/content/browser/appcache/appcache_backend_impl.cc b/content/browser/appcache/appcache_backend_impl.cc
index 780799e..de7dbcc 100644
--- a/content/browser/appcache/appcache_backend_impl.cc
+++ b/content/browser/appcache/appcache_backend_impl.cc
@@ -32,6 +32,12 @@
 }
 
 void AppCacheBackendImpl::RegisterHost(int32_t id, int32_t render_frame_id) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  if (GetHost(id)) {
+    mojo::ReportBadMessage("ACDH_REGISTER");
+    return;
+  }
+
   // The AppCacheHost could have been precreated in which case we want to
   // register it with the backend here.
   std::unique_ptr<AppCacheHost> host =
@@ -40,12 +46,6 @@
     RegisterPrecreatedHost(std::move(host), render_frame_id);
     return;
   }
-
-  if (GetHost(id)) {
-    mojo::ReportBadMessage("ACDH_REGISTER");
-    return;
-  }
-
   hosts_[id] = std::make_unique<AppCacheHost>(id, process_id(), render_frame_id,
                                               frontend_, service_);
 }
@@ -167,10 +167,4 @@
   hosts_[host->host_id()] = std::move(host);
 }
 
-void AppCacheBackendImpl::RegisterHostForTesting(int32_t id,
-                                                 int32_t render_frame_id) {
-  hosts_[id] = std::make_unique<AppCacheHost>(id, process_id(), render_frame_id,
-                                              frontend_, service_);
-}
-
 }  // namespace content
diff --git a/content/browser/appcache/appcache_backend_impl.h b/content/browser/appcache/appcache_backend_impl.h
index d673f380..f60a959 100644
--- a/content/browser/appcache/appcache_backend_impl.h
+++ b/content/browser/appcache/appcache_backend_impl.h
@@ -59,8 +59,6 @@
   void RegisterPrecreatedHost(std::unique_ptr<AppCacheHost> host,
                               int render_frame_id);
 
-  void RegisterHostForTesting(int32_t host_id, int32_t render_frame_id);
-
   void set_frontend_for_testing(blink::mojom::AppCacheFrontend* frontend) {
     frontend_ = frontend;
   }
diff --git a/content/browser/appcache/appcache_host_unittest.cc b/content/browser/appcache/appcache_host_unittest.cc
index 35c8c536..82d6492 100644
--- a/content/browser/appcache/appcache_host_unittest.cc
+++ b/content/browser/appcache/appcache_host_unittest.cc
@@ -590,7 +590,7 @@
 
   AppCacheBackendImpl backend(&service_, kProcessIdForTest);
   backend.set_frontend_for_testing(&mock_frontend_);
-  backend.RegisterHostForTesting(kHostIdForTest, kRenderFrameIdForTest);
+  backend.RegisterHost(kHostIdForTest, kRenderFrameIdForTest);
 
   blink::mojom::AppCacheBackendPtr backend_ptr;
   mojo::Binding<blink::mojom::AppCacheBackend> backend_binding(
@@ -639,7 +639,7 @@
 
   AppCacheBackendImpl backend(&service_, kProcessIdForTest);
   backend.set_frontend_for_testing(&mock_frontend_);
-  backend.RegisterHostForTesting(kHostIdForTest, kRenderFrameIdForTest);
+  backend.RegisterHost(kHostIdForTest, kRenderFrameIdForTest);
 
   blink::mojom::AppCacheBackendPtr backend_ptr;
   mojo::Binding<blink::mojom::AppCacheBackend> backend_binding(
diff --git a/content/browser/cache_storage/cache_storage.cc b/content/browser/cache_storage/cache_storage.cc
index 5b44e52..1d1df93 100644
--- a/content/browser/cache_storage/cache_storage.cc
+++ b/content/browser/cache_storage/cache_storage.cc
@@ -237,13 +237,13 @@
                           CacheStorageCacheHandle cache_handle) override {
     DCHECK(!base::ContainsKey(cache_handles_, cache_name));
     cache_handles_.insert(std::make_pair(cache_name, std::move(cache_handle)));
-  };
+  }
 
   void NotifyCacheDoomed(CacheStorageCacheHandle cache_handle) override {
     DCHECK(
         base::ContainsKey(cache_handles_, cache_handle.value()->cache_name()));
     cache_handles_.erase(cache_handle.value()->cache_name());
-  };
+  }
 
  private:
   typedef std::map<std::string, CacheStorageCacheHandle> CacheHandles;
@@ -468,7 +468,7 @@
         cache_name_to_cache_dir_.find(cache_handle.value()->cache_name());
     doomed_cache_to_path_[cache_handle.value()] = iter->second;
     cache_name_to_cache_dir_.erase(iter);
-  };
+  }
 
  private:
   friend class MigratedLegacyCacheDirectoryNameTest;
diff --git a/content/browser/cache_storage/cache_storage_context_impl.h b/content/browser/cache_storage/cache_storage_context_impl.h
index 39f1e88..8310a84 100644
--- a/content/browser/cache_storage/cache_storage_context_impl.h
+++ b/content/browser/cache_storage/cache_storage_context_impl.h
@@ -47,7 +47,7 @@
                                        const std::string& cache_name) = 0;
 
    protected:
-    virtual ~Observer() {};
+    virtual ~Observer() {}
   };
 
   // Init and Shutdown are for use on the UI thread when the profile,
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h
index 379b184..2285b8db 100644
--- a/content/browser/frame_host/navigation_request.h
+++ b/content/browser/frame_host/navigation_request.h
@@ -157,11 +157,11 @@
     return dest_site_instance_.get();
   }
 
-  RestoreType restore_type() const { return restore_type_; };
+  RestoreType restore_type() const { return restore_type_; }
 
-  bool is_view_source() const { return is_view_source_; };
+  bool is_view_source() const { return is_view_source_; }
 
-  int bindings() const { return bindings_; };
+  int bindings() const { return bindings_; }
 
   bool browser_initiated() const { return browser_initiated_ ; }
 
diff --git a/content/browser/frame_host/render_frame_proxy_host.h b/content/browser/frame_host/render_frame_proxy_host.h
index 76590d429..45588e9 100644
--- a/content/browser/frame_host/render_frame_proxy_host.h
+++ b/content/browser/frame_host/render_frame_proxy_host.h
@@ -92,7 +92,7 @@
     return site_instance_.get();
   }
 
-  FrameTreeNode* frame_tree_node() const { return frame_tree_node_; };
+  FrameTreeNode* frame_tree_node() const { return frame_tree_node_; }
 
   // Associates the RenderWidgetHostViewChildFrame |view| with this
   // RenderFrameProxyHost. If |initial_frame_size| isn't specified at this time,
diff --git a/content/browser/indexed_db/indexed_db_context_impl.h b/content/browser/indexed_db/indexed_db_context_impl.h
index c599504d..8d371c90 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.h
+++ b/content/browser/indexed_db/indexed_db_context_impl.h
@@ -62,7 +62,7 @@
         const base::string16& object_store_name) = 0;
 
    protected:
-    virtual ~Observer() {};
+    virtual ~Observer() {}
   };
 
   // The indexed db directory.
diff --git a/content/browser/indexed_db/leveldb/leveldb_iterator.h b/content/browser/indexed_db/leveldb/leveldb_iterator.h
index fd2b0de..dade9a8d 100644
--- a/content/browser/indexed_db/leveldb/leveldb_iterator.h
+++ b/content/browser/indexed_db/leveldb/leveldb_iterator.h
@@ -26,7 +26,7 @@
   // expense of reloading and seeking later if the iterator is needed again for
   // |Seek*|, |Next|, |Prev|, or |Value|.
   // Cannot be called more than once before the iterator is reloaded.
-  virtual void Detach() {};
+  virtual void Detach() {}
   virtual bool IsDetached() const;
 };
 
diff --git a/content/browser/indexed_db/scopes/scope_lock.cc b/content/browser/indexed_db/scopes/scope_lock.cc
index 59cf5b05..0ae6402 100644
--- a/content/browser/indexed_db/scopes/scope_lock.cc
+++ b/content/browser/indexed_db/scopes/scope_lock.cc
@@ -34,7 +34,7 @@
   this->closure_runner_ = std::move(other.closure_runner_);
   other.is_locked_ = false;
   return *this;
-};
+}
 
 void ScopeLock::Release() {
   if (is_locked_) {
diff --git a/content/browser/loader/detachable_resource_handler.cc b/content/browser/loader/detachable_resource_handler.cc
index e355a6d..31493b1 100644
--- a/content/browser/loader/detachable_resource_handler.cc
+++ b/content/browser/loader/detachable_resource_handler.cc
@@ -28,7 +28,7 @@
 class DetachableResourceHandler::Controller : public ResourceController {
  public:
   explicit Controller(DetachableResourceHandler* detachable_handler)
-      : detachable_handler_(detachable_handler){};
+      : detachable_handler_(detachable_handler) {}
 
   ~Controller() override {}
 
diff --git a/content/browser/loader/resource_controller.h b/content/browser/loader/resource_controller.h
index 06f1c47..e8e1f7eb 100644
--- a/content/browser/loader/resource_controller.h
+++ b/content/browser/loader/resource_controller.h
@@ -10,7 +10,7 @@
 
 namespace net {
 class HttpRequestHeaders;
-};
+}
 
 namespace content {
 
diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc
index 2e7b35e..cb41cda 100644
--- a/content/browser/loader/resource_loader.cc
+++ b/content/browser/loader/resource_loader.cc
@@ -146,7 +146,7 @@
 class ResourceLoader::Controller : public ResourceController {
  public:
   explicit Controller(ResourceLoader* resource_loader)
-      : resource_loader_(resource_loader){};
+      : resource_loader_(resource_loader) {}
 
   ~Controller() override {}
 
diff --git a/content/browser/media/audio_muting_session.cc b/content/browser/media/audio_muting_session.cc
index 6e8c13d3..891f5ab 100644
--- a/content/browser/media/audio_muting_session.cc
+++ b/content/browser/media/audio_muting_session.cc
@@ -9,7 +9,7 @@
 AudioMutingSession::AudioMutingSession(const base::UnguessableToken& group_id)
     : group_id_(group_id) {}
 
-AudioMutingSession::~AudioMutingSession(){};
+AudioMutingSession::~AudioMutingSession() {}
 
 void AudioMutingSession::Connect(audio::mojom::StreamFactory* factory) {
   if (muter_)
diff --git a/content/browser/media/flinging_renderer.cc b/content/browser/media/flinging_renderer.cc
index 59c0d42..83cf1aa5 100644
--- a/content/browser/media/flinging_renderer.cc
+++ b/content/browser/media/flinging_renderer.cc
@@ -22,7 +22,7 @@
 
 FlingingRenderer::~FlingingRenderer() {
   controller_->RemoveMediaStatusObserver(this);
-};
+}
 
 // static
 std::unique_ptr<FlingingRenderer> FlingingRenderer::Create(
diff --git a/content/browser/media/midi_host.cc b/content/browser/media/midi_host.cc
index ae61903f..1b88a3f 100644
--- a/content/browser/media/midi_host.cc
+++ b/content/browser/media/midi_host.cc
@@ -249,6 +249,6 @@
     midi_service_->EndSession(this);
   midi_client_.reset();
   midi_session_.Close();
-};
+}
 
 }  // namespace content
diff --git a/content/browser/renderer_host/pepper/pepper_truetype_font.h b/content/browser/renderer_host/pepper/pepper_truetype_font.h
index 63ed2c6..7b31b7c 100644
--- a/content/browser/renderer_host/pepper/pepper_truetype_font.h
+++ b/content/browser/renderer_host/pepper/pepper_truetype_font.h
@@ -49,7 +49,7 @@
 
  protected:
   friend class base::RefCountedThreadSafe<PepperTrueTypeFont>;
-  virtual ~PepperTrueTypeFont() {};
+  virtual ~PepperTrueTypeFont() {}
 };
 
 }  // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame.h b/content/browser/renderer_host/render_widget_host_view_child_frame.h
index f2769f7..30858b3 100644
--- a/content/browser/renderer_host/render_widget_host_view_child_frame.h
+++ b/content/browser/renderer_host/render_widget_host_view_child_frame.h
@@ -135,7 +135,7 @@
   // Since the URL of content rendered by this class is not displayed in
   // the URL bar, this method does not need an implementation.
   void ClearCompositorFrame() override {}
-  void ResetFallbackToFirstNavigationSurface() override{};
+  void ResetFallbackToFirstNavigationSurface() override {}
 
   void TransformPointToRootSurface(gfx::PointF* point) override;
   gfx::Rect GetBoundsInRootWindow() override;
diff --git a/content/browser/service_worker/service_worker_installed_script_reader.cc b/content/browser/service_worker/service_worker_installed_script_reader.cc
index 8bec9c04..d0d7d92 100644
--- a/content/browser/service_worker/service_worker_installed_script_reader.cc
+++ b/content/browser/service_worker/service_worker_installed_script_reader.cc
@@ -273,4 +273,4 @@
     client_->OnFinished(reason);
 }
 
-};  // namespace content
+}  // namespace content
diff --git a/content/browser/service_worker/service_worker_navigation_loader.cc b/content/browser/service_worker/service_worker_navigation_loader.cc
index e76f057..60e00c11 100644
--- a/content/browser/service_worker/service_worker_navigation_loader.cc
+++ b/content/browser/service_worker/service_worker_navigation_loader.cc
@@ -125,7 +125,7 @@
       "ServiceWorker",
       "ServiceWorkerNavigationLoader::~ServiceWorkerNavigationloader", this,
       TRACE_EVENT_FLAG_FLOW_IN);
-};
+}
 
 void ServiceWorkerNavigationLoader::FallbackToNetwork() {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 6997223..77b066e 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -2121,7 +2121,7 @@
     std::map<GURL, ServiceWorkerUpdateChecker::ComparedScriptInfo>
         compared_script_info_map) {
   compared_script_info_map_ = std::move(compared_script_info_map);
-};
+}
 
 const std::map<GURL, ServiceWorkerUpdateChecker::ComparedScriptInfo>&
 ServiceWorkerVersion::compared_script_info_map() const {
diff --git a/content/browser/utility_process_host_client.h b/content/browser/utility_process_host_client.h
index 7972fa8e..05622d3c 100644
--- a/content/browser/utility_process_host_client.h
+++ b/content/browser/utility_process_host_client.h
@@ -36,6 +36,6 @@
   virtual ~UtilityProcessHostClient() {}
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_BROWSER_UTILITY_PROCESS_HOST_CLIENT_H_
diff --git a/content/browser/web_package/signed_exchange_envelope.h b/content/browser/web_package/signed_exchange_envelope.h
index 0031315..731684c3 100644
--- a/content/browser/web_package/signed_exchange_envelope.h
+++ b/content/browser/web_package/signed_exchange_envelope.h
@@ -59,7 +59,7 @@
 
   const signed_exchange_utils::URLWithRawString& request_url() const {
     return request_url_;
-  };
+  }
   void set_request_url(const signed_exchange_utils::URLWithRawString& url) {
     request_url_ = url;
   }
diff --git a/content/browser/web_package/signed_exchange_loader.h b/content/browser/web_package/signed_exchange_loader.h
index 7b0418e4..475750e4 100644
--- a/content/browser/web_package/signed_exchange_loader.h
+++ b/content/browser/web_package/signed_exchange_loader.h
@@ -92,7 +92,7 @@
 
   void ConnectToClient(network::mojom::URLLoaderClientPtr client);
 
-  const base::Optional<GURL>& fallback_url() const { return fallback_url_; };
+  const base::Optional<GURL>& fallback_url() const { return fallback_url_; }
 
   const base::Optional<GURL>& inner_request_url() const {
     return inner_request_url_;
diff --git a/content/child/child_process_sandbox_support_impl_linux.h b/content/child/child_process_sandbox_support_impl_linux.h
index d126545..e3d6d82e1 100644
--- a/content/child/child_process_sandbox_support_impl_linux.h
+++ b/content/child/child_process_sandbox_support_impl_linux.h
@@ -72,6 +72,6 @@
   DISALLOW_COPY_AND_ASSIGN(WebSandboxSupportLinux);
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_CHILD_CHILD_PROCESS_SANDBOX_SUPPORT_IMPL_LINUX_H_
diff --git a/content/common/content_security_policy/csp_source_list.cc b/content/common/content_security_policy/csp_source_list.cc
index 343c4c1b..3adb1e4 100644
--- a/content/common/content_security_policy/csp_source_list.cc
+++ b/content/common/content_security_policy/csp_source_list.cc
@@ -19,7 +19,7 @@
   return false;
 }
 
-};  // namespace
+}  // namespace
 
 CSPSourceList::CSPSourceList()
     : allow_self(false),
diff --git a/content/common/drag_event_source_info.h b/content/common/drag_event_source_info.h
index b5177ee..d78ac45 100644
--- a/content/common/drag_event_source_info.h
+++ b/content/common/drag_event_source_info.h
@@ -17,6 +17,6 @@
   ui::DragDropTypes::DragEventSource event_source;
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_COMMON_DRAG_EVENT_SOURCE_INFO_H_
diff --git a/content/public/app/BUILD.gn b/content/public/app/BUILD.gn
index 9b73220..6be5a78 100644
--- a/content/public/app/BUILD.gn
+++ b/content/public/app/BUILD.gn
@@ -23,7 +23,6 @@
 import("//build/config/chrome_build.gni")
 import("//build/config/ui.gni")
 import("//chromeos/assistant/assistant.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
 import("//ui/base/ui_features.gni")
 
@@ -237,7 +236,7 @@
     "//services/shape_detection/public/cpp:manifest",
     "//services/tracing:manifest",
     "//services/video_capture/public/cpp:manifest",
-    "//services/viz:manifest",
+    "//services/viz/public/cpp:manifest",
   ]
 
   public_deps = [
diff --git a/content/public/app/DEPS b/content/public/app/DEPS
index ec2968b..ea62ec1 100644
--- a/content/public/app/DEPS
+++ b/content/public/app/DEPS
@@ -29,6 +29,6 @@
     "+services/resource_coordinator/public/cpp/manifest.h",
     "+services/shape_detection/public/cpp/manifest.h",
     "+services/tracing/manifest.h",
-    "+services/viz/manifest.h",
+    "+services/viz/public/cpp/manifest.h",
   ],
 }
diff --git a/content/public/app/content_packaged_services_manifest.cc b/content/public/app/content_packaged_services_manifest.cc
index 6f6280b..0979671 100644
--- a/content/public/app/content_packaged_services_manifest.cc
+++ b/content/public/app/content_packaged_services_manifest.cc
@@ -21,7 +21,7 @@
 #include "services/shape_detection/public/cpp/manifest.h"
 #include "services/tracing/manifest.h"
 #include "services/video_capture/public/cpp/manifest.h"
-#include "services/viz/manifest.h"
+#include "services/viz/public/cpp/manifest.h"
 
 #if defined(OS_LINUX)
 #include "components/services/font/public/cpp/manifest.h"  // nogncheck
diff --git a/content/public/browser/background_sync_controller.h b/content/public/browser/background_sync_controller.h
index 6b86f60..7e46e3a 100644
--- a/content/public/browser/background_sync_controller.h
+++ b/content/public/browser/background_sync_controller.h
@@ -24,7 +24,7 @@
   // background sync. Note that disable can be overridden from false to true
   // but overrides from true to false will be ignored.
   virtual void GetParameterOverrides(
-      BackgroundSyncParameters* parameters) const {};
+      BackgroundSyncParameters* parameters) const {}
 
   // Notification that a service worker registration with origin |origin| just
   // registered a background sync event.
diff --git a/content/public/browser/browser_associated_interface.h b/content/public/browser/browser_associated_interface.h
index b4e2e00..b0f6cab0 100644
--- a/content/public/browser/browser_associated_interface.h
+++ b/content/public/browser/browser_associated_interface.h
@@ -110,6 +110,6 @@
   DISALLOW_COPY_AND_ASSIGN(BrowserAssociatedInterface);
 };
 
-};
+}  // namespace content
 
 #endif  // CONTENT_BROWSER_BROWSER_ASSOCIATED_INTERFACE_H_
diff --git a/content/public/browser/browser_child_process_host.h b/content/public/browser/browser_child_process_host.h
index b034936..71a21234 100644
--- a/content/public/browser/browser_child_process_host.h
+++ b/content/public/browser/browser_child_process_host.h
@@ -105,6 +105,6 @@
 #endif
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_BROWSER_CHILD_PROCESS_HOST_H_
diff --git a/content/public/browser/browser_child_process_host_delegate.h b/content/public/browser/browser_child_process_host_delegate.h
index 8acc006..70fe561 100644
--- a/content/public/browser/browser_child_process_host_delegate.h
+++ b/content/public/browser/browser_child_process_host_delegate.h
@@ -28,6 +28,6 @@
   virtual void OnProcessCrashed(int exit_code) {}
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_BROWSER_CHILD_PROCESS_HOST_DELEGATE_H_
diff --git a/content/public/browser/browser_child_process_host_iterator.h b/content/public/browser/browser_child_process_host_iterator.h
index 0f3a11f8..a32522b8 100644
--- a/content/public/browser/browser_child_process_host_iterator.h
+++ b/content/public/browser/browser_child_process_host_iterator.h
@@ -62,6 +62,6 @@
   }
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_BROWSER_CHILD_PROCESS_HOST_ITERATOR_H_
diff --git a/content/public/browser/gpu_data_manager.h b/content/public/browser/gpu_data_manager.h
index a7cf288..3dfa8220 100644
--- a/content/public/browser/gpu_data_manager.h
+++ b/content/public/browser/gpu_data_manager.h
@@ -74,6 +74,6 @@
   virtual ~GpuDataManager() {}
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_GPU_DATA_MANAGER_H_
diff --git a/content/public/browser/gpu_data_manager_observer.h b/content/public/browser/gpu_data_manager_observer.h
index 8543752d..4163940 100644
--- a/content/public/browser/gpu_data_manager_observer.h
+++ b/content/public/browser/gpu_data_manager_observer.h
@@ -24,6 +24,6 @@
   virtual ~GpuDataManagerObserver() {}
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_PUBLIC_BROWSER_GPU_DATA_MANAGER_OBSERVER_H_
diff --git a/content/public/browser/navigation_data.h b/content/public/browser/navigation_data.h
index d0fccd6d..f75d3adf3 100644
--- a/content/public/browser/navigation_data.h
+++ b/content/public/browser/navigation_data.h
@@ -14,7 +14,7 @@
 // UI thread as a clone.
 class NavigationData {
  public:
-  virtual ~NavigationData(){};
+  virtual ~NavigationData() {}
 
   // Creates a new NavigationData that is a deep copy of the original
   virtual std::unique_ptr<NavigationData> Clone() const = 0;
diff --git a/content/public/browser/permission_controller.h b/content/public/browser/permission_controller.h
index de585e5..d42de37 100644
--- a/content/public/browser/permission_controller.h
+++ b/content/public/browser/permission_controller.h
@@ -24,7 +24,7 @@
   // cancelling/unsubscribing at a later stage would have no effect.
   static const int kNoPendingOperation = -1;
 
-  ~PermissionController() override{};
+  ~PermissionController() override {}
 
   // Returns the permission status of a given requesting_origin/embedding_origin
   // tuple. This is not taking a RenderFrameHost because the call might happen
diff --git a/content/public/browser/web_contents_user_data.h b/content/public/browser/web_contents_user_data.h
index a1f0d2e..74a657f 100644
--- a/content/public/browser/web_contents_user_data.h
+++ b/content/public/browser/web_contents_user_data.h
@@ -10,7 +10,7 @@
 #include "base/supports_user_data.h"
 #include "content/public/browser/web_contents.h"
 
-#define WEB_CONTENTS_USER_DATA_KEY_DECL() static constexpr int kUserDataKey = 0;
+#define WEB_CONTENTS_USER_DATA_KEY_DECL() static constexpr int kUserDataKey = 0
 
 #define WEB_CONTENTS_USER_DATA_KEY_IMPL(Type) const int Type::kUserDataKey;
 
diff --git a/content/public/common/child_process_host_delegate.h b/content/public/common/child_process_host_delegate.h
index 9612991..8bea9e8 100644
--- a/content/public/common/child_process_host_delegate.h
+++ b/content/public/common/child_process_host_delegate.h
@@ -39,6 +39,6 @@
                              mojo::ScopedMessagePipeHandle interface_pipe) {}
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // CONTENT_PUBLIC_COMMON_CHILD_PROCESS_HOST_DELEGATE_H_
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index 336f080..1dae5f3a 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -305,7 +305,13 @@
 
 // History navigation in response to horizontal overscroll (aka gesture-nav).
 const base::Feature kOverscrollHistoryNavigation{
-    "OverscrollHistoryNavigation", base::FEATURE_ENABLED_BY_DEFAULT};
+  "OverscrollHistoryNavigation",
+#if defined(OS_ANDROID)
+      base::FEATURE_DISABLED_BY_DEFAULT
+#else
+      base::FEATURE_ENABLED_BY_DEFAULT
+#endif
+};
 
 // Blink PageLifecycle feature. See https://crbug.com/775194
 const base::Feature kPageLifecycle{"PageLifecycle",
diff --git a/content/public/common/referrer_type_converters.cc b/content/public/common/referrer_type_converters.cc
index ddcece0b..28898d8 100644
--- a/content/public/common/referrer_type_converters.cc
+++ b/content/public/common/referrer_type_converters.cc
@@ -11,7 +11,7 @@
 TypeConverter<blink::mojom::ReferrerPtr, content::Referrer>::Convert(
     const content::Referrer& input) {
   return blink::mojom::Referrer::New(input.url, input.policy);
-};
+}
 
 // static
 content::Referrer
@@ -20,6 +20,6 @@
   if (!input)
     return content::Referrer();
   return content::Referrer(input->url, input->policy);
-};
+}
 
 }  // namespace mojo
diff --git a/content/public/renderer/worker_thread.h b/content/public/renderer/worker_thread.h
index 85a042c..ea1d837 100644
--- a/content/public/renderer/worker_thread.h
+++ b/content/public/renderer/worker_thread.h
@@ -45,7 +45,7 @@
   static void PostTask(int id, base::OnceClosure task);
 
  private:
-  WorkerThread(){};
+  WorkerThread() {}
   DISALLOW_COPY_AND_ASSIGN(WorkerThread);
 };
 
diff --git a/content/renderer/accessibility/render_accessibility_impl.h b/content/renderer/accessibility/render_accessibility_impl.h
index 503fbaf..23880f03 100644
--- a/content/renderer/accessibility/render_accessibility_impl.h
+++ b/content/renderer/accessibility/render_accessibility_impl.h
@@ -24,7 +24,7 @@
 namespace blink {
 class WebDocument;
 class WebNode;
-};
+}  // namespace blink
 
 namespace ui {
 struct AXActionData;
diff --git a/content/renderer/categorized_worker_pool.cc b/content/renderer/categorized_worker_pool.cc
index 2bb1476..3664ee2 100644
--- a/content/renderer/categorized_worker_pool.cc
+++ b/content/renderer/categorized_worker_pool.cc
@@ -126,7 +126,7 @@
     task_graph_runner_->WaitForTasksToFinishRunning(namespace_token_);
     task_graph_runner_->CollectCompletedTasks(namespace_token_,
                                               &completed_tasks_);
-  };
+  }
 
   // Lock to exclusively access all the following members that are used to
   // implement the SequencedTaskRunner interfaces.
diff --git a/content/renderer/frame_swap_message_queue.h b/content/renderer/frame_swap_message_queue.h
index 9d0e3b3a..6f692fa 100644
--- a/content/renderer/frame_swap_message_queue.h
+++ b/content/renderer/frame_swap_message_queue.h
@@ -19,7 +19,7 @@
 
 namespace IPC {
 class Message;
-};
+}
 
 namespace content {
 
diff --git a/content/renderer/input/widget_input_handler_manager.h b/content/renderer/input/widget_input_handler_manager.h
index 6ebdf02..3c2bdd4 100644
--- a/content/renderer/input/widget_input_handler_manager.h
+++ b/content/renderer/input/widget_input_handler_manager.h
@@ -18,8 +18,8 @@
 namespace blink {
 namespace scheduler {
 class WebThreadScheduler;
-};  // namespace scheduler
-};  // namespace blink
+}  // namespace scheduler
+}  // namespace blink
 
 namespace content {
 class MainThreadEventQueue;
diff --git a/content/renderer/media/webrtc/rtc_video_decoder.h b/content/renderer/media/webrtc/rtc_video_decoder.h
index f4ec52b..68474805 100644
--- a/content/renderer/media/webrtc/rtc_video_decoder.h
+++ b/content/renderer/media/webrtc/rtc_video_decoder.h
@@ -31,7 +31,7 @@
 
 namespace base {
 class WaitableEvent;
-};  // namespace base
+}  // namespace base
 
 namespace media {
 class GpuVideoAcceleratorFactories;
diff --git a/content/renderer/p2p/socket_client.h b/content/renderer/p2p/socket_client.h
index fc92d51..694d10e 100644
--- a/content/renderer/p2p/socket_client.h
+++ b/content/renderer/p2p/socket_client.h
@@ -14,7 +14,7 @@
 
 namespace rtc {
 struct PacketOptions;
-};
+}
 
 namespace content {
 
diff --git a/content/renderer/pepper/ppb_image_data_impl.h b/content/renderer/pepper/ppb_image_data_impl.h
index 682f9a4..757ec176 100644
--- a/content/renderer/pepper/ppb_image_data_impl.h
+++ b/content/renderer/pepper/ppb_image_data_impl.h
@@ -38,7 +38,7 @@
   // it cheap & easy to implement Swap.
   class Backend {
    public:
-    virtual ~Backend() {};
+    virtual ~Backend() {}
     virtual bool Init(PPB_ImageData_Impl* impl,
                       PP_ImageDataFormat format,
                       int width,
diff --git a/content/renderer/service_worker/service_worker_timeout_timer.cc b/content/renderer/service_worker/service_worker_timeout_timer.cc
index 925d3b9..fae365ce 100644
--- a/content/renderer/service_worker/service_worker_timeout_timer.cc
+++ b/content/renderer/service_worker/service_worker_timeout_timer.cc
@@ -74,7 +74,7 @@
   // Abort all callbacks.
   for (auto& event : inflight_events_)
     std::move(event.abort_callback).Run();
-};
+}
 
 int ServiceWorkerTimeoutTimer::StartEvent(
     base::OnceCallback<void(int /* event_id */)> abort_callback) {
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index 329b06e..6aa0176 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -311,7 +311,7 @@
     "//services/service_manager/embedder:embedder_result_codes",
     "//services/service_manager/public/cpp",
     "//services/test/echo:lib",
-    "//services/test/echo:manifest",
+    "//services/test/echo/public/cpp:manifest",
     "//services/test/echo/public/mojom",
     "//skia",
     "//storage/browser",
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 2df24c1..d9eb022 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -58,7 +58,7 @@
 #include "services/network/public/mojom/network_service.mojom.h"
 #include "services/service_manager/public/cpp/manifest.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/test/echo/manifest.h"
+#include "services/test/echo/public/cpp/manifest.h"
 #include "services/test/echo/public/mojom/echo.mojom.h"
 #include "storage/browser/quota/quota_settings.h"
 #include "ui/base/ui_base_features.h"
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 3e8c0abe..8b6db3d0 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -14,7 +14,6 @@
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//net/features.gni")
 import("//ppapi/buildflags/buildflags.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 import("//third_party/blink/public/public_features.gni")
 import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
index e5d308cfe..35276a8 100644
--- a/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl2_conformance_expectations.py
@@ -88,9 +88,6 @@
         bug=660844) # WebGL 2.0.1
     self.Fail('conformance/rendering/rendering-sampling-feedback-loop.html',
         bug=660844) # WebGL 2.0.1
-    self.Fail('conformance2/textures/misc/' +
-        'integer-cubemap-specification-order-bug.html',
-        bug=905003) # owner:cwallez, test might be buggy
 
     # Nvidia bugs fixed in latest driver
     # TODO(http://crbug.com/887241): Upgrade the drivers on the bots.
@@ -193,6 +190,9 @@
         ['win', 'nvidia', 'opengl', 'passthrough'], bug=887578)
     self.Flaky('deqp/functional/gles3/transformfeedback/*',
         ['win', ('nvidia', 0x1cb3), 'opengl'], bug=822733)
+    self.Flaky('conformance2/textures/misc/' +
+        'integer-cubemap-specification-order-bug.html',
+        ['win', 'nvidia', 'opengl', 'passthrough'], bug=905003)
 
     # Win / AMD
 
@@ -468,6 +468,10 @@
         'teximage2d_pbo_cube_00.html',
         ['highsierra', 'mojave', ('nvidia', 0xfe9)], bug=774827)
 
+    self.Fail('conformance2/textures/misc/' +
+        'integer-cubemap-specification-order-bug.html',
+        ['sierra', ('intel', 0x0a2e)], bug=905003)
+
     # Fails on multiple GPU types.
     self.Fail('conformance/glsl/misc/fragcolor-fragdata-invariant.html',
         ['mac'], bug=844311)
@@ -697,6 +701,7 @@
     # failing rather than flaky.
     self.Fail('conformance2/textures/misc/tex-base-level-bug.html',
         ['highsierra', 'amd'], bug=870856)
+
     self.Fail('deqp/functional/gles3/transformfeedback/' +
         'array_interleaved_lines.html',
         ['sierra', 'amd'], bug=483282)
@@ -890,6 +895,9 @@
         ['linux', 'nvidia'], bug=618447)
     self.Fail('conformance2/glsl3/vector-dynamic-indexing-swizzled-lvalue.html',
         ['linux', 'nvidia'], bug=709351)
+    self.Fail('conformance2/textures/misc/' +
+        'integer-cubemap-specification-order-bug.html',
+        ['linux', 'nvidia'], bug=905003)
     self.Fail('conformance2/rendering/framebuffer-texture-level1.html',
         ['linux', 'nvidia', 'opengl'], bug=680278)
     self.Fail('conformance2/textures/image/' +
diff --git a/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc b/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc
index ffb41b6b..4a25ef9 100644
--- a/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc
+++ b/device/bluetooth/bluez/bluetooth_local_gatt_service_bluez.cc
@@ -86,7 +86,7 @@
     const std::string& identifier) {
   const auto& service = characteristics_.find(dbus::ObjectPath(identifier));
   return service == characteristics_.end() ? nullptr : service->second.get();
-};
+}
 
 const std::map<dbus::ObjectPath,
                std::unique_ptr<BluetoothLocalGattCharacteristicBlueZ>>&
diff --git a/device/fido/fido_request_handler_base.h b/device/fido/fido_request_handler_base.h
index c4cf37b..325b07e 100644
--- a/device/fido/fido_request_handler_base.h
+++ b/device/fido/fido_request_handler_base.h
@@ -26,7 +26,7 @@
 
 namespace service_manager {
 class Connector;
-};  // namespace service_manager
+}  // namespace service_manager
 
 namespace device {
 
diff --git a/device/fido/get_assertion_request_handler.h b/device/fido/get_assertion_request_handler.h
index 0f59403..e561de8 100644
--- a/device/fido/get_assertion_request_handler.h
+++ b/device/fido/get_assertion_request_handler.h
@@ -18,7 +18,7 @@
 
 namespace service_manager {
 class Connector;
-};  // namespace service_manager
+}  // namespace service_manager
 
 namespace device {
 
diff --git a/device/fido/make_credential_request_handler.h b/device/fido/make_credential_request_handler.h
index 90a3102..20a3ae17 100644
--- a/device/fido/make_credential_request_handler.h
+++ b/device/fido/make_credential_request_handler.h
@@ -20,7 +20,7 @@
 
 namespace service_manager {
 class Connector;
-};  // namespace service_manager
+}  // namespace service_manager
 
 namespace device {
 
diff --git a/device/gamepad/gamepad_data_fetcher.h b/device/gamepad/gamepad_data_fetcher.h
index 4ff1d45..500e9cdd 100644
--- a/device/gamepad/gamepad_data_fetcher.h
+++ b/device/gamepad/gamepad_data_fetcher.h
@@ -74,7 +74,7 @@
   // This call will happen on the gamepad polling thread. Any initialization
   // that needs to happen on that thread should be done here, not in the
   // constructor.
-  virtual void OnAddedToProvider(){};
+  virtual void OnAddedToProvider() {}
 
  private:
   GamepadPadStateProvider* provider_;
diff --git a/device/usb/mojo/type_converters.h b/device/usb/mojo/type_converters.h
index 6b04afc..219691f2 100644
--- a/device/usb/mojo/type_converters.h
+++ b/device/usb/mojo/type_converters.h
@@ -78,7 +78,7 @@
     for (const B& item : input)
       result.push_back(mojo::ConvertTo<A>(item));
     return result;
-  };
+  }
 };
 
 }  // namespace mojo
diff --git a/device/vr/orientation/orientation_device_provider.cc b/device/vr/orientation/orientation_device_provider.cc
index 4d35923..9efd5c6 100644
--- a/device/vr/orientation/orientation_device_provider.cc
+++ b/device/vr/orientation/orientation_device_provider.cc
@@ -45,7 +45,7 @@
 
 bool VROrientationDeviceProvider::Initialized() {
   return initialized_;
-};
+}
 
 void VROrientationDeviceProvider::DeviceInitialized() {
   // This should only be called after the device is initialized.
diff --git a/device/vr/vr_display_impl.h b/device/vr/vr_display_impl.h
index 72c7a774..17ec8dd 100644
--- a/device/vr/vr_display_impl.h
+++ b/device/vr/vr_display_impl.h
@@ -38,10 +38,10 @@
   void GetEnvironmentIntegrationProvider(
       mojom::XREnvironmentIntegrationProviderAssociatedRequest
           environment_provider) override;
-  gfx::Size sessionFrameSize() { return session_frame_size_; };
-  display::Display::Rotation sessionRotation() { return session_rotation_; };
+  gfx::Size sessionFrameSize() { return session_frame_size_; }
+  display::Display::Rotation sessionRotation() { return session_rotation_; }
 
-  device::VRDeviceBase* device() { return device_; };
+  device::VRDeviceBase* device() { return device_; }
 
   // Accessible to tests.
  protected:
diff --git a/extensions/browser/api/audio/audio_api.h b/extensions/browser/api/audio/audio_api.h
index a1a44168..fe07004 100644
--- a/extensions/browser/api/audio/audio_api.h
+++ b/extensions/browser/api/audio/audio_api.h
@@ -58,7 +58,7 @@
 
 class AudioGetInfoFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("audio.getInfo", AUDIO_GETINFO);
+  DECLARE_EXTENSION_FUNCTION("audio.getInfo", AUDIO_GETINFO)
 
  protected:
   ~AudioGetInfoFunction() override {}
@@ -67,7 +67,7 @@
 
 class AudioGetDevicesFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("audio.getDevices", AUDIO_GETDEVICES);
+  DECLARE_EXTENSION_FUNCTION("audio.getDevices", AUDIO_GETDEVICES)
 
  protected:
   ~AudioGetDevicesFunction() override {}
@@ -76,7 +76,7 @@
 
 class AudioSetActiveDevicesFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("audio.setActiveDevices", AUDIO_SETACTIVEDEVICES);
+  DECLARE_EXTENSION_FUNCTION("audio.setActiveDevices", AUDIO_SETACTIVEDEVICES)
 
  protected:
   ~AudioSetActiveDevicesFunction() override {}
@@ -85,7 +85,7 @@
 
 class AudioSetPropertiesFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("audio.setProperties", AUDIO_SETPROPERTIES);
+  DECLARE_EXTENSION_FUNCTION("audio.setProperties", AUDIO_SETPROPERTIES)
 
  protected:
   ~AudioSetPropertiesFunction() override {}
@@ -94,7 +94,7 @@
 
 class AudioSetMuteFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("audio.setMute", AUDIO_SETMUTE);
+  DECLARE_EXTENSION_FUNCTION("audio.setMute", AUDIO_SETMUTE)
 
  protected:
   ~AudioSetMuteFunction() override {}
@@ -103,7 +103,7 @@
 
 class AudioGetMuteFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("audio.getMute", AUDIO_GETMUTE);
+  DECLARE_EXTENSION_FUNCTION("audio.getMute", AUDIO_GETMUTE)
 
  protected:
   ~AudioGetMuteFunction() override {}
diff --git a/extensions/browser/api/bluetooth/bluetooth_private_api.h b/extensions/browser/api/bluetooth/bluetooth_private_api.h
index 8d0d3d7..47102e5 100644
--- a/extensions/browser/api/bluetooth/bluetooth_private_api.h
+++ b/extensions/browser/api/bluetooth/bluetooth_private_api.h
@@ -129,7 +129,7 @@
     : public BluetoothExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothPrivate.disconnectAll",
-                             BLUETOOTHPRIVATE_DISCONNECTALL);
+                             BLUETOOTHPRIVATE_DISCONNECTALL)
   BluetoothPrivateDisconnectAllFunction();
 
   // BluetoothExtensionFunction overrides:
@@ -151,7 +151,7 @@
 class BluetoothPrivateForgetDeviceFunction : public BluetoothExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothPrivate.forgetDevice",
-                             BLUETOOTHPRIVATE_FORGETDEVICE);
+                             BLUETOOTHPRIVATE_FORGETDEVICE)
   BluetoothPrivateForgetDeviceFunction();
 
   // BluetoothExtensionFunction overrides:
diff --git a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
index 638f6a94..346fd0cf 100644
--- a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
+++ b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h
@@ -144,7 +144,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.connect",
-                             BLUETOOTHLOWENERGY_CONNECT);
+                             BLUETOOTHLOWENERGY_CONNECT)
 
   BluetoothLowEnergyConnectFunction();
 
@@ -168,7 +168,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.disconnect",
-                             BLUETOOTHLOWENERGY_DISCONNECT);
+                             BLUETOOTHLOWENERGY_DISCONNECT)
 
   BluetoothLowEnergyDisconnectFunction();
 
@@ -192,7 +192,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getService",
-                             BLUETOOTHLOWENERGY_GETSERVICE);
+                             BLUETOOTHLOWENERGY_GETSERVICE)
 
   BluetoothLowEnergyGetServiceFunction();
 
@@ -210,7 +210,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getServices",
-                             BLUETOOTHLOWENERGY_GETSERVICES);
+                             BLUETOOTHLOWENERGY_GETSERVICES)
 
   BluetoothLowEnergyGetServicesFunction();
 
@@ -228,7 +228,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristic",
-                             BLUETOOTHLOWENERGY_GETCHARACTERISTIC);
+                             BLUETOOTHLOWENERGY_GETCHARACTERISTIC)
 
   BluetoothLowEnergyGetCharacteristicFunction();
 
@@ -246,7 +246,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristics",
-                             BLUETOOTHLOWENERGY_GETCHARACTERISTICS);
+                             BLUETOOTHLOWENERGY_GETCHARACTERISTICS)
 
   BluetoothLowEnergyGetCharacteristicsFunction();
 
@@ -264,7 +264,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getIncludedServices",
-                             BLUETOOTHLOWENERGY_GETINCLUDEDSERVICES);
+                             BLUETOOTHLOWENERGY_GETINCLUDEDSERVICES)
 
   BluetoothLowEnergyGetIncludedServicesFunction();
 
@@ -282,7 +282,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptor",
-                             BLUETOOTHLOWENERGY_GETDESCRIPTOR);
+                             BLUETOOTHLOWENERGY_GETDESCRIPTOR)
 
   BluetoothLowEnergyGetDescriptorFunction();
 
@@ -300,7 +300,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptors",
-                             BLUETOOTHLOWENERGY_GETDESCRIPTORS);
+                             BLUETOOTHLOWENERGY_GETDESCRIPTORS)
 
   BluetoothLowEnergyGetDescriptorsFunction();
 
@@ -318,7 +318,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readCharacteristicValue",
-                             BLUETOOTHLOWENERGY_READCHARACTERISTICVALUE);
+                             BLUETOOTHLOWENERGY_READCHARACTERISTICVALUE)
 
   BluetoothLowEnergyReadCharacteristicValueFunction();
 
@@ -346,7 +346,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeCharacteristicValue",
-                             BLUETOOTHLOWENERGY_WRITECHARACTERISTICVALUE);
+                             BLUETOOTHLOWENERGY_WRITECHARACTERISTICVALUE)
 
   BluetoothLowEnergyWriteCharacteristicValueFunction();
 
@@ -375,7 +375,7 @@
  public:
   DECLARE_EXTENSION_FUNCTION(
       "bluetoothLowEnergy.startCharacteristicNotifications",
-      BLUETOOTHLOWENERGY_STARTCHARACTERISTICNOTIFICATIONS);
+      BLUETOOTHLOWENERGY_STARTCHARACTERISTICNOTIFICATIONS)
 
   BluetoothLowEnergyStartCharacteristicNotificationsFunction();
 
@@ -402,7 +402,7 @@
  public:
   DECLARE_EXTENSION_FUNCTION(
       "bluetoothLowEnergy.stopCharacteristicNotifications",
-      BLUETOOTHLOWENERGY_STOPCHARACTERISTICNOTIFICATIONS);
+      BLUETOOTHLOWENERGY_STOPCHARACTERISTICNOTIFICATIONS)
 
   BluetoothLowEnergyStopCharacteristicNotificationsFunction();
 
@@ -427,7 +427,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readDescriptorValue",
-                             BLUETOOTHLOWENERGY_READDESCRIPTORVALUE);
+                             BLUETOOTHLOWENERGY_READDESCRIPTORVALUE)
 
   BluetoothLowEnergyReadDescriptorValueFunction();
 
@@ -454,7 +454,7 @@
     : public BluetoothLowEnergyExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeDescriptorValue",
-                             BLUETOOTHLOWENERGY_WRITEDESCRIPTORVALUE);
+                             BLUETOOTHLOWENERGY_WRITEDESCRIPTORVALUE)
 
   BluetoothLowEnergyWriteDescriptorValueFunction();
 
@@ -506,7 +506,7 @@
     : public BluetoothLowEnergyAdvertisementFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerAdvertisement",
-                             BLUETOOTHLOWENERGY_REGISTERADVERTISEMENT);
+                             BLUETOOTHLOWENERGY_REGISTERADVERTISEMENT)
 
   BluetoothLowEnergyRegisterAdvertisementFunction();
 
@@ -528,7 +528,7 @@
     : public BluetoothLowEnergyAdvertisementFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterAdvertisement",
-                             BLUETOOTHLOWENERGY_UNREGISTERADVERTISEMENT);
+                             BLUETOOTHLOWENERGY_UNREGISTERADVERTISEMENT)
 
   BluetoothLowEnergyUnregisterAdvertisementFunction();
 
@@ -552,7 +552,7 @@
     : public BluetoothLowEnergyAdvertisementFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.resetAdvertising",
-                             BLUETOOTHLOWENERGY_RESETADVERTISING);
+                             BLUETOOTHLOWENERGY_RESETADVERTISING)
 
   BluetoothLowEnergyResetAdvertisingFunction();
 
@@ -572,7 +572,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.setAdvertisingInterval",
-                             BLUETOOTHLOWENERGY_SETADVERTISINGINTERVAL);
+                             BLUETOOTHLOWENERGY_SETADVERTISINGINTERVAL)
 
   BluetoothLowEnergySetAdvertisingIntervalFunction();
 
@@ -594,7 +594,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createService",
-                             BLUETOOTHLOWENERGY_CREATESERVICE);
+                             BLUETOOTHLOWENERGY_CREATESERVICE)
 
   BluetoothLowEnergyCreateServiceFunction();
 
@@ -615,7 +615,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createCharacteristic",
-                             BLUETOOTHLOWENERGY_CREATECHARACTERISTIC);
+                             BLUETOOTHLOWENERGY_CREATECHARACTERISTIC)
 
   BluetoothLowEnergyCreateCharacteristicFunction();
 
@@ -634,7 +634,7 @@
  public:
   DECLARE_EXTENSION_FUNCTION(
       "bluetoothLowEnergy.notifyCharacteristicValueChanged",
-      BLUETOOTHLOWENERGY_NOTIFYCHARACTERISTICVALUECHANGED);
+      BLUETOOTHLOWENERGY_NOTIFYCHARACTERISTICVALUECHANGED)
 
   BluetoothLowEnergyNotifyCharacteristicValueChangedFunction();
 
@@ -654,7 +654,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createDescriptor",
-                             BLUETOOTHLOWENERGY_CREATEDESCRIPTOR);
+                             BLUETOOTHLOWENERGY_CREATEDESCRIPTOR)
 
   BluetoothLowEnergyCreateDescriptorFunction();
 
@@ -672,7 +672,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerService",
-                             BLUETOOTHLOWENERGY_REGISTERSERVICE);
+                             BLUETOOTHLOWENERGY_REGISTERSERVICE)
 
   BluetoothLowEnergyRegisterServiceFunction();
 
@@ -694,7 +694,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterService",
-                             BLUETOOTHLOWENERGY_UNREGISTERSERVICE);
+                             BLUETOOTHLOWENERGY_UNREGISTERSERVICE)
 
   BluetoothLowEnergyUnregisterServiceFunction();
 
@@ -718,7 +718,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.removeService",
-                             BLUETOOTHLOWENERGY_REMOVESERVICE);
+                             BLUETOOTHLOWENERGY_REMOVESERVICE)
 
   BluetoothLowEnergyRemoveServiceFunction();
 
@@ -736,7 +736,7 @@
     : public BLEPeripheralExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.sendRequestResponse",
-                             BLUETOOTHLOWENERGY_SENDREQUESTRESPONSE);
+                             BLUETOOTHLOWENERGY_SENDREQUESTRESPONSE)
 
   BluetoothLowEnergySendRequestResponseFunction();
 
diff --git a/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.h b/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.h
index f59d7a3..5d9a4af 100644
--- a/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.h
+++ b/extensions/browser/api/bluetooth_socket/bluetooth_socket_api.h
@@ -62,7 +62,7 @@
 
 class BluetoothSocketCreateFunction : public BluetoothSocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.create", BLUETOOTHSOCKET_CREATE);
+  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.create", BLUETOOTHSOCKET_CREATE)
 
   BluetoothSocketCreateFunction();
 
@@ -77,7 +77,7 @@
 
 class BluetoothSocketUpdateFunction : public BluetoothSocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.update", BLUETOOTHSOCKET_UPDATE);
+  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.update", BLUETOOTHSOCKET_UPDATE)
 
   BluetoothSocketUpdateFunction();
 
@@ -95,7 +95,7 @@
     : public BluetoothSocketAsyncApiFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothSocket.setPaused",
-                             BLUETOOTHSOCKET_SETPAUSED);
+                             BLUETOOTHSOCKET_SETPAUSED)
 
   BluetoothSocketSetPausedFunction();
 
@@ -144,7 +144,7 @@
     : public BluetoothSocketListenFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothSocket.listenUsingRfcomm",
-                             BLUETOOTHSOCKET_LISTENUSINGRFCOMM);
+                             BLUETOOTHSOCKET_LISTENUSINGRFCOMM)
 
   BluetoothSocketListenUsingRfcommFunction();
 
@@ -173,7 +173,7 @@
     : public BluetoothSocketListenFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothSocket.listenUsingL2cap",
-                             BLUETOOTHSOCKET_LISTENUSINGL2CAP);
+                             BLUETOOTHSOCKET_LISTENUSINGL2CAP)
 
   BluetoothSocketListenUsingL2capFunction();
 
@@ -228,8 +228,7 @@
 class BluetoothSocketConnectFunction :
     public BluetoothSocketAbstractConnectFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.connect",
-                             BLUETOOTHSOCKET_CONNECT);
+  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.connect", BLUETOOTHSOCKET_CONNECT)
 
   BluetoothSocketConnectFunction();
 
@@ -245,7 +244,7 @@
     : public BluetoothSocketAsyncApiFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothSocket.disconnect",
-                             BLUETOOTHSOCKET_DISCONNECT);
+                             BLUETOOTHSOCKET_DISCONNECT)
 
   BluetoothSocketDisconnectFunction();
 
@@ -263,7 +262,7 @@
 
 class BluetoothSocketCloseFunction : public BluetoothSocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.close", BLUETOOTHSOCKET_CLOSE);
+  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.close", BLUETOOTHSOCKET_CLOSE)
 
   BluetoothSocketCloseFunction();
 
@@ -279,7 +278,7 @@
 
 class BluetoothSocketSendFunction : public BluetoothSocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.send", BLUETOOTHSOCKET_SEND);
+  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.send", BLUETOOTHSOCKET_SEND)
 
   BluetoothSocketSendFunction();
 
@@ -303,8 +302,7 @@
 
 class BluetoothSocketGetInfoFunction : public BluetoothSocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.getInfo",
-                             BLUETOOTHSOCKET_GETINFO);
+  DECLARE_EXTENSION_FUNCTION("bluetoothSocket.getInfo", BLUETOOTHSOCKET_GETINFO)
 
   BluetoothSocketGetInfoFunction();
 
@@ -322,7 +320,7 @@
     : public BluetoothSocketAsyncApiFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("bluetoothSocket.getSockets",
-                             BLUETOOTHSOCKET_GETSOCKETS);
+                             BLUETOOTHSOCKET_GETSOCKETS)
 
   BluetoothSocketGetSocketsFunction();
 
diff --git a/extensions/browser/api/clipboard/clipboard_api.h b/extensions/browser/api/clipboard/clipboard_api.h
index b36340ed..ecd6a69 100644
--- a/extensions/browser/api/clipboard/clipboard_api.h
+++ b/extensions/browser/api/clipboard/clipboard_api.h
@@ -39,7 +39,7 @@
 
 class ClipboardSetImageDataFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("clipboard.setImageData", CLIPBOARD_SETIMAGEDATA);
+  DECLARE_EXTENSION_FUNCTION("clipboard.setImageData", CLIPBOARD_SETIMAGEDATA)
 
  protected:
   ~ClipboardSetImageDataFunction() override;
diff --git a/extensions/browser/api/declarative_net_request/declarative_net_request_api.h b/extensions/browser/api/declarative_net_request/declarative_net_request_api.h
index 1e68ba6c..67f28531 100644
--- a/extensions/browser/api/declarative_net_request/declarative_net_request_api.h
+++ b/extensions/browser/api/declarative_net_request/declarative_net_request_api.h
@@ -45,7 +45,7 @@
  public:
   DeclarativeNetRequestAddAllowedPagesFunction();
   DECLARE_EXTENSION_FUNCTION("declarativeNetRequest.addAllowedPages",
-                             DECLARATIVENETREQUEST_ADDALLOWEDPAGES);
+                             DECLARATIVENETREQUEST_ADDALLOWEDPAGES)
 
  protected:
   ~DeclarativeNetRequestAddAllowedPagesFunction() override;
@@ -64,7 +64,7 @@
  public:
   DeclarativeNetRequestRemoveAllowedPagesFunction();
   DECLARE_EXTENSION_FUNCTION("declarativeNetRequest.removeAllowedPages",
-                             DECLARATIVENETREQUEST_REMOVEALLOWEDPAGES);
+                             DECLARATIVENETREQUEST_REMOVEALLOWEDPAGES)
 
  protected:
   ~DeclarativeNetRequestRemoveAllowedPagesFunction() override;
@@ -83,7 +83,7 @@
  public:
   DeclarativeNetRequestGetAllowedPagesFunction();
   DECLARE_EXTENSION_FUNCTION("declarativeNetRequest.getAllowedPages",
-                             DECLARATIVENETREQUEST_GETALLOWEDPAGES);
+                             DECLARATIVENETREQUEST_GETALLOWEDPAGES)
 
  protected:
   ~DeclarativeNetRequestGetAllowedPagesFunction() override;
diff --git a/extensions/browser/api/diagnostics/diagnostics_api.h b/extensions/browser/api/diagnostics/diagnostics_api.h
index 356c686..3aeecc5 100644
--- a/extensions/browser/api/diagnostics/diagnostics_api.h
+++ b/extensions/browser/api/diagnostics/diagnostics_api.h
@@ -28,7 +28,7 @@
     SEND_PACKET_FAILED,
   };
 
-  DECLARE_EXTENSION_FUNCTION("diagnostics.sendPacket", DIAGNOSTICS_SENDPACKET);
+  DECLARE_EXTENSION_FUNCTION("diagnostics.sendPacket", DIAGNOSTICS_SENDPACKET)
 
   DiagnosticsSendPacketFunction();
 
diff --git a/extensions/browser/api/display_source/display_source_api.h b/extensions/browser/api/display_source/display_source_api.h
index f1e3ad4..d36e630 100644
--- a/extensions/browser/api/display_source/display_source_api.h
+++ b/extensions/browser/api/display_source/display_source_api.h
@@ -15,7 +15,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("displaySource.getAvailableSinks",
-                             DISPLAYSOURCE_GETAVAILABLESINKS);
+                             DISPLAYSOURCE_GETAVAILABLESINKS)
   DisplaySourceGetAvailableSinksFunction() = default;
 
  protected:
@@ -33,7 +33,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("displaySource.requestAuthentication",
-                             DISPLAYSOURCE_REQUESTAUTHENTICATION);
+                             DISPLAYSOURCE_REQUESTAUTHENTICATION)
   DisplaySourceRequestAuthenticationFunction() = default;
 
  protected:
diff --git a/extensions/browser/api/feedback_private/feedback_private_api.h b/extensions/browser/api/feedback_private/feedback_private_api.h
index f07fb2a..9234c00 100644
--- a/extensions/browser/api/feedback_private/feedback_private_api.h
+++ b/extensions/browser/api/feedback_private/feedback_private_api.h
@@ -90,7 +90,7 @@
 class FeedbackPrivateGetUserEmailFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("feedbackPrivate.getUserEmail",
-                             FEEDBACKPRIVATE_GETUSEREMAIL);
+                             FEEDBACKPRIVATE_GETUSEREMAIL)
 
  protected:
   ~FeedbackPrivateGetUserEmailFunction() override {}
@@ -101,7 +101,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("feedbackPrivate.getSystemInformation",
-                             FEEDBACKPRIVATE_GETSYSTEMINFORMATION);
+                             FEEDBACKPRIVATE_GETSYSTEMINFORMATION)
 
  protected:
   ~FeedbackPrivateGetSystemInformationFunction() override {}
@@ -116,7 +116,7 @@
 class FeedbackPrivateReadLogSourceFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("feedbackPrivate.readLogSource",
-                             FEEDBACKPRIVATE_READLOGSOURCE);
+                             FEEDBACKPRIVATE_READLOGSOURCE)
 
  protected:
   ~FeedbackPrivateReadLogSourceFunction() override {}
@@ -132,7 +132,7 @@
 class FeedbackPrivateSendFeedbackFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("feedbackPrivate.sendFeedback",
-                             FEEDBACKPRIVATE_SENDFEEDBACK);
+                             FEEDBACKPRIVATE_SENDFEEDBACK)
 
  protected:
   ~FeedbackPrivateSendFeedbackFunction() override {}
@@ -150,7 +150,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("feedbackPrivate.logSrtPromptResult",
-                             FEEDBACKPRIVATE_LOGSRTPROMPTRESULT);
+                             FEEDBACKPRIVATE_LOGSRTPROMPTRESULT)
 
  protected:
   ~FeedbackPrivateLogSrtPromptResultFunction() override {}
diff --git a/extensions/browser/api/file_system/file_system_api.h b/extensions/browser/api/file_system/file_system_api.h
index b3f3aeb..db62bab 100644
--- a/extensions/browser/api/file_system/file_system_api.h
+++ b/extensions/browser/api/file_system/file_system_api.h
@@ -221,7 +221,7 @@
 class FileSystemRequestFileSystemFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileSystem.requestFileSystem",
-                             FILESYSTEM_REQUESTFILESYSTEM);
+                             FILESYSTEM_REQUESTFILESYSTEM)
 
  protected:
   ~FileSystemRequestFileSystemFunction() override {}
@@ -234,7 +234,7 @@
 class FileSystemGetVolumeListFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileSystem.getVolumeList",
-                             FILESYSTEM_GETVOLUMELIST);
+                             FILESYSTEM_GETVOLUMELIST)
 
  protected:
   ~FileSystemGetVolumeListFunction() override {}
@@ -268,7 +268,7 @@
 class FileSystemGetVolumeListFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("fileSystem.getVolumeList",
-                             FILESYSTEM_GETVOLUMELIST);
+                             FILESYSTEM_GETVOLUMELIST)
   FileSystemGetVolumeListFunction();
 
  protected:
diff --git a/extensions/browser/api/guest_view/app_view/app_view_guest_internal_api.h b/extensions/browser/api/guest_view/app_view/app_view_guest_internal_api.h
index ab210465..04a5117 100644
--- a/extensions/browser/api/guest_view/app_view/app_view_guest_internal_api.h
+++ b/extensions/browser/api/guest_view/app_view/app_view_guest_internal_api.h
@@ -14,7 +14,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("appViewGuestInternal.attachFrame",
-                             APPVIEWINTERNAL_ATTACHFRAME);
+                             APPVIEWINTERNAL_ATTACHFRAME)
   AppViewGuestInternalAttachFrameFunction();
 
  protected:
@@ -29,7 +29,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("appViewGuestInternal.denyRequest",
-                             APPVIEWINTERNAL_DENYREQUEST);
+                             APPVIEWINTERNAL_DENYREQUEST)
   AppViewGuestInternalDenyRequestFunction();
 
  protected:
diff --git a/extensions/browser/api/guest_view/extension_view/extension_view_internal_api.h b/extensions/browser/api/guest_view/extension_view/extension_view_internal_api.h
index 83751472..86b3b932 100644
--- a/extensions/browser/api/guest_view/extension_view/extension_view_internal_api.h
+++ b/extensions/browser/api/guest_view/extension_view/extension_view_internal_api.h
@@ -33,7 +33,7 @@
     : public ExtensionViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("extensionViewInternal.loadSrc",
-                             EXTENSIONVIEWINTERNAL_LOADSRC);
+                             EXTENSIONVIEWINTERNAL_LOADSRC)
   ExtensionViewInternalLoadSrcFunction() {}
 
  protected:
@@ -50,7 +50,7 @@
 class ExtensionViewInternalParseSrcFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("extensionViewInternal.parseSrc",
-                             EXTENSIONVIEWINTERNAL_PARSESRC);
+                             EXTENSIONVIEWINTERNAL_PARSESRC)
   ExtensionViewInternalParseSrcFunction() {}
 
  protected:
diff --git a/extensions/browser/api/guest_view/guest_view_internal_api.h b/extensions/browser/api/guest_view/guest_view_internal_api.h
index 55f2161fc..6d5b0e5 100644
--- a/extensions/browser/api/guest_view/guest_view_internal_api.h
+++ b/extensions/browser/api/guest_view/guest_view_internal_api.h
@@ -13,7 +13,7 @@
 class GuestViewInternalCreateGuestFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("guestViewInternal.createGuest",
-                             GUESTVIEWINTERNAL_CREATEGUEST);
+                             GUESTVIEWINTERNAL_CREATEGUEST)
   GuestViewInternalCreateGuestFunction();
 
  protected:
@@ -30,7 +30,7 @@
 class GuestViewInternalDestroyGuestFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("guestViewInternal.destroyGuest",
-                             GUESTVIEWINTERNAL_DESTROYGUEST);
+                             GUESTVIEWINTERNAL_DESTROYGUEST)
   GuestViewInternalDestroyGuestFunction();
 
  protected:
@@ -47,7 +47,7 @@
 class GuestViewInternalSetSizeFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("guestViewInternal.setSize",
-                             GUESTVIEWINTERNAL_SETAUTOSIZE);
+                             GUESTVIEWINTERNAL_SETAUTOSIZE)
 
   GuestViewInternalSetSizeFunction();
 
diff --git a/extensions/browser/api/guest_view/web_view/web_view_internal_api.h b/extensions/browser/api/guest_view/web_view/web_view_internal_api.h
index 2ba7186..f5cba26e 100644
--- a/extensions/browser/api/guest_view/web_view/web_view_internal_api.h
+++ b/extensions/browser/api/guest_view/web_view/web_view_internal_api.h
@@ -36,7 +36,7 @@
       public WebContentsCaptureClient {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.captureVisibleRegion",
-                             WEBVIEWINTERNAL_CAPTUREVISIBLEREGION);
+                             WEBVIEWINTERNAL_CAPTUREVISIBLEREGION)
   WebViewInternalCaptureVisibleRegionFunction();
 
  protected:
@@ -63,7 +63,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.navigate",
-                             WEBVIEWINTERNAL_NAVIGATE);
+                             WEBVIEWINTERNAL_NAVIGATE)
   WebViewInternalNavigateFunction() {}
 
  protected:
@@ -147,7 +147,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.addContentScripts",
-                             WEBVIEWINTERNAL_ADDCONTENTSCRIPTS);
+                             WEBVIEWINTERNAL_ADDCONTENTSCRIPTS)
 
   WebViewInternalAddContentScriptsFunction();
 
@@ -164,7 +164,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.removeContentScripts",
-                             WEBVIEWINTERNAL_REMOVECONTENTSCRIPTS);
+                             WEBVIEWINTERNAL_REMOVECONTENTSCRIPTS)
 
   WebViewInternalRemoveContentScriptsFunction();
 
@@ -180,8 +180,7 @@
 
 class WebViewInternalSetNameFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.setName",
-                             WEBVIEWINTERNAL_SETNAME);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.setName", WEBVIEWINTERNAL_SETNAME)
 
   WebViewInternalSetNameFunction();
 
@@ -198,7 +197,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.setAllowTransparency",
-                             WEBVIEWINTERNAL_SETALLOWTRANSPARENCY);
+                             WEBVIEWINTERNAL_SETALLOWTRANSPARENCY)
 
   WebViewInternalSetAllowTransparencyFunction();
 
@@ -215,7 +214,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.setAllowScaling",
-                             WEBVIEWINTERNAL_SETALLOWSCALING);
+                             WEBVIEWINTERNAL_SETALLOWSCALING)
 
   WebViewInternalSetAllowScalingFunction();
 
@@ -230,8 +229,7 @@
 
 class WebViewInternalSetZoomFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.setZoom",
-                             WEBVIEWINTERNAL_SETZOOM);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.setZoom", WEBVIEWINTERNAL_SETZOOM)
 
   WebViewInternalSetZoomFunction();
 
@@ -246,8 +244,7 @@
 
 class WebViewInternalGetZoomFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.getZoom",
-                             WEBVIEWINTERNAL_GETZOOM);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.getZoom", WEBVIEWINTERNAL_GETZOOM)
 
   WebViewInternalGetZoomFunction();
 
@@ -264,7 +261,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.setZoomMode",
-                             WEBVIEWINTERNAL_SETZOOMMODE);
+                             WEBVIEWINTERNAL_SETZOOMMODE)
 
   WebViewInternalSetZoomModeFunction();
 
@@ -281,7 +278,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.getZoomMode",
-                             WEBVIEWINTERNAL_GETZOOMMODE);
+                             WEBVIEWINTERNAL_GETZOOMMODE)
 
   WebViewInternalGetZoomModeFunction();
 
@@ -296,7 +293,7 @@
 
 class WebViewInternalFindFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.find", WEBVIEWINTERNAL_FIND);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.find", WEBVIEWINTERNAL_FIND)
 
   WebViewInternalFindFunction();
 
@@ -317,7 +314,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.stopFinding",
-                             WEBVIEWINTERNAL_STOPFINDING);
+                             WEBVIEWINTERNAL_STOPFINDING)
 
   WebViewInternalStopFindingFunction();
 
@@ -334,7 +331,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.loadDataWithBaseUrl",
-                             WEBVIEWINTERNAL_LOADDATAWITHBASEURL);
+                             WEBVIEWINTERNAL_LOADDATAWITHBASEURL)
 
   WebViewInternalLoadDataWithBaseUrlFunction();
 
@@ -349,7 +346,7 @@
 
 class WebViewInternalGoFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.go", WEBVIEWINTERNAL_GO);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.go", WEBVIEWINTERNAL_GO)
 
   WebViewInternalGoFunction();
 
@@ -364,7 +361,7 @@
 
 class WebViewInternalReloadFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.reload", WEBVIEWINTERNAL_RELOAD);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.reload", WEBVIEWINTERNAL_RELOAD)
 
   WebViewInternalReloadFunction();
 
@@ -381,7 +378,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.setPermission",
-                             WEBVIEWINTERNAL_SETPERMISSION);
+                             WEBVIEWINTERNAL_SETPERMISSION)
 
   WebViewInternalSetPermissionFunction();
 
@@ -398,7 +395,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.overrideUserAgent",
-                             WEBVIEWINTERNAL_OVERRIDEUSERAGENT);
+                             WEBVIEWINTERNAL_OVERRIDEUSERAGENT)
 
   WebViewInternalOverrideUserAgentFunction();
 
@@ -413,7 +410,7 @@
 
 class WebViewInternalStopFunction : public WebViewInternalExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("webViewInternal.stop", WEBVIEWINTERNAL_STOP);
+  DECLARE_EXTENSION_FUNCTION("webViewInternal.stop", WEBVIEWINTERNAL_STOP)
 
   WebViewInternalStopFunction();
 
@@ -430,7 +427,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.setAudioMuted",
-                             WEBVIEWINTERNAL_SETAUDIOMUTED);
+                             WEBVIEWINTERNAL_SETAUDIOMUTED)
 
   WebViewInternalSetAudioMutedFunction();
 
@@ -447,7 +444,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.isAudioMuted",
-                             WEBVIEWINTERNAL_ISAUDIOMUTED);
+                             WEBVIEWINTERNAL_ISAUDIOMUTED)
 
   WebViewInternalIsAudioMutedFunction();
 
@@ -464,7 +461,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.getAudioState",
-                             WEBVIEWINTERNAL_GETAUDIOSTATE);
+                             WEBVIEWINTERNAL_GETAUDIOSTATE)
 
   WebViewInternalGetAudioStateFunction();
 
@@ -481,7 +478,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.terminate",
-                             WEBVIEWINTERNAL_TERMINATE);
+                             WEBVIEWINTERNAL_TERMINATE)
 
   WebViewInternalTerminateFunction();
 
@@ -498,7 +495,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.clearData",
-                             WEBVIEWINTERNAL_CLEARDATA);
+                             WEBVIEWINTERNAL_CLEARDATA)
 
   WebViewInternalClearDataFunction();
 
@@ -526,7 +523,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.setSpatialNavigationEnabled",
-                             WEBVIEWINTERNAL_SETSPATIALNAVIGATIONENABLED);
+                             WEBVIEWINTERNAL_SETSPATIALNAVIGATIONENABLED)
 
   WebViewInternalSetSpatialNavigationEnabledFunction();
 
@@ -543,7 +540,7 @@
     : public WebViewInternalExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("webViewInternal.isSpatialNavigationEnabled",
-                             WEBVIEWINTERNAL_ISSPATIALNAVIGATIONENABLED);
+                             WEBVIEWINTERNAL_ISSPATIALNAVIGATIONENABLED)
 
   WebViewInternalIsSpatialNavigationEnabledFunction();
 
diff --git a/extensions/browser/api/hid/hid_api.h b/extensions/browser/api/hid/hid_api.h
index aa9cb09..3605643 100644
--- a/extensions/browser/api/hid/hid_api.h
+++ b/extensions/browser/api/hid/hid_api.h
@@ -25,7 +25,7 @@
 
 class HidGetDevicesFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("hid.getDevices", HID_GETDEVICES);
+  DECLARE_EXTENSION_FUNCTION("hid.getDevices", HID_GETDEVICES)
 
   HidGetDevicesFunction();
 
@@ -62,7 +62,7 @@
 
 class HidConnectFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("hid.connect", HID_CONNECT);
+  DECLARE_EXTENSION_FUNCTION("hid.connect", HID_CONNECT)
 
   HidConnectFunction();
 
@@ -81,7 +81,7 @@
 
 class HidDisconnectFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("hid.disconnect", HID_DISCONNECT);
+  DECLARE_EXTENSION_FUNCTION("hid.disconnect", HID_DISCONNECT)
 
   HidDisconnectFunction();
 
@@ -118,7 +118,7 @@
 
 class HidReceiveFunction : public HidConnectionIoFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("hid.receive", HID_RECEIVE);
+  DECLARE_EXTENSION_FUNCTION("hid.receive", HID_RECEIVE)
 
   HidReceiveFunction();
 
@@ -140,7 +140,7 @@
 
 class HidSendFunction : public HidConnectionIoFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("hid.send", HID_SEND);
+  DECLARE_EXTENSION_FUNCTION("hid.send", HID_SEND)
 
   HidSendFunction();
 
@@ -161,7 +161,7 @@
 class HidReceiveFeatureReportFunction : public HidConnectionIoFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("hid.receiveFeatureReport",
-                             HID_RECEIVEFEATUREREPORT);
+                             HID_RECEIVEFEATUREREPORT)
 
   HidReceiveFeatureReportFunction();
 
@@ -182,7 +182,7 @@
 
 class HidSendFeatureReportFunction : public HidConnectionIoFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("hid.sendFeatureReport", HID_SENDFEATUREREPORT);
+  DECLARE_EXTENSION_FUNCTION("hid.sendFeatureReport", HID_SENDFEATUREREPORT)
 
   HidSendFeatureReportFunction();
 
diff --git a/extensions/browser/api/lock_screen_data/lock_screen_data_api.h b/extensions/browser/api/lock_screen_data/lock_screen_data_api.h
index bca0c76..94d0a36 100644
--- a/extensions/browser/api/lock_screen_data/lock_screen_data_api.h
+++ b/extensions/browser/api/lock_screen_data/lock_screen_data_api.h
@@ -30,7 +30,7 @@
   void OnDone(lock_screen_data::OperationResult result,
               const lock_screen_data::DataItem* item);
 
-  DECLARE_EXTENSION_FUNCTION("lockScreen.data.create", LOCKSCREENDATA_CREATE);
+  DECLARE_EXTENSION_FUNCTION("lockScreen.data.create", LOCKSCREENDATA_CREATE)
   DISALLOW_COPY_AND_ASSIGN(LockScreenDataCreateFunction);
 };
 
@@ -45,7 +45,7 @@
 
   void OnDone(const std::vector<const lock_screen_data::DataItem*>& items);
 
-  DECLARE_EXTENSION_FUNCTION("lockScreen.data.getAll", LOCKSCREENDATA_GETALL);
+  DECLARE_EXTENSION_FUNCTION("lockScreen.data.getAll", LOCKSCREENDATA_GETALL)
   DISALLOW_COPY_AND_ASSIGN(LockScreenDataGetAllFunction);
 };
 
@@ -62,7 +62,7 @@
               std::unique_ptr<std::vector<char>> data);
 
   DECLARE_EXTENSION_FUNCTION("lockScreen.data.getContent",
-                             LOCKSCREENDATA_GETCONTENT);
+                             LOCKSCREENDATA_GETCONTENT)
   DISALLOW_COPY_AND_ASSIGN(LockScreenDataGetContentFunction);
 };
 
@@ -78,7 +78,7 @@
   void OnDone(lock_screen_data::OperationResult result);
 
   DECLARE_EXTENSION_FUNCTION("lockScreen.data.setContent",
-                             LOCKSCREENDATA_SETCONTENT);
+                             LOCKSCREENDATA_SETCONTENT)
   DISALLOW_COPY_AND_ASSIGN(LockScreenDataSetContentFunction);
 };
 
@@ -93,7 +93,7 @@
 
   void OnDone(lock_screen_data::OperationResult result);
 
-  DECLARE_EXTENSION_FUNCTION("lockScreen.data.delete", LOCKSCREENDATA_DELETE);
+  DECLARE_EXTENSION_FUNCTION("lockScreen.data.delete", LOCKSCREENDATA_DELETE)
 
   DISALLOW_COPY_AND_ASSIGN(LockScreenDataDeleteFunction);
 };
diff --git a/extensions/browser/api/management/management_api.h b/extensions/browser/api/management/management_api.h
index 8ce66b1..1d03cc8 100644
--- a/extensions/browser/api/management/management_api.h
+++ b/extensions/browser/api/management/management_api.h
@@ -74,7 +74,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("management.getPermissionWarningsByManifest",
-                             MANAGEMENT_GETPERMISSIONWARNINGSBYMANIFEST);
+                             MANAGEMENT_GETPERMISSIONWARNINGSBYMANIFEST)
 
   // Called when utility process finishes.
   void OnParseSuccess(std::unique_ptr<base::Value> value);
@@ -159,7 +159,7 @@
 class ManagementUninstallSelfFunction : public ManagementUninstallFunctionBase {
  public:
   DECLARE_EXTENSION_FUNCTION("management.uninstallSelf",
-                             MANAGEMENT_UNINSTALLSELF);
+                             MANAGEMENT_UNINSTALLSELF)
   ManagementUninstallSelfFunction();
 
  private:
@@ -170,7 +170,7 @@
 class ManagementCreateAppShortcutFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("management.createAppShortcut",
-                             MANAGEMENT_CREATEAPPSHORTCUT);
+                             MANAGEMENT_CREATEAPPSHORTCUT)
 
   ManagementCreateAppShortcutFunction();
 
@@ -187,7 +187,7 @@
 class ManagementSetLaunchTypeFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("management.setLaunchType",
-                             MANAGEMENT_SETLAUNCHTYPE);
+                             MANAGEMENT_SETLAUNCHTYPE)
 
  protected:
   ~ManagementSetLaunchTypeFunction() override {}
@@ -198,7 +198,7 @@
 class ManagementGenerateAppForLinkFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("management.generateAppForLink",
-                             MANAGEMENT_GENERATEAPPFORLINK);
+                             MANAGEMENT_GENERATEAPPFORLINK)
 
   ManagementGenerateAppForLinkFunction();
 
diff --git a/extensions/browser/api/media_perception_private/media_perception_private_api.h b/extensions/browser/api/media_perception_private/media_perception_private_api.h
index ce0e5fc..bb11a4a 100644
--- a/extensions/browser/api/media_perception_private/media_perception_private_api.h
+++ b/extensions/browser/api/media_perception_private/media_perception_private_api.h
@@ -16,7 +16,7 @@
  public:
   MediaPerceptionPrivateGetStateFunction();
   DECLARE_EXTENSION_FUNCTION("mediaPerceptionPrivate.getState",
-                             MEDIAPERCEPTIONPRIVATE_GETSTATE);
+                             MEDIAPERCEPTIONPRIVATE_GETSTATE)
 
  private:
   ~MediaPerceptionPrivateGetStateFunction() override;
@@ -34,7 +34,7 @@
  public:
   MediaPerceptionPrivateSetStateFunction();
   DECLARE_EXTENSION_FUNCTION("mediaPerceptionPrivate.setState",
-                             MEDIAPERCEPTIONPRIVATE_SETSTATE);
+                             MEDIAPERCEPTIONPRIVATE_SETSTATE)
 
  private:
   ~MediaPerceptionPrivateSetStateFunction() override;
@@ -52,7 +52,7 @@
  public:
   MediaPerceptionPrivateGetDiagnosticsFunction();
   DECLARE_EXTENSION_FUNCTION("mediaPerceptionPrivate.getDiagnostics",
-                             MEDIAPERCEPTIONPRIVATE_GETDIAGNOSTICS);
+                             MEDIAPERCEPTIONPRIVATE_GETDIAGNOSTICS)
 
  private:
   ~MediaPerceptionPrivateGetDiagnosticsFunction() override;
@@ -71,7 +71,7 @@
  public:
   MediaPerceptionPrivateSetAnalyticsComponentFunction();
   DECLARE_EXTENSION_FUNCTION("mediaPerceptionPrivate.setAnalyticsComponent",
-                             MEDIAPERCEPTIONPRIVATE_SETANALYTICSCOMPONENT);
+                             MEDIAPERCEPTIONPRIVATE_SETANALYTICSCOMPONENT)
 
  private:
   ~MediaPerceptionPrivateSetAnalyticsComponentFunction() override;
@@ -91,7 +91,7 @@
  public:
   MediaPerceptionPrivateSetComponentProcessStateFunction();
   DECLARE_EXTENSION_FUNCTION("mediaPerceptionPrivate.setComponentProcessState",
-                             MEDIAPERCEPTIONPRIVATE_SETCOMPONENTPROCESSSTATE);
+                             MEDIAPERCEPTIONPRIVATE_SETCOMPONENTPROCESSSTATE)
 
  private:
   ~MediaPerceptionPrivateSetComponentProcessStateFunction() override;
diff --git a/extensions/browser/api/networking_config/networking_config_api.h b/extensions/browser/api/networking_config/networking_config_api.h
index f5560000..3ba9805 100644
--- a/extensions/browser/api/networking_config/networking_config_api.h
+++ b/extensions/browser/api/networking_config/networking_config_api.h
@@ -19,7 +19,7 @@
   ResponseAction Run() override;
 
   DECLARE_EXTENSION_FUNCTION("networking.config.setNetworkFilter",
-                             NETWORKING_CONFIG_SETNETWORKFILTER);
+                             NETWORKING_CONFIG_SETNETWORKFILTER)
 
  protected:
   ~NetworkingConfigSetNetworkFilterFunction() override;
@@ -38,7 +38,7 @@
   ResponseAction Run() override;
 
   DECLARE_EXTENSION_FUNCTION("networking.config.finishAuthentication",
-                             NETWORKING_CONFIG_FINISHAUTHENTICATION);
+                             NETWORKING_CONFIG_FINISHAUTHENTICATION)
 
  protected:
   ~NetworkingConfigFinishAuthenticationFunction() override;
diff --git a/extensions/browser/api/networking_private/networking_private_api.h b/extensions/browser/api/networking_private/networking_private_api.h
index 9c52180..0d473c76 100644
--- a/extensions/browser/api/networking_private/networking_private_api.h
+++ b/extensions/browser/api/networking_private/networking_private_api.h
@@ -35,7 +35,7 @@
  public:
   NetworkingPrivateGetPropertiesFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getProperties",
-                             NETWORKINGPRIVATE_GETPROPERTIES);
+                             NETWORKINGPRIVATE_GETPROPERTIES)
 
  protected:
   ~NetworkingPrivateGetPropertiesFunction() override;
@@ -56,7 +56,7 @@
  public:
   NetworkingPrivateGetManagedPropertiesFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getManagedProperties",
-                             NETWORKINGPRIVATE_GETMANAGEDPROPERTIES);
+                             NETWORKINGPRIVATE_GETMANAGEDPROPERTIES)
 
  protected:
   ~NetworkingPrivateGetManagedPropertiesFunction() override;
@@ -76,7 +76,7 @@
  public:
   NetworkingPrivateGetStateFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getState",
-                             NETWORKINGPRIVATE_GETSTATE);
+                             NETWORKINGPRIVATE_GETSTATE)
 
  protected:
   ~NetworkingPrivateGetStateFunction() override;
@@ -97,7 +97,7 @@
  public:
   NetworkingPrivateSetPropertiesFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.setProperties",
-                             NETWORKINGPRIVATE_SETPROPERTIES);
+                             NETWORKINGPRIVATE_SETPROPERTIES)
 
  protected:
   ~NetworkingPrivateSetPropertiesFunction() override;
@@ -118,7 +118,7 @@
  public:
   NetworkingPrivateCreateNetworkFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.createNetwork",
-                             NETWORKINGPRIVATE_CREATENETWORK);
+                             NETWORKINGPRIVATE_CREATENETWORK)
 
  protected:
   ~NetworkingPrivateCreateNetworkFunction() override;
@@ -139,7 +139,7 @@
  public:
   NetworkingPrivateForgetNetworkFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.forgetNetwork",
-                             NETWORKINGPRIVATE_FORGETNETWORK);
+                             NETWORKINGPRIVATE_FORGETNETWORK)
 
  protected:
   ~NetworkingPrivateForgetNetworkFunction() override;
@@ -159,7 +159,7 @@
  public:
   NetworkingPrivateGetNetworksFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getNetworks",
-                             NETWORKINGPRIVATE_GETNETWORKS);
+                             NETWORKINGPRIVATE_GETNETWORKS)
 
  protected:
   ~NetworkingPrivateGetNetworksFunction() override;
@@ -180,7 +180,7 @@
  public:
   NetworkingPrivateGetVisibleNetworksFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getVisibleNetworks",
-                             NETWORKINGPRIVATE_GETVISIBLENETWORKS);
+                             NETWORKINGPRIVATE_GETVISIBLENETWORKS)
 
  protected:
   ~NetworkingPrivateGetVisibleNetworksFunction() override;
@@ -201,7 +201,7 @@
  public:
   NetworkingPrivateGetEnabledNetworkTypesFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getEnabledNetworkTypes",
-                             NETWORKINGPRIVATE_GETENABLEDNETWORKTYPES);
+                             NETWORKINGPRIVATE_GETENABLEDNETWORKTYPES)
 
  protected:
   ~NetworkingPrivateGetEnabledNetworkTypesFunction() override;
@@ -219,7 +219,7 @@
  public:
   NetworkingPrivateGetDeviceStatesFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getDeviceStates",
-                             NETWORKINGPRIVATE_GETDEVICESTATES);
+                             NETWORKINGPRIVATE_GETDEVICESTATES)
 
  protected:
   ~NetworkingPrivateGetDeviceStatesFunction() override;
@@ -237,7 +237,7 @@
  public:
   NetworkingPrivateEnableNetworkTypeFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.enableNetworkType",
-                             NETWORKINGPRIVATE_ENABLENETWORKTYPE);
+                             NETWORKINGPRIVATE_ENABLENETWORKTYPE)
 
  protected:
   ~NetworkingPrivateEnableNetworkTypeFunction() override;
@@ -255,7 +255,7 @@
  public:
   NetworkingPrivateDisableNetworkTypeFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.disableNetworkType",
-                             NETWORKINGPRIVATE_DISABLENETWORKTYPE);
+                             NETWORKINGPRIVATE_DISABLENETWORKTYPE)
 
  protected:
   ~NetworkingPrivateDisableNetworkTypeFunction() override;
@@ -273,7 +273,7 @@
  public:
   NetworkingPrivateRequestNetworkScanFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.requestNetworkScan",
-                             NETWORKINGPRIVATE_REQUESTNETWORKSCAN);
+                             NETWORKINGPRIVATE_REQUESTNETWORKSCAN)
 
  protected:
   ~NetworkingPrivateRequestNetworkScanFunction() override;
@@ -290,7 +290,7 @@
  public:
   NetworkingPrivateStartConnectFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.startConnect",
-                             NETWORKINGPRIVATE_STARTCONNECT);
+                             NETWORKINGPRIVATE_STARTCONNECT)
 
  protected:
   ~NetworkingPrivateStartConnectFunction() override;
@@ -311,7 +311,7 @@
  public:
   NetworkingPrivateStartDisconnectFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.startDisconnect",
-                             NETWORKINGPRIVATE_STARTDISCONNECT);
+                             NETWORKINGPRIVATE_STARTDISCONNECT)
 
  protected:
   ~NetworkingPrivateStartDisconnectFunction() override;
@@ -332,7 +332,7 @@
  public:
   NetworkingPrivateStartActivateFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.startActivate",
-                             NETWORKINGPRIVATE_STARTACTIVATE);
+                             NETWORKINGPRIVATE_STARTACTIVATE)
 
  protected:
   ~NetworkingPrivateStartActivateFunction() override;
@@ -353,7 +353,7 @@
  public:
   NetworkingPrivateVerifyDestinationFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.verifyDestination",
-                             NETWORKINGPRIVATE_VERIFYDESTINATION);
+                             NETWORKINGPRIVATE_VERIFYDESTINATION)
 
  protected:
   ~NetworkingPrivateVerifyDestinationFunction() override;
@@ -374,7 +374,7 @@
  public:
   NetworkingPrivateVerifyAndEncryptDataFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.verifyAndEncryptData",
-                             NETWORKINGPRIVATE_VERIFYANDENCRYPTDATA);
+                             NETWORKINGPRIVATE_VERIFYANDENCRYPTDATA)
 
  protected:
   ~NetworkingPrivateVerifyAndEncryptDataFunction() override;
@@ -395,7 +395,7 @@
  public:
   NetworkingPrivateSetWifiTDLSEnabledStateFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.setWifiTDLSEnabledState",
-                             NETWORKINGPRIVATE_SETWIFITDLSENABLEDSTATE);
+                             NETWORKINGPRIVATE_SETWIFITDLSENABLEDSTATE)
 
  protected:
   ~NetworkingPrivateSetWifiTDLSEnabledStateFunction() override;
@@ -416,7 +416,7 @@
  public:
   NetworkingPrivateGetWifiTDLSStatusFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getWifiTDLSStatus",
-                             NETWORKINGPRIVATE_GETWIFITDLSSTATUS);
+                             NETWORKINGPRIVATE_GETWIFITDLSSTATUS)
 
  protected:
   ~NetworkingPrivateGetWifiTDLSStatusFunction() override;
@@ -436,7 +436,7 @@
  public:
   NetworkingPrivateGetCaptivePortalStatusFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getCaptivePortalStatus",
-                             NETWORKINGPRIVATE_GETCAPTIVEPORTALSTATUS);
+                             NETWORKINGPRIVATE_GETCAPTIVEPORTALSTATUS)
 
   // ExtensionFunction:
   ResponseAction Run() override;
@@ -456,7 +456,7 @@
  public:
   NetworkingPrivateUnlockCellularSimFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.unlockCellularSim",
-                             NETWORKINGPRIVATE_UNLOCKCELLULARSIM);
+                             NETWORKINGPRIVATE_UNLOCKCELLULARSIM)
 
   // ExtensionFunction:
   ResponseAction Run() override;
@@ -476,7 +476,7 @@
  public:
   NetworkingPrivateSetCellularSimStateFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.setCellularSimState",
-                             NETWORKINGPRIVATE_SETCELLULARSIMSTATE);
+                             NETWORKINGPRIVATE_SETCELLULARSIMSTATE)
 
   // ExtensionFunction:
   ResponseAction Run() override;
@@ -496,7 +496,7 @@
  public:
   NetworkingPrivateSelectCellularMobileNetworkFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.selectCellularMobileNetwork",
-                             NETWORKINGPRIVATE_SELECTCELLULARMOBILENETWORK);
+                             NETWORKINGPRIVATE_SELECTCELLULARMOBILENETWORK)
 
   // ExtensionFunction:
   ResponseAction Run() override;
@@ -517,7 +517,7 @@
  public:
   NetworkingPrivateGetGlobalPolicyFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getGlobalPolicy",
-                             NETWORKINGPRIVATE_GETGLOBALPOLICY);
+                             NETWORKINGPRIVATE_GETGLOBALPOLICY)
 
  protected:
   ~NetworkingPrivateGetGlobalPolicyFunction() override;
@@ -534,7 +534,7 @@
  public:
   NetworkingPrivateGetCertificateListsFunction() {}
   DECLARE_EXTENSION_FUNCTION("networkingPrivate.getCertificateLists",
-                             NETWORKINGPRIVATE_GETCERTIFICATELISTS);
+                             NETWORKINGPRIVATE_GETCERTIFICATELISTS)
 
  protected:
   ~NetworkingPrivateGetCertificateListsFunction() override;
diff --git a/extensions/browser/api/networking_private/networking_private_linux.h b/extensions/browser/api/networking_private/networking_private_linux.h
index 69bfa82..4950a14 100644
--- a/extensions/browser/api/networking_private/networking_private_linux.h
+++ b/extensions/browser/api/networking_private/networking_private_linux.h
@@ -20,7 +20,7 @@
 class ObjectPath;
 class ObjectProxy;
 class Response;
-};
+}  // namespace dbus
 
 namespace extensions {
 
diff --git a/extensions/browser/api/runtime/runtime_api.h b/extensions/browser/api/runtime/runtime_api.h
index 8e927a8..e05fb583 100644
--- a/extensions/browser/api/runtime/runtime_api.h
+++ b/extensions/browser/api/runtime/runtime_api.h
@@ -292,8 +292,7 @@
 
 class RuntimeGetPlatformInfoFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("runtime.getPlatformInfo",
-                             RUNTIME_GETPLATFORMINFO);
+  DECLARE_EXTENSION_FUNCTION("runtime.getPlatformInfo", RUNTIME_GETPLATFORMINFO)
 
  protected:
   ~RuntimeGetPlatformInfoFunction() override {}
diff --git a/extensions/browser/api/serial/serial_api.h b/extensions/browser/api/serial/serial_api.h
index a69f2eac..cea04dc 100644
--- a/extensions/browser/api/serial/serial_api.h
+++ b/extensions/browser/api/serial/serial_api.h
@@ -91,7 +91,7 @@
 
 class SerialUpdateFunction : public SerialAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("serial.update", SERIAL_UPDATE);
+  DECLARE_EXTENSION_FUNCTION("serial.update", SERIAL_UPDATE)
 
   SerialUpdateFunction();
 
@@ -165,7 +165,7 @@
 
 class SerialGetConnectionsFunction : public SerialAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("serial.getConnections", SERIAL_GETCONNECTIONS);
+  DECLARE_EXTENSION_FUNCTION("serial.getConnections", SERIAL_GETCONNECTIONS)
 
   SerialGetConnectionsFunction();
 
diff --git a/extensions/browser/api/socket/mojo_data_pump.h b/extensions/browser/api/socket/mojo_data_pump.h
index f4f6876..8d06da68 100644
--- a/extensions/browser/api/socket/mojo_data_pump.h
+++ b/extensions/browser/api/socket/mojo_data_pump.h
@@ -14,7 +14,7 @@
 
 namespace net {
 class IOBuffer;
-};
+}
 
 namespace extensions {
 
diff --git a/extensions/browser/api/socket/socket_api.h b/extensions/browser/api/socket/socket_api.h
index d8a1023..c37ecd1 100644
--- a/extensions/browser/api/socket/socket_api.h
+++ b/extensions/browser/api/socket/socket_api.h
@@ -570,7 +570,7 @@
 
 class SocketSecureFunction : public SocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("socket.secure", SOCKET_SECURE);
+  DECLARE_EXTENSION_FUNCTION("socket.secure", SOCKET_SECURE)
   SocketSecureFunction();
 
  protected:
diff --git a/extensions/browser/api/sockets_tcp/sockets_tcp_api.h b/extensions/browser/api/sockets_tcp/sockets_tcp_api.h
index fd004e7..16114c9 100644
--- a/extensions/browser/api/sockets_tcp/sockets_tcp_api.h
+++ b/extensions/browser/api/sockets_tcp/sockets_tcp_api.h
@@ -251,7 +251,7 @@
 
 class SocketsTcpSecureFunction : public TCPSocketAsyncApiFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("sockets.tcp.secure", SOCKETS_TCP_SECURE);
+  DECLARE_EXTENSION_FUNCTION("sockets.tcp.secure", SOCKETS_TCP_SECURE)
 
   SocketsTcpSecureFunction();
 
diff --git a/extensions/browser/api/system_display/system_display_api.h b/extensions/browser/api/system_display/system_display_api.h
index 2e290f8..ccbea34 100644
--- a/extensions/browser/api/system_display/system_display_api.h
+++ b/extensions/browser/api/system_display/system_display_api.h
@@ -30,7 +30,7 @@
 // rest of this API, it's available on all platforms.
 class SystemDisplayGetInfoFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("system.display.getInfo", SYSTEM_DISPLAY_GETINFO);
+  DECLARE_EXTENSION_FUNCTION("system.display.getInfo", SYSTEM_DISPLAY_GETINFO)
 
  protected:
   ~SystemDisplayGetInfoFunction() override {}
@@ -44,7 +44,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.getDisplayLayout",
-                             SYSTEM_DISPLAY_GETDISPLAYLAYOUT);
+                             SYSTEM_DISPLAY_GETDISPLAYLAYOUT)
 
  protected:
   ~SystemDisplayGetDisplayLayoutFunction() override {}
@@ -58,7 +58,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.setDisplayProperties",
-                             SYSTEM_DISPLAY_SETDISPLAYPROPERTIES);
+                             SYSTEM_DISPLAY_SETDISPLAYPROPERTIES)
 
  protected:
   ~SystemDisplaySetDisplayPropertiesFunction() override {}
@@ -71,7 +71,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.setDisplayLayout",
-                             SYSTEM_DISPLAY_SETDISPLAYLAYOUT);
+                             SYSTEM_DISPLAY_SETDISPLAYLAYOUT)
 
  protected:
   ~SystemDisplaySetDisplayLayoutFunction() override {}
@@ -84,7 +84,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.enableUnifiedDesktop",
-                             SYSTEM_DISPLAY_ENABLEUNIFIEDDESKTOP);
+                             SYSTEM_DISPLAY_ENABLEUNIFIEDDESKTOP)
 
  protected:
   ~SystemDisplayEnableUnifiedDesktopFunction() override {}
@@ -95,7 +95,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.overscanCalibrationStart",
-                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONSTART);
+                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONSTART)
 
  protected:
   ~SystemDisplayOverscanCalibrationStartFunction() override {}
@@ -106,7 +106,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.overscanCalibrationAdjust",
-                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONADJUST);
+                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONADJUST)
 
  protected:
   ~SystemDisplayOverscanCalibrationAdjustFunction() override {}
@@ -117,7 +117,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.overscanCalibrationReset",
-                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONRESET);
+                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONRESET)
 
  protected:
   ~SystemDisplayOverscanCalibrationResetFunction() override {}
@@ -128,7 +128,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.overscanCalibrationComplete",
-                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONCOMPLETE);
+                             SYSTEM_DISPLAY_OVERSCANCALIBRATIONCOMPLETE)
 
  protected:
   ~SystemDisplayOverscanCalibrationCompleteFunction() override {}
@@ -139,7 +139,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.showNativeTouchCalibration",
-                             SYSTEM_DISPLAY_SHOWNATIVETOUCHCALIBRATION);
+                             SYSTEM_DISPLAY_SHOWNATIVETOUCHCALIBRATION)
 
  protected:
   ~SystemDisplayShowNativeTouchCalibrationFunction() override {}
@@ -152,7 +152,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.startCustomTouchCalibration",
-                             SYSTEM_DISPLAY_STARTCUSTOMTOUCHCALIBRATION);
+                             SYSTEM_DISPLAY_STARTCUSTOMTOUCHCALIBRATION)
 
  protected:
   ~SystemDisplayStartCustomTouchCalibrationFunction() override {}
@@ -163,7 +163,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.completeCustomTouchCalibration",
-                             SYSTEM_DISPLAY_COMPLETECUSTOMTOUCHCALIBRATION);
+                             SYSTEM_DISPLAY_COMPLETECUSTOMTOUCHCALIBRATION)
 
  protected:
   ~SystemDisplayCompleteCustomTouchCalibrationFunction() override {}
@@ -174,7 +174,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.clearTouchCalibration",
-                             SYSTEM_DISPLAY_CLEARTOUCHCALIBRATION);
+                             SYSTEM_DISPLAY_CLEARTOUCHCALIBRATION)
 
  protected:
   ~SystemDisplayClearTouchCalibrationFunction() override {}
@@ -185,7 +185,7 @@
     : public SystemDisplayCrOSRestrictedFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.display.setMirrorMode",
-                             SYSTEM_DISPLAY_SETMIRRORMODE);
+                             SYSTEM_DISPLAY_SETMIRRORMODE)
 
  protected:
   ~SystemDisplaySetMirrorModeFunction() override {}
diff --git a/extensions/browser/api/system_power_source/system_power_source_api.h b/extensions/browser/api/system_power_source/system_power_source_api.h
index 2abb0ce..6698d9b 100644
--- a/extensions/browser/api/system_power_source/system_power_source_api.h
+++ b/extensions/browser/api/system_power_source/system_power_source_api.h
@@ -47,7 +47,7 @@
   SystemPowerSourceGetPowerSourceInfoFunction();
 
   DECLARE_EXTENSION_FUNCTION("system.powerSource.getPowerSourceInfo",
-                             SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO);
+                             SYSTEM_POWER_SOURCE_GETPOWERSOURCEINFO)
 
  protected:
   ~SystemPowerSourceGetPowerSourceInfoFunction() override;
@@ -64,7 +64,7 @@
   SystemPowerSourceRequestStatusUpdateFunction();
 
   DECLARE_EXTENSION_FUNCTION("system.powerSource.requestStatusUpdate",
-                             SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE);
+                             SYSTEM_POWER_SOURCE_REQUESTSTATUSUPDATE)
 
  protected:
   ~SystemPowerSourceRequestStatusUpdateFunction() override;
diff --git a/extensions/browser/api/system_storage/system_storage_api.h b/extensions/browser/api/system_storage/system_storage_api.h
index 89e9158..23d5dde2a 100644
--- a/extensions/browser/api/system_storage/system_storage_api.h
+++ b/extensions/browser/api/system_storage/system_storage_api.h
@@ -16,7 +16,7 @@
 // call relative to browser UI thread.
 class SystemStorageGetInfoFunction : public UIThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("system.storage.getInfo", SYSTEM_STORAGE_GETINFO);
+  DECLARE_EXTENSION_FUNCTION("system.storage.getInfo", SYSTEM_STORAGE_GETINFO)
   SystemStorageGetInfoFunction();
 
  private:
@@ -31,7 +31,7 @@
 class SystemStorageEjectDeviceFunction : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.storage.ejectDevice",
-                             SYSTEM_STORAGE_EJECTDEVICE);
+                             SYSTEM_STORAGE_EJECTDEVICE)
 
  protected:
   ~SystemStorageEjectDeviceFunction() override;
@@ -50,7 +50,7 @@
     : public UIThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("system.storage.getAvailableCapacity",
-                             SYSTEM_STORAGE_GETAVAILABLECAPACITY);
+                             SYSTEM_STORAGE_GETAVAILABLECAPACITY)
   SystemStorageGetAvailableCapacityFunction();
 
  private:
diff --git a/extensions/browser/api/usb/usb_api.h b/extensions/browser/api/usb/usb_api.h
index b6fe512..ba3bef6 100644
--- a/extensions/browser/api/usb/usb_api.h
+++ b/extensions/browser/api/usb/usb_api.h
@@ -132,7 +132,7 @@
 
 class UsbGetConfigurationsFunction : public UsbPermissionCheckingFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("usb.getConfigurations", USB_GETCONFIGURATIONS);
+  DECLARE_EXTENSION_FUNCTION("usb.getConfigurations", USB_GETCONFIGURATIONS)
 
   UsbGetConfigurationsFunction();
 
diff --git a/extensions/browser/api/virtual_keyboard/virtual_keyboard_api.h b/extensions/browser/api/virtual_keyboard/virtual_keyboard_api.h
index 2aa9825..74e3ee0 100644
--- a/extensions/browser/api/virtual_keyboard/virtual_keyboard_api.h
+++ b/extensions/browser/api/virtual_keyboard/virtual_keyboard_api.h
@@ -17,7 +17,7 @@
   VirtualKeyboardRestrictFeaturesFunction();
 
   DECLARE_EXTENSION_FUNCTION("virtualKeyboard.restrictFeatures",
-                             VIRTUALKEYBOARD_RESTRICTFEATURES);
+                             VIRTUALKEYBOARD_RESTRICTFEATURES)
 
  protected:
   ~VirtualKeyboardRestrictFeaturesFunction() override = default;
diff --git a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h
index d4d862da..5227d3b 100644
--- a/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h
+++ b/extensions/browser/api/virtual_keyboard_private/virtual_keyboard_private_api.h
@@ -37,7 +37,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.insertText",
-                             VIRTUALKEYBOARDPRIVATE_INSERTTEXT);
+                             VIRTUALKEYBOARDPRIVATE_INSERTTEXT)
 
  protected:
   ~VirtualKeyboardPrivateInsertTextFunction() override {}
@@ -50,7 +50,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.sendKeyEvent",
-                             VIRTUALKEYBOARDPRIVATE_SENDKEYEVENT);
+                             VIRTUALKEYBOARDPRIVATE_SENDKEYEVENT)
 
  protected:
   ~VirtualKeyboardPrivateSendKeyEventFunction() override {}
@@ -63,7 +63,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.hideKeyboard",
-                             VIRTUALKEYBOARDPRIVATE_HIDEKEYBOARD);
+                             VIRTUALKEYBOARDPRIVATE_HIDEKEYBOARD)
 
  protected:
   ~VirtualKeyboardPrivateHideKeyboardFunction() override {}
@@ -76,7 +76,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setHotrodKeyboard",
-                             VIRTUALKEYBOARDPRIVATE_SETHOTRODKEYBOARD);
+                             VIRTUALKEYBOARDPRIVATE_SETHOTRODKEYBOARD)
 
  protected:
   ~VirtualKeyboardPrivateSetHotrodKeyboardFunction() override {}
@@ -89,7 +89,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.lockKeyboard",
-                             VIRTUALKEYBOARDPRIVATE_LOCKKEYBOARD);
+                             VIRTUALKEYBOARDPRIVATE_LOCKKEYBOARD)
 
  protected:
   ~VirtualKeyboardPrivateLockKeyboardFunction() override {}
@@ -102,7 +102,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.keyboardLoaded",
-                             VIRTUALKEYBOARDPRIVATE_KEYBOARDLOADED);
+                             VIRTUALKEYBOARDPRIVATE_KEYBOARDLOADED)
 
  protected:
   ~VirtualKeyboardPrivateKeyboardLoadedFunction() override {}
@@ -115,7 +115,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.getKeyboardConfig",
-                             VIRTUALKEYBOARDPRIVATE_GETKEYBOARDCONFIG);
+                             VIRTUALKEYBOARDPRIVATE_GETKEYBOARDCONFIG)
 
  protected:
   ~VirtualKeyboardPrivateGetKeyboardConfigFunction() override {}
@@ -131,7 +131,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.openSettings",
-                             VIRTUALKEYBOARDPRIVATE_OPENSETTINGS);
+                             VIRTUALKEYBOARDPRIVATE_OPENSETTINGS)
 
  protected:
   ~VirtualKeyboardPrivateOpenSettingsFunction() override {}
@@ -144,7 +144,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setContainerBehavior",
-                             VIRTUALKEYBOARDPRIVATE_SETCONTAINERBEHAVIOR);
+                             VIRTUALKEYBOARDPRIVATE_SETCONTAINERBEHAVIOR)
 
  protected:
   ~VirtualKeyboardPrivateSetContainerBehaviorFunction() override = default;
@@ -160,7 +160,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setDraggableArea",
-                             VIRTUALKEYBOARDPRIVATE_SETDRAGGABLEAREA);
+                             VIRTUALKEYBOARDPRIVATE_SETDRAGGABLEAREA)
 
  protected:
   ~VirtualKeyboardPrivateSetDraggableAreaFunction() override {}
@@ -173,7 +173,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setKeyboardState",
-                             VIRTUALKEYBOARDPRIVATE_SETKEYBOARDSTATE);
+                             VIRTUALKEYBOARDPRIVATE_SETKEYBOARDSTATE)
 
  protected:
   ~VirtualKeyboardPrivateSetKeyboardStateFunction() override {}
@@ -186,7 +186,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setOccludedBounds",
-                             VIRTUALKEYBOARDPRIVATE_SETOCCLUDEDBOUNDS);
+                             VIRTUALKEYBOARDPRIVATE_SETOCCLUDEDBOUNDS)
 
  protected:
   ~VirtualKeyboardPrivateSetOccludedBoundsFunction() override {}
@@ -199,7 +199,7 @@
     : public VirtualKeyboardPrivateFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("virtualKeyboardPrivate.setHitTestBounds",
-                             VIRTUALKEYBOARDPRIVATE_SETHITTESTBOUNDS);
+                             VIRTUALKEYBOARDPRIVATE_SETHITTESTBOUNDS)
 
  protected:
   ~VirtualKeyboardPrivateSetHitTestBoundsFunction() override {}
diff --git a/extensions/browser/api/vpn_provider/vpn_provider_api.h b/extensions/browser/api/vpn_provider/vpn_provider_api.h
index 94ce5ec4..0a3b4bf 100644
--- a/extensions/browser/api/vpn_provider/vpn_provider_api.h
+++ b/extensions/browser/api/vpn_provider/vpn_provider_api.h
@@ -27,7 +27,7 @@
 class VpnProviderCreateConfigFunction : public VpnThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("vpnProvider.createConfig",
-                             VPNPROVIDER_CREATECONFIG);
+                             VPNPROVIDER_CREATECONFIG)
 
  protected:
   ~VpnProviderCreateConfigFunction() override;
@@ -38,7 +38,7 @@
 class VpnProviderDestroyConfigFunction : public VpnThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("vpnProvider.destroyConfig",
-                             VPNPROVIDER_DESTROYCONFIG);
+                             VPNPROVIDER_DESTROYCONFIG)
 
  protected:
   ~VpnProviderDestroyConfigFunction() override;
@@ -49,7 +49,7 @@
 class VpnProviderSetParametersFunction : public VpnThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("vpnProvider.setParameters",
-                             VPNPROVIDER_SETPARAMETERS);
+                             VPNPROVIDER_SETPARAMETERS)
 
  protected:
   ~VpnProviderSetParametersFunction() override;
@@ -59,7 +59,7 @@
 
 class VpnProviderSendPacketFunction : public VpnThreadExtensionFunction {
  public:
-  DECLARE_EXTENSION_FUNCTION("vpnProvider.sendPacket", VPNPROVIDER_SENDPACKET);
+  DECLARE_EXTENSION_FUNCTION("vpnProvider.sendPacket", VPNPROVIDER_SENDPACKET)
 
  protected:
   ~VpnProviderSendPacketFunction() override;
@@ -71,7 +71,7 @@
     : public VpnThreadExtensionFunction {
  public:
   DECLARE_EXTENSION_FUNCTION("vpnProvider.notifyConnectionStateChanged",
-                             VPNPROVIDER_NOTIFYCONNECTIONSTATECHANGED);
+                             VPNPROVIDER_NOTIFYCONNECTIONSTATECHANGED)
 
  protected:
   ~VpnProviderNotifyConnectionStateChangedFunction() override;
diff --git a/extensions/browser/api/webcam_private/webcam_private_api.h b/extensions/browser/api/webcam_private/webcam_private_api.h
index 019a905..6d36c80 100644
--- a/extensions/browser/api/webcam_private/webcam_private_api.h
+++ b/extensions/browser/api/webcam_private/webcam_private_api.h
@@ -84,7 +84,7 @@
  public:
   WebcamPrivateOpenSerialWebcamFunction();
   DECLARE_EXTENSION_FUNCTION("webcamPrivate.openSerialWebcam",
-                             WEBCAMPRIVATE_OPENSERIALWEBCAM);
+                             WEBCAMPRIVATE_OPENSERIALWEBCAM)
 
  protected:
   ~WebcamPrivateOpenSerialWebcamFunction() override;
@@ -102,7 +102,7 @@
  public:
   WebcamPrivateCloseWebcamFunction();
   DECLARE_EXTENSION_FUNCTION("webcamPrivate.closeWebcam",
-                             WEBCAMPRIVATE_CLOSEWEBCAM);
+                             WEBCAMPRIVATE_CLOSEWEBCAM)
 
  protected:
   ~WebcamPrivateCloseWebcamFunction() override;
@@ -117,7 +117,7 @@
 class WebcamPrivateSetFunction : public UIThreadExtensionFunction {
  public:
   WebcamPrivateSetFunction();
-  DECLARE_EXTENSION_FUNCTION("webcamPrivate.set", WEBCAMPRIVATE_SET);
+  DECLARE_EXTENSION_FUNCTION("webcamPrivate.set", WEBCAMPRIVATE_SET)
 
  protected:
   ~WebcamPrivateSetFunction() override;
@@ -137,7 +137,7 @@
 class WebcamPrivateGetFunction : public UIThreadExtensionFunction {
  public:
   WebcamPrivateGetFunction();
-  DECLARE_EXTENSION_FUNCTION("webcamPrivate.get", WEBCAMPRIVATE_GET);
+  DECLARE_EXTENSION_FUNCTION("webcamPrivate.get", WEBCAMPRIVATE_GET)
 
  protected:
   ~WebcamPrivateGetFunction() override;
@@ -188,7 +188,7 @@
 class WebcamPrivateResetFunction : public UIThreadExtensionFunction {
  public:
   WebcamPrivateResetFunction();
-  DECLARE_EXTENSION_FUNCTION("webcamPrivate.reset", WEBCAMPRIVATE_RESET);
+  DECLARE_EXTENSION_FUNCTION("webcamPrivate.reset", WEBCAMPRIVATE_RESET)
 
  protected:
   ~WebcamPrivateResetFunction() override;
diff --git a/extensions/docs/api_functions.md b/extensions/docs/api_functions.md
index 0a21c41..102eabc 100644
--- a/extensions/docs/api_functions.md
+++ b/extensions/docs/api_functions.md
@@ -94,7 +94,7 @@
  public:
   // This declares the extension function and initiates the mapping between the
   // string name to the C++ class as well as the histogram value.
-  DECLARE_EXTENSION_FUNCTION("gizmo.frobulate", GIZMO_FROBULATE);
+  DECLARE_EXTENSION_FUNCTION("gizmo.frobulate", GIZMO_FROBULATE)
 
   GizmoFrobulateFunction();
 
diff --git a/extensions/shell/browser/api/identity/identity_api.h b/extensions/shell/browser/api/identity/identity_api.h
index fb07f00..d535a4e1 100644
--- a/extensions/shell/browser/api/identity/identity_api.h
+++ b/extensions/shell/browser/api/identity/identity_api.h
@@ -45,7 +45,7 @@
                                      public OAuth2TokenService::Consumer,
                                      public OAuth2MintTokenFlow::Delegate {
  public:
-  DECLARE_EXTENSION_FUNCTION("identity.getAuthToken", UNKNOWN);
+  DECLARE_EXTENSION_FUNCTION("identity.getAuthToken", UNKNOWN)
 
   IdentityGetAuthTokenFunction();
 
diff --git a/gpu/command_buffer/service/copy_texture_chromium_mock.h b/gpu/command_buffer/service/copy_texture_chromium_mock.h
index a163f292..3b91a90 100644
--- a/gpu/command_buffer/service/copy_texture_chromium_mock.h
+++ b/gpu/command_buffer/service/copy_texture_chromium_mock.h
@@ -54,7 +54,7 @@
       GLsizei width,
       GLsizei height,
       GLuint source_framebuffer,
-      GLenum source_framebuffer_internal_format) override{};
+      GLenum source_framebuffer_internal_format) override {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockCopyTexImageResourceManager);
diff --git a/gpu/ipc/common/gpu_param_traits_macros.h b/gpu/ipc/common/gpu_param_traits_macros.h
index 621890d..9fd93a4b 100644
--- a/gpu/ipc/common/gpu_param_traits_macros.h
+++ b/gpu/ipc/common/gpu_param_traits_macros.h
@@ -22,7 +22,7 @@
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::SchedulingPriority,
                           gpu::SchedulingPriority::kLast)
 IPC_ENUM_TRAITS_MAX_VALUE(gpu::ContextResult,
-                          gpu::ContextResult::kLastContextResult);
+                          gpu::ContextResult::kLastContextResult)
 
 IPC_STRUCT_TRAITS_BEGIN(gpu::SwapBuffersCompleteParams)
   IPC_STRUCT_TRAITS_MEMBER(ca_layer_params)
@@ -30,6 +30,6 @@
   IPC_STRUCT_TRAITS_MEMBER(swap_response)
 IPC_STRUCT_TRAITS_END()
 
-IPC_ENUM_TRAITS_MAX_VALUE(viz::ResourceFormat, viz::RESOURCE_FORMAT_MAX);
+IPC_ENUM_TRAITS_MAX_VALUE(viz::ResourceFormat, viz::RESOURCE_FORMAT_MAX)
 
 #endif  // GPU_IPC_COMMON_GPU_PARAM_TRAITS_MACROS_H_
diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc
index 2f1bd42..f2f7691 100644
--- a/gpu/ipc/service/direct_composition_surface_win.cc
+++ b/gpu/ipc/service/direct_composition_surface_win.cc
@@ -1132,16 +1132,25 @@
         (D3D11_RESOURCE_MISC_SHARED | D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX |
          D3D11_RESOURCE_MISC_SHARED_NTHANDLE);
 
+    // Rotated videos are not promoted to overlays.  We plan to implement
+    // rotation using video processor instead of via direct composition.  Also
+    // check for skew and any downscaling specified to direct composition.
+    bool is_overlay_supported_transform =
+        visual_info_.transform.IsPositiveScaleOrTranslation();
+
     // Downscaled video isn't promoted to hardware overlays.  We prefer to blit
     // into the smaller size so that it can be promoted to a hardware overlay.
     float swap_chain_scale_x =
         swap_chain_size.width() * 1.0f / params.content_rect.width();
     float swap_chain_scale_y =
         swap_chain_size.height() * 1.0f / params.content_rect.height();
-    bool is_downscale =
-        (swap_chain_scale_x < 1.0f) || (swap_chain_scale_y < 1.0f);
 
-    if (is_decoder_texture && !is_shared_texture && !is_downscale) {
+    is_overlay_supported_transform = is_overlay_supported_transform &&
+                                     (swap_chain_scale_x >= 1.0f) &&
+                                     (swap_chain_scale_y >= 1.0f);
+
+    if (is_decoder_texture && !is_shared_texture &&
+        is_overlay_supported_transform) {
       if (PresentToDecodeSwapChain(image_dxgi, params.content_rect,
                                    swap_chain_size, needs_commit)) {
         return true;
diff --git a/gpu/vulkan/vulkan_command_buffer.cc b/gpu/vulkan/vulkan_command_buffer.cc
index e166496a..d9c5a4d 100644
--- a/gpu/vulkan/vulkan_command_buffer.cc
+++ b/gpu/vulkan/vulkan_command_buffer.cc
@@ -167,7 +167,7 @@
   if (VK_SUCCESS != result) {
     DLOG(ERROR) << "vkEndCommandBuffer() failed: " << result;
   }
-};
+}
 
 ScopedMultiUseCommandBufferRecorder::ScopedMultiUseCommandBufferRecorder(
     VulkanCommandBuffer& command_buffer)
diff --git a/headless/BUILD.gn b/headless/BUILD.gn
index d3fcfea..1d15a927 100644
--- a/headless/BUILD.gn
+++ b/headless/BUILD.gn
@@ -10,7 +10,6 @@
 import("//headless/headless.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//printing/buildflags/buildflags.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 import("//third_party/closure_compiler/compile_js.gni")
 import("//third_party/inspector_protocol/inspector_protocol.gni")
diff --git a/headless/lib/browser/headless_devtools_client_impl.cc b/headless/lib/browser/headless_devtools_client_impl.cc
index 065a42d..1e94c0d 100644
--- a/headless/lib/browser/headless_devtools_client_impl.cc
+++ b/headless/lib/browser/headless_devtools_client_impl.cc
@@ -77,7 +77,7 @@
 HeadlessDevToolsClientImpl::~HeadlessDevToolsClientImpl() {
   if (parent_client_)
     parent_client_->sessions_.erase(session_id_);
-};
+}
 
 void HeadlessDevToolsClientImpl::AttachToExternalHost(
     ExternalHost* external_host) {
diff --git a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
index 40864d99..c8d9be0 100644
--- a/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
+++ b/ios/chrome/browser/autofill/form_input_accessory_view_controller.mm
@@ -411,6 +411,9 @@
     if (IsIPadIdiom()) {
       // On iPad the keyboard view can change so this updates it when needed.
       UIView* keyboardView = [self getKeyboardView];
+      if (!keyboardView) {
+        return;
+      }
       if (self.inputAccessoryView.superview) {
         if (keyboardView == self.inputAccessoryView.superview) {
           return;
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm
index 2c1e3b2..dcf6cee 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_bottom_toolbar.mm
@@ -28,6 +28,18 @@
 
 #pragma mark - UIView
 
+// Controls hit testing of the bottom toolbar. When the toolbar is transparent,
+// only respond to tapping on the new tab button.
+- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event {
+  // The toolbar is not tranparent under compact layout.
+  if ([self shouldUseCompactLayout]) {
+    return [super pointInside:point withEvent:event];
+  }
+  return [self.newTabButton.button
+      pointInside:[self convertPoint:point toView:self.newTabButton.button]
+        withEvent:event];
+}
+
 - (void)willMoveToSuperview:(UIView*)newSuperview {
   // The first time this moves to a superview, perform the view setup.
   if (newSuperview && self.subviews.count == 0) {
diff --git a/ios/web/shell/BUILD.gn b/ios/web/shell/BUILD.gn
index cb45ca2e..2f6c757 100644
--- a/ios/web/shell/BUILD.gn
+++ b/ios/web/shell/BUILD.gn
@@ -5,7 +5,6 @@
 import("//build/config/ios/rules.gni")
 import("//ios/build/config.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//tools/grit/grit_rule.gni")
 import("//tools/grit/repack.gni")
 
@@ -73,10 +72,10 @@
     "//net:extras",
     "//services/service_manager/public/cpp",
     "//services/test/echo:lib",
-    "//services/test/echo:manifest",
+    "//services/test/echo/public/cpp:manifest",
     "//services/test/echo/public/mojom",
     "//services/test/user_id:lib",
-    "//services/test/user_id:manifest",
+    "//services/test/user_id/public/cpp:manifest",
     "//services/test/user_id/public/mojom",
     "//ui/base",
   ]
diff --git a/ios/web/shell/shell_web_client.mm b/ios/web/shell/shell_web_client.mm
index a2b9953..ce58b00 100644
--- a/ios/web/shell/shell_web_client.mm
+++ b/ios/web/shell/shell_web_client.mm
@@ -15,9 +15,9 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/test/echo/echo_service.h"
-#include "services/test/echo/manifest.h"
+#include "services/test/echo/public/cpp/manifest.h"
 #include "services/test/echo/public/mojom/echo.mojom.h"
-#include "services/test/user_id/manifest.h"
+#include "services/test/user_id/public/cpp/manifest.h"
 #include "ui/base/resource/resource_bundle.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ipc/ipc_sync_channel.h b/ipc/ipc_sync_channel.h
index 1318fc3..af4a037 100644
--- a/ipc/ipc_sync_channel.h
+++ b/ipc/ipc_sync_channel.h
@@ -25,7 +25,7 @@
 namespace base {
 class RunLoop;
 class WaitableEvent;
-};
+}  // namespace base
 
 namespace mojo {
 class SyncHandleRegistry;
diff --git a/media/audio/alsa/alsa_output.h b/media/audio/alsa/alsa_output.h
index 000807d..acf139b 100644
--- a/media/audio/alsa/alsa_output.h
+++ b/media/audio/alsa/alsa_output.h
@@ -226,6 +226,6 @@
 MEDIA_EXPORT std::ostream& operator<<(std::ostream& os,
                                       AlsaPcmOutputStream::InternalState);
 
-};  // namespace media
+}  // namespace media
 
 #endif  // MEDIA_AUDIO_ALSA_ALSA_OUTPUT_H_
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 3e6b561..213ad99d 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -235,6 +235,8 @@
     "serial_runner.h",
     "silent_sink_suspender.cc",
     "silent_sink_suspender.h",
+    "simple_sync_token_client.cc",
+    "simple_sync_token_client.h",
     "sinc_resampler.cc",
     "sinc_resampler.h",
     "stream_parser.cc",
diff --git a/media/base/simple_sync_token_client.cc b/media/base/simple_sync_token_client.cc
new file mode 100644
index 0000000..fcd06296
--- /dev/null
+++ b/media/base/simple_sync_token_client.cc
@@ -0,0 +1,18 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/base/simple_sync_token_client.h"
+
+namespace media {
+
+SimpleSyncTokenClient::SimpleSyncTokenClient(const gpu::SyncToken& sync_token)
+    : sync_token_(sync_token) {}
+
+void SimpleSyncTokenClient::GenerateSyncToken(gpu::SyncToken* sync_token) {
+  *sync_token = sync_token_;
+}
+
+void SimpleSyncTokenClient::WaitSyncToken(const gpu::SyncToken& sync_token) {}
+
+}  // namespace media
diff --git a/media/base/simple_sync_token_client.h b/media/base/simple_sync_token_client.h
new file mode 100644
index 0000000..797de6b
--- /dev/null
+++ b/media/base/simple_sync_token_client.h
@@ -0,0 +1,29 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_BASE_SIMPLE_SYNC_TOKEN_CLIENT_H_
+#define MEDIA_BASE_SIMPLE_SYNC_TOKEN_CLIENT_H_
+
+#include "base/macros.h"
+#include "gpu/command_buffer/common/sync_token.h"
+#include "media/base/media_export.h"
+#include "media/base/video_frame.h"
+
+namespace media {
+
+class MEDIA_EXPORT SimpleSyncTokenClient : public VideoFrame::SyncTokenClient {
+ public:
+  explicit SimpleSyncTokenClient(const gpu::SyncToken& sync_token);
+  void GenerateSyncToken(gpu::SyncToken* sync_token) final;
+  void WaitSyncToken(const gpu::SyncToken& sync_token) final;
+
+ private:
+  gpu::SyncToken sync_token_;
+
+  DISALLOW_COPY_AND_ASSIGN(SimpleSyncTokenClient);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_BASE_SIMPLE_SYNC_TOKEN_CLIENT_H_
diff --git a/media/base/video_frame_unittest.cc b/media/base/video_frame_unittest.cc
index be4c477a..5ac862c3 100644
--- a/media/base/video_frame_unittest.cc
+++ b/media/base/video_frame_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/strings/stringprintf.h"
 #include "build/build_config.h"
 #include "gpu/command_buffer/common/mailbox_holder.h"
+#include "media/base/simple_sync_token_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/libyuv/include/libyuv.h"
 
@@ -467,24 +468,6 @@
   EXPECT_FALSE(called_sync_token.HasData());
 }
 
-namespace {
-
-class SyncTokenClientImpl : public VideoFrame::SyncTokenClient {
- public:
-  explicit SyncTokenClientImpl(const gpu::SyncToken& sync_token)
-      : sync_token_(sync_token) {}
-  ~SyncTokenClientImpl() override = default;
-  void GenerateSyncToken(gpu::SyncToken* sync_token) override {
-    *sync_token = sync_token_;
-  }
-  void WaitSyncToken(const gpu::SyncToken& sync_token) override {}
-
- private:
-  gpu::SyncToken sync_token_;
-};
-
-}  // namespace
-
 // Verify the gpu::MailboxHolder::ReleaseCallback is called when VideoFrame is
 // destroyed with the release sync point, which was updated by clients.
 // (i.e. the compositor, webgl).
@@ -532,7 +515,7 @@
       EXPECT_EQ(sync_token, mailbox_holder.sync_token);
     }
 
-    SyncTokenClientImpl client(release_sync_token);
+    SimpleSyncTokenClient client(release_sync_token);
     frame->UpdateReleaseSyncToken(&client);
     EXPECT_EQ(sync_token,
               frame->mailbox_holder(VideoFrame::kYPlane).sync_token);
diff --git a/media/capabilities/video_decode_stats_db_impl.cc b/media/capabilities/video_decode_stats_db_impl.cc
index 6a7ac91..8dd9b0b 100644
--- a/media/capabilities/video_decode_stats_db_impl.cc
+++ b/media/capabilities/video_decode_stats_db_impl.cc
@@ -34,7 +34,7 @@
 
 const int kMaxDaysToKeepStatsDefault = 30;
 
-};  // namespace
+}  // namespace
 
 const char VideoDecodeStatsDBImpl::kMaxFramesPerBufferParamName[] =
     "db_frames_buffer_size";
diff --git a/media/capture/video/video_capture_buffer_tracker.h b/media/capture/video/video_capture_buffer_tracker.h
index 8c7ccf6c..fb09a93 100644
--- a/media/capture/video/video_capture_buffer_tracker.h
+++ b/media/capture/video/video_capture_buffer_tracker.h
@@ -26,7 +26,7 @@
   virtual bool Init(const gfx::Size& dimensions,
                     VideoPixelFormat format,
                     const mojom::PlaneStridesPtr& strides) = 0;
-  virtual ~VideoCaptureBufferTracker(){};
+  virtual ~VideoCaptureBufferTracker() {}
 
   bool held_by_producer() const { return held_by_producer_; }
   void set_held_by_producer(bool value) { held_by_producer_ = value; }
diff --git a/media/capture/video/video_frame_receiver.h b/media/capture/video/video_frame_receiver.h
index 02a1eb68..7f8454eb 100644
--- a/media/capture/video/video_frame_receiver.h
+++ b/media/capture/video/video_frame_receiver.h
@@ -16,7 +16,7 @@
 // clients.
 class CAPTURE_EXPORT VideoFrameReceiver {
  public:
-  virtual ~VideoFrameReceiver(){};
+  virtual ~VideoFrameReceiver() {}
 
   // Tells the VideoFrameReceiver that the producer is going to subsequently use
   // the provided buffer as one of possibly many for frame delivery via
diff --git a/media/cast/net/cast_transport.h b/media/cast/net/cast_transport.h
index e65a6eb..6566309 100644
--- a/media/cast/net/cast_transport.h
+++ b/media/cast/net/cast_transport.h
@@ -76,7 +76,7 @@
   // from CastTransport.
   class Client {
    public:
-    virtual ~Client(){};
+    virtual ~Client() {}
 
     // Audio and Video transport status change is reported on this callback.
     virtual void OnStatusChanged(CastTransportStatus status) = 0;
diff --git a/media/formats/mp4/bitstream_converter.cc b/media/formats/mp4/bitstream_converter.cc
index 812f682..ca5be617 100644
--- a/media/formats/mp4/bitstream_converter.cc
+++ b/media/formats/mp4/bitstream_converter.cc
@@ -7,7 +7,7 @@
 namespace media {
 namespace mp4 {
 
-BitstreamConverter::AnalysisResult::AnalysisResult(){};
+BitstreamConverter::AnalysisResult::AnalysisResult() {}
 
 BitstreamConverter::AnalysisResult::AnalysisResult(const AnalysisResult& other)
     : is_conformant(other.is_conformant), is_keyframe(other.is_keyframe) {}
diff --git a/media/gpu/ipc/service/picture_buffer_manager_unittest.cc b/media/gpu/ipc/service/picture_buffer_manager_unittest.cc
index ccd950b..fcf2475 100644
--- a/media/gpu/ipc/service/picture_buffer_manager_unittest.cc
+++ b/media/gpu/ipc/service/picture_buffer_manager_unittest.cc
@@ -10,34 +10,12 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_task_environment.h"
+#include "media/base/simple_sync_token_client.h"
 #include "media/gpu/fake_command_buffer_helper.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace media {
 
-namespace {
-
-// TODO(sandersd): Should be part of //media, as it is used by
-// MojoVideoDecoderService (production code) as well.
-class StaticSyncTokenClient : public VideoFrame::SyncTokenClient {
- public:
-  explicit StaticSyncTokenClient(const gpu::SyncToken& sync_token)
-      : sync_token_(sync_token) {}
-
-  void GenerateSyncToken(gpu::SyncToken* sync_token) final {
-    *sync_token = sync_token_;
-  }
-
-  void WaitSyncToken(const gpu::SyncToken& sync_token) final {}
-
- private:
-  gpu::SyncToken sync_token_;
-
-  DISALLOW_COPY_AND_ASSIGN(StaticSyncTokenClient);
-};
-
-}  // namespace
-
 class PictureBufferManagerImplTest : public testing::Test {
  public:
   explicit PictureBufferManagerImplTest() {
@@ -88,7 +66,7 @@
     gpu::SyncToken sync_token(gpu::GPU_IO,
                               gpu::CommandBufferId::FromUnsafeValue(1),
                               next_release_count_++);
-    StaticSyncTokenClient sync_token_client(sync_token);
+    SimpleSyncTokenClient sync_token_client(sync_token);
     video_frame->UpdateReleaseSyncToken(&sync_token_client);
     return sync_token;
   }
diff --git a/media/gpu/ipc/service/vda_video_decoder_unittest.cc b/media/gpu/ipc/service/vda_video_decoder_unittest.cc
index 963380d..6d411268 100644
--- a/media/gpu/ipc/service/vda_video_decoder_unittest.cc
+++ b/media/gpu/ipc/service/vda_video_decoder_unittest.cc
@@ -20,6 +20,7 @@
 #include "media/base/decoder_buffer.h"
 #include "media/base/media_util.h"
 #include "media/base/mock_media_log.h"
+#include "media/base/simple_sync_token_client.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_frame.h"
 #include "media/base/video_rotation.h"
@@ -53,25 +54,6 @@
   return buffer;
 }
 
-// TODO(sandersd): Should be part of //media, as it is used by
-// MojoVideoDecoderService (production code) as well.
-class StaticSyncTokenClient : public VideoFrame::SyncTokenClient {
- public:
-  explicit StaticSyncTokenClient(const gpu::SyncToken& sync_token)
-      : sync_token_(sync_token) {}
-
-  void GenerateSyncToken(gpu::SyncToken* sync_token) final {
-    *sync_token = sync_token_;
-  }
-
-  void WaitSyncToken(const gpu::SyncToken& sync_token) final {}
-
- private:
-  gpu::SyncToken sync_token_;
-
-  DISALLOW_COPY_AND_ASSIGN(StaticSyncTokenClient);
-};
-
 VideoDecodeAccelerator::SupportedProfiles GetSupportedProfiles() {
   VideoDecodeAccelerator::SupportedProfiles profiles;
   {
@@ -279,7 +261,7 @@
     gpu::SyncToken sync_token(gpu::GPU_IO,
                               gpu::CommandBufferId::FromUnsafeValue(1),
                               next_release_count_++);
-    StaticSyncTokenClient sync_token_client(sync_token);
+    SimpleSyncTokenClient sync_token_client(sync_token);
     video_frame->UpdateReleaseSyncToken(&sync_token_client);
     return sync_token;
   }
diff --git a/media/mojo/common/mojo_shared_buffer_video_frame.h b/media/mojo/common/mojo_shared_buffer_video_frame.h
index ee12814..fe85253 100644
--- a/media/mojo/common/mojo_shared_buffer_video_frame.h
+++ b/media/mojo/common/mojo_shared_buffer_video_frame.h
@@ -97,7 +97,7 @@
 
   uint8_t* shared_buffer_data() {
     return reinterpret_cast<uint8_t*>(shared_buffer_mapping_.get());
-  };
+  }
 
   mojo::ScopedSharedBufferHandle shared_buffer_handle_;
   mojo::ScopedSharedBufferMapping shared_buffer_mapping_;
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc
index 4ec54f1..8d1c5dd 100644
--- a/media/mojo/services/mojo_video_decoder_service.cc
+++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -13,6 +13,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "media/base/cdm_context.h"
 #include "media/base/decoder_buffer.h"
+#include "media/base/simple_sync_token_client.h"
 #include "media/base/video_decoder.h"
 #include "media/base/video_decoder_config.h"
 #include "media/base/video_frame.h"
@@ -41,26 +42,6 @@
 const char kDecodeTraceName[] = "MojoVideoDecoderService::Decode";
 const char kResetTraceName[] = "MojoVideoDecoderService::Reset";
 
-class StaticSyncTokenClient : public VideoFrame::SyncTokenClient {
- public:
-  explicit StaticSyncTokenClient(const gpu::SyncToken& sync_token)
-      : sync_token_(sync_token) {}
-
-  // VideoFrame::SyncTokenClient implementation
-  void GenerateSyncToken(gpu::SyncToken* sync_token) final {
-    *sync_token = sync_token_;
-  }
-
-  void WaitSyncToken(const gpu::SyncToken& sync_token) final {
-    // NOP; we don't care what the old sync token was.
-  }
-
- private:
-  gpu::SyncToken sync_token_;
-
-  DISALLOW_COPY_AND_ASSIGN(StaticSyncTokenClient);
-};
-
 }  // namespace
 
 class VideoFrameHandleReleaserImpl final
@@ -92,7 +73,7 @@
       mojo::ReportBadMessage("Unknown |release_token|.");
       return;
     }
-    StaticSyncTokenClient client(release_sync_token);
+    SimpleSyncTokenClient client(release_sync_token);
     it->second->UpdateReleaseSyncToken(&client);
     video_frames_.erase(it);
   }
diff --git a/media/video/mock_gpu_video_accelerator_factories.h b/media/video/mock_gpu_video_accelerator_factories.h
index 121c95d7..b890499 100644
--- a/media/video/mock_gpu_video_accelerator_factories.h
+++ b/media/video/mock_gpu_video_accelerator_factories.h
@@ -80,13 +80,13 @@
   unsigned ImageTextureTarget(gfx::BufferFormat format) override;
   OutputFormat VideoFrameOutputFormat(VideoPixelFormat pixel_format) override {
     return video_frame_output_format_;
-  };
+  }
 
   gpu::gles2::GLES2Interface* ContextGL() override { return gles2_; }
 
   void SetVideoFrameOutputFormat(const OutputFormat video_frame_output_format) {
     video_frame_output_format_ = video_frame_output_format;
-  };
+  }
 
   void SetFailToAllocateGpuMemoryBufferForTesting(bool fail) {
     fail_to_allocate_gpu_memory_buffer_ = fail;
diff --git a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
index e5501c7..3cc657cf 100644
--- a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
+++ b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
@@ -45,7 +45,7 @@
 
   bool Accept(mojo::Message* message) override {
     base::FilePath path = directory_.Append(FILE_PATH_LITERAL("message_") +
-                                            base::IntToString(count_++) +
+                                            base::NumberToString(count_++) +
                                             FILE_PATH_LITERAL(".mojomsg"));
 
     base::File file(path,
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 44f07ab1..9ef4825e 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -802,8 +802,6 @@
       "http/http_network_transaction.h",
       "http/http_proxy_client_socket.cc",
       "http/http_proxy_client_socket.h",
-      "http/http_proxy_client_socket_pool.cc",
-      "http/http_proxy_client_socket_pool.h",
       "http/http_proxy_client_socket_wrapper.cc",
       "http/http_proxy_client_socket_wrapper.h",
       "http/http_proxy_connect_job.cc",
@@ -3058,6 +3056,7 @@
       "third_party/quic/core/quic_epoll_connection_helper.h",
       "third_party/quic/core/quic_packet_reader.cc",
       "third_party/quic/core/quic_packet_reader.h",
+      "third_party/quic/platform/api/quic_default_proof_providers.h",
       "third_party/quic/platform/impl/batch_writer/quic_batch_writer_base.cc",
       "third_party/quic/platform/impl/batch_writer/quic_batch_writer_base.h",
       "third_party/quic/platform/impl/batch_writer/quic_batch_writer_buffer.cc",
@@ -3066,6 +3065,8 @@
       "third_party/quic/platform/impl/batch_writer/quic_gso_batch_writer.h",
       "third_party/quic/platform/impl/batch_writer/quic_sendmmsg_batch_writer.cc",
       "third_party/quic/platform/impl/batch_writer/quic_sendmmsg_batch_writer.h",
+      "third_party/quic/platform/impl/quic_default_proof_providers_impl.cc",
+      "third_party/quic/platform/impl/quic_default_proof_providers_impl.h",
       "third_party/quic/platform/impl/quic_epoll_clock.cc",
       "third_party/quic/platform/impl/quic_epoll_clock.h",
       "third_party/quic/platform/impl/quic_linux_socket_utils.cc",
diff --git a/net/cert/caching_cert_verifier.cc b/net/cert/caching_cert_verifier.cc
index 3cafb988..b03ed53 100644
--- a/net/cert/caching_cert_verifier.cc
+++ b/net/cert/caching_cert_verifier.cc
@@ -117,7 +117,7 @@
   // time.
   return now.verification_time >= expiration.verification_time &&
          now.verification_time < expiration.expiration_time;
-};
+}
 
 void CachingCertVerifier::OnRequestFinished(uint32_t config_id,
                                             const RequestParams& params,
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index bfd5864..182eea7 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -333,7 +333,7 @@
 #else
   return false;
 #endif
-};
+}
 
 // Sets the "has_*" boolean members in |verify_result| that correspond with
 // the the presence of |hash| somewhere in the certificate chain (excluding the
diff --git a/net/cert/internal/signature_algorithm.h b/net/cert/internal/signature_algorithm.h
index 9c691ec..5892d8a 100644
--- a/net/cert/internal/signature_algorithm.h
+++ b/net/cert/internal/signature_algorithm.h
@@ -60,7 +60,7 @@
 class NET_EXPORT SignatureAlgorithmParameters {
  public:
   SignatureAlgorithmParameters() {}
-  virtual ~SignatureAlgorithmParameters(){};
+  virtual ~SignatureAlgorithmParameters() {}
 
  private:
   DISALLOW_COPY_AND_ASSIGN(SignatureAlgorithmParameters);
diff --git a/net/dns/dns_socket_pool.cc b/net/dns/dns_socket_pool.cc
index 4732a0c..5922d39 100644
--- a/net/dns/dns_socket_pool.cc
+++ b/net/dns/dns_socket_pool.cc
@@ -129,7 +129,7 @@
  public:
   DefaultDnsSocketPool(ClientSocketFactory* factory,
                        const RandIntCallback& rand_int_callback)
-      : DnsSocketPool(factory, rand_int_callback){};
+      : DnsSocketPool(factory, rand_int_callback) {}
 
   ~DefaultDnsSocketPool() override;
 
diff --git a/net/http/http_network_session.cc b/net/http/http_network_session.cc
index 89c2c7c..728b827 100644
--- a/net/http/http_network_session.cc
+++ b/net/http/http_network_session.cc
@@ -313,7 +313,7 @@
       socks_proxy);
 }
 
-HttpProxyClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPLikeProxy(
+TransportClientSocketPool* HttpNetworkSession::GetSocketPoolForHTTPLikeProxy(
     SocketPoolType pool_type,
     const ProxyServer& http_proxy) {
   return GetSocketPoolManager(pool_type)->GetSocketPoolForHTTPLikeProxy(
diff --git a/net/http/http_network_session.h b/net/http/http_network_session.h
index b2e9bfa8..fc7bcd1 100644
--- a/net/http/http_network_session.h
+++ b/net/http/http_network_session.h
@@ -60,7 +60,6 @@
 class HostResolver;
 class HttpAuthHandlerFactory;
 class HttpNetworkSessionPeer;
-class HttpProxyClientSocketPool;
 class HttpResponseBodyDrainer;
 class HttpServerProperties;
 class NetLog;
@@ -296,7 +295,7 @@
   TransportClientSocketPool* GetSocketPoolForSOCKSProxy(
       SocketPoolType pool_type,
       const ProxyServer& socks_proxy);
-  HttpProxyClientSocketPool* GetSocketPoolForHTTPLikeProxy(
+  TransportClientSocketPool* GetSocketPoolForHTTPLikeProxy(
       SocketPoolType pool_type,
       const ProxyServer& http_proxy);
   TransportClientSocketPool* GetSocketPoolForSSLWithProxy(
diff --git a/net/http/http_network_session_peer.cc b/net/http/http_network_session_peer.cc
index 96d69753..c9440d6 100644
--- a/net/http/http_network_session_peer.cc
+++ b/net/http/http_network_session_peer.cc
@@ -4,7 +4,6 @@
 
 #include "net/http/http_network_session_peer.h"
 
-#include "net/http/http_proxy_client_socket_pool.h"
 #include "net/proxy_resolution/proxy_resolution_service.h"
 #include "net/socket/client_socket_pool_manager.h"
 #include "net/socket/transport_client_socket_pool.h"
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index 2f4759c..da7dc7c 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -43,7 +43,6 @@
 #include "net/http/http_chunked_decoder.h"
 #include "net/http/http_network_session.h"
 #include "net/http/http_proxy_client_socket.h"
-#include "net/http/http_proxy_client_socket_pool.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_request_info.h"
 #include "net/http/http_response_headers.h"
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
index adcab5f..1d1bd75 100644
--- a/net/http/http_network_transaction_unittest.cc
+++ b/net/http/http_network_transaction_unittest.cc
@@ -679,8 +679,6 @@
 
 typedef CaptureGroupNameSocketPool<TransportClientSocketPool>
 CaptureGroupNameTransportSocketPool;
-typedef CaptureGroupNameSocketPool<HttpProxyClientSocketPool>
-CaptureGroupNameHttpProxySocketPool;
 
 template <typename ParentPool>
 CaptureGroupNameSocketPool<ParentPool>::CaptureGroupNameSocketPool(
@@ -696,18 +694,13 @@
                  NULL,
                  NULL,
                  NULL,
+                 NULL,
                  "",
                  NULL,
                  NULL,
                  NULL,
                  NULL) {}
 
-template <>
-CaptureGroupNameHttpProxySocketPool::CaptureGroupNameSocketPool(
-    HostResolver* /* host_resolver */,
-    CertVerifier* /* cert_verifier */)
-    : HttpProxyClientSocketPool(0, 0, NULL, NULL, NULL, NULL, NULL) {}
-
 //-----------------------------------------------------------------------------
 
 // Helper functions for validating that AuthChallengeInfo's are correctly
@@ -11178,8 +11171,8 @@
 
     ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
                              HostPortPair("http_proxy", 80));
-    CaptureGroupNameHttpProxySocketPool* http_proxy_pool =
-        new CaptureGroupNameHttpProxySocketPool(NULL, NULL);
+    CaptureGroupNameTransportSocketPool* http_proxy_pool =
+        new CaptureGroupNameTransportSocketPool(NULL, NULL);
     CaptureGroupNameTransportSocketPool* ssl_conn_pool =
         new CaptureGroupNameTransportSocketPool(NULL, NULL);
     auto mock_pool_manager = std::make_unique<MockClientSocketPoolManager>();
@@ -14285,7 +14278,8 @@
       50,  // Max sockets for pool
       1,   // Max sockets per group
       session_deps_.socket_factory.get(), session_deps_.host_resolver.get(),
-      session_deps_.cert_verifier.get(), session_deps_.channel_id_service.get(),
+      nullptr /* proxy_delegate */, session_deps_.cert_verifier.get(),
+      session_deps_.channel_id_service.get(),
       session_deps_.transport_security_state.get(),
       session_deps_.cert_transparency_verifier.get(),
       session_deps_.ct_policy_enforcer.get(),
diff --git a/net/http/http_proxy_client_socket_pool.cc b/net/http/http_proxy_client_socket_pool.cc
deleted file mode 100644
index e5db4878..0000000
--- a/net/http/http_proxy_client_socket_pool.cc
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (c) 2012 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 "net/http/http_proxy_client_socket_pool.h"
-
-#include "net/socket/client_socket_pool_base.h"
-#include "net/socket/ssl_client_socket.h"
-#include "net/socket/ssl_connect_job.h"
-#include "net/socket/transport_client_socket_pool.h"
-
-namespace net {
-
-HttpProxyClientSocketPool::HttpProxyConnectJobFactory::
-    HttpProxyConnectJobFactory(
-        TransportClientSocketPool* transport_pool,
-        TransportClientSocketPool* ssl_pool,
-        ProxyDelegate* proxy_delegate,
-        NetworkQualityEstimator* network_quality_estimator,
-        NetLog* net_log)
-    : transport_pool_(transport_pool),
-      ssl_pool_(ssl_pool),
-      proxy_delegate_(proxy_delegate),
-      network_quality_estimator_(network_quality_estimator),
-      net_log_(net_log) {}
-
-std::unique_ptr<ConnectJob>
-HttpProxyClientSocketPool::HttpProxyConnectJobFactory::NewConnectJob(
-    const std::string& group_name,
-    const PoolBase::Request& request,
-    ConnectJob::Delegate* delegate) const {
-  return std::make_unique<HttpProxyConnectJob>(
-      group_name, request.priority(), request.socket_tag(),
-      request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED,
-      request.params(), proxy_delegate_, transport_pool_, ssl_pool_,
-      network_quality_estimator_, delegate, net_log_);
-}
-
-HttpProxyClientSocketPool::HttpProxyClientSocketPool(
-    int max_sockets,
-    int max_sockets_per_group,
-    TransportClientSocketPool* transport_pool,
-    TransportClientSocketPool* ssl_pool,
-    ProxyDelegate* proxy_delegate,
-    NetworkQualityEstimator* network_quality_estimator,
-    NetLog* net_log)
-    : transport_pool_(transport_pool),
-      ssl_pool_(ssl_pool),
-      base_(this,
-            max_sockets,
-            max_sockets_per_group,
-            ClientSocketPool::unused_idle_socket_timeout(),
-            ClientSocketPool::used_idle_socket_timeout(),
-            new HttpProxyConnectJobFactory(transport_pool,
-                                           ssl_pool,
-                                           proxy_delegate,
-                                           network_quality_estimator,
-                                           net_log)) {
-  // We should always have a |transport_pool_| except in unit tests.
-  if (transport_pool_)
-    base_.AddLowerLayeredPool(transport_pool_);
-  if (ssl_pool_)
-    base_.AddLowerLayeredPool(ssl_pool_);
-}
-
-HttpProxyClientSocketPool::~HttpProxyClientSocketPool() = default;
-
-int HttpProxyClientSocketPool::RequestSocket(const std::string& group_name,
-                                             const void* socket_params,
-                                             RequestPriority priority,
-                                             const SocketTag& socket_tag,
-                                             RespectLimits respect_limits,
-                                             ClientSocketHandle* handle,
-                                             CompletionOnceCallback callback,
-                                             const NetLogWithSource& net_log) {
-  const scoped_refptr<HttpProxySocketParams>* casted_socket_params =
-      static_cast<const scoped_refptr<HttpProxySocketParams>*>(socket_params);
-
-  return base_.RequestSocket(group_name, *casted_socket_params, priority,
-                             socket_tag, respect_limits, handle,
-                             std::move(callback), net_log);
-}
-
-void HttpProxyClientSocketPool::RequestSockets(
-    const std::string& group_name,
-    const void* params,
-    int num_sockets,
-    const NetLogWithSource& net_log) {
-  const scoped_refptr<HttpProxySocketParams>* casted_params =
-      static_cast<const scoped_refptr<HttpProxySocketParams>*>(params);
-
-  base_.RequestSockets(group_name, *casted_params, num_sockets, net_log);
-}
-
-void HttpProxyClientSocketPool::CancelRequest(
-    const std::string& group_name,
-    ClientSocketHandle* handle) {
-  base_.CancelRequest(group_name, handle);
-}
-
-void HttpProxyClientSocketPool::SetPriority(const std::string& group_name,
-                                            ClientSocketHandle* handle,
-                                            RequestPriority priority) {
-  base_.SetPriority(group_name, handle, priority);
-}
-
-void HttpProxyClientSocketPool::ReleaseSocket(
-    const std::string& group_name,
-    std::unique_ptr<StreamSocket> socket,
-    int id) {
-  base_.ReleaseSocket(group_name, std::move(socket), id);
-}
-
-void HttpProxyClientSocketPool::FlushWithError(int error) {
-  base_.FlushWithError(error);
-}
-
-void HttpProxyClientSocketPool::CloseIdleSockets() {
-  base_.CloseIdleSockets();
-}
-
-void HttpProxyClientSocketPool::CloseIdleSocketsInGroup(
-    const std::string& group_name) {
-  base_.CloseIdleSocketsInGroup(group_name);
-}
-
-int HttpProxyClientSocketPool::IdleSocketCount() const {
-  return base_.idle_socket_count();
-}
-
-int HttpProxyClientSocketPool::IdleSocketCountInGroup(
-    const std::string& group_name) const {
-  return base_.IdleSocketCountInGroup(group_name);
-}
-
-LoadState HttpProxyClientSocketPool::GetLoadState(
-    const std::string& group_name, const ClientSocketHandle* handle) const {
-  return base_.GetLoadState(group_name, handle);
-}
-
-std::unique_ptr<base::DictionaryValue>
-HttpProxyClientSocketPool::GetInfoAsValue(const std::string& name,
-                                          const std::string& type,
-                                          bool include_nested_pools) const {
-  std::unique_ptr<base::DictionaryValue> dict(base_.GetInfoAsValue(name, type));
-  if (include_nested_pools) {
-    auto list = std::make_unique<base::ListValue>();
-    if (transport_pool_) {
-      list->Append(transport_pool_->GetInfoAsValue("transport_socket_pool",
-                                                   "transport_socket_pool",
-                                                   true));
-    }
-    if (ssl_pool_) {
-      list->Append(ssl_pool_->GetInfoAsValue("ssl_socket_pool",
-                                             "ssl_socket_pool",
-                                             true));
-    }
-    dict->Set("nested_pools", std::move(list));
-  }
-  return dict;
-}
-
-bool HttpProxyClientSocketPool::IsStalled() const {
-  return base_.IsStalled();
-}
-
-void HttpProxyClientSocketPool::AddHigherLayeredPool(
-    HigherLayeredPool* higher_pool) {
-  base_.AddHigherLayeredPool(higher_pool);
-}
-
-void HttpProxyClientSocketPool::RemoveHigherLayeredPool(
-    HigherLayeredPool* higher_pool) {
-  base_.RemoveHigherLayeredPool(higher_pool);
-}
-
-bool HttpProxyClientSocketPool::CloseOneIdleConnection() {
-  if (base_.CloseOneIdleSocket())
-    return true;
-  return base_.CloseOneIdleConnectionInHigherLayeredPool();
-}
-
-}  // namespace net
diff --git a/net/http/http_proxy_client_socket_pool.h b/net/http/http_proxy_client_socket_pool.h
deleted file mode 100644
index 2539e76..0000000
--- a/net/http/http_proxy_client_socket_pool.h
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2012 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 NET_HTTP_HTTP_PROXY_CLIENT_SOCKET_POOL_H_
-#define NET_HTTP_HTTP_PROXY_CLIENT_SOCKET_POOL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "net/base/completion_once_callback.h"
-#include "net/base/net_export.h"
-#include "net/http/http_proxy_connect_job.h"
-#include "net/socket/client_socket_pool.h"
-#include "net/socket/client_socket_pool_base.h"
-
-namespace net {
-
-class NetLog;
-class NetworkQualityEstimator;
-class ProxyDelegate;
-class TransportClientSocketPool;
-
-class NET_EXPORT_PRIVATE HttpProxyClientSocketPool
-    : public ClientSocketPool,
-      public HigherLayeredPool {
- public:
-  typedef HttpProxySocketParams SocketParams;
-
-  HttpProxyClientSocketPool(int max_sockets,
-                            int max_sockets_per_group,
-                            TransportClientSocketPool* transport_pool,
-                            TransportClientSocketPool* ssl_pool,
-                            ProxyDelegate* proxy_delegate,
-                            NetworkQualityEstimator* network_quality_estimator,
-                            NetLog* net_log);
-
-  ~HttpProxyClientSocketPool() override;
-
-  // ClientSocketPool implementation.
-  int RequestSocket(const std::string& group_name,
-                    const void* connect_params,
-                    RequestPriority priority,
-                    const SocketTag& socket_tag,
-                    RespectLimits respect_limits,
-                    ClientSocketHandle* handle,
-                    CompletionOnceCallback callback,
-                    const NetLogWithSource& net_log) override;
-
-  void RequestSockets(const std::string& group_name,
-                      const void* params,
-                      int num_sockets,
-                      const NetLogWithSource& net_log) override;
-
-  void SetPriority(const std::string& group_name,
-                   ClientSocketHandle* handle,
-                   RequestPriority priority) override;
-
-  void CancelRequest(const std::string& group_name,
-                     ClientSocketHandle* handle) override;
-
-  void ReleaseSocket(const std::string& group_name,
-                     std::unique_ptr<StreamSocket> socket,
-                     int id) override;
-
-  void FlushWithError(int error) override;
-
-  void CloseIdleSockets() override;
-
-  void CloseIdleSocketsInGroup(const std::string& group_name) override;
-
-  int IdleSocketCount() const override;
-
-  int IdleSocketCountInGroup(const std::string& group_name) const override;
-
-  LoadState GetLoadState(const std::string& group_name,
-                         const ClientSocketHandle* handle) const override;
-
-  std::unique_ptr<base::DictionaryValue> GetInfoAsValue(
-      const std::string& name,
-      const std::string& type,
-      bool include_nested_pools) const override;
-
-  // LowerLayeredPool implementation.
-  bool IsStalled() const override;
-
-  void AddHigherLayeredPool(HigherLayeredPool* higher_pool) override;
-
-  void RemoveHigherLayeredPool(HigherLayeredPool* higher_pool) override;
-
-  // HigherLayeredPool implementation.
-  bool CloseOneIdleConnection() override;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(HttpProxyClientSocketPoolTest,
-                           ProxyPoolTimeoutWithConnectionProperty);
-
-  typedef ClientSocketPoolBase<HttpProxySocketParams> PoolBase;
-
-  class NET_EXPORT_PRIVATE HttpProxyConnectJobFactory
-      : public PoolBase::ConnectJobFactory {
-   public:
-    HttpProxyConnectJobFactory(
-        TransportClientSocketPool* transport_pool,
-        TransportClientSocketPool* ssl_pool,
-        ProxyDelegate* proxy_delegate,
-        NetworkQualityEstimator* network_quality_estimator,
-        NetLog* net_log);
-
-    // ClientSocketPoolBase::ConnectJobFactory methods.
-    std::unique_ptr<ConnectJob> NewConnectJob(
-        const std::string& group_name,
-        const PoolBase::Request& request,
-        ConnectJob::Delegate* delegate) const override;
-
-   private:
-    FRIEND_TEST_ALL_PREFIXES(HttpProxyClientSocketPoolTest,
-                             ProxyPoolTimeoutWithConnectionProperty);
-
-    TransportClientSocketPool* const transport_pool_;
-    TransportClientSocketPool* const ssl_pool_;
-    ProxyDelegate* const proxy_delegate_;
-    NetworkQualityEstimator* const network_quality_estimator_;
-
-    NetLog* net_log_;
-
-    DISALLOW_COPY_AND_ASSIGN(HttpProxyConnectJobFactory);
-  };
-
-  TransportClientSocketPool* const transport_pool_;
-  TransportClientSocketPool* const ssl_pool_;
-  PoolBase base_;
-
-  DISALLOW_COPY_AND_ASSIGN(HttpProxyClientSocketPool);
-};
-
-}  // namespace net
-
-#endif  // NET_HTTP_HTTP_PROXY_CLIENT_SOCKET_POOL_H_
diff --git a/net/http/http_proxy_client_socket_pool_unittest.cc b/net/http/http_proxy_client_socket_pool_unittest.cc
index f9cc540..ae8b45c0 100644
--- a/net/http/http_proxy_client_socket_pool_unittest.cc
+++ b/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -2,7 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "net/http/http_proxy_client_socket_pool.h"
 
 #include <map>
 #include <string>
@@ -21,6 +20,7 @@
 #include "net/base/test_proxy_delegate.h"
 #include "net/http/http_network_session.h"
 #include "net/http/http_proxy_client_socket.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_response_headers.h"
 #include "net/log/net_log_with_source.h"
 #include "net/nqe/network_quality_estimator_test_util.h"
@@ -74,6 +74,7 @@
                                kMaxSocketsPerGroup,
                                &socket_factory_,
                                session_deps_.host_resolver.get(),
+                               nullptr /* proxy_delegate */,
                                session_deps_.cert_verifier.get(),
                                session_deps_.channel_id_service.get(),
                                session_deps_.transport_security_state.get(),
@@ -89,6 +90,7 @@
                          kMaxSocketsPerGroup,
                          &socket_factory_,
                          session_deps_.host_resolver.get(),
+                         nullptr /* proxy_delegate */,
                          session_deps_.cert_verifier.get(),
                          session_deps_.channel_id_service.get(),
                          session_deps_.transport_security_state.get(),
@@ -100,14 +102,26 @@
                          nullptr /* socket_performance_watcher_factory */,
                          nullptr /* network_quality_estimator */,
                          nullptr /* net_log */),
-        pool_(
-            std::make_unique<HttpProxyClientSocketPool>(kMaxSockets,
-                                                        kMaxSocketsPerGroup,
-                                                        &transport_socket_pool_,
-                                                        &ssl_socket_pool_,
-                                                        nullptr,
-                                                        &estimator_,
-                                                        nullptr)) {
+        pool_(std::make_unique<TransportClientSocketPool>(
+            kMaxSockets,
+            kMaxSocketsPerGroup,
+            &socket_factory_,
+            session_deps_.host_resolver.get(),
+            nullptr /* proxy_delegate */,
+            session_deps_.cert_verifier.get(),
+            session_deps_.channel_id_service.get(),
+            session_deps_.transport_security_state.get(),
+            session_deps_.cert_transparency_verifier.get(),
+            session_deps_.ct_policy_enforcer.get(),
+            nullptr /* ssl_client_session_cache */,
+            std::string() /* ssl_session_cache_shard */,
+            session_deps_.ssl_config_service.get(),
+            nullptr /* socket_performance_watcher_factory */,
+            &estimator_,
+            nullptr /* net_log */,
+            nullptr /* http_proxy_pool_for_ssl_pool */,
+            &transport_socket_pool_,
+            &ssl_socket_pool_)) {
     session_deps_.host_resolver->set_synchronous_mode(true);
     session_ = CreateNetworkSession();
   }
@@ -115,9 +129,20 @@
   ~HttpProxyClientSocketPoolTest() override = default;
 
   void InitPoolWithProxyDelegate(ProxyDelegate* proxy_delegate) {
-    pool_ = std::make_unique<HttpProxyClientSocketPool>(
-        kMaxSockets, kMaxSocketsPerGroup, &transport_socket_pool_,
-        &ssl_socket_pool_, proxy_delegate, &estimator_, nullptr);
+    pool_ = std::make_unique<TransportClientSocketPool>(
+        kMaxSockets, kMaxSocketsPerGroup, &socket_factory_,
+        session_deps_.host_resolver.get(), proxy_delegate,
+        session_deps_.cert_verifier.get(),
+        session_deps_.channel_id_service.get(),
+        session_deps_.transport_security_state.get(),
+        session_deps_.cert_transparency_verifier.get(),
+        session_deps_.ct_policy_enforcer.get(),
+        nullptr /* ssl_client_session_cache */,
+        std::string() /* ssl_session_cache_shard */,
+        session_deps_.ssl_config_service.get(),
+        nullptr /* socket_performance_watcher_factory */, &estimator_,
+        nullptr /* net_log */, nullptr /* http_proxy_pool_for_ssl_pool */,
+        &transport_socket_pool_, &ssl_socket_pool_);
   }
 
   void AddAuthToCache() {
@@ -153,21 +178,27 @@
 
   // Returns the a correctly constructed HttpProxyParms
   // for the HTTP or HTTPS proxy.
-  scoped_refptr<HttpProxySocketParams> CreateParams(bool tunnel) {
-    return base::MakeRefCounted<HttpProxySocketParams>(
-        CreateHttpProxyParams(), CreateHttpsProxyParams(),
-        quic::QUIC_VERSION_UNSUPPORTED, std::string(),
-        HostPortPair("www.google.com", tunnel ? 443 : 80),
-        session_->http_auth_cache(), session_->http_auth_handler_factory(),
-        session_->spdy_session_pool(), session_->quic_stream_factory(),
-        /*is_trusted_proxy=*/false, tunnel, TRAFFIC_ANNOTATION_FOR_TESTS);
+  scoped_refptr<TransportClientSocketPool::SocketParams> CreateParams(
+      bool tunnel) {
+    return TransportClientSocketPool::SocketParams::
+        CreateFromHttpProxySocketParams(
+            base::MakeRefCounted<HttpProxySocketParams>(
+                CreateHttpProxyParams(), CreateHttpsProxyParams(),
+                quic::QUIC_VERSION_UNSUPPORTED, std::string(),
+                HostPortPair("www.google.com", tunnel ? 443 : 80),
+                session_->http_auth_cache(),
+                session_->http_auth_handler_factory(),
+                session_->spdy_session_pool(), session_->quic_stream_factory(),
+                /*is_trusted_proxy=*/false, tunnel,
+                TRAFFIC_ANNOTATION_FOR_TESTS));
   }
 
-  scoped_refptr<HttpProxySocketParams> CreateTunnelParams() {
+  scoped_refptr<TransportClientSocketPool::SocketParams> CreateTunnelParams() {
     return CreateParams(true);
   }
 
-  scoped_refptr<HttpProxySocketParams> CreateNoTunnelParams() {
+  scoped_refptr<TransportClientSocketPool::SocketParams>
+  CreateNoTunnelParams() {
     return CreateParams(false);
   }
 
@@ -220,7 +251,7 @@
   SpdyTestUtil spdy_util_;
   std::unique_ptr<SSLSocketDataProvider> ssl_data_;
   std::unique_ptr<SequencedSocketData> data_;
-  std::unique_ptr<HttpProxyClientSocketPool> pool_;
+  std::unique_ptr<TransportClientSocketPool> pool_;
   ClientSocketHandle handle_;
   TestCompletionCallback callback_;
 };
diff --git a/net/http/http_proxy_client_socket_wrapper.cc b/net/http/http_proxy_client_socket_wrapper.cc
index 8ff84dd..4b3c9434 100644
--- a/net/http/http_proxy_client_socket_wrapper.cc
+++ b/net/http/http_proxy_client_socket_wrapper.cc
@@ -37,12 +37,10 @@
 namespace net {
 
 HttpProxyClientSocketWrapper::HttpProxyClientSocketWrapper(
-    const std::string& group_name,
     RequestPriority priority,
-    const SocketTag& socket_tag,
-    bool respect_limits,
     base::TimeDelta connect_timeout_duration,
     base::TimeDelta proxy_negotiation_timeout_duration,
+    const CommonConnectJobParams& common_connect_job_params,
     TransportClientSocketPool* transport_pool,
     TransportClientSocketPool* ssl_pool,
     const scoped_refptr<TransportSocketParams>& transport_params,
@@ -56,14 +54,10 @@
     QuicStreamFactory* quic_stream_factory,
     bool is_trusted_proxy,
     bool tunnel,
-    ProxyDelegate* proxy_delegate,
     const NetworkTrafficAnnotationTag& traffic_annotation,
     const NetLogWithSource& net_log)
     : next_state_(STATE_NONE),
-      group_name_(group_name),
       priority_(priority),
-      initial_socket_tag_(socket_tag),
-      respect_limits_(respect_limits),
       connect_timeout_duration_(connect_timeout_duration),
       proxy_negotiation_timeout_duration_(proxy_negotiation_timeout_duration),
       transport_pool_(transport_pool),
@@ -76,7 +70,7 @@
       spdy_session_pool_(spdy_session_pool),
       has_restarted_(false),
       tunnel_(tunnel),
-      proxy_delegate_(proxy_delegate),
+      common_connect_job_params_(common_connect_job_params),
       using_spdy_(false),
       is_trusted_proxy_(is_trusted_proxy),
       quic_stream_factory_(quic_stream_factory),
@@ -143,7 +137,7 @@
 }
 
 void HttpProxyClientSocketWrapper::SetPriority(RequestPriority priority) {
-  if (!respect_limits_) {
+  if (!common_connect_job_params_.respect_limits) {
     DCHECK_EQ(MAXIMUM_PRIORITY, priority_);
     return;
   }
@@ -500,12 +494,13 @@
   next_state_ = STATE_TCP_CONNECT_COMPLETE;
   transport_socket_handle_.reset(new ClientSocketHandle());
   return transport_socket_handle_->Init(
-      group_name_,
+      common_connect_job_params_.group_name,
       TransportClientSocketPool::SocketParams::CreateFromTransportSocketParams(
           transport_params_),
-      priority_, initial_socket_tag_,
-      respect_limits_ ? ClientSocketPool::RespectLimits::ENABLED
-                      : ClientSocketPool::RespectLimits::DISABLED,
+      priority_, common_connect_job_params_.socket_tag,
+      common_connect_job_params_.respect_limits
+          ? ClientSocketPool::RespectLimits::ENABLED
+          : ClientSocketPool::RespectLimits::DISABLED,
       base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete,
                  base::Unretained(this)),
       transport_pool_, net_log_);
@@ -541,7 +536,7 @@
                            .host_port_pair(),
                        ProxyServer::Direct(), PRIVACY_MODE_DISABLED,
                        SpdySessionKey::IsProxySession::kTrue,
-                       initial_socket_tag_);
+                       common_connect_job_params_.socket_tag);
     if (spdy_session_pool_->FindAvailableSession(
             key, /* enable_ip_based_pooling = */ true,
             /* is_websocket = */ false, net_log_)) {
@@ -553,10 +548,11 @@
   next_state_ = STATE_SSL_CONNECT_COMPLETE;
   transport_socket_handle_.reset(new ClientSocketHandle());
   return transport_socket_handle_->Init(
-      group_name_,
+      common_connect_job_params_.group_name,
       TransportClientSocketPool::SocketParams::CreateFromSSLSocketParams(
           ssl_params_),
-      priority_, initial_socket_tag_, respect_limits_,
+      priority_, common_connect_job_params_.socket_tag,
+      common_connect_job_params_.respect_limits,
       base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete,
                  base::Unretained(this)),
       ssl_pool_, net_log_);
@@ -638,8 +634,8 @@
           ProxyServer(GetProxyServerScheme(),
                       GetDestination().host_port_pair()),
           http_auth_controller_.get(), tunnel_, using_spdy_,
-          negotiated_protocol_, proxy_delegate_, ssl_params_.get() != nullptr,
-          traffic_annotation_);
+          negotiated_protocol_, common_connect_job_params_.proxy_delegate,
+          ssl_params_.get() != nullptr, traffic_annotation_);
   return transport_socket_->Connect(base::Bind(
       &HttpProxyClientSocketWrapper::OnIOComplete, base::Unretained(this)));
 }
@@ -658,7 +654,8 @@
   SpdySessionKey key(
       ssl_params_->GetDirectConnectionParams()->destination().host_port_pair(),
       ProxyServer::Direct(), PRIVACY_MODE_DISABLED,
-      SpdySessionKey::IsProxySession::kTrue, initial_socket_tag_);
+      SpdySessionKey::IsProxySession::kTrue,
+      common_connect_job_params_.socket_tag);
   base::WeakPtr<SpdySession> spdy_session =
       spdy_session_pool_->FindAvailableSession(
           key, /* enable_ip_based_pooling = */ true,
@@ -681,8 +678,8 @@
   spdy_stream_request_ = std::make_unique<SpdyStreamRequest>();
   return spdy_stream_request_->StartRequest(
       SPDY_BIDIRECTIONAL_STREAM, spdy_session,
-      GURL("https://" + endpoint_.ToString()), priority_, initial_socket_tag_,
-      spdy_session->net_log(),
+      GURL("https://" + endpoint_.ToString()), priority_,
+      common_connect_job_params_.socket_tag, spdy_session->net_log(),
       base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete,
                  base::Unretained(this)),
       traffic_annotation_);
@@ -715,7 +712,8 @@
       std::make_unique<QuicStreamRequest>(quic_stream_factory_);
   return quic_stream_request_->Request(
       proxy_server, quic_version_, ssl_params_->privacy_mode(), priority_,
-      initial_socket_tag_, ssl_params_->ssl_config().GetCertVerifyFlags(),
+      common_connect_job_params_.socket_tag,
+      ssl_params_->ssl_config().GetCertVerifyFlags(),
       GURL("https://" + proxy_server.ToString()), net_log_,
       &quic_net_error_details_,
       /*failed_on_default_network_callback=*/CompletionOnceCallback(),
diff --git a/net/http/http_proxy_client_socket_wrapper.h b/net/http/http_proxy_client_socket_wrapper.h
index eb6ad4cd..4b83bde 100644
--- a/net/http/http_proxy_client_socket_wrapper.h
+++ b/net/http/http_proxy_client_socket_wrapper.h
@@ -23,6 +23,7 @@
 #include "net/http/proxy_client_socket.h"
 #include "net/log/net_log_with_source.h"
 #include "net/quic/quic_stream_factory.h"
+#include "net/socket/connect_job.h"
 #include "net/socket/next_proto.h"
 #include "net/socket/ssl_client_socket.h"
 #include "net/spdy/spdy_session.h"
@@ -35,7 +36,6 @@
 class HttpAuthCache;
 class HttpResponseInfo;
 class IOBuffer;
-class ProxyDelegate;
 class SpdySessionPool;
 class SSLSocketParams;
 class TransportClientSocketPool;
@@ -56,12 +56,10 @@
     : public ProxyClientSocket {
  public:
   HttpProxyClientSocketWrapper(
-      const std::string& group_name,
       RequestPriority priority,
-      const SocketTag& socket_tag,
-      bool respect_limits,
       base::TimeDelta connect_timeout_duration,
       base::TimeDelta proxy_negotiation_timeout_duration,
+      const CommonConnectJobParams& common_connect_job_params,
       TransportClientSocketPool* transport_pool,
       TransportClientSocketPool* ssl_pool,
       const scoped_refptr<TransportSocketParams>& transport_params,
@@ -75,7 +73,6 @@
       QuicStreamFactory* quic_stream_factory,
       bool is_trusted_proxy,
       bool tunnel,
-      ProxyDelegate* proxy_delegate,
       const NetworkTrafficAnnotationTag& traffic_annotation,
       const NetLogWithSource& net_log);
 
@@ -187,10 +184,7 @@
 
   State next_state_;
 
-  const std::string group_name_;
   RequestPriority priority_;
-  const SocketTag initial_socket_tag_;
-  bool respect_limits_;
   const base::TimeDelta connect_timeout_duration_;
   const base::TimeDelta proxy_negotiation_timeout_duration_;
 
@@ -207,7 +201,8 @@
 
   bool has_restarted_;
   const bool tunnel_;
-  ProxyDelegate* const proxy_delegate_;
+
+  const CommonConnectJobParams common_connect_job_params_;
 
   bool using_spdy_;
   bool is_trusted_proxy_;
diff --git a/net/http/http_proxy_client_socket_wrapper_unittest.cc b/net/http/http_proxy_client_socket_wrapper_unittest.cc
index 93828a5..3357090 100644
--- a/net/http/http_proxy_client_socket_wrapper_unittest.cc
+++ b/net/http/http_proxy_client_socket_wrapper_unittest.cc
@@ -14,12 +14,14 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_auth_cache.h"
 #include "net/http/http_auth_handler_factory.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_server_properties_impl.h"
 #include "net/http/transport_security_state.h"
 #include "net/quic/mock_crypto_client_stream_factory.h"
 #include "net/quic/mock_quic_data.h"
 #include "net/quic/quic_http_utils.h"
 #include "net/quic/quic_test_packet_maker.h"
+#include "net/socket/connect_job.h"
 #include "net/socket/socket_tag.h"
 #include "net/socket/socket_test_util.h"
 #include "net/socket/socks_connect_job.h"
@@ -287,17 +289,25 @@
   transport_params = nullptr;
 
   client_socket_wrapper_ = std::make_unique<HttpProxyClientSocketWrapper>(
-      /*group_name=*/std::string(), /*requiest_priority=*/DEFAULT_PRIORITY,
-      /*socket_tag=*/SocketTag(),
-      /*respect_limits=*/true,
+      /*request_priority=*/DEFAULT_PRIORITY,
       /*connect_timeout_duration=*/base::TimeDelta::FromHours(1),
       /*proxy_negotiation_timeout_duration=*/base::TimeDelta::FromHours(1),
+      CommonConnectJobParams(
+          "group_name",
+          /*socket_tag=*/SocketTag(),
+          /*respect_limits=*/true,
+          /*client_socket_factory=*/nullptr,
+          /*host_resolver=*/nullptr,
+          /*proxy_delegate=*/nullptr, SSLClientSocketContext(),
+          /*socket_performance_watcher_factory=*/nullptr,
+          /*network_quality_estimator=*/nullptr, net_log_.net_log(),
+          /*websocket_endpoint_lock_manager=*/nullptr),
       /*transport_pool=*/nullptr, /*ssl_pool=*/nullptr,
       /*transport_params=*/nullptr, ssl_params, quic_version_, kUserAgent,
       endpoint_host_port_, &http_auth_cache_, http_auth_handler_factory_.get(),
       /*spdy_session_pool=*/nullptr, quic_stream_factory_.get(),
-      /*is_trusted_proxy=*/false, /*tunnel=*/true, /*proxy_delegate=*/nullptr,
-      TRAFFIC_ANNOTATION_FOR_TESTS, net_log_);
+      /*is_trusted_proxy=*/false, /*tunnel=*/true, TRAFFIC_ANNOTATION_FOR_TESTS,
+      net_log_);
 
   TestCompletionCallback callback;
   client_socket_wrapper_->Connect(callback.callback());
@@ -345,17 +355,25 @@
   SocketTag tag(getuid(), 0x87654321);
 
   client_socket_wrapper_ = std::make_unique<HttpProxyClientSocketWrapper>(
-      /*group_name=*/std::string(), /*requiest_priority=*/DEFAULT_PRIORITY,
-      /*socket_tag=*/tag,
-      /*respect_limits=*/true,
+      /*request_priority=*/DEFAULT_PRIORITY,
       /*connect_timeout_duration=*/base::TimeDelta::FromHours(1),
       /*proxy_negotiation_timeout_duration=*/base::TimeDelta::FromHours(1),
+      CommonConnectJobParams(
+          /*group_name=*/"group_name",
+          /*socket_tag=*/tag,
+          /*respect_limits=*/true,
+          /*client_socket_factory=*/nullptr,
+          /*host_resolver=*/nullptr,
+          /*proxy_delegate=*/nullptr, SSLClientSocketContext(),
+          /*socket_performance_watcher_factory=*/nullptr,
+          /*network_quality_estimator=*/nullptr, net_log_.net_log(),
+          /*websocket_endpoint_lock_manager=*/nullptr),
       /*transport_pool=*/nullptr, /*ssl_pool=*/nullptr,
       /*transport_params=*/nullptr, ssl_params, quic_version_, kUserAgent,
       endpoint_host_port_, &http_auth_cache_, http_auth_handler_factory_.get(),
       /*spdy_session_pool=*/nullptr, quic_stream_factory_.get(),
-      /*is_trusted_proxy=*/false, /*tunnel=*/true, /*proxy_delegate=*/nullptr,
-      TRAFFIC_ANNOTATION_FOR_TESTS, net_log_);
+      /*is_trusted_proxy=*/false, /*tunnel=*/true, TRAFFIC_ANNOTATION_FOR_TESTS,
+      net_log_);
 
   TestCompletionCallback callback;
   client_socket_wrapper_->Connect(callback.callback());
diff --git a/net/http/http_proxy_connect_job.cc b/net/http/http_proxy_connect_job.cc
index 4b42f1f..9861fe36 100644
--- a/net/http/http_proxy_connect_job.cc
+++ b/net/http/http_proxy_connect_job.cc
@@ -162,33 +162,26 @@
 HttpProxySocketParams::~HttpProxySocketParams() = default;
 
 HttpProxyConnectJob::HttpProxyConnectJob(
-    const std::string& group_name,
     RequestPriority priority,
-    const SocketTag& socket_tag,
-    bool respect_limits,
+    const CommonConnectJobParams& common_connect_job_params,
     const scoped_refptr<HttpProxySocketParams>& params,
-    ProxyDelegate* proxy_delegate,
     TransportClientSocketPool* transport_pool,
     TransportClientSocketPool* ssl_pool,
-    NetworkQualityEstimator* network_quality_estimator,
-    Delegate* delegate,
-    NetLog* net_log)
+    Delegate* delegate)
     : ConnectJob(
-          group_name,
-          base::TimeDelta() /* The socket takes care of timeouts */,
           priority,
-          socket_tag,
-          respect_limits,
+          base::TimeDelta() /* The socket takes care of timeouts */,
+          common_connect_job_params,
           delegate,
-          NetLogWithSource::Make(net_log,
+          NetLogWithSource::Make(common_connect_job_params.net_log,
                                  NetLogSourceType::HTTP_PROXY_CONNECT_JOB)),
       client_socket_(std::make_unique<HttpProxyClientSocketWrapper>(
-          group_name,
           priority,
-          socket_tag,
-          respect_limits,
-          ConnectionTimeout(*params, network_quality_estimator),
+          ConnectionTimeout(
+              *params,
+              common_connect_job_params.network_quality_estimator),
           base::TimeDelta::FromSeconds(kHttpProxyConnectJobTimeoutInSeconds),
+          common_connect_job_params,
           transport_pool,
           ssl_pool,
           params->transport_params(),
@@ -202,7 +195,6 @@
           params->quic_stream_factory(),
           params->is_trusted_proxy(),
           params->tunnel(),
-          proxy_delegate,
           params->traffic_annotation(),
           this->net_log())) {}
 
@@ -213,9 +205,11 @@
 }
 
 bool HttpProxyConnectJob::HasEstablishedConnection() const {
+  // Returning true prevents the socket pool this belongs to from using backup
+  // jobs.
   // TODO(https://crbug.com/472729): Implement this, as nested pools are
   // removed.
-  return false;
+  return true;
 }
 
 void HttpProxyConnectJob::GetAdditionalErrorState(ClientSocketHandle* handle) {
diff --git a/net/http/http_proxy_connect_job.h b/net/http/http_proxy_connect_job.h
index 80d3b6e3..099d209 100644
--- a/net/http/http_proxy_connect_job.h
+++ b/net/http/http_proxy_connect_job.h
@@ -25,9 +25,7 @@
 class HttpAuthCache;
 class HttpAuthHandlerFactory;
 class HttpProxyClientSocketWrapper;
-class NetLog;
 class NetworkQualityEstimator;
-class ProxyDelegate;
 class SpdySessionPool;
 class SSLSocketParams;
 class TransportClientSocketPool;
@@ -103,17 +101,12 @@
 // server after connecting the underlying transport socket.
 class NET_EXPORT_PRIVATE HttpProxyConnectJob : public ConnectJob {
  public:
-  HttpProxyConnectJob(const std::string& group_name,
-                      RequestPriority priority,
-                      const SocketTag& socket_tag,
-                      bool respect_limits,
+  HttpProxyConnectJob(RequestPriority priority,
+                      const CommonConnectJobParams& common_connect_job_params,
                       const scoped_refptr<HttpProxySocketParams>& params,
-                      ProxyDelegate* proxy_delegate,
                       TransportClientSocketPool* transport_pool,
                       TransportClientSocketPool* ssl_pool,
-                      NetworkQualityEstimator* network_quality_estimator,
-                      Delegate* delegate,
-                      NetLog* net_log);
+                      Delegate* delegate);
   ~HttpProxyConnectJob() override;
 
   // ConnectJob methods.
diff --git a/net/http/http_proxy_connect_job_unittest.cc b/net/http/http_proxy_connect_job_unittest.cc
index 7a149467..2a0dba93 100644
--- a/net/http/http_proxy_connect_job_unittest.cc
+++ b/net/http/http_proxy_connect_job_unittest.cc
@@ -26,6 +26,7 @@
 #include "net/socket/connect_job_test_util.h"
 #include "net/socket/socket_test_util.h"
 #include "net/socket/socks_connect_job.h"
+#include "net/socket/ssl_client_socket.h"
 #include "net/socket/ssl_connect_job.h"
 #include "net/socket/transport_client_socket_pool.h"
 #include "net/socket/transport_connect_job.h"
@@ -56,6 +57,7 @@
                                6 /* max_sockets_pre_group */,
                                &socket_factory_,
                                session_deps_.host_resolver.get(),
+                               nullptr /* proxy_delegate */,
                                session_deps_.cert_verifier.get(),
                                session_deps_.channel_id_service.get(),
                                session_deps_.transport_security_state.get(),
@@ -71,6 +73,7 @@
                          6 /* max_sockets_pre_group */,
                          &socket_factory_,
                          session_deps_.host_resolver.get(),
+                         nullptr /* proxy_delegate */,
                          session_deps_.cert_verifier.get(),
                          session_deps_.channel_id_service.get(),
                          session_deps_.transport_security_state.get(),
@@ -172,10 +175,24 @@
       ConnectJob::Delegate* delegate,
       RequestPriority priority) {
     return std::make_unique<HttpProxyConnectJob>(
-        "group_name", priority, SocketTag(), true /* respect_limits */,
-        std::move(http_proxy_socket_params), proxy_delegate_.get(),
-        &transport_socket_pool_, &ssl_socket_pool_, &network_quality_estimator_,
-        delegate, nullptr /* net_log */);
+        priority,
+        CommonConnectJobParams(
+            "group_name", SocketTag(), true /* respect_limits */,
+            &socket_factory_, session_deps_.host_resolver.get(),
+            proxy_delegate_.get(),
+            SSLClientSocketContext(
+                session_deps_.cert_verifier.get(),
+                session_deps_.channel_id_service.get(),
+                session_deps_.transport_security_state.get(),
+                session_deps_.cert_transparency_verifier.get(),
+                session_deps_.ct_policy_enforcer.get(),
+                nullptr /* ssl_session_cache_arg */,
+                std::string() /* ssl_session_cache_shart_arg */),
+            nullptr /* socket_performance_watcher_factory */,
+            &network_quality_estimator_, nullptr /* net_log */,
+            nullptr /* websocket_endpoint_lock_manager */),
+        std::move(http_proxy_socket_params), &transport_socket_pool_,
+        &ssl_socket_pool_, delegate);
   }
 
   void InitProxyDelegate() {
diff --git a/net/http/http_stream_factory_job.cc b/net/http/http_stream_factory_job.cc
index eb64d4e..aeded63 100644
--- a/net/http/http_stream_factory_job.cc
+++ b/net/http/http_stream_factory_job.cc
@@ -30,7 +30,6 @@
 #include "net/http/http_basic_stream.h"
 #include "net/http/http_network_session.h"
 #include "net/http/http_proxy_client_socket.h"
-#include "net/http/http_proxy_client_socket_pool.h"
 #include "net/http/http_request_info.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/http_stream_factory.h"
diff --git a/net/http/http_stream_factory_unittest.cc b/net/http/http_stream_factory_unittest.cc
index 84b3685c..3bb6fc39 100644
--- a/net/http/http_stream_factory_unittest.cc
+++ b/net/http/http_stream_factory_unittest.cc
@@ -34,6 +34,7 @@
 #include "net/http/http_network_session.h"
 #include "net/http/http_network_session_peer.h"
 #include "net/http/http_network_transaction.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_request_info.h"
 #include "net/http/http_server_properties.h"
 #include "net/http/http_server_properties_impl.h"
@@ -459,8 +460,6 @@
 
 typedef CapturePreconnectsSocketPool<TransportClientSocketPool>
     CapturePreconnectsTransportSocketPool;
-typedef CapturePreconnectsSocketPool<HttpProxyClientSocketPool>
-    CapturePreconnectsHttpProxySocketPool;
 
 template <typename ParentPool>
 CapturePreconnectsSocketPool<ParentPool>::CapturePreconnectsSocketPool(
@@ -473,6 +472,7 @@
                  0,
                  nullptr /* socket_factory */,
                  host_resolver,
+                 nullptr /* proxy_delegate */,
                  nullptr /* cert_verifier */,
                  nullptr /* channel_id_server */,
                  nullptr /* transport_security_state */,
@@ -486,22 +486,6 @@
                  nullptr /* netlog */),
       last_num_streams_(-1) {}
 
-template <>
-CapturePreconnectsHttpProxySocketPool::CapturePreconnectsSocketPool(
-    HostResolver*,
-    CertVerifier*,
-    TransportSecurityState*,
-    CTVerifier*,
-    CTPolicyEnforcer*)
-    : HttpProxyClientSocketPool(0,
-                                0,
-                                nullptr,
-                                nullptr,
-                                nullptr,
-                                nullptr,
-                                nullptr),
-      last_num_streams_(-1) {}
-
 using HttpStreamFactoryTest = TestWithScopedTaskEnvironment;
 
 TEST_F(HttpStreamFactoryTest, PreconnectDirect) {
@@ -535,8 +519,8 @@
     HttpNetworkSessionPeer peer(session.get());
     ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
                              HostPortPair("http_proxy", 80));
-    CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
-        new CapturePreconnectsHttpProxySocketPool(
+    CapturePreconnectsTransportSocketPool* http_proxy_pool =
+        new CapturePreconnectsTransportSocketPool(
             session_deps.host_resolver.get(), session_deps.cert_verifier.get(),
             session_deps.transport_security_state.get(),
             session_deps.cert_transparency_verifier.get(),
@@ -1188,8 +1172,8 @@
     HttpNetworkSessionPeer peer(session.get());
     ProxyServer proxy_server(ProxyServer::SCHEME_HTTP,
                              HostPortPair("http_proxy", 80));
-    CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
-        new CapturePreconnectsHttpProxySocketPool(
+    CapturePreconnectsTransportSocketPool* http_proxy_pool =
+        new CapturePreconnectsTransportSocketPool(
             session_deps.host_resolver.get(), session_deps.cert_verifier.get(),
             session_deps.transport_security_state.get(),
             session_deps.cert_transparency_verifier.get(),
@@ -1248,8 +1232,8 @@
 
       for (int preconnect_request = 0; preconnect_request < 2;
            ++preconnect_request) {
-        CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
-            new CapturePreconnectsHttpProxySocketPool(
+        CapturePreconnectsTransportSocketPool* http_proxy_pool =
+            new CapturePreconnectsTransportSocketPool(
                 session_deps.host_resolver.get(),
                 session_deps.cert_verifier.get(),
                 session_deps.transport_security_state.get(),
@@ -1342,8 +1326,8 @@
   ProxyServer proxy_server(ProxyServer::SCHEME_HTTPS,
                            HostPortPair("myproxy.org", 443));
 
-  CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
-      new CapturePreconnectsHttpProxySocketPool(
+  CapturePreconnectsTransportSocketPool* http_proxy_pool =
+      new CapturePreconnectsTransportSocketPool(
           session_deps.host_resolver.get(), session_deps.cert_verifier.get(),
           session_deps.transport_security_state.get(),
           session_deps.cert_transparency_verifier.get(),
diff --git a/net/nqe/network_quality_estimator_params.cc b/net/nqe/network_quality_estimator_params.cc
index e4c5d1a..7a312be 100644
--- a/net/nqe/network_quality_estimator_params.cc
+++ b/net/nqe/network_quality_estimator_params.cc
@@ -538,7 +538,7 @@
 bool NetworkQualityEstimatorParams::use_small_responses() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return use_small_responses_;
-};
+}
 
 // static
 base::TimeDelta NetworkQualityEstimatorParams::GetDefaultTypicalHttpRtt(
diff --git a/net/proxy_resolution/mock_proxy_resolver.h b/net/proxy_resolution/mock_proxy_resolver.h
index 7a4cc6b..2e1bb8ed 100644
--- a/net/proxy_resolution/mock_proxy_resolver.h
+++ b/net/proxy_resolution/mock_proxy_resolver.h
@@ -30,7 +30,7 @@
 
     const GURL& url() const { return url_; }
     ProxyInfo* results() const { return results_; }
-    MockAsyncProxyResolver* Resolver() const { return resolver_; };
+    MockAsyncProxyResolver* Resolver() const { return resolver_; }
 
     void CompleteNow(int rv);
 
diff --git a/net/proxy_resolution/pac_file_decider.cc b/net/proxy_resolution/pac_file_decider.cc
index 8b5b37c7..15ef2c8 100644
--- a/net/proxy_resolution/pac_file_decider.cc
+++ b/net/proxy_resolution/pac_file_decider.cc
@@ -59,7 +59,7 @@
 namespace {
 const char kWpadUrl[] = "http://wpad/wpad.dat";
 const int kQuickCheckDelayMs = 1000;
-};  // namespace
+}  // namespace
 
 std::unique_ptr<base::Value> PacFileDecider::PacSource::NetLogCallback(
     const GURL* effective_pac_url,
diff --git a/net/quic/quic_http_utils.cc b/net/quic/quic_http_utils.cc
index 13deeff..2b3dda3 100644
--- a/net/quic/quic_http_utils.cc
+++ b/net/quic/quic_http_utils.cc
@@ -20,7 +20,7 @@
   UMA_HISTOGRAM_ENUMERATION("Net.QuicAltSvcFormat", format, ALTSVC_FORMAT_MAX);
 }
 
-};  // namespace
+}  // namespace
 
 spdy::SpdyPriority ConvertRequestPriorityToQuicPriority(
     const RequestPriority priority) {
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc
index e39f164c..3a7a3d0 100644
--- a/net/socket/client_socket_pool_base_unittest.cc
+++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -328,12 +328,21 @@
                  MockClientSocketFactory* client_socket_factory,
                  NetLog* net_log)
       : ConnectJob(
-            group_name,
-            timeout_duration,
             request.priority(),
-            request.socket_tag(),
-            request.respect_limits() ==
-                ClientSocketPool::RespectLimits::ENABLED,
+            timeout_duration,
+            CommonConnectJobParams(
+                group_name,
+                request.socket_tag(),
+                request.respect_limits() ==
+                    ClientSocketPool::RespectLimits::ENABLED,
+                nullptr /* client_socket_factory */,
+                nullptr /* host_resolver */,
+                nullptr /* proxy_delegate */,
+                SSLClientSocketContext(),
+                nullptr /* socket_performance_watcher_factory */,
+                nullptr /* network_quality_estimator */,
+                net_log,
+                nullptr /* websocket_endpoint_lock_manager */),
             delegate,
             NetLogWithSource::Make(net_log,
                                    NetLogSourceType::TRANSPORT_CONNECT_JOB)),
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc
index 6ebcccc..bf468c1 100644
--- a/net/socket/client_socket_pool_manager.cc
+++ b/net/socket/client_socket_pool_manager.cc
@@ -11,7 +11,7 @@
 #include "base/strings/stringprintf.h"
 #include "net/base/load_flags.h"
 #include "net/base/proxy_server.h"
-#include "net/http/http_proxy_client_socket_pool.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_request_info.h"
 #include "net/http/http_stream_factory.h"
 #include "net/proxy_resolution/proxy_info.h"
@@ -228,17 +228,23 @@
   // Finally, get the connection started.
 
   if (proxy_info.is_http() || proxy_info.is_https()) {
-    HttpProxyClientSocketPool* pool = session->GetSocketPoolForHTTPLikeProxy(
+    TransportClientSocketPool* pool = session->GetSocketPoolForHTTPLikeProxy(
         socket_pool_type, proxy_info.proxy_server());
     if (num_preconnect_streams) {
-      RequestSocketsForPool(pool, connection_group, http_proxy_params,
-                            num_preconnect_streams, net_log);
+      RequestSocketsForPool(
+          pool, connection_group,
+          TransportClientSocketPool::SocketParams::
+              CreateFromHttpProxySocketParams(http_proxy_params),
+          num_preconnect_streams, net_log);
       return OK;
     }
 
-    return socket_handle->Init(connection_group, http_proxy_params,
-                               request_priority, socket_tag, respect_limits,
-                               std::move(callback), pool, net_log);
+    return socket_handle->Init(
+        connection_group,
+        TransportClientSocketPool::SocketParams::
+            CreateFromHttpProxySocketParams(http_proxy_params),
+        request_priority, socket_tag, respect_limits, std::move(callback), pool,
+        net_log);
   }
 
   if (proxy_info.is_socks()) {
diff --git a/net/socket/client_socket_pool_manager.h b/net/socket/client_socket_pool_manager.h
index c212e25..a1f86f77 100644
--- a/net/socket/client_socket_pool_manager.h
+++ b/net/socket/client_socket_pool_manager.h
@@ -87,7 +87,7 @@
       const ProxyServer& socks_proxy) = 0;
   // Returns the HttpProxyClientSocketPool for a ProxyServer that uses an
   // "HTTP-like" scheme, as defined by ProxyServer::is_http_like().
-  virtual HttpProxyClientSocketPool* GetSocketPoolForHTTPLikeProxy(
+  virtual TransportClientSocketPool* GetSocketPoolForHTTPLikeProxy(
       const ProxyServer& http_proxy) = 0;
   virtual TransportClientSocketPool* GetSocketPoolForSSLWithProxy(
       const ProxyServer& proxy_server) = 0;
diff --git a/net/socket/client_socket_pool_manager_impl.cc b/net/socket/client_socket_pool_manager_impl.cc
index a0527e8c..a4fda95 100644
--- a/net/socket/client_socket_pool_manager_impl.cc
+++ b/net/socket/client_socket_pool_manager_impl.cc
@@ -11,7 +11,6 @@
 #include "base/values.h"
 #include "net/base/proxy_server.h"
 #include "net/http/http_network_session.h"
-#include "net/http/http_proxy_client_socket_pool.h"
 #include "net/socket/socks_connect_job.h"
 #include "net/socket/ssl_connect_job.h"
 #include "net/socket/transport_client_socket_pool.h"
@@ -69,40 +68,28 @@
       ssl_config_service_(ssl_config_service),
       proxy_delegate_(proxy_delegate),
       pool_type_(pool_type),
-      transport_socket_pool_(pool_type ==
-                                     HttpNetworkSession::WEBSOCKET_SOCKET_POOL
-                                 ? new WebSocketTransportClientSocketPool(
-                                       max_sockets_per_pool(pool_type),
-                                       max_sockets_per_group(pool_type),
-                                       socket_factory_,
-                                       host_resolver,
-                                       cert_verifier,
-                                       channel_id_service,
-                                       transport_security_state,
-                                       cert_transparency_verifier,
-                                       ct_policy_enforcer,
-                                       ssl_client_session_cache,
-                                       ssl_session_cache_shard_,
-                                       ssl_config_service,
-                                       network_quality_estimator,
-                                       websocket_endpoint_lock_manager,
-                                       net_log)
-                                 : new TransportClientSocketPool(
-                                       max_sockets_per_pool(pool_type),
-                                       max_sockets_per_group(pool_type),
-                                       socket_factory_,
-                                       host_resolver,
-                                       cert_verifier,
-                                       channel_id_service,
-                                       transport_security_state,
-                                       cert_transparency_verifier,
-                                       ct_policy_enforcer,
-                                       ssl_client_session_cache,
-                                       ssl_session_cache_shard_,
-                                       ssl_config_service,
-                                       socket_performance_watcher_factory_,
-                                       network_quality_estimator,
-                                       net_log)) {
+      transport_socket_pool_(
+          pool_type == HttpNetworkSession::WEBSOCKET_SOCKET_POOL
+              ? std::make_unique<WebSocketTransportClientSocketPool>(
+                    max_sockets_per_pool(pool_type),
+                    max_sockets_per_group(pool_type),
+                    socket_factory_,
+                    host_resolver,
+                    proxy_delegate,
+                    cert_verifier,
+                    channel_id_service,
+                    transport_security_state,
+                    cert_transparency_verifier,
+                    ct_policy_enforcer,
+                    ssl_client_session_cache,
+                    ssl_session_cache_shard_,
+                    ssl_config_service,
+                    network_quality_estimator,
+                    websocket_endpoint_lock_manager,
+                    net_log)
+              : CreateTransportSocketPool(
+                    ProxyServer::Direct(),
+                    true /* use_socket_performance_watcher_factory */)) {
   CertDatabase::GetInstance()->AddObserver(this);
 }
 
@@ -179,31 +166,22 @@
   if (it != proxy_socket_pools_.end())
     return it->second.get();
 
-  int sockets_per_proxy_server = max_sockets_per_proxy_server(pool_type_);
-  int sockets_per_group = std::min(sockets_per_proxy_server,
-                                   max_sockets_per_group(pool_type_));
-
   std::pair<TransportSocketPoolMap::iterator, bool> ret =
       proxy_socket_pools_.insert(std::make_pair(
           proxy_server,
-          std::make_unique<TransportClientSocketPool>(
-              sockets_per_proxy_server, sockets_per_group, socket_factory_,
-              host_resolver_, cert_verifier_, channel_id_service_,
-              transport_security_state_, cert_transparency_verifier_,
-              ct_policy_enforcer_, ssl_client_session_cache_,
-              ssl_session_cache_shard_, ssl_config_service_,
-              nullptr /* socket_performance_watcher */,
-              network_quality_estimator_, net_log_)));
+          CreateTransportSocketPool(
+              proxy_server,
+              false /* use_socket_performance_watcher_factory */)));
 
   return ret.first->second.get();
 }
 
-HttpProxyClientSocketPool*
+TransportClientSocketPool*
 ClientSocketPoolManagerImpl::GetSocketPoolForHTTPLikeProxy(
     const ProxyServer& http_proxy) {
   DCHECK(http_proxy.is_http_like());
 
-  HTTPProxySocketPoolMap::const_iterator it =
+  TransportSocketPoolMap::const_iterator it =
       http_proxy_socket_pools_.find(http_proxy);
   if (it != http_proxy_socket_pools_.end()) {
     DCHECK(base::ContainsKey(transport_socket_pools_for_http_proxies_,
@@ -223,36 +201,31 @@
   std::pair<TransportSocketPoolMap::iterator, bool> tcp_http_ret =
       transport_socket_pools_for_http_proxies_.insert(std::make_pair(
           http_proxy,
-          std::make_unique<TransportClientSocketPool>(
-              sockets_per_proxy_server, sockets_per_group, socket_factory_,
-              host_resolver_, cert_verifier_, channel_id_service_,
-              transport_security_state_, cert_transparency_verifier_,
-              ct_policy_enforcer_, ssl_client_session_cache_,
-              ssl_session_cache_shard_, ssl_config_service_,
-              socket_performance_watcher_factory_, network_quality_estimator_,
-              net_log_)));
+          CreateTransportSocketPool(
+              http_proxy, true /* use_socket_performance_watcher_factory */)));
   DCHECK(tcp_http_ret.second);
 
   std::pair<TransportSocketPoolMap::iterator, bool> ssl_https_ret =
       ssl_socket_pools_for_https_proxies_.insert(std::make_pair(
           http_proxy,
-          new TransportClientSocketPool(
-              sockets_per_proxy_server, sockets_per_group, socket_factory_,
-              host_resolver_, cert_verifier_, channel_id_service_,
-              transport_security_state_, cert_transparency_verifier_,
-              ct_policy_enforcer_, ssl_client_session_cache_,
-              ssl_session_cache_shard_, ssl_config_service_,
-              socket_performance_watcher_factory_, network_quality_estimator_,
-              net_log_, nullptr /* no http proxy */)));
+          CreateTransportSocketPool(
+              http_proxy, true /* use_socket_performance_watcher_factory */)));
   DCHECK(ssl_https_ret.second);
 
-  std::pair<HTTPProxySocketPoolMap::iterator, bool> ret =
+  std::pair<TransportSocketPoolMap::iterator, bool> ret =
       http_proxy_socket_pools_.insert(std::make_pair(
-          http_proxy, std::make_unique<HttpProxyClientSocketPool>(
-                          sockets_per_proxy_server, sockets_per_group,
-                          tcp_http_ret.first->second.get(),
-                          ssl_https_ret.first->second.get(), proxy_delegate_,
-                          network_quality_estimator_, net_log_)));
+          http_proxy,
+          std::make_unique<TransportClientSocketPool>(
+              sockets_per_proxy_server, sockets_per_group, socket_factory_,
+              host_resolver_, proxy_delegate_, cert_verifier_,
+              channel_id_service_, transport_security_state_,
+              cert_transparency_verifier_, ct_policy_enforcer_,
+              ssl_client_session_cache_, ssl_session_cache_shard_,
+              ssl_config_service_, socket_performance_watcher_factory_,
+              network_quality_estimator_, net_log_,
+              nullptr /* http_proxy_pool_for_ssl_pool */,
+              tcp_http_ret.first->second.get(),
+              ssl_https_ret.first->second.get())));
 
   return ret.first->second.get();
 }
@@ -277,15 +250,17 @@
           proxy_server,
           std::make_unique<TransportClientSocketPool>(
               sockets_per_proxy_server, sockets_per_group, socket_factory_,
-              host_resolver_, cert_verifier_, channel_id_service_,
-              transport_security_state_, cert_transparency_verifier_,
-              ct_policy_enforcer_, ssl_client_session_cache_,
-              ssl_session_cache_shard_, ssl_config_service_,
-              socket_performance_watcher_factory_, network_quality_estimator_,
-              net_log_,
+              host_resolver_, proxy_delegate_, cert_verifier_,
+              channel_id_service_, transport_security_state_,
+              cert_transparency_verifier_, ct_policy_enforcer_,
+              ssl_client_session_cache_, ssl_session_cache_shard_,
+              ssl_config_service_, socket_performance_watcher_factory_,
+              network_quality_estimator_, net_log_,
               proxy_server.is_http_like()
                   ? GetSocketPoolForHTTPLikeProxy(proxy_server)
-                  : nullptr)));
+                  : nullptr,
+              nullptr /* transport_pool_for_http_proxy_pool */,
+              nullptr /* ssl_pool_for_http_proxy_pool */)));
 
   return ret.first->second.get();
 }
@@ -319,4 +294,30 @@
                                                  parent_dump_absolute_name);
 }
 
+std::unique_ptr<TransportClientSocketPool>
+ClientSocketPoolManagerImpl::CreateTransportSocketPool(
+    const ProxyServer& proxy_server,
+    bool use_socket_performance_watcher_factory) {
+  int sockets_per_proxy_server;
+  int sockets_per_group;
+  if (proxy_server.is_direct()) {
+    sockets_per_proxy_server = max_sockets_per_pool(pool_type_);
+    sockets_per_group = max_sockets_per_group(pool_type_);
+  } else {
+    sockets_per_proxy_server = max_sockets_per_proxy_server(pool_type_);
+    sockets_per_group =
+        std::min(sockets_per_proxy_server, max_sockets_per_group(pool_type_));
+  }
+  return std::make_unique<TransportClientSocketPool>(
+      sockets_per_proxy_server, sockets_per_group, socket_factory_,
+      host_resolver_, proxy_delegate_, cert_verifier_, channel_id_service_,
+      transport_security_state_, cert_transparency_verifier_,
+      ct_policy_enforcer_, ssl_client_session_cache_, ssl_session_cache_shard_,
+      ssl_config_service_,
+      use_socket_performance_watcher_factory
+          ? socket_performance_watcher_factory_
+          : nullptr,
+      network_quality_estimator_, net_log_);
+}
+
 }  // namespace net
diff --git a/net/socket/client_socket_pool_manager_impl.h b/net/socket/client_socket_pool_manager_impl.h
index 4796e94..bf02f08 100644
--- a/net/socket/client_socket_pool_manager_impl.h
+++ b/net/socket/client_socket_pool_manager_impl.h
@@ -31,7 +31,6 @@
 class ChannelIDService;
 class ClientSocketFactory;
 class CTVerifier;
-class HttpProxyClientSocketPool;
 class HostResolver;
 class NetLog;
 class NetworkQualityEstimator;
@@ -74,7 +73,7 @@
   TransportClientSocketPool* GetSocketPoolForSOCKSProxy(
       const ProxyServer& proxy_server) override;
 
-  HttpProxyClientSocketPool* GetSocketPoolForHTTPLikeProxy(
+  TransportClientSocketPool* GetSocketPoolForHTTPLikeProxy(
       const ProxyServer& http_proxy) override;
 
   TransportClientSocketPool* GetSocketPoolForSSLWithProxy(
@@ -93,8 +92,13 @@
  private:
   using TransportSocketPoolMap =
       std::map<ProxyServer, std::unique_ptr<TransportClientSocketPool>>;
-  using HTTPProxySocketPoolMap =
-      std::map<ProxyServer, std::unique_ptr<HttpProxyClientSocketPool>>;
+
+  // Creates a TransportClientSocketPool appropriate for use with the passed in
+  // socket pool, passing in all needed parameters.
+  // TODO(mmenke): Can |use_socket_performance_watcher_factory| be removed?
+  std::unique_ptr<TransportClientSocketPool> CreateTransportSocketPool(
+      const ProxyServer& proxy_server,
+      bool use_socket_performance_watcher_factory);
 
   NetLog* const net_log_;
   ClientSocketFactory* const socket_factory_;
@@ -124,7 +128,7 @@
 
   TransportSocketPoolMap transport_socket_pools_for_http_proxies_;
   TransportSocketPoolMap ssl_socket_pools_for_https_proxies_;
-  HTTPProxySocketPoolMap http_proxy_socket_pools_;
+  TransportSocketPoolMap http_proxy_socket_pools_;
   TransportSocketPoolMap ssl_socket_pools_for_proxies_;
 
   THREAD_CHECKER(thread_checker_);
diff --git a/net/socket/connect_job.cc b/net/socket/connect_job.cc
index 1937c62d..c9f4e89 100644
--- a/net/socket/connect_job.cc
+++ b/net/socket/connect_job.cc
@@ -20,6 +20,7 @@
     bool respect_limits,
     ClientSocketFactory* client_socket_factory,
     HostResolver* host_resolver,
+    ProxyDelegate* proxy_delegate,
     const SSLClientSocketContext& ssl_client_socket_context,
     SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
     NetworkQualityEstimator* network_quality_estimator,
@@ -30,6 +31,7 @@
       respect_limits(respect_limits),
       client_socket_factory(client_socket_factory),
       host_resolver(host_resolver),
+      proxy_delegate(proxy_delegate),
       ssl_client_socket_context(ssl_client_socket_context),
       socket_performance_watcher_factory(socket_performance_watcher_factory),
       network_quality_estimator(network_quality_estimator),
@@ -62,29 +64,6 @@
                          "group_name", &common_connect_job_params.group_name));
 }
 
-ConnectJob::ConnectJob(const std::string& group_name,
-                       base::TimeDelta timeout_duration,
-                       RequestPriority priority,
-                       const SocketTag& socket_tag,
-                       bool respect_limits,
-                       Delegate* delegate,
-                       const NetLogWithSource& net_log)
-    : ConnectJob(priority,
-                 timeout_duration,
-                 CommonConnectJobParams(
-                     group_name,
-                     socket_tag,
-                     respect_limits,
-                     nullptr /* client_socket_factory */,
-                     nullptr /* host_resolver */,
-                     SSLClientSocketContext(),
-                     nullptr /* network_quality_estimator */,
-                     nullptr /* socket_performance_watcher_factory */,
-                     nullptr /* net_log */,
-                     nullptr /* websocket_endpoint_lock_manager */),
-                 delegate,
-                 net_log) {}
-
 ConnectJob::~ConnectJob() {
   net_log().EndEvent(NetLogEventType::SOCKET_POOL_CONNECT_JOB);
 }
diff --git a/net/socket/connect_job.h b/net/socket/connect_job.h
index b0f08657..ce5380fd 100644
--- a/net/socket/connect_job.h
+++ b/net/socket/connect_job.h
@@ -27,6 +27,7 @@
 class HostResolver;
 class NetLog;
 class NetworkQualityEstimator;
+class ProxyDelegate;
 class SocketPerformanceWatcherFactory;
 class StreamSocket;
 class WebSocketEndpointLockManager;
@@ -43,6 +44,7 @@
       bool respect_limits,
       ClientSocketFactory* client_socket_factory,
       HostResolver* host_resolver,
+      ProxyDelegate* proxy_delegate,
       const SSLClientSocketContext& ssl_client_socket_context,
       SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
       NetworkQualityEstimator* network_quality_estimator,
@@ -68,6 +70,7 @@
 
   ClientSocketFactory* client_socket_factory;
   HostResolver* host_resolver;
+  ProxyDelegate* proxy_delegate;
   SSLClientSocketContext ssl_client_socket_context;
   SocketPerformanceWatcherFactory* socket_performance_watcher_factory;
   NetworkQualityEstimator* network_quality_estimator;
@@ -107,16 +110,6 @@
              const CommonConnectJobParams& common_connect_job_params,
              Delegate* delegate,
              const NetLogWithSource& net_log);
-  // Legacy constructor that takes all pointers in CommonSocketParams as
-  // nullptr.
-  // TODO(mmenke): Remove this.
-  ConnectJob(const std::string& group_name,
-             base::TimeDelta timeout_duration,
-             RequestPriority priority,
-             const SocketTag& socket_tag,
-             bool respect_limits,
-             Delegate* delegate,
-             const NetLogWithSource& net_log);
   virtual ~ConnectJob();
 
   // Accessors
diff --git a/net/socket/connect_job_unittest.cc b/net/socket/connect_job_unittest.cc
index c5b5b2015..3cab0f5 100644
--- a/net/socket/connect_job_unittest.cc
+++ b/net/socket/connect_job_unittest.cc
@@ -45,6 +45,7 @@
                 true /* respect_limits */,
                 nullptr /* client_socket_factory */,
                 nullptr /* host_resolver */,
+                nullptr /* proxy_delegate */,
                 SSLClientSocketContext(),
                 nullptr /* socket_performance_watcher_factory */,
                 nullptr /* network_quality_estimator */,
diff --git a/net/socket/mock_client_socket_pool_manager.cc b/net/socket/mock_client_socket_pool_manager.cc
index 7f5ae755..b13cb37 100644
--- a/net/socket/mock_client_socket_pool_manager.cc
+++ b/net/socket/mock_client_socket_pool_manager.cc
@@ -5,7 +5,6 @@
 #include "net/socket/mock_client_socket_pool_manager.h"
 
 #include "base/values.h"
-#include "net/http/http_proxy_client_socket_pool.h"
 #include "net/socket/transport_client_socket_pool.h"
 
 namespace net {
@@ -27,7 +26,7 @@
 
 void MockClientSocketPoolManager::SetSocketPoolForHTTPProxy(
     const ProxyServer& http_proxy,
-    std::unique_ptr<HttpProxyClientSocketPool> pool) {
+    std::unique_ptr<TransportClientSocketPool> pool) {
   http_proxy_socket_pools_[http_proxy] = std::move(pool);
 }
 
@@ -61,10 +60,10 @@
   return nullptr;
 }
 
-HttpProxyClientSocketPool*
+TransportClientSocketPool*
 MockClientSocketPoolManager::GetSocketPoolForHTTPLikeProxy(
     const ProxyServer& http_proxy) {
-  HTTPProxySocketPoolMap::const_iterator it =
+  TransportClientSocketPoolMap::const_iterator it =
       http_proxy_socket_pools_.find(http_proxy);
   if (it != http_proxy_socket_pools_.end())
     return it->second.get();
diff --git a/net/socket/mock_client_socket_pool_manager.h b/net/socket/mock_client_socket_pool_manager.h
index a08fa67..743abea0 100644
--- a/net/socket/mock_client_socket_pool_manager.h
+++ b/net/socket/mock_client_socket_pool_manager.h
@@ -28,7 +28,7 @@
                              std::unique_ptr<TransportClientSocketPool> pool);
   void SetSocketPoolForHTTPProxy(
       const ProxyServer& http_proxy,
-      std::unique_ptr<HttpProxyClientSocketPool> pool);
+      std::unique_ptr<TransportClientSocketPool> pool);
   void SetSocketPoolForSSLWithProxy(
       const ProxyServer& proxy_server,
       std::unique_ptr<TransportClientSocketPool> pool);
@@ -39,7 +39,7 @@
   TransportClientSocketPool* GetTransportSocketPool() override;
   TransportClientSocketPool* GetSocketPoolForSOCKSProxy(
       const ProxyServer& socks_proxy) override;
-  HttpProxyClientSocketPool* GetSocketPoolForHTTPLikeProxy(
+  TransportClientSocketPool* GetSocketPoolForHTTPLikeProxy(
       const ProxyServer& http_proxy) override;
   TransportClientSocketPool* GetSocketPoolForSSLWithProxy(
       const ProxyServer& proxy_server) override;
@@ -51,12 +51,10 @@
  private:
   using TransportClientSocketPoolMap =
       std::map<ProxyServer, std::unique_ptr<TransportClientSocketPool>>;
-  using HTTPProxySocketPoolMap =
-      std::map<ProxyServer, std::unique_ptr<HttpProxyClientSocketPool>>;
 
   std::unique_ptr<TransportClientSocketPool> transport_socket_pool_;
   TransportClientSocketPoolMap proxy_socket_pools_;
-  HTTPProxySocketPoolMap http_proxy_socket_pools_;
+  TransportClientSocketPoolMap http_proxy_socket_pools_;
   TransportClientSocketPoolMap ssl_socket_pools_for_proxies_;
 
   DISALLOW_COPY_AND_ASSIGN(MockClientSocketPoolManager);
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
index c63941b0e..d24b680 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -1004,7 +1004,7 @@
   pending_read_if_ready_callback_.Reset();
   data_->CancelPendingRead();
   return OK;
-};
+}
 
 int MockTCPClientSocket::Write(
     IOBuffer* buf,
@@ -2146,6 +2146,7 @@
           max_sockets_per_group,
           socket_factory,
           nullptr /* host_resolver */,
+          nullptr /* proxy_delegate */,
           nullptr /* cert_verifier */,
           nullptr /* channel_id_server */,
           nullptr /* transport_security_state */,
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h
index 7e5c52e7..fbd20910 100644
--- a/net/socket/socket_test_util.h
+++ b/net/socket/socket_test_util.h
@@ -31,7 +31,6 @@
 #include "net/base/net_errors.h"
 #include "net/base/test_completion_callback.h"
 #include "net/http/http_auth_controller.h"
-#include "net/http/http_proxy_client_socket_pool.h"
 #include "net/http/proxy_client_socket.h"
 #include "net/log/net_log_with_source.h"
 #include "net/socket/client_socket_factory.h"
diff --git a/net/socket/socks_connect_job_unittest.cc b/net/socket/socks_connect_job_unittest.cc
index da4fee9..831a1d2 100644
--- a/net/socket/socks_connect_job_unittest.cc
+++ b/net/socket/socks_connect_job_unittest.cc
@@ -74,7 +74,8 @@
     // Group name doesn't matter.
     return CommonConnectJobParams(
         "group_name", SocketTag(), true /* respect_limits */,
-        &client_socket_factory_, &host_resolver_, SSLClientSocketContext(),
+        &client_socket_factory_, &host_resolver_, nullptr /* proxy_delegate */,
+        SSLClientSocketContext(),
         nullptr /* socket_performance_watcher_factory */,
         nullptr /* network_quality_estimator */, &net_log_,
         nullptr /* websocket_endpoint_lock_manager */);
diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc
index 6d5751bc..8034e4c 100644
--- a/net/socket/ssl_client_socket_pool_unittest.cc
+++ b/net/socket/ssl_client_socket_pool_unittest.cc
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "net/http/http_proxy_client_socket_pool.h"
-
 #include "base/callback.h"
 #include "base/compiler_specific.h"
 #include "base/stl_util.h"
@@ -20,6 +18,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_auth_handler_factory.h"
 #include "net/http/http_network_session.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_server_properties_impl.h"
@@ -93,21 +92,35 @@
                                       /*is_trusted_proxy=*/false,
                                       /*tunnel=*/true,
                                       TRAFFIC_ANNOTATION_FOR_TESTS)),
-        http_proxy_socket_pool_(kMaxSockets,
-                                kMaxSocketsPerGroup,
-                                &transport_socket_pool_,
-                                NULL,
-                                NULL,
-                                NULL,
-                                NULL) {
+        http_proxy_socket_pool_(
+            kMaxSockets,
+            kMaxSocketsPerGroup,
+            &socket_factory_,
+            &host_resolver_,
+            nullptr /* proxy_delegate */,
+            nullptr /* cert_verifier */,
+            nullptr /* channel_id_server */,
+            nullptr /* transport_security_state */,
+            nullptr /* cert_transparency_verifier */,
+            nullptr /* ct_policy_enforcer */,
+            nullptr /* ssl_client_session_cache */,
+            std::string() /* ssl_session_cache_shard */,
+            nullptr /* ssl_config_service */,
+            nullptr /* socket_performance_watcher_factory */,
+            nullptr /* network_quality_estimator */,
+            nullptr /* net_log */,
+            nullptr /* http_proxy_pool_for_ssl_pool */,
+            &transport_socket_pool_,
+            nullptr /* ssl_pool_for_http_proxy_pool */) {
     ssl_config_service_->GetSSLConfig(&ssl_config_);
   }
 
   void CreatePool(bool http_proxy_pool) {
     pool_.reset(new TransportClientSocketPool(
         kMaxSockets, kMaxSocketsPerGroup, &socket_factory_, &host_resolver_,
-        cert_verifier_.get(), NULL /* channel_id_service */,
-        transport_security_state_.get(), &ct_verifier_, &ct_policy_enforcer_,
+        NULL /* proxy_delegate */, cert_verifier_.get(),
+        NULL /* channel_id_service */, transport_security_state_.get(),
+        &ct_verifier_, &ct_policy_enforcer_,
         nullptr /* ssl_client_session_cache */,
         std::string() /* ssl_session_cache_shard */,
         nullptr /* ssl_config_service */,
@@ -171,7 +184,7 @@
   scoped_refptr<TransportSocketParams> proxy_transport_socket_params_;
 
   scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_;
-  HttpProxyClientSocketPool http_proxy_socket_pool_;
+  TransportClientSocketPool http_proxy_socket_pool_;
 
   SSLConfig ssl_config_;
   std::unique_ptr<TransportClientSocketPool> pool_;
diff --git a/net/socket/ssl_connect_job.cc b/net/socket/ssl_connect_job.cc
index ccf5781..677638d5 100644
--- a/net/socket/ssl_connect_job.cc
+++ b/net/socket/ssl_connect_job.cc
@@ -17,13 +17,14 @@
 #include "net/base/trace_constants.h"
 #include "net/base/url_util.h"
 #include "net/http/http_proxy_client_socket.h"
-#include "net/http/http_proxy_client_socket_pool.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/log/net_log_source_type.h"
 #include "net/log/net_log_with_source.h"
 #include "net/socket/client_socket_factory.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/socks_connect_job.h"
 #include "net/socket/ssl_client_socket.h"
+#include "net/socket/transport_client_socket_pool.h"
 #include "net/socket/transport_connect_job.h"
 #include "net/ssl/ssl_cert_request_info.h"
 #include "net/ssl/ssl_connection_status_flags.h"
@@ -94,7 +95,7 @@
     RequestPriority priority,
     const CommonConnectJobParams& common_connect_job_params,
     const scoped_refptr<SSLSocketParams>& params,
-    HttpProxyClientSocketPool* http_proxy_pool,
+    TransportClientSocketPool* http_proxy_pool,
     ConnectJob::Delegate* delegate)
     : ConnectJob(priority,
                  ConnectionTimeout(
@@ -296,8 +297,11 @@
   scoped_refptr<HttpProxySocketParams> http_proxy_params =
       params_->GetHttpProxyConnectionParams();
   return transport_socket_handle_->Init(
-      group_name(), http_proxy_params, priority(), socket_tag(),
-      respect_limits(), callback_, http_proxy_pool_, net_log());
+      group_name(),
+      TransportClientSocketPool::SocketParams::CreateFromHttpProxySocketParams(
+          http_proxy_params),
+      priority(), socket_tag(), respect_limits(), callback_, http_proxy_pool_,
+      net_log());
 }
 
 int SSLConnectJob::DoTunnelConnectComplete(int result) {
diff --git a/net/socket/ssl_connect_job.h b/net/socket/ssl_connect_job.h
index 452d25f7..775f68f 100644
--- a/net/socket/ssl_connect_job.h
+++ b/net/socket/ssl_connect_job.h
@@ -24,9 +24,9 @@
 namespace net {
 
 class HostPortPair;
-class HttpProxyClientSocketPool;
 class HttpProxySocketParams;
 class SOCKSSocketParams;
+class TransportClientSocketPool;
 class TransportSocketParams;
 
 class NET_EXPORT_PRIVATE SSLSocketParams
@@ -84,7 +84,7 @@
   SSLConnectJob(RequestPriority priority,
                 const CommonConnectJobParams& common_connect_job_params,
                 const scoped_refptr<SSLSocketParams>& params,
-                HttpProxyClientSocketPool* http_proxy_pool,
+                TransportClientSocketPool* http_proxy_pool,
                 ConnectJob::Delegate* delegate);
   ~SSLConnectJob() override;
 
@@ -142,7 +142,7 @@
   void ChangePriorityInternal(RequestPriority priority) override;
 
   scoped_refptr<SSLSocketParams> params_;
-  HttpProxyClientSocketPool* const http_proxy_pool_;
+  TransportClientSocketPool* const http_proxy_pool_;
 
   State next_state_;
   CompletionRepeatingCallback callback_;
diff --git a/net/socket/ssl_connect_job_unittest.cc b/net/socket/ssl_connect_job_unittest.cc
index 1ea2b5eb..c8d1d74 100644
--- a/net/socket/ssl_connect_job_unittest.cc
+++ b/net/socket/ssl_connect_job_unittest.cc
@@ -23,7 +23,7 @@
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_auth_handler_factory.h"
 #include "net/http/http_network_session.h"
-#include "net/http/http_proxy_client_socket_pool.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_request_headers.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_server_properties_impl.h"
@@ -105,6 +105,7 @@
                                kMaxSocketsPerGroup,
                                &socket_factory_,
                                &host_resolver_,
+                               nullptr /* proxy_delegate */,
                                nullptr /* cert_verifier */,
                                nullptr /* channel_id_server */,
                                nullptr /* transport_security_state */,
@@ -138,13 +139,26 @@
                                       /*is_trusted_proxy=*/false,
                                       /*tunnel=*/true,
                                       TRAFFIC_ANNOTATION_FOR_TESTS)),
-        http_proxy_socket_pool_(kMaxSockets,
-                                kMaxSocketsPerGroup,
-                                &transport_socket_pool_,
-                                nullptr /* ssl_pool */,
-                                nullptr /* proxy_delegate */,
-                                nullptr /* network_quality_estimator */,
-                                nullptr /* net_log */) {
+        http_proxy_socket_pool_(
+            kMaxSockets,
+            kMaxSocketsPerGroup,
+            &socket_factory_,
+            &host_resolver_,
+            nullptr /* proxy_delegate */,
+            nullptr /* cert_verifier */,
+            nullptr /* channel_id_server */,
+            nullptr /* transport_security_state */,
+            nullptr /* cert_transparency_verifier */,
+            nullptr /* ct_policy_enforcer */,
+            nullptr /* ssl_client_session_cache */,
+            std::string() /* ssl_session_cache_shard */,
+            nullptr /* ssl_config_service */,
+            nullptr /* socket_performance_watcher_factory */,
+            nullptr /* network_quality_estimator */,
+            nullptr /* net_log */,
+            nullptr /* http_proxy_pool_for_ssl_pool */,
+            &transport_socket_pool_,
+            nullptr /* ssl_pool_for_http_proxy_pool */) {
     ssl_config_service_->GetSSLConfig(&ssl_config_);
 
     // Set an initial delay to ensure that the first call to TimeTicks::Now()
@@ -162,7 +176,8 @@
         priority,
         CommonConnectJobParams(
             kGroupName, SocketTag(), true /* respect_limits */,
-            &socket_factory_, &host_resolver_, ssl_client_socket_context_,
+            &socket_factory_, &host_resolver_, nullptr /* proxy_delegate */,
+            ssl_client_socket_context_,
             nullptr /* socket_performance_watcher */,
             nullptr /* network_quality_estimator */, nullptr /* net_log */,
             nullptr /* websocket_lock_endpoint_manager */),
@@ -227,7 +242,7 @@
   scoped_refptr<SOCKSSocketParams> socks_socket_params_;
   scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_;
 
-  HttpProxyClientSocketPool http_proxy_socket_pool_;
+  TransportClientSocketPool http_proxy_socket_pool_;
 
   SSLConfig ssl_config_;
 };
diff --git a/net/socket/ssl_server_socket.h b/net/socket/ssl_server_socket.h
index 6ba484e..b1499e7 100644
--- a/net/socket/ssl_server_socket.h
+++ b/net/socket/ssl_server_socket.h
@@ -47,7 +47,7 @@
 
 class SSLServerContext {
  public:
-  virtual ~SSLServerContext(){};
+  virtual ~SSLServerContext() {}
 
   // Creates an SSL server socket over an already-connected transport socket.
   // The caller must ensure the returned socket does not outlive the server
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc
index dec343d0..f31ab61 100644
--- a/net/socket/transport_client_socket_pool.cc
+++ b/net/socket/transport_client_socket_pool.cc
@@ -12,7 +12,7 @@
 #include "base/trace_event/trace_event.h"
 #include "base/values.h"
 #include "net/base/trace_constants.h"
-#include "net/http/http_proxy_client_socket_pool.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/log/net_log.h"
 #include "net/log/net_log_event_type.h"
 #include "net/log/net_log_source_type.h"
@@ -38,8 +38,12 @@
     RequestPriority priority,
     const CommonConnectJobParams& common_connect_job_params,
     ConnectJob::Delegate* delegate,
-    HttpProxyClientSocketPool* http_proxy_pool) {
-  DCHECK(!http_proxy_pool);
+    TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+    TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+    TransportClientSocketPool* ssl_pool_for_http_proxy_pool) {
+  DCHECK(!http_proxy_pool_for_ssl_pool);
+  DCHECK(!transport_pool_for_http_proxy_pool);
+  DCHECK(!ssl_pool_for_http_proxy_pool);
   return TransportConnectJob::CreateTransportConnectJob(
       std::move(transport_socket_params), priority, common_connect_job_params,
       delegate);
@@ -50,8 +54,12 @@
     RequestPriority priority,
     const CommonConnectJobParams& common_connect_job_params,
     ConnectJob::Delegate* delegate,
-    HttpProxyClientSocketPool* http_proxy_pool) {
-  DCHECK(!http_proxy_pool);
+    TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+    TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+    TransportClientSocketPool* ssl_pool_for_http_proxy_pool) {
+  DCHECK(!http_proxy_pool_for_ssl_pool);
+  DCHECK(!transport_pool_for_http_proxy_pool);
+  DCHECK(!ssl_pool_for_http_proxy_pool);
   return std::make_unique<SOCKSConnectJob>(priority, common_connect_job_params,
                                            std::move(socks_socket_params),
                                            delegate);
@@ -62,10 +70,29 @@
     RequestPriority priority,
     const CommonConnectJobParams& common_connect_job_params,
     ConnectJob::Delegate* delegate,
-    HttpProxyClientSocketPool* http_proxy_pool) {
-  return std::make_unique<SSLConnectJob>(priority, common_connect_job_params,
-                                         std::move(ssl_socket_params),
-                                         http_proxy_pool, delegate);
+    TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+    TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+    TransportClientSocketPool* ssl_pool_for_http_proxy_pool) {
+  DCHECK(!transport_pool_for_http_proxy_pool);
+  DCHECK(!ssl_pool_for_http_proxy_pool);
+  return std::make_unique<SSLConnectJob>(
+      priority, common_connect_job_params, std::move(ssl_socket_params),
+      http_proxy_pool_for_ssl_pool, delegate);
+}
+
+std::unique_ptr<ConnectJob> CreateHttpProxyConnectJob(
+    scoped_refptr<HttpProxySocketParams> http_proxy_socket_params,
+    RequestPriority priority,
+    const CommonConnectJobParams& common_connect_job_params,
+    ConnectJob::Delegate* delegate,
+    TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+    TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+    TransportClientSocketPool* ssl_pool_for_http_proxy_pool) {
+  DCHECK(!http_proxy_pool_for_ssl_pool);
+  return std::make_unique<HttpProxyConnectJob>(
+      priority, common_connect_job_params, std::move(http_proxy_socket_params),
+      transport_pool_for_http_proxy_pool, ssl_pool_for_http_proxy_pool,
+      delegate);
 }
 
 }  // namespace
@@ -98,24 +125,38 @@
   return base::MakeRefCounted<SocketParams>(callback);
 }
 
+scoped_refptr<TransportClientSocketPool::SocketParams>
+TransportClientSocketPool::SocketParams::CreateFromHttpProxySocketParams(
+    scoped_refptr<HttpProxySocketParams> http_proxy_socket_params) {
+  CreateConnectJobCallback callback = base::BindRepeating(
+      &CreateHttpProxyConnectJob, std::move(http_proxy_socket_params));
+  return base::MakeRefCounted<SocketParams>(callback);
+}
+
 TransportClientSocketPool::SocketParams::~SocketParams() = default;
 
 TransportClientSocketPool::TransportConnectJobFactory::
     TransportConnectJobFactory(
         ClientSocketFactory* client_socket_factory,
         HostResolver* host_resolver,
+        ProxyDelegate* proxy_delegate,
         const SSLClientSocketContext& ssl_client_socket_context,
         SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
         NetworkQualityEstimator* network_quality_estimator,
         NetLog* net_log,
-        HttpProxyClientSocketPool* http_proxy_pool)
+        TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+        TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+        TransportClientSocketPool* ssl_pool_for_http_proxy_pool)
     : client_socket_factory_(client_socket_factory),
       host_resolver_(host_resolver),
+      proxy_delegate_(proxy_delegate),
       ssl_client_socket_context_(ssl_client_socket_context),
       socket_performance_watcher_factory_(socket_performance_watcher_factory),
       network_quality_estimator_(network_quality_estimator),
       net_log_(net_log),
-      http_proxy_pool_(http_proxy_pool) {}
+      http_proxy_pool_for_ssl_pool_(http_proxy_pool_for_ssl_pool),
+      transport_pool_for_http_proxy_pool_(transport_pool_for_http_proxy_pool),
+      ssl_pool_for_http_proxy_pool_(ssl_pool_for_http_proxy_pool) {}
 
 TransportClientSocketPool::TransportConnectJobFactory::
     ~TransportConnectJobFactory() = default;
@@ -130,10 +171,12 @@
       CommonConnectJobParams(
           group_name, request.socket_tag(),
           request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED,
-          client_socket_factory_, host_resolver_, ssl_client_socket_context_,
-          socket_performance_watcher_factory_, network_quality_estimator_,
-          net_log_, nullptr /* websocket_endpoint_lock_manager */),
-      delegate, http_proxy_pool_);
+          client_socket_factory_, host_resolver_, proxy_delegate_,
+          ssl_client_socket_context_, socket_performance_watcher_factory_,
+          network_quality_estimator_, net_log_,
+          nullptr /* websocket_endpoint_lock_manager */),
+      delegate, http_proxy_pool_for_ssl_pool_,
+      transport_pool_for_http_proxy_pool_, ssl_pool_for_http_proxy_pool_);
 }
 
 TransportClientSocketPool::TransportClientSocketPool(
@@ -141,6 +184,7 @@
     int max_sockets_per_group,
     ClientSocketFactory* client_socket_factory,
     HostResolver* host_resolver,
+    ProxyDelegate* proxy_delegate,
     CertVerifier* cert_verifier,
     ChannelIDService* channel_id_service,
     TransportSecurityState* transport_security_state,
@@ -152,7 +196,9 @@
     SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
     NetworkQualityEstimator* network_quality_estimator,
     NetLog* net_log,
-    HttpProxyClientSocketPool* http_proxy_pool)
+    TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+    TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+    TransportClientSocketPool* ssl_pool_for_http_proxy_pool)
     : base_(this,
             max_sockets,
             max_sockets_per_group,
@@ -161,6 +207,7 @@
             new TransportConnectJobFactory(
                 client_socket_factory,
                 host_resolver,
+                proxy_delegate,
                 SSLClientSocketContext(cert_verifier,
                                        channel_id_service,
                                        transport_security_state,
@@ -171,15 +218,20 @@
                 socket_performance_watcher_factory,
                 network_quality_estimator,
                 net_log,
-                http_proxy_pool)),
+                http_proxy_pool_for_ssl_pool,
+                transport_pool_for_http_proxy_pool,
+                ssl_pool_for_http_proxy_pool)),
       client_socket_factory_(client_socket_factory),
       ssl_config_service_(ssl_config_service) {
   base_.EnableConnectBackupJobs();
   if (ssl_config_service_)
     ssl_config_service_->AddObserver(this);
-
-  if (http_proxy_pool)
-    base_.AddLowerLayeredPool(http_proxy_pool);
+  if (http_proxy_pool_for_ssl_pool)
+    base_.AddLowerLayeredPool(http_proxy_pool_for_ssl_pool);
+  if (transport_pool_for_http_proxy_pool)
+    base_.AddLowerLayeredPool(transport_pool_for_http_proxy_pool);
+  if (ssl_pool_for_http_proxy_pool)
+    base_.AddLowerLayeredPool(ssl_pool_for_http_proxy_pool);
 }
 
 TransportClientSocketPool::~TransportClientSocketPool() {
diff --git a/net/socket/transport_client_socket_pool.h b/net/socket/transport_client_socket_pool.h
index ac99b8e..2352b867 100644
--- a/net/socket/transport_client_socket_pool.h
+++ b/net/socket/transport_client_socket_pool.h
@@ -27,10 +27,11 @@
 class CTVerifier;
 class CTPolicyEnforcer;
 class HostResolver;
-class HttpProxyClientSocketPool;
+class HttpProxySocketParams;
 class NetLog;
 class NetLogWithSource;
 class NetworkQualityEstimator;
+class ProxyDelegate;
 class SocketPerformanceWatcherFactory;
 class SOCKSSocketParams;
 class SSLSocketParams;
@@ -48,15 +49,22 @@
   // |websocket_endpoint_lock_manager| is non-null, a ConnectJob for use by
   // WebSockets should be created.
   //
-  // |http_proxy_pool| is for the case of SSLConnectJobs that will be layered
-  // on top of an HttpProxyClientSocketPool.
-  // TODO(https://crbug.com/927084): Remove the |http_proxy_pool| argument.
+  // |http_proxy_pool_for_ssl_pool| is for the case of SSLConnectJobs that will
+  // be layered on top of an http proxy socket pool.
+  //
+  // |transport_pool_for_http_proxy_pool| and |ssl_pool_for_http_proxy_pool| are
+  // socket pools that sit beneath the current pool, for the HTTP proxy case.
+  //
+  // TODO(https://crbug.com/927084): Remove the TransportClientSocketPool
+  // arguments.
   using CreateConnectJobCallback =
       base::RepeatingCallback<std::unique_ptr<ConnectJob>(
           RequestPriority priority,
           const CommonConnectJobParams& common_connect_job_params,
           ConnectJob::Delegate* delegate,
-          HttpProxyClientSocketPool* http_proxy_pool)>;
+          TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+          TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+          TransportClientSocketPool* ssl_pool_for_http_proxy_pool)>;
 
   // "Parameters" that own a single callback for creating a ConnectJob that can
   // be of any type.
@@ -82,6 +90,9 @@
     static scoped_refptr<SocketParams> CreateFromSSLSocketParams(
         scoped_refptr<SSLSocketParams> ssl_socket_params);
 
+    static scoped_refptr<SocketParams> CreateFromHttpProxySocketParams(
+        scoped_refptr<HttpProxySocketParams> http_proxy_socket_params);
+
    private:
     friend class base::RefCounted<SocketParams>;
     ~SocketParams();
@@ -91,16 +102,22 @@
     DISALLOW_COPY_AND_ASSIGN(SocketParams);
   };
 
-  // If this is being used for an SSL socket pool, the |http_proxy_pool| socket
-  // pool is used for HTTP proxy tunnels beneath the SSL socket pool.
+  // If this is being used for an SSL socket pool, the
+  // |http_proxy_pool_for_ssl_pool| socket pool is used for HTTP proxy tunnels
+  // beneath the SSL socket pool.
   //
-  // TODO(https://crbug.com/927084): Remove the |http_proxy_pool| argument, once
+  // If this is being used for an HTTP proxy socket pool, the
+  // |transport_pool_for_http_proxy_pool| and |ssl_pool_for_http_proxy_pool| are
+  // used for SSL and TCP connections beneath the HTTP proxy socket pool.
+  //
+  // TODO(https://crbug.com/927084): Remove all pool arguments, once
   // the socket pools are flat.
   TransportClientSocketPool(
       int max_sockets,
       int max_sockets_per_group,
       ClientSocketFactory* client_socket_factory,
       HostResolver* host_resolver,
+      ProxyDelegate* proxy_delegate,
       CertVerifier* cert_verifier,
       ChannelIDService* channel_id_service,
       TransportSecurityState* transport_security_state,
@@ -112,7 +129,9 @@
       SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
       NetworkQualityEstimator* network_quality_estimator,
       NetLog* net_log,
-      HttpProxyClientSocketPool* http_proxy_pool = nullptr);
+      TransportClientSocketPool* http_proxy_pool_for_ssl_pool = nullptr,
+      TransportClientSocketPool* transport_pool_for_http_proxy_pool = nullptr,
+      TransportClientSocketPool* ssl_pool_for_http_proxy_pool = nullptr);
 
   ~TransportClientSocketPool() override;
 
@@ -179,12 +198,14 @@
     TransportConnectJobFactory(
         ClientSocketFactory* client_socket_factory,
         HostResolver* host_resolver,
+        ProxyDelegate* proxy_delegate,
         const SSLClientSocketContext& ssl_client_socket_context,
         SocketPerformanceWatcherFactory* socket_performance_watcher_factory,
         NetworkQualityEstimator* network_quality_estimator,
         NetLog* net_log,
-        HttpProxyClientSocketPool* http_proxy_pool = nullptr);
-
+        TransportClientSocketPool* http_proxy_pool_for_ssl_pool,
+        TransportClientSocketPool* transport_pool_for_http_proxy_pool,
+        TransportClientSocketPool* ssl_pool_for_http_proxy_pool);
     ~TransportConnectJobFactory() override;
 
     // ClientSocketPoolBase::ConnectJobFactory methods.
@@ -197,12 +218,15 @@
    private:
     ClientSocketFactory* const client_socket_factory_;
     HostResolver* const host_resolver_;
+    ProxyDelegate* const proxy_delegate_;
     const SSLClientSocketContext ssl_client_socket_context_;
     SocketPerformanceWatcherFactory* const socket_performance_watcher_factory_;
     NetworkQualityEstimator* const network_quality_estimator_;
     NetLog* const net_log_;
 
-    HttpProxyClientSocketPool* const http_proxy_pool_;
+    TransportClientSocketPool* const http_proxy_pool_for_ssl_pool_;
+    TransportClientSocketPool* const transport_pool_for_http_proxy_pool_;
+    TransportClientSocketPool* const ssl_pool_for_http_proxy_pool_;
 
     DISALLOW_COPY_AND_ASSIGN(TransportConnectJobFactory);
   };
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc
index b96aae8..1a3b848c 100644
--- a/net/socket/transport_client_socket_pool_unittest.cc
+++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -21,6 +21,7 @@
 #include "net/cert/mock_cert_verifier.h"
 #include "net/cert/multi_log_ct_verifier.h"
 #include "net/dns/mock_host_resolver.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/transport_security_state.h"
 #include "net/log/net_log_with_source.h"
 #include "net/log/test_net_log.h"
@@ -97,6 +98,7 @@
               kMaxSocketsPerGroup,
               &client_socket_factory_,
               host_resolver_.get(),
+              nullptr /* proxy_delegate */,
               &cert_verifier_,
               nullptr /* channel_id_server */,
               &transport_security_state_,
@@ -112,6 +114,7 @@
                                kMaxSocketsPerGroup,
                                ClientSocketFactory::GetDefaultFactory(),
                                host_resolver_.get(),
+                               nullptr /* proxy_delegate */,
                                &cert_verifier_,
                                nullptr /* channel_id_server */,
                                &transport_security_state_,
@@ -444,8 +447,8 @@
 TEST_F(TransportClientSocketPoolTest, RequestIgnoringLimitsIsNotReprioritized) {
   TransportClientSocketPool pool(
       kMaxSockets, 1, &client_socket_factory_, host_resolver_.get(),
-      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
-      nullptr /* transport_security_state */,
+      nullptr /* proxy_delegate */, nullptr /* cert_verifier */,
+      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -1157,8 +1160,8 @@
     MockTaggingClientSocketFactory socket_factory;
     TransportClientSocketPool pool(
         kMaxSockets, kMaxSocketsPerGroup, &socket_factory, host_resolver_.get(),
-        nullptr /* cert_verifier */, nullptr /* channel_id_server */,
-        nullptr /* transport_security_state */,
+        nullptr /* proxy_delegate */, nullptr /* cert_verifier */,
+        nullptr /* channel_id_server */, nullptr /* transport_security_state */,
         nullptr /* cert_transparency_verifier */,
         nullptr /* ct_policy_enforcer */,
         nullptr /* ssl_client_session_cache */,
@@ -1204,8 +1207,8 @@
   TransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup,
       ClientSocketFactory::GetDefaultFactory(), host_resolver_.get(),
-      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
-      nullptr /* transport_security_state */,
+      nullptr /* proxy_delegate */, nullptr /* cert_verifier */,
+      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -1329,8 +1332,8 @@
   MockTaggingClientSocketFactory socket_factory;
   TransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &socket_factory, host_resolver_.get(),
-      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
-      nullptr /* transport_security_state */,
+      nullptr /* proxy_delegate */, nullptr /* cert_verifier */,
+      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
diff --git a/net/socket/transport_connect_job_unittest.cc b/net/socket/transport_connect_job_unittest.cc
index 81c24694..c2e35f4f 100644
--- a/net/socket/transport_connect_job_unittest.cc
+++ b/net/socket/transport_connect_job_unittest.cc
@@ -43,7 +43,8 @@
   CommonConnectJobParams DefaultCommonConnectJobParams() {
     return CommonConnectJobParams(
         kHostName /* group_name */, SocketTag(), true /* respect_limits */,
-        &client_socket_factory_, &host_resolver_, SSLClientSocketContext(),
+        &client_socket_factory_, &host_resolver_, nullptr /* proxy_delegate */,
+        SSLClientSocketContext(),
         nullptr /* socket_performance_watcher_factory */,
         nullptr /* network_quality_estimator */, &net_log_,
         nullptr /* websocket_endpoint_lock_manager */);
diff --git a/net/socket/websocket_transport_client_socket_pool.cc b/net/socket/websocket_transport_client_socket_pool.cc
index 0fef1db..b3c8568 100644
--- a/net/socket/websocket_transport_client_socket_pool.cc
+++ b/net/socket/websocket_transport_client_socket_pool.cc
@@ -31,6 +31,7 @@
     int max_sockets_per_group,
     ClientSocketFactory* client_socket_factory,
     HostResolver* host_resolver,
+    ProxyDelegate* proxy_delegate,
     CertVerifier* cert_verifier,
     ChannelIDService* channel_id_service,
     TransportSecurityState* transport_security_state,
@@ -47,6 +48,7 @@
           max_sockets_per_group,
           client_socket_factory,
           host_resolver,
+          proxy_delegate,
           cert_verifier,
           channel_id_service,
           transport_security_state,
@@ -61,6 +63,7 @@
       pool_net_log_(net_log),
       client_socket_factory_(client_socket_factory),
       host_resolver_(host_resolver),
+      proxy_delegate_(proxy_delegate),
       ssl_client_socket_context_(cert_verifier,
                                  channel_id_service,
                                  transport_security_state,
@@ -147,12 +150,14 @@
           CommonConnectJobParams(group_name, SocketTag(),
                                  respect_limits == RespectLimits::ENABLED,
                                  client_socket_factory_, host_resolver_,
-                                 ssl_client_socket_context_,
+                                 proxy_delegate_, ssl_client_socket_context_,
                                  nullptr /* SocketPerformanceWatcherFactory */,
                                  network_quality_estimator_, pool_net_log_,
                                  websocket_endpoint_lock_manager_),
           connect_job_delegate.get(),
-          nullptr /* http_proxy_client_socket_pool */);
+          nullptr /* http_proxy_pool_for_ssl_pool */,
+          nullptr /* transport_pool_for_http_proxy_pool */,
+          nullptr /* ssl_pool_for_http_proxy_pool */);
 
   int result = connect_job_delegate->Connect(std::move(connect_job));
 
diff --git a/net/socket/websocket_transport_client_socket_pool.h b/net/socket/websocket_transport_client_socket_pool.h
index a0b60d2c..5e01c39 100644
--- a/net/socket/websocket_transport_client_socket_pool.h
+++ b/net/socket/websocket_transport_client_socket_pool.h
@@ -34,6 +34,7 @@
 class HostResolver;
 class NetLog;
 class NetworkQualityEstimator;
+class ProxyDelegate;
 class SSLConfigService;
 class WebSocketEndpointLockManager;
 class WebSocketTransportConnectJob;
@@ -46,6 +47,7 @@
       int max_sockets_per_group,
       ClientSocketFactory* client_socket_factory,
       HostResolver* host_resolver,
+      ProxyDelegate* proxy_delegate,
       CertVerifier* cert_verifier,
       ChannelIDService* channel_id_service,
       TransportSecurityState* transport_security_state,
@@ -198,6 +200,7 @@
   NetLog* const pool_net_log_;
   ClientSocketFactory* const client_socket_factory_;
   HostResolver* const host_resolver_;
+  ProxyDelegate* const proxy_delegate_;
   const SSLClientSocketContext ssl_client_socket_context_;
   NetworkQualityEstimator* const network_quality_estimator_;
   WebSocketEndpointLockManager* websocket_endpoint_lock_manager_;
diff --git a/net/socket/websocket_transport_client_socket_pool_unittest.cc b/net/socket/websocket_transport_client_socket_pool_unittest.cc
index 9508b199..9801f79 100644
--- a/net/socket/websocket_transport_client_socket_pool_unittest.cc
+++ b/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -71,6 +71,7 @@
               kMaxSocketsPerGroup,
               &client_socket_factory_,
               host_resolver_.get(),
+              nullptr /* proxy_delegate */,
               nullptr /* cert_verifier */,
               nullptr /* channel_id_server */,
               nullptr /* transport_security_state */,
@@ -539,8 +540,9 @@
        IPv6FallbackSocketIPv4FinishesFirst) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -584,8 +586,9 @@
        IPv6FallbackSocketIPv6FinishesFirst) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -628,8 +631,9 @@
        IPv6NoIPv4AddressesToFallbackTo) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -664,8 +668,9 @@
 TEST_F(WebSocketTransportClientSocketPoolTest, IPv4HasNoFallback) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -701,8 +706,9 @@
 TEST_F(WebSocketTransportClientSocketPoolTest, IPv6InstantFail) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -742,8 +748,9 @@
 TEST_F(WebSocketTransportClientSocketPoolTest, IPv6RapidFail) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -791,8 +798,9 @@
 TEST_F(WebSocketTransportClientSocketPoolTest, FirstSuccessWins) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -834,8 +842,9 @@
 TEST_F(WebSocketTransportClientSocketPoolTest, LastFailureWins) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
@@ -881,8 +890,9 @@
 TEST_F(WebSocketTransportClientSocketPoolTest, DISABLED_OverallTimeoutApplies) {
   WebSocketTransportClientSocketPool pool(
       kMaxSockets, kMaxSocketsPerGroup, &client_socket_factory_,
-      host_resolver_.get(), nullptr /* cert_verifier */,
-      nullptr /* channel_id_server */, nullptr /* transport_security_state */,
+      host_resolver_.get(), nullptr /* proxy_delegate */,
+      nullptr /* cert_verifier */, nullptr /* channel_id_server */,
+      nullptr /* transport_security_state */,
       nullptr /* cert_transparency_verifier */,
       nullptr /* ct_policy_enforcer */, nullptr /* ssl_client_session_cache */,
       std::string() /* ssl_session_cache_shard */,
diff --git a/net/spdy/spdy_proxy_client_socket_unittest.cc b/net/spdy/spdy_proxy_client_socket_unittest.cc
index eb7b639aec..55be0cd 100644
--- a/net/spdy/spdy_proxy_client_socket_unittest.cc
+++ b/net/spdy/spdy_proxy_client_socket_unittest.cc
@@ -17,6 +17,7 @@
 #include "net/base/test_completion_callback.h"
 #include "net/base/winsock_init.h"
 #include "net/dns/mock_host_resolver.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_response_info.h"
 #include "net/log/net_log_event_type.h"
@@ -104,6 +105,7 @@
       CommonConnectJobParams(
           "group_name", SocketTag(), true /* respect_limits */,
           session_deps->socket_factory.get(), session_deps->host_resolver.get(),
+          nullptr /* proxy_delegate */,
           SSLClientSocketContext(session_deps->cert_verifier.get(),
                                  session_deps->channel_id_service.get(),
                                  session_deps->transport_security_state.get(),
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc
index 67a9828..e4ea0a5 100644
--- a/net/spdy/spdy_test_util_common.cc
+++ b/net/spdy/spdy_test_util_common.cc
@@ -22,6 +22,7 @@
 #include "net/dns/host_resolver.h"
 #include "net/http/http_cache.h"
 #include "net/http/http_network_transaction.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/log/net_log_with_source.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/next_proto.h"
diff --git a/net/test/spawned_test_server/local_test_server.h b/net/test/spawned_test_server/local_test_server.h
index 28f54967..adc13f1 100644
--- a/net/test/spawned_test_server/local_test_server.h
+++ b/net/test/spawned_test_server/local_test_server.h
@@ -61,7 +61,7 @@
 
   // Returns the actual path of document root for test cases. This function
   // should be called by test cases to retrieve the actual document root path.
-  base::FilePath GetDocumentRoot() const { return document_root(); };
+  base::FilePath GetDocumentRoot() const { return document_root(); }
 
  private:
   bool Init(const base::FilePath& document_root);
diff --git a/net/third_party/quic/core/tls_handshaker.h b/net/third_party/quic/core/tls_handshaker.h
index 4644615..7f75464 100644
--- a/net/third_party/quic/core/tls_handshaker.h
+++ b/net/third_party/quic/core/tls_handshaker.h
@@ -40,7 +40,7 @@
   QuicErrorCode error() const override { return parser_error_; }
   const QuicString& error_detail() const override {
     return parser_error_detail_;
-  };
+  }
 
   // From QuicCryptoStream
   virtual QuicLongHeaderType GetLongHeaderType(
diff --git a/net/third_party/quic/platform/api/quic_default_proof_providers.h b/net/third_party/quic/platform/api/quic_default_proof_providers.h
new file mode 100644
index 0000000..c5cbaff
--- /dev/null
+++ b/net/third_party/quic/platform/api/quic_default_proof_providers.h
@@ -0,0 +1,24 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_THIRD_PARTY_QUIC_PLATFORM_API_QUIC_DEFAULT_PROOF_PROVIDERS_H_
+#define NET_THIRD_PARTY_QUIC_PLATFORM_API_QUIC_DEFAULT_PROOF_PROVIDERS_H_
+
+#include <memory>
+
+#include "net/third_party/quic/core/crypto/proof_verifier.h"
+#include "net/third_party/quic/platform/impl/quic_default_proof_providers_impl.h"
+
+namespace quic {
+
+// Provides a default proof verifier.  The verifier has to do a good faith
+// attempt at verifying the certificate against a reasonable root store, and not
+// just always return success.
+std::unique_ptr<ProofVerifier> CreateDefaultProofVerifier() {
+  return CreateDefaultProofVerifierImpl();
+}
+
+}  // namespace quic
+
+#endif  // NET_THIRD_PARTY_QUIC_PLATFORM_API_QUIC_DEFAULT_PROOF_PROVIDERS_H_
diff --git a/net/third_party/quic/platform/impl/quic_default_proof_providers_impl.cc b/net/third_party/quic/platform/impl/quic_default_proof_providers_impl.cc
new file mode 100644
index 0000000..8f261bac7
--- /dev/null
+++ b/net/third_party/quic/platform/impl/quic_default_proof_providers_impl.cc
@@ -0,0 +1,48 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "net/third_party/quic/platform/impl/quic_default_proof_providers_impl.h"
+
+#include <utility>
+
+#include "net/cert/cert_verifier.h"
+#include "net/cert/ct_log_verifier.h"
+#include "net/cert/ct_policy_enforcer.h"
+#include "net/cert/multi_log_ct_verifier.h"
+#include "net/http/transport_security_state.h"
+#include "net/quic/crypto/proof_verifier_chromium.h"
+#include "net/third_party/quic/platform/api/quic_ptr_util.h"
+
+using net::CertVerifier;
+using net::CTVerifier;
+using net::MultiLogCTVerifier;
+using net::ProofVerifierChromium;
+
+namespace quic {
+
+class ProofVerifierChromiumWithOwnership : public net::ProofVerifierChromium {
+ public:
+  ProofVerifierChromiumWithOwnership(
+      std::unique_ptr<net::CertVerifier> cert_verifier)
+      : net::ProofVerifierChromium(cert_verifier.get(),
+                                   &ct_policy_enforcer_,
+                                   &transport_security_state_,
+                                   &ct_verifier_),
+        cert_verifier_(std::move(cert_verifier)) {}
+
+ private:
+  std::unique_ptr<net::CertVerifier> cert_verifier_;
+  net::DefaultCTPolicyEnforcer ct_policy_enforcer_;
+  net::TransportSecurityState transport_security_state_;
+  net::MultiLogCTVerifier ct_verifier_;
+};
+
+std::unique_ptr<ProofVerifier> CreateDefaultProofVerifierImpl() {
+  std::unique_ptr<net::CertVerifier> cert_verifier =
+      net::CertVerifier::CreateDefault();
+  return QuicMakeUnique<ProofVerifierChromiumWithOwnership>(
+      std::move(cert_verifier));
+}
+
+}  // namespace quic
diff --git a/net/third_party/quic/platform/impl/quic_default_proof_providers_impl.h b/net/third_party/quic/platform/impl/quic_default_proof_providers_impl.h
new file mode 100644
index 0000000..6bb4e0c
--- /dev/null
+++ b/net/third_party/quic/platform/impl/quic_default_proof_providers_impl.h
@@ -0,0 +1,17 @@
+// Copyright (c) 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_DEFAULT_PROOF_PROVIDERS_IMPL_H_
+#define NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_DEFAULT_PROOF_PROVIDERS_IMPL_H_
+
+#include <memory>
+
+#include "net/third_party/quic/core/crypto/proof_verifier.h"
+
+namespace quic {
+
+std::unique_ptr<ProofVerifier> CreateDefaultProofVerifierImpl();
+
+}
+#endif  // NET_THIRD_PARTY_QUIC_PLATFORM_IMPL_QUIC_DEFAULT_PROOF_PROVIDERS_IMPL_H_
diff --git a/net/third_party/quic/tools/quic_client_bin.cc b/net/third_party/quic/tools/quic_client_bin.cc
index 827885d..b4cac6c 100644
--- a/net/third_party/quic/tools/quic_client_bin.cc
+++ b/net/third_party/quic/tools/quic_client_bin.cc
@@ -46,14 +46,9 @@
 #include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/net_errors.h"
 #include "net/base/privacy_mode.h"
-#include "net/cert/cert_verifier.h"
-#include "net/cert/ct_log_verifier.h"
-#include "net/cert/ct_policy_enforcer.h"
-#include "net/cert/multi_log_ct_verifier.h"
-#include "net/http/transport_security_state.h"
-#include "net/quic/crypto/proof_verifier_chromium.h"
 #include "net/third_party/quic/core/quic_packets.h"
 #include "net/third_party/quic/core/quic_server_id.h"
+#include "net/third_party/quic/platform/api/quic_default_proof_providers.h"
 #include "net/third_party/quic/platform/api/quic_flags.h"
 #include "net/third_party/quic/platform/api/quic_ptr_util.h"
 #include "net/third_party/quic/platform/api/quic_socket_address.h"
@@ -66,16 +61,11 @@
 #include "net/tools/epoll_server/epoll_server.h"
 #include "net/tools/quic/synchronous_host_resolver.h"
 
-using net::CertVerifier;
-using net::CTVerifier;
-using net::MultiLogCTVerifier;
-using net::ProofVerifierChromium;
 using quic::ProofVerifier;
 using quic::QuicStringPiece;
 using quic::QuicTextUtils;
 using quic::QuicUrl;
 using spdy::SpdyHeaderBlock;
-using net::TransportSecurityState;
 using std::cout;
 using std::cerr;
 using std::endl;
@@ -270,19 +260,11 @@
         static_cast<quic::QuicTransportVersion>(FLAGS_quic_version)));
   }
   // For secure QUIC we need to verify the cert chain.
-  std::unique_ptr<CertVerifier> cert_verifier(CertVerifier::CreateDefault());
-  std::unique_ptr<TransportSecurityState> transport_security_state(
-      new TransportSecurityState);
-  std::unique_ptr<MultiLogCTVerifier> ct_verifier(new MultiLogCTVerifier());
-  std::unique_ptr<net::CTPolicyEnforcer> ct_policy_enforcer(
-      new net::DefaultCTPolicyEnforcer());
   std::unique_ptr<ProofVerifier> proof_verifier;
   if (line->HasSwitch("disable-certificate-verification")) {
     proof_verifier = quic::QuicMakeUnique<FakeProofVerifier>();
   } else {
-    proof_verifier = quic::QuicMakeUnique<ProofVerifierChromium>(
-        cert_verifier.get(), ct_policy_enforcer.get(),
-        transport_security_state.get(), ct_verifier.get());
+    proof_verifier = quic::CreateDefaultProofVerifier();
   }
   quic::QuicClient client(quic::QuicSocketAddress(ip_addr, port), server_id,
                           versions, &epoll_server, std::move(proof_verifier));
diff --git a/net/tools/transport_security_state_generator/spki_hash.h b/net/tools/transport_security_state_generator/spki_hash.h
index 20de8fe..cf0ed1c 100644
--- a/net/tools/transport_security_state_generator/spki_hash.h
+++ b/net/tools/transport_security_state_generator/spki_hash.h
@@ -37,7 +37,7 @@
   size_t size() const { return kLength; }
 
   uint8_t* data() { return data_; }
-  const uint8_t* data() const { return data_; };
+  const uint8_t* data() const { return data_; }
 
  private:
   // The bytes of the hash. Current hashes are SHA256 and thus 32 bytes long.
diff --git a/net/url_request/url_request_file_job.h b/net/url_request/url_request_file_job.h
index 441a3fa..eade0a0 100644
--- a/net/url_request/url_request_file_job.h
+++ b/net/url_request/url_request_file_job.h
@@ -48,7 +48,7 @@
   void SetExtraRequestHeaders(const HttpRequestHeaders& headers) override;
   void ShouldServeMimeTypeAsContentTypeHeader() {
     serve_mime_type_as_content_type_ = true;
-  };
+  }
   void GetResponseInfo(HttpResponseInfo* info) override;
 
   // base::PowerObserver:
diff --git a/net/websockets/websocket_basic_stream_adapters_test.cc b/net/websockets/websocket_basic_stream_adapters_test.cc
index 111dee4f9..c929d8ff 100644
--- a/net/websockets/websocket_basic_stream_adapters_test.cc
+++ b/net/websockets/websocket_basic_stream_adapters_test.cc
@@ -19,6 +19,7 @@
 #include "net/base/test_completion_callback.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/http/http_network_session.h"
+#include "net/http/http_proxy_connect_job.h"
 #include "net/log/net_log_with_source.h"
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/client_socket_pool_manager_impl.h"
diff --git a/pdf/chunk_stream.h b/pdf/chunk_stream.h
index 7fc092e..2741df72 100644
--- a/pdf/chunk_stream.h
+++ b/pdf/chunk_stream.h
@@ -119,6 +119,6 @@
   uint32_t filled_chunks_count_ = 0;
 };
 
-};  // namespace chrome_pdf
+}  // namespace chrome_pdf
 
 #endif  // PDF_CHUNK_STREAM_H_
diff --git a/pdf/paint_manager.h b/pdf/paint_manager.h
index 0ce0db8..727f3ec 100644
--- a/pdf/paint_manager.h
+++ b/pdf/paint_manager.h
@@ -18,7 +18,7 @@
 class Instance;
 class Point;
 class Rect;
-};
+}  // namespace pp
 
 // Custom PaintManager for the PDF plugin.  This is branched from the Pepper
 // version.  The difference is that this supports progressive rendering of dirty
diff --git a/pdf/pdf_engine.cc b/pdf/pdf_engine.cc
index 05c51319..128243e 100644
--- a/pdf/pdf_engine.cc
+++ b/pdf/pdf_engine.cc
@@ -6,12 +6,12 @@
 
 namespace chrome_pdf {
 
-PDFEngine::PageFeatures::PageFeatures(){};
+PDFEngine::PageFeatures::PageFeatures() {}
 
 PDFEngine::PageFeatures::PageFeatures(const PageFeatures& other)
     : index(other.index), annotation_types(other.annotation_types) {}
 
-PDFEngine::PageFeatures::~PageFeatures(){};
+PDFEngine::PageFeatures::~PageFeatures() {}
 
 bool PDFEngine::PageFeatures::IsInitialized() const {
   return index >= 0;
diff --git a/ppapi/cpp/dev/truetype_font_dev.h b/ppapi/cpp/dev/truetype_font_dev.h
index f1fa0f07..be86f22 100644
--- a/ppapi/cpp/dev/truetype_font_dev.h
+++ b/ppapi/cpp/dev/truetype_font_dev.h
@@ -223,14 +223,14 @@
  public:
   TrueTypeFontDescArrayOutputAdapterWithStorage() {
     set_output(&temp_storage_);
-  };
+  }
 
   virtual ~TrueTypeFontDescArrayOutputAdapterWithStorage() {
     if (!temp_storage_.empty()) {
       // An easy way to release the resource references held by |temp_storage_|.
       output();
     }
-  };
+  }
 
   std::vector<TrueTypeFontDesc_Dev>& output() {
     PP_DCHECK(output_storage_.empty());
diff --git a/ppapi/cpp/message_handler.h b/ppapi/cpp/message_handler.h
index 0bb6ad8..4c30d82 100644
--- a/ppapi/cpp/message_handler.h
+++ b/ppapi/cpp/message_handler.h
@@ -14,7 +14,7 @@
 /// for usage.
 class MessageHandler {
  public:
-  virtual ~MessageHandler() {};
+  virtual ~MessageHandler() {}
 
   /// Invoked as a result of JavaScript invoking postMessage() on the plugin's
   /// DOM element.
diff --git a/services/audio/log_factory_manager_unittest.cc b/services/audio/log_factory_manager_unittest.cc
index e3632f1..a63d5566 100644
--- a/services/audio/log_factory_manager_unittest.cc
+++ b/services/audio/log_factory_manager_unittest.cc
@@ -60,7 +60,7 @@
     MockCreateAudioLog(component, component_id);
     mojo::MakeStrongBinding(base::WrapUnique(mock_logs_[current_mock_log_++]),
                             std::move(audio_log_request));
-  };
+  }
 
   MockAudioLog* GetMockLog(size_t index) { return mock_logs_[index]; }
 
diff --git a/services/audio/test/service_observer_mock.cc b/services/audio/test/service_observer_mock.cc
index 326e822..e26a08e1 100644
--- a/services/audio/test/service_observer_mock.cc
+++ b/services/audio/test/service_observer_mock.cc
@@ -11,7 +11,7 @@
     service_manager::mojom::ServiceManagerListenerRequest request)
     : service_name_(service_name), binding_(this, std::move(request)) {}
 
-ServiceObserverMock::~ServiceObserverMock(){};
+ServiceObserverMock::~ServiceObserverMock() {}
 
 void ServiceObserverMock::OnInit(
     std::vector<service_manager::mojom::RunningServiceInfoPtr> instances) {
diff --git a/services/catalog/public/tools/catalog.cc.tmpl b/services/catalog/public/tools/catalog.cc.tmpl
deleted file mode 100644
index d8c355c7..0000000
--- a/services/catalog/public/tools/catalog.cc.tmpl
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2017 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 is a generated file. Please see the "service_manifest" template in
-// src/services/service_manager/public/service_manifest.gni for more details.
-
-#include "{{path}}.h"
-
-#include <set>
-
-#include "base/files/file_path.h"
-#include "base/no_destructor.h"
-#include "build/build_config.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-
-{%- macro generate_manifest_builder(manifest) -%}
-service_manager::ManifestBuilder()
-    .WithServiceName("{{manifest['name']}}")
-{%-   if 'display_name' in manifest %}
-    .WithDisplayName("{{manifest['display_name']}}")
-{%-   endif %}
-    .WithOptions(service_manager::ManifestOptionsBuilder()
-{%-   if 'sandbox_type' in manifest %}
-                     .WithSandboxType("{{manifest['sandbox_type']}}")
-{%-   endif %}
-
-{%-   set options = manifest.get('options', {}) %}
-{%-   set instance_sharing = options.get('instance_sharing', None) %}
-{%-   if instance_sharing == 'singleton' %}
-                     .WithInstanceSharingPolicy(
-                          service_manager::Manifest::InstanceSharingPolicy::
-                              kSingleton)
-{%-   elif instance_sharing == 'shared_instance_across_users' %}
-                     .WithInstanceSharingPolicy(
-                          service_manager::Manifest::InstanceSharingPolicy::
-                              kSharedAcrossGroups)
-{%-   endif %}
-{%-   if options.get('can_connect_to_other_services_as_any_user', False) %}
-                     .CanConnectToInstancesInAnyGroup(true)
-{%-   endif %}
-{%-   if options.get('can_connect_to_other_services_with_any_instance_name',
-                     False) %}
-                     .CanConnectToInstancesWithAnyId(true)
-{%-   endif %}
-{%-   if options.get('can_create_other_service_instances', False) %}
-                     .CanRegisterOtherServiceInstances(true)
-{%-   endif %}
-                     .Build())
-
-{%-   set specs = manifest.get('interface_provider_specs', {}) %}
-{%-   set main_spec = specs.pop('service_manager:connector', None) %}
-{%-   if main_spec %}
-{%-     for name, interfaces in main_spec.get('provides', {}).iteritems() %}
-    .ExposeCapability(
-        "{{name}}", std::set<const char*>{
-{%-       for interface_name in interfaces %}
-            "{{interface_name}}",
-{%-       endfor -%}})
-{%-     endfor %}
-{%-     for service, caps in main_spec.get('requires', {}).iteritems() %}
-{%-       if caps == [] %}
-    .RequireCapability("{{service}}", "")
-{%-       else %}
-{%-         for capability in caps %}
-    .RequireCapability("{{service}}", "{{capability}}")
-{%-         endfor %}
-{%-       endif %}
-{%-     endfor %}
-{%-   endif %}
-{%-   for filter_name, filter_spec in specs.iteritems() %}
-{%-     for name, interfaces in filter_spec.get('provides', {}).iteritems() %}
-    .ExposeInterfaceFilterCapability_Deprecated(
-        "{{filter_name}}", "{{name}}", std::set<const char*>{
-{%-       for interface_name in interfaces %}
-            "{{interface_name}}" {%- if not loop.last %},{% endif %}
-{%-       endfor -%}})
-{%-     endfor %}
-{%-     for service, caps in filter_spec.get('requires', {}).iteritems() %}
-{%-       for capability in caps %}
-    .RequireInterfaceFilterCapability_Deprecated(
-        "{{service}}", "{{filter_name}}", "{{capability}}")
-{%-       endfor %}
-{%-     endfor %}
-{%-   endfor %}
-
-{%-  for key, entries in manifest.get('required_files', {}).iteritems() %}
-{%-    for entry in entries %}
-{%-      if entry['platform'] == 'linux' %}
-#if defined(OS_LINUX)
-{%-      elif entry['platform'] == 'android' %}
-#if defined(OS_ANDROID)
-{%-      endif %}
-    .PreloadFile(
-        "{{key}}",
-        base::FilePath(FILE_PATH_LITERAL("{{entry['path']}}")))
-#endif
-{%-    endfor %}
-{%-  endfor %}
-
-{%-  for packaged_service_manifest in manifest.get('services', []) %}
-    .PackageService(
-        {{generate_manifest_builder(packaged_service_manifest)|indent(8)}})
-{%-  endfor %}
-    .Build()
-{%- endmacro %}
-
-{% for namespace in namespaces %}
-namespace {{namespace}} {
-{%- endfor %}
-
-const service_manager::Manifest& {{function_name}}() {
-  static base::NoDestructor<service_manager::Manifest> manifest{
-      {{generate_manifest_builder(root_manifest)|indent(6)}} };
-  return *manifest;
-}
-
-{%- for namespace in namespaces|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
diff --git a/services/catalog/public/tools/catalog.gni b/services/catalog/public/tools/catalog.gni
deleted file mode 100644
index 96b5fde1..0000000
--- a/services/catalog/public/tools/catalog.gni
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/dcheck_always_on.gni")
-
-# Generates code to produce a list service_manager::Manifest objects given a set
-# of service_manager targets to include in the list.
-#
-# This is a temporary helper to transition away from JSON manifests. The catalog
-# target always has a companion catalog_cpp_source target, which yields a
-# source_set defining the generated function.
-#
-# No new uses of these targets should be introduced.
-template("catalog") {
-  group(target_name) {
-    testonly = defined(invoker.testonly) && invoker.testonly
-  }
-
-  # NOTE: There is no longer a practical difference between embedded and
-  # standalone services in terms of manifest data. Some targets use one or the
-  # other or both.
-  submanifests = []
-  if (defined(invoker.embedded_services)) {
-    submanifests += invoker.embedded_services
-  }
-  if (defined(invoker.standalone_services)) {
-    submanifests += invoker.standalone_services
-  }
-
-  write_file("$target_gen_dir/${target_name}.submanifests", submanifests)
-}
-
-template("catalog_cpp_source") {
-  assert(defined(invoker.catalog), "catalog is required")
-  assert(defined(invoker.generated_function_name),
-         "generated_function_name is required")
-
-  generator_target_name = "${target_name}__generator"
-  generated_filename_base = "${target_gen_dir}/${target_name}"
-
-  catalog_target = invoker.catalog
-  catalog_target_dir = get_label_info(catalog_target, "target_gen_dir")
-  catalog_target_name = get_label_info(catalog_target, "name")
-
-  submanifests =
-      read_file("$catalog_target_dir/${catalog_target_name}.submanifests",
-                "list lines")
-
-  action(generator_target_name) {
-    testonly = defined(invoker.testonly) && invoker.testonly
-    script = "//services/catalog/public/tools/sourcify_manifest.py"
-    inputs = [
-      "$catalog_target_dir/${catalog_target_name}.submanifests",
-      "//services/catalog/public/tools/catalog.cc.tmpl",
-      "//services/catalog/public/tools/catalog.h.tmpl",
-    ]
-    outputs = [
-      "${generated_filename_base}.cc",
-      "${generated_filename_base}.h",
-    ]
-
-    submanifest_info = []
-    foreach(submanifest, submanifests) {
-      manifest_dir = get_label_info(submanifest, "target_gen_dir")
-      manifest_target_name = get_label_info(submanifest, "name")
-      manifest_namespace_input =
-          "$manifest_dir/${manifest_target_name}.namespace"
-      manifest_namespace_path =
-          rebase_path(manifest_namespace_input, root_build_dir)
-      manifest_header_base =
-          rebase_path(manifest_dir, root_gen_dir) + "/${manifest_target_name}"
-      submanifest_info +=
-          [ "packaged@$manifest_namespace_path@$manifest_header_base" ]
-    }
-
-    submanifest_info_file =
-        "$target_gen_dir/${invoker.target_name}.submanifest_info"
-    write_file(submanifest_info_file, submanifest_info)
-
-    args = [
-      "--submanifest-info=" +
-          rebase_path(submanifest_info_file, root_build_dir),
-      "--output-filename-base=" +
-          rebase_path(generated_filename_base, root_build_dir),
-      "--output-function-name=" + invoker.generated_function_name,
-      "--module-path=" + rebase_path(generated_filename_base, root_gen_dir),
-    ]
-  }
-
-  source_set(target_name) {
-    testonly = defined(invoker.testonly) && invoker.testonly
-    sources = get_target_outputs(":$generator_target_name")
-    deps = [
-             ":$generator_target_name",
-             "//base",
-             "//services/service_manager/public/cpp",
-           ] + submanifests
-  }
-}
diff --git a/services/catalog/public/tools/catalog.h.tmpl b/services/catalog/public/tools/catalog.h.tmpl
deleted file mode 100644
index aed4b1d..0000000
--- a/services/catalog/public/tools/catalog.h.tmpl
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2017 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 is a generated file. Please see the "service_manifest" template in
-// src/services/service_manager/public/service_manifest.gni for more details.
-
-{%- set header_guard = "%s_H_"|format(path)|upper|replace("/", "_")|
-        replace(".", "_")|replace("-", "_") %}
-
-#ifndef {{header_guard}}
-#define {{header_guard}}
-
-#include <vector>
-
-#include "services/service_manager/public/cpp/manifest.h"
-
-{% for namespace in namespaces %}
-namespace {{namespace}} {
-{%- endfor %}
-
-{% if root_manifest -%}
-const service_manager::Manifest& {{function_name}}();
-{% else -%}
-const std::vector<service_manager::Manifest>& {{function_name}}();
-{%- endif %}
-
-{% for namespace in namespaces|reverse %}
-}  // namespace {{namespace}}
-{%- endfor %}
-
-#endif  // {{header_guard}}
diff --git a/services/catalog/public/tools/generate_manifest.py b/services/catalog/public/tools/generate_manifest.py
deleted file mode 100755
index 81c9419..0000000
--- a/services/catalog/public/tools/generate_manifest.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Generates a static catalog manifest to be loaded at runtime. This includes
-embedded service manifests for every supported service, as well as information
-indicating how to start each service."""
-
-import argparse
-import json
-import os.path
-import sys
-
-sys.path.append(os.path.join(
-    os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir,
-    "build", "android", "gyp"))
-from util import build_utils
-
-eater_relative = "../../../../../tools/json_comment_eater"
-eater_relative = os.path.join(os.path.abspath(__file__), eater_relative)
-sys.path.insert(0, os.path.normpath(eater_relative))
-try:
-  import json_comment_eater
-finally:
-  sys.path.pop(0)
-
-
-def ParseJSONFile(filename):
-  with open(filename) as json_file:
-    try:
-      return json.loads(json_comment_eater.Nom(json_file.read()))
-    except ValueError as e:
-      print "%s is not a valid JSON document" % filename
-      raise e
-
-
-def ParseManifest(filename):
-  manifest = ParseJSONFile(filename)
-  if "name" not in manifest:
-    raise Exception("Manifest %s missing \"name\" key." % filename)
-  return manifest["name"], manifest
-
-
-def AddServiceEntryToCatalog(services, name, entry):
-  if name in services:
-    raise Exception("Duplicate service entry for %s" % name)
-  services[name] = entry
-
-
-def SanityCheckCatalog(catalog):
-  """Ensures any given service name appears only once within the catalog."""
-  known_services = set()
-
-  def has_no_dupes(root):
-    if "name" in root:
-      name = root["name"]
-      if name in known_services:
-        raise ValueError("Duplicate catalog entry found for service: %s" % name)
-      known_services.add(name)
-
-    if "services" not in root:
-      return True
-
-    return all(has_no_dupes(service) for service in root["services"])
-
-  return all(has_no_dupes(service["manifest"])
-             for service in catalog["services"].itervalues())
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Generates a Service Manager catalog manifest.")
-  parser.add_argument("--output")
-  parser.add_argument("--pretty", action="store_true")
-  parser.add_argument("--embedded-services", nargs="+",
-                      dest="embedded_services", default=[])
-  parser.add_argument("--standalone-services", nargs="+",
-                      dest="standalone_services", default=[])
-  parser.add_argument("--include-catalogs", nargs="+", dest="included_catalogs",
-                      default=[])
-  parser.add_argument("--override-service-executables", nargs="+",
-                      dest="executable_override_specs", default=[])
-  args, _ = parser.parse_known_args()
-
-  if args.output is None:
-    raise Exception("--output required")
-
-  services = {}
-  for subcatalog_path in args.included_catalogs:
-    subcatalog = ParseJSONFile(subcatalog_path)
-    for name, entry in subcatalog["services"].iteritems():
-      AddServiceEntryToCatalog(services, name, entry)
-
-  executable_overrides = {}
-  for override_spec in args.executable_override_specs:
-    service_name, exe_path = override_spec.split(":", 1)
-    executable_overrides[service_name] = exe_path
-
-  for manifest_path in args.embedded_services:
-    service_name, manifest = ParseManifest(manifest_path)
-    entry = { "embedded": True, "manifest": manifest }
-    AddServiceEntryToCatalog(services, service_name, entry)
-
-  for manifest_path in args.standalone_services:
-    service_name, manifest = ParseManifest(manifest_path)
-    entry = { "embedded": False, "manifest": manifest }
-    name = manifest["name"]
-    if name in executable_overrides:
-      entry["executable"] = executable_overrides[name]
-    AddServiceEntryToCatalog(services, service_name, entry)
-
-  catalog = { "services": services }
-
-  with build_utils.AtomicOutput(args.output) as f:
-    json.dump(catalog, f, indent=2 if args.pretty else -1)
-
-  # NOTE: We do the sanity check and possible failure *after* outputting the
-  # catalog manifest so it's easier to inspect erroneous output.
-  SanityCheckCatalog(catalog);
-
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/services/catalog/public/tools/sourcify_manifest.py b/services/catalog/public/tools/sourcify_manifest.py
deleted file mode 100755
index 96b9f3e..0000000
--- a/services/catalog/public/tools/sourcify_manifest.py
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2017 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.
-
-"""Generates C++ source and header files defining function to create an
-in-memory representation of a static catalog manifest at runtime."""
-
-
-import argparse
-import imp
-import json
-import os.path
-import sys
-
-sys.path.append(os.path.join(
-    os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir,
-    "build", "android", "gyp"))
-from util import build_utils
-
-
-_H_FILE_TEMPLATE = "catalog.h.tmpl"
-_CC_FILE_TEMPLATE = "catalog.cc.tmpl"
-
-
-eater_relative = "../../../../../tools/json_comment_eater"
-eater_relative = os.path.join(os.path.abspath(__file__), eater_relative)
-sys.path.insert(0, os.path.normpath(eater_relative))
-try:
-  import json_comment_eater
-finally:
-  sys.path.pop(0)
-
-
-# Disable lint check for finding modules:
-# pylint: disable=F0401
-
-def _GetDirAbove(dirname):
-  """Returns the directory "above" this file containing |dirname| (which must
-  also be "above" this file)."""
-  path = os.path.abspath(__file__)
-  while True:
-    path, tail = os.path.split(path)
-    assert tail
-    if tail == dirname:
-      return path
-
-
-try:
-  imp.find_module("jinja2")
-except ImportError:
-  sys.path.append(os.path.join(_GetDirAbove("services"), "third_party"))
-import jinja2
-
-
-def ApplyTemplate(path_to_template, output_path, global_vars, **kwargs):
-  with build_utils.AtomicOutput(output_path) as output_file:
-    jinja_env = jinja2.Environment(
-        loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
-        keep_trailing_newline=True, **kwargs)
-    jinja_env.globals.update(global_vars)
-    output_file.write(jinja_env.get_template(path_to_template).render())
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Generates a C++ constant containing a catalog manifest.")
-  parser.add_argument("--root-manifest")
-  parser.add_argument("--submanifest-info")
-  parser.add_argument("--output-filename-base")
-  parser.add_argument("--output-function-name")
-  parser.add_argument("--module-path")
-  args, _ = parser.parse_known_args()
-
-  if args.output_filename_base is None:
-    raise Exception("--output-filename-base is required")
-  if args.output_function_name is None:
-    raise Exception("--output-function-name is required")
-  if args.module_path is None:
-    args.module_path = args.output_filename_base
-
-  if args.root_manifest:
-    with open(args.root_manifest, "r") as input_file:
-      root_manifest = json.loads(json_comment_eater.Nom(input_file.read()))
-  else:
-    root_manifest = None
-
-  qualified_function_name = args.output_function_name.split("::")
-  namespaces = qualified_function_name[0:-1]
-  function_name = qualified_function_name[-1]
-
-  def raise_error(error, value):
-    raise Exception(error)
-
-  overlays = []
-  packaged_services = []
-  global_vars = {
-    "root_manifest": root_manifest,
-    "function_name": function_name,
-    "namespaces": namespaces,
-    "path": args.module_path,
-    "raise": raise_error,
-  }
-
-  input_h_filename = _H_FILE_TEMPLATE
-  output_h_filename = "%s.h" % args.output_filename_base
-  ApplyTemplate(input_h_filename, output_h_filename, global_vars)
-
-  input_cc_filename = _CC_FILE_TEMPLATE
-  output_cc_filename = "%s.cc" % args.output_filename_base
-  ApplyTemplate(input_cc_filename, output_cc_filename, global_vars)
-
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/services/content/service.h b/services/content/service.h
index 0e6c91d..c7b6481 100644
--- a/services/content/service.h
+++ b/services/content/service.h
@@ -69,6 +69,6 @@
   DISALLOW_COPY_AND_ASSIGN(Service);
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // SERVICES_CONTENT_SERVICE_H_
diff --git a/services/content/service_delegate.h b/services/content/service_delegate.h
index 9749bf2..363e21d 100644
--- a/services/content/service_delegate.h
+++ b/services/content/service_delegate.h
@@ -38,6 +38,6 @@
                                   mojom::NavigableContentsClient* client) = 0;
 };
 
-};  // namespace content
+}  // namespace content
 
 #endif  // SERVICES_CONTENT_CONTENT_SERVICE_DELEGATE_H_
diff --git a/services/device/geolocation/wifi_data_provider_linux.h b/services/device/geolocation/wifi_data_provider_linux.h
index e6126ce..abbbbdb 100644
--- a/services/device/geolocation/wifi_data_provider_linux.h
+++ b/services/device/geolocation/wifi_data_provider_linux.h
@@ -12,7 +12,7 @@
 
 namespace dbus {
 class Bus;
-};
+}
 
 namespace device {
 
diff --git a/services/device/hid/hid_device_info.h b/services/device/hid/hid_device_info.h
index 847688eea..0ea0ccdf 100644
--- a/services/device/hid/hid_device_info.h
+++ b/services/device/hid/hid_device_info.h
@@ -63,7 +63,7 @@
   const std::vector<mojom::HidCollectionInfoPtr>& collections() const {
     return device_->collections;
   }
-  bool has_report_id() const { return device_->has_report_id; };
+  bool has_report_id() const { return device_->has_report_id; }
   size_t max_input_report_size() const {
     return device_->max_input_report_size;
   }
diff --git a/services/device/public/cpp/bluetooth/bluetooth_utils.h b/services/device/public/cpp/bluetooth/bluetooth_utils.h
index 8faff658..9ec68e3 100644
--- a/services/device/public/cpp/bluetooth/bluetooth_utils.h
+++ b/services/device/public/cpp/bluetooth/bluetooth_utils.h
@@ -20,6 +20,6 @@
 base::string16 GetBluetoothDeviceNameForDisplay(
     const mojom::BluetoothDeviceInfoPtr& device_info);
 
-};  // namespace device
+}  // namespace device
 
 #endif  // SERVICES_DEVICE_PUBLIC_CPP_BLUETOOTH_BLUETOOTH_UTILS_H_
diff --git a/services/device/public/cpp/hid/hid_report_descriptor_item.h b/services/device/public/cpp/hid/hid_report_descriptor_item.h
index 8b1a64c7e..0789ae8 100644
--- a/services/device/public/cpp/hid/hid_report_descriptor_item.h
+++ b/services/device/public/cpp/hid/hid_report_descriptor_item.h
@@ -153,14 +153,14 @@
 
   // Previous element in report descriptor.
   // Owned by descriptor instance.
-  HidReportDescriptorItem* previous() const { return previous_; };
+  HidReportDescriptorItem* previous() const { return previous_; }
   // Next element in report descriptor.
   // Owned by descriptor instance.
-  HidReportDescriptorItem* next() const { return next_; };
+  HidReportDescriptorItem* next() const { return next_; }
   // Parent element in report descriptor.
   // Owned by descriptor instance.
   // Can be NULL.
-  HidReportDescriptorItem* parent() const { return parent_; };
+  HidReportDescriptorItem* parent() const { return parent_; }
   // Level in Parent-Children relationship tree.
   // 0 for top-level items (parent()==NULL).
   // 1 if parent() is top-level.
diff --git a/services/network/ignore_errors_cert_verifier_unittest.cc b/services/network/ignore_errors_cert_verifier_unittest.cc
index 6810dfa..d29015f 100644
--- a/services/network/ignore_errors_cert_verifier_unittest.cc
+++ b/services/network/ignore_errors_cert_verifier_unittest.cc
@@ -76,7 +76,7 @@
   void SetUp() override {
     verifier_.set_whitelist(
         IgnoreErrorsCertVerifier::MakeWhitelist(MakeWhitelist()));
-  };
+  }
 
   // The wrapped CertVerifier. Defaults to returning ERR_CERT_INVALID. Owned by
   // |verifier_|.
diff --git a/services/network/public/cpp/cors/preflight_result_unittest.cc b/services/network/public/cpp/cors/preflight_result_unittest.cc
index 61bf6037..cfc53a7 100644
--- a/services/network/public/cpp/cors/preflight_result_unittest.cc
+++ b/services/network/public/cpp/cors/preflight_result_unittest.cc
@@ -166,7 +166,7 @@
   EXPECT_EQ(base::TimeTicks(), result2->absolute_expiry_time());
 
   PreflightResult::SetTickClockForTesting(nullptr);
-};
+}
 
 TEST_F(PreflightResultTest, EnsureMethods) {
   for (const auto& test : method_cases) {
diff --git a/services/network/public/cpp/net_ipc_param_traits.h b/services/network/public/cpp/net_ipc_param_traits.h
index 80d7cd4..c52e6035 100644
--- a/services/network/public/cpp/net_ipc_param_traits.h
+++ b/services/network/public/cpp/net_ipc_param_traits.h
@@ -215,7 +215,7 @@
     net::ct::CTPolicyCompliance,
     net::ct::CTPolicyCompliance::CT_POLICY_COMPLIANCE_DETAILS_NOT_AVAILABLE)
 
-IPC_ENUM_TRAITS(net::ProxyServer::Scheme);  // BitMask.
+IPC_ENUM_TRAITS(net::ProxyServer::Scheme)  // BitMask.
 
 IPC_ENUM_TRAITS_MAX_VALUE(net::OCSPVerifyResult::ResponseStatus,
                           net::OCSPVerifyResult::PARSE_RESPONSE_DATA_ERROR)
diff --git a/services/preferences/tracked/pref_hash_filter_unittest.cc b/services/preferences/tracked/pref_hash_filter_unittest.cc
index e2da80ab..17a75eb 100644
--- a/services/preferences/tracked/pref_hash_filter_unittest.cc
+++ b/services/preferences/tracked/pref_hash_filter_unittest.cc
@@ -245,7 +245,7 @@
 std::string MockPrefHashStore::ComputeMac(const std::string& path,
                                           const base::Value* new_value) {
   return "atomic mac for: " + path;
-};
+}
 
 std::unique_ptr<base::DictionaryValue> MockPrefHashStore::ComputeSplitMacs(
     const std::string& path,
@@ -259,7 +259,7 @@
                       base::Value("split mac for: " + path + "/" + it.key()));
   }
   return macs_dict;
-};
+}
 
 ValueState MockPrefHashStore::RecordCheckValue(const std::string& path,
                                                const base::Value* value,
@@ -364,7 +364,7 @@
 
 class MockHashStoreContents : public HashStoreContents {
  public:
-  MockHashStoreContents(){};
+  MockHashStoreContents() {}
 
   // Returns the number of hashes stored.
   size_t stored_hashes_count() const { return dictionary_.size(); }
diff --git a/services/preferences/tracked/temp_scoped_dir_cleaner.h b/services/preferences/tracked/temp_scoped_dir_cleaner.h
index 4359b76..e25c7f7 100644
--- a/services/preferences/tracked/temp_scoped_dir_cleaner.h
+++ b/services/preferences/tracked/temp_scoped_dir_cleaner.h
@@ -12,7 +12,7 @@
     : public base::RefCountedThreadSafe<TempScopedDirCleaner> {
  protected:
   friend class base::RefCountedThreadSafe<TempScopedDirCleaner>;
-  virtual ~TempScopedDirCleaner(){};
+  virtual ~TempScopedDirCleaner() {}
 };
 
 #endif  // SERVICES_PREFERENCES_TRACKED_TEMP_SCOPED_DIR_CLEANER_H_
diff --git a/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc b/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc
index 0ddcfc3..b813f210 100644
--- a/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc
+++ b/services/resource_coordinator/memory_instrumentation/coordinator_impl_unittest.cc
@@ -276,7 +276,7 @@
     raw_os_dump->memory_maps.push_back(std::move(vm_region));
   }
   return raw_os_dump;
-};
+}
 
 // Tests that the global dump is acked even in absence of clients.
 TEST_F(CoordinatorImplTest, NoClients) {
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h b/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
index 98c36f2..01e0f18 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/os_metrics.h
@@ -13,7 +13,7 @@
 
 namespace heap_profiling {
 FORWARD_DECLARE_TEST(ProfilingJsonExporterTest, MemoryMaps);
-};
+}
 
 namespace memory_instrumentation {
 
diff --git a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
index 0fc8548..981126a 100644
--- a/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
+++ b/services/resource_coordinator/public/cpp/memory_instrumentation/tracing_observer.cc
@@ -42,7 +42,7 @@
   return file;
 }
 
-};  // namespace
+}  // namespace
 
 TracingObserver::TracingObserver(
     base::trace_event::TraceLog* trace_log,
diff --git a/services/service_manager/public/service_manifest.gni b/services/service_manager/public/service_manifest.gni
deleted file mode 100644
index c4db18d..0000000
--- a/services/service_manager/public/service_manifest.gni
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/dcheck_always_on.gni")
-
-# Generates code to produce a compiled service_manager::Manifest from a JSON
-# description at build time.
-#
-# This is a temporary helper for the transition away from JSON manifests. Do not
-# introduce new service_manifest targets.
-#
-# This template yields a source_set target which defines a symbol named
-# "${name}::GetManifest()" where ${name} is the service name given in the
-# target.
-#
-# All service_manifest targets should be replaced with in-tree C++ sources.
-template("service_manifest") {
-  assert(defined(invoker.source),
-         "\"source\" must be defined for the $target_name target")
-
-  generator_target_name = "${target_name}__generator"
-  generated_sources = [
-    "$target_gen_dir/${target_name}.cc",
-    "$target_gen_dir/${target_name}.h",
-  ]
-
-  # We prefer to use |name| for the generated function's namespace if a
-  # |generated_namespace| isn't explicitly defined. It turns out that we also
-  # have a few targets which don't specify a |name| though; they all have unique
-  # target names, so we fall back on that if necessary. The important detail is
-  # that all generated GetManifest() functions should live in their own
-  # namespace, and with the current (and final) set of service_manifest targets
-  # in the tree, these rules accomplish that.
-  if (defined(invoker.generated_namespace)) {
-    output_namespace = invoker.generated_namespace
-  } else if (defined(invoker.name)) {
-    output_namespace = invoker.name
-  } else {
-    output_namespace = invoker.target_name
-  }
-
-  write_file("$target_gen_dir/${target_name}.namespace", output_namespace)
-
-  source_set(target_name) {
-    testonly = defined(invoker.testonly) && invoker.testonly
-    sources = generated_sources
-    public_deps = [
-      ":$generator_target_name",
-    ]
-  }
-
-  collator_target_name = "${target_name}__collator"
-
-  action(generator_target_name) {
-    testonly = defined(invoker.testonly) && invoker.testonly
-    script = "//services/catalog/public/tools/sourcify_manifest.py"
-
-    inputs = [
-      "//services/catalog/public/tools/catalog.cc.tmpl",
-      "//services/catalog/public/tools/catalog.h.tmpl",
-      invoker.source,
-    ]
-    outputs = generated_sources
-
-    args = [
-      "--root-manifest=" + rebase_path(invoker.source, root_build_dir),
-      "--output-function-name=${output_namespace}::GetManifest",
-      "--output-filename-base=" +
-          rebase_path("$target_gen_dir/${invoker.target_name}", root_build_dir),
-      "--module-path=" +
-          rebase_path("$target_gen_dir/${invoker.target_name}", root_gen_dir),
-    ]
-
-    # We inherit a public dependency on the collator because service_manifest
-    # dependents still expect to use its generated JSON output. We don't
-    # actually depend on the collated JSON at all here, since packaged services
-    # and overlays are added in the generated C++ code by referring to other
-    # generated C++ code.
-    public_deps = [
-      ":$collator_target_name",
-    ]
-  }
-
-  action(collator_target_name) {
-    testonly = defined(invoker.testonly) && invoker.testonly
-
-    script =
-        "//services/service_manager/public/tools/manifest/manifest_collator.py"
-
-    deps = []
-    if (defined(invoker.deps)) {
-      deps += invoker.deps
-    }
-
-    inputs = [
-      invoker.source,
-    ]
-
-    output = "$target_gen_dir/${invoker.target_name}.json"
-    outputs = [
-      output,
-    ]
-
-    rebase_parent = rebase_path(invoker.source, root_build_dir)
-    rebase_output = rebase_path(output, root_build_dir)
-
-    args = [
-      "--parent=$rebase_parent",
-      "--output=$rebase_output",
-    ]
-
-    if (defined(invoker.name)) {
-      args += [
-        "--name",
-        invoker.name,
-      ]
-    }
-
-    if (is_debug || dcheck_always_on) {
-      args += [ "--pretty" ]
-    }
-  }
-}
diff --git a/services/service_manager/public/tools/manifest/manifest_collator.py b/services/service_manager/public/tools/manifest/manifest_collator.py
deleted file mode 100755
index f631fccb..0000000
--- a/services/service_manager/public/tools/manifest/manifest_collator.py
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-""" A collator for Service Manifests """
-
-import argparse
-import json
-import os
-import shutil
-import sys
-import urlparse
-
-
-sys.path.append(os.path.join(
-    os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir,
-    os.pardir, "build", "android", "gyp"))
-from util import build_utils
-
-# Keys which are completely overridden by manifest overlays
-_MANIFEST_OVERLAY_OVERRIDE_KEYS = [
-  "display_name",
-]
-
-# Keys which are merged with content from manifest overlays
-_MANIFEST_OVERLAY_MERGE_KEYS = [
-  "interface_provider_specs",
-  "required_files",
-]
-
-eater_relative = "../../../../../../tools/json_comment_eater"
-eater_relative = os.path.join(os.path.abspath(__file__), eater_relative)
-sys.path.insert(0, os.path.normpath(eater_relative))
-try:
-  import json_comment_eater
-finally:
-  sys.path.pop(0)
-
-
-def ParseJSONFile(filename):
-  with open(filename) as json_file:
-    try:
-      return json.loads(json_comment_eater.Nom(json_file.read()))
-    except ValueError as e:
-      print "%s is not a valid JSON document" % filename
-      raise e
-
-
-def MergeDicts(left, right):
-  for k, v in right.iteritems():
-    if k not in left:
-      left[k] = v
-    else:
-      if isinstance(v, dict):
-        assert isinstance(left[k], dict)
-        MergeDicts(left[k], v)
-      elif isinstance(v, list):
-        assert isinstance(left[k], list)
-        left[k].extend(v)
-      else:
-        raise "Refusing to merge conflicting non-collection values."
-  return left
-
-
-def MergeManifestOverlay(manifest, overlay):
-
-  for key in _MANIFEST_OVERLAY_MERGE_KEYS:
-    if key in overlay:
-      MergeDicts(manifest[key], overlay[key])
-
-  if "services" in overlay:
-    if "services" not in manifest:
-      manifest["services"] = []
-    manifest["services"].extend(overlay["services"])
-
-  for key in _MANIFEST_OVERLAY_OVERRIDE_KEYS:
-    if key in overlay:
-      manifest[key] = overlay[key]
-
-
-def SanityCheckManifestServices(manifest):
-  """Ensures any given service name appears only once within a manifest."""
-  known_services = set()
-  def has_no_dupes(root):
-    if "name" in root:
-      name = root["name"]
-      if name in known_services:
-        raise ValueError(
-            "Duplicate manifest entry found for service: %s" % name)
-      known_services.add(name)
-    if "services" not in root:
-      return True
-    return all(has_no_dupes(service) for service in root["services"])
-  return has_no_dupes(manifest)
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description="Collate Service Manifests.")
-  parser.add_argument("--parent")
-  parser.add_argument("--output")
-  parser.add_argument("--name")
-  parser.add_argument("--pretty", action="store_true")
-  parser.add_argument("--overlays", nargs="+", dest="overlays", default=[])
-  parser.add_argument("--packaged-services", nargs="+",
-                      dest="packaged_services", default=[])
-  args, _ = parser.parse_known_args()
-
-  parent = ParseJSONFile(args.parent)
-
-  service_name = parent["name"] if "name" in parent else ""
-  if args.name and args.name != service_name:
-    raise ValueError("Service name '%s' specified in build file does not " \
-                     "match name '%s' specified in manifest." %
-                     (args.name, service_name))
-
-  packaged_services = []
-  for child_manifest in args.packaged_services:
-    packaged_services.append(ParseJSONFile(child_manifest))
-
-  if len(packaged_services) > 0:
-    if "services" not in parent:
-      parent["services"] = packaged_services
-    else:
-      parent["services"].extend(packaged_services)
-
-  for overlay_path in args.overlays:
-    MergeManifestOverlay(parent, ParseJSONFile(overlay_path))
-
-  with build_utils.AtomicOutput(args.output) as f:
-    json.dump(parent, f, indent=2 if args.pretty else -1)
-
-  # NOTE: We do the sanity check and possible failure *after* outputting the
-  # aggregate manifest so it's easier to inspect erroneous output.
-  SanityCheckManifestServices(parent)
-
-  return 0
-
-if __name__ == "__main__":
-  sys.exit(main())
diff --git a/services/test/echo/BUILD.gn b/services/test/echo/BUILD.gn
index f4676e6..8a4abc01 100644
--- a/services/test/echo/BUILD.gn
+++ b/services/test/echo/BUILD.gn
@@ -2,8 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//services/service_manager/public/service_manifest.gni")
-
 source_set("lib") {
   sources = [
     "echo_service.cc",
@@ -17,8 +15,3 @@
     "//services/test/echo/public/mojom",
   ]
 }
-
-service_manifest("manifest") {
-  name = "echo"
-  source = "manifest.json"
-}
diff --git a/services/test/echo/OWNERS b/services/test/echo/OWNERS
index 59dfd4b3..e69de29 100644
--- a/services/test/echo/OWNERS
+++ b/services/test/echo/OWNERS
@@ -1,2 +0,0 @@
-per-file manifest.json=set noparent
-per-file manifest.json=file://ipc/SECURITY_OWNERS
diff --git a/services/test/echo/manifest.json b/services/test/echo/manifest.json
deleted file mode 100644
index 10eae6c..0000000
--- a/services/test/echo/manifest.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "name": "echo",
-  "display_name": "Echo Service",
-  "options" : {
-    "instance_sharing" : "shared_instance_across_users"
-  },
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        "echo" : [ "echo.mojom.Echo" ]
-      }
-    }
-  }
-}
diff --git a/services/test/echo/public/cpp/BUILD.gn b/services/test/echo/public/cpp/BUILD.gn
new file mode 100644
index 0000000..fc2d595
--- /dev/null
+++ b/services/test/echo/public/cpp/BUILD.gn
@@ -0,0 +1,16 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("manifest") {
+  sources = [
+    "manifest.cc",
+    "manifest.h",
+  ]
+
+  deps = [
+    "//base",
+    "//services/service_manager/public/cpp",
+    "//services/test/echo/public/mojom",
+  ]
+}
diff --git a/services/test/echo/public/cpp/OWNERS b/services/test/echo/public/cpp/OWNERS
new file mode 100644
index 0000000..6faeaa47
--- /dev/null
+++ b/services/test/echo/public/cpp/OWNERS
@@ -0,0 +1,4 @@
+per-file manifest.cc=set noparent
+per-file manifest.cc=file://ipc/SECURITY_OWNERS
+per-file manifest.h=set noparent
+per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/test/echo/public/cpp/manifest.cc b/services/test/echo/public/cpp/manifest.cc
new file mode 100644
index 0000000..096e6d1
--- /dev/null
+++ b/services/test/echo/public/cpp/manifest.cc
@@ -0,0 +1,29 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/test/echo/public/cpp/manifest.h"
+
+#include "base/no_destructor.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/test/echo/public/mojom/echo.mojom.h"
+
+namespace echo {
+
+const service_manager::Manifest& GetManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .WithServiceName(mojom::kServiceName)
+          .WithDisplayName("Echo Service")
+          .WithOptions(service_manager::ManifestOptionsBuilder()
+                           .WithInstanceSharingPolicy(
+                               service_manager::Manifest::
+                                   InstanceSharingPolicy::kSharedAcrossGroups)
+                           .Build())
+          .ExposeCapability(
+              "echo", service_manager::Manifest::InterfaceList<mojom::Echo>())
+          .Build()};
+  return *manifest;
+}
+
+}  // namespace echo
diff --git a/services/test/echo/public/cpp/manifest.h b/services/test/echo/public/cpp/manifest.h
new file mode 100644
index 0000000..7a0e3761
--- /dev/null
+++ b/services/test/echo/public/cpp/manifest.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_TEST_ECHO_PUBLIC_CPP_MANIFEST_H_
+#define SERVICES_TEST_ECHO_PUBLIC_CPP_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace echo {
+
+const service_manager::Manifest& GetManifest();
+
+}  // namespace echo
+
+#endif  // SERVICES_TEST_ECHO_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/test/user_id/BUILD.gn b/services/test/user_id/BUILD.gn
index 1d90384..272d376 100644
--- a/services/test/user_id/BUILD.gn
+++ b/services/test/user_id/BUILD.gn
@@ -2,8 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//services/service_manager/public/service_manifest.gni")
-
 source_set("lib") {
   sources = [
     "user_id_service.cc",
@@ -17,8 +15,3 @@
     "//services/test/user_id/public/mojom",
   ]
 }
-
-service_manifest("manifest") {
-  name = "user_id"
-  source = "manifest.json"
-}
diff --git a/services/test/user_id/OWNERS b/services/test/user_id/OWNERS
index 59dfd4b3..e69de29 100644
--- a/services/test/user_id/OWNERS
+++ b/services/test/user_id/OWNERS
@@ -1,2 +0,0 @@
-per-file manifest.json=set noparent
-per-file manifest.json=file://ipc/SECURITY_OWNERS
diff --git a/services/test/user_id/manifest.json b/services/test/user_id/manifest.json
deleted file mode 100644
index 3e5ad06b..0000000
--- a/services/test/user_id/manifest.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "name": "user_id",
-  "display_name": "User ID Service",
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        "user_id" : [ "user_id.mojom.UserId" ]
-      }
-    }
-  }
-}
diff --git a/services/test/user_id/public/cpp/BUILD.gn b/services/test/user_id/public/cpp/BUILD.gn
new file mode 100644
index 0000000..d964c958
--- /dev/null
+++ b/services/test/user_id/public/cpp/BUILD.gn
@@ -0,0 +1,16 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("manifest") {
+  sources = [
+    "manifest.cc",
+    "manifest.h",
+  ]
+
+  deps = [
+    "//base",
+    "//services/service_manager/public/cpp",
+    "//services/test/user_id/public/mojom",
+  ]
+}
diff --git a/services/test/user_id/public/cpp/OWNERS b/services/test/user_id/public/cpp/OWNERS
new file mode 100644
index 0000000..6faeaa47
--- /dev/null
+++ b/services/test/user_id/public/cpp/OWNERS
@@ -0,0 +1,4 @@
+per-file manifest.cc=set noparent
+per-file manifest.cc=file://ipc/SECURITY_OWNERS
+per-file manifest.h=set noparent
+per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/test/user_id/public/cpp/manifest.cc b/services/test/user_id/public/cpp/manifest.cc
new file mode 100644
index 0000000..7bff2cb
--- /dev/null
+++ b/services/test/user_id/public/cpp/manifest.cc
@@ -0,0 +1,26 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/test/user_id/public/cpp/manifest.h"
+
+#include "base/no_destructor.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/test/user_id/public/mojom/user_id.mojom.h"
+
+namespace user_id {
+
+const service_manager::Manifest& GetManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .WithServiceName("user_id")
+          .WithDisplayName("User ID Service")
+          .WithOptions(service_manager::ManifestOptionsBuilder().Build())
+          .ExposeCapability(
+              "user_id",
+              service_manager::Manifest::InterfaceList<mojom::UserId>())
+          .Build()};
+  return *manifest;
+}
+
+}  // namespace user_id
diff --git a/services/test/user_id/public/cpp/manifest.h b/services/test/user_id/public/cpp/manifest.h
new file mode 100644
index 0000000..88f060f
--- /dev/null
+++ b/services/test/user_id/public/cpp/manifest.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_TEST_USER_ID_PUBLIC_CPP_MANIFEST_H_
+#define SERVICES_TEST_USER_ID_PUBLIC_CPP_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace user_id {
+
+const service_manager::Manifest& GetManifest();
+
+}  // namespace user_id
+
+#endif  // SERVICES_TEST_USER_ID_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/tracing/BUILD.gn b/services/tracing/BUILD.gn
index 5bb9bc0..3ca7786 100644
--- a/services/tracing/BUILD.gn
+++ b/services/tracing/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//build/config/chromecast_build.gni")
-import("//services/service_manager/public/service_manifest.gni")
 
 # There should be only one tracing service. It is currently
 # in the browser process. So, only //content/browser should link to this target.
diff --git a/services/video_capture/BUILD.gn b/services/video_capture/BUILD.gn
index 3c95613..a8bdf6f 100644
--- a/services/video_capture/BUILD.gn
+++ b/services/video_capture/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//services/service_manager/public/cpp/service_executable.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 
 service_executable("video_capture") {
diff --git a/services/viz/BUILD.gn b/services/viz/BUILD.gn
index 51cfdc4..a5716e9 100644
--- a/services/viz/BUILD.gn
+++ b/services/viz/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//services/service_manager/public/cpp/service_executable.gni")
-import("//services/service_manager/public/service_manifest.gni")
 
 service_executable("viz") {
   sources = [
@@ -37,8 +36,3 @@
     "//components/viz/service/main",
   ]
 }
-
-service_manifest("manifest") {
-  name = "viz"
-  source = "manifest.json"
-}
diff --git a/services/viz/OWNERS b/services/viz/OWNERS
index c6ffde3c..d60220b 100644
--- a/services/viz/OWNERS
+++ b/services/viz/OWNERS
@@ -1,5 +1 @@
 file://components/viz/OWNERS
-per-file manifest.json=set noparent
-per-file manifest.json=file://ipc/SECURITY_OWNERS
-per-file test_manifest.json=set noparent
-per-file test_manifest.json=file://ipc/SECURITY_OWNERS
diff --git a/services/viz/manifest.json b/services/viz/manifest.json
deleted file mode 100644
index d8e34a1..0000000
--- a/services/viz/manifest.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "viz",
-  // The viz service sometimes needs to do some additional work before entering
-  // the sandbox. So set sandbox_type to 'none', so that the service manager
-  // does not enter the sandbox. The viz service itself enters the sandbox at
-  // the right time. See code in GpuSandboxHelper for more details.
-  // TODO(crbug.com/708738): Revisit the implementation once sandboxing is
-  // fixed.
-  "sandbox_type": "none",
-  "display_name": "Visuals Service",
-  "options" : {
-    "instance_sharing" : "shared_instance_across_users"
-  },
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        "viz_host": [
-          "viz.mojom.VizMain"
-        ],
-        "ozone": [
-          "ui.ozone.mojom.DeviceCursor",
-          "ui.ozone.mojom.DrmDevice"
-        ]
-      },
-      "requires": {
-        "*": [ "app" ],
-        "catalog": [ "directory" ],
-        "ui": [ "ozone" ],
-        "metrics": [ "url_keyed_metrics" ]
-      }
-    }
-  }
-}
diff --git a/services/viz/public/cpp/BUILD.gn b/services/viz/public/cpp/BUILD.gn
new file mode 100644
index 0000000..dc34266f
--- /dev/null
+++ b/services/viz/public/cpp/BUILD.gn
@@ -0,0 +1,23 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/ui.gni")
+
+source_set("manifest") {
+  sources = [
+    "manifest.cc",
+    "manifest.h",
+  ]
+
+  deps = [
+    "//base",
+    "//services/service_manager/public/cpp",
+    "//services/viz/privileged/interfaces",
+    "//services/viz/public/interfaces",
+  ]
+
+  if (use_ozone) {
+    deps += [ "//ui/ozone/public/interfaces" ]
+  }
+}
diff --git a/services/viz/public/cpp/DEPS b/services/viz/public/cpp/DEPS
new file mode 100644
index 0000000..b808e4d
--- /dev/null
+++ b/services/viz/public/cpp/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ui/ozone/public/interfaces",
+]
diff --git a/services/viz/public/cpp/OWNERS b/services/viz/public/cpp/OWNERS
new file mode 100644
index 0000000..6faeaa47
--- /dev/null
+++ b/services/viz/public/cpp/OWNERS
@@ -0,0 +1,4 @@
+per-file manifest.cc=set noparent
+per-file manifest.cc=file://ipc/SECURITY_OWNERS
+per-file manifest.h=set noparent
+per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/viz/public/cpp/manifest.cc b/services/viz/public/cpp/manifest.cc
new file mode 100644
index 0000000..f0c7f8a
--- /dev/null
+++ b/services/viz/public/cpp/manifest.cc
@@ -0,0 +1,55 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/viz/public/cpp/manifest.h"
+
+#include "base/no_destructor.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/viz/privileged/interfaces/viz_main.mojom.h"
+#include "services/viz/public/interfaces/constants.mojom.h"
+
+#if defined(USE_OZONE)
+#include "ui/ozone/public/interfaces/device_cursor.mojom.h"
+#include "ui/ozone/public/interfaces/drm_device.mojom.h"
+#endif
+
+namespace viz {
+
+const service_manager::Manifest& GetManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest {
+    service_manager::ManifestBuilder()
+        .WithServiceName(mojom::kVizServiceName)
+        .WithDisplayName("Visuals Service")
+        .WithOptions(
+            service_manager::ManifestOptionsBuilder()
+                // The viz service sometimes needs to do some additional work
+                // before entering the sandbox. So set sandbox type to "none",
+                // so that the service manager does not enter the sandbox. The
+                // viz service itself enters the sandbox at the right time. See
+                // code in GpuSandboxHelper for more details.
+                // TODO(crbug.com/708738): Revisit the implementation once
+                // sandboxing is fixed.
+                .WithSandboxType("none")
+                .WithInstanceSharingPolicy(
+                    service_manager::Manifest::InstanceSharingPolicy::
+                        kSharedAcrossGroups)
+                .Build())
+#if defined(USE_OZONE)
+        .ExposeCapability(
+            "ozone",
+            service_manager::Manifest::InterfaceList<
+                ui::ozone::mojom::DeviceCursor, ui::ozone::mojom::DrmDevice>())
+#endif
+        .ExposeCapability(
+            "viz_host",
+            service_manager::Manifest::InterfaceList<mojom::VizMain>())
+        .RequireCapability("catalog", "directory")
+        .RequireCapability("metrics", "url_keyed_metrics")
+        .RequireCapability("ui", "ozone")
+        .Build()
+  };
+  return *manifest;
+}
+
+}  // namespace viz
diff --git a/services/viz/public/cpp/manifest.h b/services/viz/public/cpp/manifest.h
new file mode 100644
index 0000000..deef7ad
--- /dev/null
+++ b/services/viz/public/cpp/manifest.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_VIZ_PUBLIC_CPP_MANIFEST_H_
+#define SERVICES_VIZ_PUBLIC_CPP_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace viz {
+
+const service_manager::Manifest& GetManifest();
+
+}  // namespace viz
+
+#endif  // SERVICES_VIZ_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/ws/BUILD.gn b/services/ws/BUILD.gn
index f3cb09a..41f61a87 100644
--- a/services/ws/BUILD.gn
+++ b/services/ws/BUILD.gn
@@ -4,7 +4,6 @@
 
 import("//build/config/ui.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 
 component("lib") {
@@ -244,11 +243,6 @@
   }
 }
 
-service_manifest("manifest") {
-  name = "ui"
-  source = "manifest.json"
-}
-
 mojom("test_mojom") {
   testonly = true
 
diff --git a/services/ws/OWNERS b/services/ws/OWNERS
index 9315aba..6aec85b 100644
--- a/services/ws/OWNERS
+++ b/services/ws/OWNERS
@@ -9,8 +9,6 @@
 per-file *_type_converter*.*=set noparent
 per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
 
-per-file manifest.json=set noparent
-per-file manifest.json=file://ipc/SECURITY_OWNERS
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/ime/BUILD.gn b/services/ws/ime/BUILD.gn
index 8096264..2d277631 100644
--- a/services/ws/ime/BUILD.gn
+++ b/services/ws/ime/BUILD.gn
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 
 source_set("lib") {
@@ -33,7 +32,7 @@
     "//base/test:test_support",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/cpp/test:test_support",
-    "//services/ws/ime/test_ime_driver:manifest",
+    "//services/ws/ime/test_ime_driver/public/cpp:manifest",
     "//services/ws/ime/test_ime_driver/public/mojom",
     "//services/ws/public/mojom",
     "//services/ws/test_ws:manifest",
diff --git a/services/ws/ime/ime_unittest.cc b/services/ws/ime/ime_unittest.cc
index 14789b2f..4c59e2cb 100644
--- a/services/ws/ime/ime_unittest.cc
+++ b/services/ws/ime/ime_unittest.cc
@@ -13,7 +13,7 @@
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/cpp/test/test_service_manager.h"
-#include "services/ws/ime/test_ime_driver/manifest.h"
+#include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
 #include "services/ws/ime/test_ime_driver/public/mojom/constants.mojom.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 #include "services/ws/public/mojom/ime/ime.mojom.h"
diff --git a/services/ws/ime/test_ime_driver/BUILD.gn b/services/ws/ime/test_ime_driver/BUILD.gn
index 86070f16..9331693f 100644
--- a/services/ws/ime/test_ime_driver/BUILD.gn
+++ b/services/ws/ime/test_ime_driver/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//services/service_manager/public/cpp/service_executable.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 
 source_set("lib") {
@@ -33,8 +32,3 @@
     "//services/ws/public/mojom",
   ]
 }
-
-service_manifest("manifest") {
-  name = "test_ime_driver"
-  source = "manifest.json"
-}
diff --git a/services/ws/ime/test_ime_driver/OWNERS b/services/ws/ime/test_ime_driver/OWNERS
index 59dfd4b3..e69de29 100644
--- a/services/ws/ime/test_ime_driver/OWNERS
+++ b/services/ws/ime/test_ime_driver/OWNERS
@@ -1,2 +0,0 @@
-per-file manifest.json=set noparent
-per-file manifest.json=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/ime/test_ime_driver/manifest.json b/services/ws/ime/test_ime_driver/manifest.json
deleted file mode 100644
index d4dd447e..0000000
--- a/services/ws/ime/test_ime_driver/manifest.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "name": "test_ime_driver",
-  "display_name": "Test IME Driver",
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": { "ime:test_ime_driver": [] },
-      "requires": {
-        "ui": [ "ime_registrar" ]
-      }
-    }
-  }
-}
diff --git a/services/ws/ime/test_ime_driver/public/cpp/BUILD.gn b/services/ws/ime/test_ime_driver/public/cpp/BUILD.gn
new file mode 100644
index 0000000..e574d09
--- /dev/null
+++ b/services/ws/ime/test_ime_driver/public/cpp/BUILD.gn
@@ -0,0 +1,17 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("manifest") {
+  sources = [
+    "manifest.cc",
+    "manifest.h",
+  ]
+
+  deps = [
+    "//base",
+    "//services/service_manager/public/cpp",
+    "//services/ws/ime/test_ime_driver/public/mojom",
+    "//services/ws/public/mojom",
+  ]
+}
diff --git a/services/ws/ime/test_ime_driver/public/cpp/OWNERS b/services/ws/ime/test_ime_driver/public/cpp/OWNERS
new file mode 100644
index 0000000..6faeaa47
--- /dev/null
+++ b/services/ws/ime/test_ime_driver/public/cpp/OWNERS
@@ -0,0 +1,4 @@
+per-file manifest.cc=set noparent
+per-file manifest.cc=file://ipc/SECURITY_OWNERS
+per-file manifest.h=set noparent
+per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/ime/test_ime_driver/public/cpp/manifest.cc b/services/ws/ime/test_ime_driver/public/cpp/manifest.cc
new file mode 100644
index 0000000..96660f2
--- /dev/null
+++ b/services/ws/ime/test_ime_driver/public/cpp/manifest.cc
@@ -0,0 +1,25 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
+
+#include "base/no_destructor.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/ws/ime/test_ime_driver/public/mojom/constants.mojom.h"
+#include "services/ws/public/mojom/constants.mojom.h"
+
+namespace test_ime_driver {
+
+const service_manager::Manifest& GetManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .WithServiceName(mojom::kServiceName)
+          .WithDisplayName("Test IME Driver")
+          .ExposeCapability("ime:test_ime_driver", {})
+          .RequireCapability(ws::mojom::kServiceName, "ime_registrar")
+          .Build()};
+  return *manifest;
+}
+
+}  // namespace test_ime_driver
diff --git a/services/ws/ime/test_ime_driver/public/cpp/manifest.h b/services/ws/ime/test_ime_driver/public/cpp/manifest.h
new file mode 100644
index 0000000..8e45ef0
--- /dev/null
+++ b/services/ws/ime/test_ime_driver/public/cpp/manifest.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_WS_IME_TEST_IME_DRIVER_PUBLIC_CPP_MANIFEST_H_
+#define SERVICES_WS_IME_TEST_IME_DRIVER_PUBLIC_CPP_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace test_ime_driver {
+
+const service_manager::Manifest& GetManifest();
+
+}  // namespace test_ime_driver
+
+#endif  // SERVICES_WS_IME_TEST_IME_DRIVER_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/ws/manifest.json b/services/ws/manifest.json
deleted file mode 100644
index 552fddc..0000000
--- a/services/ws/manifest.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "name": "ui",
-  "sandbox_type": "none",
-  "display_name": "UI Service",
-  "options" : {
-    "instance_sharing" : "singleton"
-  },
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        // A collection of interfaces needed by a generic client of mus.
-        // Additional interfaces may be requested a-la-carte.
-        // NOTE: when adding a new interface chances are you will want to add it
-        // to window_manager as well.
-        "app": [
-          "discardable_memory.mojom.DiscardableSharedMemoryManager",
-          "ui.mojom.ClipboardHost",
-          "ws.mojom.Gpu",
-          "ws.mojom.IMEDriver",
-          "ws.mojom.InputDeviceServer",
-          "ws.mojom.WindowTreeFactory"
-        ],
-        "arc_manager" : [
-          "ws.mojom.ArcGpu"
-        ],
-        // TODO(crbug.com/912221): When viz is run in-process inside window
-        // service, window service should provide ozone interfaces; otherwise,
-        // viz service provides them itself. Remove this when the in-process viz
-        // codepath is removed.
-        "ozone": [
-          "ui.ozone.mojom.DeviceCursor",
-          "ui.ozone.mojom.DrmDevice"
-        ],
-        "test": [
-          "ws.mojom.EventInjector",
-          "ws.mojom.WindowServerTest"
-        ],
-        "discardable_memory": [
-          "discardable_memory.mojom.DiscardableSharedMemoryManager"
-        ],
-        "gpu_client": [
-          "ws.mojom.Gpu"
-        ],
-        "ime_registrar": [
-          "ws.mojom.IMERegistrar"
-        ],
-        "input_device_controller": [
-          "ws.mojom.InputDeviceController"
-        ],
-        "privileged": [
-          // Injecting events is security-sensitive.
-          "ws.mojom.EventInjector",
-          "ws.mojom.RemotingEventInjector"
-        ],
-        "window_manager": [
-          "discardable_memory.mojom.DiscardableSharedMemoryManager",
-          "ws.mojom.EventInjector",
-          "ws.mojom.Gpu",
-          "ws.mojom.IMEDriver",
-          "ws.mojom.InputDeviceController",
-          "ws.mojom.InputDeviceServer",
-          "ws.mojom.UserActivityMonitor"
-        ]
-      },
-      "requires": {
-        "*": [ "app" ],
-        "catalog": [ "directory" ],
-        "ui": [ "ozone" ],
-        "viz": [ "viz_host" ]
-      }
-    }
-  }
-}
diff --git a/services/ws/public/cpp/BUILD.gn b/services/ws/public/cpp/BUILD.gn
index 8e96d80e3..d715ec2 100644
--- a/services/ws/public/cpp/BUILD.gn
+++ b/services/ws/public/cpp/BUILD.gn
@@ -75,3 +75,24 @@
     deps += [ "//ui/ozone" ]
   }
 }
+
+source_set("manifest") {
+  sources = [
+    "manifest.cc",
+    "manifest.h",
+  ]
+
+  deps = [
+    "//base",
+    "//components/discardable_memory/public/interfaces",
+    "//services/service_manager/public/cpp",
+    "//services/ws/public/mojom",
+    "//services/ws/public/mojom/ime",
+    "//services/ws/public/mojom/input_devices",
+    "//ui/base/mojo",
+  ]
+
+  if (use_ozone) {
+    deps += [ "//ui/ozone/public/interfaces" ]
+  }
+}
diff --git a/services/ws/public/cpp/OWNERS b/services/ws/public/cpp/OWNERS
index 560bfc3..1bb2565 100644
--- a/services/ws/public/cpp/OWNERS
+++ b/services/ws/public/cpp/OWNERS
@@ -1,3 +1,7 @@
 per-file *_type_converter*.*=set noparent
 per-file *_type_converter*.*=file://ipc/SECURITY_OWNERS
 per-file *compositor_frame_sink*.*=fsamuel@chromium.org
+per-file manifest.cc=set noparent
+per-file manifest.cc=file://ipc/SECURITY_OWNERS
+per-file manifest.h=set noparent
+per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/ws/public/cpp/manifest.cc b/services/ws/public/cpp/manifest.cc
new file mode 100644
index 0000000..c0d53c8
--- /dev/null
+++ b/services/ws/public/cpp/manifest.cc
@@ -0,0 +1,106 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/ws/public/cpp/manifest.h"
+
+#include "base/no_destructor.h"
+#include "build/build_config.h"
+#include "components/discardable_memory/public/interfaces/discardable_shared_memory_manager.mojom.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/ws/public/mojom/constants.mojom.h"
+#include "services/ws/public/mojom/event_injector.mojom.h"
+#include "services/ws/public/mojom/gpu.mojom.h"
+#include "services/ws/public/mojom/ime/ime.mojom.h"
+#include "services/ws/public/mojom/input_devices/input_device_server.mojom.h"
+#include "services/ws/public/mojom/remoting_event_injector.mojom.h"
+#include "services/ws/public/mojom/user_activity_monitor.mojom.h"
+#include "services/ws/public/mojom/window_server_test.mojom.h"
+#include "services/ws/public/mojom/window_tree.mojom.h"
+#include "ui/base/mojo/clipboard.mojom.h"
+
+#if defined(OS_CHROMEOS)
+#include "services/ws/public/mojom/arc_gpu.mojom.h"
+#include "services/ws/public/mojom/input_devices/input_device_controller.mojom.h"
+#endif
+
+#if defined(USE_OZONE)
+#include "ui/ozone/public/interfaces/device_cursor.mojom.h"
+#include "ui/ozone/public/interfaces/drm_device.mojom.h"
+#endif
+
+namespace ws {
+
+const service_manager::Manifest& GetManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest {
+    service_manager::ManifestBuilder()
+        .WithServiceName(mojom::kServiceName)
+        .WithDisplayName("UI Service")
+        .WithOptions(service_manager::ManifestOptionsBuilder()
+                         .WithSandboxType("none")
+                         .WithInstanceSharingPolicy(
+                             service_manager::Manifest::InstanceSharingPolicy::
+                                 kSingleton)
+                         .Build())
+        .ExposeCapability(
+            "app",
+            service_manager::Manifest::InterfaceList<
+                discardable_memory::mojom::DiscardableSharedMemoryManager,
+                ui::mojom::ClipboardHost, mojom::Gpu, mojom::IMEDriver,
+                mojom::InputDeviceServer, mojom::WindowTreeFactory>())
+        .ExposeCapability(
+            "discardable_memory",
+            service_manager::Manifest::InterfaceList<
+                discardable_memory::mojom::DiscardableSharedMemoryManager>())
+        .ExposeCapability(
+            "gpu_client",
+            service_manager::Manifest::InterfaceList<mojom::Gpu>())
+#if defined(USE_OZONE)
+        // TODO(crbug.com/912221): When viz is run in-process inside window
+        // service, window service should provide ozone interfaces; otherwise,
+        // viz service provides them itself. Remove this when the in-process viz
+        // codepath is removed.
+        .ExposeCapability(
+            "ozone",
+            service_manager::Manifest::InterfaceList<
+                ui::ozone::mojom::DeviceCursor, ui::ozone::mojom::DrmDevice>())
+#endif
+        .ExposeCapability(
+            "test",
+            service_manager::Manifest::InterfaceList<mojom::EventInjector,
+                                                     mojom::WindowServerTest>())
+        .ExposeCapability(
+            "ime_registrar",
+            service_manager::Manifest::InterfaceList<mojom::IMERegistrar>())
+        .ExposeCapability(
+            "privileged",
+            service_manager::Manifest::InterfaceList<
+                mojom::EventInjector, mojom::RemotingEventInjector>())
+        .ExposeCapability(
+            "window_manager",
+            service_manager::Manifest::InterfaceList<
+#if defined(OS_CHROMEOS)
+                mojom::InputDeviceController,
+#endif
+                discardable_memory::mojom::DiscardableSharedMemoryManager,
+                mojom::EventInjector, mojom::Gpu, mojom::IMEDriver,
+                mojom::InputDeviceServer, mojom::UserActivityMonitor>())
+#if defined(OS_CHROMEOS)
+        .ExposeCapability(
+            "arc_manager",
+            service_manager::Manifest::InterfaceList<mojom::ArcGpu>())
+        .ExposeCapability("input_device_controller",
+                          service_manager::Manifest::InterfaceList<
+                              mojom::InputDeviceController>())
+#endif
+        .RequireCapability("viz", "viz_host")
+        .RequireCapability("catalog", "directory")
+        .RequireCapability("*", "app")
+        .RequireCapability("ui", "ozone")
+
+        .Build()
+  };
+  return *manifest;
+}
+
+}  // namespace ws
diff --git a/services/ws/public/cpp/manifest.h b/services/ws/public/cpp/manifest.h
new file mode 100644
index 0000000..ac22cba
--- /dev/null
+++ b/services/ws/public/cpp/manifest.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_WS_PUBLIC_CPP_MANIFEST_H_
+#define SERVICES_WS_PUBLIC_CPP_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace ws {
+
+const service_manager::Manifest& GetManifest();
+
+}  // namespace ws
+
+#endif  // SERVICES_WS_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/ws/test_ws/BUILD.gn b/services/ws/test_ws/BUILD.gn
index 710801dd..0a2a423 100644
--- a/services/ws/test_ws/BUILD.gn
+++ b/services/ws/test_ws/BUILD.gn
@@ -4,7 +4,6 @@
 
 import("//mojo/public/tools/bindings/mojom.gni")
 import("//services/service_manager/public/cpp/service_executable.gni")
-import("//services/service_manager/public/service_manifest.gni")
 
 service_executable("test_ws") {
   testonly = true
@@ -65,7 +64,7 @@
     "//base",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/mojom",
-    "//services/ws:manifest",
+    "//services/ws/public/cpp:manifest",
   ]
 }
 
diff --git a/services/ws/test_ws/test_manifest.cc b/services/ws/test_ws/test_manifest.cc
index 58dcb8d..3d62e05 100644
--- a/services/ws/test_ws/test_manifest.cc
+++ b/services/ws/test_ws/test_manifest.cc
@@ -7,7 +7,7 @@
 #include "base/no_destructor.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/service_manager/public/mojom/service_factory.mojom.h"
-#include "services/ws/manifest.h"
+#include "services/ws/public/cpp/manifest.h"
 #include "services/ws/test_ws/test_ws.mojom.h"
 
 namespace test_ws {
@@ -25,7 +25,7 @@
           .ExposeCapability("service_manager:service_factory",
                             service_manager::Manifest::InterfaceList<
                                 service_manager::mojom::ServiceFactory>())
-          .PackageService(ui::GetManifest())
+          .PackageService(ws::GetManifest())
           .Build()};
   return *manifest;
 }
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 1d4d99c..46a986e 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -166,8 +166,6 @@
 #define SK_SUPPORT_LEGACY_AAA_CHOICE
 #endif
 
-#define SK_LEGACY_SRGB_STAGE_CHOICE
-
 // We're turning this off indefinitely,
 // until we can figure out some fundamental problems with its approach.
 //
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 8dd5c01..106efc62 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5666,21 +5666,6 @@
             ]
         }
     ],
-    "WebViewUmaLogAppPackageName": [
-        {
-            "platforms": [
-                "android_webview"
-            ],
-            "experiments": [
-                {
-                    "name": "WebViewUmaLogAppPackageName",
-                    "enable_features": [
-                        "WebViewUmaLogAppPackageName"
-                    ]
-                }
-            ]
-        }
-    ],
     "WinOOPSelectFileDialog": [
         {
             "platforms": [
diff --git a/third_party/blink/perf_tests/events/is-input-pending-all-events.html b/third_party/blink/perf_tests/events/is-input-pending-all-events.html
new file mode 100644
index 0000000..e7b4c12
--- /dev/null
+++ b/third_party/blink/perf_tests/events/is-input-pending-all-events.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src="../resources/runner.js"></script>
+</script>
+<script>
+PerfTestRunner.measureRunsPerSecond({
+  description: "Measures performance of querying navigator.scheduling.isInputPending with all supported events.",
+  run: () => {
+    navigator.scheduling.isInputPending([
+      "click",
+      "dblclick",
+      "mousedown",
+      "mouseenter",
+      "mouseleave",
+      "mousemove",
+      "mouseout",
+      "mouseover",
+      "mouseup",
+      "wheel",
+      "keydown",
+      "keyup",
+      "touchstart",
+      "touchend",
+      "touchmove",
+      "touchcancel",
+    ]);
+  },
+});
+</script>
+</body>
+</html>
diff --git a/third_party/blink/perf_tests/events/is-input-pending-default-events.html b/third_party/blink/perf_tests/events/is-input-pending-default-events.html
new file mode 100644
index 0000000..44ddbeb
--- /dev/null
+++ b/third_party/blink/perf_tests/events/is-input-pending-default-events.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<body>
+<script src="../resources/runner.js"></script>
+</script>
+<script>
+PerfTestRunner.measureRunsPerSecond({
+  description: "Measures performance of querying navigator.scheduling.isInputPending with no event types.",
+  run: () => {
+    navigator.scheduling.isInputPending();
+  },
+});
+</script>
+</body>
+</html>
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_stream_handle.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_stream_handle.h
index 626a501..6ebb99b8 100644
--- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_stream_handle.h
+++ b/third_party/blink/public/platform/modules/service_worker/web_service_worker_stream_handle.h
@@ -20,7 +20,7 @@
   class Listener {
    public:
     virtual ~Listener() = default;
-    ;
+
     virtual void OnAborted() = 0;
     virtual void OnCompleted() = 0;
   };
diff --git a/third_party/blink/public/platform/web_media_player_client.h b/third_party/blink/public/platform/web_media_player_client.h
index 092556d..49594467 100644
--- a/third_party/blink/public/platform/web_media_player_client.h
+++ b/third_party/blink/public/platform/web_media_player_client.h
@@ -152,7 +152,7 @@
 
   // Returns the remote playback client associated with the media element, if
   // any.
-  virtual WebRemotePlaybackClient* RemotePlaybackClient() { return nullptr; };
+  virtual WebRemotePlaybackClient* RemotePlaybackClient() { return nullptr; }
 
   // Returns the color space to render media into if.
   // Rendering media into this color space may avoid some conversions.
diff --git a/third_party/blink/public/platform/web_rtc_data_channel_handler_client.h b/third_party/blink/public/platform/web_rtc_data_channel_handler_client.h
index 9b9023f3..de33e0d 100644
--- a/third_party/blink/public/platform/web_rtc_data_channel_handler_client.h
+++ b/third_party/blink/public/platform/web_rtc_data_channel_handler_client.h
@@ -44,7 +44,7 @@
 
   virtual void DidChangeReadyState(ReadyState) = 0;
   // TODO(bemasc): Make this pure virtual once Chromium unit tests are updated
-  virtual void DidDecreaseBufferedAmount(unsigned){};
+  virtual void DidDecreaseBufferedAmount(unsigned) {}
   virtual void DidReceiveStringData(const WebString&) = 0;
   virtual void DidReceiveRawData(const char*, size_t) = 0;
   virtual void DidDetectError() = 0;
diff --git a/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h b/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h
index 10940467..9d2a5db 100644
--- a/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h
+++ b/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h
@@ -57,7 +57,7 @@
   virtual void DidChangeIceConnectionState(
       webrtc::PeerConnectionInterface::IceConnectionState) = 0;
   virtual void DidChangePeerConnectionState(
-      webrtc::PeerConnectionInterface::PeerConnectionState){};
+      webrtc::PeerConnectionInterface::PeerConnectionState) {}
   virtual void DidAddReceiverPlanB(std::unique_ptr<WebRTCRtpReceiver>) = 0;
   virtual void DidRemoveReceiverPlanB(std::unique_ptr<WebRTCRtpReceiver>) = 0;
   virtual void DidModifyTransceivers(
diff --git a/third_party/blink/public/web/web_node.h b/third_party/blink/public/web/web_node.h
index 3148389..b922632 100644
--- a/third_party/blink/public/web/web_node.h
+++ b/third_party/blink/public/web/web_node.h
@@ -130,7 +130,7 @@
   template <>                             \
   BLINK_EXPORT type WebNode::To<type>();  \
   template <>                             \
-  BLINK_EXPORT const type WebNode::ToConst<type>() const;
+  BLINK_EXPORT const type WebNode::ToConst<type>() const
 
 #if INSIDE_BLINK
 #define DEFINE_WEB_NODE_TYPE_CASTS(type, predicate)        \
diff --git a/third_party/blink/renderer/bindings/core/v8/rejected_promises.h b/third_party/blink/renderer/bindings/core/v8/rejected_promises.h
index b4bb6f7b..a8b41fee 100644
--- a/third_party/blink/renderer/bindings/core/v8/rejected_promises.h
+++ b/third_party/blink/renderer/bindings/core/v8/rejected_promises.h
@@ -14,7 +14,7 @@
 
 namespace v8 {
 class PromiseRejectMessage;
-};
+}
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/animation/keyframe.h b/third_party/blink/renderer/core/animation/keyframe.h
index ccf93f6..5df8b19 100644
--- a/third_party/blink/renderer/core/animation/keyframe.h
+++ b/third_party/blink/renderer/core/animation/keyframe.h
@@ -159,7 +159,7 @@
         const PropertyHandle&,
         const Keyframe::PropertySpecificKeyframe& end) const;
 
-    virtual void Trace(Visitor*){};
+    virtual void Trace(Visitor*) {}
 
    protected:
     double offset_;
diff --git a/third_party/blink/renderer/core/context_features/context_feature_settings.h b/third_party/blink/renderer/core/context_features/context_feature_settings.h
index 66187cc..8ef606e 100644
--- a/third_party/blink/renderer/core/context_features/context_feature_settings.h
+++ b/third_party/blink/renderer/core/context_features/context_feature_settings.h
@@ -19,7 +19,8 @@
 class CORE_EXPORT ContextFeatureSettings final
     : public GarbageCollectedFinalized<ContextFeatureSettings>,
       public Supplement<ExecutionContext> {
-  USING_GARBAGE_COLLECTED_MIXIN(ContextFeatureSettings)
+  USING_GARBAGE_COLLECTED_MIXIN(ContextFeatureSettings);
+
  public:
   static const char kSupplementName[];
 
diff --git a/third_party/blink/renderer/core/css/css_paint_image_generator.h b/third_party/blink/renderer/core/css/css_paint_image_generator.h
index ccecc1e9..262424e 100644
--- a/third_party/blink/renderer/core/css/css_paint_image_generator.h
+++ b/third_party/blink/renderer/core/css/css_paint_image_generator.h
@@ -30,7 +30,7 @@
   class Observer : public GarbageCollectedFinalized<Observer> {
    public:
     virtual ~Observer() = default;
-    ;
+
     virtual void PaintImageGeneratorReady() = 0;
     virtual void Trace(blink::Visitor* visitor) {}
   };
diff --git a/third_party/blink/renderer/core/css/invalidation/invalidation_set.h b/third_party/blink/renderer/core/css/invalidation/invalidation_set.h
index 1c04555..01694f90 100644
--- a/third_party/blink/renderer/core/css/invalidation/invalidation_set.h
+++ b/third_party/blink/renderer/core/css/invalidation/invalidation_set.h
@@ -117,7 +117,7 @@
 
   void SetInvalidationFlags(InvalidationFlags flags) {
     invalidation_flags_ = flags;
-  };
+  }
 
   void SetWholeSubtreeInvalid();
   bool WholeSubtreeInvalid() const {
@@ -157,7 +157,7 @@
 
   const InvalidationFlags GetInvalidationFlags() const {
     return invalidation_flags_;
-  };
+  }
 
   void SetInvalidatesParts() { invalidation_flags_.SetInvalidatesParts(true); }
   bool InvalidatesParts() const {
@@ -294,8 +294,8 @@
     class Range {
      public:
       Range(Iterator begin, Iterator end) : begin_(begin), end_(end) {}
-      Iterator begin() const { return begin_; };
-      Iterator end() const { return end_; };
+      Iterator begin() const { return begin_; }
+      Iterator end() const { return end_; }
 
      private:
       Iterator begin_;
diff --git a/third_party/blink/renderer/core/css/invalidation/pending_invalidations.h b/third_party/blink/renderer/core/css/invalidation/pending_invalidations.h
index 1f98d90..6090c79 100644
--- a/third_party/blink/renderer/core/css/invalidation/pending_invalidations.h
+++ b/third_party/blink/renderer/core/css/invalidation/pending_invalidations.h
@@ -66,7 +66,7 @@
 
  public:
   PendingInvalidations();
-  ~PendingInvalidations(){};
+  ~PendingInvalidations() {}
   void Invalidate(Document&);
   // May immediately invalidate the node and/or add pending invalidation sets to
   // this node.
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder.h b/third_party/blink/renderer/core/css/resolver/font_builder.h
index 0f4b775..ddb0bb87 100644
--- a/third_party/blink/renderer/core/css/resolver/font_builder.h
+++ b/third_party/blink/renderer/core/css/resolver/font_builder.h
@@ -103,7 +103,7 @@
   }
   static FontVariantEastAsian InitialVariantEastAsian() {
     return FontVariantEastAsian();
-  };
+  }
   static FontDescription::VariantLigatures InitialVariantLigatures() {
     return FontDescription::VariantLigatures();
   }
diff --git a/third_party/blink/renderer/core/css/style_environment_variables.cc b/third_party/blink/renderer/core/css/style_environment_variables.cc
index 4f76fb1..d74069c 100644
--- a/third_party/blink/renderer/core/css/style_environment_variables.cc
+++ b/third_party/blink/renderer/core/css/style_environment_variables.cc
@@ -38,7 +38,7 @@
     }
 
     return *instance_.get();
-  };
+  }
 
  private:
   scoped_refptr<StyleEnvironmentVariables> instance_;
diff --git a/third_party/blink/renderer/core/dom/element_traversal.h b/third_party/blink/renderer/core/dom/element_traversal.h
index 7eff38d..ea421bfc 100644
--- a/third_party/blink/renderer/core/dom/element_traversal.h
+++ b/third_party/blink/renderer/core/dom/element_traversal.h
@@ -221,7 +221,7 @@
 Traversal<ElementType>::ChildrenOf(const Node& start) {
   return TraversalSiblingRange<Traversal<ElementType>>(
       Traversal<ElementType>::FirstChild(start));
-};
+}
 
 template <class ElementType>
 inline TraversalDescendantRange<Traversal<ElementType>>
diff --git a/third_party/blink/renderer/core/exported/web_navigation_params.cc b/third_party/blink/renderer/core/exported/web_navigation_params.cc
index b58f14a..b41b8a9 100644
--- a/third_party/blink/renderer/core/exported/web_navigation_params.cc
+++ b/third_party/blink/renderer/core/exported/web_navigation_params.cc
@@ -40,7 +40,7 @@
   result->is_client_redirect = info.is_client_redirect;
   result->navigation_timings.input_start = info.input_start;
   return result;
-};
+}
 
 // static
 std::unique_ptr<WebNavigationParams> WebNavigationParams::CreateWithHTMLString(
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.h b/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
index 1533cfb..c52d5092 100644
--- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
+++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.h
@@ -51,11 +51,11 @@
 
 namespace base {
 class SingleThreadTaskRunner;
-};
+}
 
 namespace network {
 class SharedURLLoaderFactory;
-};
+}
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/fetch/fetch_data_loader.cc b/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
index a83315ce..fffa989 100644
--- a/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_data_loader.cc
@@ -116,7 +116,8 @@
 
 class FetchDataLoaderAsArrayBuffer final : public FetchDataLoader,
                                            public BytesConsumer::Client {
-  USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsArrayBuffer)
+  USING_GARBAGE_COLLECTED_MIXIN(FetchDataLoaderAsArrayBuffer);
+
  public:
   void Start(BytesConsumer* consumer,
              FetchDataLoader::Client* client) override {
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h
index 3a150f3..bfe536f 100644
--- a/third_party/blink/renderer/core/frame/local_frame_client.h
+++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -443,7 +443,7 @@
                                          const KURL&,
                                          const String&) {
     return false;
-  };
+  }
 
   // Returns a new WebWorkerFetchContext for a dedicated worker or worklet.
   virtual scoped_refptr<WebWorkerFetchContext> CreateWorkerFetchContext() {
diff --git a/third_party/blink/renderer/core/frame/performance_monitor.cc b/third_party/blink/renderer/core/frame/performance_monitor.cc
index 40ebca7..83dbda9 100644
--- a/third_party/blink/renderer/core/frame/performance_monitor.cc
+++ b/third_party/blink/renderer/core/frame/performance_monitor.cc
@@ -28,7 +28,7 @@
 
 void PerformanceMonitor::BypassLongCompileThresholdOnceForTesting() {
   bypass_long_compile_threshold_ = true;
-};
+}
 
 // static
 base::TimeDelta PerformanceMonitor::Threshold(ExecutionContext* context,
diff --git a/third_party/blink/renderer/core/frame/reporting_context.h b/third_party/blink/renderer/core/frame/reporting_context.h
index 4b86d99..09d5960f 100644
--- a/third_party/blink/renderer/core/frame/reporting_context.h
+++ b/third_party/blink/renderer/core/frame/reporting_context.h
@@ -21,7 +21,8 @@
 class CORE_EXPORT ReportingContext final
     : public GarbageCollectedFinalized<ReportingContext>,
       public Supplement<ExecutionContext> {
-  USING_GARBAGE_COLLECTED_MIXIN(ReportingContext)
+  USING_GARBAGE_COLLECTED_MIXIN(ReportingContext);
+
  public:
   static const char kSupplementName[];
 
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
index 074bbaf..48ad811 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.h
@@ -155,7 +155,7 @@
 
   GraphicsLayer* RootGraphicsLayer() const override {
     return root_graphics_layer_;
-  };
+  }
 
   void Trace(blink::Visitor*) override;
 
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
index 565a8b0..df21bde 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context.h
@@ -99,7 +99,7 @@
   virtual void SetIsHidden(bool) = 0;
   virtual bool isContextLost() const { return true; }
   // TODO(fserb): remove SetCanvasGetContextResult.
-  virtual void SetCanvasGetContextResult(RenderingContext&) { NOTREACHED(); };
+  virtual void SetCanvasGetContextResult(RenderingContext&) { NOTREACHED(); }
   virtual void SetOffscreenCanvasGetContextResult(OffscreenRenderingContext&) {
     NOTREACHED();
   }
@@ -156,7 +156,7 @@
     return HitTestCanvasResult::Create(String(), nullptr);
   }
   virtual String GetIdFromControl(const Element* element) { return String(); }
-  virtual void ResetUsageTracking(){};
+  virtual void ResetUsageTracking() {}
 
   // WebGL-specific interface
   virtual bool Is3d() const { return false; }
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_factory.h b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_factory.h
index 1a3765b..5a56e7a 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_factory.h
+++ b/third_party/blink/renderer/core/html/canvas/canvas_rendering_context_factory.h
@@ -30,8 +30,8 @@
       const CanvasContextCreationAttributesCore&) = 0;
 
   virtual CanvasRenderingContext::ContextType GetContextType() const = 0;
-  virtual void OnError(HTMLCanvasElement*, const String& error){};
-  virtual void OnError(OffscreenCanvas*, const String& error){};
+  virtual void OnError(HTMLCanvasElement*, const String& error) {}
+  virtual void OnError(OffscreenCanvas*, const String& error) {}
 
   DISALLOW_COPY_AND_ASSIGN(CanvasRenderingContextFactory);
 };
diff --git a/third_party/blink/renderer/core/html/canvas/image_data.h b/third_party/blink/renderer/core/html/canvas/image_data.h
index d33e9aae..8abdfd04 100644
--- a/third_party/blink/renderer/core/html/canvas/image_data.h
+++ b/third_party/blink/renderer/core/html/canvas/image_data.h
@@ -134,7 +134,7 @@
   const DOMUint8ClampedArray* data() const;
   ImageDataArray& dataUnion() { return data_union_; }
   const ImageDataArray& dataUnion() const { return data_union_; }
-  void dataUnion(ImageDataArray& result) { result = data_union_; };
+  void dataUnion(ImageDataArray& result) { result = data_union_; }
 
   DOMArrayBufferBase* BufferBase() const;
   CanvasColorParams GetCanvasColorParams();
diff --git a/third_party/blink/renderer/core/html/forms/form_data_event.h b/third_party/blink/renderer/core/html/forms/form_data_event.h
index 820b8b2..3d068235 100644
--- a/third_party/blink/renderer/core/html/forms/form_data_event.h
+++ b/third_party/blink/renderer/core/html/forms/form_data_event.h
@@ -24,7 +24,7 @@
 
   void Trace(Visitor* visitor) override;
 
-  FormData* formData() const { return form_data_; };
+  FormData* formData() const { return form_data_; }
 
   const AtomicString& InterfaceName() const override;
 
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index 79f7962..3a77be8 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -385,6 +385,6 @@
 
 void HTMLFormControlElement::AssociateWith(HTMLFormElement* form) {
   AssociateByParser(form);
-};
+}
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index ebdd2a9..a4d2775 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -119,7 +119,7 @@
   void CloneNonAttributePropertiesFrom(const Element&,
                                        CloneChildrenFlag) override;
 
-  FormAssociated* ToFormAssociatedOrNull() override { return this; };
+  FormAssociated* ToFormAssociatedOrNull() override { return this; }
   void AssociateWith(HTMLFormElement*) override;
 
   bool BlocksFormSubmission() const { return blocks_form_submission_; }
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index c95082a..f9a5028 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -1496,7 +1496,7 @@
 
 bool HTMLElement::SupportsFocus() const {
   return Element::SupportsFocus() && !IsDisabledFormControl();
-};
+}
 
 bool HTMLElement::IsDisabledFormControl() const {
   if (!IsFormAssociatedCustomElement())
diff --git a/third_party/blink/renderer/core/html/html_image_element.h b/third_party/blink/renderer/core/html/html_image_element.h
index f724691f..53a09cf2 100644
--- a/third_party/blink/renderer/core/html/html_image_element.h
+++ b/third_party/blink/renderer/core/html/html_image_element.h
@@ -152,7 +152,7 @@
 
   void ForceReload() const;
 
-  FormAssociated* ToFormAssociatedOrNull() override { return this; };
+  FormAssociated* ToFormAssociatedOrNull() override { return this; }
   void AssociateWith(HTMLFormElement*) override;
 
   bool ElementCreatedByParser() const { return element_created_by_parser_; }
diff --git a/third_party/blink/renderer/core/html/html_object_element.h b/third_party/blink/renderer/core/html/html_object_element.h
index a6da0c8..3ae37a65 100644
--- a/third_party/blink/renderer/core/html/html_object_element.h
+++ b/third_party/blink/renderer/core/html/html_object_element.h
@@ -88,7 +88,7 @@
 
   bool WillUseFallbackContentAtLayout() const;
 
-  FormAssociated* ToFormAssociatedOrNull() override { return this; };
+  FormAssociated* ToFormAssociatedOrNull() override { return this; }
   void AssociateWith(HTMLFormElement*) override;
 
  private:
diff --git a/third_party/blink/renderer/core/html/media/video_wake_lock.h b/third_party/blink/renderer/core/html/media/video_wake_lock.h
index f3ede1b1..ee4ec11 100644
--- a/third_party/blink/renderer/core/html/media/video_wake_lock.h
+++ b/third_party/blink/renderer/core/html/media/video_wake_lock.h
@@ -28,7 +28,7 @@
 class CORE_EXPORT VideoWakeLock final : public NativeEventListener,
                                         public PageVisibilityObserver,
                                         public RemotePlaybackObserver {
-  USING_GARBAGE_COLLECTED_MIXIN(VideoWakeLock)
+  USING_GARBAGE_COLLECTED_MIXIN(VideoWakeLock);
 
  public:
   explicit VideoWakeLock(HTMLVideoElement&);
diff --git a/third_party/blink/renderer/core/origin_trials/origin_trial_context.h b/third_party/blink/renderer/core/origin_trials/origin_trial_context.h
index f5fc607..0a2ba6e 100644
--- a/third_party/blink/renderer/core/origin_trials/origin_trial_context.h
+++ b/third_party/blink/renderer/core/origin_trials/origin_trial_context.h
@@ -35,7 +35,8 @@
 class CORE_EXPORT OriginTrialContext final
     : public GarbageCollectedFinalized<OriginTrialContext>,
       public Supplement<ExecutionContext> {
-  USING_GARBAGE_COLLECTED_MIXIN(OriginTrialContext)
+  USING_GARBAGE_COLLECTED_MIXIN(OriginTrialContext);
+
  public:
   static const char kSupplementName[];
 
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
index da6c5b4..3028b38 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
@@ -109,7 +109,7 @@
     ColorChooserClient::Trace(visitor);
   }
 
-  USING_GARBAGE_COLLECTED_MIXIN(FakeColorChooserClient)
+  USING_GARBAGE_COLLECTED_MIXIN(FakeColorChooserClient);
 
   // ColorChooserClient
   void DidChooseColor(const Color& color) override {}
@@ -139,7 +139,7 @@
     DateTimeChooserClient::Trace(visitor);
   }
 
-  USING_GARBAGE_COLLECTED_MIXIN(FakeDateTimeChooserClient)
+  USING_GARBAGE_COLLECTED_MIXIN(FakeDateTimeChooserClient);
 
   // DateTimeChooserClient
   Element& OwnerElement() const override { return *owner_element_; }
diff --git a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
index 291f56a0..1c727cd 100644
--- a/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
+++ b/third_party/blink/renderer/core/svg/animation/svg_smil_element.cc
@@ -411,10 +411,6 @@
   return result;
 }
 
-static void SortTimeList(Vector<SMILTimeWithOrigin>& time_list) {
-  std::sort(time_list.begin(), time_list.end());
-}
-
 bool SVGSMILElement::ParseCondition(const String& value,
                                     BeginOrEnd begin_or_end) {
   String parse_string = value.StripWhiteSpace();
@@ -509,7 +505,7 @@
           SMILTimeWithOrigin(value, SMILTimeWithOrigin::kParserOrigin));
     }
   }
-  SortTimeList(time_list);
+  std::sort(time_list.begin(), time_list.end());
 }
 
 void SVGSMILElement::ParseAttribute(const AttributeModificationParams& params) {
@@ -711,6 +707,12 @@
   return std::min(Dur(), SMILTime::Indefinite());
 }
 
+static void InsertSorted(Vector<SMILTimeWithOrigin>& list,
+                         SMILTimeWithOrigin time) {
+  auto* position = std::lower_bound(list.begin(), list.end(), time);
+  list.insert(position - list.begin(), time);
+}
+
 void SVGSMILElement::AddInstanceTime(BeginOrEnd begin_or_end,
                                      SMILTime time,
                                      SMILTimeWithOrigin::Origin origin) {
@@ -725,8 +727,7 @@
     return;
   Vector<SMILTimeWithOrigin>& list =
       begin_or_end == kBegin ? begin_times_ : end_times_;
-  list.push_back(time_with_origin);
-  SortTimeList(list);
+  InsertSorted(list, time_with_origin);
   if (begin_or_end == kBegin)
     BeginListChanged(elapsed);
   else
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc b/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc
index 3095d62..1a599d0 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_callbacks.cc
@@ -122,7 +122,7 @@
 void ScriptErrorCallback::Invoke(base::File::Error error) {
   callback_->InvokeAndReportException(nullptr,
                                       file_error::CreateDOMException(error));
-};
+}
 
 ScriptErrorCallback::ScriptErrorCallback(V8ErrorCallback* callback)
     : callback_(ToV8PersistentCallbackInterface(callback)) {}
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.cc b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
index e8d4ec88..fb64c58 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
@@ -479,7 +479,7 @@
     return;
   }
 
-  base::Optional<unsigned long long> new_version_nullable;
+  base::Optional<uint64_t> new_version_nullable;
   if (new_version != IDBDatabaseMetadata::kNoVersion) {
     new_version_nullable = new_version;
   }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.h b/third_party/blink/renderer/modules/indexeddb/idb_database.h
index dead18a..a142b2c 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.h
@@ -97,7 +97,7 @@
 
   // Implement the IDL
   const String& name() const { return metadata_.name; }
-  unsigned long long version() const { return metadata_.version; }
+  uint64_t version() const { return metadata_.version; }
   DOMStringList* objectStoreNames() const;
 
   IDBObjectStore* createObjectStore(const String& name,
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
index bf84551..cdf9effe 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.cc
@@ -290,7 +290,7 @@
 
 IDBOpenDBRequest* IDBFactory::open(ScriptState* script_state,
                                    const String& name,
-                                   unsigned long long version,
+                                   uint64_t version,
                                    ExceptionState& exception_state) {
   if (!version) {
     exception_state.ThrowTypeError("The version provided must not be 0.");
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_factory.h b/third_party/blink/renderer/modules/indexeddb/idb_factory.h
index 46485497..8c84351 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_factory.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_factory.h
@@ -59,7 +59,7 @@
   IDBOpenDBRequest* open(ScriptState*, const String& name, ExceptionState&);
   IDBOpenDBRequest* open(ScriptState*,
                          const String& name,
-                         unsigned long long version,
+                         uint64_t version,
                          ExceptionState&);
   IDBOpenDBRequest* deleteDatabase(ScriptState*,
                                    const String& name,
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
index 9e8fcda..36af46a 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
@@ -84,7 +84,7 @@
   IDB_TRACE("IDBOpenDBRequest::onBlocked()");
   if (!ShouldEnqueueEvent())
     return;
-  base::Optional<unsigned long long> new_version_nullable;
+  base::Optional<uint64_t> new_version_nullable;
   if (version_ != IDBDatabaseMetadata::kDefaultVersion) {
     new_version_nullable = version_;
   }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.cc b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.cc
index e82a9d7..4eeaa231 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.cc
@@ -34,8 +34,8 @@
 
 IDBVersionChangeEvent::IDBVersionChangeEvent(
     const AtomicString& event_type,
-    unsigned long long old_version,
-    const base::Optional<unsigned long long>& new_version,
+    uint64_t old_version,
+    const base::Optional<uint64_t>& new_version,
     mojom::IDBDataLoss data_loss,
     const String& data_loss_message)
     : Event(event_type, Bubbles::kNo, Cancelable::kNo),
@@ -56,7 +56,7 @@
     data_loss_ = mojom::IDBDataLoss::Total;
 }
 
-unsigned long long IDBVersionChangeEvent::newVersion(bool& is_null) const {
+uint64_t IDBVersionChangeEvent::newVersion(bool& is_null) const {
   is_null = !new_version_.has_value();
   return new_version_.value_or(0);
 }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
index 70c5e1d3..850b3fc 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_version_change_event.h
@@ -47,8 +47,8 @@
   }
   static IDBVersionChangeEvent* Create(
       const AtomicString& event_type,
-      unsigned long long old_version,
-      const base::Optional<unsigned long long>& new_version,
+      uint64_t old_version,
+      const base::Optional<uint64_t>& new_version,
       mojom::IDBDataLoss data_loss = mojom::IDBDataLoss::None,
       const String& data_loss_message = String()) {
     return MakeGarbageCollected<IDBVersionChangeEvent>(
@@ -62,15 +62,15 @@
 
   IDBVersionChangeEvent();
   IDBVersionChangeEvent(const AtomicString& event_type,
-                        unsigned long long old_version,
-                        const base::Optional<unsigned long long>& new_version,
+                        uint64_t old_version,
+                        const base::Optional<uint64_t>& new_version,
                         mojom::IDBDataLoss,
                         const String& data_loss);
   IDBVersionChangeEvent(const AtomicString& event_type,
                         const IDBVersionChangeEventInit*);
 
-  unsigned long long oldVersion() const { return old_version_; }
-  unsigned long long newVersion(bool& is_null) const;
+  uint64_t oldVersion() const { return old_version_; }
+  uint64_t newVersion(bool& is_null) const;
 
   const AtomicString& dataLoss() const;
   const String& dataLossMessage() const { return data_loss_message_; }
@@ -80,8 +80,8 @@
   void Trace(blink::Visitor*) override;
 
  private:
-  unsigned long long old_version_;
-  base::Optional<unsigned long long> new_version_;
+  uint64_t old_version_;
+  base::Optional<uint64_t> new_version_;
   mojom::IDBDataLoss data_loss_;
   String data_loss_message_;
 };
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 426c2f7..93beb6b 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
@@ -442,8 +442,7 @@
     std::unique_ptr<DatabaseWithObjectStores> result =
         DatabaseWithObjectStores::create()
             .setName(idb_database->name())
-            .setVersion(
-                static_cast<unsigned long long>(idb_database->version()))
+            .setVersion(static_cast<uint64_t>(idb_database->version()))
             .setObjectStores(std::move(object_stores))
             .build();
 
diff --git a/third_party/blink/renderer/modules/mediastream/navigator_user_media.h b/third_party/blink/renderer/modules/mediastream/navigator_user_media.h
index 52006e3..c7a9a2de 100644
--- a/third_party/blink/renderer/modules/mediastream/navigator_user_media.h
+++ b/third_party/blink/renderer/modules/mediastream/navigator_user_media.h
@@ -16,7 +16,8 @@
 
 class NavigatorUserMedia final : public GarbageCollected<NavigatorUserMedia>,
                                  public Supplement<Navigator> {
-  USING_GARBAGE_COLLECTED_MIXIN(NavigatorUserMedia)
+  USING_GARBAGE_COLLECTED_MIXIN(NavigatorUserMedia);
+
  public:
   static const char kSupplementName[];
 
diff --git a/third_party/blink/renderer/modules/payments/payment_request.h b/third_party/blink/renderer/modules/payments/payment_request.h
index 55902bf..dcce1e7 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.h
+++ b/third_party/blink/renderer/modules/payments/payment_request.h
@@ -45,7 +45,7 @@
       public ContextLifecycleObserver,
       public ActiveScriptWrappable<PaymentRequest> {
   DEFINE_WRAPPERTYPEINFO();
-  USING_GARBAGE_COLLECTED_MIXIN(PaymentRequest)
+  USING_GARBAGE_COLLECTED_MIXIN(PaymentRequest);
   WTF_MAKE_NONCOPYABLE(PaymentRequest);
 
  public:
diff --git a/third_party/blink/renderer/modules/payments/payment_request_update_event.h b/third_party/blink/renderer/modules/payments/payment_request_update_event.h
index f8c99a6..cf0d165c 100644
--- a/third_party/blink/renderer/modules/payments/payment_request_update_event.h
+++ b/third_party/blink/renderer/modules/payments/payment_request_update_event.h
@@ -23,7 +23,7 @@
 class MODULES_EXPORT PaymentRequestUpdateEvent : public Event,
                                                  public PaymentUpdater {
   DEFINE_WRAPPERTYPEINFO();
-  USING_GARBAGE_COLLECTED_MIXIN(PaymentRequestUpdateEvent)
+  USING_GARBAGE_COLLECTED_MIXIN(PaymentRequestUpdateEvent);
 
  public:
   PaymentRequestUpdateEvent(ExecutionContext*,
diff --git a/third_party/blink/renderer/modules/websockets/web_pepper_socket_channel_client_proxy.h b/third_party/blink/renderer/modules/websockets/web_pepper_socket_channel_client_proxy.h
index 46dc16d..de07351 100644
--- a/third_party/blink/renderer/modules/websockets/web_pepper_socket_channel_client_proxy.h
+++ b/third_party/blink/renderer/modules/websockets/web_pepper_socket_channel_client_proxy.h
@@ -23,7 +23,8 @@
 class WebPepperSocketChannelClientProxy final
     : public GarbageCollectedFinalized<WebPepperSocketChannelClientProxy>,
       public WebSocketChannelClient {
-  USING_GARBAGE_COLLECTED_MIXIN(WebPepperSocketChannelClientProxy)
+  USING_GARBAGE_COLLECTED_MIXIN(WebPepperSocketChannelClientProxy);
+
  public:
   static WebPepperSocketChannelClientProxy* Create(WebPepperSocketImpl* impl) {
     return MakeGarbageCollected<WebPepperSocketChannelClientProxy>(impl);
diff --git a/third_party/blink/renderer/platform/heap/garbage_collected.h b/third_party/blink/renderer/platform/heap/garbage_collected.h
index 2ccb869c..d746bee 100644
--- a/third_party/blink/renderer/platform/heap/garbage_collected.h
+++ b/third_party/blink/renderer/platform/heap/garbage_collected.h
@@ -146,10 +146,10 @@
 
 // The USING_GARBAGE_COLLECTED_MIXIN macro defines all methods and markers
 // needed for handling mixins.
-#define USING_GARBAGE_COLLECTED_MIXIN(TYPE)    \
-  IS_GARBAGE_COLLECTED_TYPE();                 \
-  DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(TYPE) \
-  DEFINE_GARBAGE_COLLECTED_MIXIN_CONSTRUCTOR_MARKER(TYPE)
+#define USING_GARBAGE_COLLECTED_MIXIN(TYPE)               \
+  DEFINE_GARBAGE_COLLECTED_MIXIN_CONSTRUCTOR_MARKER(TYPE) \
+  DEFINE_GARBAGE_COLLECTED_MIXIN_METHODS(TYPE)            \
+  IS_GARBAGE_COLLECTED_TYPE()
 
 // Merge two or more Mixins into one:
 //
diff --git a/third_party/blink/renderer/platform/heap/heap_test.cc b/third_party/blink/renderer/platform/heap/heap_test.cc
index ef9a9629..5b181f6 100644
--- a/third_party/blink/renderer/platform/heap/heap_test.cc
+++ b/third_party/blink/renderer/platform/heap/heap_test.cc
@@ -1379,7 +1379,8 @@
 };
 
 class UseMixin : public SimpleObject, public Mixin {
-  USING_GARBAGE_COLLECTED_MIXIN(UseMixin)
+  USING_GARBAGE_COLLECTED_MIXIN(UseMixin);
+
  public:
   static UseMixin* Create() { return MakeGarbageCollected<UseMixin>(); }
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index aacc204..428d1e9 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -5112,6 +5112,7 @@
 crbug.com/824775 [ Mac ] virtual/video-surface-layer/media/controls/video-controls-with-cast-rendering.html [ Pass Failure ]
 crbug.com/824830 fast/peerconnection/RTCPeerConnection-many.html [ Timeout Crash Failure Pass ]
 crbug.com/824848 [ Linux ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ]
+crbug.com/824848 [ Mac ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ]
 crbug.com/824848 [ Win ] external/wpt/html/semantics/links/following-hyperlinks/activation-behavior.window.html [ Pass Failure ]
 crbug.com/824904 inspector-protocol/heap-profiler/heap-objects-tracking.js [ Pass Failure ]
 
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
index bdbcb31..660db4f 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
@@ -178217,6 +178217,11 @@
      {}
     ]
    ],
+   "payment-request/payment-request-show-method.https-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "payment-request/payment-response/helpers.js": [
     [
      {}
@@ -181947,6 +181952,11 @@
      {}
     ]
    ],
+   "resource-timing/resources/cors-ahem.py": [
+    [
+     {}
+    ]
+   ],
    "resource-timing/resources/document-domain-no-impact.sub.html": [
     [
      {}
@@ -182002,6 +182012,11 @@
      {}
     ]
    ],
+   "resource-timing/resources/iframe-reload-TAO.sub.html": [
+    [
+     {}
+    ]
+   ],
    "resource-timing/resources/iframe-setdomain.sub.html": [
     [
      {}
@@ -213039,6 +213054,12 @@
      {}
     ]
    ],
+   "css/css-overscroll-behavior/parsing/overscroll-behavior-computed.html": [
+    [
+     "/css/css-overscroll-behavior/parsing/overscroll-behavior-computed.html",
+     {}
+    ]
+   ],
    "css/css-overscroll-behavior/parsing/overscroll-behavior-invalid.html": [
     [
      "/css/css-overscroll-behavior/parsing/overscroll-behavior-invalid.html",
@@ -276119,6 +276140,12 @@
      {}
     ]
    ],
+   "resource-timing/resource-reload-TAO.sub.html": [
+    [
+     "/resource-timing/resource-reload-TAO.sub.html",
+     {}
+    ]
+   ],
    "resource-timing/resource-timing-level1.sub.html": [
     [
      "/resource-timing/resource-timing-level1.sub.html",
@@ -354225,7 +354252,7 @@
    "support"
   ],
   "css/css-overscroll-behavior/META.yml": [
-   "f15c86fd9069b04a23975834215adcc077711789",
+   "97705c2df87277d9e5af97d53e453305449c94b8",
    "support"
   ],
   "css/css-overscroll-behavior/inheritance.html": [
@@ -354236,6 +354263,10 @@
    "97f52984a51ae4157ec8ed91ddf4b3b8d405bec6",
    "manual"
   ],
+  "css/css-overscroll-behavior/parsing/overscroll-behavior-computed.html": [
+   "af117f19f906ad74e4bb3acc158a0829c6c69fa9",
+   "testharness"
+  ],
   "css/css-overscroll-behavior/parsing/overscroll-behavior-invalid.html": [
    "a29722f46570f89fafd76898ff2409017348b8a3",
    "testharness"
@@ -416237,15 +416268,15 @@
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js": [
-   "bc88bf7bd637a06e5f1fc23743470144b1dfb55f",
+   "447e5060b14b3f81c6ced27658810b179c14a4c8",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js": [
-   "a8bcffe9f81141df3ec37bc268c47cea5a48960b",
+   "100602733a8c3b97293425dfcf6e6f973ce64b31",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js": [
-   "c0bd8655873e989ba3ec567fde2adad15d90726a",
+   "eaf98f3807feffcc5d8ebf50eeef8093b0a7c1f6",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/no-active-script.js": [
@@ -416253,11 +416284,11 @@
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js": [
-   "f19ec2b03f9f2e5823098559ab0195b648ed3e93",
+   "402219d0b4c214f9f50341d52480407658df35a1",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js": [
-   "c6f2dda55aaa51d8dafcb9f8444a9e616fecafaa",
+   "342b342e8efd9accb615b8bd0aaecc1972328f05",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-external-classic.html": [
@@ -416293,19 +416324,19 @@
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt": [
-   "a13de4f11cda12bfc1fc5c27f731792fe3548505",
+   "28dd27104b71556f86d41664e7d30eaf6dff3f74",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html": [
-   "33714c70ca603759951d175bddff4d850afa9fb4",
+   "0efcab658ee1b9c48a66dbf4b91043e5e960a9c4",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt": [
-   "a13de4f11cda12bfc1fc5c27f731792fe3548505",
+   "28dd27104b71556f86d41664e7d30eaf6dff3f74",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html": [
-   "9411acd2a07b605d33195eb05626edf4e82f0436",
+   "50d7b30570e453f319329d7562011cd62a57e092",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-of-promise-result.html": [
@@ -416313,11 +416344,11 @@
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document-expected.txt": [
-   "4b0d1b50ee45337bd9b2bfa7d479ee5b6cdd508c",
+   "c86f682055d4968c2f15cd98b30b6d0ed630376c",
    "support"
   ],
   "html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document.html": [
-   "a9c0528216166a458e48902c2c722a548432f4dd",
+   "3b1d98f6b11ef689c066ab00cf0e096ca8a4c04d",
    "testharness"
   ],
   "html/semantics/scripting-1/the-script-element/module/error-and-slow-dependency.html": [
@@ -433884,6 +433915,10 @@
    "6ef98e85a6092a648897bfbca966d78a5a2195f8",
    "manual"
   ],
+  "payment-request/payment-request-show-method.https-expected.txt": [
+   "cfe2e93c40441534c274451f5fd058f512a24cd1",
+   "support"
+  ],
   "payment-request/payment-request-show-method.https.html": [
    "dd04987092b49bbfb5d525da7ce0af63fa60a495",
    "testharness"
@@ -444480,6 +444515,10 @@
    "0e3f405e14b7af9f0b2a4fe5ce916ed1e47534de",
    "testharness"
   ],
+  "resource-timing/resource-reload-TAO.sub.html": [
+   "48ab84bf964ef4ae2a0f3adc8fdd81867918c4f0",
+   "testharness"
+  ],
   "resource-timing/resource-timing-expected.txt": [
    "e8973024c18b7b05f08107fd2ac414e3d6c4e1b2",
    "support"
@@ -444648,6 +444687,10 @@
    "b143da7b325f0ad24a2f9ad67db7ba31d0aa912c",
    "support"
   ],
+  "resource-timing/resources/cors-ahem.py": [
+   "1998d47c492e09cd418c913e8824d3515091f73d",
+   "support"
+  ],
   "resource-timing/resources/document-domain-no-impact.sub.html": [
    "fbd7bc3b6e21ee39478c8a63780bb673dafe96a4",
    "support"
@@ -444692,6 +444735,10 @@
    "31a769eb3666492a3804f1c3deca73df526c0a4f",
    "support"
   ],
+  "resource-timing/resources/iframe-reload-TAO.sub.html": [
+   "577aff7758c779893f010658d216f34802a4edfe",
+   "support"
+  ],
   "resource-timing/resources/iframe-setdomain.sub.html": [
    "4a2f609aa469f14d7efe64baaeb739efdb2fdc75",
    "support"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/META.yml b/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/META.yml
index f15c86fd..97705c2 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/META.yml
+++ b/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/META.yml
@@ -1,3 +1,4 @@
 spec: https://drafts.csswg.org/css-overscroll-behavior/
 suggested_reviewers:
   - majido
+  - theres-waldo
diff --git a/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/parsing/overscroll-behavior-computed.html b/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/parsing/overscroll-behavior-computed.html
new file mode 100644
index 0000000..af117f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-overscroll-behavior/parsing/overscroll-behavior-computed.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset="utf-8">
+<title>CSS Overscroll Behavior: getComputedValue().overscrollBehavior*</title>
+<link rel="help" href="https://drafts.csswg.org/css-overscroll-behavior/#overscroll-behavior-properties">
+<meta name="assert" content="overscroll-behavior-x computed value is as specified.">
+<meta name="assert" content="overscroll-behavior-y computed value is as specified.">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/css/support/computed-testcommon.js"></script>
+</head>
+<body>
+<div id="target"></div>
+<script>
+'use strict';
+for (let property of ["overscroll-behavior-x", "overscroll-behavior-y"]) {
+  test_computed_value(property, "contain");
+  test_computed_value(property, "none");
+  test_computed_value(property, "auto");
+}
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js
index bc88bf7b..447e5060 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/Function.js
@@ -1 +1,2 @@
+// import()s in a dynamically created function are resolved relative to the script.
 Function(`import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`)();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js
index a8bcffe..1006027 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/eval.js
@@ -1 +1,2 @@
+// import()s in eval are resolved relative to the script.
 eval(`import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`);
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js
index c0bd8655..eaf98f3 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/inline-event-handlers-UA-code.js
@@ -1,2 +1,3 @@
-window.dummyDiv.setAttribute("onclick", `import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`);
+// import()s in an event handler are resolved relative to the document base.
+window.dummyDiv.setAttribute("onclick", `import('../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`);
 window.dummyDiv.click(); // different from **on**click()
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js
index f19ec2b0..402219d0 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/reflected-inline-event-handlers.js
@@ -1,2 +1,3 @@
-window.dummyDiv.setAttribute("onclick", `import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`);
+// import()s in an event handler are resolved relative to the document base.
+window.dummyDiv.setAttribute("onclick", `import('../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`);
 window.dummyDiv.onclick();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js
index c6f2dda..342b342e 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/scripts/setTimeout.js
@@ -1 +1,2 @@
+// import()s in a timeout handler are resolved relative to the script.
 setTimeout(`import('../../imports-a.js?label=' + window.label).then(window.continueTest, window.errorTest)`, 0);
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt
index a13de4f1..28dd271 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic-expected.txt
@@ -1,9 +1,9 @@
 This is a testharness.js-based test.
-FAIL setTimeout must inherit the nonce from the triggering script, thus execute assert_true: The module must have been evaluated expected true got undefined
+FAIL setTimeout must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=setTimeout"
 PASS direct eval must inherit the nonce from the triggering script, thus execute
 PASS indirect eval must inherit the nonce from the triggering script, thus execute
 PASS the Function constructor must inherit the nonce from the triggering script, thus execute
-FAIL reflected inline event handlers must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=reflected%20inline%20event%20handlers"
-FAIL inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code"
+PASS reflected inline event handlers must not inherit the nonce from the triggering script, thus fail
+PASS inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html
index 33714c7..0efcab6 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-classic.html
@@ -37,7 +37,7 @@
 promise_test(t => {
   const promise = createTestPromise(t);
 
-  setTimeout(`import('../imports-a.js?label=setTimeout').then(window.unreached, window.continueTest)`, 0);
+  setTimeout(`import('../imports-a.js?label=setTimeout').then(window.continueTest, window.errorTest)`, 0);
 
   return promise.then(assertSuccessful);
 }, "setTimeout must inherit the nonce from the triggering script, thus execute");
@@ -81,8 +81,8 @@
   );
   dummyDiv.onclick();
 
-  return promise.then(assertSuccessful);
-}, "reflected inline event handlers must inherit the nonce from the triggering script, thus execute");
+  return promise_rejects(t, new TypeError(), promise);
+}, "reflected inline event handlers must not inherit the nonce from the triggering script, thus fail");
 
 promise_test(t => {
   t.add_cleanup(() => {
@@ -99,6 +99,6 @@
   assert_equals(typeof dummyDiv.onclick, "function", "the browser must be able to parse a string containing the import() syntax into a function");
   dummyDiv.click(); // different from **on**click()
 
-  return promise.then(assertSuccessful);
-}, "inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute");
+  return promise_rejects(t, new TypeError(), promise);
+}, "inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt
index a13de4f1..28dd271 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module-expected.txt
@@ -1,9 +1,9 @@
 This is a testharness.js-based test.
-FAIL setTimeout must inherit the nonce from the triggering script, thus execute assert_true: The module must have been evaluated expected true got undefined
+FAIL setTimeout must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=setTimeout"
 PASS direct eval must inherit the nonce from the triggering script, thus execute
 PASS indirect eval must inherit the nonce from the triggering script, thus execute
 PASS the Function constructor must inherit the nonce from the triggering script, thus execute
-FAIL reflected inline event handlers must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=reflected%20inline%20event%20handlers"
-FAIL inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/imports-a.js?label=inline%20event%20handlers%20triggered%20via%20UA%20code"
+PASS reflected inline event handlers must not inherit the nonce from the triggering script, thus fail
+PASS inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html
index 9411acd2..50d7b30 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-nonce-module.html
@@ -36,7 +36,7 @@
 promise_test(t => {
   const promise = createTestPromise(t);
 
-  setTimeout(`import('../imports-a.js?label=setTimeout').then(window.unreached, window.continueTest)`, 0);
+  setTimeout(`import('../imports-a.js?label=setTimeout').then(window.continueTest, window.errorTest)`, 0);
 
   return promise.then(assertSuccessful);
 }, "setTimeout must inherit the nonce from the triggering script, thus execute");
@@ -80,8 +80,8 @@
   );
   dummyDiv.onclick();
 
-  return promise.then(assertSuccessful);
-}, "reflected inline event handlers must inherit the nonce from the triggering script, thus execute");
+  return promise_rejects(t, new TypeError(), promise);
+}, "reflected inline event handlers must not inherit the nonce from the triggering script, thus fail");
 
 promise_test(t => {
   t.add_cleanup(() => {
@@ -98,6 +98,6 @@
   assert_equals(typeof dummyDiv.onclick, 'function', "the browser must be able to parse a string containing the import() syntax into a function");
   dummyDiv.click(); // different from **on**click()
 
-  return promise.then(assertSuccessful);
-}, "inline event handlers triggered via UA code must inherit the nonce from the triggering script, thus execute");
+  return promise_rejects(t, new TypeError(), promise);
+}, "inline event handlers triggered via UA code must not inherit the nonce from the triggering script, thus fail");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document-expected.txt b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document-expected.txt
index 4b0d1b5..c86f682 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document-expected.txt
@@ -2,7 +2,7 @@
 PASS eval should successfully import
 FAIL setTimeout should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=setTimeout"
 PASS the Function constructor should successfully import
-FAIL reflected inline event handlers should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=reflected%20inline%20event%20handlers"
-FAIL inline event handlers triggered by JS should successfully import promise_test: Unhandled rejection with value: object "TypeError: Failed to fetch dynamically imported module: http://web-platform.test:8001/html/semantics/scripting-1/the-script-element/module/dynamic-import/imports-a.js?label=inline%20event%20handlers%20triggered%20by%20JS"
+PASS reflected inline event handlers should successfully import
+PASS inline event handlers triggered by JS should successfully import
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document.html
index a9c05282..3b1d98f6 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-other-document.html
@@ -26,14 +26,6 @@
     "the Function constructor"(x) {
       otherWindow.Function(x)();
     },
-    "reflected inline event handlers"(x) {
-      otherDiv.setAttribute("onclick", x);
-      otherDiv.onclick();
-    },
-    "inline event handlers triggered by JS"(x) {
-      otherDiv.setAttribute("onclick", x);
-      otherDiv.click(); // different from .**on**click()
-    }
   };
 
   for (const [label, evaluator] of Object.entries(evaluators)) {
@@ -53,6 +45,35 @@
       });
     }, label + " should successfully import");
   };
+
+  const eventHandlerEvaluators = {
+    "reflected inline event handlers"(x) {
+      otherDiv.setAttribute("onclick", x);
+      otherDiv.onclick();
+    },
+    "inline event handlers triggered by JS"(x) {
+      otherDiv.setAttribute("onclick", x);
+      otherDiv.click(); // different from .**on**click()
+    }
+  };
+
+  for (const [label, evaluator] of Object.entries(eventHandlerEvaluators)) {
+    promise_test(t => {
+      t.add_cleanup(() => {
+        otherDiv.removeAttribute("onclick");
+        delete otherWindow.evaluated_imports_a;
+      });
+
+      const promise = createTestPromise();
+
+      evaluator(`import('../../imports-a.js?label=${label}').then(window.continueTest, window.errorTest);`);
+
+      return promise.then(module => {
+        assert_true(otherWindow.evaluated_imports_a, "The module must have been evaluated");
+        assert_equals(module.A.from, "imports-a.js", "The module namespace object must be correct");
+      });
+    }, label + " should successfully import");
+  };
 }
 </script>
 <body onLoad="startTest()"></body>
diff --git a/third_party/blink/web_tests/fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html b/third_party/blink/web_tests/fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html
index 16f683a..262f904 100644
--- a/third_party/blink/web_tests/fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html
+++ b/third_party/blink/web_tests/fast/canvas/color-space/canvas-colorManaged-convertToBlob-roundtrip.html
@@ -16,11 +16,11 @@
     // Narrowing down the source of expected error:
     // - Alpha values should always match.
     // - Color components should be acceptably close. All tests locally pass
-    //   with a tolerance of 4 (uint8), 0.01 (f16/srgb,p3), and 0.02 (rec2020).
+    //   with a tolerance of 4 (uint8) or 0.02 (f16).
     // - The red channel of the green pixel has the largest error since green
     //   has the largest change in what's representable between sRGB and
     //   P3/Rec2020. Red channel of the green pixel is R channel of the second
-    //   pixel. All tests locally pass with a tolerance of 8 (uint8) and 0.03 (f16).
+    //   pixel. All tests locally pass with a tolerance of 8 (uint8) and 0.035 (f16).
     if (testScenario.canvasColorParam.pixelFormat == 'uint8') {
         let tolerance_color = 4;
         let tolerance_r_green = 8;
@@ -35,11 +35,9 @@
                 assert_approx_equals(actualPixels[i], refPixels[i], tolerance_color);
         }
     } else {
-        // For half float backed canvas, we expect the error < 0.01.
-        let tolerance_color = 0.01;
-        if (testScenario.encodeOptions.colorSpace == 'rec2020')
-            tolerance_color = 0.02;
-        let tolerance_r_green = 0.03;
+        // For half float backed canvas, we expect the error < 0.02.
+        let tolerance_color = 0.02;
+        let tolerance_r_green = 0.035;
         for (let i = 0; i < actualPixels.length; i++) {
             // Alpha channel
             if (i % 4 == 3)
diff --git a/third_party/blink/web_tests/paint/filters/clip-under-filter-expected.png b/third_party/blink/web_tests/paint/filters/clip-under-filter-expected.png
index 5d8e94c..0965d62 100644
--- a/third_party/blink/web_tests/paint/filters/clip-under-filter-expected.png
+++ b/third_party/blink/web_tests/paint/filters/clip-under-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/paint/invalidation/svg/paintorder-filtered-expected.png b/third_party/blink/web_tests/paint/invalidation/svg/paintorder-filtered-expected.png
index e3069cd..f75ada3b 100644
--- a/third_party/blink/web_tests/paint/invalidation/svg/paintorder-filtered-expected.png
+++ b/third_party/blink/web_tests/paint/invalidation/svg/paintorder-filtered-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/android/paint/selection/selection-drag-image-in-iframe-expected.png b/third_party/blink/web_tests/platform/android/paint/selection/selection-drag-image-in-iframe-expected.png
new file mode 100644
index 0000000..a29647cc
--- /dev/null
+++ b/third_party/blink/web_tests/platform/android/paint/selection/selection-drag-image-in-iframe-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png
index fe57de8..07ec17f 100644
--- a/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png
+++ b/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-turbulence-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-repaint-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-repaint-expected.png
index 9a05c5c..a9547257 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-width-update-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-width-update-expected.png
index 72aeb33..cd2fdfe6 100644
--- a/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-width-update-expected.png
+++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/svg/filter-width-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-color-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
index d5601b430..294cc05f 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
index bfd8fcc..17ebf40 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
index 30fd920d..aa1b6ed 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
index 0c11436..90b8240 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
index e6b1c49..9a1c7bb4 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
index 82f186a..c715da5 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
index 68ff2dd..d0b187a 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
index d4ccc30..d70cf4a 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
index 7d23f20..2d0bc54 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-04-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
index 1cae7cc..93c6b4e 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
index 8fff5ac..2e9a7f7 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
index 0721c8b..81c8978 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
index 55d28d7..c2e2befc 100644
--- a/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/batik/filters/feTile-expected.png b/third_party/blink/web_tests/platform/linux/svg/batik/filters/feTile-expected.png
index 2998d0e0..b82fd71e 100644
--- a/third_party/blink/web_tests/platform/linux/svg/batik/filters/feTile-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/batik/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Discrete-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Discrete-expected.png
index 6b117b9..388e00b9 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Discrete-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Discrete-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Gamma-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Gamma-expected.png
index c80982e..02ceff1 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Gamma-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Gamma-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Linear-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Linear-expected.png
index b0ffe288..df38419 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Linear-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Linear-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Table-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Table-expected.png
index aceea863..55b984d0 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Table-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/feComponentTransfer-Table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/image-with-transform-clip-filter-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/image-with-transform-clip-filter-expected.png
index 73c62a86..144ec7d 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/image-with-transform-clip-filter-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/image-with-transform-clip-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/custom/text-filter-expected.png b/third_party/blink/web_tests/platform/linux/svg/custom/text-filter-expected.png
index cb9e025..46953af 100644
--- a/third_party/blink/web_tests/platform/linux/svg/custom/text-filter-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/custom/text-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png b/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
index f346f8c0..c419ed4 100644
--- a/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
index f346f8c0..c419ed4 100644
--- a/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/svg/filters/feComposite-expected.png b/third_party/blink/web_tests/platform/linux/svg/filters/feComposite-expected.png
index 56fe78f..6055c67 100644
--- a/third_party/blink/web_tests/platform/linux/svg/filters/feComposite-expected.png
+++ b/third_party/blink/web_tests/platform/linux/svg/filters/feComposite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport-extension.https-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport-extension.https-expected.txt
new file mode 100644
index 0000000..b947c05
--- /dev/null
+++ b/third_party/blink/web_tests/platform/linux/virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport-extension.https-expected.txt
@@ -0,0 +1,32 @@
+This is a testharness.js-based test.
+PASS RTCIceTransport constructor does not throw
+PASS RTCIceTransport initial properties are set
+PASS gather() with { iceServers: null } should throw TypeError
+PASS gather() with { iceServers: undefined } should succeed
+PASS gather() with one turns server, one turn server, username, credential should succeed
+PASS gather() with 2 stun servers should succeed
+PASS gather() throws if closed
+PASS gather() transitions gatheringState to 'gathering'
+PASS gather() throws if called twice
+PASS eventually transition gatheringState to 'complete'
+PASS onicecandidate fires with null candidate before gatheringState transitions to 'complete'
+PASS gather() returns at least one host candidate
+PASS gather() returns no candidates with { gatherPolicy: 'relay'} and no turn servers
+PASS start() throws if closed
+PASS start() throws if usernameFragment or password not set
+PASS start() does not transition state to 'checking' if no remote candidates added
+PASS start() with default role sets role attribute to 'controlled'
+PASS start() sets role attribute to 'controlling'
+PASS addRemoteCandidate() throws if closed
+PASS addRemoteCandidate() throws on invalid candidate
+PASS start() transitions state to 'checking' if one remote candidate had been added
+PASS addRemoteCandidate() transitions state to 'checking' if start() had been called before
+PASS start() throws if later called with a different role
+PASS start() flushes remote candidates and transitions state to 'new' if later called with different remote parameters
+PASS Two RTCIceTransports connect to each other
+PASS Two RTCIceTransports configured with the controlling role resolve the conflict in band and still connect.
+PASS Two RTCIceTransports configured with the controlled role resolve the conflict in band and still connect.
+FAIL Selected candidate pair changes once the RTCIceTransports connect. assert_true: local transport selected candidate pair local should be in the list of remote candidates expected true got false
+PASS getSelectedCandidatePair() returns null once the RTCIceTransport is stopped.
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.11/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png b/third_party/blink/web_tests/platform/mac-mac10.11/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
index 77fb9b0..a99d6dd 100644
--- a/third_party/blink/web_tests/platform/mac-mac10.11/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac-mac10.11/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/filter-repaint-turbulence-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/filter-repaint-turbulence-expected.png
index f561ed21..918f462 100644
--- a/third_party/blink/web_tests/platform/mac/css3/filters/filter-repaint-turbulence-expected.png
+++ b/third_party/blink/web_tests/platform/mac/css3/filters/filter-repaint-turbulence-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-repaint-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-repaint-expected.png
index 7b2c0ee..623967a 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-width-update-expected.png b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-width-update-expected.png
index b15362d..45ad47bc 100644
--- a/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-width-update-expected.png
+++ b/third_party/blink/web_tests/platform/mac/paint/invalidation/svg/filter-width-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-color-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
index 839e90b..447b15f 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
index 761668f..be1e576 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
index b486cf8c..5064b5b 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
index 30fc943..4fbd11d 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
index f0910db..c0edaeb 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
index 1f406588..f097ebc 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
index f2635d4..139d3d59 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
index e94b5a2..35cd5c4 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
index e8e5987..cf43585399 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-04-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
index a389c1be..3a09edcf 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
index 2efd86f..37647a2 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
index a835d35..f88bb8c 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
index 5d59e10..7f11c7d 100644
--- a/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/batik/filters/feTile-expected.png b/third_party/blink/web_tests/platform/mac/svg/batik/filters/feTile-expected.png
index cb260e92..e33d431b 100644
--- a/third_party/blink/web_tests/platform/mac/svg/batik/filters/feTile-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/batik/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/convolution-crash-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/convolution-crash-expected.png
index 49a5138..d8b29c7 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/convolution-crash-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/convolution-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Discrete-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Discrete-expected.png
index d9ad37e1..782448b 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Discrete-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Discrete-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Gamma-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Gamma-expected.png
index bd01e53..b0190e2 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Gamma-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Gamma-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Linear-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Linear-expected.png
index 8edb4721..e234457 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Linear-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Linear-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Table-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Table-expected.png
index ff853b62..cf4c3ba 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Table-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/feComponentTransfer-Table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/image-with-transform-clip-filter-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/image-with-transform-clip-filter-expected.png
index c66e2a4..9ca748d0 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/image-with-transform-clip-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/image-with-transform-clip-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/custom/text-filter-expected.png b/third_party/blink/web_tests/platform/mac/svg/custom/text-filter-expected.png
index ee50c3d..bcdd9ab 100644
--- a/third_party/blink/web_tests/platform/mac/svg/custom/text-filter-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/custom/text-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png b/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
index 622c26a..f2ba96b 100644
--- a/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
index 622c26a..f2ba96b 100644
--- a/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/filters/feBlend-all-modes-expected.png b/third_party/blink/web_tests/platform/mac/svg/filters/feBlend-all-modes-expected.png
index 1e925bb..3327773 100644
--- a/third_party/blink/web_tests/platform/mac/svg/filters/feBlend-all-modes-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/filters/feBlend-all-modes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/svg/filters/feComposite-expected.png b/third_party/blink/web_tests/platform/mac/svg/filters/feComposite-expected.png
index 1b169cf..12d13b03 100644
--- a/third_party/blink/web_tests/platform/mac/svg/filters/feComposite-expected.png
+++ b/third_party/blink/web_tests/platform/mac/svg/filters/feComposite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/filter-repaint-turbulence-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/filter-repaint-turbulence-expected.png
index b32f4f68..9585c1a 100644
--- a/third_party/blink/web_tests/platform/win/css3/filters/filter-repaint-turbulence-expected.png
+++ b/third_party/blink/web_tests/platform/win/css3/filters/filter-repaint-turbulence-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-repaint-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-repaint-expected.png
index 73bfff1..09eb90f 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-repaint-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-repaint-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-width-update-expected.png b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-width-update-expected.png
index 095a7fb..b271e59 100644
--- a/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-width-update-expected.png
+++ b/third_party/blink/web_tests/platform/win/paint/invalidation/svg/filter-width-update-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-color-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
index f8ad546..778cece 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
index 997121c..ff26966 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
index a377f13b..99b0ebe 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-comptran-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
index 2c557f4..78cfb19 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-conv-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
index 5046807..6f22b20 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-diffuse-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
index e210ade..5553d3d 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-displace-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
index a0c0b06..441bd97 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-example-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
index 22b113ef..8687c2e5 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-gauss-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
index f2589f4cd..0fa8bf57 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-04-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
index f248a0d..81cda6a 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-light-04-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
index 2e3d016..7086e3a4 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-morph-01-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
index c349e1a..27b4eada 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-offset-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
index 719e664..ace618a 100644
--- a/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/W3C-SVG-1.1/filters-turb-02-f-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/batik/filters/feTile-expected.png b/third_party/blink/web_tests/platform/win/svg/batik/filters/feTile-expected.png
index e13a2faa..bce1fe8 100644
--- a/third_party/blink/web_tests/platform/win/svg/batik/filters/feTile-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/batik/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/convolution-crash-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/convolution-crash-expected.png
index 56fcea3..20fa99b2 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/convolution-crash-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/convolution-crash-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Discrete-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Discrete-expected.png
index bce8383..0895d61 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Discrete-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Discrete-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Gamma-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Gamma-expected.png
index f9ccfa33..60818dbf 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Gamma-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Gamma-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Linear-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Linear-expected.png
index e0bc0db6..ed12373a 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Linear-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Linear-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Table-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Table-expected.png
index e92eb75..e00c611 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Table-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/feComponentTransfer-Table-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/image-with-transform-clip-filter-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/image-with-transform-clip-filter-expected.png
index db74913..bfca3c4 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/image-with-transform-clip-filter-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/image-with-transform-clip-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/custom/text-filter-expected.png b/third_party/blink/web_tests/platform/win/svg/custom/text-filter-expected.png
index 0ed7d05..e6d3aaa7 100644
--- a/third_party/blink/web_tests/platform/win/svg/custom/text-filter-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/custom/text-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png b/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
index d586d74f..dedbfa4 100644
--- a/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
index d586d74f..dedbfa4 100644
--- a/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/filters/feBlend-all-modes-expected.png b/third_party/blink/web_tests/platform/win/svg/filters/feBlend-all-modes-expected.png
index c13cb32..d05cf493 100644
--- a/third_party/blink/web_tests/platform/win/svg/filters/feBlend-all-modes-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/filters/feBlend-all-modes-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/svg/filters/feComposite-expected.png b/third_party/blink/web_tests/platform/win/svg/filters/feComposite-expected.png
index b247163..cd752e63 100644
--- a/third_party/blink/web_tests/platform/win/svg/filters/feComposite-expected.png
+++ b/third_party/blink/web_tests/platform/win/svg/filters/feComposite-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-color-01-b-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
index 38dcebc..7ee9626a 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-color-01-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
index 7a8fc9b..c658137b 100644
--- a/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/W3C-SVG-1.1/filters-composite-02-b-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png b/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
index 2871e6d..519c78a 100644
--- a/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
index 2871e6d..519c78a 100644
--- a/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/platform/win7/svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/css/path-gradient-stroke-shadow-expected.png b/third_party/blink/web_tests/svg/css/path-gradient-stroke-shadow-expected.png
index 98ccd3d..d3b737d 100644
--- a/third_party/blink/web_tests/svg/css/path-gradient-stroke-shadow-expected.png
+++ b/third_party/blink/web_tests/svg/css/path-gradient-stroke-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/css/rect-gradient-stroke-shadow-expected.png b/third_party/blink/web_tests/svg/css/rect-gradient-stroke-shadow-expected.png
index 0c81e0d..2fd78843 100644
--- a/third_party/blink/web_tests/svg/css/rect-gradient-stroke-shadow-expected.png
+++ b/third_party/blink/web_tests/svg/css/rect-gradient-stroke-shadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/filter-css-transform-resolution-expected.png b/third_party/blink/web_tests/svg/custom/filter-css-transform-resolution-expected.png
index b0536cca..692e3e1d 100644
--- a/third_party/blink/web_tests/svg/custom/filter-css-transform-resolution-expected.png
+++ b/third_party/blink/web_tests/svg/custom/filter-css-transform-resolution-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png
index fbd9f878..dded0e0 100644
--- a/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png
+++ b/third_party/blink/web_tests/svg/custom/grayscale-gradient-mask-2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-in-attr-expected.png
index d2c50b9..c53662cb 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-type-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-type-attr-expected.png
index d2c50b9..c53662cb 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-type-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-type-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-values-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-values-attr-expected.png
index d2c50b9..c53662cb 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-values-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-dom-values-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-in-prop-expected.png
index d2c50b9..c53662cb 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-type-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-type-prop-expected.png
index d2c50b9..c53662cb 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-type-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-type-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-values-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-values-prop-expected.png
index d2c50b9..c53662cb 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-values-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-values-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-amplitude-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-amplitude-attr-expected.png
index 59c52f6d..500ca9e12 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-amplitude-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-amplitude-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-exponent-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-exponent-attr-expected.png
index 59c52f6d..500ca9e12 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-exponent-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-exponent-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-intercept-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-intercept-attr-expected.png
index f3d93b9..b780f56 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-intercept-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-intercept-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-offset-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-offset-attr-expected.png
index f3d93b9..b780f56 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-offset-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-offset-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-slope-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-slope-attr-expected.png
index 03e1a93..05f9300d 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-slope-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-slope-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-tableValues-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-tableValues-attr-expected.png
index b6cefb9..523f5a58 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-tableValues-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-tableValues-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-type-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-type-attr-expected.png
index 59c52f6d..500ca9e12 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-type-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-dom-type-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-amplitude-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-amplitude-prop-expected.png
index 59c52f6d..500ca9e12 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-amplitude-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-amplitude-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-exponent-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-exponent-prop-expected.png
index 59c52f6d..500ca9e12 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-exponent-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-exponent-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-intercept-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-intercept-prop-expected.png
index f3d93b9..b780f56 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-intercept-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-intercept-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-offset-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-offset-prop-expected.png
index f3d93b9..b780f56 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-offset-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-offset-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-slope-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-slope-prop-expected.png
index 03e1a93..05f9300d 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-slope-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-slope-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-tableValues-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-tableValues-prop-expected.png
index 2b6dcf79e..7c9e34d 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-tableValues-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-tableValues-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-type-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-type-prop-expected.png
index 59c52f6d..500ca9e12 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-type-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-type-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in-attr-expected.png
index 6fcedd0b0..4663f27 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in2-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in2-attr-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in2-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-in2-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k1-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k1-attr-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k1-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k1-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k2-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k2-attr-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k2-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k2-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k3-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k3-attr-expected.png
index 3e57811..05cdf9df 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k3-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k3-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k4-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k4-attr-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k4-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-k4-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-operator-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-operator-attr-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-operator-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-dom-operator-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in-prop-expected.png
index 6fcedd0b0..4663f27 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in2-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in2-prop-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in2-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-in2-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k1-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k1-prop-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k1-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k1-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k2-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k2-prop-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k2-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k2-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k3-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k3-prop-expected.png
index 3e57811..05cdf9df 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k3-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k3-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k4-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k4-prop-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k4-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-k4-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-operator-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-operator-prop-expected.png
index f5e25d1..5db269c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-operator-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFECompositeElement-svgdom-operator-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-bias-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-bias-attr-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-bias-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-bias-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-divisor-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-divisor-attr-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-divisor-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-divisor-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-edgeMode-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-edgeMode-attr-expected.png
index 2ccb7ff..44d1a9e 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-edgeMode-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-edgeMode-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-in-attr-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelMatrix-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelMatrix-attr-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelMatrix-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelMatrix-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelUnitLength-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelUnitLength-attr-expected.png
index 633fe9c..31f2998 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelUnitLength-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelUnitLength-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-order-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-order-attr-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-order-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-order-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-preserveAlpha-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-preserveAlpha-attr-expected.png
index 108a5d0..e1c516dd 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-preserveAlpha-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-preserveAlpha-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetX-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetX-attr-expected.png
index 2ccb7ff..44d1a9e 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetX-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetX-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetY-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetY-attr-expected.png
index 6e315fb9..0c793f7 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetY-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetY-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-bias-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-bias-prop-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-bias-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-bias-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-divisor-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-divisor-prop-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-divisor-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-divisor-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-edgeMode-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-edgeMode-prop-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-edgeMode-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-edgeMode-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-in-prop-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelMatrix-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelMatrix-prop-expected.png
index b64d667..1a176c8f 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelMatrix-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelMatrix-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelUnitLength-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelUnitLength-prop-expected.png
index 633fe9c..31f2998 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelUnitLength-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelUnitLength-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-order-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-order-prop-expected.png
index 76478fb..fe454be 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-order-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-order-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-preserveAlpha-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-preserveAlpha-prop-expected.png
index 108a5d0..e1c516dd 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-preserveAlpha-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-preserveAlpha-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetX-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetX-prop-expected.png
index 2ccb7ff..44d1a9e 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetX-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetX-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetY-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetY-prop-expected.png
index 6e315fb9..0c793f7 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetY-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetY-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png
index 7f23ff5..b853fd2 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-kernelUnitLength-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in-attr-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in2-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in2-attr-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in2-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in2-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-scale-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-scale-attr-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-scale-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-scale-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-xChannelSelector-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-xChannelSelector-attr-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-xChannelSelector-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-xChannelSelector-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-yChannelSelector-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-yChannelSelector-attr-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-yChannelSelector-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-dom-yChannelSelector-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in-prop-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in2-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in2-prop-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in2-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in2-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-scale-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-scale-prop-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-scale-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-scale-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-xChannelSelector-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-xChannelSelector-prop-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-xChannelSelector-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-xChannelSelector-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-yChannelSelector-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-yChannelSelector-prop-expected.png
index c217472..850fa68 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-yChannelSelector-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-yChannelSelector-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png
index f566fbb..bb123846 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png
index f566fbb..bb123846 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png
index f566fbb..bb123846 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png
index f566fbb..bb123846 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dx-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dx-attr-expected.png
index 34ca3870..9f20e96 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dx-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dx-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dy-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dy-attr-expected.png
index 34ca3870..9f20e96 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dy-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-dy-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-in-attr-expected.png
index 34ca3870..9f20e96 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png
index 7a787702..8b1b9a63 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-opacity-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-opacity-attr-expected.png
index 2a87d59..46380ff 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-opacity-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-opacity-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr-expected.png
index 746bcaf..7b27a95 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dx-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dx-prop-expected.png
index 34ca3870..9f20e96 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dx-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dx-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dy-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dy-prop-expected.png
index 34ca3870..9f20e96 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dy-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dy-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-in-prop-expected.png
index 34ca3870..9f20e96 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png
index 7a787702..8b1b9a63 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-opacity-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-opacity-prop-expected.png
index 2a87d59..46380ff 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-opacity-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-opacity-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-stdDeviation-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-stdDeviation-prop-expected.png
index 746bcaf..7b27a95 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-stdDeviation-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEDropShadowElement-svgdom-stdDeviation-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-in-attr-expected.png
index b66398bfa..492804c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-attr-expected.png
index b66398bfa..492804c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-call-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-call-expected.png
index b66398bfa..492804c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-call-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-call-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-svgdom-in-prop-expected.png
index b66398bfa..492804c 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEGaussianBlurElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-dom-in-attr-expected.png
index 45fb730..5debcb9e 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-svgdom-in-prop-expected.png
index 45fb730..5debcb9e 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEMergeNodeElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dx-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dx-attr-expected.png
index 1248d2b..31e6932 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dx-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dx-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dy-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dy-attr-expected.png
index 1248d2b..31e6932 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dy-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-dy-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-in-attr-expected.png
index 1248d2b..31e6932 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dx-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dx-prop-expected.png
index 1248d2b..31e6932 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dx-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dx-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dy-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dy-prop-expected.png
index 1248d2b..31e6932 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dy-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-dy-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-in-prop-expected.png
index 1248d2b..31e6932 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEOffsetElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png
index 32fa64d..6173153 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png
index 6092ee4..7b52bde5 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-kernelUnitLength-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png
index 8e771c3e..e4442dff 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png
index 8e771c3e..e4442dff 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png
index 7f53369e..31050f17 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png
index 0222a16..65cd840 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-baseFrequency-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-baseFrequency-attr-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-baseFrequency-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-baseFrequency-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-numOctaves-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-numOctaves-attr-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-numOctaves-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-numOctaves-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-seed-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-seed-attr-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-seed-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-seed-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-stitchTiles-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-stitchTiles-attr-expected.png
index 44f0fa4c13..4fe9585 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-stitchTiles-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-stitchTiles-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-type-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-type-attr-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-type-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-dom-type-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-baseFrequency-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-baseFrequency-prop-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-baseFrequency-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-baseFrequency-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-numOctaves-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-numOctaves-prop-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-numOctaves-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-numOctaves-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-seed-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-seed-prop-expected.png
index 9950243..3286ff2 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-seed-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-seed-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-stitchTiles-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-stitchTiles-prop-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-stitchTiles-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-stitchTiles-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-type-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-type-prop-expected.png
index fff2431..5618512b 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-type-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFETurbulenceElement-svgdom-type-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-height-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-primitiveUnits-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-primitiveUnits-attr-expected.png
index 45a9dc2d..7a5e4cce 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-primitiveUnits-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-primitiveUnits-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-width-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-x-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-dom-y-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-height-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-primitiveUnits-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-primitiveUnits-prop-expected.png
index 45a9dc2d..7a5e4cce 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-primitiveUnits-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-primitiveUnits-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-width-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-x-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterElement-svgdom-y-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png
index a334295..2508208 100644
--- a/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png
+++ b/third_party/blink/web_tests/svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/big-sized-filter-expected.png b/third_party/blink/web_tests/svg/filters/big-sized-filter-expected.png
index d69bf0f..1e0cb82 100644
--- a/third_party/blink/web_tests/svg/filters/big-sized-filter-expected.png
+++ b/third_party/blink/web_tests/svg/filters/big-sized-filter-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/color-interpolation-filters-expected.png b/third_party/blink/web_tests/svg/filters/color-interpolation-filters-expected.png
index 331d057..253da30 100644
--- a/third_party/blink/web_tests/svg/filters/color-interpolation-filters-expected.png
+++ b/third_party/blink/web_tests/svg/filters/color-interpolation-filters-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feColorMatrix-offset-expected.png b/third_party/blink/web_tests/svg/filters/feColorMatrix-offset-expected.png
index 95f5cd5..ea21e78 100644
--- a/third_party/blink/web_tests/svg/filters/feColorMatrix-offset-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feColorMatrix-offset-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feColorMatrix-saturate-expected.png b/third_party/blink/web_tests/svg/filters/feColorMatrix-saturate-expected.png
index cd6ad70..7b8ba9c 100644
--- a/third_party/blink/web_tests/svg/filters/feColorMatrix-saturate-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feColorMatrix-saturate-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feDisplacementMap-expected.png b/third_party/blink/web_tests/svg/filters/feDisplacementMap-expected.png
index ed2ee42..1e89df6 100644
--- a/third_party/blink/web_tests/svg/filters/feDisplacementMap-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feDisplacementMap-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png b/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png
index b967d88..e0479cec 100644
--- a/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feDropShadow-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feGaussianBlur-expected.png b/third_party/blink/web_tests/svg/filters/feGaussianBlur-expected.png
index 49ac1fc9..f007a94 100644
--- a/third_party/blink/web_tests/svg/filters/feGaussianBlur-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feGaussianBlur-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feGaussianBlur-zero-deviation-expected.png b/third_party/blink/web_tests/svg/filters/feGaussianBlur-zero-deviation-expected.png
index c735347..b5d17d5 100644
--- a/third_party/blink/web_tests/svg/filters/feGaussianBlur-zero-deviation-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feGaussianBlur-zero-deviation-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feTile-expected.png b/third_party/blink/web_tests/svg/filters/feTile-expected.png
index d6d8a2c..2d1ebf9 100644
--- a/third_party/blink/web_tests/svg/filters/feTile-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feTile-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feTurbulence-scale-expected.png b/third_party/blink/web_tests/svg/filters/feTurbulence-scale-expected.png
index 7223dcc4..97a7017 100644
--- a/third_party/blink/web_tests/svg/filters/feTurbulence-scale-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feTurbulence-scale-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/feTurbulence-tiled-expected.png b/third_party/blink/web_tests/svg/filters/feTurbulence-tiled-expected.png
index 38b8109..8689c28 100644
--- a/third_party/blink/web_tests/svg/filters/feTurbulence-tiled-expected.png
+++ b/third_party/blink/web_tests/svg/filters/feTurbulence-tiled-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/filter-clip-expected.png b/third_party/blink/web_tests/svg/filters/filter-clip-expected.png
index 69808d8..6de1fb5 100644
--- a/third_party/blink/web_tests/svg/filters/filter-clip-expected.png
+++ b/third_party/blink/web_tests/svg/filters/filter-clip-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/filter-source-position-expected.png b/third_party/blink/web_tests/svg/filters/filter-source-position-expected.png
index e58878208..91add9ac 100644
--- a/third_party/blink/web_tests/svg/filters/filter-source-position-expected.png
+++ b/third_party/blink/web_tests/svg/filters/filter-source-position-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/filteredImage-expected.png b/third_party/blink/web_tests/svg/filters/filteredImage-expected.png
index ade998f..fec75dc 100644
--- a/third_party/blink/web_tests/svg/filters/filteredImage-expected.png
+++ b/third_party/blink/web_tests/svg/filters/filteredImage-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/svg/filters/innershadow-expected.png b/third_party/blink/web_tests/svg/filters/innershadow-expected.png
index 8f6a45b5b..0acc1ed 100644
--- a/third_party/blink/web_tests/svg/filters/innershadow-expected.png
+++ b/third_party/blink/web_tests/svg/filters/innershadow-expected.png
Binary files differ
diff --git a/third_party/ink/README.chromium b/third_party/ink/README.chromium
index 2dff8751..314199e 100644
--- a/third_party/ink/README.chromium
+++ b/third_party/ink/README.chromium
@@ -1,7 +1,7 @@
 Name: Google Ink
 Short Name: ink
 URL: https://github.com/google/ink
-Version: 231281015
+Version: 233314166
 License: Apache 2.0
 Security Critical: yes
 
diff --git a/third_party/ink/build/ink_lib_binary.js.sha1 b/third_party/ink/build/ink_lib_binary.js.sha1
index 12cde60f..55ca656 100644
--- a/third_party/ink/build/ink_lib_binary.js.sha1
+++ b/third_party/ink/build/ink_lib_binary.js.sha1
@@ -1 +1 @@
-48f820ad74fdd7d30da7438bdb5f2a71e1729e65
\ No newline at end of file
+36d392d7bec3d8550e40a947c0db29b40e19d60b
\ No newline at end of file
diff --git a/third_party/ink/build/ink_lib_externs.js.sha1 b/third_party/ink/build/ink_lib_externs.js.sha1
index 086f9fb..26f1cfff 100644
--- a/third_party/ink/build/ink_lib_externs.js.sha1
+++ b/third_party/ink/build/ink_lib_externs.js.sha1
@@ -1 +1 @@
-6af491924edea3b15c0e5f35102b469f7ab50d03
\ No newline at end of file
+b866a5dbc00ee771cf56ed08cc78015cef160758
\ No newline at end of file
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
index 81a9ee5..81d824dd 100644
--- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h
+++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -196,13 +196,13 @@
  public:                                                                \
   virtual void AdjustAndMark(Visitor*) const override {}                \
   virtual bool IsHeapObjectAlive(Visitor*) const override { return 0; } \
-  void* mixin_constructor_marker_;
+  void* mixin_constructor_marker_
 
 #define USING_GARBAGE_COLLECTED_MIXIN_NEW(type)                         \
  public:                                                                \
   virtual void AdjustAndMark(Visitor*) const override {}                \
   virtual bool IsHeapObjectAlive(Visitor*) const override { return 0; } \
-  typedef int HasUsingGarbageCollectedMixinMacro;
+  typedef int HasUsingGarbageCollectedMixinMacro
 
 #define EAGERLY_FINALIZED() typedef int IsEagerlyFinalizedMarker
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 5239200..63eeb21 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -9750,6 +9750,12 @@
   <int value="5" label="Failed to query dictionary attack counter"/>
 </enum>
 
+<enum name="CrosUsbNotificationClosed">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="By User"/>
+  <int value="2" label="Connect to Linux Clicked"/>
+</enum>
+
 <enum name="CryptAuthSoftwareFeature">
   <int value="0" label="UNKNOWN_FEATURE"/>
   <int value="1" label="BETTER_TOGETHER_HOST"/>
@@ -30813,6 +30819,7 @@
       label="OmniboxSpeculativeServiceWorkerStartOnQueryInput:enabled"/>
   <int value="-1779753607" label="VizDisplayCompositor:disabled"/>
   <int value="-1778993296" label="ContextualSearchMlTapSuppression:disabled"/>
+  <int value="-1776351704" label="DesktopPWAsOmniboxInstall:disabled"/>
   <int value="-1774818943" label="VrWebInputEditing:enabled"/>
   <int value="-1772942854" label="LongPressBackForHistory:enabled"/>
   <int value="-1772172557" label="enable-osk-overscroll"/>
@@ -30872,7 +30879,6 @@
   <int value="-1662646099" label="NTPOfflinePageSuggestions:enabled"/>
   <int value="-1662447331" label="wake-on-packets"/>
   <int value="-1660972490" label="gpu-rasterization-msaa-sample-count"/>
-  <int value="-1657110277" label="GestureNavigation:disabled"/>
   <int value="-1655535052" label="enable-pointer-events"/>
   <int value="-1654344175" label="disable-extension-info-dialog"/>
   <int value="-1653838003" label="PauseBackgroundTabs:enabled"/>
@@ -30928,6 +30934,7 @@
   <int value="-1571841513" label="enable-devtools-experiments"/>
   <int value="-1568559155" label="WebSocketHandshakeReuseConnection:enabled"/>
   <int value="-1560729847" label="AutofillCacheQueryResponses:enabled"/>
+  <int value="-1560650271" label="WasmCodeCache:disabled"/>
   <int value="-1559789642" label="RunAllFlashInAllowMode:enabled"/>
   <int value="-1557527869" label="LoadingWithMojo:disabled"/>
   <int value="-1555510175" label="PasswordImport:enabled"/>
@@ -31717,7 +31724,6 @@
   <int value="-234966279" label="PointerEvent:disabled"/>
   <int value="-234687894"
       label="NonValidatingReloadOnRefreshContentV2:disabled"/>
-  <int value="-233770301" label="GestureNavigation:enabled"/>
   <int value="-231922000" label="enable-renderer-mojo-channel"/>
   <int value="-230824955" label="NTPMostLikelyFaviconsFromServer:enabled"/>
   <int value="-225505731" label="CCTModule:enabled"/>
@@ -31799,6 +31805,7 @@
   <int value="-78035185" label="custom_summary"/>
   <int value="-77872983" label="BookmarkAppsMac:disabled"/>
   <int value="-76631048" label="disable-offline-auto-reload-visible-only"/>
+  <int value="-76445689" label="WasmCodeCache:enabled"/>
   <int value="-75418012" label="ContextualSuggestionsOptOut:disabled"/>
   <int value="-73282711" label="EnableAppListSearchAutocomplete:enabled"/>
   <int value="-72455054" label="WebVrAutopresent:disabled"/>
@@ -32058,6 +32065,7 @@
   <int value="379428799" label="security-chip-animation"/>
   <int value="380372760" label="V8Orinoco:disabled"/>
   <int value="385969127" label="disable-win32k-lockdown"/>
+  <int value="386138870" label="DesktopPWAsOmniboxInstall:enabled"/>
   <int value="387178525" label="VideoFullscreenOrientationLock:enabled"/>
   <int value="387233614" label="HomePageButtonForceEnabled:disabled"/>
   <int value="388786873" label="EnableUnifiedMultiDeviceSettings:enabled"/>
@@ -55231,6 +55239,7 @@
   <int value="4" label="PreviouslyUninstalled"/>
   <int value="5" label="WebContentsDestroyed"/>
   <int value="6" label="WriteDataFailed"/>
+  <int value="7" label="UserInstallDeclined"/>
 </enum>
 
 <enum name="WebAppInstallSource">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 860e6cd..4ddbc14 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -18755,6 +18755,17 @@
   </summary>
 </histogram>
 
+<histogram name="CrosUsb.NotificationClosed" enum="CrosUsbNotificationClosed"
+    expires_after="2019-07-01">
+  <owner>benwells@chromium.org</owner>
+  <owner>nverne@chromium.org</owner>
+  <owner>tbuckley@chromium.org</owner>
+  <summary>
+    Records the reason why the &quot;Cros USB device detected&quot; notification
+    was dismissed. Recorded on notificiation close, after usb attached.
+  </summary>
+</histogram>
+
 <histogram name="CryptAuth.DeviceSync.Result" enum="BooleanSuccess">
   <owner>hansberry@chromium.org</owner>
   <summary>Indicates success of performing a DeviceSync.</summary>
@@ -45635,7 +45646,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.CpuUsageMilliPercent"
-    units="1/1000ths of %" expires_after="2019-03-01">
+    units="1/1000ths of %" expires_after="2019-07-01">
   <owner>amoylan@chromium.org</owner>
   <summary>
     Fraction of total CPU resources used by Chrome OS ML Service, sampled every
@@ -45681,7 +45692,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.MojoConnectionEvent"
-    enum="MachineLearningServiceMojoConnectionEvent" expires_after="2019-03-01">
+    enum="MachineLearningServiceMojoConnectionEvent" expires_after="2019-07-01">
   <owner>amoylan@chromium.org</owner>
   <summary>
     Events related to the connection and disconnection of the Mojo IPC channel
@@ -45690,7 +45701,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.PeakPrivateMemoryKb" units="KB"
-    expires_after="2019-03-01">
+    expires_after="2019-07-01">
   <owner>amoylan@chromium.org</owner>
   <summary>
     Peak private (non-shared) memory used by Chrome OS ML Service over the last
@@ -45711,7 +45722,7 @@
 </histogram>
 
 <histogram name="MachineLearningService.PrivateMemoryKb" units="KB"
-    expires_after="2019-03-01">
+    expires_after="2019-07-01">
   <owner>amoylan@chromium.org</owner>
   <summary>
     Private (non-shared) memory used by Chrome OS ML Service, sampled every 5
diff --git a/ui/accessibility/BUILD.gn b/ui/accessibility/BUILD.gn
index 8870c51..f09dce57 100644
--- a/ui/accessibility/BUILD.gn
+++ b/ui/accessibility/BUILD.gn
@@ -7,7 +7,6 @@
 import("//build/config/linux/pkg_config.gni")
 import("//build/config/ui.gni")
 import("//mojo/public/tools/bindings/mojom.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 import("//testing/test.gni")
 import("//tools/json_schema_compiler/json_schema_api.gni")
@@ -182,11 +181,6 @@
   ]
 }
 
-service_manifest("manifest") {
-  name = "ax_host_service"
-  source = "ax_host_service_manifest.json"
-}
-
 static_library("test_support") {
   testonly = true
   sources = [
@@ -286,3 +280,16 @@
 
   seed_corpus = "fuzz_corpus"
 }
+
+source_set("ax_host_manifest") {
+  sources = [
+    "ax_host_manifest.cc",
+    "ax_host_manifest.h",
+  ]
+
+  deps = [
+    "//base",
+    "//services/service_manager/public/cpp",
+    "//ui/accessibility/mojom",
+  ]
+}
diff --git a/ui/accessibility/DEPS b/ui/accessibility/DEPS
index 8a91ec8..376815f 100644
--- a/ui/accessibility/DEPS
+++ b/ui/accessibility/DEPS
@@ -2,6 +2,7 @@
   "+mojo/public",
   "+third_party/iaccessible2",
   "+third_party/skia",
+  "+services/service_manager/public/cpp",
   "+ui/aura",
   "+ui/base",
   "+ui/base/l10n",
diff --git a/ui/accessibility/OWNERS b/ui/accessibility/OWNERS
index 75cbc42..e1c7d9ce 100644
--- a/ui/accessibility/OWNERS
+++ b/ui/accessibility/OWNERS
@@ -8,8 +8,10 @@
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
 
-per-file ax_host_service_manifest.json=set noparent
-per-file ax_host_service_manifest.json=file://ipc/SECURITY_OWNERS
+per-file ax_host_manifest.cc=set noparent
+per-file ax_host_manifest.cc=file://ipc/SECURITY_OWNERS
+per-file ax_host_manifest.h=set noparent
+per-file ax_host_manifest.h=file://ipc/SECURITY_OWNERS
 
 # TEAM: chromium-accessibility@chromium.org
 # COMPONENT: Internals>Accessibility
diff --git a/ui/accessibility/ax_host_manifest.cc b/ui/accessibility/ax_host_manifest.cc
new file mode 100644
index 0000000..a189ced
--- /dev/null
+++ b/ui/accessibility/ax_host_manifest.cc
@@ -0,0 +1,26 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/accessibility/ax_host_manifest.h"
+
+#include "base/no_destructor.h"
+#include "services/service_manager/public/cpp/manifest_builder.h"
+#include "ui/accessibility/mojom/ax_host.mojom.h"
+
+namespace ui {
+
+const service_manager::Manifest& GetAXHostManifest() {
+  static base::NoDestructor<service_manager::Manifest> manifest{
+      service_manager::ManifestBuilder()
+          .WithServiceName(ax::mojom::kAXHostServiceName)
+          .WithDisplayName("Accessibility Host Service")
+          .WithOptions(service_manager::ManifestOptionsBuilder().Build())
+          .ExposeCapability(
+              "app",
+              service_manager::Manifest::InterfaceList<ax::mojom::AXHost>())
+          .Build()};
+  return *manifest;
+}
+
+}  // namespace ui
diff --git a/ui/accessibility/ax_host_manifest.h b/ui/accessibility/ax_host_manifest.h
new file mode 100644
index 0000000..335b983
--- /dev/null
+++ b/ui/accessibility/ax_host_manifest.h
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_ACCESSIBILITY_AX_HOST_MANIFEST_H_
+#define UI_ACCESSIBILITY_AX_HOST_MANIFEST_H_
+
+#include "services/service_manager/public/cpp/manifest.h"
+
+namespace ui {
+
+const service_manager::Manifest& GetAXHostManifest();
+
+}  // namespace ui
+
+#endif  // UI_ACCESSIBILITY_AX_HOST_MANIFEST_H_
diff --git a/ui/accessibility/ax_host_service_manifest.json b/ui/accessibility/ax_host_service_manifest.json
deleted file mode 100644
index 1a670ef..0000000
--- a/ui/accessibility/ax_host_service_manifest.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
-  "name": "ax_host_service",
-  "display_name": "Accessibility Host Service",
-  "interface_provider_specs": {
-    "service_manager:connector": {
-      "provides": {
-        // Provide accessibility support to any mojo app that asks for it.
-        "app" : [
-          "ax.mojom.AXHost"
-        ]
-      }
-    }
-  }
-}
diff --git a/ui/base/models/menu_model.cc b/ui/base/models/menu_model.cc
index 91ed8f1b..b572fe9 100644
--- a/ui/base/models/menu_model.cc
+++ b/ui/base/models/menu_model.cc
@@ -6,6 +6,13 @@
 
 namespace ui {
 
+MenuModel::MenuModel() : menu_model_delegate_(nullptr) {}
+
+MenuModel::~MenuModel() {
+  if (menu_model_delegate_)
+    menu_model_delegate_->OnMenuClearingDelegate();
+}
+
 bool MenuModel::IsVisibleAt(int index) const {
   return true;
 }
@@ -60,4 +67,12 @@
   ActivatedAt(index);
 }
 
+void MenuModel::SetMenuModelDelegate(MenuModelDelegate* delegate) {
+  // A non-null delegate overwriting our non-null delegate is not allowed.
+  DCHECK(!(menu_model_delegate_ && delegate));
+  if (menu_model_delegate_)
+    menu_model_delegate_->OnMenuClearingDelegate();
+  menu_model_delegate_ = delegate;
+}
+
 }  // namespace ui
diff --git a/ui/base/models/menu_model.h b/ui/base/models/menu_model.h
index bb53c04..cce16a1 100644
--- a/ui/base/models/menu_model.h
+++ b/ui/base/models/menu_model.h
@@ -40,7 +40,9 @@
                        // background matches the menu's rounded corners.
   };
 
-  virtual ~MenuModel() {}
+  MenuModel();
+
+  virtual ~MenuModel();
 
   // Returns true if any of the items within the model have icons. Not all
   // platforms support icons in menus natively and so this is a hint for
@@ -127,11 +129,12 @@
   // should not be deleted here.
   virtual void MenuWillClose() {}
 
-  // Set the MenuModelDelegate. Owned by the caller of this function.
-  virtual void SetMenuModelDelegate(MenuModelDelegate* delegate) = 0;
+  // Set the MenuModelDelegate, owned by the caller of this function. We allow
+  // setting a new one or clearing the current one.
+  void SetMenuModelDelegate(MenuModelDelegate* delegate);
 
   // Gets the MenuModelDelegate.
-  virtual MenuModelDelegate* GetMenuModelDelegate() const = 0;
+  MenuModelDelegate* menu_model_delegate() { return menu_model_delegate_; }
 
   // Retrieves the model and index that contains a specific command id. Returns
   // true if an item with the specified command id is found. |model| is inout,
@@ -139,6 +142,10 @@
   static bool GetModelAndIndexForCommandId(int command_id,
                                            MenuModel** model,
                                            int* index);
+
+ private:
+  // MenuModelDelegate. Weak. Could be null.
+  MenuModelDelegate* menu_model_delegate_;
 };
 
 }  // namespace ui
diff --git a/ui/base/models/menu_model_delegate.h b/ui/base/models/menu_model_delegate.h
index 53b9579..19e1ce18 100644
--- a/ui/base/models/menu_model_delegate.h
+++ b/ui/base/models/menu_model_delegate.h
@@ -16,6 +16,10 @@
   // delegate should assume the entire contents of the model has changed.
   virtual void OnMenuStructureChanged() {}
 
+  // Invoked when |MenuModel| is clearing its current delegate field. This
+  // indicates to |this| that it is not that MenuModel's delegate anymore.
+  virtual void OnMenuClearingDelegate() {}
+
  protected:
   virtual ~MenuModelDelegate() {}
 };
diff --git a/ui/base/models/simple_menu_model.cc b/ui/base/models/simple_menu_model.cc
index b9fbad7..8b546f8 100644
--- a/ui/base/models/simple_menu_model.cc
+++ b/ui/base/models/simple_menu_model.cc
@@ -66,7 +66,6 @@
 
 SimpleMenuModel::SimpleMenuModel(Delegate* delegate)
     : delegate_(delegate),
-      menu_model_delegate_(nullptr),
       method_factory_(this) {}
 
 SimpleMenuModel::~SimpleMenuModel() {
@@ -450,15 +449,6 @@
                                 method_factory_.GetWeakPtr()));
 }
 
-void SimpleMenuModel::SetMenuModelDelegate(
-      ui::MenuModelDelegate* menu_model_delegate) {
-  menu_model_delegate_ = menu_model_delegate;
-}
-
-MenuModelDelegate* SimpleMenuModel::GetMenuModelDelegate() const {
-  return menu_model_delegate_;
-}
-
 void SimpleMenuModel::OnMenuClosed() {
   if (delegate_)
     delegate_->MenuClosed(this);
diff --git a/ui/base/models/simple_menu_model.h b/ui/base/models/simple_menu_model.h
index b9f7b9b..0fe28e1 100644
--- a/ui/base/models/simple_menu_model.h
+++ b/ui/base/models/simple_menu_model.h
@@ -186,9 +186,6 @@
   MenuModel* GetSubmenuModelAt(int index) const override;
   void MenuWillShow() override;
   void MenuWillClose() override;
-  void SetMenuModelDelegate(
-      ui::MenuModelDelegate* menu_model_delegate) override;
-  MenuModelDelegate* GetMenuModelDelegate() const override;
 
   // Sets |histogram_name_|.
   void set_histogram_name(const std::string& histogram_name) {
@@ -245,8 +242,6 @@
 
   Delegate* delegate_;
 
-  MenuModelDelegate* menu_model_delegate_;
-
   // The UMA histogram name that is be used to log command ids.
   std::string histogram_name_;
 
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index 55bc7d1..b06bd5b 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -84,8 +84,8 @@
 
 /* Directory tree at the left. */
 .dialog-navigation-list {
-  -webkit-border-end: 1px solid rgba(0, 0, 0, 0.15);
   background-color: rgb(250, 250, 250);
+  border-inline-end: 1px solid rgba(0, 0, 0, 0.15);
   display: flex;
   flex: none;
   flex-direction: column;
@@ -458,11 +458,11 @@
 }
 
 .cloud-import-combo-button > .buttons > #cloud-import-details-button {
-  -webkit-margin-end: 0;
+  margin-inline-end: 0;
 }
 
 #cloud-import-details-button {
-  -webkit-margin-start: -10px;
+  margin-inline-start: -10px;
   width: 24px;
 }
 
@@ -534,9 +534,9 @@
 }
 
 #cloud-import-details .status .content {
-  -webkit-padding-start: 10px;
   color: #646464;
   flex: 1;
+  padding-inline-start: 10px;
 }
 
 #cloud-import-details .status .content::first-line {
@@ -580,9 +580,9 @@
 }
 
 #files-selected-label {
-  -webkit-margin-start: 20px;
   display: none;
   font-weight: 500;
+  margin-inline-start: 20px;
 }
 
 body.check-select #files-selected-label {
@@ -601,7 +601,6 @@
 }
 
 #cancel-selection-button .icon-arrow-back {
-  -webkit-margin-end: 8px;
   background-image: -webkit-image-set(
       url(../images/files/ui/back.png) 1x,
       url(../images/files/ui/2x/back.png) 2x);
@@ -609,6 +608,7 @@
   background-repeat: no-repeat;
   flex: none;
   height: 16px;
+  margin-inline-end: 8px;
   width: 16px;
 }
 
@@ -618,7 +618,7 @@
 }
 
 #cancel-selection-button > iron-icon {
-  -webkit-margin-end: 6px;
+  margin-inline-end: 6px;
 }
 
 #cancel-selection-label {
@@ -652,7 +652,7 @@
 
 #search-box.has-cursor,
 #search-box.has-text {
-  -webkit-margin-end: 12px;
+  margin-inline-end: 12px;
 }
 
 #search-box.has-cursor cr-input,
@@ -804,7 +804,6 @@
 
 .dialog-footer select {
   -webkit-appearance: none;
-  -webkit-margin-start: 16px;
   background: -webkit-image-set(
      url(../images/common/disclosure_arrow_dk_grey_down.png) 1x,
      url(../images/common/2x/disclosure_arrow_dk_grey_down.png) 2x) no-repeat
@@ -814,6 +813,7 @@
   border-radius: 0;
   color: rgb(51, 51, 51);
   cursor: pointer;
+  margin-inline-start: 16px;
   outline: none;
   padding: 0 12px 0 0;
 }
@@ -842,13 +842,13 @@
 }
 
 .progressable .preparing-label {
-  -webkit-margin-start: 20px;
+  margin-inline-start: 20px;
 }
 
 .progressable .progress-bar {
-  -webkit-margin-end: 20px;
-  -webkit-margin-start: 20px;
   flex: auto;
+  margin-inline-end: 20px;
+  margin-inline-start: 20px;
 }
 
 /* The container for breadcrumb elements. */
@@ -896,7 +896,7 @@
 }
 
 .breadcrumbs .breadcrumb-path:first-child {
-  /* -webkit-margin-start isn't proper
+  /* margin-inline-start isn't proper
      because folder names should be ltr even in RTL languages. */
   margin-left: 8px;
 }
@@ -1033,7 +1033,7 @@
 }
 
 .downloads-warning .warning-message {
-  -webkit-margin-end: 40px;
+  margin-inline-end: 40px;
 }
 
 .downloads-warning[hidden] {
@@ -1081,9 +1081,9 @@
 }
 
 .volume-warning .drive-text {
-  -webkit-margin-end: 51px;
   flex: none;
   font-size: 16px;
+  margin-inline-end: 51px;
 }
 
 .volume-warning .imitate-paper-button {
@@ -1127,11 +1127,11 @@
 .thumbnail-grid {
   /* On the right side, we have less margin to pack items as long as they are
      fully visible. */
-  -webkit-padding-end: 2px;
-  -webkit-padding-start: 11px;
   box-sizing: border-box;
   overflow-y: auto;
   padding-bottom: 16px;
+  padding-inline-end: 2px;
+  padding-inline-start: 11px;
   padding-top: 12px;
   width: 100%;
 }
@@ -1164,17 +1164,17 @@
 }
 
 .thumbnail-bottom .filename-label {
-  -webkit-padding-end: 6px;
   flex: auto;
   font-weight: 500;
+  padding-inline-end: 6px;
 }
 
 /* Styles specific for the grid view. */
 
 .thumbnail-grid .thumbnail-item {
-  -webkit-margin-start: 4px;
   background-color: rgb(245, 245, 245);
   height: 180px;
+  margin-inline-start: 4px;
   margin-top: 4px;
   overflow: hidden;
   position: relative;
@@ -1198,10 +1198,10 @@
 }
 
 .thumbnail-grid .checkmark {
-  -webkit-margin-start: 2px;
   background-position: center;
   background-repeat: no-repeat;
   height: 36px;
+  margin-inline-start: 2px;
   opacity: 0;
   position: absolute;
   top: 2px;
@@ -1339,7 +1339,7 @@
 
 .imported .filename-label,
 .copied .filename-label {
-  -webkit-margin-end: 14px;
+  margin-inline-end: 14px;
 }
 
 /* Padding counterweights negative margins of items, thus eliminating scroll
@@ -1494,7 +1494,6 @@
 }
 
 .table-header-sort-image-desc::after {
-  -webkit-padding-start: 13px;
   background-image: -webkit-image-set(
     url(../images/files/ui/sort_desc.png) 1x,
     url(../images/files/ui/2x/sort_desc.png) 2x);
@@ -1502,12 +1501,12 @@
   background-repeat: no-repeat;
   color: #888;
   content: '\00a0';
+  padding-inline-start: 13px;
   position: relative;
   top: 1px;
 }
 
 .table-header-sort-image-asc::after {
-  -webkit-padding-start: 13px;
   background-image: -webkit-image-set(
     url(../images/files/ui/sort_asc.png) 1x,
     url(../images/files/ui/2x/sort_asc.png) 2x);
@@ -1515,6 +1514,7 @@
   background-repeat: no-repeat;
   color: #888;
   content: '\00a0';
+  padding-inline-start: 13px;
   position: relative;
   top: -1px;
 }
@@ -1567,14 +1567,14 @@
 }
 
 .status-icon {
-  -webkit-margin-end: 10px;
   height: 24px;
+  margin-inline-end: 10px;
   width: 24px;
 }
 
 #list-container li .detail-icon {
-  -webkit-margin-end: 6px;
   height: 28px;
+  margin-inline-end: 6px;
   width: 28px;
 }
 
@@ -1659,11 +1659,11 @@
 }
 
 #filename-input-box {
-  -webkit-margin-end: 30px;
-  -webkit-margin-start: 30px;
   align-items: center;
   display: flex;
   flex: auto;
+  margin-inline-end: 30px;
+  margin-inline-start: 30px;
 }
 
 body:not([type='saveas-file']) #filename-input-box {
@@ -1728,7 +1728,7 @@
 }
 
 cr-menu#file-context-menu > :not(hr) {
-  -webkit-padding-end: 8px;
+  padding-inline-end: 8px;
 }
 
 cr-menu#file-context-menu.toolbar-menu > .hide-on-toolbar {
@@ -1857,9 +1857,9 @@
 }
 
 #volume-space-info-contents > div {
-  -webkit-margin-start: 15px;
   display: flex;
   flex: auto;
+  margin-inline-start: 15px;
 }
 
 #list-container .table-header-inner {
@@ -1872,7 +1872,7 @@
 
 #list-container .table-header-cell:first-child {
   -webkit-box-sizing: border-box;
-  -webkit-padding-start: 8px;
+  padding-inline-start: 8px;
 }
 
 #new-folder-button {
@@ -1927,13 +1927,13 @@
 }
 
 list.autocomplete-suggestions {
-  -webkit-margin-start: -36px;
   background-color: white;
   border-radius: 3px;
   box-shadow: 0 1px 4px 0 rgba(0, 0, 0, .5);
   box-sizing: border-box;  /* To match the width with the search box's. */
   color: rgb(90, 90, 90);
   flex: none;
+  margin-inline-start: -36px;
   margin-top: 10px;
   overflow: hidden;
   padding: 8px 0;
@@ -1985,7 +1985,7 @@
 
 #gear-menu > cr-menu-item:not(.menuitem-button),
 #sort-menu > cr-menu-item {
-  -webkit-margin-end: 50px;
+  margin-inline-end: 50px;
 }
 
 #suggest-app-dialog {
@@ -2061,7 +2061,7 @@
 }
 
 #conflict-confirm-dialog input[type=checkbox] {
-  -webkit-margin-start: -2px;
+  margin-inline-start: -2px;
   width: auto;
 }
 
@@ -2129,10 +2129,10 @@
 }
 
 #progress-center li {
-  -webkit-padding-end: 12px;
   display: flex;
   /* This must not be margin-bottom to calculate parent's height correctly. */
   padding-bottom: 16px;
+  padding-inline-end: 12px;
 }
 
 #progress-center label {
@@ -2149,10 +2149,10 @@
 }
 
 #progress-center .progress-frame {
-  -webkit-padding-end: 12px;
-  -webkit-padding-start: 16px;
   flex: 1 0 0;
   overflow: hidden;
+  padding-inline-end: 12px;
+  padding-inline-start: 16px;
 }
 
 #progress-center .progress-bar {
@@ -2199,14 +2199,14 @@
 }
 
 #progress-center button.close {
-  -webkit-margin-end: 12px;
-  -webkit-margin-start: auto;
   background: -webkit-image-set(
       url(../images/files/ui/expand_more_active.png) 1x,
       url(../images/files/ui/2x/expand_more_active.png) 2x)
       no-repeat;
   display: block;
   margin-bottom: 20px;
+  margin-inline-end: 12px;
+  margin-inline-start: auto;
 }
 
 #progress-center button.open {
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table.js b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
index 64be060..0411172 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_table.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_table.js
@@ -890,6 +890,12 @@
       ['contentMimeType'])[0].contentMimeType;
   div.textContent = FileListModel.getFileTypeString(
       FileType.getType(entry, mimeType));
+
+  // For removable partitions, display file system type.
+  if (!mimeType && entry.volumeInfo && entry.volumeInfo.diskFileSystemType) {
+    div.textContent = entry.volumeInfo.diskFileSystemType;
+  }
+
   return div;
 };
 
diff --git a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js
index f2a98ac..46dfee5 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/file_table_list.js
@@ -79,7 +79,6 @@
    */
   constructor(selectionModel) {
     super(selectionModel);
-    //cr.ui.ListSelectionController.call(this, selectionModel);
 
     /**
      * Whether to allow touch-specific interaction.
@@ -109,9 +108,9 @@
     }
     if (this.tapHandler_.handleTouchEvents(
             e, index, filelist.handleTap.bind(this))) {
-      // If a tap event is processed, FileTapHandler cancels the event to prevent
-      // triggering click events. Then it results not moving the focus to the
-      // list. So we do that here explicitly.
+      // If a tap event is processed, FileTapHandler cancels the event to
+      // prevent triggering click events. Then it results not moving the focus
+      // to the list. So we do that here explicitly.
       filelist.focusParentList(e);
     }
   }
@@ -368,8 +367,9 @@
   // If multiple selection is allowed and the checkmark is clicked without
   // modifiers(Ctrl/Shift), the click should toggle the item's selection.
   // (i.e. same behavior as Ctrl+Click)
-  const isClickOnCheckmark = isTargetCheckmark && sm.multiple && index != -1 &&
-                           !e.shiftKey && !e.ctrlKey && e.button == 0;
+  const isClickOnCheckmark =
+      (isTargetCheckmark && sm.multiple && index != -1 && !e.shiftKey &&
+       !e.ctrlKey && e.button == 0);
 
   sm.beginChange();
 
@@ -460,7 +460,7 @@
       if (e.keyCode == SPACE_KEY_CODE) {
         return;
       }
-    // Protect all but the most basic navigation commands in anything else.
+      // Protect all but the most basic navigation commands in anything else.
     } else if (e.key != 'ArrowUp' && e.key != 'ArrowDown') {
       return;
     }
@@ -511,22 +511,22 @@
       newIndex = this.getLastIndex();
       break;
     case 'ArrowUp':
-      newIndex = leadIndex == -1 ?
-          this.getLastIndex() : this.getIndexAbove(leadIndex);
+      newIndex =
+          leadIndex == -1 ? this.getLastIndex() : this.getIndexAbove(leadIndex);
       break;
     case 'ArrowDown':
-      newIndex = leadIndex == -1 ?
-          this.getFirstIndex() : this.getIndexBelow(leadIndex);
+      newIndex = leadIndex == -1 ? this.getFirstIndex() :
+                                   this.getIndexBelow(leadIndex);
       break;
     case 'ArrowLeft':
     case 'MediaTrackPrevious':
-      newIndex = leadIndex == -1 ?
-          this.getLastIndex() : this.getIndexBefore(leadIndex);
+      newIndex = leadIndex == -1 ? this.getLastIndex() :
+                                   this.getIndexBefore(leadIndex);
       break;
     case 'ArrowRight':
     case 'MediaTrackNext':
-      newIndex = leadIndex == -1 ?
-          this.getFirstIndex() : this.getIndexAfter(leadIndex);
+      newIndex = leadIndex == -1 ? this.getFirstIndex() :
+                                   this.getIndexAfter(leadIndex);
       break;
     default:
       prevent = false;
diff --git a/ui/file_manager/integration_tests/file_manager/file_display.js b/ui/file_manager/integration_tests/file_manager/file_display.js
index 5c316d6..96c84a8 100644
--- a/ui/file_manager/integration_tests/file_manager/file_display.js
+++ b/ui/file_manager/integration_tests/file_manager/file_display.js
@@ -231,6 +231,37 @@
 };
 
 /**
+ * Tests partitions display in the file table when root removable entry
+ * is selected. Checks file system type is displayed.
+ */
+testcase.fileDisplayPartitionFileTable = async function() {
+  const removableGroup = '#directory-tree [root-type-icon="removable"]';
+
+  // Open Files app on local downloads.
+  const appId = await setupAndWaitUntilReady(RootPath.DOWNLOADS);
+
+  // Mount removable partitions.
+  await sendTestMessage({name: 'mountFakePartitions'});
+
+  // Wait for removable group to appear in the directory tree.
+  await remoteCall.waitForElement(appId, removableGroup);
+
+  // Select the first removable group by clicking the label.
+  chrome.test.assertTrue(await remoteCall.callRemoteTestUtil(
+      'fakeMouseClick', appId, [removableGroup]));
+
+  // Wait for removable partitions to appear in the file table.
+  const partitionOne = await remoteCall.waitForElement(
+      appId, '#file-list [file-name="partition-1"] .type');
+  console.log(JSON.stringify(partitionOne));
+  chrome.test.assertEq('ext4', partitionOne.text);
+
+  const partitionTwo = await remoteCall.waitForElement(
+      appId, '#file-list [file-name="partition-2"] .type');
+  chrome.test.assertEq('ext4', partitionOne.text);
+};
+
+/**
  * Searches for a string in Downloads and checks that the correct results
  * are displayed.
  *
diff --git a/ui/login/account_picker/md_screen_account_picker.js b/ui/login/account_picker/md_screen_account_picker.js
index c7f0fb9..58f36a968 100644
--- a/ui/login/account_picker/md_screen_account_picker.js
+++ b/ui/login/account_picker/md_screen_account_picker.js
@@ -45,7 +45,6 @@
       'setPublicSessionDisplayName',
       'setPublicSessionLocales',
       'setPublicSessionKeyboardLayouts',
-      'setLockScreenAppsState',
       'setOverlayColors',
       'togglePodBackground',
     ],
@@ -59,9 +58,6 @@
     // Whether this screen is currently being shown.
     showing_: false,
 
-    // Last reported lock screen app activity state.
-    lockScreenAppsState_: LOCK_SCREEN_APPS_STATE.NONE,
-
     /** @override */
     decorate: function() {
       login.PodRow.decorate($('pod-row'));
@@ -126,9 +122,6 @@
     onBeforeShow: function(data) {
       this.showing_ = true;
 
-      this.ownerDocument.addEventListener('click',
-          this.handleOwnerDocClick_.bind(this));
-
       chrome.send('loginUIStateChanged', ['account-picker', true]);
       $('login-header-bar').signinUIState = SIGNIN_UI_STATE.ACCOUNT_PICKER;
       chrome.send('hideCaptivePortal');
@@ -463,58 +456,5 @@
     setPublicSessionKeyboardLayouts: function(userID, locale, list) {
       $('pod-row').setPublicSessionKeyboardLayouts(userID, locale, list);
     },
-
-    /**
-     * Updates UI based on the provided lock screen apps state.
-     *
-     * @param {LOCK_SCREEN_APPS_STATE} state The current lock screen apps state.
-     */
-    setLockScreenAppsState: function(state) {
-      if (Oobe.getInstance().displayType != DISPLAY_TYPE.LOCK ||
-          state == this.lockScreenAppsState_) {
-        return;
-      }
-
-      var wasForeground =
-          this.lockScreenAppsState_ === LOCK_SCREEN_APPS_STATE.FOREGROUND;
-      this.lockScreenAppsState_ = state;
-
-      $('top-header-bar').lockScreenAppsState = state;
-
-      // Reset the focused pod if app window is being shown on top of the user
-      // pods. Main goal is to clear any credentials the user might have input.
-      if (state === LOCK_SCREEN_APPS_STATE.FOREGROUND) {
-        $('pod-row').clearFocusedPod();
-        $('pod-row').disabled = true;
-      } else {
-        $('pod-row').disabled = false;
-        if (wasForeground) {
-          // If the app window was moved to background, ensure the active pod is
-          // focused.
-          $('pod-row').maybePreselectPod();
-          $('pod-row').refocusCurrentPod();
-        }
-      }
-    },
-
-    /**
-     * Handles clicks on the document which displays the account picker UI.
-     * If the click event target is outer container - i.e. background portion of
-     * UI with no other UI elements, and lock screen apps are in background, a
-     * request is issued to chrome to move lock screen apps to foreground.
-     * @param {Event} event The click event.
-     */
-    handleOwnerDocClick_: function(event) {
-      if (this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.BACKGROUND ||
-          (event.target != $('account-picker') &&
-           event.target != $('version'))) {
-        return;
-      }
-      chrome.send('setLockScreenAppsState',
-                  [LOCK_SCREEN_APPS_STATE.FOREGROUND]);
-
-      event.preventDefault();
-      event.stopPropagation();
-    },
   };
 });
diff --git a/ui/login/account_picker/screen_account_picker.js b/ui/login/account_picker/screen_account_picker.js
index 7867bd4..af7f756 100644
--- a/ui/login/account_picker/screen_account_picker.js
+++ b/ui/login/account_picker/screen_account_picker.js
@@ -42,7 +42,6 @@
        'setPublicSessionDisplayName',
        'setPublicSessionLocales',
        'setPublicSessionKeyboardLayouts',
-       'setLockScreenAppsState',
      ],
 
      preferredWidth_: 0,
@@ -54,14 +53,9 @@
      // Whether this screen is currently being shown.
      showing_: false,
 
-     // Last reported lock screen app activity state.
-     lockScreenAppsState_: LOCK_SCREEN_APPS_STATE.NONE,
-
      /** @override */
      decorate: function() {
        login.PodRow.decorate($('pod-row'));
-       this.ownerDocument.addEventListener(
-           'click', this.handleOwnerDocClick_.bind(this));
      },
 
      /** @override */
@@ -449,50 +443,5 @@
      setPublicSessionKeyboardLayouts: function(userID, locale, list) {
        $('pod-row').setPublicSessionKeyboardLayouts(userID, locale, list);
      },
-
-     /**
-      * Updates UI based on the provided lock screen apps state.
-      *
-      * @param {LOCK_SCREEN_APPS_STATE} state The current lock screen apps
-      *     state.
-      */
-     setLockScreenAppsState: function(state) {
-       if (Oobe.getInstance().displayType != DISPLAY_TYPE.LOCK ||
-           state == this.lockScreenAppsState_) {
-         return;
-       }
-
-       this.lockScreenAppsState_ = state;
-       $('login-header-bar').lockScreenAppsState = state;
-       // When an lock screen app window is in background - i.e. visible behind
-       // the lock screen UI - dim the lock screen background, so it's more
-       // noticeable that the app widow in background is not actionable.
-       $('background')
-           .classList.toggle(
-               'dimmed-background', state == LOCK_SCREEN_APPS_STATE.BACKGROUND);
-
-       if (state === LOCK_SCREEN_APPS_STATE.FOREGROUND)
-         $('pod-row').clearFocusedPod();
-
-     },
-
-     /**
-      * Handles clicks on the document which displays the account picker UI.
-      * If the click event target is outer container - i.e. background portion
-      * of UI with no other UI elements, and lock screen apps are in background,
-      * a request is issued to chrome to move lock screen apps to foreground.
-      * @param {Event} event The click event.
-      */
-     handleOwnerDocClick_: function(event) {
-       if (this.lockScreenAppsState_ != LOCK_SCREEN_APPS_STATE.BACKGROUND ||
-           event.target != $('outer-container')) {
-         return;
-       }
-       chrome.send(
-           'setLockScreenAppsState', [LOCK_SCREEN_APPS_STATE.FOREGROUND]);
-
-       event.preventDefault();
-       event.stopPropagation();
-     },
    };
 });
diff --git a/ui/login/display_manager.js b/ui/login/display_manager.js
index 364798f..c86684e 100644
--- a/ui/login/display_manager.js
+++ b/ui/login/display_manager.js
@@ -100,20 +100,6 @@
   GAIA_SIGNIN: 'gaia-signin'
 };
 
-/* Possible lock screen enabled app activity state. */
-/** @const */ var LOCK_SCREEN_APPS_STATE = {
-  // No lock screen enabled app available.
-  NONE: 'LOCK_SCREEN_APPS_STATE.NONE',
-  // A lock screen enabled note taking app is available, but has not been
-  // launched to handle a lock screen action.
-  AVAILABLE: 'LOCK_SCREEN_APPS_STATE.AVAILABLE',
-  // A lock screen enabled app is running in background - behind lock screen UI.
-  BACKGROUND: 'LOCK_SCREEN_APPS_STATE.BACKGROUND',
-  // A lock screen enabled app is running in foreground - an app window is
-  // shown over the lock screen user pods (header bar should still be visible).
-  FOREGROUND: 'LOCK_SCREEN_APPS_STATE.FOREGROUND',
-};
-
 /** @const */ var USER_ACTION_ROLLBACK_TOGGLED = 'rollback-toggled';
 
 cr.define('cr.ui.login', function() {
diff --git a/ui/ozone/platform/wayland/DEPS b/ui/ozone/platform/wayland/DEPS
index b15ab08f..cb91c80 100644
--- a/ui/ozone/platform/wayland/DEPS
+++ b/ui/ozone/platform/wayland/DEPS
@@ -4,6 +4,7 @@
   "+ui/base/ui_base_features.h",
   "+ui/base/ime/character_composer.h",
   "+ui/base/ime/composition_text.h",
+  "+ui/base/ime/ime_text_span.h",
   "+ui/base/ime/linux/linux_input_method_context.h",
   "+ui/base/ime/linux/linux_input_method_context_factory.h",
   "+mojo/public",
diff --git a/ui/ozone/platform/wayland/wayland_buffer_fuzzer.cc b/ui/ozone/platform/wayland/wayland_buffer_fuzzer.cc
index 84395c4..f10f9336 100644
--- a/ui/ozone/platform/wayland/wayland_buffer_fuzzer.cc
+++ b/ui/ozone/platform/wayland/wayland_buffer_fuzzer.cc
@@ -28,15 +28,6 @@
 
 namespace {
 
-// Off-class equivalent of WaylandTest::Sync.
-void Sync(wl::TestWaylandServerThread* server) {
-  DCHECK(server);
-
-  server->Resume();
-  base::RunLoop().RunUntilIdle();
-  server->Pause();
-}
-
 // Copied from ui/ozone/test/mock_platform_window_delegate.h to avoid
 // dependency from the whole library (it causes link problems).
 class MockPlatformWindowDelegate : public ui::PlatformWindowDelegate {
@@ -92,8 +83,8 @@
   CHECK(window->Initialize(std::move(properties)));
   CHECK_NE(widget, gfx::kNullAcceleratedWidget);
 
+  // Wait until everything is initialised.
   base::RunLoop().RunUntilIdle();
-  server.Pause();
 
   base::FilePath temp_path;
   EXPECT_TRUE(base::CreateTemporaryFile(&temp_path));
@@ -120,6 +111,8 @@
     offsets[i] = data_provider.ConsumeIntegralInRange(0U, UINT_MAX);
     modifiers[i] =
         data_provider.ConsumeIntegralInRange(uint64_t(0), UINT64_MAX);
+    if (kPlaneCount > 1 && modifiers[i] == DRM_FORMAT_MOD_INVALID)
+      modifiers[i] = 0;
   }
 
   const uint32_t kBufferId = 1;
@@ -130,12 +123,16 @@
                                    offsets, kFormat, modifiers, kPlaneCount,
                                    kBufferId);
 
-  Sync(&server);
-  Sync(&server);
+  // Wait until the buffers are created.
+  base::RunLoop().RunUntilIdle();
 
   connection->DestroyZwpLinuxDmabuf(kBufferId);
 
-  Sync(&server);
+  // Wait until the buffers are destroyed.
+  base::RunLoop().RunUntilIdle();
+
+  // Pause the server so it is not running when mock expectations are validated.
+  server.Pause();
 
   return 0;
 }
diff --git a/ui/ozone/platform/wayland/wayland_input_method_context.cc b/ui/ozone/platform/wayland/wayland_input_method_context.cc
index f5e57bb..fadb28c 100644
--- a/ui/ozone/platform/wayland/wayland_input_method_context.cc
+++ b/ui/ozone/platform/wayland/wayland_input_method_context.cc
@@ -10,6 +10,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "ui/base/ime/composition_text.h"
+#include "ui/base/ime/ime_text_span.h"
 #include "ui/events/base_event_utils.h"
 #include "ui/events/event.h"
 #include "ui/events/keycodes/dom/dom_code.h"
@@ -74,13 +75,27 @@
       !character_composer_.FilterKeyPress(key_event))
     return false;
 
-  // TODO(nickdiego): Handle preedit string
+  // CharacterComposer consumed the key event. Update the composition text.
+  UpdatePreeditText(character_composer_.preedit_string());
   auto composed = character_composer_.composed_character();
   if (!composed.empty())
     delegate_->OnCommit(composed);
   return true;
 }
 
+void WaylandInputMethodContext::UpdatePreeditText(
+    const base::string16& preedit_text) {
+  CompositionText preedit;
+  preedit.text = preedit_text;
+  auto length = preedit.text.size();
+
+  preedit.selection = gfx::Range(length);
+  preedit.ime_text_spans.push_back(
+      ImeTextSpan(ImeTextSpan::Type::kComposition, 0, length,
+                  ImeTextSpan::Thickness::kThin, SK_ColorTRANSPARENT));
+  delegate_->OnPreeditChanged(preedit);
+}
+
 void WaylandInputMethodContext::Reset() {
   character_composer_.Reset();
   if (text_input_)
diff --git a/ui/ozone/platform/wayland/wayland_input_method_context.h b/ui/ozone/platform/wayland/wayland_input_method_context.h
index 7fd0e94..bee874c 100644
--- a/ui/ozone/platform/wayland/wayland_input_method_context.h
+++ b/ui/ozone/platform/wayland/wayland_input_method_context.h
@@ -5,6 +5,9 @@
 #ifndef UI_OZONE_PLATFORM_WAYLAND_WAYLAND_INPUT_METHOD_CONTEXT_H_
 #define UI_OZONE_PLATFORM_WAYLAND_WAYLAND_INPUT_METHOD_CONTEXT_H_
 
+#include <memory>
+#include <string>
+
 #include "base/macros.h"
 #include "ui/base/ime/character_composer.h"
 #include "ui/base/ime/linux/linux_input_method_context.h"
@@ -43,6 +46,8 @@
   void OnKeysym(uint32_t key, uint32_t state, uint32_t modifiers) override;
 
  private:
+  void UpdatePreeditText(const base::string16& preedit_text);
+
   WaylandConnection* connection_ = nullptr;  // TODO(jani) Handle this better
 
   // Delegate interface back to IME code in ui.
diff --git a/ui/ozone/platform/wayland/wayland_test.h b/ui/ozone/platform/wayland/wayland_test.h
index 4a26306..625d7e60a 100644
--- a/ui/ozone/platform/wayland/wayland_test.h
+++ b/ui/ozone/platform/wayland/wayland_test.h
@@ -41,6 +41,8 @@
   void Sync();
 
  protected:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+
   wl::TestWaylandServerThread server_;
   wl::MockSurface* surface_;
 
@@ -51,7 +53,6 @@
   gfx::AcceleratedWidget widget_ = gfx::kNullAcceleratedWidget;
 
  private:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
   bool initialized_ = false;
 
 #if BUILDFLAG(USE_XKBCOMMON)
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index e588264..d2b7f4b 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -7,7 +7,6 @@
 import("//build/config/jumbo.gni")
 import("//build/config/ui.gni")
 import("//components/vector_icons/vector_icons.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 import("//ui/base/ui_features.gni")
 import("//ui/ozone/ozone.gni")
@@ -917,7 +916,7 @@
       "//services/service_manager/public/cpp",
       "//services/service_manager/public/mojom",
       "//services/ws/common",
-      "//services/ws/ime/test_ime_driver:manifest",
+      "//services/ws/ime/test_ime_driver/public/cpp:manifest",
       "//services/ws/public/mojom",
       "//services/ws/test_ws:manifest",
       "//testing/gtest",
diff --git a/ui/views/controls/combobox/combobox.cc b/ui/views/controls/combobox/combobox.cc
index 8287c65..9b0c450 100644
--- a/ui/views/controls/combobox/combobox.cc
+++ b/ui/views/controls/combobox/combobox.cc
@@ -197,13 +197,6 @@
 
   MenuModel* GetSubmenuModelAt(int index) const override { return nullptr; }
 
-  void SetMenuModelDelegate(
-      ui::MenuModelDelegate* menu_model_delegate) override {}
-
-  ui::MenuModelDelegate* GetMenuModelDelegate() const override {
-    return nullptr;
-  }
-
   // Overridden from ComboboxModelObserver:
   void OnComboboxModelChanged(ui::ComboboxModel* model) override {
     owner_->ModelChanged();
diff --git a/ui/views/controls/menu/menu_model_adapter.cc b/ui/views/controls/menu/menu_model_adapter.cc
index c91415cb..03186888 100644
--- a/ui/views/controls/menu/menu_model_adapter.cc
+++ b/ui/views/controls/menu/menu_model_adapter.cc
@@ -22,9 +22,13 @@
                                ui::EF_RIGHT_MOUSE_BUTTON),
       on_menu_closed_callback_(on_menu_closed_callback) {
   DCHECK(menu_model);
+  menu_model_->SetMenuModelDelegate(nullptr);
+  menu_model_->SetMenuModelDelegate(this);
 }
 
 MenuModelAdapter::~MenuModelAdapter() {
+  if (menu_model_)
+    menu_model_->SetMenuModelDelegate(nullptr);
 }
 
 void MenuModelAdapter::BuildMenu(MenuItemView* menu) {
@@ -50,9 +54,9 @@
 }
 
 MenuItemView* MenuModelAdapter::CreateMenu() {
-  MenuItemView* item = new MenuItemView(this);
-  BuildMenu(item);
-  return item;
+  menu_ = new MenuItemView(this);
+  BuildMenu(menu_);
+  return menu_;
 }
 
 // Static.
@@ -249,6 +253,16 @@
     on_menu_closed_callback_.Run();
 }
 
+// MenuModelDelegate overrides:
+void MenuModelAdapter::OnMenuStructureChanged() {
+  if (menu_)
+    BuildMenu(menu_);
+}
+
+void MenuModelAdapter::OnMenuClearingDelegate() {
+  menu_model_ = nullptr;
+}
+
 // MenuModelAdapter, private:
 
 void MenuModelAdapter::BuildMenuImpl(MenuItemView* menu, ui::MenuModel* model) {
diff --git a/ui/views/controls/menu/menu_model_adapter.h b/ui/views/controls/menu/menu_model_adapter.h
index a3598719..cd0ecc2 100644
--- a/ui/views/controls/menu/menu_model_adapter.h
+++ b/ui/views/controls/menu/menu_model_adapter.h
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/macros.h"
+#include "ui/base/models/menu_model_delegate.h"
 #include "ui/views/controls/menu/menu_delegate.h"
 
 namespace ui {
@@ -18,12 +19,15 @@
 namespace views {
 class MenuItemView;
 
-// This class wraps an instance of ui::MenuModel with the
-// views::MenuDelegate interface required by views::MenuItemView.
-class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate {
+// This class wraps an instance of ui::MenuModel with the views::MenuDelegate
+// interface required by views::MenuItemView.
+class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate,
+                                      public ui::MenuModelDelegate {
  public:
-  // The caller retains ownership of the ui::MenuModel instance and
-  // must ensure it exists for the lifetime of the adapter.
+  // The caller retains ownership of the ui::MenuModel instance and must ensure
+  // it exists for the lifetime of the adapter. |this| will become the new
+  // MenuModelDelegate of |menu_model| so that subsequent changes to it get
+  // reflected in the created MenuItemView.
   explicit MenuModelAdapter(ui::MenuModel* menu_model);
   MenuModelAdapter(ui::MenuModel* menu_model,
                    const base::Closure& on_menu_closed_callback);
@@ -57,6 +61,11 @@
                                                MenuItemView* menu,
                                                int item_id);
 
+  // MenuModelDelegate:
+  void OnIconChanged(int index) override{};
+  void OnMenuStructureChanged() override;
+  void OnMenuClearingDelegate() override;
+
  protected:
   // Create and add a menu item to |menu| for the item at index |index| in
   // |model|. Subclasses override this to allow custom items to be added to the
@@ -88,6 +97,10 @@
   // passed to the constructor.
   ui::MenuModel* menu_model_;
 
+  // Pointer to the MenuItemView created and updated by |this|, but not owned by
+  // |this|.
+  MenuItemView* menu_;
+
   // Mouse event flags which can trigger menu actions.
   int triggerable_event_flags_;
 
diff --git a/ui/views/controls/menu/menu_model_adapter_unittest.cc b/ui/views/controls/menu/menu_model_adapter_unittest.cc
index 2d95b3cd..5e3850a0 100644
--- a/ui/views/controls/menu/menu_model_adapter_unittest.cc
+++ b/ui/views/controls/menu/menu_model_adapter_unittest.cc
@@ -90,10 +90,6 @@
 
   void MenuWillClose() override {}
 
-  void SetMenuModelDelegate(ui::MenuModelDelegate* delegate) override {}
-
-  ui::MenuModelDelegate* GetMenuModelDelegate() const override { return NULL; }
-
   // Item definition.
   struct Item {
     Item(ItemType item_type,
diff --git a/ui/views/controls/menu/menu_runner.h b/ui/views/controls/menu/menu_runner.h
index b3c5b82..1b8478f 100644
--- a/ui/views/controls/menu/menu_runner.h
+++ b/ui/views/controls/menu/menu_runner.h
@@ -106,6 +106,7 @@
   // |on_menu_closed_callback| is invoked when the menu is closed.
   // Note that with a native menu (e.g. on Mac), the ASYNC flag in |run_types|
   // may be ignored. See http://crbug.com/682544.
+  // The MenuModelDelegate of |menu_model| will be overwritten by this call.
   MenuRunner(ui::MenuModel* menu_model,
              int32_t run_types,
              const base::Closure& on_menu_closed_callback = base::Closure());
diff --git a/ui/views/controls/menu/menu_runner_impl_adapter.cc b/ui/views/controls/menu/menu_runner_impl_adapter.cc
index 08b8b81..8b6c0a5 100644
--- a/ui/views/controls/menu/menu_runner_impl_adapter.cc
+++ b/ui/views/controls/menu/menu_runner_impl_adapter.cc
@@ -42,8 +42,7 @@
   return impl_->GetClosingEventTime();
 }
 
-MenuRunnerImplAdapter::~MenuRunnerImplAdapter() {
-}
+MenuRunnerImplAdapter::~MenuRunnerImplAdapter() = default;
 
 }  // namespace internal
 }  // namespace views
diff --git a/ui/views/mus/BUILD.gn b/ui/views/mus/BUILD.gn
index 2699ec48..9b1c8c3 100644
--- a/ui/views/mus/BUILD.gn
+++ b/ui/views/mus/BUILD.gn
@@ -5,7 +5,6 @@
 import("//build/config/features.gni")
 import("//build/config/jumbo.gni")
 import("//build/config/ui.gni")
-import("//services/service_manager/public/service_manifest.gni")
 import("//testing/test.gni")
 import("//tools/grit/repack.gni")
 
diff --git a/ui/views/test/DEPS b/ui/views/test/DEPS
index 752d09c..9ce34d1 100644
--- a/ui/views/test/DEPS
+++ b/ui/views/test/DEPS
@@ -6,7 +6,7 @@
   "platform_test_helper_mus.cc": [
     "+services/service_manager/background_service_manager.h",
     "+services/service_manager/public",
-    "+services/ws/ime/test_ime_driver/manifest.h",
+    "+services/ws/ime/test_ime_driver/public/cpp/manifest.h",
     "+services/ws/test_ws/test_manifest.h",
   ]
 }
diff --git a/ui/views/test/platform_test_helper_mus.cc b/ui/views/test/platform_test_helper_mus.cc
index 72e1386b..ff68eb8 100644
--- a/ui/views/test/platform_test_helper_mus.cc
+++ b/ui/views/test/platform_test_helper_mus.cc
@@ -14,7 +14,7 @@
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_binding.h"
-#include "services/ws/ime/test_ime_driver/manifest.h"
+#include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 #include "services/ws/test_ws/test_manifest.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/ui/webui/resources/js/cr/ui/focus_row_behavior.js b/ui/webui/resources/js/cr/ui/focus_row_behavior.js
index f8f625f..dab933dd 100644
--- a/ui/webui/resources/js/cr/ui/focus_row_behavior.js
+++ b/ui/webui/resources/js/cr/ui/focus_row_behavior.js
@@ -147,6 +147,9 @@
       this.unlisten(this, 'mousedown', 'onMouseDown_');
       this.unlisten(this, 'blur', 'onBlur_');
       this.removeObservers_();
+      if (this.firstControl_) {
+        this.unlisten(this.firstControl_, 'keydown', 'onFirstControlKeydown_');
+      }
       if (this.row_) {
         this.row_.destroy();
       }
@@ -172,9 +175,6 @@
 
     /** @private */
     removeObservers_: function() {
-      if (this.firstControl_) {
-        this.unlisten(this.firstControl_, 'keydown', 'onFirstControlKeydown_');
-      }
       if (this.controlObservers_.length > 0) {
         this.controlObservers_.forEach(observer => {
           observer.disconnect();
diff --git a/url/scheme_host_port.cc b/url/scheme_host_port.cc
index e588aece..6af849f 100644
--- a/url/scheme_host_port.cc
+++ b/url/scheme_host_port.cc
@@ -253,7 +253,7 @@
     return result;
   if (port_ != default_port) {
     result.push_back(':');
-    std::string port(base::UintToString(port_));
+    std::string port(base::NumberToString(port_));
     parsed->port = Component(result.length(), port.length());
     result.append(std::move(port));
   }